Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit da58ce35 authored by Jacky Wang's avatar Jacky Wang
Browse files

[Catalyst] Keep activity title in sync with PreferenceFragment

Fix: 390135885
Flag: com.android.settings.flags.catalyst
Test: manual
Change-Id: I5b2636050e20e19a865473edc5e3a3e7ad8e12b7
parent a72d49ad
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -45,7 +45,7 @@ interface PreferenceScreenBinding : PreferenceBinding {
                    context.getString(screenTitle)
                    context.getString(screenTitle)
                } else {
                } else {
                    screenMetadata.getScreenTitle(context)
                    screenMetadata.getScreenTitle(context)
                        ?: (this as? PreferenceTitleProvider)?.getTitle(context)
                        ?: (screenMetadata as? PreferenceTitleProvider)?.getTitle(context)
                }
                }
        }
        }
    }
    }
+16 −0
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@ import android.content.Intent
import android.os.Bundle
import android.os.Bundle
import android.util.Log
import android.util.Log
import androidx.annotation.XmlRes
import androidx.annotation.XmlRes
import androidx.lifecycle.Lifecycle
import androidx.preference.PreferenceScreen
import androidx.preference.PreferenceScreen
import com.android.settingslib.metadata.EXTRA_BINDING_SCREEN_KEY
import com.android.settingslib.metadata.EXTRA_BINDING_SCREEN_KEY
import com.android.settingslib.metadata.PreferenceScreenBindingKeyProvider
import com.android.settingslib.metadata.PreferenceScreenBindingKeyProvider
@@ -38,6 +39,11 @@ open class PreferenceFragment :
        preferenceScreen = createPreferenceScreen()
        preferenceScreen = createPreferenceScreen()
    }
    }


    override fun setPreferenceScreen(preferenceScreen: PreferenceScreen?) {
        super.setPreferenceScreen(preferenceScreen)
        updateActivityTitle()
    }

    fun createPreferenceScreen(): PreferenceScreen? =
    fun createPreferenceScreen(): PreferenceScreen? =
        createPreferenceScreen(PreferenceScreenFactory(this))
        createPreferenceScreen(PreferenceScreenFactory(this))


@@ -102,9 +108,19 @@ open class PreferenceFragment :


    override fun onResume() {
    override fun onResume() {
        super.onResume()
        super.onResume()
        // Even when activity has several fragments with preference screen, this will keep activity
        // title in sync when fragment manager pops back stack.
        updateActivityTitle()
        preferenceScreenBindingHelper?.onResume()
        preferenceScreenBindingHelper?.onResume()
    }
    }


    internal fun updateActivityTitle() {
        if (!lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) return
        val activity = activity ?: return
        val title = preferenceScreen?.title ?: return
        if (activity.title != title) activity.title = title
    }

    override fun onPause() {
    override fun onPause() {
        preferenceScreenBindingHelper?.onPause()
        preferenceScreenBindingHelper?.onPause()
        super.onPause()
        super.onPause()
+4 −2
Original line number Original line Diff line number Diff line
@@ -52,7 +52,7 @@ import com.google.common.collect.ImmutableMultimap
 */
 */
class PreferenceScreenBindingHelper(
class PreferenceScreenBindingHelper(
    context: Context,
    context: Context,
    fragment: PreferenceFragment,
    private val fragment: PreferenceFragment,
    private val preferenceBindingFactory: PreferenceBindingFactory,
    private val preferenceBindingFactory: PreferenceBindingFactory,
    private val preferenceScreen: PreferenceScreen,
    private val preferenceScreen: PreferenceScreen,
    private val preferenceHierarchy: PreferenceHierarchy,
    private val preferenceHierarchy: PreferenceHierarchy,
@@ -156,7 +156,9 @@ class PreferenceScreenBindingHelper(


        // bind preference to update UI
        // bind preference to update UI
        preferenceScreen.findPreference<Preference>(key)?.let {
        preferenceScreen.findPreference<Preference>(key)?.let {
            preferences[key]?.let { node -> preferenceBindingFactory.bind(it, node) }
            val node = preferences[key] ?: return@let
            preferenceBindingFactory.bind(it, node)
            if (it == preferenceScreen) fragment.updateActivityTitle()
        }
        }


        // check reason to avoid potential infinite loop
        // check reason to avoid potential infinite loop