Implement accessibility telemtery in wear

As a part of this telemetry, log
 1. Accessiblity shortcut reported atom when stem primary button is
    triple pressed in wear
 2. log mistrigger occurred via System setting

Test: Tested logging of atom via : statsd_testdrive 266
Bug: 264540995
Test results:

On pressing triple press when its enabled, this was the output :

event_metrics {
  data {
    aggregated_atom_info {
      atom {
        accessibility_shortcut_reported {
          package_name: "com.google.android.marvin.talkback/com.google.android.marvin.talkback.TalkBackService"
          shortcut_type: A11Y_WEAR_TRIPLE_PRESS_GESTURE
          service_status: ENABLED
        }
      }
      elapsed_timestamp_nanos: 9304445032196
    }
  }
}
is_active: true

Change-Id: Ic348ed8762f2fac20c117671ee39a3acec8862bb
This commit is contained in:
Nitin Sangar
2023-02-08 22:50:13 +00:00
parent d79729903f
commit a9fa5e0302
4 changed files with 56 additions and 8 deletions

View File

@@ -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);

View File

@@ -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);

View File

@@ -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
);

View File

@@ -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<ComponentName> 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() {