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

Commit 7db99f29 authored by Kyrylo Mikos's avatar Kyrylo Mikos Committed by Steve Kondik
Browse files

PhoneWindowManager: add ability to use EdgeGestureService for system gestures.

Update: Default to enabled

Conflicts:
	core/java/android/provider/Settings.java
	policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

Change-Id: Id4e2c0d82f771cd1c20e9196fb6db347494cca69
parent c25936ca
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -2474,6 +2474,12 @@ public final class Settings {
        @Deprecated
        public static final String ANIMATOR_DURATION_SCALE = Global.ANIMATOR_DURATION_SCALE;

        /**
         * Use EdgeGesture Service for system gestures in PhoneWindowManager
         * @hide
         */
        public static final String USE_EDGE_SERVICE_FOR_GESTURES = "edge_service_for_gestures";

        /**
         * Control whether the accelerometer will be used to change screen
         * orientation.  If 0, it will not be used unless explicitly requested
+12 −1
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ public final class EdgeServiceConstants {
     * <p>
     * Positions are specified by {@code EdgeGesturePosition.FLAG}.
     */
    public static final int POSITION_MASK = 0x0000000f;
    public static final int POSITION_MASK = 0x0000001f;

    /**
     * Mask for coding sensitivity within the flags of
@@ -68,4 +68,15 @@ public final class EdgeServiceConstants {
     */
    public static final int SENSITIVITY_HIGHEST = 4;

    /**
     * Do not cut 10% area on th edges
     */
    public static final int UNRESTRICTED = 0x10;

    /**
     * This listener does not likes enabling/disabling filter
     * because it interrupt in motion events.
     */
    public static final int LONG_LIVING = 0x20;

}
+81 −0
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ import android.service.dreams.DreamService;
import android.service.dreams.IDreamManager;
import android.speech.RecognizerIntent;
import android.telecom.TelecomManager;
import android.service.gesture.EdgeGestureManager;
import android.util.DisplayMetrics;
import android.util.EventLog;
import android.util.Log;
@@ -109,6 +110,8 @@ import com.android.internal.policy.PolicyManager;
import com.android.internal.policy.impl.keyguard.KeyguardServiceDelegate;
import com.android.internal.policy.impl.keyguard.KeyguardServiceDelegate.ShowListener;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.util.gesture.EdgeGesturePosition;
import com.android.internal.util.gesture.EdgeServiceConstants;
import com.android.internal.widget.PointerLocationView;
import com.android.server.LocalServices;

@@ -697,6 +700,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            resolver.registerContentObserver(Settings.Global.getUriFor(
                    Settings.Global.POLICY_CONTROL), false, this,
                    UserHandle.USER_ALL);
            resolver.registerContentObserver(Settings.System.getUriFor(
                    Settings.System.USE_EDGE_SERVICE_FOR_GESTURES), false, this,
                    UserHandle.USER_ALL);
            updateSettings();
        }

