From f94762176fed0bdbb160a55e49b0ff34d30f7b82 Mon Sep 17 00:00:00 2001 From: Peter_Liang Date: Fri, 11 Mar 2022 12:26:10 +0800 Subject: [PATCH] Fix that holding volume buttons to activate Extra dim feature doesn't do anything. Root cause: Original framework design which has 3 seconds restriction to prevent users from easily triggering the accessibility volume shortcut when first time using it. Solution: The system would bypass the 3 seconds restriction if users manually set any feature as the volume key shortcut. Bug: 202602908 Test: make RunSettingsRoboTests ROBOTEST_FILTER=ToggleFeaturePreferenceFragmentTest Change-Id: I324321577263904b6ff8b66e411766d16a6430dc --- ...cessibilityShortcutPreferenceFragment.java | 4 ++++ .../accessibility/AccessibilityUtil.java | 11 +++++++++ .../ToggleFeaturePreferenceFragment.java | 4 ++++ ...ScreenMagnificationPreferenceFragment.java | 4 ++++ .../ToggleFeaturePreferenceFragmentTest.java | 23 +++++++++++++++++++ 5 files changed, 46 insertions(+) diff --git a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java index a25c4a61207..34e1fb0557d 100644 --- a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java +++ b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java @@ -333,6 +333,10 @@ public abstract class AccessibilityShortcutPreferenceFragment extends DashboardF mShortcutPreference.setChecked(shortcutAssigned); mShortcutPreference.setSummary(getShortcutTypeSummary(getPrefContext())); + if (mHardwareTypeCheckBox.isChecked()) { + AccessibilityUtil.skipVolumeShortcutDialogTimeoutRestriction(getPrefContext()); + } + // Show the quick setting tooltip if the shortcut assigned in the first time if (shortcutAssigned) { showQuickSettingsTooltipIfNeeded(); diff --git a/src/com/android/settings/accessibility/AccessibilityUtil.java b/src/com/android/settings/accessibility/AccessibilityUtil.java index 3e97edc22a4..e2e29333c98 100644 --- a/src/com/android/settings/accessibility/AccessibilityUtil.java +++ b/src/com/android/settings/accessibility/AccessibilityUtil.java @@ -434,4 +434,15 @@ public final class AccessibilityUtil { public static boolean isSystemApp(@NonNull AccessibilityServiceInfo info) { return info.getResolveInfo().serviceInfo.applicationInfo.isSystemApp(); } + + /** + * Bypasses the timeout restriction if volume key shortcut assigned. + * + * @param context the current context. + */ + public static void skipVolumeShortcutDialogTimeoutRestriction(Context context) { + Settings.Secure.putInt(context.getContentResolver(), + Settings.Secure.SKIP_ACCESSIBILITY_SHORTCUT_DIALOG_TIMEOUT_RESTRICTION, /* + true */ 1); + } } diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java index ccdc78bd26f..518b94d515e 100644 --- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java @@ -732,6 +732,10 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference mShortcutPreference.setChecked(shortcutAssigned); mShortcutPreference.setSummary(getShortcutTypeSummary(getPrefContext())); + if (mHardwareTypeCheckBox.isChecked()) { + AccessibilityUtil.skipVolumeShortcutDialogTimeoutRestriction(getPrefContext()); + } + // Show the quick setting tooltip if the shortcut assigned in the first time if (shortcutAssigned) { showQuickSettingsTooltipIfNeeded(); diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java index 1176fa462c0..eababa7b1e3 100644 --- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java @@ -361,6 +361,10 @@ public class ToggleScreenMagnificationPreferenceFragment extends mShortcutPreference.setChecked(value != UserShortcutType.EMPTY); mShortcutPreference.setSummary( getShortcutTypeSummary(getPrefContext())); + + if (mHardwareTypeCheckBox.isChecked()) { + AccessibilityUtil.skipVolumeShortcutDialogTimeoutRestriction(getPrefContext()); + } } @Override diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java index 04018a6b6d7..3cbe17b0215 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java @@ -38,6 +38,7 @@ import android.provider.Settings; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.CheckBox; import android.widget.PopupWindow; import androidx.annotation.XmlRes; @@ -183,6 +184,28 @@ public class ToggleFeaturePreferenceFragmentTest { assertThat(expectedType).isEqualTo(UserShortcutType.HARDWARE); } + @Test + public void dialogCheckboxClicked_hardwareType_skipTimeoutRestriction() { + mContext.setTheme(R.style.Theme_AppCompat); + final ShortcutPreference shortcutPreference = new ShortcutPreference(mContext, /* attrs= */ + null); + mFragment.mComponentName = PLACEHOLDER_COMPONENT_NAME; + mFragment.mShortcutPreference = shortcutPreference; + final AlertDialog dialog = AccessibilityDialogUtils.showEditShortcutDialog( + mContext, DialogType.EDIT_SHORTCUT_GENERIC, PLACEHOLDER_DIALOG_TITLE, + mFragment::callOnAlertDialogCheckboxClicked); + mFragment.setupEditShortcutDialog(dialog); + + final View dialogHardwareView = dialog.findViewById(R.id.hardware_shortcut); + final CheckBox hardwareTypeCheckBox = dialogHardwareView.findViewById(R.id.checkbox); + hardwareTypeCheckBox.setChecked(true); + dialog.getButton(DialogInterface.BUTTON_POSITIVE).callOnClick(); + final boolean skipTimeoutRestriction = Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.SKIP_ACCESSIBILITY_SHORTCUT_DIALOG_TIMEOUT_RESTRICTION, 0) != 0; + + assertThat(skipTimeoutRestriction).isTrue(); + } + @Test public void setupEditShortcutDialog_shortcutPreferenceOff_checkboxIsEmptyValue() { mContext.setTheme(R.style.Theme_AppCompat);