Menu: extract management to a common interface / Migrate Activities

This commit is contained in:
Benoit Marty 2022-07-04 17:10:12 +02:00
parent f7a0615105
commit be099dcae0
7 changed files with 75 additions and 32 deletions

View File

@ -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<VB : ViewBinding> : 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<VB : ViewBinding> : 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)

View File

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

View File

@ -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<ActivityCallBinding>(), CallControlsView.InteractionListener {
class VectorCallActivity :
VectorBaseActivity<ActivityCallBinding>(),
CallControlsView.InteractionListener,
VectorMenuProvider {
override fun getBinding() = ActivityCallBinding.inflate(layoutInflater)
@ -229,7 +233,7 @@ class VectorCallActivity : VectorBaseActivity<ActivityCallBinding>(), CallContro
onBackPressed()
true
}
else -> super.handleMenuItemSelected(item)
else -> false
}
}

View File

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

View File

@ -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<ActivityHomeBinding>(),
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
}
}

View File

@ -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<ActivityBugReportBinding>() {
class BugReportActivity :
VectorBaseActivity<ActivityBugReportBinding>(),
VectorMenuProvider {
override fun getBinding() = ActivityBugReportBinding.inflate(layoutInflater)
@ -139,7 +142,7 @@ class BugReportActivity : VectorBaseActivity<ActivityBugReportBinding>() {
}
true
}
else -> super.handleMenuItemSelected(item)
else -> false
}
}

View File

@ -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<ActivityEmojiReactionPickerBinding>(),
EmojiCompatFontProvider.FontProviderListener {
class EmojiReactionPickerActivity :
VectorBaseActivity<ActivityEmojiReactionPickerBinding>(),
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