@@ -753,6 +759,62 @@ public class PhoneWindowManager implements WindowManagerPolicy {

    private SystemGesturesPointerEventListener mSystemGestures;

    private EdgeGestureManager.EdgeGestureActivationListener mEdgeGestureActivationListener
            = new EdgeGestureManager.EdgeGestureActivationListener() {

        @Override
        public void onEdgeGestureActivation(int touchX, int touchY,
                EdgeGesturePosition position, int flags) {
            WindowState target = null;

            if (position == EdgeGesturePosition.TOP) {
                target = mStatusBar;
            } else if (position == EdgeGesturePosition.BOTTOM  && mNavigationBarOnBottom) {
                target = mNavigationBar;
            } else if (position == EdgeGesturePosition.RIGHT && !mNavigationBarOnBottom) {
                target = mNavigationBar;
            }

            if (target != null) {
                requestTransientBars(target);
                dropEventsUntilLift();
                mEdgeListenerActivated = true;
            } else {
                restoreListenerState();
            }
        }
    };
    private EdgeGestureManager mEdgeGestureManager = null;
    private int mLastEdgePositions = 0;
    private boolean mEdgeListenerActivated = false;
    private boolean mUsingEdgeGestureServiceForGestures = false;

    private void updateEdgeGestureListenerState() {
        int flags = 0;
        if (mUsingEdgeGestureServiceForGestures) {
            flags = EdgeServiceConstants.LONG_LIVING | EdgeServiceConstants.UNRESTRICTED;
            if (mStatusBar != null && !mStatusBar.isVisibleLw()) {
                flags |= EdgeGesturePosition.TOP.FLAG;
            }
            if (mNavigationBar != null && !mNavigationBar.isVisibleLw()) {
                if (mNavigationBarOnBottom) {
                    flags |= EdgeGesturePosition.BOTTOM.FLAG;
                } else {
                    flags |= EdgeGesturePosition.RIGHT.FLAG;
                }
            }
        }
        if (mEdgeListenerActivated) {
            mEdgeGestureActivationListener.restoreListenerState();
            mEdgeListenerActivated = false;
        }
        if (flags != mLastEdgePositions) {
            mEdgeGestureManager.updateEdgeGestureActivationListener(mEdgeGestureActivationListener,
                    flags);
            mLastEdgePositions = flags;
        }
    }

    IStatusBarService getStatusBarService() {
        synchronized (mServiceAquireLock) {
            if (mStatusBarService == null) {
@@ -1456,6 +1518,19 @@ public class PhoneWindowManager implements WindowManagerPolicy {

            updateKeyAssignments();

            final boolean useEdgeService = Settings.System.getIntForUser(resolver,
                    Settings.System.USE_EDGE_SERVICE_FOR_GESTURES, 1, UserHandle.USER_CURRENT) == 1;
            if (useEdgeService ^ mUsingEdgeGestureServiceForGestures && mSystemReady) {
                if (!mUsingEdgeGestureServiceForGestures && useEdgeService) {
                    mUsingEdgeGestureServiceForGestures = true;
                    mWindowManagerFuncs.unregisterPointerEventListener(mSystemGestures);
                } else if (mUsingEdgeGestureServiceForGestures && !useEdgeService) {
                    mUsingEdgeGestureServiceForGestures = false;
                    mWindowManagerFuncs.registerPointerEventListener(mSystemGestures);
                }
                updateEdgeGestureListenerState();
            }

            // Configure rotation lock.
            int userRotation = Settings.System.getIntForUser(resolver,
                    Settings.System.USER_ROTATION, Surface.ROTATION_0,
@@ -3134,6 +3209,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        mNavigationBarController.adjustSystemUiVisibilityLw(mLastSystemUiFlags, visibility);
        mRecentsVisible = (visibility & View.RECENT_APPS_VISIBLE) > 0;

        updateEdgeGestureListenerState();

        // Reset any bits in mForceClearingStatusBarVisibility that
        // are now clear.
        mResettingSystemUiFlags &= visibility;
@@ -4284,6 +4361,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {

        // update since mAllowLockscreenWhenOn might have changed
        updateLockScreenTimeout();
        updateEdgeGestureListenerState();
        return changes;
    }

@@ -5623,6 +5701,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        mKeyguardDelegate = new KeyguardServiceDelegate(mContext, null);
        mKeyguardDelegate.onSystemReady();

        mEdgeGestureManager = EdgeGestureManager.getInstance();
        mEdgeGestureManager.setEdgeGestureActivationListener(mEdgeGestureActivationListener);

        readCameraLensCoverState();
        updateUiMode();
        synchronized (mLock) {
+6 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static com.android.internal.util.gesture.EdgeServiceConstants.SENSITIVITY
import static com.android.internal.util.gesture.EdgeServiceConstants.SENSITIVITY_MASK;
import static com.android.internal.util.gesture.EdgeServiceConstants.SENSITIVITY_NONE;
import static com.android.internal.util.gesture.EdgeServiceConstants.SENSITIVITY_SHIFT;
import static com.android.internal.util.gesture.EdgeServiceConstants.LONG_LIVING;

import android.Manifest;
import android.content.Context;
@@ -94,6 +95,7 @@ public class EdgeGestureService extends IEdgeGestureService.Stub {
        private void updateFlags(int flags) {
            this.positions = flags & POSITION_MASK;
            this.sensitivity = (flags & SENSITIVITY_MASK) >> SENSITIVITY_SHIFT;
            this.longLiving = (flags & LONG_LIVING) != 0;
        }

        private boolean eligibleForActivation(int positionFlag) {
@@ -165,6 +167,7 @@ public class EdgeGestureService extends IEdgeGestureService.Stub {
        public int positions;
        public int sensitivity;
        public final IEdgeGestureActivationListener listener;
        public boolean longLiving = false;
    }
    private final List<EdgeGestureActivationListenerRecord> mEdgeGestureActivationListener =
            new ArrayList<EdgeGestureActivationListenerRecord>();
@@ -202,6 +205,7 @@ public class EdgeGestureService extends IEdgeGestureService.Stub {
        synchronized(mLock) {
            mGlobalPositions = 0;
            mGlobalSensitivity = SENSITIVITY_NONE;
            boolean someLongLiving = false;
            int activePositions = 0;
            for (EdgeGestureActivationListenerRecord temp : mEdgeGestureActivationListener) {
                mGlobalPositions |= temp.positions;
@@ -211,6 +215,7 @@ public class EdgeGestureService extends IEdgeGestureService.Stub {
                if (temp.sensitivity != SENSITIVITY_NONE) {
                    mGlobalSensitivity = Math.max(mGlobalSensitivity, temp.sensitivity);
                }
                someLongLiving |= temp.longLiving;
            }
            boolean havePositions = mGlobalPositions != 0;
            mGlobalPositions &= ~activePositions;
@@ -221,7 +226,7 @@ public class EdgeGestureService extends IEdgeGestureService.Stub {

            if (mInputFilter == null && havePositions) {
                enforceMonitoringLocked();
            } else if (mInputFilter != null && !havePositions) {
            } else if (mInputFilter != null && !havePositions && !someLongLiving) {
                shutdownMonitoringLocked();
            }
        }
+6 −4
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.view.Display;
import android.view.MotionEvent;

import com.android.internal.util.gesture.EdgeGesturePosition;
import com.android.internal.util.gesture.EdgeServiceConstants;

/**
 * A simple {@link MotionEvent} tracker class. The main aim of this tracker is to
@@ -109,6 +110,7 @@ public class EdgeGestureTracker {
    }

    public boolean start(MotionEvent motionEvent, int positions, int sensitivity) {
        final boolean unrestricted = (positions & EdgeServiceConstants.UNRESTRICTED) != 0;
        final int x = (int) motionEvent.getX();
        final float fx = motionEvent.getX() / mDisplayWidth;
        final int y = (int) motionEvent.getY();
@@ -118,25 +120,25 @@ public class EdgeGestureTracker {
        setSensitivity(sensitivity);

        if ((positions & EdgeGesturePosition.LEFT.FLAG) != 0) {
            if (x < mThickness && fy > 0.1f && fy < 0.9f) {
            if (x < mThickness && (unrestricted || (fy > 0.1f && fy < 0.9f))) {
                startWithPosition(motionEvent, EdgeGesturePosition.LEFT);
                return true;
            }
        }
        if ((positions & EdgeGesturePosition.BOTTOM.FLAG) != 0) {
            if (y > mDisplayHeight - mThickness && fx > 0.1f && fx < 0.9f) {
            if (y > mDisplayHeight - mThickness && (unrestricted || (fx > 0.1f && fx < 0.9f))) {
                startWithPosition(motionEvent, EdgeGesturePosition.BOTTOM);
                return true;
            }
        }
        if ((positions & EdgeGesturePosition.RIGHT.FLAG) != 0) {
            if (x > mDisplayWidth - mThickness && fy > 0.1f && fy < 0.9f) {
            if (x > mDisplayWidth - mThickness && (unrestricted || (fy > 0.1f && fy < 0.9f))) {
                startWithPosition(motionEvent, EdgeGesturePosition.RIGHT);
                return true;
            }
        }
        if ((positions & EdgeGesturePosition.TOP.FLAG) != 0) {
            if (y < mThickness && fx > 0.1f && fx < 0.9f) {
            if (y < mThickness && (unrestricted || (fx > 0.1f && fx < 0.9f))) {
                startWithPosition(motionEvent, EdgeGesturePosition.TOP);
                return true;
            }