diff --git a/Android.bp b/Android.bp index 25fc8f56519..8b903ba91be 100644 --- a/Android.bp +++ b/Android.bp @@ -111,7 +111,10 @@ android_library { "keyboard_flags_lib", ], - plugins: ["androidx.room_room-compiler-plugin"], + plugins: [ + "SettingsLibMetadata-processor", + "androidx.room_room-compiler-plugin", + ], errorprone: { extra_check_modules: ["//external/nullaway:nullaway_plugin"], diff --git a/src/com/android/settings/SettingsApplication.java b/src/com/android/settings/SettingsApplication.java index d208fdf09e1..7e008e43667 100644 --- a/src/com/android/settings/SettingsApplication.java +++ b/src/com/android/settings/SettingsApplication.java @@ -16,6 +16,8 @@ package com.android.settings; +import static com.android.settingslib.flags.Flags.settingsCatalyst; + import android.app.Application; import android.content.Context; import android.content.pm.PackageManager; @@ -42,13 +44,20 @@ import com.android.settings.overlay.FeatureFactoryImpl; import com.android.settings.spa.SettingsSpaEnvironment; import com.android.settingslib.applications.AppIconCacheManager; import com.android.settingslib.datastore.BackupRestoreStorageManager; +import com.android.settingslib.metadata.PreferenceScreenMetadata; +import com.android.settingslib.metadata.PreferenceScreenRegistry; +import com.android.settingslib.metadata.ProvidePreferenceScreenOptions; import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory; import com.google.android.setupcompat.util.WizardManagerHelper; import java.lang.ref.WeakReference; +import java.util.List; /** Settings application which sets up activity embedding rules for the large screen device. */ +@ProvidePreferenceScreenOptions( + codegenCollector = "com.android.settings/PreferenceScreenCollector/get" +) public class SettingsApplication extends Application { private WeakReference mHomeActivity = new WeakReference<>(null); @@ -64,6 +73,11 @@ public class SettingsApplication extends Application { public void onCreate() { super.onCreate(); + if (settingsCatalyst()) { + PreferenceScreenRegistry.INSTANCE.setPreferenceScreensSupplier( + this::getPreferenceScreens); + } + BackupRestoreStorageManager.getInstance(this) .add( new BatterySettingsStorage(this), @@ -90,6 +104,13 @@ public class SettingsApplication extends Application { registerActivityLifecycleCallbacks(new DeveloperOptionsActivityLifecycle()); } + /** Returns the screens using metadata. */ + protected List getPreferenceScreens() { + // PreferenceScreenCollector is generated by annotation processor from classes annotated + // with @ProvidePreferenceScreen + return PreferenceScreenCollector.get(this); + } + @Override public void onTerminate() { BackupRestoreStorageManager.getInstance(this).removeAll(); diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java index 0808da1b4a8..09dd1dd480d 100644 --- a/src/com/android/settings/dashboard/DashboardFragment.java +++ b/src/com/android/settings/dashboard/DashboardFragment.java @@ -15,6 +15,8 @@ */ package com.android.settings.dashboard; +import static com.android.settingslib.flags.Flags.settingsCatalyst; + import android.app.Activity; import android.app.settings.SettingsEnums; import android.content.ContentResolver; @@ -53,6 +55,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.metadata.PreferenceScreenRegistry; import com.android.settingslib.search.Indexable; import java.util.ArrayList; @@ -97,30 +100,35 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment R.array.config_suppress_injected_tile_keys)); mDashboardFeatureProvider = FeatureFactory.getFeatureFactory().getDashboardFeatureProvider(); - // Load preference controllers from code - final List controllersFromCode = - createPreferenceControllers(context); - // Load preference controllers from xml definition - final List controllersFromXml = PreferenceControllerListHelper - .getPreferenceControllersFromXml(context, getPreferenceScreenResId()); - // Filter xml-based controllers in case a similar controller is created from code already. - final List uniqueControllerFromXml = - PreferenceControllerListHelper.filterControllers( - controllersFromXml, controllersFromCode); - // Add unique controllers to list. - if (controllersFromCode != null) { - mControllers.addAll(controllersFromCode); - } - mControllers.addAll(uniqueControllerFromXml); + if (!usePreferenceScreenMetadata() || PreferenceScreenRegistry.INSTANCE.get( + getPreferenceScreenBindingKey(context)) == null) { + // Load preference controllers from code + final List controllersFromCode = + createPreferenceControllers(context); + // Load preference controllers from xml definition + final List controllersFromXml = PreferenceControllerListHelper + .getPreferenceControllersFromXml(context, getPreferenceScreenResId()); + // Filter xml-based controllers in case a similar controller is created from code + // already. + final List uniqueControllerFromXml = + PreferenceControllerListHelper.filterControllers( + controllersFromXml, controllersFromCode); - // And wire up with lifecycle. - final Lifecycle lifecycle = getSettingsLifecycle(); - uniqueControllerFromXml.forEach(controller -> { - if (controller instanceof LifecycleObserver) { - lifecycle.addObserver((LifecycleObserver) controller); + // Add unique controllers to list. + if (controllersFromCode != null) { + mControllers.addAll(controllersFromCode); } - }); + mControllers.addAll(uniqueControllerFromXml); + + // And wire up with lifecycle. + final Lifecycle lifecycle = getSettingsLifecycle(); + uniqueControllerFromXml.forEach(controller -> { + if (controller instanceof LifecycleObserver) { + lifecycle.addObserver((LifecycleObserver) controller); + } + }); + } // Set metrics category for BasePreferenceController. final int metricCategory = getMetricsCategory(); @@ -272,6 +280,11 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment } } + @Override + protected final int getPreferenceScreenResId(@NonNull Context context) { + return getPreferenceScreenResId(); + } + @Override protected abstract int getPreferenceScreenResId(); @@ -364,12 +377,32 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment if (resId <= 0) { return; } - addPreferencesFromResource(resId); - final PreferenceScreen screen = getPreferenceScreen(); + PreferenceScreen screen; + if (usePreferenceScreenMetadata()) { + screen = createPreferenceScreen(); + setPreferenceScreen(screen); + requireActivity().setTitle(screen.getTitle()); + } else { + addPreferencesFromResource(resId); + screen = getPreferenceScreen(); + } screen.setOnExpandButtonClickListener(this); displayResourceTilesToScreen(screen); } + @Override + protected final boolean usePreferenceScreenMetadata() { + return settingsCatalyst() && enableCatalyst(); + } + + /** + * Returns if settings catalyst should be enabled (e.g. check trunk stable flag) on current + * screen. + */ + protected boolean enableCatalyst() { + return false; + } + /** * Perform {@link AbstractPreferenceController#displayPreference(PreferenceScreen)} * on all {@link AbstractPreferenceController}s.