diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java index 4d53772cf66..92e99cf12f9 100644 --- a/src/com/android/settings/dashboard/DashboardFragment.java +++ b/src/com/android/settings/dashboard/DashboardFragment.java @@ -53,6 +53,7 @@ import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.Tile; +import com.android.settingslib.preference.PreferenceScreenCreator; import com.android.settingslib.search.Indexable; import java.util.ArrayList; @@ -60,6 +61,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; @@ -98,7 +100,8 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment mDashboardFeatureProvider = FeatureFactory.getFeatureFactory().getDashboardFeatureProvider(); - if (!isCatalystEnabled()) { + PreferenceScreenCreator preferenceScreenCreator = getPreferenceScreenCreator(); + if (preferenceScreenCreator == null || !preferenceScreenCreator.hasCompleteHierarchy()) { // Load preference controllers from code final List controllersFromCode = createPreferenceControllers(context); @@ -383,8 +386,12 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment return; } PreferenceScreen screen; - if (isCatalystEnabled()) { + PreferenceScreenCreator preferenceScreenCreator = getPreferenceScreenCreator(); + if (preferenceScreenCreator != null) { screen = createPreferenceScreen(); + if (!preferenceScreenCreator.hasCompleteHierarchy()) { + removeControllersForHybridMode(); + } setPreferenceScreen(screen); requireActivity().setTitle(screen.getTitle()); } else { @@ -395,13 +402,42 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment displayResourceTilesToScreen(screen); } + /** + * Removes preference controllers that have been migrated to catalyst. + * + * In hybrid mode, preference screen is inflated from XML resource, while preference metadata + * in the preference hierarchy are used to update preference widget UI. To avoid conflict, + * remove the preference controllers. + */ + private void removeControllersForHybridMode() { + Set keys = getPreferenceKeysInHierarchy(); + Iterator iterator = mControllers.iterator(); + while (iterator.hasNext()) { + AbstractPreferenceController controller = iterator.next(); + String key = controller.getPreferenceKey(); + if (keys.contains(key)) { + Log.i(TAG, "Remove preference controller for " + key); + iterator.remove(); + List controllers = mPreferenceControllers.get( + controller.getClass()); + if (controllers != null) { + controllers.remove(controller); + } + } + } + } + /** Returns if catalyst is enabled on current screen. */ protected final boolean isCatalystEnabled() { + return getPreferenceScreenCreator() != null; + } + + private @Nullable PreferenceScreenCreator getPreferenceScreenCreator() { if (!Flags.catalyst()) { - return false; + return null; } Context context = getContext(); - return context != null ? getPreferenceScreenCreator(context) != null : false; + return context != null ? getPreferenceScreenCreator(context) : null; } /**