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

Commit 6e8d7099 authored by Jonathan Solnit's avatar Jonathan Solnit
Browse files

Check for keyguard occlusion on camera lift

Instead of just checking if the keyguard is locked, check that it's showing and
not occluded. Also add more logging.

Bug: 62386862
Test: Attempted lift gesture from the following states:
1. Locked
2. Suspended
3. Incoming phone call while locked
4. In phone call while locked
Change-Id: I55e75c695c9f1349ca16791a25029bf33477d7b7
parent 8a3620f2
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -228,6 +228,11 @@ public abstract class WindowManagerInternal {
    /** @return {@code true} if the keyguard is going away. */
    public abstract boolean isKeyguardGoingAway();

    /**
    * @return Whether the keyguard is showing and not occluded.
    */
    public abstract boolean isKeyguardShowingAndNotOccluded();

    /**
     * Gets the frame of a window given its token.
     *
+6 −0
Original line number Diff line number Diff line
@@ -309,6 +309,7 @@ public class StatusBar extends SystemUI implements DemoMode,
    public static final boolean DEBUG_GESTURES = false;
    public static final boolean DEBUG_MEDIA = false;
    public static final boolean DEBUG_MEDIA_FAKE_ARTWORK = false;
    public static final boolean DEBUG_CAMERA_LIFT = true; // false once b/62623620 is fixed

    public static final boolean DEBUG_WINDOW_STATE = false;

@@ -5163,11 +5164,14 @@ public class StatusBar extends SystemUI implements DemoMode,
    public void onCameraLaunchGestureDetected(int source) {
        mLastCameraLaunchSource = source;
        if (mStartedGoingToSleep) {
            if (DEBUG_CAMERA_LIFT) Slog.d(TAG, "Finish going to sleep before launching camera");
            mLaunchCameraOnFinishedGoingToSleep = true;
            return;
        }
        if (!mNotificationPanel.canCameraGestureBeLaunched(
                mStatusBarKeyguardViewManager.isShowing() && mExpandedVisible)) {
            if (DEBUG_CAMERA_LIFT) Slog.d(TAG, "Can't launch camera right now, mExpandedVisible: " +
                    mExpandedVisible);
            return;
        }
        if (!mDeviceInteractive) {
@@ -5187,12 +5191,14 @@ public class StatusBar extends SystemUI implements DemoMode,
                mGestureWakeLock.acquire(LAUNCH_TRANSITION_TIMEOUT_MS + 1000L);
            }
            if (mScreenTurningOn || mStatusBarKeyguardViewManager.isScreenTurnedOn()) {
                if (DEBUG_CAMERA_LIFT) Slog.d(TAG, "Launching camera");
                mNotificationPanel.launchCamera(mDeviceInteractive /* animate */, source);
            } else {
                // We need to defer the camera launch until the screen comes on, since otherwise
                // we will dismiss us too early since we are waiting on an activity to be drawn and
                // incorrectly get notified because of the screen on event (which resumes and pauses
                // some activities)
                if (DEBUG_CAMERA_LIFT) Slog.d(TAG, "Deferring until screen turns on");
                mLaunchCameraOnScreenTurningOn = true;
            }
        }
+23 −15
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
package com.android.server;

import android.app.ActivityManager;
import android.app.KeyguardManager;
import android.app.StatusBarManager;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -41,10 +40,12 @@ import android.provider.Settings;
import android.util.MutableBoolean;
import android.util.Slog;
import android.view.KeyEvent;
import android.view.WindowManagerInternal;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.server.LocalServices;
import com.android.server.statusbar.StatusBarManagerInternal;

/**
@@ -56,6 +57,7 @@ import com.android.server.statusbar.StatusBarManagerInternal;
 */
public class GestureLauncherService extends SystemService {
    private static final boolean DBG = false;
    private static final boolean DBG_CAMERA_LIFT = true; // false once b/62623620 is fixed
    private static final String TAG = "GestureLauncherService";

    /**
@@ -82,7 +84,7 @@ public class GestureLauncherService extends SystemService {
    private Context mContext;
    private final MetricsLogger mMetricsLogger;
    private PowerManager mPowerManager;
    private KeyguardManager mKeyguardManager;
    private WindowManagerInternal mWindowManagerInternal;

    /** The wake lock held when a gesture is detected. */
    private WakeLock mWakeLock;
@@ -150,8 +152,7 @@ public class GestureLauncherService extends SystemService {
                return;
            }

