[Catalyst] Support hybrid mode
Bug: 332202168 Flag: com.android.settings.flags.catalyst Test: Manual Change-Id: Ib3607a91345bb0d94cd0d63cf7f9434c5603dd91
This commit is contained in:
@@ -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<AbstractPreferenceController> 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<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. */
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user