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

Commit 575b6fd9 authored by Zhentao Sun's avatar Zhentao Sun
Browse files

Added event log for camera launch gesture.

Fixed b/23523554. Logs time duration when the underlying sensor was
turned on to detect camera launch gesture. The goal is to diagnose
the power consumption of the camera launch gesture.

Change-Id: Ie9554e0ba1c5b290c451f951472575289bae85c7
parent b9b57225
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -244,3 +244,8 @@ option java_package com.android.server
# ---------------------------
# ---------------------------
40000 volume_changed (stream|1), (prev_level|1), (level|1), (max_level|1), (caller|3)
40000 volume_changed (stream|1), (prev_level|1), (level|1), (max_level|1), (caller|3)
40001 stream_devices_changed (stream|1), (prev_devices|1), (devices|1)
40001 stream_devices_changed (stream|1), (prev_devices|1), (devices|1)

# ---------------------------
# GestureLauncherService.java
# ---------------------------
40100 camera_gesture_triggered (gesture_on_time|2|3), (sensor1_on_time|2|3), (sensor2_on_time|2|3), (event_extra|1|1)
+96 −3
Original line number Original line Diff line number Diff line
@@ -31,6 +31,7 @@ import android.hardware.SensorManager;
import android.os.Handler;
import android.os.Handler;
import android.os.PowerManager;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.os.PowerManager.WakeLock;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.SystemProperties;
import android.os.Vibrator;
import android.os.Vibrator;
import android.provider.Settings;
import android.provider.Settings;
@@ -60,6 +61,36 @@ class GestureLauncherService extends SystemService {
    private boolean mRegistered;
    private boolean mRegistered;
    private int mUserId;
    private int mUserId;


    // Below are fields used for event logging only.
    /** Elapsed real time when the camera gesture is turned on. */
    private long mCameraGestureOnTimeMs = 0L;

    /** Elapsed real time when the last camera gesture was detected. */
    private long mCameraGestureLastEventTime = 0L;

    /**
     * How long the sensor 1 has been turned on since camera launch sensor was
     * subscribed to and when the last camera launch gesture was detected.
     * <p>Sensor 1 is the main sensor used to detect camera launch gesture.</p>
     */
    private long mCameraGestureSensor1LastOnTimeMs = 0L;

    /**
     * If applicable, how long the sensor 2 has been turned on since camera
     * launch sensor was subscribed to and when the last camera launch
     * gesture was detected.
     * <p>Sensor 2 is the secondary sensor used to detect camera launch gesture.
     * This is optional and if only sensor 1 is used for detect camera launch
     * gesture, this value would always be 0.</p>
     */
    private long mCameraGestureSensor2LastOnTimeMs = 0L;

    /**
     * Extra information about the event when the last camera launch gesture
     * was detected.
     */
    private int mCameraLaunchLastEventExtra = 0;

    public GestureLauncherService(Context context) {
    public GestureLauncherService(Context context) {
        super(context);
        super(context);
        mContext = context;
        mContext = context;
@@ -107,6 +138,12 @@ class GestureLauncherService extends SystemService {
    private void unregisterCameraLaunchGesture() {
    private void unregisterCameraLaunchGesture() {
        if (mRegistered) {
        if (mRegistered) {
            mRegistered = false;
            mRegistered = false;
            mCameraGestureOnTimeMs = 0L;
            mCameraGestureLastEventTime = 0L;
            mCameraGestureSensor1LastOnTimeMs = 0;
            mCameraGestureSensor2LastOnTimeMs = 0;
            mCameraLaunchLastEventExtra = 0;

            SensorManager sensorManager = (SensorManager) mContext.getSystemService(
            SensorManager sensorManager = (SensorManager) mContext.getSystemService(
                    Context.SENSOR_SERVICE);
                    Context.SENSOR_SERVICE);
            sensorManager.unregisterListener(mGestureListener);
            sensorManager.unregisterListener(mGestureListener);
@@ -120,6 +157,8 @@ class GestureLauncherService extends SystemService {
        if (mRegistered) {
        if (mRegistered) {
            return;
            return;
        }
        }
        mCameraGestureOnTimeMs = SystemClock.elapsedRealtime();
        mCameraGestureLastEventTime = mCameraGestureOnTimeMs;
        SensorManager sensorManager = (SensorManager) mContext.getSystemService(
        SensorManager sensorManager = (SensorManager) mContext.getSystemService(
                Context.SENSOR_SERVICE);
                Context.SENSOR_SERVICE);
        int cameraLaunchGestureId = resources.getInteger(
        int cameraLaunchGestureId = resources.getInteger(
@@ -200,14 +239,22 @@ class GestureLauncherService extends SystemService {
    private final class GestureEventListener implements SensorEventListener {
    private final class GestureEventListener implements SensorEventListener {
        @Override
        @Override
        public void onSensorChanged(SensorEvent event) {
        public void onSensorChanged(SensorEvent event) {
            if (!mRegistered) {
              if (DBG) Slog.d(TAG, "Ignoring gesture event because it's unregistered.");
              return;
            }
            if (event.sensor == mCameraLaunchSensor) {
            if (event.sensor == mCameraLaunchSensor) {
                handleCameraLaunchGesture();
                handleCameraLaunchGesture(event);
                return;
                return;
            }
            }
        }
        }


        private void handleCameraLaunchGesture() {
        private void handleCameraLaunchGesture(SensorEvent event) {
            if (DBG) Slog.d(TAG, "Received a camera launch event.");
            if (DBG) {
                float[] values = event.values;
                Slog.d(TAG, String.format("Received a camera launch event: " +
                      "values=[%.4f, %.4f, %.4f].", values[0], values[1], values[2]));
            }
            boolean userSetupComplete = Settings.Secure.getInt(mContext.getContentResolver(),
            boolean userSetupComplete = Settings.Secure.getInt(mContext.getContentResolver(),
                    Settings.Secure.USER_SETUP_COMPLETE, 0) != 0;
                    Settings.Secure.USER_SETUP_COMPLETE, 0) != 0;
            if (!userSetupComplete) {
            if (!userSetupComplete) {
@@ -225,6 +272,7 @@ class GestureLauncherService extends SystemService {
            StatusBarManagerInternal service = LocalServices.getService(
            StatusBarManagerInternal service = LocalServices.getService(
                    StatusBarManagerInternal.class);
                    StatusBarManagerInternal.class);
            service.onCameraLaunchGestureDetected();
            service.onCameraLaunchGestureDetected();
            trackCameraLaunchEvent(event);
            mWakeLock.release();
            mWakeLock.release();
        }
        }


@@ -232,5 +280,50 @@ class GestureLauncherService extends SystemService {
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // Ignored.
            // Ignored.
        }
        }

        private void trackCameraLaunchEvent(SensorEvent event) {
            long now = SystemClock.elapsedRealtime();
            long totalDuration = now - mCameraGestureOnTimeMs;
            // values[0]: ratio between total time duration when accel is turned on and time
            //            duration since camera launch gesture is subscribed.
            // values[1]: ratio between total time duration when gyro is turned on and time duration
            //            since camera launch gesture is subscribed.
            // values[2]: extra information
            float[] values = event.values;

            long sensor1OnTime = (long) (totalDuration * (double) values[0]);
            long sensor2OnTime = (long) (totalDuration * (double) values[1]);
            int extra = (int) values[2];

            // We only log the difference in the event log to make aggregation easier.
            long gestureOnTimeDiff = now - mCameraGestureLastEventTime;
            long sensor1OnTimeDiff = sensor1OnTime - mCameraGestureSensor1LastOnTimeMs;
            long sensor2OnTimeDiff = sensor2OnTime - mCameraGestureSensor2LastOnTimeMs;
            int extraDiff = extra - mCameraLaunchLastEventExtra;

            // Gating against negative time difference. This doesn't usually happen, but it may
            // happen because of numeric errors.
            if (gestureOnTimeDiff < 0 || sensor1OnTimeDiff < 0 || sensor2OnTimeDiff < 0) {
                if (DBG) Slog.d(TAG, "Skipped event logging because negative numbers.");
                return;
            }

            if (DBG) Slog.d(TAG, String.format("totalDuration: %d, sensor1OnTime: %s, " +
                    "sensor2OnTime: %d, extra: %d",
                    gestureOnTimeDiff,
                    sensor1OnTimeDiff,
                    sensor2OnTimeDiff,
                    extraDiff));
            EventLogTags.writeCameraGestureTriggered(
                    gestureOnTimeDiff,
                    sensor1OnTimeDiff,
                    sensor2OnTimeDiff,
                    extraDiff);

            mCameraGestureLastEventTime = now;
            mCameraGestureSensor1LastOnTimeMs = sensor1OnTime;
            mCameraGestureSensor2LastOnTimeMs = sensor2OnTime;
            mCameraLaunchLastEventExtra = extra;
        }
    }
    }
}
}