[Catalyst] Support hybrid mode

Bug: 332202168
Flag: com.android.settings.flags.catalyst
Test: Manual
Change-Id: Ib3607a91345bb0d94cd0d63cf7f9434c5603dd91
This commit is contained in:
Jacky Wang
2024-10-12 16:09:15 +08:00
parent fdc8eb3e00
commit 20558e21bd

View File

@@ -53,6 +53,7 @@ import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.Tile;
import com.android.settingslib.preference.PreferenceScreenCreator;
import com.android.settingslib.search.Indexable; import com.android.settingslib.search.Indexable;
import java.util.ArrayList; import java.util.ArrayList;
@@ -60,6 +61,7 @@ import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@@ -98,7 +100,8 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
mDashboardFeatureProvider = mDashboardFeatureProvider =
FeatureFactory.getFeatureFactory().getDashboardFeatureProvider(); FeatureFactory.getFeatureFactory().getDashboardFeatureProvider();
if (!isCatalystEnabled()) { PreferenceScreenCreator preferenceScreenCreator = getPreferenceScreenCreator();
if (preferenceScreenCreator == null || !preferenceScreenCreator.hasCompleteHierarchy()) {
// Load preference controllers from code // Load preference controllers from code
final List<AbstractPreferenceController> controllersFromCode = final List<AbstractPreferenceController> controllersFromCode =
createPreferenceControllers(context); createPreferenceControllers(context);
@@ -383,8 +386,12 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
return; return;
} }
PreferenceScreen screen; PreferenceScreen screen;
if (isCatalystEnabled()) { PreferenceScreenCreator preferenceScreenCreator = getPreferenceScreenCreator();
if (preferenceScreenCreator != null) {
screen = createPreferenceScreen(); screen = createPreferenceScreen();
if (!preferenceScreenCreator.hasCompleteHierarchy()) {
removeControllersForHybridMode();
}
setPreferenceScreen(screen); setPreferenceScreen(screen);
requireActivity().setTitle(screen.getTitle()); requireActivity().setTitle(screen.getTitle());
} else { } else {
@@ -395,13 +402,42 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
displayResourceTilesToScreen(screen); 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<String> keys = getPreferenceKeysInHierarchy();
Iterator<AbstractPreferenceController> 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<AbstractPreferenceController> controllers = mPreferenceControllers.get(
controller.getClass());
if (controllers != null) {
controllers.remove(controller);
}
}
}
}
/** Returns if catalyst is enabled on current screen. */ /** Returns if catalyst is enabled on current screen. */
protected final boolean isCatalystEnabled() { protected final boolean isCatalystEnabled() {
return getPreferenceScreenCreator() != null;
}
private @Nullable PreferenceScreenCreator getPreferenceScreenCreator() {
if (!Flags.catalyst()) { if (!Flags.catalyst()) {
return false; return null;
} }
Context context = getContext(); Context context = getContext();
return context != null ? getPreferenceScreenCreator(context) != null : false; return context != null ? getPreferenceScreenCreator(context) : null;
} }
/** /**