diff --git a/app/src/main/java/org/tasks/injection/InjectingPreferenceFragment.kt b/app/src/main/java/org/tasks/injection/InjectingPreferenceFragment.kt index 4adff2ca4..5101ba7a0 100644 --- a/app/src/main/java/org/tasks/injection/InjectingPreferenceFragment.kt +++ b/app/src/main/java/org/tasks/injection/InjectingPreferenceFragment.kt @@ -74,6 +74,8 @@ abstract class InjectingPreferenceFragment : PreferenceFragmentCompat() { } } + open fun getMenu() = R.menu.menu_preferences + protected fun recreate() { activity!!.recreate() } diff --git a/app/src/main/java/org/tasks/preferences/BasePreferences.kt b/app/src/main/java/org/tasks/preferences/BasePreferences.kt index 23ec1642d..4a6cdce5f 100644 --- a/app/src/main/java/org/tasks/preferences/BasePreferences.kt +++ b/app/src/main/java/org/tasks/preferences/BasePreferences.kt @@ -1,21 +1,26 @@ package org.tasks.preferences +import android.content.Intent import android.os.Bundle +import android.view.MenuItem import androidx.appcompat.widget.Toolbar import androidx.core.content.ContextCompat +import androidx.fragment.app.Fragment import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import org.tasks.R import org.tasks.databinding.ActivityPreferencesBinding +import org.tasks.injection.InjectingPreferenceFragment import org.tasks.injection.ThemedInjectingAppCompatActivity import org.tasks.ui.MenuColorizer private const val EXTRA_TITLE = "extra_title" abstract class BasePreferences : ThemedInjectingAppCompatActivity(), - PreferenceFragmentCompat.OnPreferenceStartFragmentCallback { + PreferenceFragmentCompat.OnPreferenceStartFragmentCallback, Toolbar.OnMenuItemClickListener { lateinit var toolbar: Toolbar + var menu: Int = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -23,13 +28,16 @@ abstract class BasePreferences : ThemedInjectingAppCompatActivity(), setContentView(binding.root) toolbar = binding.toolbar.toolbar if (savedInstanceState == null) { + val rootPreference = getRootPreference() supportFragmentManager .beginTransaction() - .replace(R.id.settings, getRootPreference()) + .replace(R.id.settings, rootPreference) .commit() toolbar.title = getString(getRootTitle()) + setupMenu(rootPreference) } else { toolbar.title = savedInstanceState.getCharSequence(EXTRA_TITLE) + setupMenu() } supportFragmentManager.addOnBackStackChangedListener { if (supportFragmentManager.backStackEntryCount == 0) { @@ -37,28 +45,37 @@ abstract class BasePreferences : ThemedInjectingAppCompatActivity(), } } toolbar.navigationIcon = - ContextCompat.getDrawable(this, R.drawable.ic_outline_arrow_back_24px); + ContextCompat.getDrawable(this, R.drawable.ic_outline_arrow_back_24px) toolbar.setNavigationOnClickListener { onBackPressed() } - setupMenu() + toolbar.setOnMenuItemClickListener(this) MenuColorizer.colorToolbar(this, toolbar) } - open fun setupMenu() {} + private fun setupMenu() = setupMenu(supportFragmentManager.findFragmentById(R.id.settings)) + + private fun setupMenu(fragment: Fragment?) { + this.menu = if (fragment is InjectingPreferenceFragment) fragment.getMenu() else 0 + toolbar.menu.clear() + if (menu > 0) { + toolbar.inflateMenu(menu) + } + } abstract fun getRootTitle(): Int - abstract fun getRootPreference(): PreferenceFragmentCompat + abstract fun getRootPreference(): InjectingPreferenceFragment override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putCharSequence(EXTRA_TITLE, toolbar.title) } - override fun onSupportNavigateUp(): Boolean { + override fun onBackPressed() { if (supportFragmentManager.popBackStackImmediate()) { - return true + setupMenu() + } else { + super.onBackPressed() } - return super.onSupportNavigateUp() } override fun onPreferenceStartFragment( @@ -78,6 +95,16 @@ abstract class BasePreferences : ThemedInjectingAppCompatActivity(), .addToBackStack(null) .commit() toolbar.title = pref.title + setupMenu(fragment) return true } + + override fun onMenuItemClick(item: MenuItem?): Boolean { + return if (item?.itemId == R.id.menu_help_and_feedback) { + startActivity(Intent(this, HelpAndFeedback::class.java)) + true + } else { + false + } + } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/preferences/MainPreferences.kt b/app/src/main/java/org/tasks/preferences/MainPreferences.kt index 191e19e52..120854108 100644 --- a/app/src/main/java/org/tasks/preferences/MainPreferences.kt +++ b/app/src/main/java/org/tasks/preferences/MainPreferences.kt @@ -1,18 +1,10 @@ package org.tasks.preferences -import android.content.Intent -import android.view.MenuItem -import androidx.appcompat.widget.Toolbar import org.tasks.R import org.tasks.injection.ActivityComponent import org.tasks.preferences.fragments.MainSettingsFragment -class MainPreferences : BasePreferences(), Toolbar.OnMenuItemClickListener { - - override fun setupMenu() { - toolbar.inflateMenu(R.menu.menu_preferences) - toolbar.setOnMenuItemClickListener(this) - } +class MainPreferences : BasePreferences() { override fun getRootTitle() = R.string.TLA_menu_settings @@ -21,13 +13,4 @@ class MainPreferences : BasePreferences(), Toolbar.OnMenuItemClickListener { override fun inject(component: ActivityComponent) { component.inject(this) } - - override fun onMenuItemClick(item: MenuItem?): Boolean { - return if (item?.itemId == R.id.menu_help_and_feedback) { - startActivity(Intent(this, HelpAndFeedback::class.java)) - true - } else { - false - } - } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/preferences/fragments/HelpAndFeedback.kt b/app/src/main/java/org/tasks/preferences/fragments/HelpAndFeedback.kt index dcfe16995..4d6c154ff 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/HelpAndFeedback.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/HelpAndFeedback.kt @@ -68,4 +68,6 @@ class HelpAndFeedback : InjectingPreferenceFragment() { override fun inject(component: FragmentComponent) { component.inject(this); } + + override fun getMenu() = 0 } \ No newline at end of file