diff --git a/res/values/strings.xml b/res/values/strings.xml index 983aecfeaed..de733b8262f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1236,8 +1236,10 @@ Ways to unlock Same as device screen lock - + Choose a new lock for private space? + + You\’ll need to enter your device PIN, pattern, or password on the next screen Lock private space automatically @@ -1248,28 +1250,26 @@ After 5 minutes of inactivity Never - - Hide when locked - - Hide private space when locked + + Hide private space when it\'s locked - To stop other people knowing you have a private space on your device, you can hide it from your apps list + To stop other people knowing you have a private space on your device, you can hide it from your apps list - Access private space when hidden + Access private space when hidden - From your apps list, enter \"private space\" in the search bar + In the search bar, enter \"private space\" - Tap the private space tile + Tap Private space - Unlock your private space + Unlock your private space - Off + Off - On + On - Private space will hide when you lock it next + Private space will hide the next time you lock it - To access your space when it’s hidden, enter \“private space\” in the search bar on your apps list + To access private space, enter \“private space\” in the search bar from your apps list. Got it @@ -2860,7 +2860,7 @@ Bedtime mode settings - Even Dimmer + Even dimmer Allow device to go dimmer than usual @@ -10555,7 +10555,7 @@ Back Sensitivity - Gesture Navigation Sensitivity + Gesture Navigation Button navigation diff --git a/res/xml/private_space_hide_locked.xml b/res/xml/private_space_hide_locked.xml index cd1c406ac8f..4c83e842a0e 100644 --- a/res/xml/private_space_hide_locked.xml +++ b/res/xml/private_space_hide_locked.xml @@ -16,7 +16,7 @@ + android:title="@string/private_space_hide_page_title"> + android:title="@string/private_space_access_header"> diff --git a/res/xml/private_space_settings.xml b/res/xml/private_space_settings.xml index 86537cc3505..f9795990903 100644 --- a/res/xml/private_space_settings.xml +++ b/res/xml/private_space_settings.xml @@ -52,7 +52,7 @@ diff --git a/src/com/android/settings/accessibility/AccessibilityServiceWarning.java b/src/com/android/settings/accessibility/AccessibilityServiceWarning.java deleted file mode 100644 index fb50ef15cd6..00000000000 --- a/src/com/android/settings/accessibility/AccessibilityServiceWarning.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settings.accessibility; - -import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; - -import android.accessibilityservice.AccessibilityServiceInfo; -import android.app.Dialog; -import android.content.Context; -import android.content.DialogInterface; -import android.graphics.drawable.Drawable; -import android.text.BidiFormatter; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.Window; -import android.view.WindowManager; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; -import androidx.core.content.ContextCompat; - -import com.android.settings.R; - -import java.util.Locale; - -/** - * Utility class for creating the dialog that asks users for explicit permission for an - * accessibility service to access user data before the service is enabled - */ -public class AccessibilityServiceWarning { - private static final View.OnTouchListener filterTouchListener = (View v, MotionEvent event) -> { - // Filter obscured touches by consuming them. - if (((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0) - || ((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_PARTIALLY_OBSCURED) != 0)) { - if (event.getAction() == MotionEvent.ACTION_UP) { - Toast.makeText(v.getContext(), R.string.touch_filtered_warning, - Toast.LENGTH_SHORT).show(); - } - return true; - } - return false; - }; - - /** - * The interface to execute the uninstallation action. - */ - interface UninstallActionPerformer { - void uninstallPackage(); - } - - /** - * Returns a {@link Dialog} to be shown to confirm that they want to enable a service. - * @deprecated Use {@link com.android.internal.accessibility.dialog.AccessibilityServiceWarning} - */ - @Deprecated - public static Dialog createCapabilitiesDialog(@NonNull Context context, - @NonNull AccessibilityServiceInfo info, @NonNull View.OnClickListener listener, - @NonNull UninstallActionPerformer performer) { - final AlertDialog ad = new AlertDialog.Builder(context) - .setView(createEnableDialogContentView(context, info, listener, performer)) - .create(); - - Window window = ad.getWindow(); - WindowManager.LayoutParams params = window.getAttributes(); - params.privateFlags |= SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; - window.setAttributes(params); - ad.create(); - ad.setCanceledOnTouchOutside(true); - - return ad; - } - - private static View createEnableDialogContentView(Context context, - @NonNull AccessibilityServiceInfo info, View.OnClickListener listener, - UninstallActionPerformer performer) { - LayoutInflater inflater = (LayoutInflater) context.getSystemService( - Context.LAYOUT_INFLATER_SERVICE); - - View content = inflater.inflate(R.layout.enable_accessibility_service_dialog_content, - null); - - final Drawable icon; - if (info.getResolveInfo().getIconResource() == 0) { - icon = ContextCompat.getDrawable(context, R.drawable.ic_accessibility_generic); - } else { - icon = info.getResolveInfo().loadIcon(context.getPackageManager()); - } - - ImageView permissionDialogIcon = content.findViewById( - R.id.permissionDialog_icon); - permissionDialogIcon.setImageDrawable(icon); - - TextView permissionDialogTitle = content.findViewById(R.id.permissionDialog_title); - permissionDialogTitle.setText(context.getString(R.string.enable_service_title, - getServiceName(context, info))); - - Button permissionAllowButton = content.findViewById( - R.id.permission_enable_allow_button); - Button permissionDenyButton = content.findViewById( - R.id.permission_enable_deny_button); - permissionAllowButton.setOnClickListener(listener); - permissionAllowButton.setOnTouchListener(filterTouchListener); - permissionDenyButton.setOnClickListener(listener); - - final Button uninstallButton = content.findViewById( - R.id.permission_enable_uninstall_button); - // Shows an uninstall button to help users quickly remove the non-system App due to the - // required permissions. - if (!AccessibilityUtil.isSystemApp(info)) { - uninstallButton.setVisibility(View.VISIBLE); - uninstallButton.setOnClickListener(v -> performer.uninstallPackage()); - } - return content; - } - - /** Returns a {@link Dialog} to be shown to confirm that they want to disable a service. */ - public static Dialog createDisableDialog(Context context, - AccessibilityServiceInfo info, DialogInterface.OnClickListener listener) { - CharSequence serviceName = getServiceName(context, info); - - return new AlertDialog.Builder(context) - .setTitle(context.getString(R.string.disable_service_title, serviceName)) - .setCancelable(true) - .setPositiveButton(R.string.accessibility_dialog_button_stop, listener) - .setNegativeButton(R.string.accessibility_dialog_button_cancel, listener) - .create(); - } - - // Get the service name and bidi wrap it to protect from bidi side effects. - private static CharSequence getServiceName(Context context, AccessibilityServiceInfo info) { - final Locale locale = context.getResources().getConfiguration().getLocales().get(0); - final CharSequence label = - info.getResolveInfo().loadLabel(context.getPackageManager()); - return BidiFormatter.getInstance(locale).unicodeWrap(label); - } -} diff --git a/src/com/android/settings/accessibility/InvisibleToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/InvisibleToggleAccessibilityServicePreferenceFragment.java index 21ac9981a89..eb7b27d1767 100644 --- a/src/com/android/settings/accessibility/InvisibleToggleAccessibilityServicePreferenceFragment.java +++ b/src/com/android/settings/accessibility/InvisibleToggleAccessibilityServicePreferenceFragment.java @@ -18,9 +18,7 @@ package com.android.settings.accessibility; import android.accessibilityservice.AccessibilityServiceInfo; import android.content.DialogInterface; -import android.view.View; -import com.android.settings.R; import com.android.settingslib.accessibility.AccessibilityUtils; /** @@ -52,26 +50,9 @@ public class InvisibleToggleAccessibilityServicePreferenceFragment extends super.onToggleClicked(preference); boolean enabled = getArguments().getBoolean(AccessibilitySettings.EXTRA_CHECKED) && preference.isChecked(); - AccessibilityUtils.setAccessibilityServiceState(getContext(), mComponentName, enabled); } - /** - * {@inheritDoc} - * - * Enables accessibility service when user clicks permission allow button. - */ - @Override - void onDialogButtonFromShortcutToggleClicked(View view) { - super.onDialogButtonFromShortcutToggleClicked(view); - if (!android.view.accessibility.Flags.cleanupAccessibilityWarningDialog()) { - if (view.getId() == R.id.permission_enable_allow_button) { - AccessibilityUtils.setAccessibilityServiceState(getContext(), mComponentName, - true); - } - } - } - /** * {@inheritDoc} * @@ -80,9 +61,7 @@ public class InvisibleToggleAccessibilityServicePreferenceFragment extends @Override void onAllowButtonFromShortcutToggleClicked() { super.onAllowButtonFromShortcutToggleClicked(); - if (android.view.accessibility.Flags.cleanupAccessibilityWarningDialog()) { - AccessibilityUtils.setAccessibilityServiceState(getContext(), mComponentName, true); - } + AccessibilityUtils.setAccessibilityServiceState(getContext(), mComponentName, true); } /** diff --git a/src/com/android/settings/accessibility/ReduceBrightColorsPreferenceController.java b/src/com/android/settings/accessibility/ReduceBrightColorsPreferenceController.java index 7b40024ca54..3ca089ca08c 100644 --- a/src/com/android/settings/accessibility/ReduceBrightColorsPreferenceController.java +++ b/src/com/android/settings/accessibility/ReduceBrightColorsPreferenceController.java @@ -32,6 +32,7 @@ import android.text.TextUtils; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; +import com.android.server.display.feature.flags.Flags; import com.android.settings.R; import com.android.settingslib.PrimarySwitchPreference; import com.android.settingslib.core.lifecycle.LifecycleObserver; @@ -88,6 +89,15 @@ public class ReduceBrightColorsPreferenceController @Override public int getAvailabilityStatus() { + // Successor to this feature is Even Dimmer + // found in display/EvenDimmerPreferenceController + // Only allow RBC if even dimmer is not possible on this device + if (Flags.evenDimmer() && mContext.getResources().getBoolean( + com.android.internal.R.bool.config_evenDimmerEnabled)) { + return UNSUPPORTED_ON_DEVICE; + } + + return ColorDisplayManager.isReduceBrightColorsAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java index e89ff9473c5..72e1ad8eb93 100644 --- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java @@ -21,6 +21,7 @@ import static com.android.settings.accessibility.AccessibilityStatsLogUtils.logA import static com.android.settings.accessibility.PreferredShortcuts.retrieveUserShortcutType; import android.accessibilityservice.AccessibilityServiceInfo; +import android.app.AlertDialog; import android.app.Dialog; import android.app.settings.SettingsEnums; import android.content.BroadcastReceiver; @@ -35,6 +36,7 @@ import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Bundle; import android.os.SystemClock; +import android.text.BidiFormatter; import android.text.TextUtils; import android.util.Log; import android.view.Menu; @@ -52,6 +54,7 @@ import com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragm import com.android.settingslib.accessibility.AccessibilityUtils; import java.util.List; +import java.util.Locale; import java.util.concurrent.atomic.AtomicBoolean; /** Fragment for providing toggle bar and basic accessibility service setup. */ @@ -158,69 +161,63 @@ public class ToggleAccessibilityServicePreferenceFragment extends if (info == null) { return null; } - if (android.view.accessibility.Flags.cleanupAccessibilityWarningDialog()) { - mWarningDialog = - com.android.internal.accessibility.dialog.AccessibilityServiceWarning - .createAccessibilityServiceWarningDialog(getPrefContext(), info, - v -> onAllowButtonFromEnableToggleClicked(), - v -> onDenyButtonFromEnableToggleClicked(), - v -> onDialogButtonFromUninstallClicked()); - } else { - mWarningDialog = AccessibilityServiceWarning - .createCapabilitiesDialog(getPrefContext(), info, - this::onDialogButtonFromEnableToggleClicked, - this::onDialogButtonFromUninstallClicked); - } + mWarningDialog = + com.android.internal.accessibility.dialog.AccessibilityServiceWarning + .createAccessibilityServiceWarningDialog(getPrefContext(), info, + v -> onAllowButtonFromEnableToggleClicked(), + v -> onDenyButtonFromEnableToggleClicked(), + v -> onDialogButtonFromUninstallClicked()); return mWarningDialog; case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT_TOGGLE: if (info == null) { return null; } - if (android.view.accessibility.Flags.cleanupAccessibilityWarningDialog()) { - mWarningDialog = - com.android.internal.accessibility.dialog.AccessibilityServiceWarning - .createAccessibilityServiceWarningDialog(getPrefContext(), info, - v -> onAllowButtonFromShortcutToggleClicked(), - v -> onDenyButtonFromShortcutToggleClicked(), - v -> onDialogButtonFromUninstallClicked()); - } else { - mWarningDialog = AccessibilityServiceWarning - .createCapabilitiesDialog(getPrefContext(), info, - this::onDialogButtonFromShortcutToggleClicked, - this::onDialogButtonFromUninstallClicked); - } + mWarningDialog = + com.android.internal.accessibility.dialog.AccessibilityServiceWarning + .createAccessibilityServiceWarningDialog(getPrefContext(), info, + v -> onAllowButtonFromShortcutToggleClicked(), + v -> onDenyButtonFromShortcutToggleClicked(), + v -> onDialogButtonFromUninstallClicked()); return mWarningDialog; case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT: if (info == null) { return null; } - if (android.view.accessibility.Flags.cleanupAccessibilityWarningDialog()) { - mWarningDialog = - com.android.internal.accessibility.dialog.AccessibilityServiceWarning - .createAccessibilityServiceWarningDialog(getPrefContext(), info, - v -> onAllowButtonFromShortcutClicked(), - v -> onDenyButtonFromShortcutClicked(), - v -> onDialogButtonFromUninstallClicked()); - } else { - mWarningDialog = AccessibilityServiceWarning - .createCapabilitiesDialog(getPrefContext(), info, - this::onDialogButtonFromShortcutClicked, - this::onDialogButtonFromUninstallClicked); - } + mWarningDialog = + com.android.internal.accessibility.dialog.AccessibilityServiceWarning + .createAccessibilityServiceWarningDialog(getPrefContext(), info, + v -> onAllowButtonFromShortcutClicked(), + v -> onDenyButtonFromShortcutClicked(), + v -> onDialogButtonFromUninstallClicked()); return mWarningDialog; case DialogEnums.DISABLE_WARNING_FROM_TOGGLE: if (info == null) { return null; } - mWarningDialog = AccessibilityServiceWarning - .createDisableDialog(getPrefContext(), info, - this::onDialogButtonFromDisableToggleClicked); + mWarningDialog = createDisableDialog( + getPrefContext(), info, this::onDialogButtonFromDisableToggleClicked); return mWarningDialog; default: return super.onCreateDialog(dialogId); } } + /** Returns a {@link Dialog} to be shown to confirm that they want to disable a service. */ + private static Dialog createDisableDialog(Context context, + AccessibilityServiceInfo info, DialogInterface.OnClickListener listener) { + final Locale locale = context.getResources().getConfiguration().getLocales().get(0); + final CharSequence label = + info.getResolveInfo().loadLabel(context.getPackageManager()); + CharSequence serviceName = BidiFormatter.getInstance(locale).unicodeWrap(label); + + return new AlertDialog.Builder(context) + .setTitle(context.getString(R.string.disable_service_title, serviceName)) + .setCancelable(true) + .setPositiveButton(R.string.accessibility_dialog_button_stop, listener) + .setNegativeButton(R.string.accessibility_dialog_button_cancel, listener) + .create(); + } + @Override public int getDialogMetricsCategory(int dialogId) { switch (dialogId) { @@ -333,13 +330,9 @@ public class ToggleAccessibilityServicePreferenceFragment extends final int shortcutTypes = retrieveUserShortcutType(getPrefContext(), mComponentName.flattenToString(), getDefaultShortcutTypes()); if (preference.isChecked()) { - final boolean isWarningRequired; - if (android.view.accessibility.Flags.cleanupAccessibilityWarningDialog()) { - isWarningRequired = getPrefContext().getSystemService(AccessibilityManager.class) - .isAccessibilityServiceWarningRequired(getAccessibilityServiceInfo()); - } else { - isWarningRequired = !mToggleServiceSwitchPreference.isChecked(); - } + final boolean isWarningRequired = + getPrefContext().getSystemService(AccessibilityManager.class) + .isAccessibilityServiceWarningRequired(getAccessibilityServiceInfo()); if (isWarningRequired) { preference.setChecked(false); showPopupDialog(DialogEnums.ENABLE_WARNING_FROM_SHORTCUT_TOGGLE); @@ -355,15 +348,9 @@ public class ToggleAccessibilityServicePreferenceFragment extends @Override public void onSettingsClicked(ShortcutPreference preference) { - final boolean isWarningRequired; - if (android.view.accessibility.Flags.cleanupAccessibilityWarningDialog()) { - isWarningRequired = getPrefContext().getSystemService(AccessibilityManager.class) - .isAccessibilityServiceWarningRequired(getAccessibilityServiceInfo()); - } else { - isWarningRequired = !(mShortcutPreference.isChecked() - || mToggleServiceSwitchPreference.isChecked()); - } - + final boolean isWarningRequired = + getPrefContext().getSystemService(AccessibilityManager.class) + .isAccessibilityServiceWarningRequired(getAccessibilityServiceInfo()); if (isWarningRequired) { showPopupDialog(DialogEnums.ENABLE_WARNING_FROM_SHORTCUT); } else { @@ -537,17 +524,6 @@ public class ToggleAccessibilityServicePreferenceFragment extends mWarningDialog.dismiss(); } - void onDialogButtonFromShortcutClicked(View view) { - final int viewId = view.getId(); - if (viewId == R.id.permission_enable_allow_button) { - onAllowButtonFromShortcutClicked(); - } else if (viewId == R.id.permission_enable_deny_button) { - onDenyButtonFromShortcutClicked(); - } else { - throw new IllegalArgumentException("Unexpected view id"); - } - } - private void onAllowButtonFromShortcutClicked() { mIsDialogShown.set(false); if (Flags.editShortcutsInFullScreen()) { @@ -576,13 +552,9 @@ public class ToggleAccessibilityServicePreferenceFragment extends mToggleServiceSwitchPreference.setChecked(false); getArguments().putBoolean(AccessibilitySettings.EXTRA_CHECKED, /* disableService */ false); - final boolean isWarningRequired; - if (android.view.accessibility.Flags.cleanupAccessibilityWarningDialog()) { - isWarningRequired = getPrefContext().getSystemService(AccessibilityManager.class) - .isAccessibilityServiceWarningRequired(getAccessibilityServiceInfo()); - } else { - isWarningRequired = !mShortcutPreference.isChecked(); - } + final boolean isWarningRequired = + getPrefContext().getSystemService(AccessibilityManager.class) + .isAccessibilityServiceWarningRequired(getAccessibilityServiceInfo()); if (isWarningRequired) { showPopupDialog(DialogEnums.ENABLE_WARNING_FROM_TOGGLE); } else { diff --git a/src/com/android/settings/core/PreferenceControllerListHelper.java b/src/com/android/settings/core/PreferenceControllerListHelper.java index f37140eaaf6..dea8c971c49 100644 --- a/src/com/android/settings/core/PreferenceControllerListHelper.java +++ b/src/com/android/settings/core/PreferenceControllerListHelper.java @@ -27,6 +27,8 @@ import android.text.TextUtils; import android.util.Log; import androidx.annotation.NonNull; +import androidx.preference.PreferenceManager; +import androidx.preference.PreferenceScreen; import com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag; import com.android.settingslib.core.AbstractPreferenceController; @@ -93,6 +95,25 @@ public class PreferenceControllerListHelper { return controllers; } + /** + * Checks if the given PreferenceScreen will be empty due to all preferences being unavailable. + * + * @param xmlResId resource id of the PreferenceScreen to check + * @return {@code true} if none of the preferences in the given screen will appear + */ + public static boolean areAllPreferencesUnavailable(@NonNull Context context, + @NonNull PreferenceManager preferenceManager, @XmlRes int xmlResId) { + PreferenceScreen screen = preferenceManager.inflateFromResource(context, xmlResId, + /* rootPreferences= */ null); + List preferenceControllers = + getPreferenceControllersFromXml(context, xmlResId); + if (screen.getPreferenceCount() != preferenceControllers.size()) { + // There are some preferences without controllers, which will show regardless. + return false; + } + return preferenceControllers.stream().noneMatch(BasePreferenceController::isAvailable); + } + /** * Return a sub list of {@link AbstractPreferenceController} to only contain controller that * doesn't exist in filter. diff --git a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java index c38be949760..9f76fad8d94 100644 --- a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java +++ b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java @@ -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 preferenceControllers = PreferenceControllerListHelper + .getPreferenceControllersFromXml(getContext(), getPreferenceScreenResId()); + preferenceControllers.forEach(controller -> { + controller.updateState(findPreference(controller.getPreferenceKey())); + controller.displayPreference(screen); + }); final List 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()) diff --git a/src/com/android/settings/privatespace/HidePrivateSpaceSummaryController.java b/src/com/android/settings/privatespace/HidePrivateSpaceSummaryController.java index a366b709422..f5100a7b2ab 100644 --- a/src/com/android/settings/privatespace/HidePrivateSpaceSummaryController.java +++ b/src/com/android/settings/privatespace/HidePrivateSpaceSummaryController.java @@ -49,8 +49,8 @@ public final class HidePrivateSpaceSummaryController extends BasePreferenceContr @Override public CharSequence getSummary() { - return isHidden() ? mContext.getString(R.string.privatespace_hide_on_summary) - : mContext.getString(R.string.privatespace_hide_off_summary); + return isHidden() ? mContext.getString(R.string.private_space_hide_on_summary) + : mContext.getString(R.string.private_space_hide_off_summary); } private boolean isHidden() { diff --git a/src/com/android/settings/privatespace/onelock/UseOneLockControllerSwitch.java b/src/com/android/settings/privatespace/onelock/UseOneLockControllerSwitch.java index 680f5c7de0e..dfac100a522 100644 --- a/src/com/android/settings/privatespace/onelock/UseOneLockControllerSwitch.java +++ b/src/com/android/settings/privatespace/onelock/UseOneLockControllerSwitch.java @@ -192,7 +192,8 @@ public class UseOneLockControllerSwitch extends AbstractPreferenceController return; } new AlertDialog.Builder(mContext) - .setMessage(R.string.private_space_new_lock_title) + .setTitle(R.string.private_space_new_lock_title) + .setMessage(R.string.private_space_new_lock_message) .setPositiveButton( R.string.private_space_set_lock_label, (dialog, which) -> { diff --git a/tests/robotests/res/xml-mcc997/location_settings.xml b/tests/robotests/res/xml-mcc997/location_settings.xml new file mode 100644 index 00000000000..d417d189354 --- /dev/null +++ b/tests/robotests/res/xml-mcc997/location_settings.xml @@ -0,0 +1,36 @@ + + + + + + + + + + \ No newline at end of file diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java index ae4f9a0ec9c..9be03e8d249 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java @@ -237,7 +237,6 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG) public void enableService_warningRequired_showWarning() throws Throwable { setupServiceWarningRequired(true); mFragment.mToggleServiceSwitchPreference = @@ -250,7 +249,6 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG) public void enableService_warningNotRequired_dontShowWarning() throws Throwable { final AccessibilityServiceInfo info = setupServiceWarningRequired(false); mFragment.mToggleServiceSwitchPreference = @@ -264,7 +262,6 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG) public void toggleShortcutPreference_warningRequired_showWarning() throws Throwable { setupServiceWarningRequired(true); mFragment.mShortcutPreference = new ShortcutPreference(mContext, /* attrs= */null); @@ -278,7 +275,6 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG) public void toggleShortcutPreference_warningNotRequired_dontShowWarning() throws Throwable { setupServiceWarningRequired(false); mFragment.mShortcutPreference = new ShortcutPreference(mContext, /* attrs= */null); @@ -292,7 +288,6 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG) public void clickShortcutSettingsPreference_warningRequired_showWarning() throws Throwable { setupServiceWarningRequired(true); mFragment.mShortcutPreference = new ShortcutPreference(mContext, /* attrs= */null); @@ -304,7 +299,6 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG) @DisableFlags( com.android.settings.accessibility.Flags.FLAG_EDIT_SHORTCUTS_IN_FULL_SCREEN) public void clickShortcutSettingsPreference_warningNotRequired_dontShowWarning_showDialog() @@ -319,8 +313,7 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags({Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG, - com.android.settings.accessibility.Flags.FLAG_EDIT_SHORTCUTS_IN_FULL_SCREEN}) + @EnableFlags(com.android.settings.accessibility.Flags.FLAG_EDIT_SHORTCUTS_IN_FULL_SCREEN) public void clickShortcutSettingsPreference_warningNotRequired_dontShowWarning_launchActivity() throws Throwable { setupServiceWarningRequired(false); @@ -365,7 +358,7 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags({Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG, Flags.FLAG_A11Y_QS_SHORTCUT}) + @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void toggleShortcutPreference_noUserPreferredShortcut_hasQsTile_enableQsShortcut() throws Throwable { PreferredShortcuts.clearPreferredShortcuts(mContext); @@ -383,7 +376,7 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags({Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG, Flags.FLAG_A11Y_QS_SHORTCUT}) + @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void toggleShortcutPreference_noUserPreferredShortcut_noQsTile_enableSoftwareShortcut() throws Throwable { PreferredShortcuts.clearPreferredShortcuts(mContext); @@ -401,7 +394,6 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG) @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void toggleShortcutPreference_noUserPreferredShortcut_hasQsTile_flagOff_enableSoftwareShortcut() throws Throwable { @@ -420,7 +412,6 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags(Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG) @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void toggleShortcutPreference_noUserPreferredShortcut_noQsTile_flagOff_enableSoftwareShortcut() throws Throwable { @@ -439,7 +430,7 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags({Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG, Flags.FLAG_A11Y_QS_SHORTCUT}) + @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void toggleShortcutPreference_userPreferVolumeKeysShortcut_noQsTile_enableVolumeKeysShortcut() throws Throwable { setupServiceWarningRequired(false); @@ -462,7 +453,7 @@ public class ToggleAccessibilityServicePreferenceFragmentTest { } @Test - @EnableFlags({Flags.FLAG_CLEANUP_ACCESSIBILITY_WARNING_DIALOG, Flags.FLAG_A11Y_QS_SHORTCUT}) + @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT) public void toggleShortcutPreference_userPreferVolumeKeysShortcut_hasQsTile_enableVolumeKeysShortcut() throws Throwable { setupServiceWarningRequired(false); diff --git a/tests/robotests/src/com/android/settings/core/PreferenceControllerListHelperTest.java b/tests/robotests/src/com/android/settings/core/PreferenceControllerListHelperTest.java index 68dfb7952ce..0cc38574cab 100644 --- a/tests/robotests/src/com/android/settings/core/PreferenceControllerListHelperTest.java +++ b/tests/robotests/src/com/android/settings/core/PreferenceControllerListHelperTest.java @@ -20,6 +20,8 @@ import static com.google.common.truth.Truth.assertThat; import android.content.Context; +import androidx.preference.PreferenceManager; + import com.android.settings.R; import com.android.settings.slices.FakePreferenceController; import com.android.settingslib.core.AbstractPreferenceController; @@ -38,10 +40,12 @@ import java.util.List; public class PreferenceControllerListHelperTest { private Context mContext; + private PreferenceManager mPreferenceManager; @Before public void setUp() { mContext = RuntimeEnvironment.application; + mPreferenceManager = new PreferenceManager(mContext); } @Test @@ -68,6 +72,30 @@ public class PreferenceControllerListHelperTest { assertThat(controllers.get(0)).isInstanceOf(FakePreferenceController.class); } + @Test + @Config(qualifiers = "mcc999") + public void areAllPreferencesUnavailable_allAvailable() { + // All preferences have controllers indicating they are available. + assertThat(PreferenceControllerListHelper.areAllPreferencesUnavailable(mContext, + mPreferenceManager, R.xml.location_settings)).isFalse(); + } + + @Test + @Config(qualifiers = "mcc997") + public void areAllPreferencesUnavailable_allUnavailable() { + // All preferences have controllers indicating they are unavailable. (note the qualifier) + assertThat(PreferenceControllerListHelper.areAllPreferencesUnavailable(mContext, + mPreferenceManager, R.xml.location_settings)).isTrue(); + } + + @Test + @Config(qualifiers = "mcc999") + public void areAllPreferencesUnavailable_noControllersShouldAssumeAvailable() { + // None of the preferences have controllers, so they are assumed available. + assertThat(PreferenceControllerListHelper.areAllPreferencesUnavailable(mContext, + mPreferenceManager, R.xml.display_settings)).isFalse(); + } + @Test public void filterControllers_noFilter_shouldReturnSameList() { final List controllers = new ArrayList<>(); diff --git a/tests/robotests/src/com/android/settings/core/UnavailablePreferenceController.java b/tests/robotests/src/com/android/settings/core/UnavailablePreferenceController.java new file mode 100644 index 00000000000..bf6e7e2cb3f --- /dev/null +++ b/tests/robotests/src/com/android/settings/core/UnavailablePreferenceController.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.core; + +import android.content.Context; + +public class UnavailablePreferenceController extends BasePreferenceController { + + public UnavailablePreferenceController(Context context, String preferenceKey) { + super(context, preferenceKey); + } + + @Override + public int getAvailabilityStatus() { + return UNSUPPORTED_ON_DEVICE; + } + +}