Refactor back button handling to get rid of deprecation warnings.

This commit is contained in:
casey langen 2022-07-23 16:41:38 -07:00
parent 5e576d5860
commit 1ea0e67785
6 changed files with 51 additions and 20 deletions

View File

@ -96,8 +96,9 @@ class TrackDownloadActivity: BaseActivity() {
cancel() cancel()
} }
override fun onBackPressed() { override fun onInterceptBackButton(): Boolean {
confirmCancelDialog() confirmCancelDialog()
return true
} }
private fun cancel() { private fun cancel() {

View File

@ -9,6 +9,7 @@ import android.view.KeyEvent
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
@ -29,7 +30,7 @@ import io.casey.musikcube.remote.ui.shared.mixin.RunnerMixin
import io.casey.musikcube.remote.ui.shared.mixin.ViewModelMixin import io.casey.musikcube.remote.ui.shared.mixin.ViewModelMixin
import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.CompositeDisposable
abstract class BaseActivity : AppCompatActivity(), ViewModel.Provider, Runner.TaskCallbacks { abstract class BaseActivity: AppCompatActivity(), ViewModel.Provider, Runner.TaskCallbacks {
protected var disposables = CompositeDisposable() protected var disposables = CompositeDisposable()
private set private set
@ -55,6 +56,7 @@ abstract class BaseActivity : AppCompatActivity(), ViewModel.Provider, Runner.Ta
prefs = getSharedPreferences(Prefs.NAME, Context.MODE_PRIVATE) prefs = getSharedPreferences(Prefs.NAME, Context.MODE_PRIVATE)
volumeControlStream = AudioManager.STREAM_MUSIC volumeControlStream = AudioManager.STREAM_MUSIC
mixins.onCreate(savedInstanceState ?: Bundle()) mixins.onCreate(savedInstanceState ?: Bundle())
onBackPressedDispatcher.addCallback(this, backHandler)
} }
override fun onStart() { override fun onStart() {
@ -97,19 +99,42 @@ abstract class BaseActivity : AppCompatActivity(), ViewModel.Provider, Runner.Ta
mixins.onDestroy() mixins.onDestroy()
} }
override fun onBackPressed() { override fun onNavigateUp(): Boolean {
if (!navigateBack()) {
finish()
}
return true
}
private fun navigateBack(): Boolean {
(top as? IBackHandler)?.let { (top as? IBackHandler)?.let {
if (it.onBackPressed()) { if (it.onInterceptBackButton()) {
return return true
} }
} }
when { if (onInterceptBackButton()) {
fm.backStackEntryCount > 1 -> fm.popBackStack() return true
else -> super.onBackPressed() }
if (fm.backStackEntryCount >= 1) {
fm.popBackStack()
return true
}
return false
}
private val backHandler = object: OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (!navigateBack()) {
finish()
}
} }
} }
protected open fun onInterceptBackButton(): Boolean = false
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
if (mixin(PlaybackMixin::class.java)?.onKeyDown(keyCode) == true) { if (mixin(PlaybackMixin::class.java)?.onKeyDown(keyCode) == true) {
return true return true

View File

@ -1,5 +1,5 @@
package io.casey.musikcube.remote.ui.shared.activity package io.casey.musikcube.remote.ui.shared.activity
interface IBackHandler { interface IBackHandler {
fun onBackPressed(): Boolean fun onInterceptBackButton(): Boolean
} }

View File

@ -19,6 +19,7 @@ import android.widget.CompoundButton
import android.widget.EditText import android.widget.EditText
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.content.res.AppCompatResources
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
@ -276,9 +277,9 @@ inline fun <reified T: BaseFragment> T.withTitleOverride(activity: AppCompatActi
fun BaseFragment.initToolbarIfNecessary(view: View, showFilter: Boolean = true) { fun BaseFragment.initToolbarIfNecessary(view: View, showFilter: Boolean = true) {
view.findViewById<Toolbar>(R.id.toolbar)?.let { view.findViewById<Toolbar>(R.id.toolbar)?.let {
it.navigationIcon = appCompatActivity.getDrawable(R.drawable.ic_back) it.navigationIcon = AppCompatResources.getDrawable(appCompatActivity, R.drawable.ic_back)
it.setNavigationOnClickListener { it.setNavigationOnClickListener {
appCompatActivity.onBackPressed() appCompatActivity.onNavigateUp()
} }
if (showFilter) { if (showFilter) {
this.addFilterAction(it.menu, this as? IFilterable) this.addFilterAction(it.menu, this as? IFilterable)

View File

@ -169,7 +169,7 @@ open class BaseFragment: Fragment(), ViewModel.Provider, IBackHandler {
} }
} }
override fun onBackPressed(): Boolean = override fun onInterceptBackButton(): Boolean =
toolbar?.collapseActionViewIfExpanded() ?: false toolbar?.collapseActionViewIfExpanded() ?: false
override fun <T: ViewModel<*>> createViewModel(): T? = null override fun <T: ViewModel<*>> createViewModel(): T? = null

View File

@ -6,6 +6,7 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
@ -45,14 +46,7 @@ class EditPlaylistActivity: BaseActivity() {
adapter = EditPlaylistAdapter(viewModel, touchHelper, prefs) adapter = EditPlaylistAdapter(viewModel, touchHelper, prefs)
setupDefaultRecyclerView(recycler, adapter) setupDefaultRecyclerView(recycler, adapter)
setResult(RESULT_CANCELED) setResult(RESULT_CANCELED)
} onBackPressedDispatcher.addCallback(this, backHandler)
override fun onBackPressed() {
if (viewModel.modified) {
ConfirmDiscardChangesDialog.show(this)
return
}
super.onBackPressed()
} }
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
@ -80,6 +74,16 @@ class EditPlaylistActivity: BaseActivity() {
)) ))
} }
private val backHandler = object: OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (viewModel.modified) {
ConfirmDiscardChangesDialog.show(this@EditPlaylistActivity)
return
}
finish()
}
}
override fun <T: ViewModel<*>> createViewModel(): T { override fun <T: ViewModel<*>> createViewModel(): T {
@Suppress("unchecked_cast") @Suppress("unchecked_cast")
return EditPlaylistViewModel(extras.getLong(EXTRA_PLAYLIST_ID, -1L)) as T return EditPlaylistViewModel(extras.getLong(EXTRA_PLAYLIST_ID, -1L)) as T