From f650e29ddd211ffa74679ed4484697f8dea7c9c1 Mon Sep 17 00:00:00 2001 From: onurays Date: Fri, 21 Feb 2020 15:30:01 +0300 Subject: [PATCH] Share action is added to room profile and room member profile Fixes #858 --- CHANGES.md | 1 + .../RoomMemberProfileAction.kt | 1 + .../RoomMemberProfileFragment.kt | 30 ++++++++++++++++--- .../RoomMemberProfileViewEvents.kt | 2 ++ .../RoomMemberProfileViewModel.kt | 11 +++++-- .../features/roomprofile/RoomProfileAction.kt | 1 + .../roomprofile/RoomProfileFragment.kt | 22 ++++++++++++++ .../roomprofile/RoomProfileViewEvents.kt | 1 + .../roomprofile/RoomProfileViewModel.kt | 5 ++++ .../main/res/drawable/ic_material_share.xml | 5 ++++ .../res/menu/vector_room_member_profile.xml | 9 ++++++ .../src/main/res/menu/vector_room_profile.xml | 10 +++++++ 12 files changed, 91 insertions(+), 7 deletions(-) create mode 100644 vector/src/main/res/drawable/ic_material_share.xml create mode 100644 vector/src/main/res/menu/vector_room_member_profile.xml create mode 100644 vector/src/main/res/menu/vector_room_profile.xml diff --git a/CHANGES.md b/CHANGES.md index 6d72ad4c2a..dafb6cf110 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,6 +10,7 @@ Features ✨: Improvements 🙌: - Migrate to binary QR code verification (#994) + - Share action is added to room profile and room member profile (#858) Bugfix 🐛: - Account creation: wrongly hints that an email can be used to create an account (#941) diff --git a/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileAction.kt b/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileAction.kt index e352683841..1dc2459538 100644 --- a/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileAction.kt +++ b/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileAction.kt @@ -23,4 +23,5 @@ sealed class RoomMemberProfileAction : VectorViewModelAction { object RetryFetchingInfo : RoomMemberProfileAction() object IgnoreUser : RoomMemberProfileAction() object VerifyUser : RoomMemberProfileAction() + object ShareRoomMemberProfile : RoomMemberProfileAction() } diff --git a/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileFragment.kt b/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileFragment.kt index 89b37400f1..6b51f78881 100644 --- a/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileFragment.kt @@ -19,6 +19,7 @@ package im.vector.riotx.features.roommemberprofile import android.os.Bundle import android.os.Parcelable +import android.view.MenuItem import android.view.View import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible @@ -28,6 +29,7 @@ import com.airbnb.mvrx.Success import com.airbnb.mvrx.args import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState +import im.vector.matrix.android.api.permalinks.PermalinkFactory import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.animations.AppBarStateChangeListener @@ -38,6 +40,7 @@ import im.vector.riotx.core.extensions.exhaustive import im.vector.riotx.core.extensions.setTextOrHide import im.vector.riotx.core.platform.StateView import im.vector.riotx.core.platform.VectorBaseFragment +import im.vector.riotx.core.utils.startSharePlainTextIntent import im.vector.riotx.features.crypto.verification.VerificationBottomSheet import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.roommemberprofile.devices.DeviceListBottomSheet @@ -65,6 +68,8 @@ class RoomMemberProfileFragment @Inject constructor( override fun getLayoutResId() = R.layout.fragment_matrix_profile + override fun getMenuRes() = R.menu.vector_room_member_profile + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setupToolbar(matrixProfileToolbar) @@ -90,14 +95,25 @@ class RoomMemberProfileFragment @Inject constructor( matrixProfileAppBarLayout.addOnOffsetChangedListener(appBarStateChangeListener) viewModel.observeViewEvents { when (it) { - is RoomMemberProfileViewEvents.Loading -> showLoading(it.message) - is RoomMemberProfileViewEvents.Failure -> showFailure(it.throwable) - is RoomMemberProfileViewEvents.OnIgnoreActionSuccess -> Unit - is RoomMemberProfileViewEvents.StartVerification -> handleStartVerification(it) + is RoomMemberProfileViewEvents.Loading -> showLoading(it.message) + is RoomMemberProfileViewEvents.Failure -> showFailure(it.throwable) + is RoomMemberProfileViewEvents.OnIgnoreActionSuccess -> Unit + is RoomMemberProfileViewEvents.StartVerification -> handleStartVerification(it) + is RoomMemberProfileViewEvents.ShareRoomMemberProfile -> handleShareRoomMemberProfile() }.exhaustive } } + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.roomMemberProfileShareAction -> { + viewModel.handle(RoomMemberProfileAction.ShareRoomMemberProfile) + return true + } + } + return super.onOptionsItemSelected(item) + } + private fun handleStartVerification(startVerification: RoomMemberProfileViewEvents.StartVerification) { if (startVerification.canCrossSign) { VerificationBottomSheet @@ -208,4 +224,10 @@ class RoomMemberProfileFragment @Inject constructor( override fun onMentionClicked() { vectorBaseActivity.notImplemented("Mention") } + + private fun handleShareRoomMemberProfile() = withState(viewModel) { + PermalinkFactory.createPermalink(it.userId)?.let { permalink -> + startSharePlainTextIntent(fragment = this, chooserTitle = null, text = permalink) + } + } } diff --git a/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileViewEvents.kt b/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileViewEvents.kt index 5b7f5bf54c..d590040180 100644 --- a/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileViewEvents.kt +++ b/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileViewEvents.kt @@ -31,4 +31,6 @@ sealed class RoomMemberProfileViewEvents : VectorViewEvents { val userId: String, val canCrossSign: Boolean ) : RoomMemberProfileViewEvents() + + object ShareRoomMemberProfile : RoomMemberProfileViewEvents() } diff --git a/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileViewModel.kt b/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileViewModel.kt index d6a1018e80..eaad2c52a2 100644 --- a/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/roommemberprofile/RoomMemberProfileViewModel.kt @@ -135,9 +135,10 @@ class RoomMemberProfileViewModel @AssistedInject constructor(@Assisted private v override fun handle(action: RoomMemberProfileAction) { when (action) { - is RoomMemberProfileAction.RetryFetchingInfo -> fetchProfileInfo() - is RoomMemberProfileAction.IgnoreUser -> handleIgnoreAction() - is RoomMemberProfileAction.VerifyUser -> prepareVerification() + is RoomMemberProfileAction.RetryFetchingInfo -> fetchProfileInfo() + is RoomMemberProfileAction.IgnoreUser -> handleIgnoreAction() + is RoomMemberProfileAction.VerifyUser -> prepareVerification() + is RoomMemberProfileAction.ShareRoomMemberProfile -> handleShareRoomMemberProfile() } } @@ -234,4 +235,8 @@ class RoomMemberProfileViewModel @AssistedInject constructor(@Assisted private v session.ignoreUserIds(listOf(state.userId), ignoreActionCallback) } } + + private fun handleShareRoomMemberProfile() { + _viewEvents.post(RoomMemberProfileViewEvents.ShareRoomMemberProfile) + } } diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileAction.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileAction.kt index d3852e34c8..545d67c314 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileAction.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileAction.kt @@ -23,4 +23,5 @@ import im.vector.riotx.core.platform.VectorViewModelAction sealed class RoomProfileAction: VectorViewModelAction { object LeaveRoom: RoomProfileAction() data class ChangeRoomNotificationState(val notificationState: RoomNotificationState) : RoomProfileAction() + object ShareRoomProfile : RoomProfileAction() } diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileFragment.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileFragment.kt index 1eafc8af3f..ec0a8e51e1 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileFragment.kt @@ -19,12 +19,14 @@ package im.vector.riotx.features.roomprofile import android.os.Bundle import android.os.Parcelable +import android.view.MenuItem import android.view.View import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible import com.airbnb.mvrx.args import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState +import im.vector.matrix.android.api.permalinks.PermalinkFactory import im.vector.matrix.android.api.session.room.notification.RoomNotificationState import im.vector.matrix.android.api.util.toMatrixItem import im.vector.riotx.R @@ -35,6 +37,7 @@ import im.vector.riotx.core.extensions.configureWith import im.vector.riotx.core.extensions.exhaustive import im.vector.riotx.core.extensions.setTextOrHide import im.vector.riotx.core.platform.VectorBaseFragment +import im.vector.riotx.core.utils.startSharePlainTextIntent import im.vector.riotx.features.crypto.util.toImageRes import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.home.room.list.actions.RoomListActionsArgs @@ -67,6 +70,8 @@ class RoomProfileFragment @Inject constructor( override fun getLayoutResId() = R.layout.fragment_matrix_profile + override fun getMenuRes() = R.menu.vector_room_profile + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) roomListQuickActionsSharedActionViewModel = activityViewModelProvider.get(RoomListQuickActionsSharedActionViewModel::class.java) @@ -89,6 +94,7 @@ class RoomProfileFragment @Inject constructor( is RoomProfileViewEvents.Loading -> showLoading(it.message) is RoomProfileViewEvents.Failure -> showFailure(it.throwable) is RoomProfileViewEvents.OnLeaveRoomSuccess -> onLeaveRoom() + is RoomProfileViewEvents.ShareRoomProfile -> onShareRoomProfile() }.exhaustive } roomListQuickActionsSharedActionViewModel @@ -97,6 +103,16 @@ class RoomProfileFragment @Inject constructor( .disposeOnDestroyView() } + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.roomProfileShareAction -> { + roomProfileViewModel.handle(RoomProfileAction.ShareRoomProfile) + return true + } + } + return super.onOptionsItemSelected(item) + } + private fun handleQuickActions(action: RoomListQuickActionsSharedAction) = when (action) { is RoomListQuickActionsSharedAction.NotificationsAllNoisy -> { roomProfileViewModel.handle(RoomProfileAction.ChangeRoomNotificationState(RoomNotificationState.ALL_MESSAGES_NOISY)) @@ -187,4 +203,10 @@ class RoomProfileFragment @Inject constructor( .setNegativeButton(R.string.cancel, null) .show() } + + private fun onShareRoomProfile() { + PermalinkFactory.createPermalink(roomProfileArgs.roomId)?.let { permalink -> + startSharePlainTextIntent(fragment = this, chooserTitle = null, text = permalink) + } + } } diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileViewEvents.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileViewEvents.kt index 50b3c136e5..50e4775252 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileViewEvents.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileViewEvents.kt @@ -26,4 +26,5 @@ sealed class RoomProfileViewEvents : VectorViewEvents { data class Failure(val throwable: Throwable) : RoomProfileViewEvents() object OnLeaveRoomSuccess : RoomProfileViewEvents() + object ShareRoomProfile : RoomProfileViewEvents() } diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileViewModel.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileViewModel.kt index 6c66ac67b2..e291556bd4 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/RoomProfileViewModel.kt @@ -66,6 +66,7 @@ class RoomProfileViewModel @AssistedInject constructor(@Assisted initialState: R override fun handle(action: RoomProfileAction) = when (action) { RoomProfileAction.LeaveRoom -> handleLeaveRoom() is RoomProfileAction.ChangeRoomNotificationState -> handleChangeNotificationMode(action) + is RoomProfileAction.ShareRoomProfile -> handleShareRoomProfile() } private fun handleChangeNotificationMode(action: RoomProfileAction.ChangeRoomNotificationState) { @@ -88,4 +89,8 @@ class RoomProfileViewModel @AssistedInject constructor(@Assisted initialState: R } }) } + + private fun handleShareRoomProfile() { + _viewEvents.post(RoomProfileViewEvents.ShareRoomProfile) + } } diff --git a/vector/src/main/res/drawable/ic_material_share.xml b/vector/src/main/res/drawable/ic_material_share.xml new file mode 100644 index 0000000000..fd72fa1c6d --- /dev/null +++ b/vector/src/main/res/drawable/ic_material_share.xml @@ -0,0 +1,5 @@ + + + diff --git a/vector/src/main/res/menu/vector_room_member_profile.xml b/vector/src/main/res/menu/vector_room_member_profile.xml new file mode 100644 index 0000000000..dc560ced3e --- /dev/null +++ b/vector/src/main/res/menu/vector_room_member_profile.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/vector/src/main/res/menu/vector_room_profile.xml b/vector/src/main/res/menu/vector_room_profile.xml new file mode 100644 index 0000000000..637cb9ef11 --- /dev/null +++ b/vector/src/main/res/menu/vector_room_profile.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file