diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index d7cd61567cc70..e1d84729ba368 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -4384,6 +4384,16 @@ public final class Settings { public static final String WEAR_ACCESSIBILITY_GESTURE_ENABLED = "wear_accessibility_gesture_enabled"; + /** + * If the triple press gesture for toggling accessibility is enabled during OOBE. + * Set to 1 for true and 0 for false. + * + * This setting is used only internally. + * @hide + */ + public static final String WEAR_ACCESSIBILITY_GESTURE_ENABLED_DURING_OOBE = + "wear_accessibility_gesture_enabled_during_oobe"; + /** * @deprecated Use {@link android.provider.Settings.Global#AIRPLANE_MODE_ON} instead */ @@ -5766,6 +5776,7 @@ public final class Settings { PRIVATE_SETTINGS.add(END_BUTTON_BEHAVIOR); PRIVATE_SETTINGS.add(ADVANCED_SETTINGS); PRIVATE_SETTINGS.add(WEAR_ACCESSIBILITY_GESTURE_ENABLED); + PRIVATE_SETTINGS.add(WEAR_ACCESSIBILITY_GESTURE_ENABLED_DURING_OOBE); PRIVATE_SETTINGS.add(SCREEN_AUTO_BRIGHTNESS_ADJ); PRIVATE_SETTINGS.add(VIBRATE_INPUT_DEVICES); PRIVATE_SETTINGS.add(VOLUME_MASTER); diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java index c2a3ada535918..a631c81a307fa 100644 --- a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java +++ b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java @@ -211,6 +211,7 @@ public class SystemSettingsValidators { VALIDATORS.put(System.SHOW_BATTERY_PERCENT, BOOLEAN_VALIDATOR); VALIDATORS.put(System.NOTIFICATION_LIGHT_PULSE, BOOLEAN_VALIDATOR); VALIDATORS.put(System.WEAR_ACCESSIBILITY_GESTURE_ENABLED, BOOLEAN_VALIDATOR); + VALIDATORS.put(System.WEAR_ACCESSIBILITY_GESTURE_ENABLED_DURING_OOBE, BOOLEAN_VALIDATOR); VALIDATORS.put(System.CLOCKWORK_BLUETOOTH_SETTINGS_PREF, BOOLEAN_VALIDATOR); VALIDATORS.put(System.UNREAD_NOTIFICATION_DOT_INDICATOR, BOOLEAN_VALIDATOR); VALIDATORS.put(System.AUTO_LAUNCH_MEDIA_CONTROLS, BOOLEAN_VALIDATOR); diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java index 278ceb944ef6a..ec611cf77ca06 100644 --- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java +++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java @@ -100,6 +100,7 @@ public class SettingsBackupTest { Settings.System.MIN_REFRESH_RATE, // depends on hardware capabilities Settings.System.PEAK_REFRESH_RATE, // depends on hardware capabilities Settings.System.SCREEN_BRIGHTNESS_FLOAT, + Settings.System.WEAR_ACCESSIBILITY_GESTURE_ENABLED_DURING_OOBE, Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, Settings.System.MULTI_AUDIO_FOCUS_ENABLED // form-factor/OEM specific ); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 45dc49dba2ca4..92dd95a21cb0e 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -68,6 +68,7 @@ import static android.view.WindowManagerGlobal.ADD_OKAY; import static android.view.WindowManagerGlobal.ADD_PERMISSION_DENIED; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.SCREENSHOT_KEYCHORD_DELAY; +import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__A11Y_WEAR_TRIPLE_PRESS_GESTURE; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVERED; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVER_ABSENT; import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_UNCOVERED; @@ -190,6 +191,7 @@ import android.widget.Toast; import com.android.internal.R; import com.android.internal.accessibility.AccessibilityShortcutController; +import com.android.internal.accessibility.util.AccessibilityStatsLogUtils; import com.android.internal.accessibility.util.AccessibilityUtils; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.AssistUtils; @@ -1400,7 +1402,18 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (DEBUG_INPUT) { Slog.d(TAG, "Executing stem primary triple press action behavior."); } - toggleTalkBack(); + + if (Settings.System.getIntForUser(mContext.getContentResolver(), + Settings.System.WEAR_ACCESSIBILITY_GESTURE_ENABLED, + /* def= */ 0, UserHandle.USER_CURRENT) == 1) { + /** Toggle talkback begin */ + ComponentName componentName = getTalkbackComponent(); + if (componentName != null && toggleTalkBack(componentName)) { + /** log stem triple press telemetry if it's a talkback enabled event */ + logStemTriplePressAccessibilityTelemetry(componentName); + } + /** Toggle talkback end */ + } break; } } @@ -1419,17 +1432,39 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } - private void toggleTalkBack() { - final ComponentName componentName = getTalkbackComponent(); - if (componentName == null) { - return; - } - + /** + * A function that toggles talkback service + * + * @return {@code true} if talkback is enabled, {@code false} if talkback is disabled + */ + private boolean toggleTalkBack(ComponentName componentName) { final Set enabledServices = AccessibilityUtils.getEnabledServicesFromSettings(mContext, mCurrentUserId); + boolean isTalkbackAlreadyEnabled = enabledServices.contains(componentName); AccessibilityUtils.setAccessibilityServiceState(mContext, componentName, - !enabledServices.contains(componentName)); + !isTalkbackAlreadyEnabled); + /** if isTalkbackAlreadyEnabled is true, then it's a disabled event so return false + * and if isTalkbackAlreadyEnabled is false, return true as it's an enabled event */ + return !isTalkbackAlreadyEnabled; + } + + /** + * A function that logs stem triple press accessibility telemetry + * If the user setup (Oobe) is not completed, set the + * WEAR_ACCESSIBILITY_GESTURE_ENABLED_DURING_OOBE + * setting which will be later logged via Settings Snapshot + * else, log ACCESSIBILITY_SHORTCUT_REPORTED atom + */ + private void logStemTriplePressAccessibilityTelemetry(ComponentName componentName) { + if (!AccessibilityUtils.isUserSetupCompleted(mContext)) { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.System.WEAR_ACCESSIBILITY_GESTURE_ENABLED_DURING_OOBE, 1); + } else { + AccessibilityStatsLogUtils.logAccessibilityShortcutActivated(mContext, componentName, + ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__A11Y_WEAR_TRIPLE_PRESS_GESTURE, + /* serviceEnabled= */ true); + } } private ComponentName getTalkbackComponent() {