Merge "Reflect QS shortcut changes in a11y pages." into main
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index fe89bf2..35fe6e4 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -175,6 +175,9 @@
// Observe changes from accessibility selection menu
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS);
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE);
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_QS_TARGETS);
+ }
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_STICKY_KEYS);
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_SLOW_KEYS);
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_BOUNCE_KEYS);
diff --git a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
index 8af284d..41c5d75 100644
--- a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
@@ -125,6 +125,9 @@
final List<String> shortcutFeatureKeys = new ArrayList<>();
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS);
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE);
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_QS_TARGETS);
+ }
mSettingsContentObserver = new AccessibilitySettingsContentObserver(new Handler());
mSettingsContentObserver.registerKeysToObserverCallback(shortcutFeatureKeys, key -> {
updateShortcutPreferenceData();
diff --git a/src/com/android/settings/accessibility/ColorAndMotionFragment.java b/src/com/android/settings/accessibility/ColorAndMotionFragment.java
index 28c5335..4ea2226 100644
--- a/src/com/android/settings/accessibility/ColorAndMotionFragment.java
+++ b/src/com/android/settings/accessibility/ColorAndMotionFragment.java
@@ -74,6 +74,9 @@
mShortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED);
mShortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE);
mShortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS);
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ mShortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_QS_TARGETS);
+ }
if (Flags.forceInvertColor()) {
mShortcutFeatureKeys.add(ToggleForceInvertPreferenceController.SETTINGS_KEY);
}
diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
index 6d5f536..ed47007 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -179,6 +179,9 @@
final List<String> shortcutFeatureKeys = new ArrayList<>();
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS);
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE);
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_QS_TARGETS);
+ }
return shortcutFeatureKeys;
}
diff --git a/src/com/android/settings/gestures/OneHandedSettingsUtils.java b/src/com/android/settings/gestures/OneHandedSettingsUtils.java
index 04898dc..fe7db4f 100644
--- a/src/com/android/settings/gestures/OneHandedSettingsUtils.java
+++ b/src/com/android/settings/gestures/OneHandedSettingsUtils.java
@@ -50,6 +50,8 @@
Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS);
static final Uri HARDWARE_SHORTCUT_ENABLED_URI =
Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE);
+ static final Uri QS_SHORTCUT_ENABLED_URI =
+ Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_QS_TARGETS);
public enum OneHandedTimeout {
NEVER(0), SHORT(4), MEDIUM(8), LONG(12);
@@ -254,6 +256,16 @@
if (!TextUtils.isEmpty(targetsHW) && targetsHW.contains(ONE_HANDED_MODE_TARGET_NAME)) {
return true;
}
+
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ // Checks QS_SHORTCUT_KEY
+ final String targetsQs = Settings.Secure.getStringForUser(context.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_QS_TARGETS, sCurrentUserId);
+ if (!TextUtils.isEmpty(targetsQs) && targetsQs.contains(ONE_HANDED_MODE_TARGET_NAME)) {
+ return true;
+ }
+ }
+
return false;
}
@@ -301,6 +313,9 @@
resolver.registerContentObserver(SHOW_NOTIFICATION_ENABLED_URI, true, this);
resolver.registerContentObserver(SOFTWARE_SHORTCUT_ENABLED_URI, true, this);
resolver.registerContentObserver(HARDWARE_SHORTCUT_ENABLED_URI, true, this);
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ resolver.registerContentObserver(QS_SHORTCUT_ENABLED_URI, true, this);
+ }
}
@Override
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
index 05e56ca..624a39a 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
@@ -38,8 +38,12 @@
import android.content.pm.ServiceInfo;
import android.database.ContentObserver;
import android.os.Build;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.Flags;
import androidx.fragment.app.Fragment;
import androidx.test.core.app.ApplicationProvider;
@@ -59,6 +63,8 @@
import com.android.settingslib.search.SearchIndexableRaw;
import com.android.settingslib.testutils.shadow.ShadowColorDisplayManager;
+import com.google.common.truth.BooleanSubject;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -103,6 +109,7 @@
@Rule
public final MockitoRule mocks = MockitoJUnit.rule();
+ @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private final Context mContext = ApplicationProvider.getApplicationContext();
@Spy
private final AccessibilityServiceInfo mServiceInfo = getMockAccessibilityServiceInfo(
@@ -316,30 +323,39 @@
}
@Test
- public void onCreate_haveRegisterToSpecificUrisAndActions() {
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void onCreate_flagDisabled_haveRegisterToSpecificUrisAndActions() {
setupFragment();
- ShadowContentResolver shadowContentResolver = shadowOf(mContext.getContentResolver());
- Collection<ContentObserver> a11yButtonTargetsObservers =
- shadowContentResolver.getContentObservers(
- Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS));
- Collection<ContentObserver> a11yShortcutTargetServiceObservers =
- shadowContentResolver.getContentObservers(Settings.Secure.getUriFor(
- Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE));
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS,
+ AccessibilitySettingsContentObserver.class).isTrue();
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE,
+ AccessibilitySettingsContentObserver.class).isTrue();
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_QS_TARGETS,
+ AccessibilitySettingsContentObserver.class).isFalse();
List<BroadcastReceiver> broadcastReceivers =
shadowOf((Application) ApplicationProvider.getApplicationContext())
.getRegisteredReceivers()
.stream().map(wrapper -> wrapper.broadcastReceiver).toList();
- assertThat(
- a11yButtonTargetsObservers.stream()
- .anyMatch(contentObserver ->
- contentObserver instanceof AccessibilitySettingsContentObserver))
- .isTrue();
- assertThat(
- a11yShortcutTargetServiceObservers.stream()
- .anyMatch(contentObserver ->
- contentObserver instanceof AccessibilitySettingsContentObserver))
- .isTrue();
+ assertThat(broadcastReceivers.stream().anyMatch(
+ broadcastReceiver -> broadcastReceiver instanceof PackageMonitor)).isTrue();
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void onCreate_flagEnabled_haveRegisterToSpecificUrisAndActions() {
+ setupFragment();
+
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS,
+ AccessibilitySettingsContentObserver.class).isTrue();
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE,
+ AccessibilitySettingsContentObserver.class).isTrue();
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_QS_TARGETS,
+ AccessibilitySettingsContentObserver.class).isTrue();
+ List<BroadcastReceiver> broadcastReceivers =
+ shadowOf((Application) ApplicationProvider.getApplicationContext())
+ .getRegisteredReceivers()
+ .stream().map(wrapper -> wrapper.broadcastReceiver).toList();
assertThat(broadcastReceivers.stream().anyMatch(
broadcastReceiver -> broadcastReceiver instanceof PackageMonitor)).isTrue();
}
@@ -350,27 +366,16 @@
mActivityController.pause().stop().destroy();
- ShadowContentResolver shadowContentResolver = shadowOf(mContext.getContentResolver());
- Collection<ContentObserver> a11yButtonTargetsObservers =
- shadowContentResolver.getContentObservers(
- Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS));
- Collection<ContentObserver> a11yShortcutTargetServiceObservers =
- shadowContentResolver.getContentObservers(Settings.Secure.getUriFor(
- Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE));
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS,
+ AccessibilitySettingsContentObserver.class).isFalse();
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE,
+ AccessibilitySettingsContentObserver.class).isFalse();
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_QS_TARGETS,
+ AccessibilitySettingsContentObserver.class).isFalse();
List<BroadcastReceiver> broadcastReceivers =
shadowOf((Application) ApplicationProvider.getApplicationContext())
.getRegisteredReceivers()
.stream().map(wrapper -> wrapper.broadcastReceiver).toList();
- assertThat(
- a11yButtonTargetsObservers.stream()
- .anyMatch(contentObserver ->
- contentObserver instanceof AccessibilitySettingsContentObserver))
- .isFalse();
- assertThat(
- a11yShortcutTargetServiceObservers.stream()
- .anyMatch(contentObserver ->
- contentObserver instanceof AccessibilitySettingsContentObserver))
- .isFalse();
assertThat(broadcastReceivers.stream().anyMatch(
broadcastReceiver -> broadcastReceiver instanceof PackageMonitor)).isFalse();
}
@@ -491,4 +496,14 @@
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS,
enabled ? componentName.flattenToString() : "");
}
+
+ private BooleanSubject assertUriObserversContainsClazz(
+ String settingUri, Class<?> clazz) {
+ ShadowContentResolver shadowContentResolver = shadowOf(mContext.getContentResolver());
+ Collection<ContentObserver> observers =
+ shadowContentResolver.getContentObservers(
+ Settings.Secure.getUriFor(settingUri));
+
+ return assertThat(observers.stream().anyMatch(clazz::isInstance));
+ }
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
index e963bd0..6fb1c3f 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
@@ -24,6 +24,7 @@
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -146,8 +147,9 @@
}
@Test
+ @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
@Config(shadows = {ShadowFragment.class})
- public void onResume_haveRegisterToSpecificUris() {
+ public void onResume_flagEnabled_haveRegisterToSpecificUris() {
mFragment.onAttach(mContext);
mFragment.onCreate(Bundle.EMPTY);
@@ -162,6 +164,36 @@
Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)),
eq(false),
any(AccessibilitySettingsContentObserver.class));
+ verify(mContentResolver).registerContentObserver(
+ eq(Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_QS_TARGETS)),
+ eq(false),
+ any(AccessibilitySettingsContentObserver.class));
+ }
+
+ @Test
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+ @Config(shadows = {ShadowFragment.class})
+ public void onResume_flagDisabled_haveRegisterToSpecificUris() {
+ mFragment.onAttach(mContext);
+ mFragment.onCreate(Bundle.EMPTY);
+
+ mFragment.onResume();
+
+ verify(mContentResolver).registerContentObserver(
+ eq(Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS)),
+ eq(false),
+ any(AccessibilitySettingsContentObserver.class));
+ verify(mContentResolver).registerContentObserver(
+ eq(Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)),
+ eq(false),
+ any(AccessibilitySettingsContentObserver.class));
+ verify(mContentResolver, never()).registerContentObserver(
+ eq(Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_QS_TARGETS)),
+ eq(false),
+ any(AccessibilitySettingsContentObserver.class));
}
@Test
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
index 3d24fbb..1d85705 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
@@ -292,7 +292,39 @@
}
@Test
- public void onResume_haveRegisterToSpecificUris() {
+ @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void onResume_flagEnabled_haveRegisterToSpecificUris() {
+ ShadowContentResolver shadowContentResolver = Shadows.shadowOf(
+ mContext.getContentResolver());
+ Uri[] observedUri = new Uri[]{
+ Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS),
+ Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE),
+ Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_QS_TARGETS),
+ Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_MAGNIFICATION_FOLLOW_TYPING_ENABLED),
+ Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_MAGNIFICATION_ALWAYS_ON_ENABLED)
+ };
+ for (Uri uri : observedUri) {
+ // verify no observer registered before launching the fragment
+ assertThat(shadowContentResolver.getContentObservers(uri)).isEmpty();
+ }
+
+ mFragController.create(R.id.main_content, /* bundle= */ null).start().resume();
+
+ for (Uri uri : observedUri) {
+ Collection<ContentObserver> observers = shadowContentResolver.getContentObservers(uri);
+ assertThat(observers.size()).isEqualTo(1);
+ assertThat(observers.stream().findFirst().get()).isInstanceOf(
+ AccessibilitySettingsContentObserver.class);
+ }
+ }
+
+ @Test
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void onResume_flagDisabled_haveRegisterToSpecificUris() {
ShadowContentResolver shadowContentResolver = Shadows.shadowOf(
mContext.getContentResolver());
Uri[] observedUri = new Uri[]{
@@ -317,6 +349,9 @@
assertThat(observers.stream().findFirst().get()).isInstanceOf(
AccessibilitySettingsContentObserver.class);
}
+ assertThat(shadowContentResolver.getContentObservers(
+ Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_QS_TARGETS))).hasSize(0);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/gestures/OneHandedSettingsUtilsTest.java b/tests/robotests/src/com/android/settings/gestures/OneHandedSettingsUtilsTest.java
index 9559043..ee5f72e 100644
--- a/tests/robotests/src/com/android/settings/gestures/OneHandedSettingsUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/OneHandedSettingsUtilsTest.java
@@ -16,13 +16,20 @@
package com.android.settings.gestures;
+import static com.android.settings.gestures.OneHandedSettingsUtils.ONE_HANDED_MODE_TARGET_NAME;
+
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
import android.os.UserHandle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
+import android.view.accessibility.Flags;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -30,7 +37,8 @@
@RunWith(RobolectricTestRunner.class)
public class OneHandedSettingsUtilsTest {
-
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private static final int OFF = 0;
private static final int ON = 1;
@@ -120,4 +128,66 @@
OneHandedSettingsUtils.OneHandedTimeout.LONG.getValue(), mCurrentUserId))
.isEqualTo(12);
}
+
+ @Test
+ public void getShortcutEnabled_a11yButtonVolumeKeysShortcutEnabled_returnTrue() {
+ setupShortcuts(
+ /* enableFab= */ true, /* enableVolumeKeys= */ true, /* enableQs=*/ false);
+
+ assertThat(OneHandedSettingsUtils.getShortcutEnabled(mContext)).isTrue();
+ }
+
+ @Test
+ public void getShortcutEnabled_a11yButtonShortcutEnabled_returnTrue() {
+ setupShortcuts(
+ /* enableFab= */ true, /* enableVolumeKeys= */ false, /* enableQs=*/ false);
+
+ assertThat(OneHandedSettingsUtils.getShortcutEnabled(mContext)).isTrue();
+ }
+
+ @Test
+ public void getShortcutEnabled_volumeKeysShortcutEnabled_returnTrue() {
+ setupShortcuts(
+ /* enableFab= */ false, /* enableVolumeKeys= */ true, /* enableQs=*/ false);
+
+ assertThat(OneHandedSettingsUtils.getShortcutEnabled(mContext)).isTrue();
+ }
+
+ @Test
+ public void getShortcutEnabled_noShortcutsEnabled_returnFalse() {
+ setupShortcuts(
+ /* enableFab= */ false, /* enableVolumeKeys= */ false, /* enableQs=*/ false);
+
+ assertThat(OneHandedSettingsUtils.getShortcutEnabled(mContext)).isFalse();
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void getShortcutEnabled_qsShortcutEnabled_returnTrue() {
+ setupShortcuts(
+ /* enableFab= */ false, /* enableVolumeKeys= */ false, /* enableQs=*/ true);
+
+ assertThat(OneHandedSettingsUtils.getShortcutEnabled(mContext)).isTrue();
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void getShortcutEnabled_flagDisabled_qsShortcutEnabled_returnFalse() {
+ setupShortcuts(
+ /* enableFab= */ false, /* enableVolumeKeys= */ false, /* enableQs=*/ true);
+
+ assertThat(OneHandedSettingsUtils.getShortcutEnabled(mContext)).isFalse();
+ }
+
+ private void setupShortcuts(boolean enableFab, boolean enableVolumeKeys, boolean enableQs) {
+ setupShortcut(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, enableFab);
+ setupShortcut(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, enableVolumeKeys);
+ setupShortcut(Settings.Secure.ACCESSIBILITY_QS_TARGETS, enableQs);
+ }
+
+ private void setupShortcut(String shortcutSettingKey, boolean enabled) {
+ final String targetName = enabled ? ONE_HANDED_MODE_TARGET_NAME : "";
+ Settings.Secure.putStringForUser(
+ mContext.getContentResolver(), shortcutSettingKey, targetName, mCurrentUserId);
+ }
}