diff --git a/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceController.java index bd46152066a..60c7c877c5d 100644 --- a/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceController.java +++ b/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceController.java @@ -49,9 +49,14 @@ public class AccessibilityButtonFooterPreferenceController extends public void displayPreference(PreferenceScreen screen) { // Need to update footerPreference's data before super.displayPreference(), then it will use // data to update related property of footerPreference. - final int titleResource = AccessibilityUtil.isGestureNavigateEnabled(mContext) - ? R.string.accessibility_button_gesture_description - : R.string.accessibility_button_description; + final int titleResource; + if (android.provider.Flags.a11yStandaloneGestureEnabled()) { + titleResource = R.string.accessibility_button_description; + } else { + titleResource = AccessibilityUtil.isGestureNavigateEnabled(mContext) + ? R.string.accessibility_button_gesture_description + : R.string.accessibility_button_description; + } final CharSequence footerText = Html.fromHtml( MessageFormat.format(mContext.getString(titleResource), 1, 2, 3), Html.FROM_HTML_MODE_COMPACT); diff --git a/src/com/android/settings/accessibility/AccessibilityButtonPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityButtonPreferenceController.java index 53d9c55fad9..68a765c9230 100644 --- a/src/com/android/settings/accessibility/AccessibilityButtonPreferenceController.java +++ b/src/com/android/settings/accessibility/AccessibilityButtonPreferenceController.java @@ -61,7 +61,12 @@ public class AccessibilityButtonPreferenceController extends BasePreferenceContr } private int getPreferenceTitleResource() { - return AccessibilityUtil.isGestureNavigateEnabled(mContext) - ? R.string.accessibility_button_gesture_title : R.string.accessibility_button_title; + if (android.provider.Flags.a11yStandaloneGestureEnabled()) { + return R.string.accessibility_button_title; + } else { + return AccessibilityUtil.isGestureNavigateEnabled(mContext) + ? R.string.accessibility_button_gesture_title + : R.string.accessibility_button_title; + } } } diff --git a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java index e92c86b32b0..91d75f34631 100644 --- a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java +++ b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java @@ -17,10 +17,8 @@ package com.android.settings.accessibility; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.DEFAULT; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.QUICK_SETTINGS; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; import static com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums; +import static com.android.settings.accessibility.AccessibilityUtil.getShortcutSummaryList; import static com.android.settings.accessibility.ToggleFeaturePreferenceFragment.KEY_GENERAL_CATEGORY; import static com.android.settings.accessibility.ToggleFeaturePreferenceFragment.KEY_SAVED_QS_TOOLTIP_TYPE; @@ -30,7 +28,6 @@ import android.app.settings.SettingsEnums; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; -import android.icu.text.CaseMap; import android.os.Bundle; import android.os.Handler; import android.provider.Settings; @@ -46,18 +43,15 @@ import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.internal.accessibility.common.ShortcutConstants; -import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType; import com.android.settings.R; import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragment; import com.android.settings.dashboard.RestrictedDashboardFragment; -import com.android.settings.utils.LocaleUtils; import com.google.android.setupcompat.util.WizardManagerHelper; import java.util.ArrayList; import java.util.List; -import java.util.Locale; /** * Base class for accessibility fragments shortcut functions and dialog management. @@ -340,37 +334,7 @@ public abstract class AccessibilityShortcutPreferenceFragment extends Restricted } final int shortcutTypes = getUserPreferredShortcutTypes(); - - // LINT.IfChange(shortcut_type_ui_order) - final List list = new ArrayList<>(); - if (android.view.accessibility.Flags.a11yQsShortcut()) { - if (hasShortcutType(shortcutTypes, QUICK_SETTINGS)) { - final CharSequence qsTitle = context.getText( - R.string.accessibility_feature_shortcut_setting_summary_quick_settings); - list.add(qsTitle); - } - } - if (hasShortcutType(shortcutTypes, SOFTWARE)) { - list.add(getSoftwareShortcutTypeSummary(context)); - } - if (hasShortcutType(shortcutTypes, HARDWARE)) { - final CharSequence hardwareTitle = context.getText( - R.string.accessibility_shortcut_hardware_keyword); - list.add(hardwareTitle); - } - // LINT.ThenChange(/res/xml/accessibility_edit_shortcuts.xml:shortcut_type_ui_order) - - // Show software shortcut if first time to use. - if (list.isEmpty()) { - list.add(getSoftwareShortcutTypeSummary(context)); - } - - return CaseMap.toTitle().wholeString().noLowercase().apply(Locale.getDefault(), /* iter= */ - null, LocaleUtils.getConcatenatedString(list)); - } - - private boolean hasShortcutType(int value, @UserShortcutType int type) { - return (value & type) == type; + return getShortcutSummaryList(context, shortcutTypes); } protected void updateShortcutPreferenceData() { diff --git a/src/com/android/settings/accessibility/AccessibilityShortcutsTutorial.java b/src/com/android/settings/accessibility/AccessibilityShortcutsTutorial.java index 8d908acc1b5..de3cb8a7b46 100644 --- a/src/com/android/settings/accessibility/AccessibilityShortcutsTutorial.java +++ b/src/com/android/settings/accessibility/AccessibilityShortcutsTutorial.java @@ -16,15 +16,19 @@ package com.android.settings.accessibility; +import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU; +import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_GESTURE; import static android.view.View.GONE; import static android.view.View.VISIBLE; +import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.GESTURE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.QUICK_SETTINGS; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.TRIPLETAP; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.TWOFINGER_DOUBLETAP; +import android.annotation.SuppressLint; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.DialogInterface; @@ -60,7 +64,9 @@ import androidx.core.widget.TextViewCompat; import androidx.viewpager.widget.PagerAdapter; import androidx.viewpager.widget.ViewPager; -import com.android.server.accessibility.Flags; +import com.android.internal.accessibility.common.ShortcutConstants; +import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType; +import com.android.internal.accessibility.util.ShortcutUtils; import com.android.settings.R; import com.android.settings.core.SubSettingLauncher; import com.android.settingslib.utils.StringUtil; @@ -396,95 +402,84 @@ public final class AccessibilityShortcutsTutorial { return textView; } - private static TutorialPage createSoftwareTutorialPage(@NonNull Context context) { - final int type = SOFTWARE; - final CharSequence title = getSoftwareTitle(context); - final View image = createSoftwareImage(context); - final CharSequence instruction = getSoftwareInstruction(context); - final ImageView indicatorIcon = - createImageView(context, R.drawable.ic_accessibility_page_indicator); - indicatorIcon.setEnabled(false); - - return new TutorialPage(type, title, image, indicatorIcon, instruction); + @SuppressLint("SwitchIntDef") + private static CharSequence getShortcutTitle( + @NonNull Context context, @UserShortcutType int shortcutType, int buttonMode) { + return switch (shortcutType) { + case HARDWARE -> context.getText(R.string.accessibility_tutorial_dialog_title_volume); + case SOFTWARE -> getSoftwareTitle(context, buttonMode); + case GESTURE -> context.getText(R.string.accessibility_tutorial_dialog_title_gesture); + case TRIPLETAP -> context.getText(R.string.accessibility_tutorial_dialog_title_triple); + case TWOFINGER_DOUBLETAP -> context.getString( + R.string.accessibility_tutorial_dialog_title_two_finger_double, 2); + case QUICK_SETTINGS -> context.getText( + R.string.accessibility_tutorial_dialog_title_quick_setting); + default -> ""; + }; } - private static TutorialPage createHardwareTutorialPage(@NonNull Context context) { - final int type = HARDWARE; - final CharSequence title = - context.getText(R.string.accessibility_tutorial_dialog_title_volume); - final View image = - createIllustrationView(context, R.drawable.accessibility_shortcut_type_volume_keys); - final ImageView indicatorIcon = - createImageView(context, R.drawable.ic_accessibility_page_indicator); - final CharSequence instruction = - context.getText(R.string.accessibility_tutorial_dialog_message_volume); - indicatorIcon.setEnabled(false); - - return new TutorialPage(type, title, image, indicatorIcon, instruction); - } - - private static TutorialPage createTripleTapTutorialPage(@NonNull Context context) { - final int type = TRIPLETAP; - final CharSequence title = - context.getText(R.string.accessibility_tutorial_dialog_title_triple); - final View image = - createIllustrationViewWithImageRawResource(context, - R.raw.accessibility_shortcut_type_tripletap); - final CharSequence instruction = context.getString( - R.string.accessibility_tutorial_dialog_tripletap_instruction, 3); - final ImageView indicatorIcon = - createImageView(context, R.drawable.ic_accessibility_page_indicator); - indicatorIcon.setEnabled(false); - - return new TutorialPage(type, title, image, indicatorIcon, instruction); - } - - private static TutorialPage createTwoFingerTripleTapTutorialPage(@NonNull Context context) { - final int type = TWOFINGER_DOUBLETAP; - final int numFingers = 2; - final CharSequence title = context.getString( - R.string.accessibility_tutorial_dialog_title_two_finger_double, numFingers); - final View image = - createIllustrationViewWithImageRawResource(context, - R.raw.accessibility_shortcut_type_2finger_doubletap); - final CharSequence instruction = context.getString( - R.string.accessibility_tutorial_dialog_twofinger_doubletap_instruction, numFingers); - final ImageView indicatorIcon = - createImageView(context, R.drawable.ic_accessibility_page_indicator); - indicatorIcon.setEnabled(false); - - return new TutorialPage(type, title, image, indicatorIcon, instruction); - } - - private static TutorialPage createQuickSettingsTutorialPage( - @NonNull Context context, @NonNull CharSequence featureName, boolean inSetupWizard) { - final int type = QUICK_SETTINGS; - final CharSequence title = - context.getText(R.string.accessibility_tutorial_dialog_title_quick_setting); - final View image = - createIllustrationView(context, + @SuppressLint("SwitchIntDef") + private static View getShortcutImage( + @NonNull Context context, @UserShortcutType int shortcutType, int buttonMode) { + return switch (shortcutType) { + case HARDWARE -> createIllustrationView( + context, R.drawable.accessibility_shortcut_type_volume_keys); + case SOFTWARE -> createSoftwareImage(context, buttonMode); + case GESTURE -> createIllustrationView(context, + AccessibilityUtil.isTouchExploreEnabled(context) + ? R.drawable.accessibility_shortcut_type_gesture_touch_explore_on + : R.drawable.accessibility_shortcut_type_gesture); + case TRIPLETAP -> createIllustrationViewWithImageRawResource(context, + R.raw.accessibility_shortcut_type_tripletap); + case TWOFINGER_DOUBLETAP -> createIllustrationViewWithImageRawResource(context, + R.raw.accessibility_shortcut_type_2finger_doubletap); + case QUICK_SETTINGS -> { + View v = createIllustrationView(context, R.drawable.accessibility_shortcut_type_quick_settings); - // Remove the unneeded background, since the main image already includes a background - image.findViewById(R.id.image_background).setVisibility(GONE); - final int numFingers = AccessibilityUtil.isTouchExploreEnabled(context) ? 2 : 1; - Map arguments = new ArrayMap<>(); - arguments.put("count", numFingers); - arguments.put("featureName", featureName); - final CharSequence instruction = StringUtil.getIcuPluralsString(context, - arguments, - R.string.accessibility_tutorial_dialog_message_quick_setting); - final SpannableStringBuilder tutorialText = new SpannableStringBuilder(); - if (inSetupWizard) { - tutorialText.append(context.getText( - R.string.accessibility_tutorial_dialog_shortcut_unavailable_in_suw)) - .append("\n\n"); - } - tutorialText.append(instruction); + View bg = v.findViewById(R.id.image_background); + if (bg != null) { + bg.setVisibility(GONE); + } + yield v; + } + default -> new View(context); + }; + } + + private static CharSequence getShortcutInstruction( + @NonNull Context context, @UserShortcutType int shortcutType, int buttonMode, + @NonNull CharSequence featureName, boolean inSetupWizard) { + return switch (shortcutType) { + case HARDWARE -> context.getText(R.string.accessibility_tutorial_dialog_message_volume); + case SOFTWARE -> getSoftwareInstruction(context, buttonMode); + case GESTURE -> StringUtil.getIcuPluralsString( + context, + AccessibilityUtil.isTouchExploreEnabled(context) ? 3 : 2, + R.string.accessibility_tutorial_dialog_gesture_shortcut_instruction); + case TRIPLETAP -> context.getString( + R.string.accessibility_tutorial_dialog_tripletap_instruction, 3); + case TWOFINGER_DOUBLETAP -> context.getString( + R.string.accessibility_tutorial_dialog_twofinger_doubletap_instruction, 2); + case QUICK_SETTINGS -> getQuickSettingsInstruction(context, featureName, inSetupWizard); + default -> ""; + }; + } + + @SuppressLint("SwitchIntDef") + private static TutorialPage createShortcutTutorialPage( + @NonNull Context context, @UserShortcutType int shortcutType, int buttonMode, + @NonNull CharSequence featureName, boolean inSetupWizard) { + final ImageView indicatorIcon = createImageView(context, R.drawable.ic_accessibility_page_indicator); indicatorIcon.setEnabled(false); - return new TutorialPage(type, title, image, indicatorIcon, tutorialText); + return new TutorialPage(shortcutType, + getShortcutTitle(context, shortcutType, buttonMode), + getShortcutImage(context, shortcutType, buttonMode), + createImageView(context, R.drawable.ic_accessibility_page_indicator), + getShortcutInstruction( + context, shortcutType, buttonMode, featureName, inSetupWizard)); } /** @@ -497,79 +492,58 @@ public final class AccessibilityShortcutsTutorial { boolean inSetupWizard) { // LINT.IfChange(shortcut_type_ui_order) final List tutorialPages = new ArrayList<>(); - if (android.view.accessibility.Flags.a11yQsShortcut()) { - if ((shortcutTypes & QUICK_SETTINGS) - == QUICK_SETTINGS) { - tutorialPages.add( - createQuickSettingsTutorialPage(context, featureName, inSetupWizard)); + int buttonMode = ShortcutUtils.getButtonMode(context, context.getUserId()); + + for (int shortcutType: ShortcutConstants.USER_SHORTCUT_TYPES) { + if ((shortcutTypes & shortcutType) == 0) { + continue; } - } - if ((shortcutTypes & SOFTWARE) == SOFTWARE) { - tutorialPages.add(createSoftwareTutorialPage(context)); - } - - if ((shortcutTypes & HARDWARE) == HARDWARE) { - tutorialPages.add(createHardwareTutorialPage(context)); - } - - if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) { - if ((shortcutTypes & TWOFINGER_DOUBLETAP) - == TWOFINGER_DOUBLETAP) { - tutorialPages.add(createTwoFingerTripleTapTutorialPage(context)); + if ((shortcutTypes & QUICK_SETTINGS) == QUICK_SETTINGS + && !android.view.accessibility.Flags.a11yQsShortcut()) { + continue; } - } - - if ((shortcutTypes & TRIPLETAP) == TRIPLETAP) { - tutorialPages.add(createTripleTapTutorialPage(context)); + tutorialPages.add( + createShortcutTutorialPage( + context, shortcutType, buttonMode, featureName, inSetupWizard)); } // LINT.ThenChange(/res/xml/accessibility_edit_shortcuts.xml:shortcut_type_ui_order) return tutorialPages; } - private static View createSoftwareImage(Context context) { - int resId; - if (AccessibilityUtil.isFloatingMenuEnabled(context)) { - return createIllustrationViewWithImageRawResource( - context, R.raw.accessibility_shortcut_type_fab); - } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) { - resId = AccessibilityUtil.isTouchExploreEnabled(context) - ? R.drawable.accessibility_shortcut_type_gesture_touch_explore_on - : R.drawable.accessibility_shortcut_type_gesture; - } else { - resId = R.drawable.accessibility_shortcut_type_navbar; - } - return createIllustrationView(context, resId); + private static View createSoftwareImage(Context context, int buttonMode) { + return switch(buttonMode) { + case ACCESSIBILITY_BUTTON_MODE_GESTURE -> + createIllustrationView(context, + AccessibilityUtil.isTouchExploreEnabled(context) + ? R.drawable + .accessibility_shortcut_type_gesture_touch_explore_on + : R.drawable.accessibility_shortcut_type_gesture); + case ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU -> + createIllustrationViewWithImageRawResource( + context, R.raw.accessibility_shortcut_type_fab); + default -> createIllustrationView( + context, R.drawable.accessibility_shortcut_type_navbar); + }; } - private static CharSequence getSoftwareTitle(Context context) { - int resId; - if (AccessibilityUtil.isFloatingMenuEnabled(context)) { - resId = R.string.accessibility_tutorial_dialog_title_button; - } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) { - resId = R.string.accessibility_tutorial_dialog_title_gesture; - } else { - resId = R.string.accessibility_tutorial_dialog_title_button; - } - return context.getText(resId); + private static CharSequence getSoftwareTitle(Context context, int buttonMode) { + return context.getText(buttonMode == ACCESSIBILITY_BUTTON_MODE_GESTURE + ? R.string.accessibility_tutorial_dialog_title_gesture + : R.string.accessibility_tutorial_dialog_title_button); } - private static CharSequence getSoftwareInstruction(Context context) { - final SpannableStringBuilder sb = new SpannableStringBuilder(); - if (AccessibilityUtil.isFloatingMenuEnabled(context)) { - final int resId = R.string.accessibility_tutorial_dialog_message_floating_button; - sb.append(context.getText(resId)); - } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) { - final int numFingers = AccessibilityUtil.isTouchExploreEnabled(context) ? 3 : 2; - sb.append(StringUtil.getIcuPluralsString( + private static CharSequence getSoftwareInstruction(Context context, int buttonMode) { + return switch(buttonMode) { + case ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU -> context.getText( + R.string.accessibility_tutorial_dialog_message_floating_button); + case ACCESSIBILITY_BUTTON_MODE_GESTURE -> StringUtil.getIcuPluralsString( context, - numFingers, - R.string.accessibility_tutorial_dialog_gesture_shortcut_instruction)); - } else { - final int resId = R.string.accessibility_tutorial_dialog_message_button; - sb.append(getSoftwareInstructionWithIcon(context, context.getText(resId))); - } - return sb; + AccessibilityUtil.isTouchExploreEnabled(context) ? 3 : 2, + R.string.accessibility_tutorial_dialog_gesture_shortcut_instruction); + default -> getSoftwareInstructionWithIcon(context, + context.getText(R.string.accessibility_tutorial_dialog_message_button)); + }; } private static CharSequence getSoftwareInstructionWithIcon(Context context, CharSequence text) { @@ -590,6 +564,24 @@ public final class AccessibilityShortcutsTutorial { return spannableInstruction; } + private static CharSequence getQuickSettingsInstruction( + Context context, CharSequence featureName, boolean inSetupWizard) { + Map arguments = new ArrayMap<>(); + arguments.put("count", + AccessibilityUtil.isTouchExploreEnabled(context) ? 2 : 1); + arguments.put("featureName", featureName); + final CharSequence pluralsString = StringUtil.getIcuPluralsString( + context, arguments, + R.string.accessibility_tutorial_dialog_message_quick_setting); + final SpannableStringBuilder tutorialText = new SpannableStringBuilder(); + if (inSetupWizard) { + tutorialText.append(context.getText(R.string + .accessibility_tutorial_dialog_shortcut_unavailable_in_suw)) + .append("\n\n"); + } + return tutorialText.append(pluralsString); + } + private static class TutorialPage { private final int mType; private final CharSequence mTitle; diff --git a/src/com/android/settings/accessibility/AccessibilityUtil.java b/src/com/android/settings/accessibility/AccessibilityUtil.java index 5bf2a3edc2e..5e178db2f89 100644 --- a/src/com/android/settings/accessibility/AccessibilityUtil.java +++ b/src/com/android/settings/accessibility/AccessibilityUtil.java @@ -22,10 +22,12 @@ import static android.view.WindowInsets.Type.systemBars; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.DEFAULT; +import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.GESTURE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.QUICK_SETTINGS; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.TRIPLETAP; +import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.TWOFINGER_DOUBLETAP; import android.accessibilityservice.AccessibilityServiceInfo; import android.content.ComponentName; @@ -33,6 +35,7 @@ import android.content.Context; import android.content.res.Resources; import android.graphics.Insets; import android.graphics.Rect; +import android.icu.text.CaseMap; import android.os.Build; import android.os.UserHandle; import android.provider.Settings; @@ -47,11 +50,17 @@ import androidx.annotation.NonNull; import androidx.annotation.StringRes; import androidx.annotation.VisibleForTesting; +import com.android.internal.accessibility.common.ShortcutConstants; import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType; import com.android.internal.accessibility.util.ShortcutUtils; +import com.android.settings.R; +import com.android.settings.utils.LocaleUtils; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; import java.util.Set; import java.util.StringJoiner; @@ -139,8 +148,8 @@ public final class AccessibilityUtil { /** Determines if a gesture navigation bar is being used. */ public static boolean isGestureNavigateEnabled(Context context) { - return context.getResources().getInteger( - com.android.internal.R.integer.config_navBarInteractionMode) + return Settings.Secure.getInt(context.getContentResolver(), + Settings.Secure.NAVIGATION_MODE, -1) == NAV_BAR_MODE_GESTURAL; } @@ -335,22 +344,23 @@ public final class AccessibilityUtil { */ static boolean hasValuesInSettings(Context context, int shortcutTypes, @NonNull ComponentName componentName) { - boolean exist = false; - if ((shortcutTypes & SOFTWARE) == SOFTWARE) { - exist = hasValueInSettings(context, SOFTWARE, componentName); - } - if (((shortcutTypes & HARDWARE) == HARDWARE)) { - exist |= hasValueInSettings(context, HARDWARE, componentName); - } - if (android.view.accessibility.Flags.a11yQsShortcut()) { - if ((shortcutTypes & QUICK_SETTINGS) - == QUICK_SETTINGS) { - exist |= hasValueInSettings(context, QUICK_SETTINGS, - componentName); + for (int shortcutType : ShortcutConstants.USER_SHORTCUT_TYPES) { + if (!android.view.accessibility.Flags.a11yQsShortcut()) { + if ((shortcutType & QUICK_SETTINGS) == QUICK_SETTINGS) { + continue; + } + } + if (!android.provider.Flags.a11yStandaloneGestureEnabled()) { + if ((shortcutType & GESTURE) == GESTURE) { + continue; + } + } + if ((shortcutTypes & shortcutType) == shortcutType + && hasValueInSettings(context, shortcutType, componentName)) { + return true; } } - - return exist; + return false; } /** @@ -364,29 +374,14 @@ public final class AccessibilityUtil { @VisibleForTesting static boolean hasValueInSettings(Context context, @UserShortcutType int shortcutType, @NonNull ComponentName componentName) { - if (android.view.accessibility.Flags.a11yQsShortcut()) { - return ShortcutUtils.getShortcutTargetsFromSettings( - context, shortcutType, UserHandle.myUserId() - ).contains(componentName.flattenToString()); - } - - final String targetKey = convertKeyFromSettings(shortcutType); - final String targetString = Settings.Secure.getString(context.getContentResolver(), - targetKey); - - if (TextUtils.isEmpty(targetString)) { + if (!android.view.accessibility.Flags.a11yQsShortcut() + && (shortcutType & QUICK_SETTINGS) == QUICK_SETTINGS) { return false; } - sStringColonSplitter.setString(targetString); - - while (sStringColonSplitter.hasNext()) { - final String name = sStringColonSplitter.next(); - if ((componentName.flattenToString()).equals(name)) { - return true; - } - } - return false; + return ShortcutUtils.getShortcutTargetsFromSettings( + context, shortcutType, UserHandle.myUserId() + ).contains(componentName.flattenToString()); } /** @@ -400,15 +395,19 @@ public final class AccessibilityUtil { static int getUserShortcutTypesFromSettings(Context context, @NonNull ComponentName componentName) { int shortcutTypes = DEFAULT; - if (hasValuesInSettings(context, SOFTWARE, componentName)) { - shortcutTypes |= SOFTWARE; - } - if (hasValuesInSettings(context, HARDWARE, componentName)) { - shortcutTypes |= HARDWARE; - } - if (android.view.accessibility.Flags.a11yQsShortcut()) { - if (hasValuesInSettings(context, QUICK_SETTINGS, componentName)) { - shortcutTypes |= QUICK_SETTINGS; + for (int shortcutType : ShortcutConstants.USER_SHORTCUT_TYPES) { + if (!android.view.accessibility.Flags.a11yQsShortcut()) { + if ((shortcutType & QUICK_SETTINGS) == QUICK_SETTINGS) { + continue; + } + } + if (!android.provider.Flags.a11yStandaloneGestureEnabled()) { + if ((shortcutType & GESTURE) == GESTURE) { + continue; + } + } + if (hasValueInSettings(context, shortcutType, componentName)) { + shortcutTypes |= shortcutType; } } @@ -505,4 +504,66 @@ public final class AccessibilityUtil { Settings.Secure.SKIP_ACCESSIBILITY_SHORTCUT_DIALOG_TIMEOUT_RESTRICTION, /* true */ 1); } + + /** + * Assembles a localized string describing the provided shortcut types. + */ + public static CharSequence getShortcutSummaryList(Context context, int shortcutTypes) { + final List list = new ArrayList<>(); + + // LINT.IfChange(shortcut_type_ui_order) + for (int shortcutType : ShortcutConstants.USER_SHORTCUT_TYPES) { + if (!android.view.accessibility.Flags.a11yQsShortcut() + && (shortcutType & QUICK_SETTINGS) == QUICK_SETTINGS) { + continue; + } + if (!android.provider.Flags.a11yStandaloneGestureEnabled() + && (shortcutType & GESTURE) == GESTURE) { + continue; + } + if (!com.android.server.accessibility.Flags + .enableMagnificationMultipleFingerMultipleTapGesture() + && (shortcutType & TWOFINGER_DOUBLETAP) == TWOFINGER_DOUBLETAP) { + continue; + } + + if ((shortcutTypes & shortcutType) == shortcutType) { + list.add(switch (shortcutType) { + case QUICK_SETTINGS -> context.getText( + R.string.accessibility_feature_shortcut_setting_summary_quick_settings); + case SOFTWARE -> getSoftwareShortcutSummary(context); + case GESTURE -> context.getText( + R.string.accessibility_shortcut_edit_summary_software_gesture); + case HARDWARE -> context.getText( + R.string.accessibility_shortcut_hardware_keyword); + case TWOFINGER_DOUBLETAP -> context.getString( + R.string.accessibility_shortcut_two_finger_double_tap_keyword, 2); + case TRIPLETAP -> context.getText( + R.string.accessibility_shortcut_triple_tap_keyword); + default -> ""; + }); + } + } + + list.sort(CharSequence::compare); + return CaseMap.toTitle().wholeString().noLowercase().apply(Locale.getDefault(), /* iter= */ + null, LocaleUtils.getConcatenatedString(list)); + // LINT.ThenChange(/res/xml/accessibility_edit_shortcuts.xml:shortcut_type_ui_order) + } + + @VisibleForTesting + static CharSequence getSoftwareShortcutSummary(Context context) { + if (android.provider.Flags.a11yStandaloneGestureEnabled()) { + return context.getText(R.string.accessibility_shortcut_edit_summary_software); + } + int resId; + if (AccessibilityUtil.isFloatingMenuEnabled(context)) { + resId = R.string.accessibility_shortcut_edit_summary_software; + } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) { + resId = R.string.accessibility_shortcut_edit_summary_software_gesture; + } else { + resId = R.string.accessibility_shortcut_edit_summary_software; + } + return context.getText(resId); + } } diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java index 9c61e5c3305..6649cf48354 100644 --- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java @@ -17,10 +17,9 @@ package com.android.settings.accessibility; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.DEFAULT; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.QUICK_SETTINGS; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; import static com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums; +import static com.android.settings.accessibility.AccessibilityUtil.getShortcutSummaryList; import android.app.Activity; import android.app.Dialog; @@ -34,7 +33,6 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.graphics.drawable.Drawable; -import android.icu.text.CaseMap; import android.net.Uri; import android.os.Bundle; import android.os.Handler; @@ -59,14 +57,12 @@ import androidx.preference.PreferenceScreen; import androidx.recyclerview.widget.RecyclerView; import com.android.internal.accessibility.common.ShortcutConstants; -import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragment; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.flags.Flags; -import com.android.settings.utils.LocaleUtils; import com.android.settings.widget.SettingsMainSwitchBar; import com.android.settings.widget.SettingsMainSwitchPreference; import com.android.settingslib.widget.IllustrationPreference; @@ -76,7 +72,6 @@ import com.google.android.setupcompat.util.WizardManagerHelper; import java.util.ArrayList; import java.util.List; -import java.util.Locale; /** * Base class for accessibility fragments with toggle, shortcut, some helper functions @@ -627,10 +622,6 @@ public abstract class ToggleFeaturePreferenceFragment extends DashboardFragment mFooterPreferenceController.displayPreference(screen); } - private boolean hasShortcutType(int value, @UserShortcutType int type) { - return (value & type) == type; - } - protected CharSequence getShortcutTypeSummary(Context context) { if (!mShortcutPreference.isSettingsEditable()) { return context.getText(R.string.accessibility_shortcut_edit_dialog_title_hardware); @@ -640,47 +631,9 @@ public abstract class ToggleFeaturePreferenceFragment extends DashboardFragment return context.getText(R.string.accessibility_shortcut_state_off); } - // LINT.IfChange(shortcut_type_ui_order) final int shortcutTypes = PreferredShortcuts.retrieveUserShortcutType( context, mComponentName.flattenToString(), getDefaultShortcutTypes()); - - final List list = new ArrayList<>(); - if (android.view.accessibility.Flags.a11yQsShortcut()) { - if (hasShortcutType(shortcutTypes, QUICK_SETTINGS)) { - final CharSequence qsTitle = context.getText( - R.string.accessibility_feature_shortcut_setting_summary_quick_settings); - list.add(qsTitle); - } - } - if (hasShortcutType(shortcutTypes, SOFTWARE)) { - list.add(getSoftwareShortcutTypeSummary(context)); - } - if (hasShortcutType(shortcutTypes, HARDWARE)) { - final CharSequence hardwareTitle = context.getText( - R.string.accessibility_shortcut_hardware_keyword); - list.add(hardwareTitle); - } - // LINT.ThenChange(/res/xml/accessibility_edit_shortcuts.xml:shortcut_type_ui_order) - - // Show software shortcut if first time to use. - if (list.isEmpty()) { - list.add(getSoftwareShortcutTypeSummary(context)); - } - - return CaseMap.toTitle().wholeString().noLowercase().apply(Locale.getDefault(), /* iter= */ - null, LocaleUtils.getConcatenatedString(list)); - } - - private static CharSequence getSoftwareShortcutTypeSummary(Context context) { - int resId; - if (AccessibilityUtil.isFloatingMenuEnabled(context)) { - resId = R.string.accessibility_shortcut_edit_summary_software; - } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) { - resId = R.string.accessibility_shortcut_edit_summary_software_gesture; - } else { - resId = R.string.accessibility_shortcut_edit_summary_software; - } - return context.getText(resId); + return getShortcutSummaryList(context, shortcutTypes); } /** diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java index a030a0a9e77..bc14288f335 100644 --- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java @@ -19,6 +19,7 @@ package com.android.settings.accessibility; import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME; import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.DEFAULT; +import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.GESTURE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.QUICK_SETTINGS; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; @@ -27,6 +28,7 @@ import static com.android.internal.accessibility.common.ShortcutConstants.UserSh import static com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums; import static com.android.settings.accessibility.AccessibilityUtil.State.OFF; import static com.android.settings.accessibility.AccessibilityUtil.State.ON; +import static com.android.settings.accessibility.AccessibilityUtil.getShortcutSummaryList; import android.app.Dialog; import android.app.settings.SettingsEnums; @@ -34,7 +36,6 @@ import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.pm.PackageManager; -import android.icu.text.CaseMap; import android.icu.text.MessageFormat; import android.net.Uri; import android.os.Bundle; @@ -55,6 +56,7 @@ import androidx.preference.PreferenceCategory; import androidx.preference.SwitchPreferenceCompat; import androidx.preference.TwoStatePreference; +import com.android.internal.accessibility.common.ShortcutConstants; import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType; import com.android.internal.annotations.VisibleForTesting; import com.android.server.accessibility.Flags; @@ -62,7 +64,6 @@ import com.android.settings.DialogCreatable; import com.android.settings.R; import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragment; -import com.android.settings.utils.LocaleUtils; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.widget.IllustrationPreference; @@ -70,7 +71,6 @@ import com.google.android.setupcompat.util.WizardManagerHelper; import java.util.ArrayList; import java.util.List; -import java.util.Locale; import java.util.Set; import java.util.StringJoiner; @@ -348,22 +348,6 @@ public class ToggleScreenMagnificationPreferenceFragment extends mDialogDelegate = delegate; } - private boolean hasShortcutType(int value, @UserShortcutType int type) { - return (value & type) == type; - } - - private static CharSequence getSoftwareShortcutTypeSummary(Context context) { - int resId; - if (AccessibilityUtil.isFloatingMenuEnabled(context)) { - resId = R.string.accessibility_shortcut_edit_summary_software; - } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) { - resId = R.string.accessibility_shortcut_edit_summary_software_gesture; - } else { - resId = R.string.accessibility_shortcut_edit_summary_software; - } - return context.getText(resId); - } - @Override protected void registerKeysToObserverCallback( AccessibilitySettingsContentObserver contentObserver) { @@ -423,47 +407,9 @@ public class ToggleScreenMagnificationPreferenceFragment extends return context.getText(R.string.switch_off_text); } - final int shortcutTypes = PreferredShortcuts.retrieveUserShortcutType(context, - MAGNIFICATION_CONTROLLER_NAME); - - // LINT.IfChange(shortcut_type_ui_order) - final List list = new ArrayList<>(); - if (android.view.accessibility.Flags.a11yQsShortcut()) { - if (hasShortcutType(shortcutTypes, QUICK_SETTINGS)) { - final CharSequence qsTitle = context.getText( - R.string.accessibility_feature_shortcut_setting_summary_quick_settings); - list.add(qsTitle); - } - } - if (hasShortcutType(shortcutTypes, SOFTWARE)) { - list.add(getSoftwareShortcutTypeSummary(context)); - } - if (hasShortcutType(shortcutTypes, HARDWARE)) { - final CharSequence hardwareTitle = context.getText( - R.string.accessibility_shortcut_hardware_keyword); - list.add(hardwareTitle); - } - if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) { - if (hasShortcutType(shortcutTypes, TWOFINGER_DOUBLETAP)) { - final CharSequence twoFingerDoubleTapTitle = context.getString( - R.string.accessibility_shortcut_two_finger_double_tap_keyword, 2); - list.add(twoFingerDoubleTapTitle); - } - } - if (hasShortcutType(shortcutTypes, TRIPLETAP)) { - final CharSequence tripleTapTitle = context.getText( - R.string.accessibility_shortcut_triple_tap_keyword); - list.add(tripleTapTitle); - } - // LINT.ThenChange(/res/xml/accessibility_edit_shortcuts.xml:shortcut_type_ui_order) - - // Show software shortcut if first time to use. - if (list.isEmpty()) { - list.add(getSoftwareShortcutTypeSummary(context)); - } - - return CaseMap.toTitle().wholeString().noLowercase().apply(Locale.getDefault(), /* iter= */ - null, LocaleUtils.getConcatenatedString(list)); + return getShortcutSummaryList(context, + PreferredShortcuts.retrieveUserShortcutType(context, + MAGNIFICATION_CONTROLLER_NAME)); } @Override @@ -595,6 +541,9 @@ public class ToggleScreenMagnificationPreferenceFragment extends if (((shortcutTypes & TRIPLETAP) == TRIPLETAP)) { optInMagnificationValueToSettings(context, TRIPLETAP); } + if (((shortcutTypes & GESTURE) == GESTURE)) { + optInMagnificationValueToSettings(context, GESTURE); + } if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) { if (((shortcutTypes & TWOFINGER_DOUBLETAP) == TWOFINGER_DOUBLETAP)) { @@ -680,6 +629,9 @@ public class ToggleScreenMagnificationPreferenceFragment extends if (((shortcutTypes & TRIPLETAP) == TRIPLETAP)) { optOutMagnificationValueFromSettings(context, TRIPLETAP); } + if (((shortcutTypes & GESTURE) == GESTURE)) { + optOutMagnificationValueFromSettings(context, GESTURE); + } if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) { if (((shortcutTypes & TWOFINGER_DOUBLETAP) == TWOFINGER_DOUBLETAP)) { @@ -749,25 +701,21 @@ public class ToggleScreenMagnificationPreferenceFragment extends @VisibleForTesting static boolean hasMagnificationValuesInSettings(Context context, int shortcutTypes) { - boolean exist = false; - - if ((shortcutTypes & SOFTWARE) == SOFTWARE) { - exist = hasMagnificationValueInSettings(context, SOFTWARE); - } - if (((shortcutTypes & HARDWARE) == HARDWARE)) { - exist |= hasMagnificationValueInSettings(context, HARDWARE); - } - if (((shortcutTypes & TRIPLETAP) == TRIPLETAP)) { - exist |= hasMagnificationValueInSettings(context, TRIPLETAP); - } - if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) { - if (((shortcutTypes & TWOFINGER_DOUBLETAP) - == TWOFINGER_DOUBLETAP)) { - exist |= hasMagnificationValueInSettings(context, - TWOFINGER_DOUBLETAP); + for (int shortcutType : ShortcutConstants.USER_SHORTCUT_TYPES) { + if ((shortcutTypes & shortcutType) == 0) { + continue; + } + if (((shortcutType & TWOFINGER_DOUBLETAP) + == TWOFINGER_DOUBLETAP) + && !Flags.enableMagnificationMultipleFingerMultipleTapGesture()) { + continue; + } + if (hasMagnificationValueInSettings(context, shortcutType)) { + return true; } } - return exist; + + return false; } private static boolean hasMagnificationValueInSettings(Context context, @@ -776,7 +724,6 @@ public class ToggleScreenMagnificationPreferenceFragment extends return Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, OFF) == ON; } - if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) { if (shortcutType == TWOFINGER_DOUBLETAP) { return Settings.Secure.getInt(context.getContentResolver(), @@ -805,20 +752,18 @@ public class ToggleScreenMagnificationPreferenceFragment extends private static int getUserShortcutTypeFromSettings(Context context) { int shortcutTypes = DEFAULT; - if (hasMagnificationValuesInSettings(context, SOFTWARE)) { - shortcutTypes |= SOFTWARE; - } - if (hasMagnificationValuesInSettings(context, HARDWARE)) { - shortcutTypes |= HARDWARE; - } - if (hasMagnificationValuesInSettings(context, TRIPLETAP)) { - shortcutTypes |= TRIPLETAP; - } - if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) { - if (hasMagnificationValuesInSettings(context, TWOFINGER_DOUBLETAP)) { - shortcutTypes |= TWOFINGER_DOUBLETAP; + for (int shortcutType : ShortcutConstants.USER_SHORTCUT_TYPES) { + if ((shortcutType & (TWOFINGER_DOUBLETAP | QUICK_SETTINGS | GESTURE | TRIPLETAP)) + == shortcutType + && !android.view.accessibility.Flags.a11yQsShortcut()) { + // These shortcuts will throw if we try to look up their settings without the flag. + continue; + } + if (hasMagnificationValueInSettings(context, shortcutType)) { + shortcutTypes |= shortcutType; } } + return shortcutTypes; } diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceControllerTest.java index f6954d2790b..fae89b10da9 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceControllerTest.java @@ -16,6 +16,8 @@ package com.android.settings.accessibility; +import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_GESTURE; +import static android.provider.Settings.Secure.NAVIGATION_MODE; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; @@ -26,11 +28,17 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.res.Resources; import android.icu.text.MessageFormat; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; +import android.provider.Flags; +import android.provider.Settings; import android.text.Html; import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; +import com.android.internal.accessibility.util.ShortcutUtils; import com.android.settings.R; import org.junit.Before; @@ -47,6 +55,8 @@ import org.robolectric.RobolectricTestRunner; @RunWith(RobolectricTestRunner.class) public class AccessibilityButtonFooterPreferenceControllerTest { + @Rule + public final SetFlagsRule mCheckFlagsRule = new SetFlagsRule(); @Rule public final MockitoRule mockito = MockitoJUnit.rule(); @Spy @@ -69,9 +79,12 @@ public class AccessibilityButtonFooterPreferenceControllerTest { } @Test + @DisableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) public void displayPreference_navigationGestureEnabled_setCorrectTitle() { - when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode)) - .thenReturn(NAV_BAR_MODE_GESTURAL); + Settings.Secure.putIntForUser(mContext.getContentResolver(), + NAVIGATION_MODE, NAV_BAR_MODE_GESTURAL, mContext.getUserId()); + ShortcutUtils.setButtonMode( + mContext, ACCESSIBILITY_BUTTON_MODE_GESTURE, mContext.getUserId()); mController.displayPreference(mScreen); @@ -82,11 +95,26 @@ public class AccessibilityButtonFooterPreferenceControllerTest { Html.FROM_HTML_MODE_COMPACT).toString()); } + @Test + @EnableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) + public void displayPreference_navigationGestureEnabled_flag_setCorrectTitle() { + Settings.Secure.putIntForUser(mContext.getContentResolver(), + NAVIGATION_MODE, NAV_BAR_MODE_GESTURAL, mContext.getUserId()); + + assertThat(AccessibilityUtil.isGestureNavigateEnabled(mContext)).isTrue(); + mController.displayPreference(mScreen); + + assertThat(mPreference.getTitle().toString()).isEqualTo( + Html.fromHtml( + MessageFormat.format(mContext.getString( + R.string.accessibility_button_description), 1, 2, 3), + Html.FROM_HTML_MODE_COMPACT).toString()); + } + @Test public void displayPreference_navigationGestureDisabled_setCorrectTitle() { - when(mResources.getInteger( - com.android.internal.R.integer.config_navBarInteractionMode)).thenReturn( - NAV_BAR_MODE_2BUTTON); + Settings.Secure.putIntForUser(mContext.getContentResolver(), + NAVIGATION_MODE, NAV_BAR_MODE_2BUTTON, mContext.getUserId()); mController.displayPreference(mScreen); diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFragmentTest.java index e40f21c702e..94312a60eee 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFragmentTest.java @@ -32,6 +32,7 @@ import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Flags; +import android.provider.Settings; import androidx.fragment.app.FragmentActivity; import androidx.preference.PreferenceManager; @@ -92,8 +93,9 @@ public class AccessibilityButtonFragmentTest { @Test @DisableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) public void onCreate_navigationGestureEnabled_setCorrectTitle() { - when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode)) - .thenReturn(NAV_BAR_MODE_GESTURAL); + Settings.Secure.putIntForUser( + mContext.getContentResolver(), Settings.Secure.NAVIGATION_MODE, + NAV_BAR_MODE_GESTURAL, mContext.getUserId()); mFragment.onAttach(mContext); mFragment.onCreate(Bundle.EMPTY); @@ -104,9 +106,10 @@ public class AccessibilityButtonFragmentTest { @Test @EnableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) - public void onCreate_navigationGestureEnabled_gestureFlag_setCorrectTitle() { - when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode)) - .thenReturn(NAV_BAR_MODE_GESTURAL); + public void onCreate_navigationGestureEnabled_flag_setCorrectTitle() { + Settings.Secure.putIntForUser( + mContext.getContentResolver(), Settings.Secure.NAVIGATION_MODE, + NAV_BAR_MODE_GESTURAL, mContext.getUserId()); mFragment.onAttach(mContext); mFragment.onCreate(Bundle.EMPTY); @@ -117,8 +120,9 @@ public class AccessibilityButtonFragmentTest { @Test public void onCreate_navigationBarEnabled_setCorrectTitle() { - when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode)) - .thenReturn(NAV_BAR_MODE_2BUTTON); + Settings.Secure.putIntForUser( + mContext.getContentResolver(), Settings.Secure.NAVIGATION_MODE, + NAV_BAR_MODE_2BUTTON, mContext.getUserId()); mFragment.onAttach(mContext); mFragment.onCreate(Bundle.EMPTY); diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonGesturePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonGesturePreferenceControllerTest.java index 83517c302ce..798ff7d570c 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonGesturePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonGesturePreferenceControllerTest.java @@ -75,26 +75,25 @@ public class AccessibilityButtonGesturePreferenceControllerTest { @Test @DisableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) public void getAvailabilityStatus_navigationGestureEnabled_returnAvailable() { - when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode)) - .thenReturn(NAV_BAR_MODE_GESTURAL); + Settings.Secure.putIntForUser(mContext.getContentResolver(), + Settings.Secure.NAVIGATION_MODE, NAV_BAR_MODE_GESTURAL, mContext.getUserId()); assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); } @Test @EnableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) - public void - getAvailabilityStatus_navigationGestureEnabled_gestureFlag_conditionallyUnavailable() { - when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode)) - .thenReturn(NAV_BAR_MODE_GESTURAL); + public void getAvailabilityStatus_navigationGestureEnabled_returnConditionallyUnavailable() { + Settings.Secure.putIntForUser(mContext.getContentResolver(), + Settings.Secure.NAVIGATION_MODE, NAV_BAR_MODE_GESTURAL, mContext.getUserId()); assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); } @Test public void getAvailabilityStatus_navigationGestureDisabled_returnConditionallyUnavailable() { - when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode)) - .thenReturn(NAV_BAR_MODE_2BUTTON); + Settings.Secure.putIntForUser(mContext.getContentResolver(), + Settings.Secure.NAVIGATION_MODE, NAV_BAR_MODE_2BUTTON, mContext.getUserId()); assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); } diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonLocationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonLocationPreferenceControllerTest.java index 53a33972075..a50e8525558 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonLocationPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonLocationPreferenceControllerTest.java @@ -69,16 +69,16 @@ public class AccessibilityButtonLocationPreferenceControllerTest { @Test public void getAvailabilityStatus_navigationGestureEnabled_returnConditionallyUnavailable() { - when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode)) - .thenReturn(NAV_BAR_MODE_GESTURAL); + Settings.Secure.putIntForUser(mContext.getContentResolver(), + Settings.Secure.NAVIGATION_MODE, NAV_BAR_MODE_GESTURAL, mContext.getUserId()); assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); } @Test public void getAvailabilityStatus_navigationGestureDisabled_returnAvailable() { - when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode)) - .thenReturn(NAV_BAR_MODE_2BUTTON); + Settings.Secure.putIntForUser(mContext.getContentResolver(), + Settings.Secure.NAVIGATION_MODE, NAV_BAR_MODE_2BUTTON, mContext.getUserId()); assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); } diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonPreferenceControllerTest.java index ded9bcc96e3..85aa77c1ab8 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonPreferenceControllerTest.java @@ -16,6 +16,7 @@ package com.android.settings.accessibility; +import static android.provider.Settings.Secure.NAVIGATION_MODE; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; @@ -25,6 +26,11 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.res.Resources; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; +import android.provider.Flags; +import android.provider.Settings; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; @@ -50,6 +56,8 @@ import java.util.List; @RunWith(RobolectricTestRunner.class) public class AccessibilityButtonPreferenceControllerTest { + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); @Rule public final MockitoRule mockito = MockitoJUnit.rule(); @Spy @@ -72,9 +80,10 @@ public class AccessibilityButtonPreferenceControllerTest { } @Test + @DisableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) public void displayPreference_navigationGestureEnabled_setCorrectTitle() { - when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode)) - .thenReturn(NAV_BAR_MODE_GESTURAL); + Settings.Secure.putIntForUser(mContext.getContentResolver(), + NAVIGATION_MODE, NAV_BAR_MODE_GESTURAL, mContext.getUserId()); mController.displayPreference(mScreen); @@ -83,9 +92,10 @@ public class AccessibilityButtonPreferenceControllerTest { } @Test - public void displayPreference_navigationGestureDisabled_setCorrectTitle() { - when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode)) - .thenReturn(NAV_BAR_MODE_2BUTTON); + @EnableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) + public void displayPreference_navigationGestureEnabled_flag_setCorrectTitle() { + Settings.Secure.putIntForUser(mContext.getContentResolver(), + NAVIGATION_MODE, NAV_BAR_MODE_GESTURAL, mContext.getUserId()); mController.displayPreference(mScreen); @@ -94,9 +104,21 @@ public class AccessibilityButtonPreferenceControllerTest { } @Test + public void displayPreference_navigationGestureDisabled_setCorrectTitle() { + Settings.Secure.putIntForUser(mContext.getContentResolver(), + NAVIGATION_MODE, NAV_BAR_MODE_2BUTTON, mContext.getUserId()); + + mController.displayPreference(mScreen); + + assertThat(mPreference.getTitle()).isEqualTo( + mContext.getText(R.string.accessibility_button_title)); + } + + @Test + @DisableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) public void updateDynamicRawDataToIndex_navigationGestureEnabled_setCorrectIndex() { - when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode)) - .thenReturn(NAV_BAR_MODE_GESTURAL); + Settings.Secure.putIntForUser(mContext.getContentResolver(), + NAVIGATION_MODE, NAV_BAR_MODE_GESTURAL, mContext.getUserId()); List rawDataList = new ArrayList<>(); mController.updateDynamicRawDataToIndex(rawDataList); @@ -109,10 +131,27 @@ public class AccessibilityButtonPreferenceControllerTest { mResources.getString(R.string.accessibility_shortcuts_settings_title)); } + @Test + @EnableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) + public void updateDynamicRawDataToIndex_navigationGestureEnabled_flag_setCorrectIndex() { + Settings.Secure.putIntForUser(mContext.getContentResolver(), + NAVIGATION_MODE, NAV_BAR_MODE_GESTURAL, mContext.getUserId()); + List rawDataList = new ArrayList<>(); + + mController.updateDynamicRawDataToIndex(rawDataList); + + assertThat(rawDataList).hasSize(1); + SearchIndexableRaw raw = rawDataList.get(0); + assertThat(raw.title).isEqualTo( + mResources.getString(R.string.accessibility_button_title)); + assertThat(raw.screenTitle).isEqualTo( + mResources.getString(R.string.accessibility_shortcuts_settings_title)); + } + @Test public void updateDynamicRawDataToIndex_navigationGestureDisabled_setCorrectIndex() { - when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode)) - .thenReturn(NAV_BAR_MODE_2BUTTON); + Settings.Secure.putIntForUser(mContext.getContentResolver(), + NAVIGATION_MODE, NAV_BAR_MODE_2BUTTON, mContext.getUserId()); List rawDataList = new ArrayList<>(); mController.updateDynamicRawDataToIndex(rawDataList); diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutsTutorialTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutsTutorialTest.java index d5c1fd11c5c..cd8743d595b 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutsTutorialTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutsTutorialTest.java @@ -16,6 +16,7 @@ package com.android.settings.accessibility; +import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.GESTURE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.QUICK_SETTINGS; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; @@ -36,6 +37,7 @@ import android.app.settings.SettingsEnums; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.text.SpannableStringBuilder; @@ -479,9 +481,37 @@ public final class AccessibilityShortcutsTutorialTest { } @Test + @DisableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) public void createAccessibilityTutorialDialog_gestureShortcut_talkbackOn_verifyText() { mShortcutTypes |= SOFTWARE; setTouchExplorationEnabled(true); + AccessibilityTestUtils.setSoftwareShortcutMode( + mContext, /* gestureNavEnabled= */ true, /* floatingButtonEnabled= */ false); + + final String expectedTitle = mContext.getString( + R.string.accessibility_tutorial_dialog_title_gesture); + final String expectedInstruction = StringUtil.getIcuPluralsString( + mContext, + /* count= */ 3, + R.string.accessibility_tutorial_dialog_gesture_shortcut_instruction); + + final AlertDialog alertDialog = + createAccessibilityTutorialDialog( + mContext, mShortcutTypes, FAKE_FEATURE_NAME); + alertDialog.show(); + ShadowLooper.idleMainLooper(); + + verifyTutorialTitleAndInstruction( + alertDialog, + expectedTitle, + expectedInstruction); + } + + @Test + @EnableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) + public void createAccessibilityTutorialDialog_gestureShortcut_talkbackOn_flag_verifyText() { + mShortcutTypes |= GESTURE; + setTouchExplorationEnabled(true); AccessibilityTestUtils.setSoftwareShortcutMode( mContext, /* gestureNavEnabled= */ true, /* floatingButtonEnabled= */ false); final String expectedTitle = mContext.getString( @@ -504,6 +534,7 @@ public final class AccessibilityShortcutsTutorialTest { } @Test + @DisableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) public void createAccessibilityTutorialDialog_gestureShortcut_talkbackOff_verifyText() { mShortcutTypes |= SOFTWARE; setTouchExplorationEnabled(false); @@ -528,6 +559,32 @@ public final class AccessibilityShortcutsTutorialTest { expectedInstruction); } + @Test + @EnableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) + public void createAccessibilityTutorialDialog_gestureShortcut_talkbackOff_flag_verifyText() { + mShortcutTypes |= GESTURE; + setTouchExplorationEnabled(false); + AccessibilityTestUtils.setSoftwareShortcutMode( + mContext, /* gestureNavEnabled= */ true, /* floatingButtonEnabled= */ false); + final String expectedTitle = mContext.getString( + R.string.accessibility_tutorial_dialog_title_gesture); + final String expectedInstruction = StringUtil.getIcuPluralsString( + mContext, + /* count= */ 2, + R.string.accessibility_tutorial_dialog_gesture_shortcut_instruction); + + final AlertDialog alertDialog = + createAccessibilityTutorialDialog( + mContext, mShortcutTypes, FAKE_FEATURE_NAME); + alertDialog.show(); + ShadowLooper.idleMainLooper(); + + verifyTutorialTitleAndInstruction( + alertDialog, + expectedTitle, + expectedInstruction); + } + @Test public void performClickOnPositiveButton_turnOnSoftwareShortcut_dismiss() { mShortcutTypes |= SOFTWARE; diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java index c036432935b..ee3d9360e2c 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java @@ -16,6 +16,11 @@ package com.android.settings.accessibility; +import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU; +import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_GESTURE; +import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; +import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; + import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.QUICK_SETTINGS; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; @@ -398,6 +403,49 @@ public final class AccessibilityUtilTest { .isEqualTo(Settings.Secure.ACCESSIBILITY_QS_TARGETS); } + @Test + @EnableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) + public void getSoftwareShortcutSummary_returnsSoftwareSummary() { + assertThat(AccessibilityUtil.getSoftwareShortcutSummary(mContext)).isEqualTo( + mContext.getText(R.string.accessibility_shortcut_edit_summary_software)); + } + + @Test + @DisableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) + public void getSoftwareShortcutSummary_gestureMode_floatingButton_returnsSoftwareSummary() { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.NAVIGATION_MODE, NAV_BAR_MODE_GESTURAL); + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_MODE, + ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU); + + assertThat(AccessibilityUtil.getSoftwareShortcutSummary(mContext)).isEqualTo( + mContext.getText(R.string.accessibility_shortcut_edit_summary_software)); + } + + @Test + @DisableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) + public void getSoftwareShortcutSummary_gestureMode_gesture_returnsGestureSummary() { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.NAVIGATION_MODE, NAV_BAR_MODE_GESTURAL); + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_MODE, + ACCESSIBILITY_BUTTON_MODE_GESTURE); + + assertThat(AccessibilityUtil.getSoftwareShortcutSummary(mContext)).isEqualTo( + mContext.getText(R.string.accessibility_shortcut_edit_summary_software_gesture)); + } + + @Test + @DisableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) + public void getSoftwareShortcutSummary_navBarMode_returnsSoftwareSummary() { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.NAVIGATION_MODE, NAV_BAR_MODE_3BUTTON); + + assertThat(AccessibilityUtil.getSoftwareShortcutSummary(mContext)).isEqualTo( + mContext.getText(R.string.accessibility_shortcut_edit_summary_software)); + } + private AccessibilityServiceInfo getMockAccessibilityServiceInfo() { final ApplicationInfo applicationInfo = new ApplicationInfo(); final ServiceInfo serviceInfo = new ServiceInfo(); diff --git a/tests/robotests/src/com/android/settings/testutils/AccessibilityTestUtils.java b/tests/robotests/src/com/android/settings/testutils/AccessibilityTestUtils.java index 4d698215c43..fd9a88e1dc8 100644 --- a/tests/robotests/src/com/android/settings/testutils/AccessibilityTestUtils.java +++ b/tests/robotests/src/com/android/settings/testutils/AccessibilityTestUtils.java @@ -17,11 +17,11 @@ package com.android.settings.testutils; import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU; +import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_GESTURE; +import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; -import static com.google.common.truth.Truth.assertThat; - import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -35,8 +35,6 @@ import android.os.Build; import android.provider.Settings; import android.view.accessibility.AccessibilityManager; -import com.android.settings.testutils.shadow.SettingsShadowResources; - import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; @@ -48,15 +46,18 @@ public class AccessibilityTestUtils { public static void setSoftwareShortcutMode( Context context, boolean gestureNavEnabled, boolean floatingButtonEnabled) { - int buttonMode = floatingButtonEnabled ? ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU : -1; + int buttonMode = ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR; + if (floatingButtonEnabled) { + buttonMode = ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU; + } else if (gestureNavEnabled) { + buttonMode = ACCESSIBILITY_BUTTON_MODE_GESTURE; + } int navMode = gestureNavEnabled ? NAV_BAR_MODE_GESTURAL : NAV_BAR_MODE_3BUTTON; - Settings.Secure.putInt(context.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_MODE, buttonMode); - SettingsShadowResources.overrideResource( - com.android.internal.R.integer.config_navBarInteractionMode, navMode); - assertThat(context.getResources().getInteger( - com.android.internal.R.integer.config_navBarInteractionMode)).isEqualTo(navMode); + Settings.Secure.putIntForUser(context.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_MODE, buttonMode, context.getUserId()); + Settings.Secure.putIntForUser(context.getContentResolver(), + Settings.Secure.NAVIGATION_MODE, navMode, context.getUserId()); } /**