From 877a64fbce57b40fc2a8a03498307e2a34c9fd32 Mon Sep 17 00:00:00 2001 From: Valere Date: Wed, 19 May 2021 10:22:02 +0200 Subject: [PATCH 1/7] Don't create private spaces with encryption enabled #3363 --- .../android/sdk/internal/session/space/DefaultSpaceService.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/DefaultSpaceService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/DefaultSpaceService.kt index f7fd77c528..4c29692213 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/DefaultSpaceService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/DefaultSpaceService.kt @@ -81,7 +81,6 @@ internal class DefaultSpaceService @Inject constructor( } else { this.preset = CreateRoomPreset.PRESET_PRIVATE_CHAT visibility = RoomDirectoryVisibility.PRIVATE - enableEncryption() } }) } From abf7e275a7f26e3d6b79d7d61675afbc0c5ab7d7 Mon Sep 17 00:00:00 2001 From: Valere Date: Wed, 19 May 2021 11:00:06 +0200 Subject: [PATCH 2/7] Fix / Improve 'Leave Space' UX/UI #3359 --- .../spaces/SpaceSettingsMenuBottomSheet.kt | 42 ++++++++++++++++++- vector/src/main/res/values/strings.xml | 3 ++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceSettingsMenuBottomSheet.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceSettingsMenuBottomSheet.kt index 491c14e415..8f942685e5 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceSettingsMenuBottomSheet.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceSettingsMenuBottomSheet.kt @@ -22,6 +22,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AlertDialog +import androidx.core.content.ContextCompat import androidx.core.view.isVisible import com.airbnb.mvrx.args import im.vector.app.R @@ -43,9 +44,11 @@ import im.vector.app.features.spaces.manage.SpaceManageActivity import io.reactivex.android.schedulers.AndroidSchedulers import kotlinx.coroutines.launch import kotlinx.parcelize.Parcelize +import me.gujun.android.span.span import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.room.powerlevels.PowerLevelsHelper +import org.matrix.android.sdk.api.session.room.powerlevels.Role import org.matrix.android.sdk.api.util.toMatrixItem import timber.log.Timber import javax.inject.Inject @@ -55,6 +58,7 @@ data class SpaceBottomSheetSettingsArgs( val spaceId: String ) : Parcelable +// XXX make proper view model before leaving beta class SpaceSettingsMenuBottomSheet : VectorBaseBottomSheetDialogFragment() { @Inject lateinit var navigator: Navigator @@ -71,10 +75,14 @@ class SpaceSettingsMenuBottomSheet : VectorBaseBottomSheetDialogFragment session.coroutineScope.launch { try { diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 94273a62c7..13bbea66f9 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -3353,6 +3353,9 @@ Add rooms Leave Space Are you sure you want to leave the space? + You are the only person here. If you leave, no one will be able to join in the future, including you. + This space is not public. You will not be able to rejoin without an invite. + You are admin of this space, ensure that you have transferred admin right to another member before leaving. Add existing rooms and space From ae5a5ec92b83a198a2740c01f51be556f0ce22b1 Mon Sep 17 00:00:00 2001 From: Valere Date: Wed, 19 May 2021 11:19:13 +0200 Subject: [PATCH 3/7] Spaces | Personal spaces add DM - Web Parity #3271 --- .../room/summary/RoomSummaryUpdater.kt | 7 +++--- .../spaces/manage/SpaceAddRoomFragment.kt | 20 ++++++++++++++++ .../spaces/manage/SpaceAddRoomsState.kt | 3 ++- .../spaces/manage/SpaceAddRoomsViewModel.kt | 23 ++++++++++++++++++- 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt index cac0d715f5..d488fdfc2a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt @@ -344,10 +344,9 @@ internal class RoomSummaryUpdater @Inject constructor( if (it != null) addAll(it) } }.distinct() - if (flattenRelated.isEmpty()) { - dmRoom.flattenParentIds = null - } else { - dmRoom.flattenParentIds = "|${flattenRelated.joinToString("|")}|" + if (flattenRelated.isNotEmpty()) { + // we keep real m.child/m.parent relations and add the one for common memberships + dmRoom.flattenParentIds += "|${flattenRelated.joinToString("|")}|" } // Timber.v("## SPACES: flatten of ${dmRoom.otherMemberIds.joinToString(",")} is ${dmRoom.flattenParentIds}") } diff --git a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomFragment.kt index 203098d32b..37a1a4f4d1 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomFragment.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomFragment.kt @@ -28,6 +28,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.airbnb.mvrx.Loading import com.airbnb.mvrx.activityViewModel import com.airbnb.mvrx.fragmentViewModel +import com.airbnb.mvrx.withState import com.jakewharton.rxbinding3.appcompat.queryTextChanges import im.vector.app.R import im.vector.app.core.extensions.cleanup @@ -42,6 +43,7 @@ import javax.inject.Inject class SpaceAddRoomFragment @Inject constructor( private val spaceEpoxyController: AddRoomListController, private val roomEpoxyController: AddRoomListController, + private val dmEpoxyController: AddRoomListController, private val viewModelFactory: SpaceAddRoomsViewModel.Factory ) : VectorBaseFragment(), OnBackPressed, AddRoomListController.Listener, SpaceAddRoomsViewModel.Factory { @@ -84,6 +86,7 @@ class SpaceAddRoomFragment @Inject constructor( viewModel.selectionListLiveData.observe(viewLifecycleOwner) { spaceEpoxyController.selectedItems = it roomEpoxyController.selectedItems = it + dmEpoxyController.selectedItems = it saveNeeded = it.values.any { it } invalidateOptionsMenu() } @@ -95,6 +98,7 @@ class SpaceAddRoomFragment @Inject constructor( viewModel.selectSubscribe(this, SpaceAddRoomsState::ignoreRooms) { spaceEpoxyController.ignoreRooms = it roomEpoxyController.ignoreRooms = it + dmEpoxyController.ignoreRooms = it }.disposeOnDestroyView() viewModel.selectSubscribe(this, SpaceAddRoomsState::isSaving) { @@ -149,6 +153,7 @@ class SpaceAddRoomFragment @Inject constructor( views.roomList.cleanup() spaceEpoxyController.listener = null roomEpoxyController.listener = null + dmEpoxyController.listener = null super.onDestroyView() } @@ -181,6 +186,21 @@ class SpaceAddRoomFragment @Inject constructor( concatAdapter.addAdapter(roomEpoxyController.adapter) concatAdapter.addAdapter(spaceEpoxyController.adapter) + val shouldShowDm = withState(viewModel) { it.shouldShowDMs } + if (shouldShowDm) { + viewModel.updatableDMLivePageResult.liveBoundaries.observe(viewLifecycleOwner) { + dmEpoxyController.boundaryChange(it) + } + viewModel.updatableDMLivePageResult.livePagedList.observe(viewLifecycleOwner) { + dmEpoxyController.totalSize = it.size + dmEpoxyController.submitList(it) + } + dmEpoxyController.sectionName = getString(R.string.direct_chats_header) + dmEpoxyController.listener = this + + concatAdapter.addAdapter(dmEpoxyController.adapter) + } + views.roomList.adapter = concatAdapter } diff --git a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomsState.kt b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomsState.kt index 6ce3468fe1..2d9113ae68 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomsState.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomsState.kt @@ -26,7 +26,8 @@ data class SpaceAddRoomsState( val currentFilter: String = "", val spaceName: String = "", val ignoreRooms: List = emptyList(), - val isSaving: Async> = Uninitialized + val isSaving: Async> = Uninitialized, + val shouldShowDMs : Boolean = false // val selectionList: Map = emptyMap() ) : MvRxState { constructor(args: SpaceManageArgs) : this( diff --git a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomsViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomsViewModel.kt index 55e65eb171..35c415b087 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomsViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomsViewModel.kt @@ -98,6 +98,26 @@ class SpaceAddRoomsViewModel @AssistedInject constructor( ) } + val updatableDMLivePageResult: UpdatableLivePageResult by lazy { + session.getFilteredPagedRoomSummariesLive( + roomSummaryQueryParams { + this.memberships = listOf(Membership.JOIN) + this.excludeType = listOf(RoomType.SPACE) + this.includeType = null + this.roomCategoryFilter = RoomCategoryFilter.ONLY_DM + this.activeSpaceFilter = ActiveSpaceFilter.ExcludeSpace(initialState.spaceId) + this.displayName = QueryStringValue.Contains(initialState.currentFilter, QueryStringValue.Case.INSENSITIVE) + }, + pagedListConfig = PagedList.Config.Builder() + .setPageSize(10) + .setInitialLoadSizeHint(20) + .setEnablePlaceholders(true) + .setPrefetchDistance(10) + .build(), + sortOrder = RoomSortOrder.NAME + ) + } + private val selectionList = mutableMapOf() val selectionListLiveData = MutableLiveData>() @@ -106,7 +126,8 @@ class SpaceAddRoomsViewModel @AssistedInject constructor( setState { copy( spaceName = spaceSummary?.displayName ?: "", - ignoreRooms = (spaceSummary?.flattenParentIds ?: emptyList()) + listOf(initialState.spaceId) + ignoreRooms = (spaceSummary?.flattenParentIds ?: emptyList()) + listOf(initialState.spaceId), + shouldShowDMs = spaceSummary?.isPublic == false ) } } From cbf03574678c90c05f2c5f5b29c6eb158bc5cd65 Mon Sep 17 00:00:00 2001 From: Valere Date: Wed, 19 May 2021 11:20:42 +0200 Subject: [PATCH 4/7] Update change log --- CHANGES.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index a28b84410e..a467e043fd 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -13,6 +13,9 @@ Bugfix 🐛: - Fix a problem with database migration on nightly builds (#3335) - Implement a workaround to render <del> and <u> in the timeline (#1817) - Make sure the SDK can retrieve the secret storage if the system is upgraded (#3304) + - Spaces | Personal spaces add DM - Web Parity (#3271) + - Spaces | Improve 'Leave Space' UX/UI (#3359) + - Don't create private spaces with encryption enabled (#3363) Translations 🗣: - From 2f3f0c294c5b82b20b4ff8f0bf96561f29bee140 Mon Sep 17 00:00:00 2001 From: Valere Date: Wed, 19 May 2021 14:38:47 +0200 Subject: [PATCH 5/7] Code review --- .../spaces/SpaceSettingsMenuBottomSheet.kt | 43 +++++++++---------- .../spaces/manage/AddRoomListController.kt | 41 +++++++++++++++--- .../spaces/manage/SpaceAddRoomFragment.kt | 33 +++++++------- 3 files changed, 71 insertions(+), 46 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceSettingsMenuBottomSheet.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceSettingsMenuBottomSheet.kt index 8f942685e5..f025aa80a0 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceSettingsMenuBottomSheet.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceSettingsMenuBottomSheet.kt @@ -16,6 +16,7 @@ package im.vector.app.features.spaces +import android.content.DialogInterface import android.os.Bundle import android.os.Parcelable import android.view.LayoutInflater @@ -28,6 +29,7 @@ import com.airbnb.mvrx.args import im.vector.app.R import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.core.di.ScreenComponent +import im.vector.app.core.dialogs.withColoredButton import im.vector.app.core.extensions.setTextOrHide import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment import im.vector.app.databinding.BottomSheetSpaceSettingsBinding @@ -81,7 +83,7 @@ class SpaceSettingsMenuBottomSheet : VectorBaseBottomSheetDialogFragment session.coroutineScope.launch { try { @@ -192,6 +188,7 @@ class SpaceSettingsMenuBottomSheet : VectorBaseBottomSheetDialogFragment>) { + if (disabled) { + super.addModels(emptyList()) + return + } val host = this val filteredModel = if (ignoreRooms == null) { models @@ -103,9 +123,14 @@ class AddRoomListController @Inject constructor( id("header") title(host.sectionName ?: "") expanded(true) + title(sectionName ?: "") + expanded(host.expanded) + listener { + host.expanded = !host.expanded + } } ) - if (subHeaderText != null) { + if (expanded && subHeaderText != null) { add( GenericPillItem_().apply { id("sub_header") @@ -115,11 +140,13 @@ class AddRoomListController @Inject constructor( ) } } - super.addModels(filteredModel) - if (!initialLoadOccurred) { - add( - RoomSelectionPlaceHolderItem_().apply { id("loading") } - ) + if (expanded) { + super.addModels(filteredModel) + if (!initialLoadOccurred) { + add( + RoomSelectionPlaceHolderItem_().apply { id("loading") } + ) + } } } @@ -129,7 +156,7 @@ class AddRoomListController @Inject constructor( return RoomSelectionItem_().apply { id(item.roomId) matrixItem(item.toMatrixItem()) - avatarRenderer(this@AddRoomListController.avatarRenderer) + avatarRenderer(host.avatarRenderer) space(item.roomType == RoomType.SPACE) selected(host.selectedItems[item.roomId] ?: false) itemClickListener(DebouncedClickListener({ diff --git a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomFragment.kt index 37a1a4f4d1..05a2f19941 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomFragment.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceAddRoomFragment.kt @@ -28,7 +28,6 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.airbnb.mvrx.Loading import com.airbnb.mvrx.activityViewModel import com.airbnb.mvrx.fragmentViewModel -import com.airbnb.mvrx.withState import com.jakewharton.rxbinding3.appcompat.queryTextChanges import im.vector.app.R import im.vector.app.core.extensions.cleanup @@ -109,6 +108,10 @@ class SpaceAddRoomFragment @Inject constructor( } }.disposeOnDestroyView() + viewModel.selectSubscribe(this, SpaceAddRoomsState::shouldShowDMs) { + dmEpoxyController.disabled = !it + }.disposeOnDestroyView() + views.createNewRoom.debouncedClicks { sharedViewModel.handle(SpaceManagedSharedAction.CreateRoom) } @@ -125,11 +128,11 @@ class SpaceAddRoomFragment @Inject constructor( .setNegativeButton(R.string.cancel, null) .show() } - is SpaceAddRoomsViewEvents.SaveFailed -> { + is SpaceAddRoomsViewEvents.SaveFailed -> { showErrorInSnackbar(it.reason) invalidateOptionsMenu() } - SpaceAddRoomsViewEvents.SavedDone -> { + SpaceAddRoomsViewEvents.SavedDone -> { sharedViewModel.handle(SpaceManagedSharedAction.HandleBack) } } @@ -186,20 +189,18 @@ class SpaceAddRoomFragment @Inject constructor( concatAdapter.addAdapter(roomEpoxyController.adapter) concatAdapter.addAdapter(spaceEpoxyController.adapter) - val shouldShowDm = withState(viewModel) { it.shouldShowDMs } - if (shouldShowDm) { - viewModel.updatableDMLivePageResult.liveBoundaries.observe(viewLifecycleOwner) { - dmEpoxyController.boundaryChange(it) - } - viewModel.updatableDMLivePageResult.livePagedList.observe(viewLifecycleOwner) { - dmEpoxyController.totalSize = it.size - dmEpoxyController.submitList(it) - } - dmEpoxyController.sectionName = getString(R.string.direct_chats_header) - dmEpoxyController.listener = this - - concatAdapter.addAdapter(dmEpoxyController.adapter) + // This controller can be disabled depending on the space type (public or not) + viewModel.updatableDMLivePageResult.liveBoundaries.observe(viewLifecycleOwner) { + dmEpoxyController.boundaryChange(it) } + viewModel.updatableDMLivePageResult.livePagedList.observe(viewLifecycleOwner) { + dmEpoxyController.totalSize = it.size + dmEpoxyController.submitList(it) + } + dmEpoxyController.sectionName = getString(R.string.direct_chats_header) + dmEpoxyController.listener = this + + concatAdapter.addAdapter(dmEpoxyController.adapter) views.roomList.adapter = concatAdapter } From 048c13af505d6a1b1cac432eb42d3cb9ce797604 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 19 May 2021 17:02:15 +0200 Subject: [PATCH 6/7] Fix issue after rebase --- .../vector/app/features/spaces/manage/AddRoomListController.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/spaces/manage/AddRoomListController.kt b/vector/src/main/java/im/vector/app/features/spaces/manage/AddRoomListController.kt index 369dee1a9c..69be246506 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/manage/AddRoomListController.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/manage/AddRoomListController.kt @@ -122,8 +122,6 @@ class AddRoomListController @Inject constructor( RoomCategoryItem_().apply { id("header") title(host.sectionName ?: "") - expanded(true) - title(sectionName ?: "") expanded(host.expanded) listener { host.expanded = !host.expanded From ba96626bd07f450eaaa077ab033fab4b8f5b6235 Mon Sep 17 00:00:00 2001 From: Valere Date: Fri, 21 May 2021 11:46:55 +0200 Subject: [PATCH 7/7] Code review --- .../app/features/spaces/SpaceSettingsMenuBottomSheet.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceSettingsMenuBottomSheet.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceSettingsMenuBottomSheet.kt index f025aa80a0..66572f5a82 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceSettingsMenuBottomSheet.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceSettingsMenuBottomSheet.kt @@ -23,7 +23,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AlertDialog -import androidx.core.content.ContextCompat import androidx.core.view.isVisible import com.airbnb.mvrx.args import im.vector.app.R @@ -32,6 +31,7 @@ import im.vector.app.core.di.ScreenComponent import im.vector.app.core.dialogs.withColoredButton import im.vector.app.core.extensions.setTextOrHide import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment +import im.vector.app.core.resources.ColorProvider import im.vector.app.databinding.BottomSheetSpaceSettingsBinding import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.navigation.Navigator @@ -68,6 +68,7 @@ class SpaceSettingsMenuBottomSheet : VectorBaseBottomSheetDialogFragment