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 @@
+