Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a9fa5e03 authored by Nitin Sangar's avatar Nitin Sangar
Browse files

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
parent d7972990
Loading
Loading
Loading
Loading
+11 −0
Original line number Original line Diff line number Diff line
@@ -4384,6 +4384,16 @@ public final class Settings {
        public static final String WEAR_ACCESSIBILITY_GESTURE_ENABLED
        public static final String WEAR_ACCESSIBILITY_GESTURE_ENABLED
                = "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
         * @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(END_BUTTON_BEHAVIOR);
            PRIVATE_SETTINGS.add(ADVANCED_SETTINGS);
            PRIVATE_SETTINGS.add(ADVANCED_SETTINGS);
            PRIVATE_SETTINGS.add(WEAR_ACCESSIBILITY_GESTURE_ENABLED);
            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(SCREEN_AUTO_BRIGHTNESS_ADJ);
            PRIVATE_SETTINGS.add(VIBRATE_INPUT_DEVICES);
            PRIVATE_SETTINGS.add(VIBRATE_INPUT_DEVICES);
            PRIVATE_SETTINGS.add(VOLUME_MASTER);
            PRIVATE_SETTINGS.add(VOLUME_MASTER);
+1 −0
Original line number Original line Diff line number Diff line
@@ -211,6 +211,7 @@ public class SystemSettingsValidators {
        VALIDATORS.put(System.SHOW_BATTERY_PERCENT, BOOLEAN_VALIDATOR);
        VALIDATORS.put(System.SHOW_BATTERY_PERCENT, BOOLEAN_VALIDATOR);
        VALIDATORS.put(System.NOTIFICATION_LIGHT_PULSE, 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, 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.CLOCKWORK_BLUETOOTH_SETTINGS_PREF, BOOLEAN_VALIDATOR);
        VALIDATORS.put(System.UNREAD_NOTIFICATION_DOT_INDICATOR, BOOLEAN_VALIDATOR);
        VALIDATORS.put(System.UNREAD_NOTIFICATION_DOT_INDICATOR, BOOLEAN_VALIDATOR);
        VALIDATORS.put(System.AUTO_LAUNCH_MEDIA_CONTROLS, BOOLEAN_VALIDATOR);
        VALIDATORS.put(System.AUTO_LAUNCH_MEDIA_CONTROLS, BOOLEAN_VALIDATOR);
+1 −0
Original line number Original line Diff line number Diff line
@@ -100,6 +100,7 @@ public class SettingsBackupTest {
                    Settings.System.MIN_REFRESH_RATE, // depends on hardware capabilities
                    Settings.System.MIN_REFRESH_RATE, // depends on hardware capabilities
                    Settings.System.PEAK_REFRESH_RATE, // depends on hardware capabilities
                    Settings.System.PEAK_REFRESH_RATE, // depends on hardware capabilities
                    Settings.System.SCREEN_BRIGHTNESS_FLOAT,
                    Settings.System.SCREEN_BRIGHTNESS_FLOAT,
                    Settings.System.WEAR_ACCESSIBILITY_GESTURE_ENABLED_DURING_OOBE,
                    Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ,
                    Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ,
                    Settings.System.MULTI_AUDIO_FOCUS_ENABLED // form-factor/OEM specific
                    Settings.System.MULTI_AUDIO_FOCUS_ENABLED // form-factor/OEM specific
                    );
                    );
+43 −8
Original line number Original line Diff line number Diff line
@@ -68,6 +68,7 @@ import static android.view.WindowManagerGlobal.ADD_OKAY;
import static android.view.WindowManagerGlobal.ADD_PERMISSION_DENIED;
import static android.view.WindowManagerGlobal.ADD_PERMISSION_DENIED;


import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.SCREENSHOT_KEYCHORD_DELAY;
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_COVERED;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVER_ABSENT;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVER_ABSENT;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_UNCOVERED;
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.R;
import com.android.internal.accessibility.AccessibilityShortcutController;
import com.android.internal.accessibility.AccessibilityShortcutController;
import com.android.internal.accessibility.util.AccessibilityStatsLogUtils;
import com.android.internal.accessibility.util.AccessibilityUtils;
import com.android.internal.accessibility.util.AccessibilityUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.AssistUtils;
import com.android.internal.app.AssistUtils;
@@ -1400,7 +1402,18 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                if (DEBUG_INPUT) {
                if (DEBUG_INPUT) {
                    Slog.d(TAG, "Executing stem primary triple press action behavior.");
                    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;
                break;
        }
        }
    }
    }
@@ -1419,17 +1432,39 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        }
        }
    }
    }


    private void toggleTalkBack() {
    /**
        final ComponentName componentName = getTalkbackComponent();
     * A function that toggles talkback service
        if (componentName == null) {
     *
            return;
     * @return {@code true} if talkback is enabled, {@code false} if talkback is disabled
        }
     */

    private boolean toggleTalkBack(ComponentName componentName) {
        final Set<ComponentName> enabledServices =
        final Set<ComponentName> enabledServices =
                AccessibilityUtils.getEnabledServicesFromSettings(mContext, mCurrentUserId);
                AccessibilityUtils.getEnabledServicesFromSettings(mContext, mCurrentUserId);


        boolean isTalkbackAlreadyEnabled = enabledServices.contains(componentName);
        AccessibilityUtils.setAccessibilityServiceState(mContext, 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() {
    private ComponentName getTalkbackComponent() {