Allows for system navigation settings to be added dynamically.

This allows for controller-backed preferences to be added or
overridden via xml.

Similarly, if the controllers cause all of the preferences for
2 or 3 button nav to be unavailable, we hide the settings button.

Bug: 324036308
Test: Manual and unit tests
Flag: NA
Change-Id: I2371f3173076172489966728ac69c8767570cd56
This commit is contained in:
Andy Wickham
2024-03-08 03:26:35 +00:00
parent 3042a3f02b
commit 07109c158a
6 changed files with 133 additions and 5 deletions

View File

@@ -43,6 +43,8 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityGestureNavigationTutorial;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.PreferenceControllerListHelper;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
@@ -147,14 +149,20 @@ public class SystemNavigationGestureSettings extends RadioButtonPickerFragment i
final PreferenceScreen screen = getPreferenceScreen();
screen.removeAll();
screen.addPreference(mVideoPreference);
addPreferencesFromResource(getPreferenceScreenResId());
final List<BasePreferenceController> preferenceControllers = PreferenceControllerListHelper
.getPreferenceControllersFromXml(getContext(), getPreferenceScreenResId());
preferenceControllers.forEach(controller -> {
controller.updateState(findPreference(controller.getPreferenceKey()));
controller.displayPreference(screen);
});
final List<? extends CandidateInfo> candidateList = getCandidates();
if (candidateList == null) {
return;
}
for (CandidateInfo info : candidateList) {
SelectorWithWidgetPreference pref =
new SelectorWithWidgetPreference(getPrefContext());
SelectorWithWidgetPreference pref = new SelectorWithWidgetPreference(getPrefContext());
bindPreference(pref, info.getKey(), info, defaultKey);
bindPreferenceExtra(pref, info.getKey(), info, defaultKey, systemDefaultKey);
screen.addPreference(pref);
@@ -176,8 +184,11 @@ public class SystemNavigationGestureSettings extends RadioButtonPickerFragment i
GestureNavigationSettingsFragment.GESTURE_NAVIGATION_SETTINGS)));
}
if (KEY_SYSTEM_NAV_2BUTTONS.equals(info.getKey()) || KEY_SYSTEM_NAV_3BUTTONS.equals(
info.getKey())) {
if ((KEY_SYSTEM_NAV_2BUTTONS.equals(info.getKey())
|| KEY_SYSTEM_NAV_3BUTTONS.equals(info.getKey()))
// Don't add the settings button if that page will be blank.
&& !PreferenceControllerListHelper.areAllPreferencesUnavailable(
getContext(), getPreferenceManager(), R.xml.button_navigation_settings)) {
pref.setExtraWidgetOnClickListener((v) ->
new SubSettingLauncher(getContext())
.setDestination(ButtonNavigationSettingsFragment.class.getName())