diff --git a/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java b/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java index ffc21d5ea9e1f..90712fdbde4fd 100644 --- a/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java +++ b/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java @@ -143,6 +143,9 @@ public class AccessibilityShortcutController { mContext.getContentResolver().registerContentObserver( Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN), false, co, UserHandle.USER_ALL); + mContext.getContentResolver().registerContentObserver( + Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN), + false, co, UserHandle.USER_ALL); setCurrentUser(mUserId); } @@ -168,8 +171,12 @@ public class AccessibilityShortcutController { final ContentResolver cr = mContext.getContentResolver(); final boolean enabled = Settings.Secure.getIntForUser( cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_ENABLED, 1, mUserId) == 1; + // Enable the shortcut from the lockscreen by default if the dialog has been shown + final int dialogAlreadyShown = Settings.Secure.getIntForUser( + cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN, 0, mUserId); mEnabledOnLockScreen = Settings.Secure.getIntForUser( - cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN, 0, mUserId) == 1; + cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN, + dialogAlreadyShown, mUserId) == 1; mIsShortcutEnabled = enabled && haveValidService; } diff --git a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java index a15d337112526..f3e10e033caf7 100644 --- a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java +++ b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java @@ -213,6 +213,20 @@ public class AccessibilityShortcutControllerTest { assertTrue(getController().isAccessibilityShortcutAvailable(true)); } + @Test + public void testShortcutAvailable_onLockScreenAndLockScreenPreferenceUnset() { + // When the user hasn't specified a lock screen preference, we allow from the lock screen + // as long as the user has agreed to enable the shortcut + configureValidShortcutService(); + configureShortcutEnabled(ENABLED_INCLUDING_LOCK_SCREEN); + Settings.Secure.putString( + mContentResolver, ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN, null); + Settings.Secure.putInt(mContentResolver, ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN, 0); + assertFalse(getController().isAccessibilityShortcutAvailable(true)); + Settings.Secure.putInt(mContentResolver, ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN, 1); + assertTrue(getController().isAccessibilityShortcutAvailable(true)); + } + @Test public void testShortcutAvailable_whenServiceIdBecomesNull_shouldReturnFalse() { configureShortcutEnabled(ENABLED_EXCEPT_LOCK_SCREEN);