From fa5d44af6515a26a107196e32bbf04b3c86426f6 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 8 Nov 2019 11:53:58 +0100 Subject: [PATCH] Create common parent for Action view model, to handle navigation, action, or other type of event --- .../platform/VectorEventViewModel.kt} | 14 ++++-- .../features/home/HomeActionViewModel.kt | 21 +++++++++ .../riotx/features/home/HomeActivity.kt | 17 +++---- .../riotx/features/home/HomeDetailFragment.kt | 6 +-- ....kt => CreateDirectRoomActionViewModel.kt} | 7 +-- .../createdirect/CreateDirectRoomActivity.kt | 21 ++++----- .../CreateDirectRoomDirectoryUsersFragment.kt | 8 ++-- .../CreateDirectRoomKnownUsersFragment.kt | 6 +-- .../features/home/group/GroupListFragment.kt | 8 ++-- .../home/room/detail/RoomDetailFragment.kt | 44 +++++++++---------- .../{SimpleAction.kt => EventAction.kt} | 43 +++++++++--------- .../action/MessageActionsBottomSheet.kt | 6 +-- .../action/MessageActionsDispatcher.kt | 8 +--- .../action/MessageActionsEpoxyController.kt | 14 +++--- .../action/MessageActionsViewModel.kt | 38 ++++++++-------- .../home/room/list/RoomListFragment.kt | 28 ++++++------ ...QuickActions.kt => RoomListQuickAction.kt} | 15 ++++--- .../RoomListQuickActionsBottomSheet.kt | 4 +- .../RoomListQuickActionsEpoxyController.kt | 28 ++++++------ .../list/actions/RoomListQuickActionsStore.kt | 8 +--- .../roomdirectory/PublicRoomsFragment.kt | 8 ++-- ...del.kt => RoomDirectoryActionViewModel.kt} | 7 +-- .../roomdirectory/RoomDirectoryActivity.kt | 25 ++++++----- .../createroom/CreateRoomActivity.kt | 12 ++--- .../createroom/CreateRoomFragment.kt | 10 ++--- .../picker/RoomDirectoryPickerFragment.kt | 8 ++-- 26 files changed, 216 insertions(+), 198 deletions(-) rename vector/src/main/java/im/vector/riotx/{features/home/HomeNavigationViewModel.kt => core/platform/VectorEventViewModel.kt} (70%) create mode 100644 vector/src/main/java/im/vector/riotx/features/home/HomeActionViewModel.kt rename vector/src/main/java/im/vector/riotx/features/home/createdirect/{CreateDirectRoomNavigationViewModel.kt => CreateDirectRoomActionViewModel.kt} (63%) rename vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/{SimpleAction.kt => EventAction.kt} (56%) rename vector/src/main/java/im/vector/riotx/features/home/room/list/actions/{RoomListQuickActions.kt => RoomListQuickAction.kt} (85%) rename vector/src/main/java/im/vector/riotx/features/roomdirectory/{RoomDirectoryNavigationViewModel.kt => RoomDirectoryActionViewModel.kt} (64%) diff --git a/vector/src/main/java/im/vector/riotx/features/home/HomeNavigationViewModel.kt b/vector/src/main/java/im/vector/riotx/core/platform/VectorEventViewModel.kt similarity index 70% rename from vector/src/main/java/im/vector/riotx/features/home/HomeNavigationViewModel.kt rename to vector/src/main/java/im/vector/riotx/core/platform/VectorEventViewModel.kt index 81c340e400..977991cd4a 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/HomeNavigationViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/core/platform/VectorEventViewModel.kt @@ -14,11 +14,17 @@ * limitations under the License. */ -package im.vector.riotx.features.home +package im.vector.riotx.core.platform import androidx.lifecycle.ViewModel -import im.vector.riotx.core.utils.PublishDataSource import im.vector.riotx.core.utils.MutableDataSource +import im.vector.riotx.core.utils.PublishDataSource -class HomeNavigationViewModel(private val source: MutableDataSource = PublishDataSource()) - : ViewModel(), MutableDataSource by source + +interface VectorAction + +/** + * Parent class to handle navigation events, action events, or other any events + */ +open class VectorActionViewModel(private val store: MutableDataSource = PublishDataSource()) + : ViewModel(), MutableDataSource by store diff --git a/vector/src/main/java/im/vector/riotx/features/home/HomeActionViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/HomeActionViewModel.kt new file mode 100644 index 0000000000..250ba8468c --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/features/home/HomeActionViewModel.kt @@ -0,0 +1,21 @@ +/* + * 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.riotx.features.home + +import im.vector.riotx.core.platform.VectorActionViewModel + +class HomeActionViewModel : VectorActionViewModel() diff --git a/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt index c77e4f9373..459678863e 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt @@ -33,6 +33,7 @@ import im.vector.riotx.core.di.ScreenComponent import im.vector.riotx.core.extensions.hideKeyboard import im.vector.riotx.core.extensions.replaceFragment import im.vector.riotx.core.platform.ToolbarConfigurable +import im.vector.riotx.core.platform.VectorAction import im.vector.riotx.core.platform.VectorBaseActivity import im.vector.riotx.core.pushers.PushersManager import im.vector.riotx.features.disclaimer.showDisclaimerDialog @@ -48,12 +49,12 @@ import javax.inject.Inject class HomeActivity : VectorBaseActivity(), ToolbarConfigurable { // Supported navigation actions for this Activity - sealed class Navigation { - object OpenDrawer : Navigation() - object OpenGroup : Navigation() + sealed class HomeActivityAction : VectorAction { + object OpenDrawer : HomeActivityAction() + object OpenGroup : HomeActivityAction() } - private lateinit var navigationViewModel: HomeNavigationViewModel + private lateinit var actionViewModel: HomeActionViewModel @Inject lateinit var activeSessionHolder: ActiveSessionHolder @Inject lateinit var vectorUncaughtExceptionHandler: VectorUncaughtExceptionHandler @@ -75,18 +76,18 @@ class HomeActivity : VectorBaseActivity(), ToolbarConfigurable { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) FcmHelper.ensureFcmTokenIsRetrieved(this, pushManager) - navigationViewModel = ViewModelProviders.of(this).get(HomeNavigationViewModel::class.java) + actionViewModel = ViewModelProviders.of(this).get(HomeActionViewModel::class.java) drawerLayout.addDrawerListener(drawerListener) if (isFirstCreation()) { replaceFragment(R.id.homeDetailFragmentContainer, LoadingFragment::class.java) replaceFragment(R.id.homeDrawerFragmentContainer, HomeDrawerFragment::class.java) } - navigationViewModel.observe() + actionViewModel.observe() .subscribe { navigation -> when (navigation) { - is Navigation.OpenDrawer -> drawerLayout.openDrawer(GravityCompat.START) - is Navigation.OpenGroup -> { + is HomeActivityAction.OpenDrawer -> drawerLayout.openDrawer(GravityCompat.START) + is HomeActivityAction.OpenGroup -> { drawerLayout.closeDrawer(GravityCompat.START) replaceFragment(R.id.homeDetailFragmentContainer, HomeDetailFragment::class.java) } diff --git a/vector/src/main/java/im/vector/riotx/features/home/HomeDetailFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/HomeDetailFragment.kt index 3c2eb1fe39..2daac15b3d 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/HomeDetailFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/HomeDetailFragment.kt @@ -54,7 +54,7 @@ class HomeDetailFragment @Inject constructor( private val unreadCounterBadgeViews = arrayListOf() private val viewModel: HomeDetailViewModel by fragmentViewModel() - private lateinit var navigationViewModel: HomeNavigationViewModel + private lateinit var actionViewModel: HomeActionViewModel override fun getLayoutResId(): Int { return R.layout.fragment_home_detail @@ -63,7 +63,7 @@ class HomeDetailFragment @Inject constructor( override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - navigationViewModel = ViewModelProviders.of(requireActivity()).get(HomeNavigationViewModel::class.java) + actionViewModel = ViewModelProviders.of(requireActivity()).get(HomeActionViewModel::class.java) setupBottomNavigationView() setupToolbar() @@ -129,7 +129,7 @@ class HomeDetailFragment @Inject constructor( } groupToolbar.title = "" groupToolbarAvatarImageView.setOnClickListener { - navigationViewModel.post(HomeActivity.Navigation.OpenDrawer) + actionViewModel.post(HomeActivity.HomeActivityAction.OpenDrawer) } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomNavigationViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomActionViewModel.kt similarity index 63% rename from vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomNavigationViewModel.kt rename to vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomActionViewModel.kt index 5a84cf4258..beff263ea0 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomNavigationViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomActionViewModel.kt @@ -16,9 +16,6 @@ package im.vector.riotx.features.home.createdirect -import androidx.lifecycle.ViewModel -import im.vector.riotx.core.utils.PublishDataSource -import im.vector.riotx.core.utils.MutableDataSource +import im.vector.riotx.core.platform.VectorActionViewModel -class CreateDirectRoomNavigationViewModel(private val dataSource: MutableDataSource = PublishDataSource()) - : ViewModel(), MutableDataSource by dataSource +class CreateDirectRoomActionViewModel : VectorActionViewModel() diff --git a/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomActivity.kt b/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomActivity.kt index ab7ee0d160..6b5354b2b9 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomActivity.kt @@ -32,20 +32,21 @@ import im.vector.riotx.core.error.ErrorFormatter import im.vector.riotx.core.extensions.addFragment import im.vector.riotx.core.extensions.addFragmentToBackstack import im.vector.riotx.core.platform.SimpleFragmentActivity +import im.vector.riotx.core.platform.VectorAction import im.vector.riotx.core.platform.WaitingViewData import kotlinx.android.synthetic.main.activity.* import javax.inject.Inject class CreateDirectRoomActivity : SimpleFragmentActivity() { - sealed class Navigation { - object UsersDirectory : Navigation() - object Close : Navigation() - object Previous : Navigation() + sealed class CreateDirectRoomAction : VectorAction { + object OpenUsersDirectory : CreateDirectRoomAction() + object Close : CreateDirectRoomAction() + object GoBack : CreateDirectRoomAction() } private val viewModel: CreateDirectRoomViewModel by viewModel() - lateinit var navigationViewModel: CreateDirectRoomNavigationViewModel + private lateinit var actionViewModel: CreateDirectRoomActionViewModel @Inject lateinit var createDirectRoomViewModelFactory: CreateDirectRoomViewModel.Factory @Inject lateinit var errorFormatter: ErrorFormatter @@ -57,13 +58,13 @@ class CreateDirectRoomActivity : SimpleFragmentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) toolbar.visibility = View.GONE - navigationViewModel = ViewModelProviders.of(this, viewModelFactory).get(CreateDirectRoomNavigationViewModel::class.java) - navigationViewModel.observe() + actionViewModel = ViewModelProviders.of(this, viewModelFactory).get(CreateDirectRoomActionViewModel::class.java) + actionViewModel.observe() .subscribe { navigation -> when (navigation) { - is Navigation.UsersDirectory -> addFragmentToBackstack(R.id.container, CreateDirectRoomDirectoryUsersFragment::class.java) - Navigation.Close -> finish() - Navigation.Previous -> onBackPressed() + CreateDirectRoomAction.OpenUsersDirectory -> addFragmentToBackstack(R.id.container, CreateDirectRoomDirectoryUsersFragment::class.java) + CreateDirectRoomAction.Close -> finish() + CreateDirectRoomAction.GoBack -> onBackPressed() } } .disposeOnDestroy() diff --git a/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomDirectoryUsersFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomDirectoryUsersFragment.kt index 10c932342d..915280ae03 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomDirectoryUsersFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomDirectoryUsersFragment.kt @@ -39,11 +39,11 @@ class CreateDirectRoomDirectoryUsersFragment @Inject constructor( private val viewModel: CreateDirectRoomViewModel by activityViewModel() - private lateinit var navigationViewModel: CreateDirectRoomNavigationViewModel + private lateinit var actionViewModel: CreateDirectRoomActionViewModel override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - navigationViewModel = ViewModelProviders.of(requireActivity(), viewModelFactory).get(CreateDirectRoomNavigationViewModel::class.java) + actionViewModel = ViewModelProviders.of(requireActivity(), viewModelFactory).get(CreateDirectRoomActionViewModel::class.java) setupRecyclerView() setupSearchByMatrixIdView() setupCloseView() @@ -70,7 +70,7 @@ class CreateDirectRoomDirectoryUsersFragment @Inject constructor( private fun setupCloseView() { createDirectRoomClose.setOnClickListener { - navigationViewModel.post(CreateDirectRoomActivity.Navigation.Previous) + actionViewModel.post(CreateDirectRoomActivity.CreateDirectRoomAction.GoBack) } } @@ -81,7 +81,7 @@ class CreateDirectRoomDirectoryUsersFragment @Inject constructor( override fun onItemClick(user: User) { view?.hideKeyboard() viewModel.handle(CreateDirectRoomActions.SelectUser(user)) - navigationViewModel.post(CreateDirectRoomActivity.Navigation.Previous) + actionViewModel.post(CreateDirectRoomActivity.CreateDirectRoomAction.GoBack) } override fun retryDirectoryUsersRequest() { diff --git a/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomKnownUsersFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomKnownUsersFragment.kt index 02ca8ba55c..9cadbc230f 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomKnownUsersFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomKnownUsersFragment.kt @@ -49,11 +49,11 @@ class CreateDirectRoomKnownUsersFragment @Inject constructor( override fun getMenuRes() = R.menu.vector_create_direct_room private val viewModel: CreateDirectRoomViewModel by activityViewModel() - private lateinit var navigationViewModel: CreateDirectRoomNavigationViewModel + private lateinit var actionViewModel: CreateDirectRoomActionViewModel override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - navigationViewModel = ViewModelProviders.of(requireActivity(), viewModelFactory).get(CreateDirectRoomNavigationViewModel::class.java) + actionViewModel = ViewModelProviders.of(requireActivity(), viewModelFactory).get(CreateDirectRoomActionViewModel::class.java) vectorBaseActivity.setSupportActionBar(createDirectRoomToolbar) setupRecyclerView() setupFilterView() @@ -89,7 +89,7 @@ class CreateDirectRoomKnownUsersFragment @Inject constructor( private fun setupAddByMatrixIdView() { addByMatrixId.setOnClickListener { - navigationViewModel.post(CreateDirectRoomActivity.Navigation.UsersDirectory) + actionViewModel.post(CreateDirectRoomActivity.CreateDirectRoomAction.OpenUsersDirectory) } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/group/GroupListFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/group/GroupListFragment.kt index a1e13e4acd..8666f57338 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/group/GroupListFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/group/GroupListFragment.kt @@ -26,8 +26,8 @@ import im.vector.riotx.R import im.vector.riotx.core.extensions.observeEvent import im.vector.riotx.core.platform.StateView import im.vector.riotx.core.platform.VectorBaseFragment +import im.vector.riotx.features.home.HomeActionViewModel import im.vector.riotx.features.home.HomeActivity -import im.vector.riotx.features.home.HomeNavigationViewModel import kotlinx.android.synthetic.main.fragment_group_list.* import javax.inject.Inject @@ -36,20 +36,20 @@ class GroupListFragment @Inject constructor( private val groupController: GroupSummaryController ) : VectorBaseFragment(), GroupSummaryController.Callback { - private lateinit var navigationViewModel: HomeNavigationViewModel + private lateinit var actionViewModel: HomeActionViewModel private val viewModel: GroupListViewModel by fragmentViewModel() override fun getLayoutResId() = R.layout.fragment_group_list override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - navigationViewModel = ViewModelProviders.of(requireActivity()).get(HomeNavigationViewModel::class.java) + actionViewModel = ViewModelProviders.of(requireActivity()).get(HomeActionViewModel::class.java) groupController.callback = this stateView.contentView = groupListEpoxyRecyclerView groupListEpoxyRecyclerView.setController(groupController) viewModel.subscribe { renderState(it) } viewModel.openGroupLiveData.observeEvent(this) { - navigationViewModel.post(HomeActivity.Navigation.OpenGroup) + actionViewModel.post(HomeActivity.HomeActivityAction.OpenGroup) } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt index 465e085e3b..83004a35de 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt @@ -99,7 +99,7 @@ import im.vector.riotx.features.home.room.detail.readreceipts.DisplayReadReceipt import im.vector.riotx.features.home.room.detail.timeline.TimelineEventController import im.vector.riotx.features.home.room.detail.timeline.action.MessageActionsBottomSheet import im.vector.riotx.features.home.room.detail.timeline.action.MessageActionsDispatcher -import im.vector.riotx.features.home.room.detail.timeline.action.SimpleAction +import im.vector.riotx.features.home.room.detail.timeline.action.EventAction import im.vector.riotx.features.home.room.detail.timeline.edithistory.ViewEditHistoryBottomSheet import im.vector.riotx.features.home.room.detail.timeline.item.* import im.vector.riotx.features.home.room.detail.timeline.reactions.ViewReactionsBottomSheet @@ -749,7 +749,7 @@ class RoomDetailFragment @Inject constructor( .show() } - private fun promptReasonToReportContent(action: SimpleAction.ReportContentCustom) { + private fun promptReasonToReportContent(action: EventAction.ReportContentCustom) { val inflater = requireActivity().layoutInflater val layout = inflater.inflate(R.layout.dialog_report_content, null) @@ -1037,25 +1037,25 @@ class RoomDetailFragment @Inject constructor( textComposerViewModel.process(TextComposerActions.QueryUsers(query)) } - private fun handleActions(action: SimpleAction) { + private fun handleActions(action: EventAction) { when (action) { - is SimpleAction.AddReaction -> { + is EventAction.AddReaction -> { startActivityForResult(EmojiReactionPickerActivity.intent(requireContext(), action.eventId), REACTION_SELECT_REQUEST_CODE) } - is SimpleAction.ViewReactions -> { + is EventAction.ViewReactions -> { ViewReactionsBottomSheet.newInstance(roomDetailArgs.roomId, action.messageInformationData) .show(requireActivity().supportFragmentManager, "DISPLAY_REACTIONS") } - is SimpleAction.Copy -> { + is EventAction.Copy -> { // I need info about the current selected message :/ copyToClipboard(requireContext(), action.content, false) val msg = requireContext().getString(R.string.copied_to_clipboard) showSnackWithMessage(msg, Snackbar.LENGTH_SHORT) } - is SimpleAction.Delete -> { + is EventAction.Delete -> { roomDetailViewModel.process(RoomDetailActions.RedactAction(action.eventId, context?.getString(R.string.event_redacted_by_user_reason))) } - is SimpleAction.Share -> { + is EventAction.Share -> { // TODO current data communication is too limited // Need to now the media type // TODO bad, just POC @@ -1083,10 +1083,10 @@ class RoomDetailFragment @Inject constructor( } ) } - is SimpleAction.ViewEditHistory -> { + is EventAction.ViewEditHistory -> { onEditedDecorationClicked(action.messageInformationData) } - is SimpleAction.ViewSource -> { + is EventAction.ViewSource -> { val view = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_event_content, null) view.findViewById(R.id.event_content_text_view)?.let { it.text = action.content @@ -1097,7 +1097,7 @@ class RoomDetailFragment @Inject constructor( .setPositiveButton(R.string.ok, null) .show() } - is SimpleAction.ViewDecryptedSource -> { + is EventAction.ViewDecryptedSource -> { val view = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_event_content, null) view.findViewById(R.id.event_content_text_view)?.let { it.text = action.content @@ -1108,42 +1108,42 @@ class RoomDetailFragment @Inject constructor( .setPositiveButton(R.string.ok, null) .show() } - is SimpleAction.QuickReact -> { + is EventAction.QuickReact -> { // eventId,ClickedOn,Add roomDetailViewModel.process(RoomDetailActions.UpdateQuickReactAction(action.eventId, action.clickedOn, action.add)) } - is SimpleAction.Edit -> { + is EventAction.Edit -> { roomDetailViewModel.process(RoomDetailActions.EnterEditMode(action.eventId, composerLayout.composerEditText.text.toString())) } - is SimpleAction.Quote -> { + is EventAction.Quote -> { roomDetailViewModel.process(RoomDetailActions.EnterQuoteMode(action.eventId, composerLayout.composerEditText.text.toString())) } - is SimpleAction.Reply -> { + is EventAction.Reply -> { roomDetailViewModel.process(RoomDetailActions.EnterReplyMode(action.eventId, composerLayout.composerEditText.text.toString())) } - is SimpleAction.CopyPermalink -> { + is EventAction.CopyPermalink -> { val permalink = PermalinkFactory.createPermalink(roomDetailArgs.roomId, action.eventId) copyToClipboard(requireContext(), permalink, false) showSnackWithMessage(requireContext().getString(R.string.copied_to_clipboard), Snackbar.LENGTH_SHORT) } - is SimpleAction.Resend -> { + is EventAction.Resend -> { roomDetailViewModel.process(RoomDetailActions.ResendMessage(action.eventId)) } - is SimpleAction.Remove -> { + is EventAction.Remove -> { roomDetailViewModel.process(RoomDetailActions.RemoveFailedEcho(action.eventId)) } - is SimpleAction.ReportContentSpam -> { + is EventAction.ReportContentSpam -> { roomDetailViewModel.process(RoomDetailActions.ReportContent( action.eventId, action.senderId, "This message is spam", spam = true)) } - is SimpleAction.ReportContentInappropriate -> { + is EventAction.ReportContentInappropriate -> { roomDetailViewModel.process(RoomDetailActions.ReportContent( action.eventId, action.senderId, "This message is inappropriate", inappropriate = true)) } - is SimpleAction.ReportContentCustom -> { + is EventAction.ReportContentCustom -> { promptReasonToReportContent(action) } - else -> { + else -> { Toast.makeText(context, "Action $action is not implemented yet", Toast.LENGTH_LONG).show() } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/SimpleAction.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/EventAction.kt similarity index 56% rename from vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/SimpleAction.kt rename to vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/EventAction.kt index ab2fb8e41e..79d615112c 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/SimpleAction.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/EventAction.kt @@ -19,66 +19,67 @@ package im.vector.riotx.features.home.room.detail.timeline.action import androidx.annotation.DrawableRes import androidx.annotation.StringRes import im.vector.riotx.R +import im.vector.riotx.core.platform.VectorAction import im.vector.riotx.features.home.room.detail.timeline.item.MessageInformationData -sealed class SimpleAction(@StringRes val titleRes: Int, @DrawableRes val iconResId: Int) { +sealed class EventAction(@StringRes val titleRes: Int, @DrawableRes val iconResId: Int) : VectorAction { data class AddReaction(val eventId: String) : - SimpleAction(R.string.message_add_reaction, R.drawable.ic_add_reaction) + EventAction(R.string.message_add_reaction, R.drawable.ic_add_reaction) data class Copy(val content: String) : - SimpleAction(R.string.copy, R.drawable.ic_copy) + EventAction(R.string.copy, R.drawable.ic_copy) data class Edit(val eventId: String) : - SimpleAction(R.string.edit, R.drawable.ic_edit) + EventAction(R.string.edit, R.drawable.ic_edit) data class Quote(val eventId: String) : - SimpleAction(R.string.quote, R.drawable.ic_quote) + EventAction(R.string.quote, R.drawable.ic_quote) data class Reply(val eventId: String) : - SimpleAction(R.string.reply, R.drawable.ic_reply) + EventAction(R.string.reply, R.drawable.ic_reply) data class Share(val imageUrl: String) : - SimpleAction(R.string.share, R.drawable.ic_share) + EventAction(R.string.share, R.drawable.ic_share) data class Resend(val eventId: String) : - SimpleAction(R.string.global_retry, R.drawable.ic_refresh_cw) + EventAction(R.string.global_retry, R.drawable.ic_refresh_cw) data class Remove(val eventId: String) : - SimpleAction(R.string.remove, R.drawable.ic_trash) + EventAction(R.string.remove, R.drawable.ic_trash) data class Delete(val eventId: String) : - SimpleAction(R.string.delete, R.drawable.ic_delete) + EventAction(R.string.delete, R.drawable.ic_delete) data class Cancel(val eventId: String) : - SimpleAction(R.string.cancel, R.drawable.ic_close_round) + EventAction(R.string.cancel, R.drawable.ic_close_round) data class ViewSource(val content: String) : - SimpleAction(R.string.view_source, R.drawable.ic_view_source) + EventAction(R.string.view_source, R.drawable.ic_view_source) data class ViewDecryptedSource(val content: String) : - SimpleAction(R.string.view_decrypted_source, R.drawable.ic_view_source) + EventAction(R.string.view_decrypted_source, R.drawable.ic_view_source) data class CopyPermalink(val eventId: String) : - SimpleAction(R.string.permalink, R.drawable.ic_permalink) + EventAction(R.string.permalink, R.drawable.ic_permalink) data class ReportContent(val eventId: String, val senderId: String?) : - SimpleAction(R.string.report_content, R.drawable.ic_flag) + EventAction(R.string.report_content, R.drawable.ic_flag) data class ReportContentSpam(val eventId: String, val senderId: String?) : - SimpleAction(R.string.report_content_spam, R.drawable.ic_report_spam) + EventAction(R.string.report_content_spam, R.drawable.ic_report_spam) data class ReportContentInappropriate(val eventId: String, val senderId: String?) : - SimpleAction(R.string.report_content_inappropriate, R.drawable.ic_report_inappropriate) + EventAction(R.string.report_content_inappropriate, R.drawable.ic_report_inappropriate) data class ReportContentCustom(val eventId: String, val senderId: String?) : - SimpleAction(R.string.report_content_custom, R.drawable.ic_report_custom) + EventAction(R.string.report_content_custom, R.drawable.ic_report_custom) data class QuickReact(val eventId: String, val clickedOn: String, val add: Boolean) : - SimpleAction(0, 0) + EventAction(0, 0) data class ViewReactions(val messageInformationData: MessageInformationData) : - SimpleAction(R.string.message_view_reaction, R.drawable.ic_view_reactions) + EventAction(R.string.message_view_reaction, R.drawable.ic_view_reactions) data class ViewEditHistory(val messageInformationData: MessageInformationData) : - SimpleAction(R.string.message_view_edit_history, R.drawable.ic_view_edit_history) + EventAction(R.string.message_view_edit_history, R.drawable.ic_view_edit_history) } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsBottomSheet.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsBottomSheet.kt index d0dc3de8f3..fa738e5c42 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsBottomSheet.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsBottomSheet.kt @@ -69,12 +69,12 @@ class MessageActionsBottomSheet : VectorBaseBottomSheetDialogFragment(), Message messageActionsEpoxyController.listener = this } - override fun didSelectMenuAction(simpleAction: SimpleAction) { - if (simpleAction is SimpleAction.ReportContent) { + override fun didSelectMenuAction(eventAction: EventAction) { + if (eventAction is EventAction.ReportContent) { // Toggle report menu viewModel.toggleReportMenu() } else { - messageActionsStore.post(simpleAction) + messageActionsStore.post(eventAction) dismiss() } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsDispatcher.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsDispatcher.kt index a11e0c3689..54f9d0d583 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsDispatcher.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsDispatcher.kt @@ -15,13 +15,9 @@ */ package im.vector.riotx.features.home.room.detail.timeline.action -import androidx.lifecycle.ViewModel -import im.vector.riotx.core.utils.PublishDataSource -import im.vector.riotx.core.utils.MutableDataSource +import im.vector.riotx.core.platform.VectorActionViewModel /** * Activity shared view model to handle message actions */ -class MessageActionsDispatcher constructor( - private val dataSource: MutableDataSource = PublishDataSource() -) : ViewModel(), MutableDataSource by dataSource +class MessageActionsDispatcher : VectorActionViewModel() diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsEpoxyController.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsEpoxyController.kt index b7bf69b7a1..e30a383087 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsEpoxyController.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsEpoxyController.kt @@ -84,7 +84,7 @@ class MessageActionsEpoxyController @Inject constructor(private val stringProvid selecteds(state.quickStates.invoke().map { it.isSelected }) listener(object : BottomSheetItemQuickReactions.Listener { override fun didSelect(emoji: String, selected: Boolean) { - listener?.didSelectMenuAction(SimpleAction.QuickReact(state.eventId, emoji, selected)) + listener?.didSelectMenuAction(EventAction.QuickReact(state.eventId, emoji, selected)) } }) } @@ -101,17 +101,17 @@ class MessageActionsEpoxyController @Inject constructor(private val stringProvid id("action_$index") iconRes(action.iconResId) textRes(action.titleRes) - showExpand(action is SimpleAction.ReportContent) + showExpand(action is EventAction.ReportContent) expanded(state.expendedReportContentMenu) listener(View.OnClickListener { listener?.didSelectMenuAction(action) }) } - if (action is SimpleAction.ReportContent && state.expendedReportContentMenu) { + if (action is EventAction.ReportContent && state.expendedReportContentMenu) { // Special case for report content menu: add the submenu listOf( - SimpleAction.ReportContentSpam(action.eventId, action.senderId), - SimpleAction.ReportContentInappropriate(action.eventId, action.senderId), - SimpleAction.ReportContentCustom(action.eventId, action.senderId) + EventAction.ReportContentSpam(action.eventId, action.senderId), + EventAction.ReportContentInappropriate(action.eventId, action.senderId), + EventAction.ReportContentCustom(action.eventId, action.senderId) ).forEachIndexed { indexReport, actionReport -> bottomSheetItemAction { id("actionReport_$indexReport") @@ -126,6 +126,6 @@ class MessageActionsEpoxyController @Inject constructor(private val stringProvid } interface MessageActionsEpoxyControllerListener { - fun didSelectMenuAction(simpleAction: SimpleAction) + fun didSelectMenuAction(eventAction: EventAction) } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsViewModel.kt index 63429e5def..92be124940 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsViewModel.kt @@ -62,7 +62,7 @@ data class MessageActionState( // For quick reactions val quickStates: Async> = Uninitialized, // For actions - val actions: Async> = Uninitialized, + val actions: Async> = Uninitialized, val expendedReportContentMenu: Boolean = false ) : MvRxState { @@ -184,63 +184,63 @@ class MessageActionsViewModel @AssistedInject constructor(@Assisted } } - private fun actionsForEvent(optionalEvent: Optional): List { + private fun actionsForEvent(optionalEvent: Optional): List { val event = optionalEvent.getOrNull() ?: return emptyList() val messageContent: MessageContent? = event.annotations?.editSummary?.aggregatedContent.toModel() ?: event.root.getClearContent().toModel() val type = messageContent?.type - return arrayListOf().apply { + return arrayListOf().apply { if (event.root.sendState.hasFailed()) { if (canRetry(event)) { - add(SimpleAction.Resend(eventId)) + add(EventAction.Resend(eventId)) } - add(SimpleAction.Remove(eventId)) + add(EventAction.Remove(eventId)) } else if (event.root.sendState.isSending()) { // TODO is uploading attachment? if (canCancel(event)) { - add(SimpleAction.Cancel(eventId)) + add(EventAction.Cancel(eventId)) } } else if (event.root.sendState == SendState.SYNCED) { if (!event.root.isRedacted()) { if (canReply(event, messageContent)) { - add(SimpleAction.Reply(eventId)) + add(EventAction.Reply(eventId)) } if (canEdit(event, session.myUserId)) { - add(SimpleAction.Edit(eventId)) + add(EventAction.Edit(eventId)) } if (canRedact(event, session.myUserId)) { - add(SimpleAction.Delete(eventId)) + add(EventAction.Delete(eventId)) } if (canCopy(type)) { // TODO copy images? html? see ClipBoard - add(SimpleAction.Copy(messageContent!!.body)) + add(EventAction.Copy(messageContent!!.body)) } if (event.canReact()) { - add(SimpleAction.AddReaction(eventId)) + add(EventAction.AddReaction(eventId)) } if (canQuote(event, messageContent)) { - add(SimpleAction.Quote(eventId)) + add(EventAction.Quote(eventId)) } if (canViewReactions(event)) { - add(SimpleAction.ViewReactions(informationData)) + add(EventAction.ViewReactions(informationData)) } if (event.hasBeenEdited()) { - add(SimpleAction.ViewEditHistory(informationData)) + add(EventAction.ViewEditHistory(informationData)) } if (canShare(type)) { if (messageContent is MessageImageContent) { session.contentUrlResolver().resolveFullSize(messageContent.url)?.let { url -> - add(SimpleAction.Share(url)) + add(EventAction.Share(url)) } } // TODO @@ -253,17 +253,17 @@ class MessageActionsViewModel @AssistedInject constructor(@Assisted } } - add(SimpleAction.ViewSource(event.root.toContentStringWithIndent())) + add(EventAction.ViewSource(event.root.toContentStringWithIndent())) if (event.isEncrypted()) { val decryptedContent = event.root.toClearContentStringWithIndent() ?: stringProvider.getString(R.string.encryption_information_decryption_error) - add(SimpleAction.ViewDecryptedSource(decryptedContent)) + add(EventAction.ViewDecryptedSource(decryptedContent)) } - add(SimpleAction.CopyPermalink(eventId)) + add(EventAction.CopyPermalink(eventId)) if (session.myUserId != event.root.senderId && event.root.getClearType() == EventType.MESSAGE) { // not sent by me - add(SimpleAction.ReportContent(eventId, event.root.senderId)) + add(EventAction.ReportContent(eventId, event.root.senderId)) } } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListFragment.kt index 13c6444400..64c8214236 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListFragment.kt @@ -39,7 +39,7 @@ import im.vector.riotx.core.error.ErrorFormatter import im.vector.riotx.core.platform.OnBackPressed import im.vector.riotx.core.platform.StateView import im.vector.riotx.core.platform.VectorBaseFragment -import im.vector.riotx.features.home.room.list.actions.RoomListQuickActions +import im.vector.riotx.features.home.room.list.actions.RoomListQuickAction import im.vector.riotx.features.home.room.list.actions.RoomListQuickActionsBottomSheet import im.vector.riotx.features.home.room.list.actions.RoomListQuickActionsStore import im.vector.riotx.features.home.room.list.widget.FabMenuView @@ -216,29 +216,29 @@ class RoomListFragment @Inject constructor( } } - private fun handleQuickActions(quickActions: RoomListQuickActions) { - when (quickActions) { - is RoomListQuickActions.NotificationsAllNoisy -> { - roomListViewModel.accept(RoomListActions.ChangeRoomNotificationState(quickActions.roomId, RoomNotificationState.ALL_MESSAGES_NOISY)) + private fun handleQuickActions(quickAction: RoomListQuickAction) { + when (quickAction) { + is RoomListQuickAction.NotificationsAllNoisy -> { + roomListViewModel.accept(RoomListActions.ChangeRoomNotificationState(quickAction.roomId, RoomNotificationState.ALL_MESSAGES_NOISY)) } - is RoomListQuickActions.NotificationsAll -> { - roomListViewModel.accept(RoomListActions.ChangeRoomNotificationState(quickActions.roomId, RoomNotificationState.ALL_MESSAGES)) + is RoomListQuickAction.NotificationsAll -> { + roomListViewModel.accept(RoomListActions.ChangeRoomNotificationState(quickAction.roomId, RoomNotificationState.ALL_MESSAGES)) } - is RoomListQuickActions.NotificationsMentionsOnly -> { - roomListViewModel.accept(RoomListActions.ChangeRoomNotificationState(quickActions.roomId, RoomNotificationState.MENTIONS_ONLY)) + is RoomListQuickAction.NotificationsMentionsOnly -> { + roomListViewModel.accept(RoomListActions.ChangeRoomNotificationState(quickAction.roomId, RoomNotificationState.MENTIONS_ONLY)) } - is RoomListQuickActions.NotificationsMute -> { - roomListViewModel.accept(RoomListActions.ChangeRoomNotificationState(quickActions.roomId, RoomNotificationState.MUTE)) + is RoomListQuickAction.NotificationsMute -> { + roomListViewModel.accept(RoomListActions.ChangeRoomNotificationState(quickAction.roomId, RoomNotificationState.MUTE)) } - is RoomListQuickActions.Settings -> { + is RoomListQuickAction.Settings -> { vectorBaseActivity.notImplemented("Opening room settings") } - is RoomListQuickActions.Leave -> { + is RoomListQuickAction.Leave -> { AlertDialog.Builder(requireContext()) .setTitle(R.string.room_participants_leave_prompt_title) .setMessage(R.string.room_participants_leave_prompt_msg) .setPositiveButton(R.string.leave) { _, _ -> - roomListViewModel.accept(RoomListActions.LeaveRoom(quickActions.roomId)) + roomListViewModel.accept(RoomListActions.LeaveRoom(quickAction.roomId)) } .setNegativeButton(R.string.cancel, null) .show() diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActions.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickAction.kt similarity index 85% rename from vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActions.kt rename to vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickAction.kt index 86cd9043f3..c0de0a9d7b 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActions.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickAction.kt @@ -19,35 +19,36 @@ package im.vector.riotx.features.home.room.list.actions import androidx.annotation.DrawableRes import androidx.annotation.StringRes import im.vector.riotx.R +import im.vector.riotx.core.platform.VectorAction -sealed class RoomListQuickActions(@StringRes val titleRes: Int, @DrawableRes val iconResId: Int, val destructive: Boolean = false) { +sealed class RoomListQuickAction(@StringRes val titleRes: Int, @DrawableRes val iconResId: Int, val destructive: Boolean = false) : VectorAction { - data class NotificationsAllNoisy(val roomId: String) : RoomListQuickActions( + data class NotificationsAllNoisy(val roomId: String) : RoomListQuickAction( R.string.room_list_quick_actions_notifications_all_noisy, R.drawable.ic_room_actions_notifications_all_noisy ) - data class NotificationsAll(val roomId: String) : RoomListQuickActions( + data class NotificationsAll(val roomId: String) : RoomListQuickAction( R.string.room_list_quick_actions_notifications_all, R.drawable.ic_room_actions_notifications_all ) - data class NotificationsMentionsOnly(val roomId: String) : RoomListQuickActions( + data class NotificationsMentionsOnly(val roomId: String) : RoomListQuickAction( R.string.room_list_quick_actions_notifications_mentions, R.drawable.ic_room_actions_notifications_mentions ) - data class NotificationsMute(val roomId: String) : RoomListQuickActions( + data class NotificationsMute(val roomId: String) : RoomListQuickAction( R.string.room_list_quick_actions_notifications_mute, R.drawable.ic_room_actions_notifications_mutes ) - data class Settings(val roomId: String) : RoomListQuickActions( + data class Settings(val roomId: String) : RoomListQuickAction( R.string.room_list_quick_actions_settings, R.drawable.ic_room_actions_settings ) - data class Leave(val roomId: String) : RoomListQuickActions( + data class Leave(val roomId: String) : RoomListQuickAction( R.string.room_list_quick_actions_leave, R.drawable.ic_room_actions_leave, true diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsBottomSheet.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsBottomSheet.kt index 560c05771c..03fb5f5a00 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsBottomSheet.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsBottomSheet.kt @@ -82,8 +82,8 @@ class RoomListQuickActionsBottomSheet : VectorBaseBottomSheetDialogFragment(), R super.invalidate() } - override fun didSelectMenuAction(quickActions: RoomListQuickActions) { - actionsDispatcher.post(quickActions) + override fun didSelectMenuAction(quickAction: RoomListQuickAction) { + actionsDispatcher.post(quickAction) dismiss() } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsEpoxyController.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsEpoxyController.kt index 70d0fc5f76..16d96e8dba 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsEpoxyController.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsEpoxyController.kt @@ -42,7 +42,7 @@ class RoomListQuickActionsEpoxyController @Inject constructor(private val avatar roomName(roomSummary.displayName) avatarUrl(roomSummary.avatarUrl) roomId(roomSummary.roomId) - settingsClickListener(View.OnClickListener { listener?.didSelectMenuAction(RoomListQuickActions.Settings(roomSummary.roomId)) }) + settingsClickListener(View.OnClickListener { listener?.didSelectMenuAction(RoomListQuickAction.Settings(roomSummary.roomId)) }) } // Notifications @@ -51,26 +51,26 @@ class RoomListQuickActionsEpoxyController @Inject constructor(private val avatar } val selectedRoomState = state.roomNotificationState() - RoomListQuickActions.NotificationsAllNoisy(roomSummary.roomId).toBottomSheetItem(0, selectedRoomState) - RoomListQuickActions.NotificationsAll(roomSummary.roomId).toBottomSheetItem(1, selectedRoomState) - RoomListQuickActions.NotificationsMentionsOnly(roomSummary.roomId).toBottomSheetItem(2, selectedRoomState) - RoomListQuickActions.NotificationsMute(roomSummary.roomId).toBottomSheetItem(3, selectedRoomState) + RoomListQuickAction.NotificationsAllNoisy(roomSummary.roomId).toBottomSheetItem(0, selectedRoomState) + RoomListQuickAction.NotificationsAll(roomSummary.roomId).toBottomSheetItem(1, selectedRoomState) + RoomListQuickAction.NotificationsMentionsOnly(roomSummary.roomId).toBottomSheetItem(2, selectedRoomState) + RoomListQuickAction.NotificationsMute(roomSummary.roomId).toBottomSheetItem(3, selectedRoomState) // Leave bottomSheetItemSeparator { id("leave_separator") } - RoomListQuickActions.Leave(roomSummary.roomId).toBottomSheetItem(5) + RoomListQuickAction.Leave(roomSummary.roomId).toBottomSheetItem(5) } - private fun RoomListQuickActions.toBottomSheetItem(index: Int, roomNotificationState: RoomNotificationState? = null) { + private fun RoomListQuickAction.toBottomSheetItem(index: Int, roomNotificationState: RoomNotificationState? = null) { val selected = when (this) { - is RoomListQuickActions.NotificationsAllNoisy -> roomNotificationState == RoomNotificationState.ALL_MESSAGES_NOISY - is RoomListQuickActions.NotificationsAll -> roomNotificationState == RoomNotificationState.ALL_MESSAGES - is RoomListQuickActions.NotificationsMentionsOnly -> roomNotificationState == RoomNotificationState.MENTIONS_ONLY - is RoomListQuickActions.NotificationsMute -> roomNotificationState == RoomNotificationState.MUTE - is RoomListQuickActions.Settings, - is RoomListQuickActions.Leave -> false + is RoomListQuickAction.NotificationsAllNoisy -> roomNotificationState == RoomNotificationState.ALL_MESSAGES_NOISY + is RoomListQuickAction.NotificationsAll -> roomNotificationState == RoomNotificationState.ALL_MESSAGES + is RoomListQuickAction.NotificationsMentionsOnly -> roomNotificationState == RoomNotificationState.MENTIONS_ONLY + is RoomListQuickAction.NotificationsMute -> roomNotificationState == RoomNotificationState.MUTE + is RoomListQuickAction.Settings, + is RoomListQuickAction.Leave -> false } return bottomSheetItemAction { id("action_$index") @@ -83,6 +83,6 @@ class RoomListQuickActionsEpoxyController @Inject constructor(private val avatar } interface Listener { - fun didSelectMenuAction(quickActions: RoomListQuickActions) + fun didSelectMenuAction(quickAction: RoomListQuickAction) } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsStore.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsStore.kt index 35fe09dff8..503a3b0327 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsStore.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsStore.kt @@ -16,13 +16,9 @@ */ package im.vector.riotx.features.home.room.list.actions -import androidx.lifecycle.ViewModel -import im.vector.riotx.core.utils.PublishDataSource -import im.vector.riotx.core.utils.MutableDataSource +import im.vector.riotx.core.platform.VectorActionViewModel /** * Activity shared view model to handle room list quick actions */ -class RoomListQuickActionsStore constructor( - private val store: MutableDataSource = PublishDataSource() -) : ViewModel(), MutableDataSource by store +class RoomListQuickActionsStore : VectorActionViewModel() diff --git a/vector/src/main/java/im/vector/riotx/features/roomdirectory/PublicRoomsFragment.kt b/vector/src/main/java/im/vector/riotx/features/roomdirectory/PublicRoomsFragment.kt index 303e931b5c..36c3c13cc3 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomdirectory/PublicRoomsFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomdirectory/PublicRoomsFragment.kt @@ -47,7 +47,7 @@ class PublicRoomsFragment @Inject constructor( ) : VectorBaseFragment(), PublicRoomsController.Callback { private val viewModel: RoomDirectoryViewModel by activityViewModel() - private lateinit var navigationViewModel: RoomDirectoryNavigationViewModel + private lateinit var actionViewModel: RoomDirectoryActionViewModel override fun getLayoutResId() = R.layout.fragment_public_rooms @@ -71,7 +71,7 @@ class PublicRoomsFragment @Inject constructor( .disposeOnDestroy() publicRoomsCreateNewRoom.setOnClickListener { - navigationViewModel.post(RoomDirectoryActivity.Navigation.CreateRoom) + actionViewModel.post(RoomDirectoryActivity.RoomDirectoryAction.CreateRoom) } viewModel.joinRoomErrorLiveData.observeEvent(this) { throwable -> @@ -83,7 +83,7 @@ class PublicRoomsFragment @Inject constructor( override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.menu_room_directory_change_protocol -> { - navigationViewModel.post(RoomDirectoryActivity.Navigation.ChangeProtocol) + actionViewModel.post(RoomDirectoryActivity.RoomDirectoryAction.ChangeProtocol) true } else -> @@ -93,7 +93,7 @@ class PublicRoomsFragment @Inject constructor( override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - navigationViewModel = ViewModelProviders.of(requireActivity()).get(RoomDirectoryNavigationViewModel::class.java) + actionViewModel = ViewModelProviders.of(requireActivity()).get(RoomDirectoryActionViewModel::class.java) setupRecyclerView() } diff --git a/vector/src/main/java/im/vector/riotx/features/roomdirectory/RoomDirectoryNavigationViewModel.kt b/vector/src/main/java/im/vector/riotx/features/roomdirectory/RoomDirectoryActionViewModel.kt similarity index 64% rename from vector/src/main/java/im/vector/riotx/features/roomdirectory/RoomDirectoryNavigationViewModel.kt rename to vector/src/main/java/im/vector/riotx/features/roomdirectory/RoomDirectoryActionViewModel.kt index 4e4230e07b..d9e1a4614b 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomdirectory/RoomDirectoryNavigationViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomdirectory/RoomDirectoryActionViewModel.kt @@ -16,9 +16,6 @@ package im.vector.riotx.features.roomdirectory -import androidx.lifecycle.ViewModel -import im.vector.riotx.core.utils.PublishDataSource -import im.vector.riotx.core.utils.MutableDataSource +import im.vector.riotx.core.platform.VectorActionViewModel -class RoomDirectoryNavigationViewModel(private val source: MutableDataSource = PublishDataSource()) - : ViewModel(), MutableDataSource by source +class RoomDirectoryActionViewModel : VectorActionViewModel() diff --git a/vector/src/main/java/im/vector/riotx/features/roomdirectory/RoomDirectoryActivity.kt b/vector/src/main/java/im/vector/riotx/features/roomdirectory/RoomDirectoryActivity.kt index e98c180bc9..84d7b758ab 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomdirectory/RoomDirectoryActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomdirectory/RoomDirectoryActivity.kt @@ -25,6 +25,7 @@ import im.vector.riotx.R import im.vector.riotx.core.di.ScreenComponent import im.vector.riotx.core.extensions.addFragment import im.vector.riotx.core.extensions.addFragmentToBackstack +import im.vector.riotx.core.platform.VectorAction import im.vector.riotx.core.platform.VectorBaseActivity import im.vector.riotx.features.roomdirectory.createroom.CreateRoomFragment import im.vector.riotx.features.roomdirectory.createroom.CreateRoomViewModel @@ -34,18 +35,18 @@ import javax.inject.Inject class RoomDirectoryActivity : VectorBaseActivity() { // Supported navigation actions for this Activity - sealed class Navigation { - object Back : Navigation() - object CreateRoom : Navigation() - object Close : Navigation() - object ChangeProtocol : Navigation() + sealed class RoomDirectoryAction : VectorAction { + object Back : RoomDirectoryAction() + object CreateRoom : RoomDirectoryAction() + object Close : RoomDirectoryAction() + object ChangeProtocol : RoomDirectoryAction() } @Inject lateinit var createRoomViewModelFactory: CreateRoomViewModel.Factory @Inject lateinit var roomDirectoryViewModelFactory: RoomDirectoryViewModel.Factory private val roomDirectoryViewModel: RoomDirectoryViewModel by viewModel() private val createRoomViewModel: CreateRoomViewModel by viewModel() - private lateinit var navigationViewModel: RoomDirectoryNavigationViewModel + private lateinit var actionViewModel: RoomDirectoryActionViewModel override fun getLayoutRes() = R.layout.activity_simple @@ -55,19 +56,19 @@ class RoomDirectoryActivity : VectorBaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - navigationViewModel = ViewModelProviders.of(this, viewModelFactory).get(RoomDirectoryNavigationViewModel::class.java) + actionViewModel = ViewModelProviders.of(this, viewModelFactory).get(RoomDirectoryActionViewModel::class.java) if (isFirstCreation()) { roomDirectoryViewModel.filterWith(intent?.getStringExtra(INITIAL_FILTER) ?: "") } - navigationViewModel.observe() + actionViewModel.observe() .subscribe { navigation -> when (navigation) { - is Navigation.Back -> onBackPressed() - is Navigation.CreateRoom -> addFragmentToBackstack(R.id.simpleFragmentContainer, CreateRoomFragment::class.java) - is Navigation.ChangeProtocol -> addFragmentToBackstack(R.id.simpleFragmentContainer, RoomDirectoryPickerFragment::class.java) - is Navigation.Close -> finish() + is RoomDirectoryAction.Back -> onBackPressed() + is RoomDirectoryAction.CreateRoom -> addFragmentToBackstack(R.id.simpleFragmentContainer, CreateRoomFragment::class.java) + is RoomDirectoryAction.ChangeProtocol -> addFragmentToBackstack(R.id.simpleFragmentContainer, RoomDirectoryPickerFragment::class.java) + is RoomDirectoryAction.Close -> finish() } } .disposeOnDestroy() diff --git a/vector/src/main/java/im/vector/riotx/features/roomdirectory/createroom/CreateRoomActivity.kt b/vector/src/main/java/im/vector/riotx/features/roomdirectory/createroom/CreateRoomActivity.kt index 6377f05d20..fb982babee 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomdirectory/createroom/CreateRoomActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomdirectory/createroom/CreateRoomActivity.kt @@ -27,7 +27,7 @@ import im.vector.riotx.core.extensions.addFragment import im.vector.riotx.core.platform.ToolbarConfigurable import im.vector.riotx.core.platform.VectorBaseActivity import im.vector.riotx.features.roomdirectory.RoomDirectoryActivity -import im.vector.riotx.features.roomdirectory.RoomDirectoryNavigationViewModel +import im.vector.riotx.features.roomdirectory.RoomDirectoryActionViewModel import javax.inject.Inject /** @@ -38,7 +38,7 @@ class CreateRoomActivity : VectorBaseActivity(), ToolbarConfigurable { @Inject lateinit var createRoomViewModelFactory: CreateRoomViewModel.Factory private val createRoomViewModel: CreateRoomViewModel by viewModel() - private lateinit var navigationViewModel: RoomDirectoryNavigationViewModel + private lateinit var actionViewModel: RoomDirectoryActionViewModel override fun getLayoutRes() = R.layout.activity_simple @@ -55,12 +55,12 @@ class CreateRoomActivity : VectorBaseActivity(), ToolbarConfigurable { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - navigationViewModel = ViewModelProviders.of(this, viewModelFactory).get(RoomDirectoryNavigationViewModel::class.java) - navigationViewModel.observe() + actionViewModel = ViewModelProviders.of(this, viewModelFactory).get(RoomDirectoryActionViewModel::class.java) + actionViewModel.observe() .subscribe { navigation -> when (navigation) { - is RoomDirectoryActivity.Navigation.Back, - is RoomDirectoryActivity.Navigation.Close -> finish() + is RoomDirectoryActivity.RoomDirectoryAction.Back, + is RoomDirectoryActivity.RoomDirectoryAction.Close -> finish() } } .disposeOnDestroy() diff --git a/vector/src/main/java/im/vector/riotx/features/roomdirectory/createroom/CreateRoomFragment.kt b/vector/src/main/java/im/vector/riotx/features/roomdirectory/createroom/CreateRoomFragment.kt index 88178eaad8..f33b3b003e 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomdirectory/createroom/CreateRoomFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomdirectory/createroom/CreateRoomFragment.kt @@ -26,14 +26,14 @@ import com.airbnb.mvrx.withState import im.vector.riotx.R import im.vector.riotx.core.platform.VectorBaseFragment import im.vector.riotx.features.roomdirectory.RoomDirectoryActivity -import im.vector.riotx.features.roomdirectory.RoomDirectoryNavigationViewModel +import im.vector.riotx.features.roomdirectory.RoomDirectoryActionViewModel import kotlinx.android.synthetic.main.fragment_create_room.* import timber.log.Timber import javax.inject.Inject class CreateRoomFragment @Inject constructor(private val createRoomController: CreateRoomController): VectorBaseFragment(), CreateRoomController.Listener { - private lateinit var navigationViewModel: RoomDirectoryNavigationViewModel + private lateinit var actionViewModel: RoomDirectoryActionViewModel private val viewModel: CreateRoomViewModel by activityViewModel() override fun getLayoutResId() = R.layout.fragment_create_room @@ -43,10 +43,10 @@ class CreateRoomFragment @Inject constructor(private val createRoomController: C override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) vectorBaseActivity.setSupportActionBar(createRoomToolbar) - navigationViewModel = ViewModelProviders.of(requireActivity()).get(RoomDirectoryNavigationViewModel::class.java) + actionViewModel = ViewModelProviders.of(requireActivity()).get(RoomDirectoryActionViewModel::class.java) setupRecyclerView() createRoomClose.setOnClickListener { - navigationViewModel.post(RoomDirectoryActivity.Navigation.Back) + actionViewModel.post(RoomDirectoryActivity.RoomDirectoryAction.Back) } } @@ -93,7 +93,7 @@ class CreateRoomFragment @Inject constructor(private val createRoomController: C // Navigate to freshly created room navigator.openRoom(requireActivity(), async()) - navigationViewModel.post(RoomDirectoryActivity.Navigation.Close) + actionViewModel.post(RoomDirectoryActivity.RoomDirectoryAction.Close) } else { // Populate list with Epoxy createRoomController.setData(state) diff --git a/vector/src/main/java/im/vector/riotx/features/roomdirectory/picker/RoomDirectoryPickerFragment.kt b/vector/src/main/java/im/vector/riotx/features/roomdirectory/picker/RoomDirectoryPickerFragment.kt index e345322613..a6aa668d5c 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomdirectory/picker/RoomDirectoryPickerFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomdirectory/picker/RoomDirectoryPickerFragment.kt @@ -27,8 +27,8 @@ import com.airbnb.mvrx.withState import im.vector.matrix.android.api.session.room.model.thirdparty.RoomDirectoryData import im.vector.riotx.R import im.vector.riotx.core.platform.VectorBaseFragment +import im.vector.riotx.features.roomdirectory.RoomDirectoryActionViewModel import im.vector.riotx.features.roomdirectory.RoomDirectoryActivity -import im.vector.riotx.features.roomdirectory.RoomDirectoryNavigationViewModel import im.vector.riotx.features.roomdirectory.RoomDirectoryViewModel import kotlinx.android.synthetic.main.fragment_room_directory_picker.* import timber.log.Timber @@ -41,7 +41,7 @@ class RoomDirectoryPickerFragment @Inject constructor(val roomDirectoryPickerVie ) : VectorBaseFragment(), RoomDirectoryPickerController.Callback { private val viewModel: RoomDirectoryViewModel by activityViewModel() - private lateinit var navigationViewModel: RoomDirectoryNavigationViewModel + private lateinit var actionViewModel: RoomDirectoryActionViewModel private val pickerViewModel: RoomDirectoryPickerViewModel by fragmentViewModel() override fun getLayoutResId() = R.layout.fragment_room_directory_picker @@ -71,7 +71,7 @@ class RoomDirectoryPickerFragment @Inject constructor(val roomDirectoryPickerVie override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - navigationViewModel = ViewModelProviders.of(requireActivity()).get(RoomDirectoryNavigationViewModel::class.java) + actionViewModel = ViewModelProviders.of(requireActivity()).get(RoomDirectoryActionViewModel::class.java) setupRecyclerView() } @@ -88,7 +88,7 @@ class RoomDirectoryPickerFragment @Inject constructor(val roomDirectoryPickerVie Timber.v("onRoomDirectoryClicked: $roomDirectoryData") viewModel.setRoomDirectoryData(roomDirectoryData) - navigationViewModel.post(RoomDirectoryActivity.Navigation.Back) + actionViewModel.post(RoomDirectoryActivity.RoomDirectoryAction.Back) } override fun retry() {