            mKeyguardManager = (KeyguardManager) mContext.getSystemService(
                    Context.KEYGUARD_SERVICE);
            mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
            mPowerManager = (PowerManager) mContext.getSystemService(
                    Context.POWER_SERVICE);
            mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
@@ -517,33 +518,40 @@ public class GestureLauncherService extends SystemService {
    private final class CameraLiftTriggerEventListener extends TriggerEventListener {
        @Override
        public void onTrigger(TriggerEvent event) {
            if (DBG_CAMERA_LIFT) Slog.d(TAG, String.format("onTrigger event - time: %d, name: %s",
                    event.timestamp, event.sensor.getName()));
            if (!mCameraLiftRegistered) {
              if (DBG) Slog.d(TAG, "Ignoring camera lift event because it's unregistered.");
              if (DBG_CAMERA_LIFT) Slog.d(TAG, "Ignoring camera lift event because it's " +
                      "unregistered.");
              return;
            }
            if (event.sensor == mCameraLiftTriggerSensor) {
                Resources resources = mContext.getResources();
                SensorManager sensorManager = (SensorManager) mContext.getSystemService(
                        Context.SENSOR_SERVICE);

                if (DBG) {
                boolean keyguardShowingAndNotOccluded =
                        mWindowManagerInternal.isKeyguardShowingAndNotOccluded();
                boolean interactive = mPowerManager.isInteractive();
                if (DBG_CAMERA_LIFT) {
                    float[] values = event.values;
                    Slog.d(TAG, String.format("Received a camera lift trigger event: " +
                            "values=[%.4f].", values[0]));
                    Slog.d(TAG, String.format("Received a camera lift trigger " +
                            "event: values=[%.4f], keyguard showing: %b, interactive: %b", values[0],
                            keyguardShowingAndNotOccluded, interactive));
                }
                if (mKeyguardManager.isKeyguardLocked() || !mPowerManager.isInteractive()) {
                if (keyguardShowingAndNotOccluded || !interactive) {
                    if (handleCameraGesture(true /* useWakelock */,
                            StatusBarManager.CAMERA_LAUNCH_SOURCE_LIFT_TRIGGER)) {
                        MetricsLogger.action(mContext, MetricsEvent.ACTION_CAMERA_LIFT_TRIGGER);
                    }
                } else if (DBG) {
                    Slog.d(TAG, "Ignoring lift event because device is awake");
                } else {
                    if (DBG_CAMERA_LIFT) Slog.d(TAG, "Ignoring lift event");
                }

                mCameraLiftRegistered = sensorManager.requestTriggerSensor(mCameraLiftTriggerListener,
                        mCameraLiftTriggerSensor);
                mCameraLiftRegistered = sensorManager.requestTriggerSensor(
                        mCameraLiftTriggerListener, mCameraLiftTriggerSensor);

                if (DBG) Slog.d(TAG, "Camera lift trigger sensor re-registered: " + mCameraLiftRegistered);
                if (DBG_CAMERA_LIFT) Slog.d(TAG, "Camera lift trigger sensor re-registered: " +
                        mCameraLiftRegistered);
                return;
            }
        }
+9 −0
Original line number Diff line number Diff line
@@ -3040,6 +3040,10 @@ public class WindowManagerService extends IWindowManager.Stub
        return mPolicy.isKeyguardLocked();
    }

    public boolean isKeyguardShowingAndNotOccluded() {
        return mPolicy.isKeyguardShowingAndNotOccluded();
    }

    @Override
    public boolean isKeyguardSecure() {
        int userId = UserHandle.getCallingUserId();
@@ -7290,6 +7294,11 @@ public class WindowManagerService extends IWindowManager.Stub
            return WindowManagerService.this.mKeyguardGoingAway;
        }

        @Override
        public boolean isKeyguardShowingAndNotOccluded() {
            return WindowManagerService.this.isKeyguardShowingAndNotOccluded();
        }

        @Override
        public void showGlobalActions() {
            WindowManagerService.this.showGlobalActions();