From ba24c30d383ef221aad0566f869d4d55e2ff29f3 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 10 Feb 2021 17:32:36 +0100 Subject: [PATCH 1/6] Improve room profile UX --- CHANGES.md | 1 + .../roomprofile/RoomProfileController.kt | 25 ++++++++++++++++++- .../roomprofile/RoomProfileFragment.kt | 8 ++++++ .../settings/RoomSettingsController.kt | 22 ---------------- .../settings/RoomSettingsFragment.kt | 8 ------ 5 files changed, 33 insertions(+), 31 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 17605b4940..726d7f0931 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ Features ✨: Improvements 🙌: - VoIP : new tiles in timeline + - Improve room profile UX Bugfix 🐛: - VoIP : fix audio devices output diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileController.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileController.kt index 6b988df94d..5ab86f7138 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileController.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileController.kt @@ -54,6 +54,8 @@ class RoomProfileController @Inject constructor( fun createShortcut() fun onSettingsClicked() fun onLeaveRoomClicked() + fun onRoomAliasesClicked() + fun onRoomPermissionsClicked() fun onRoomIdClicked() fun onUrlInTopicLongClicked(url: String) } @@ -174,8 +176,29 @@ class RoomProfileController @Inject constructor( ) // Advanced + buildProfileSection(stringProvider.getString(R.string.room_settings_category_advanced_title)) + + buildProfileAction( + id = "alias", + title = stringProvider.getString(R.string.room_settings_alias_title), + subtitle = stringProvider.getString(R.string.room_settings_alias_subtitle), + dividerColor = dividerColor, + divider = true, + editable = true, + action = { callback?.onRoomAliasesClicked() } + ) + + buildProfileAction( + id = "permissions", + title = stringProvider.getString(R.string.room_settings_permissions_title), + subtitle = stringProvider.getString(R.string.room_settings_permissions_subtitle), + dividerColor = dividerColor, + divider = true, + editable = true, + action = { callback?.onRoomPermissionsClicked() } + ) + if (vectorPreferences.developerMode()) { - buildProfileSection(stringProvider.getString(R.string.room_settings_category_advanced_title)) buildProfileAction( id = "roomId", title = stringProvider.getString(R.string.room_settings_room_internal_id), diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt index 0cb57fda4f..3c5e050935 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt @@ -269,6 +269,14 @@ class RoomProfileFragment @Inject constructor( } } + override fun onRoomAliasesClicked() { + roomProfileSharedActionViewModel.post(RoomProfileSharedAction.OpenRoomAliasesSettings) + } + + override fun onRoomPermissionsClicked() { + roomProfileSharedActionViewModel.post(RoomProfileSharedAction.OpenRoomPermissionsSettings) + } + override fun onRoomIdClicked() { copyToClipboard(requireContext(), roomProfileArgs.roomId) } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsController.kt b/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsController.kt index 1984be078d..6e77ceaa36 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsController.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsController.kt @@ -45,8 +45,6 @@ class RoomSettingsController @Inject constructor( fun onNameChanged(name: String) fun onTopicChanged(topic: String) fun onHistoryVisibilityClicked() - fun onRoomAliasesClicked() - fun onRoomPermissionsClicked() fun onJoinRuleClicked() } @@ -106,26 +104,6 @@ class RoomSettingsController @Inject constructor( } } - buildProfileAction( - id = "alias", - title = stringProvider.getString(R.string.room_settings_alias_title), - subtitle = stringProvider.getString(R.string.room_settings_alias_subtitle), - dividerColor = dividerColor, - divider = true, - editable = true, - action = { callback?.onRoomAliasesClicked() } - ) - - buildProfileAction( - id = "permissions", - title = stringProvider.getString(R.string.room_settings_permissions_title), - subtitle = stringProvider.getString(R.string.room_settings_permissions_subtitle), - dividerColor = dividerColor, - divider = true, - editable = true, - action = { callback?.onRoomPermissionsClicked() } - ) - buildProfileAction( id = "historyReadability", title = stringProvider.getString(R.string.room_settings_room_read_history_rules_pref_title), diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsFragment.kt index 1ca539ea7e..6d63e5014f 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsFragment.kt @@ -174,14 +174,6 @@ class RoomSettingsFragment @Inject constructor( .show(childFragmentManager, "RoomHistoryVisibilityBottomSheet") } - override fun onRoomAliasesClicked() { - roomProfileSharedActionViewModel.post(RoomProfileSharedAction.OpenRoomAliasesSettings) - } - - override fun onRoomPermissionsClicked() { - roomProfileSharedActionViewModel.post(RoomProfileSharedAction.OpenRoomPermissionsSettings) - } - override fun onJoinRuleClicked() = withState(viewModel) { state -> val currentJoinRule = state.newRoomJoinRules.newJoinRules ?: state.currentRoomJoinRules val currentGuestAccess = state.newRoomJoinRules.newGuestAccess ?: state.currentGuestAccess From f76b4c06c5f45c42663541057357340c199795f0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 10 Feb 2021 17:41:43 +0100 Subject: [PATCH 2/6] Add some click shortcut --- .../features/roomprofile/RoomProfileFragment.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt index 3c5e050935..dd920cda18 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt @@ -116,6 +116,7 @@ class RoomProfileFragment @Inject constructor( .observe() .subscribe { handleQuickActions(it) } .disposeOnDestroyView() + setupClicks() setupLongClicks() } @@ -124,6 +125,22 @@ class RoomProfileFragment @Inject constructor( views.waitingView.waitingStatusText.isVisible = true } + private fun setupClicks() { + // Shortcut to room settings + listOf( + headerViews.roomProfileNameView, + views.matrixProfileToolbarTitleView, + ).forEach { + it.setOnClickListener { + roomProfileSharedActionViewModel.post(RoomProfileSharedAction.OpenRoomSettings) + } + } + // Shortcut to room alias + headerViews.roomProfileAliasView.setOnClickListener { + roomProfileSharedActionViewModel.post(RoomProfileSharedAction.OpenRoomAliasesSettings) + } + } + private fun setupLongClicks() { headerViews.roomProfileNameView.copyOnLongClick() headerViews.roomProfileAliasView.copyOnLongClick() From 18408377e41a2f98d49b444e1c70a5a4590e61ce Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 10 Feb 2021 17:49:40 +0100 Subject: [PATCH 3/6] Move click listener setup --- .../roomprofile/RoomProfileFragment.kt | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt index dd920cda18..eb00e7af08 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt @@ -52,7 +52,6 @@ import im.vector.app.features.home.room.list.actions.RoomListQuickActionsSharedA import im.vector.app.features.home.room.list.actions.RoomListQuickActionsSharedActionViewModel import kotlinx.parcelize.Parcelize import org.matrix.android.sdk.api.session.room.notification.RoomNotificationState -import org.matrix.android.sdk.api.util.MatrixItem import org.matrix.android.sdk.api.util.toMatrixItem import timber.log.Timber import javax.inject.Inject @@ -127,7 +126,7 @@ class RoomProfileFragment @Inject constructor( private fun setupClicks() { // Shortcut to room settings - listOf( + setOf( headerViews.roomProfileNameView, views.matrixProfileToolbarTitleView, ).forEach { @@ -139,6 +138,13 @@ class RoomProfileFragment @Inject constructor( headerViews.roomProfileAliasView.setOnClickListener { roomProfileSharedActionViewModel.post(RoomProfileSharedAction.OpenRoomAliasesSettings) } + // Open Avatar + setOf( + headerViews.roomProfileAvatarView, + views.matrixProfileToolbarAvatarImageView + ).forEach { view -> + view.setOnClickListener { onAvatarClicked(view) } + } } private fun setupLongClicks() { @@ -187,7 +193,7 @@ class RoomProfileFragment @Inject constructor( override fun invalidate() = withState(roomProfileViewModel) { state -> views.waitingView.root.isVisible = state.isLoading - state.roomSummary()?.also { + state.roomSummary()?.let { if (it.membership.isLeft()) { Timber.w("The room has been left") activity?.finish() @@ -201,13 +207,6 @@ class RoomProfileFragment @Inject constructor( headerViews.roomProfileDecorationImageView.isVisible = it.roomEncryptionTrustLevel != null headerViews.roomProfileDecorationImageView.setImageResource(it.roomEncryptionTrustLevel.toImageRes()) views.matrixProfileDecorationToolbarAvatarImageView.setImageResource(it.roomEncryptionTrustLevel.toImageRes()) - - headerViews.roomProfileAvatarView.setOnClickListener { view -> - onAvatarClicked(view, matrixItem) - } - views.matrixProfileToolbarAvatarImageView.setOnClickListener { view -> - onAvatarClicked(view, matrixItem) - } } } roomProfileController.setData(state) @@ -311,7 +310,9 @@ class RoomProfileFragment @Inject constructor( ) } - private fun onAvatarClicked(view: View, matrixItem: MatrixItem.RoomItem) { - navigator.openBigImageViewer(requireActivity(), view, matrixItem) + private fun onAvatarClicked(view: View) = withState(roomProfileViewModel) { state -> + state.roomSummary()?.toMatrixItem()?.let { matrixItem -> + navigator.openBigImageViewer(requireActivity(), view, matrixItem) + } } } From 0571662fe7a1c05ec83105329a50453cb86d2b7d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Feb 2021 10:43:57 +0100 Subject: [PATCH 4/6] ktlint --- .../main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt | 2 -- .../app/features/roomprofile/settings/RoomSettingsFragment.kt | 1 - 2 files changed, 3 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt index 40b4e7469d..c72d7c8a76 100644 --- a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt +++ b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt @@ -476,7 +476,6 @@ class WebRtcCall(val mxCall: MxCall, if (camera != null) { val videoCapturer = cameraIterator.createCapturer(camera.name, object : CameraEventsHandlerAdapter() { - override fun onFirstFrameAvailable() { super.onFirstFrameAvailable() videoCapturerIsInError = false @@ -490,7 +489,6 @@ class WebRtcCall(val mxCall: MxCall, videoCapturerIsInError = true val cameraManager = context.getSystemService() cameraAvailabilityCallback = object : CameraManager.AvailabilityCallback() { - override fun onCameraUnavailable(cameraId: String) { super.onCameraUnavailable(cameraId) Timber.v("On camera unavailable: $cameraId") diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsFragment.kt index 6d63e5014f..30ba0529ce 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsFragment.kt @@ -41,7 +41,6 @@ import im.vector.app.core.utils.toast import im.vector.app.databinding.FragmentRoomSettingGenericBinding import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.roomprofile.RoomProfileArgs -import im.vector.app.features.roomprofile.RoomProfileSharedAction import im.vector.app.features.roomprofile.RoomProfileSharedActionViewModel import im.vector.app.features.roomprofile.settings.historyvisibility.RoomHistoryVisibilitySharedActionViewModel import im.vector.app.features.roomprofile.settings.historyvisibility.RoomHistoryVisibilityBottomSheet From 5fb273a5c8111fb83bd99d1cdd0ada2d4d2fd518 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Feb 2021 11:04:07 +0100 Subject: [PATCH 5/6] Update sanity test --- .../vector/app/ui/UiAllScreensSanityTest.kt | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt b/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt index 2d0077fc55..338d57fea8 100644 --- a/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt +++ b/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt @@ -277,8 +277,23 @@ class UiAllScreensSanityTest { assertDisplayed(R.id.roomProfileAvatarView) - // Leave + // Room addresses clickListItem(R.id.matrixProfileRecyclerView, 13) + onView(isRoot()).perform(waitForView(withText(R.string.room_alias_published_alias_title))) + pressBack() + + // Room permissions + clickListItem(R.id.matrixProfileRecyclerView, 15) + onView(isRoot()).perform(waitForView(withText(R.string.room_permissions_title))) + clickOn(R.string.room_permissions_change_room_avatar) + clickDialogNegativeButton() + // Toggle + clickOn(R.string.show_advanced) + clickOn(R.string.hide_advanced) + pressBack() + + // Leave + clickListItem(R.id.matrixProfileRecyclerView, 17) clickDialogNegativeButton() // Menu share @@ -289,27 +304,12 @@ class UiAllScreensSanityTest { } private fun navigateToRoomParameters() { - // Room addresses - clickListItem(R.id.roomSettingsRecyclerView, 4) - onView(isRoot()).perform(waitForView(withText(R.string.room_alias_published_alias_title))) - pressBack() - - // Room permissions - clickListItem(R.id.roomSettingsRecyclerView, 6) - onView(isRoot()).perform(waitForView(withText(R.string.room_permissions_title))) - clickOn(R.string.room_permissions_change_room_avatar) - clickDialogNegativeButton() - // Toggle - clickOn(R.string.show_advanced) - clickOn(R.string.hide_advanced) - pressBack() - // Room history readability - clickListItem(R.id.roomSettingsRecyclerView, 8) + clickListItem(R.id.roomSettingsRecyclerView, 4) pressBack() // Room access - clickListItem(R.id.roomSettingsRecyclerView, 10) + clickListItem(R.id.roomSettingsRecyclerView, 6) pressBack() } From 9df9bbc6dbdcafe977db48c40cc06810b18656a9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Feb 2021 11:58:10 +0100 Subject: [PATCH 6/6] ktlint --- .../im/vector/app/features/roomprofile/RoomProfileFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt index eb00e7af08..70eb4dd40e 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt @@ -128,7 +128,7 @@ class RoomProfileFragment @Inject constructor( // Shortcut to room settings setOf( headerViews.roomProfileNameView, - views.matrixProfileToolbarTitleView, + views.matrixProfileToolbarTitleView ).forEach { it.setOnClickListener { roomProfileSharedActionViewModel.post(RoomProfileSharedAction.OpenRoomSettings)