From be099dcae028dd1befcb725a4c933e95c9c52206 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 4 Jul 2022 17:10:12 +0200 Subject: [PATCH] Menu: extract management to a common interface / Migrate Activities --- .../app/core/platform/VectorBaseActivity.kt | 32 +++++----------- .../app/core/platform/VectorMenuProvider.kt | 37 +++++++++++++++++++ .../app/features/call/VectorCallActivity.kt | 8 +++- .../features/devtools/RoomDevToolActivity.kt | 8 +++- .../vector/app/features/home/HomeActivity.kt | 6 ++- .../features/rageshake/BugReportActivity.kt | 7 +++- .../reactions/EmojiReactionPickerActivity.kt | 9 ++++- 7 files changed, 75 insertions(+), 32 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/core/platform/VectorMenuProvider.kt diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt index 66081120cc..9bad0f8e90 100644 --- a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt +++ b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt @@ -31,7 +31,6 @@ import android.view.WindowManager import android.widget.TextView import androidx.annotation.CallSuper import androidx.annotation.MainThread -import androidx.annotation.MenuRes import androidx.annotation.StringRes import androidx.appcompat.app.AppCompatActivity import androidx.coordinatorlayout.widget.CoordinatorLayout @@ -90,6 +89,7 @@ import im.vector.app.features.themes.ThemeUtils import im.vector.app.receivers.DebugReceiver import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.failure.GlobalError import org.matrix.android.sdk.api.failure.InitialSyncRequestReason @@ -257,21 +257,23 @@ abstract class VectorBaseActivity : AppCompatActivity(), Maver private fun setupMenu() { // Always add a MenuProvider to handle the back action from the Toolbar + val vectorMenuProvider = this as? VectorMenuProvider addMenuProvider( object : MenuProvider { override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { - getMenuRes() - .takeIf { it != -1 } - ?.let { menuInflater.inflate(it, menu) } - handlePostCreateMenu(menu) + vectorMenuProvider?.let { + menuInflater.inflate(it.getMenuRes(), menu) + it.handlePostCreateMenu(menu) + } } override fun onPrepareMenu(menu: Menu) { - handlePrepareMenu(menu) + vectorMenuProvider?.handlePrepareMenu(menu) } override fun onMenuItemSelected(menuItem: MenuItem): Boolean { - return handleMenuItemSelected(menuItem) + return vectorMenuProvider?.handleMenuItemSelected(menuItem).orFalse() || + handleMenuItemHome(menuItem) } }, this, @@ -492,21 +494,7 @@ abstract class VectorBaseActivity : AppCompatActivity(), Maver } } - /* ========================================================================================== - * MENU MANAGEMENT - * ========================================================================================== */ - - @MenuRes - open fun getMenuRes() = -1 - - // No op by default - open fun handlePostCreateMenu(menu: Menu) = Unit - - // No op by default - open fun handlePrepareMenu(menu: Menu) = Unit - - @CallSuper - open fun handleMenuItemSelected(item: MenuItem): Boolean { + private fun handleMenuItemHome(item: MenuItem): Boolean { return when (item.itemId) { android.R.id.home -> { onBackPressed(true) diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorMenuProvider.kt b/vector/src/main/java/im/vector/app/core/platform/VectorMenuProvider.kt new file mode 100644 index 0000000000..c94a2fcdb0 --- /dev/null +++ b/vector/src/main/java/im/vector/app/core/platform/VectorMenuProvider.kt @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2022 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.core.platform + +import android.view.Menu +import android.view.MenuItem +import androidx.annotation.MenuRes + +/** + * Let your Activity of Fragment implement this interface if they provide a Menu + */ +interface VectorMenuProvider { + @MenuRes + fun getMenuRes(): Int + + // No op by default + fun handlePostCreateMenu(menu: Menu) = Unit + + // No op by default + fun handlePrepareMenu(menu: Menu) = Unit + + fun handleMenuItemSelected(item: MenuItem): Boolean +} diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt index 348983d431..2384e560ee 100644 --- a/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt +++ b/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt @@ -51,6 +51,7 @@ import im.vector.app.R import im.vector.app.core.extensions.registerStartForActivityResult import im.vector.app.core.extensions.setTextOrHide import im.vector.app.core.platform.VectorBaseActivity +import im.vector.app.core.platform.VectorMenuProvider import im.vector.app.core.utils.PERMISSIONS_FOR_AUDIO_IP_CALL import im.vector.app.core.utils.PERMISSIONS_FOR_VIDEO_IP_CALL import im.vector.app.core.utils.checkPermissions @@ -95,7 +96,10 @@ data class CallArgs( private val loggerTag = LoggerTag("VectorCallActivity", LoggerTag.VOIP) @AndroidEntryPoint -class VectorCallActivity : VectorBaseActivity(), CallControlsView.InteractionListener { +class VectorCallActivity : + VectorBaseActivity(), + CallControlsView.InteractionListener, + VectorMenuProvider { override fun getBinding() = ActivityCallBinding.inflate(layoutInflater) @@ -229,7 +233,7 @@ class VectorCallActivity : VectorBaseActivity(), CallContro onBackPressed() true } - else -> super.handleMenuItemSelected(item) + else -> false } } diff --git a/vector/src/main/java/im/vector/app/features/devtools/RoomDevToolActivity.kt b/vector/src/main/java/im/vector/app/features/devtools/RoomDevToolActivity.kt index 88499c7531..e848d0631f 100644 --- a/vector/src/main/java/im/vector/app/features/devtools/RoomDevToolActivity.kt +++ b/vector/src/main/java/im/vector/app/features/devtools/RoomDevToolActivity.kt @@ -36,6 +36,7 @@ import dagger.hilt.android.AndroidEntryPoint import im.vector.app.R import im.vector.app.core.extensions.replaceFragment import im.vector.app.core.platform.SimpleFragmentActivity +import im.vector.app.core.platform.VectorMenuProvider import im.vector.app.core.resources.ColorProvider import im.vector.app.core.utils.createJSonViewerStyleProvider import kotlinx.parcelize.Parcelize @@ -43,7 +44,10 @@ import org.billcarsonfr.jsonviewer.JSonViewerFragment import javax.inject.Inject @AndroidEntryPoint -class RoomDevToolActivity : SimpleFragmentActivity(), FragmentManager.OnBackStackChangedListener { +class RoomDevToolActivity : + SimpleFragmentActivity(), + FragmentManager.OnBackStackChangedListener, + VectorMenuProvider { @Inject lateinit var colorProvider: ColorProvider @@ -143,7 +147,7 @@ class RoomDevToolActivity : SimpleFragmentActivity(), FragmentManager.OnBackStac viewModel.handle(RoomDevToolAction.MenuItemSend) true } - else -> super.handleMenuItemSelected(item) + else -> false } } diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt index 82c9c78852..1c66cdda64 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt @@ -43,6 +43,7 @@ import im.vector.app.core.extensions.registerStartForActivityResult import im.vector.app.core.extensions.replaceFragment import im.vector.app.core.extensions.validateBackPressed import im.vector.app.core.platform.VectorBaseActivity +import im.vector.app.core.platform.VectorMenuProvider import im.vector.app.core.pushers.PushersManager import im.vector.app.core.pushers.UnifiedPushHelper import im.vector.app.databinding.ActivityHomeBinding @@ -103,7 +104,8 @@ class HomeActivity : VectorBaseActivity(), NavigationInterceptor, SpaceInviteBottomSheet.InteractionListener, - MatrixToBottomSheet.InteractionListener { + MatrixToBottomSheet.InteractionListener, + VectorMenuProvider { private lateinit var sharedActionViewModel: HomeSharedActionViewModel @@ -584,7 +586,7 @@ class HomeActivity : navigator.openSettings(this) true } - else -> super.handleMenuItemSelected(item) + else -> false } } diff --git a/vector/src/main/java/im/vector/app/features/rageshake/BugReportActivity.kt b/vector/src/main/java/im/vector/app/features/rageshake/BugReportActivity.kt index d78b9b21a5..c7f549c5cb 100755 --- a/vector/src/main/java/im/vector/app/features/rageshake/BugReportActivity.kt +++ b/vector/src/main/java/im/vector/app/features/rageshake/BugReportActivity.kt @@ -28,6 +28,7 @@ import com.airbnb.mvrx.withState import dagger.hilt.android.AndroidEntryPoint import im.vector.app.R import im.vector.app.core.platform.VectorBaseActivity +import im.vector.app.core.platform.VectorMenuProvider import im.vector.app.databinding.ActivityBugReportBinding import org.matrix.android.sdk.api.extensions.tryOrNull import timber.log.Timber @@ -36,7 +37,9 @@ import timber.log.Timber * Form to send a bug report. */ @AndroidEntryPoint -class BugReportActivity : VectorBaseActivity() { +class BugReportActivity : + VectorBaseActivity(), + VectorMenuProvider { override fun getBinding() = ActivityBugReportBinding.inflate(layoutInflater) @@ -139,7 +142,7 @@ class BugReportActivity : VectorBaseActivity() { } true } - else -> super.handleMenuItemSelected(item) + else -> false } } diff --git a/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt b/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt index 6a7914b6b5..f9be57b13f 100644 --- a/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt +++ b/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt @@ -32,6 +32,7 @@ import im.vector.app.EmojiCompatFontProvider import im.vector.app.R import im.vector.app.core.extensions.observeEvent import im.vector.app.core.platform.VectorBaseActivity +import im.vector.app.core.platform.VectorMenuProvider import im.vector.app.databinding.ActivityEmojiReactionPickerBinding import im.vector.app.features.reactions.data.EmojiDataSource import im.vector.lib.core.utils.flow.throttleFirst @@ -47,13 +48,17 @@ import javax.inject.Inject * TODO Finish Refactor to vector base activity */ @AndroidEntryPoint -class EmojiReactionPickerActivity : VectorBaseActivity(), - EmojiCompatFontProvider.FontProviderListener { +class EmojiReactionPickerActivity : + VectorBaseActivity(), + EmojiCompatFontProvider.FontProviderListener, + VectorMenuProvider { lateinit var viewModel: EmojiChooserViewModel override fun getMenuRes() = R.menu.menu_emoji_reaction_picker + override fun handleMenuItemSelected(item: MenuItem) = false + override fun getBinding() = ActivityEmojiReactionPickerBinding.inflate(layoutInflater) override fun getCoordinatorLayout() = views.coordinatorLayout