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

Commit 5df39e24 authored by Kyrylo Mikos's avatar Kyrylo Mikos Committed by Abhisek Devkota
Browse files

PhoneWindowManager: add ability to use EdgeGestureService for system gestures.

Update: Default to enabled

Change-Id: Id4e2c0d82f771cd1c20e9196fb6db347494cca69
parent 0ae2bc02
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -3204,6 +3204,12 @@ public final class Settings {
         */
        public static final String EXPANDED_DESKTOP_STYLE = "expanded_desktop_style";

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

        /**
         * Show the pending notification counts as overlays on the status bar
         * @hide
+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;

}
+85 −5
Original line number Diff line number Diff line
@@ -18,9 +18,7 @@
package com.android.internal.policy.impl;

import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.app.ActivityManagerNative;
import android.app.IActivityManager;
import android.app.IUiModeManager;
import android.app.KeyguardManager;
import android.app.AppOpsManager;
@@ -62,7 +60,6 @@ import android.os.Looper;
import android.os.Message;
import android.os.Messenger;
import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
@@ -77,6 +74,7 @@ import com.android.internal.util.cm.DevUtils;

import android.service.dreams.DreamService;
import android.service.dreams.IDreamManager;
import android.service.gesture.EdgeGestureManager;
import com.android.internal.os.DeviceKeyHandler;

import dalvik.system.DexClassLoader;
@@ -111,15 +109,15 @@ import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.VolumePanel;
import android.widget.Toast;
import android.media.IAudioService;
import android.media.AudioService;
import android.media.AudioManager;

import com.android.internal.R;
import com.android.internal.policy.PolicyManager;
import com.android.internal.policy.impl.keyguard.KeyguardServiceDelegate;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.telephony.ITelephony;
import com.android.internal.util.gesture.EdgeGesturePosition;
import com.android.internal.util.gesture.EdgeServiceConstants;
import com.android.internal.widget.PointerLocationView;

import java.io.File;
@@ -679,6 +677,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            resolver.registerContentObserver(Settings.System.getUriFor(
                    Settings.System.NAVBAR_LEFT_IN_LANDSCAPE), false, this,
                    UserHandle.USER_ALL);
            resolver.registerContentObserver(Settings.System.getUriFor(
                    Settings.System.USE_EDGE_SERVICE_FOR_GESTURES), false, this,
                    UserHandle.USER_ALL);
            updateSettings();
        }

@@ -719,6 +720,67 @@ 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.LEFT
                    && !mNavigationBarOnBottom && mNavigationBarLeftInLandscape) {
                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 if (mNavigationBarLeftInLandscape) {
                    flags |= EdgeGesturePosition.LEFT.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) {
@@ -1499,6 +1561,19 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            mNavigationBarLeftInLandscape = Settings.System.getInt(resolver,
                    Settings.System.NAVBAR_LEFT_IN_LANDSCAPE, 0) == 1;

            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();
            }

            updateKeyAssignments();

            // Configure rotation lock.
@@ -3082,6 +3157,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        mStatusBarController.adjustSystemUiVisibilityLw(mLastSystemUiFlags, visibility);
        mNavigationBarController.adjustSystemUiVisibilityLw(mLastSystemUiFlags, visibility);

        updateEdgeGestureListenerState();

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

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

@@ -5392,6 +5470,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            mKeyguardDelegate = new KeyguardServiceDelegate(mContext, null);
            mKeyguardDelegate.onSystemReady();
        }
        mEdgeGestureManager = EdgeGestureManager.getInstance();
        mEdgeGestureManager.setEdgeGestureActivationListener(mEdgeGestureActivationListener);
        synchronized (mLock) {
            updateOrientationListenerLp();
            mSystemReady = true;
+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;
            }