[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.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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user