diff --git a/.idea/dictionaries/bmarty.xml b/.idea/dictionaries/bmarty.xml
index d13e40248f..5ad39614b7 100644
--- a/.idea/dictionaries/bmarty.xml
+++ b/.idea/dictionaries/bmarty.xml
@@ -31,6 +31,7 @@
ssss
sygnal
threepid
+ unpublish
unwedging
diff --git a/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt b/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt
index 818a32fca3..2518e32ce5 100644
--- a/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt
+++ b/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt
@@ -67,6 +67,7 @@ import im.vector.app.features.roomdirectory.createroom.CreateRoomActivity
import im.vector.app.features.roommemberprofile.RoomMemberProfileActivity
import im.vector.app.features.roommemberprofile.devices.DeviceListBottomSheet
import im.vector.app.features.roomprofile.RoomProfileActivity
+import im.vector.app.features.roomprofile.alias.detail.RoomAliasBottomSheet
import im.vector.app.features.settings.VectorSettingsActivity
import im.vector.app.features.settings.devices.DeviceVerificationInfoBottomSheet
import im.vector.app.features.share.IncomingShareActivity
@@ -153,6 +154,7 @@ interface ScreenComponent {
fun inject(bottomSheet: ViewEditHistoryBottomSheet)
fun inject(bottomSheet: DisplayReadReceiptsBottomSheet)
fun inject(bottomSheet: RoomListQuickActionsBottomSheet)
+ fun inject(bottomSheet: RoomAliasBottomSheet)
fun inject(bottomSheet: VerificationBottomSheet)
fun inject(bottomSheet: DeviceVerificationInfoBottomSheet)
fun inject(bottomSheet: DeviceListBottomSheet)
diff --git a/vector/src/main/java/im/vector/app/core/di/ViewModelModule.kt b/vector/src/main/java/im/vector/app/core/di/ViewModelModule.kt
index 7ae8bc9c2e..3399f98d43 100644
--- a/vector/src/main/java/im/vector/app/core/di/ViewModelModule.kt
+++ b/vector/src/main/java/im/vector/app/core/di/ViewModelModule.kt
@@ -35,6 +35,7 @@ import im.vector.app.features.home.room.list.actions.RoomListQuickActionsSharedA
import im.vector.app.features.reactions.EmojiChooserViewModel
import im.vector.app.features.roomdirectory.RoomDirectorySharedActionViewModel
import im.vector.app.features.roomprofile.RoomProfileSharedActionViewModel
+import im.vector.app.features.roomprofile.alias.detail.RoomAliasBottomSheetSharedActionViewModel
import im.vector.app.features.userdirectory.UserListSharedActionViewModel
@Module
@@ -105,6 +106,11 @@ interface ViewModelModule {
@ViewModelKey(RoomListQuickActionsSharedActionViewModel::class)
fun bindRoomListQuickActionsSharedActionViewModel(viewModel: RoomListQuickActionsSharedActionViewModel): ViewModel
+ @Binds
+ @IntoMap
+ @ViewModelKey(RoomAliasBottomSheetSharedActionViewModel::class)
+ fun bindRoomAliasBottomSheetSharedActionViewModel(viewModel: RoomAliasBottomSheetSharedActionViewModel): ViewModel
+
@Binds
@IntoMap
@ViewModelKey(RoomDirectorySharedActionViewModel::class)
diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasAction.kt b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasAction.kt
index b695ab0a1e..4054d6f63a 100644
--- a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasAction.kt
+++ b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasAction.kt
@@ -22,8 +22,9 @@ sealed class RoomAliasAction : VectorViewModelAction {
// Canonical
object ToggleManualPublishForm : RoomAliasAction()
data class SetNewAlias(val alias: String) : RoomAliasAction()
- object AddAlias : RoomAliasAction()
- data class RemoveAlias(val alias: String) : RoomAliasAction()
+ object ManualPublishAlias : RoomAliasAction()
+ data class PublishAlias(val alias: String) : RoomAliasAction()
+ data class UnpublishAlias(val alias: String) : RoomAliasAction()
data class SetCanonicalAlias(val canonicalAlias: String?) : RoomAliasAction()
// Local
diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasController.kt b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasController.kt
index a8c1222a5f..6790bee2a8 100644
--- a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasController.kt
+++ b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasController.kt
@@ -48,10 +48,6 @@ class RoomAliasController @Inject constructor(
fun toggleManualPublishForm()
fun setNewAlias(value: String)
fun addAlias()
- // TODO Delete some methods below
- fun removeAlias(altAlias: String)
- fun setCanonicalAlias(alias: String?)
- fun removeLocalAlias(alias: String)
fun toggleLocalAliasForm()
fun setNewLocalAliasLocalPart(value: String)
fun addLocalAlias()
diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasFragment.kt
index b14783d9cd..f54cff5c6c 100644
--- a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasFragment.kt
@@ -30,9 +30,13 @@ import im.vector.app.core.extensions.cleanup
import im.vector.app.core.extensions.configureWith
import im.vector.app.core.extensions.exhaustive
import im.vector.app.core.platform.VectorBaseFragment
+import im.vector.app.core.utils.shareText
import im.vector.app.core.utils.toast
import im.vector.app.features.home.AvatarRenderer
import im.vector.app.features.roomprofile.RoomProfileArgs
+import im.vector.app.features.roomprofile.alias.detail.RoomAliasBottomSheet
+import im.vector.app.features.roomprofile.alias.detail.RoomAliasBottomSheetSharedAction
+import im.vector.app.features.roomprofile.alias.detail.RoomAliasBottomSheetSharedActionViewModel
import kotlinx.android.synthetic.main.fragment_room_setting_generic.*
import kotlinx.android.synthetic.main.merge_overlay_waiting_view.*
import org.matrix.android.sdk.api.session.room.alias.RoomAliasError
@@ -48,12 +52,16 @@ class RoomAliasFragment @Inject constructor(
RoomAliasController.Callback {
private val viewModel: RoomAliasViewModel by fragmentViewModel()
+ private lateinit var sharedActionViewModel: RoomAliasBottomSheetSharedActionViewModel
+
private val roomProfileArgs: RoomProfileArgs by args()
override fun getLayoutResId() = R.layout.fragment_room_setting_generic
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
+ sharedActionViewModel = activityViewModelProvider.get(RoomAliasBottomSheetSharedActionViewModel::class.java)
+
controller.callback = this
setupToolbar(roomSettingsToolbar)
roomSettingsRecyclerView.configureWith(controller, hasFixedSize = true)
@@ -63,9 +71,30 @@ class RoomAliasFragment @Inject constructor(
viewModel.observeViewEvents {
when (it) {
is RoomAliasViewEvents.Failure -> showFailure(it.throwable)
- RoomAliasViewEvents.Success -> showSuccess()
+ RoomAliasViewEvents.Success -> showSuccess()
}.exhaustive
}
+
+ sharedActionViewModel
+ .observe()
+ .subscribe { handleAliasAction(it) }
+ .disposeOnDestroyView()
+ }
+
+ private fun handleAliasAction(action: RoomAliasBottomSheetSharedAction?) {
+ when (action) {
+ is RoomAliasBottomSheetSharedAction.ShareAlias -> shareAlias(action.matrixTo)
+ is RoomAliasBottomSheetSharedAction.PublishAlias -> viewModel.handle(RoomAliasAction.PublishAlias(action.alias))
+ is RoomAliasBottomSheetSharedAction.UnPublishAlias -> unpublishAlias(action.alias)
+ is RoomAliasBottomSheetSharedAction.DeleteAlias -> removeLocalAlias(action.alias)
+ is RoomAliasBottomSheetSharedAction.SetMainAlias -> viewModel.handle(RoomAliasAction.SetCanonicalAlias(action.alias))
+ RoomAliasBottomSheetSharedAction.UnsetMainAlias -> viewModel.handle(RoomAliasAction.SetCanonicalAlias(canonicalAlias = null))
+ null -> Unit
+ }
+ }
+
+ private fun shareAlias(matrixTo: String) {
+ shareText(requireContext(), matrixTo)
}
override fun showFailure(throwable: Throwable) {
@@ -100,22 +129,18 @@ class RoomAliasFragment @Inject constructor(
invalidateOptionsMenu()
}
- override fun removeAlias(altAlias: String) {
+ private fun unpublishAlias(altAlias: String) {
AlertDialog.Builder(requireContext())
.setTitle(R.string.dialog_title_confirmation)
.setMessage(getString(R.string.room_alias_delete_confirmation, altAlias))
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(R.string.delete) { _, _ ->
- viewModel.handle(RoomAliasAction.RemoveAlias(altAlias))
+ viewModel.handle(RoomAliasAction.UnpublishAlias(altAlias))
}
.show()
.withColoredButton(DialogInterface.BUTTON_POSITIVE)
}
- override fun setCanonicalAlias(alias: String?) {
- viewModel.handle(RoomAliasAction.SetCanonicalAlias(alias))
- }
-
override fun toggleManualPublishForm() {
viewModel.handle(RoomAliasAction.ToggleManualPublishForm)
}
@@ -125,7 +150,7 @@ class RoomAliasFragment @Inject constructor(
}
override fun addAlias() {
- viewModel.handle(RoomAliasAction.AddAlias)
+ viewModel.handle(RoomAliasAction.ManualPublishAlias)
}
override fun toggleLocalAliasForm() {
@@ -140,11 +165,18 @@ class RoomAliasFragment @Inject constructor(
viewModel.handle(RoomAliasAction.AddLocalAlias)
}
- override fun openAlias(alias: String, isPublished: Boolean) {
- TODO()
+ override fun openAlias(alias: String, isPublished: Boolean) = withState(viewModel) { state ->
+ RoomAliasBottomSheet
+ .newInstance(
+ alias = alias,
+ isPublished = isPublished,
+ isMainAlias = alias == state.canonicalAlias,
+ canEditCanonicalAlias = state.actionPermissions.canChangeCanonicalAlias
+ )
+ .show(childFragmentManager, "ROOM_ALIAS_ACTIONS")
}
- override fun removeLocalAlias(alias: String) {
+ private fun removeLocalAlias(alias: String) {
AlertDialog.Builder(requireContext())
.setTitle(R.string.dialog_title_confirmation)
.setMessage(getString(R.string.room_alias_delete_confirmation, alias))
diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasViewModel.kt
index fac8d52159..ff9c023a21 100644
--- a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasViewModel.kt
@@ -157,13 +157,14 @@ class RoomAliasViewModel @AssistedInject constructor(@Assisted initialState: Roo
when (action) {
RoomAliasAction.ToggleManualPublishForm -> handleToggleManualPublishForm()
is RoomAliasAction.SetNewAlias -> handleSetNewAlias(action)
- is RoomAliasAction.AddAlias -> handleAddAlias()
- is RoomAliasAction.RemoveAlias -> handleRemoveAlias(action)
+ is RoomAliasAction.ManualPublishAlias -> handleAddAlias()
+ is RoomAliasAction.UnpublishAlias -> handleRemoveAlias(action)
is RoomAliasAction.SetCanonicalAlias -> handleSetCanonicalAlias(action)
RoomAliasAction.ToggleAddLocalAliasForm -> handleToggleAddLocalAliasForm()
is RoomAliasAction.SetNewLocalAliasLocalPart -> handleSetNewLocalAliasLocalPart(action)
RoomAliasAction.AddLocalAlias -> handleAddLocalAlias()
is RoomAliasAction.RemoveLocalAlias -> handleRemoveLocalAlias(action)
+ is RoomAliasAction.PublishAlias -> handleAddAliasManually(action)
}.exhaustive
}
@@ -210,22 +211,29 @@ class RoomAliasViewModel @AssistedInject constructor(@Assisted initialState: Roo
private fun handleAddAlias() = withState { state ->
val newAlias = (state.publishManuallyState as? RoomAliasViewState.AddAliasState.Editing)?.value ?: return@withState
updateCanonicalAlias(
- state.canonicalAlias,
- state.alternativeAliases + newAlias
+ canonicalAlias = state.canonicalAlias,
+ alternativeAliases = state.alternativeAliases + newAlias
)
}
- private fun handleRemoveAlias(action: RoomAliasAction.RemoveAlias) = withState { state ->
+ private fun handleAddAliasManually(action: RoomAliasAction.PublishAlias) = withState { state ->
updateCanonicalAlias(
- state.canonicalAlias,
- state.alternativeAliases - action.alias
+ canonicalAlias = state.canonicalAlias,
+ alternativeAliases = state.alternativeAliases + action.alias
+ )
+ }
+
+ private fun handleRemoveAlias(action: RoomAliasAction.UnpublishAlias) = withState { state ->
+ updateCanonicalAlias(
+ canonicalAlias = state.canonicalAlias,
+ alternativeAliases = state.alternativeAliases - action.alias
)
}
private fun handleSetCanonicalAlias(action: RoomAliasAction.SetCanonicalAlias) = withState { state ->
updateCanonicalAlias(
- action.canonicalAlias,
- state.alternativeAliases
+ canonicalAlias = action.canonicalAlias,
+ alternativeAliases = state.alternativeAliases
)
}
diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheet.kt b/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheet.kt
new file mode 100644
index 0000000000..f9968d86da
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheet.kt
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2019 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.app.features.roomprofile.alias.detail
+
+import android.os.Bundle
+import android.os.Parcelable
+import android.view.View
+import androidx.recyclerview.widget.RecyclerView
+import butterknife.BindView
+import com.airbnb.mvrx.fragmentViewModel
+import com.airbnb.mvrx.withState
+import im.vector.app.R
+import im.vector.app.core.di.ScreenComponent
+import im.vector.app.core.extensions.cleanup
+import im.vector.app.core.extensions.configureWith
+import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment
+import kotlinx.android.parcel.Parcelize
+import javax.inject.Inject
+
+@Parcelize
+data class RoomAliasBottomSheetArgs(
+ val alias: String,
+ val isPublished: Boolean,
+ val isMainAlias: Boolean,
+ val canEditCanonicalAlias: Boolean
+) : Parcelable
+
+/**
+ * Bottom sheet fragment that shows room alias information with list of contextual actions
+ */
+class RoomAliasBottomSheet : VectorBaseBottomSheetDialogFragment(), RoomAliasBottomSheetController.Listener {
+
+ private lateinit var sharedActionViewModel: RoomAliasBottomSheetSharedActionViewModel
+ @Inject lateinit var sharedViewPool: RecyclerView.RecycledViewPool
+ @Inject lateinit var roomAliasBottomSheetViewModelFactory: RoomAliasBottomSheetViewModel.Factory
+ @Inject lateinit var controller: RoomAliasBottomSheetController
+
+ private val viewModel: RoomAliasBottomSheetViewModel by fragmentViewModel(RoomAliasBottomSheetViewModel::class)
+
+ @BindView(R.id.bottomSheetRecyclerView)
+ lateinit var recyclerView: RecyclerView
+
+ override val showExpanded = true
+
+ override fun injectWith(injector: ScreenComponent) {
+ injector.inject(this)
+ }
+
+ override fun getLayoutResId() = R.layout.bottom_sheet_generic_list
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ sharedActionViewModel = activityViewModelProvider.get(RoomAliasBottomSheetSharedActionViewModel::class.java)
+ recyclerView.configureWith(controller, viewPool = sharedViewPool, hasFixedSize = false, disableItemAnimation = true)
+ controller.listener = this
+ }
+
+ override fun onDestroyView() {
+ recyclerView.cleanup()
+ controller.listener = null
+ super.onDestroyView()
+ }
+
+ override fun invalidate() = withState(viewModel) {
+ controller.setData(it)
+ super.invalidate()
+ }
+
+ override fun didSelectMenuAction(quickAction: RoomAliasBottomSheetSharedAction) {
+ sharedActionViewModel.post(quickAction)
+
+ dismiss()
+ }
+
+ companion object {
+ fun newInstance(alias: String,
+ isPublished: Boolean,
+ isMainAlias: Boolean,
+ canEditCanonicalAlias: Boolean): RoomAliasBottomSheet {
+ return RoomAliasBottomSheet().apply {
+ setArguments(RoomAliasBottomSheetArgs(
+ alias = alias,
+ isPublished = isPublished,
+ isMainAlias = isMainAlias,
+ canEditCanonicalAlias = canEditCanonicalAlias
+ ))
+ }
+ }
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheetController.kt b/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheetController.kt
new file mode 100644
index 0000000000..2f4cb357b4
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheetController.kt
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2019 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package im.vector.app.features.roomprofile.alias.detail
+
+import android.view.View
+import com.airbnb.epoxy.TypedEpoxyController
+import im.vector.app.core.epoxy.bottomsheet.bottomSheetActionItem
+import im.vector.app.core.epoxy.dividerItem
+import im.vector.app.core.epoxy.profiles.profileActionItem
+import javax.inject.Inject
+
+/**
+ * Epoxy controller for room alias actions
+ */
+class RoomAliasBottomSheetController @Inject constructor() : TypedEpoxyController() {
+
+ var listener: Listener? = null
+
+ override fun buildModels(state: RoomAliasBottomSheetState) {
+ profileActionItem {
+ id("alias")
+ title(state.alias)
+ subtitle(state.matrixToLink)
+ }
+
+ // Notifications
+ dividerItem {
+ id("aliasSeparator")
+ }
+
+ var idx = 0
+ // Share
+ state.matrixToLink?.let {
+ RoomAliasBottomSheetSharedAction.ShareAlias(it).toBottomSheetItem(++idx)
+ }
+
+ // Action on published alias
+ if (state.isPublished) {
+ // Published address
+ if (state.canEditCanonicalAlias) {
+ if (state.isMainAlias) {
+ RoomAliasBottomSheetSharedAction.UnsetMainAlias.toBottomSheetItem(++idx)
+ } else {
+ RoomAliasBottomSheetSharedAction.SetMainAlias(state.alias).toBottomSheetItem(++idx)
+ }
+ RoomAliasBottomSheetSharedAction.UnPublishAlias(state.alias).toBottomSheetItem(++idx)
+ }
+ } else {
+ // Local address
+ if (state.canEditCanonicalAlias) {
+ // Publish
+ RoomAliasBottomSheetSharedAction.PublishAlias(state.alias).toBottomSheetItem(++idx)
+ }
+ // Delete
+ RoomAliasBottomSheetSharedAction.DeleteAlias(state.alias).toBottomSheetItem(++idx)
+ }
+ }
+
+ private fun RoomAliasBottomSheetSharedAction.toBottomSheetItem(index: Int) {
+ return bottomSheetActionItem {
+ id("action_$index")
+ iconRes(iconResId)
+ textRes(titleRes)
+ destructive(this@toBottomSheetItem.destructive)
+ listener(View.OnClickListener { listener?.didSelectMenuAction(this@toBottomSheetItem) })
+ }
+ }
+
+ interface Listener {
+ fun didSelectMenuAction(quickAction: RoomAliasBottomSheetSharedAction)
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheetSharedAction.kt b/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheetSharedAction.kt
new file mode 100644
index 0000000000..13909c401f
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheetSharedAction.kt
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2019 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.app.features.roomprofile.alias.detail
+
+import androidx.annotation.DrawableRes
+import androidx.annotation.StringRes
+import im.vector.app.R
+import im.vector.app.core.platform.VectorSharedAction
+
+sealed class RoomAliasBottomSheetSharedAction(
+ @StringRes val titleRes: Int,
+ @DrawableRes val iconResId: Int = 0,
+ val destructive: Boolean = false)
+ : VectorSharedAction {
+
+ data class ShareAlias(val matrixTo: String) : RoomAliasBottomSheetSharedAction(
+ R.string.share,
+ R.drawable.ic_material_share
+ )
+
+ data class PublishAlias(val alias: String) : RoomAliasBottomSheetSharedAction(
+ R.string.room_alias_action_publish
+ )
+
+ data class UnPublishAlias(val alias: String) : RoomAliasBottomSheetSharedAction(
+ R.string.room_alias_action_unpublish
+ )
+
+ data class DeleteAlias(val alias: String) : RoomAliasBottomSheetSharedAction(
+ R.string.delete,
+ R.drawable.ic_trash_24,
+ true
+ )
+
+ data class SetMainAlias(val alias: String) : RoomAliasBottomSheetSharedAction(
+ R.string.room_settings_set_main_address
+ )
+
+ object UnsetMainAlias : RoomAliasBottomSheetSharedAction(
+ R.string.room_settings_unset_main_address
+ )
+}
diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheetSharedActionViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheetSharedActionViewModel.kt
new file mode 100644
index 0000000000..5f71783515
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheetSharedActionViewModel.kt
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2019 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package im.vector.app.features.roomprofile.alias.detail
+
+import im.vector.app.core.platform.VectorSharedActionViewModel
+import javax.inject.Inject
+
+/**
+ * Activity shared view model to handle room alias quick actions
+ */
+class RoomAliasBottomSheetSharedActionViewModel @Inject constructor() : VectorSharedActionViewModel()
diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheetState.kt b/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheetState.kt
new file mode 100644
index 0000000000..97ffcdf30c
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheetState.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2019 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.app.features.roomprofile.alias.detail
+
+import com.airbnb.mvrx.MvRxState
+
+data class RoomAliasBottomSheetState(
+ val alias: String,
+ val matrixToLink: String? = null,
+ val isPublished: Boolean,
+ val isMainAlias: Boolean,
+ val canEditCanonicalAlias: Boolean
+) : MvRxState {
+
+ constructor(args: RoomAliasBottomSheetArgs) : this(
+ alias = args.alias,
+ isPublished = args.isPublished,
+ isMainAlias = args.isMainAlias,
+ canEditCanonicalAlias = args.canEditCanonicalAlias
+ )
+}
diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheetViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheetViewModel.kt
new file mode 100644
index 0000000000..7f723cae53
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/roomprofile/alias/detail/RoomAliasBottomSheetViewModel.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2019 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package im.vector.app.features.roomprofile.alias.detail
+
+import com.airbnb.mvrx.FragmentViewModelContext
+import com.airbnb.mvrx.MvRxViewModelFactory
+import com.airbnb.mvrx.ViewModelContext
+import com.squareup.inject.assisted.Assisted
+import com.squareup.inject.assisted.AssistedInject
+import im.vector.app.core.platform.EmptyAction
+import im.vector.app.core.platform.EmptyViewEvents
+import im.vector.app.core.platform.VectorViewModel
+import org.matrix.android.sdk.api.session.Session
+
+class RoomAliasBottomSheetViewModel @AssistedInject constructor(
+ @Assisted initialState: RoomAliasBottomSheetState,
+ session: Session
+) : VectorViewModel(initialState) {
+
+ @AssistedInject.Factory
+ interface Factory {
+ fun create(initialState: RoomAliasBottomSheetState): RoomAliasBottomSheetViewModel
+ }
+
+ companion object : MvRxViewModelFactory {
+
+ @JvmStatic
+ override fun create(viewModelContext: ViewModelContext, state: RoomAliasBottomSheetState): RoomAliasBottomSheetViewModel? {
+ val fragment: RoomAliasBottomSheet = (viewModelContext as FragmentViewModelContext).fragment()
+ return fragment.roomAliasBottomSheetViewModelFactory.create(state)
+ }
+ }
+
+ init {
+ setState {
+ copy(
+ matrixToLink = session.permalinkService().createPermalink(alias)
+ )
+ }
+ }
+
+ override fun handle(action: EmptyAction) {
+ // No op
+ }
+}
diff --git a/vector/src/main/res/drawable/ic_trash_24.xml b/vector/src/main/res/drawable/ic_trash_24.xml
index 266855d50c..27ad2e29d7 100644
--- a/vector/src/main/res/drawable/ic_trash_24.xml
+++ b/vector/src/main/res/drawable/ic_trash_24.xml
@@ -1,41 +1,47 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml
index 36f2b38dab..327161233d 100644
--- a/vector/src/main/res/values/strings.xml
+++ b/vector/src/main/res/values/strings.xml
@@ -1047,6 +1047,9 @@
This room has no local addresses
Add a local address
+ Publish this address
+ Unpublish this address
+
Anyone
Members only (since the point in time of selecting this option)