Merge changes from topic "catalyst" into main

* changes:
  [Catalyst] Support hybrid mode screen test
  [Catalyst] Support hybrid mode
diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt
index debaf3e..d501f4f 100644
--- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt
+++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt
@@ -41,6 +41,9 @@
         createPreferenceScreen(PreferenceScreenFactory(this))
 
     override fun createPreferenceScreen(factory: PreferenceScreenFactory): PreferenceScreen? {
+        preferenceScreenBindingHelper?.close()
+        preferenceScreenBindingHelper = null
+
         val context = factory.context
         fun createPreferenceScreenFromResource() =
             factory.inflate(getPreferenceScreenResId(context))?.also {
@@ -86,9 +89,13 @@
 
     override fun onDestroy() {
         preferenceScreenBindingHelper?.close()
+        preferenceScreenBindingHelper = null
         super.onDestroy()
     }
 
+    protected fun getPreferenceKeysInHierarchy(): Set<String> =
+        preferenceScreenBindingHelper?.getPreferences()?.map { it.key }?.toSet() ?: setOf()
+
     companion object {
         private const val TAG = "PreferenceFragment"
     }
diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt
index 3610894..95b921b 100644
--- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt
+++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt
@@ -45,7 +45,7 @@
     context: Context,
     private val preferenceBindingFactory: PreferenceBindingFactory,
     private val preferenceScreen: PreferenceScreen,
-    preferenceHierarchy: PreferenceHierarchy,
+    private val preferenceHierarchy: PreferenceHierarchy,
 ) : KeyedDataObservable<String>(), AutoCloseable {
 
     private val handler = Handler(Looper.getMainLooper())
@@ -133,6 +133,8 @@
         }
     }
 
+    fun getPreferences() = preferenceHierarchy.getAllPreferences()
+
     override fun close() {
         removeObserver(preferenceObserver)
         val context = preferenceScreen.context
diff --git a/packages/SettingsLib/Preference/testutils/com/android/settingslib/preference/CatalystScreenTestCase.kt b/packages/SettingsLib/Preference/testutils/com/android/settingslib/preference/CatalystScreenTestCase.kt
index 4d5f85f..e27838c 100644
--- a/packages/SettingsLib/Preference/testutils/com/android/settingslib/preference/CatalystScreenTestCase.kt
+++ b/packages/SettingsLib/Preference/testutils/com/android/settingslib/preference/CatalystScreenTestCase.kt
@@ -49,15 +49,15 @@
      * catalyst screen (flag is enabled).
      */
     @Test
-    fun migration() {
+    open fun migration() {
         enableCatalystScreen()
         assertThat(preferenceScreenCreator.isFlagEnabled(context)).isTrue()
-        val catalystScreen = stringifyPreferenceScreen()
+        val catalystScreen = dumpPreferenceScreen()
         Log.i("Catalyst", catalystScreen)
 
         disableCatalystScreen()
         assertThat(preferenceScreenCreator.isFlagEnabled(context)).isFalse()
-        val legacyScreen = stringifyPreferenceScreen()
+        val legacyScreen = dumpPreferenceScreen()
 
         assertThat(catalystScreen).isEqualTo(legacyScreen)
     }
@@ -82,7 +82,7 @@
         setFlagsRule.disableFlags(flagName)
     }
 
-    private fun stringifyPreferenceScreen(): String {
+    private fun dumpPreferenceScreen(): String {
         @Suppress("UNCHECKED_CAST")
         val clazz = preferenceScreenCreator.fragmentClass() as Class<PreferenceFragmentCompat>
         val builder = StringBuilder()