Merge "Check that sysui states before allowing back gesture" into qt-dev

This commit is contained in:
Winson Chung
2019-04-19 06:14:46 +00:00
committed by Android (Google) Code Review
4 changed files with 30 additions and 6 deletions

View File

@@ -51,6 +51,7 @@ public class QuickStepContract {
public static final int SYSUI_STATE_SCREEN_PINNING = 1 << 0; public static final int SYSUI_STATE_SCREEN_PINNING = 1 << 0;
public static final int SYSUI_STATE_NAV_BAR_HIDDEN = 1 << 1; public static final int SYSUI_STATE_NAV_BAR_HIDDEN = 1 << 1;
public static final int SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED = 1 << 2; public static final int SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED = 1 << 2;
public static final int SYSUI_STATE_BOUNCER_SHOWING = 1 << 3;
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
@IntDef({SYSUI_STATE_SCREEN_PINNING, @IntDef({SYSUI_STATE_SCREEN_PINNING,

View File

@@ -28,6 +28,7 @@ import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_INP
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SUPPORTS_WINDOW_CORNERS; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SUPPORTS_WINDOW_CORNERS;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_WINDOW_CORNER_RADIUS; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_WINDOW_CORNER_RADIUS;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING;
@@ -489,12 +490,17 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
} }
} }
public int getSystemUiStateFlags() {
return mSysUiStateFlags;
}
private void updateSystemUiStateFlags() { private void updateSystemUiStateFlags() {
final NavigationBarController navBar = Dependency.get(NavigationBarController.class); final NavigationBarController navBar = Dependency.get(NavigationBarController.class);
final NavigationBarFragment navBarFragment = navBar.getDefaultNavigationBarFragment(); final NavigationBarFragment navBarFragment = navBar.getDefaultNavigationBarFragment();
final StatusBar statusBar = SysUiServiceProvider.getComponent(mContext, StatusBar.class); final StatusBar statusBar = SysUiServiceProvider.getComponent(mContext, StatusBar.class);
final boolean panelExpanded = statusBar != null && statusBar.getPanel() != null final boolean panelExpanded = statusBar != null && statusBar.getPanel() != null
&& statusBar.getPanel().isFullyExpanded(); && statusBar.getPanel().isFullyExpanded();
final boolean bouncerShowing = statusBar != null && statusBar.isBouncerShowing();
mSysUiStateFlags = 0; mSysUiStateFlags = 0;
mSysUiStateFlags |= ActivityManagerWrapper.getInstance().isScreenPinningActive() mSysUiStateFlags |= ActivityManagerWrapper.getInstance().isScreenPinningActive()
? SYSUI_STATE_SCREEN_PINNING : 0; ? SYSUI_STATE_SCREEN_PINNING : 0;
@@ -502,6 +508,8 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
? SYSUI_STATE_NAV_BAR_HIDDEN : 0; ? SYSUI_STATE_NAV_BAR_HIDDEN : 0;
mSysUiStateFlags |= panelExpanded mSysUiStateFlags |= panelExpanded
? SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED : 0; ? SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED : 0;
mSysUiStateFlags |= bouncerShowing
? SYSUI_STATE_BOUNCER_SHOWING : 0;
notifySystemUiStateFlags(mSysUiStateFlags); notifySystemUiStateFlags(mSysUiStateFlags);
} }

View File

@@ -17,6 +17,10 @@ package com.android.systemui.statusbar.phone;
import static android.view.Display.INVALID_DISPLAY; import static android.view.Display.INVALID_DISPLAY;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED;
import android.content.Context; import android.content.Context;
import android.content.pm.ParceledListSlice; import android.content.pm.ParceledListSlice;
import android.content.res.Resources; import android.content.res.Resources;
@@ -127,7 +131,7 @@ public class EdgeBackGestureHandler implements DisplayListener {
private final PointF mDownPoint = new PointF(); private final PointF mDownPoint = new PointF();
private boolean mThresholdCrossed = false; private boolean mThresholdCrossed = false;
private boolean mIgnoreThisGesture = false; private boolean mAllowGesture = false;
private boolean mIsOnLeftEdge; private boolean mIsOnLeftEdge;
private int mImeHeight = 0; private int mImeHeight = 0;
@@ -285,9 +289,14 @@ public class EdgeBackGestureHandler implements DisplayListener {
private void onMotionEvent(MotionEvent ev) { private void onMotionEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) { if (ev.getAction() == MotionEvent.ACTION_DOWN) {
// Verify if this is in within the touch region // Verify if this is in within the touch region and we aren't in immersive mode, and
mIgnoreThisGesture = !isWithinTouchRegion((int) ev.getX(), (int) ev.getY()); // either the bouncer is showing or the notification panel is hidden
if (!mIgnoreThisGesture) { int stateFlags = mOverviewProxyService.getSystemUiStateFlags();
mAllowGesture = (stateFlags & SYSUI_STATE_NAV_BAR_HIDDEN) == 0
&& ((stateFlags & SYSUI_STATE_BOUNCER_SHOWING) == SYSUI_STATE_BOUNCER_SHOWING
|| (stateFlags & SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED) == 0)
&& isWithinTouchRegion((int) ev.getX(), (int) ev.getY());
if (mAllowGesture) {
mIsOnLeftEdge = ev.getX() < mEdgeWidth; mIsOnLeftEdge = ev.getX() < mEdgeWidth;
mEdgePanelLp.gravity = mIsOnLeftEdge mEdgePanelLp.gravity = mIsOnLeftEdge
? (Gravity.LEFT | Gravity.TOP) ? (Gravity.LEFT | Gravity.TOP)
@@ -302,13 +311,13 @@ public class EdgeBackGestureHandler implements DisplayListener {
mThresholdCrossed = false; mThresholdCrossed = false;
mEdgePanel.handleTouch(ev); mEdgePanel.handleTouch(ev);
} }
} else if (!mIgnoreThisGesture) { } else if (mAllowGesture) {
if (!mThresholdCrossed && ev.getAction() == MotionEvent.ACTION_MOVE) { if (!mThresholdCrossed && ev.getAction() == MotionEvent.ACTION_MOVE) {
float dx = Math.abs(ev.getX() - mDownPoint.x); float dx = Math.abs(ev.getX() - mDownPoint.x);
float dy = Math.abs(ev.getY() - mDownPoint.y); float dy = Math.abs(ev.getY() - mDownPoint.y);
if (dy > dx && dy > mTouchSlop) { if (dy > dx && dy > mTouchSlop) {
// Send action cancel to reset all the touch events // Send action cancel to reset all the touch events
mIgnoreThisGesture = true; mAllowGesture = false;
MotionEvent cancelEv = MotionEvent.obtain(ev); MotionEvent cancelEv = MotionEvent.obtain(ev);
cancelEv.setAction(MotionEvent.ACTION_CANCEL); cancelEv.setAction(MotionEvent.ACTION_CANCEL);
mEdgePanel.handleTouch(cancelEv); mEdgePanel.handleTouch(cancelEv);

View File

@@ -30,6 +30,7 @@ import static com.android.systemui.Dependency.MAIN_HANDLER;
import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_ASLEEP; import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_ASLEEP;
import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_AWAKE; import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_AWAKE;
import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_WAKING; import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_WAKING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING;
import static com.android.systemui.shared.system.WindowManagerWrapper.NAV_BAR_POS_INVALID; import static com.android.systemui.shared.system.WindowManagerWrapper.NAV_BAR_POS_INVALID;
import static com.android.systemui.shared.system.WindowManagerWrapper.NAV_BAR_POS_LEFT; import static com.android.systemui.shared.system.WindowManagerWrapper.NAV_BAR_POS_LEFT;
import static com.android.systemui.statusbar.NotificationLockscreenUserManager.PERMISSION_SELF; import static com.android.systemui.statusbar.NotificationLockscreenUserManager.PERMISSION_SELF;
@@ -166,6 +167,7 @@ import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.Snoo
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.qs.QSFragment; import com.android.systemui.qs.QSFragment;
import com.android.systemui.qs.QSPanel; import com.android.systemui.qs.QSPanel;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.recents.Recents; import com.android.systemui.recents.Recents;
import com.android.systemui.recents.ScreenPinningRequest; import com.android.systemui.recents.ScreenPinningRequest;
import com.android.systemui.shared.system.WindowManagerWrapper; import com.android.systemui.shared.system.WindowManagerWrapper;
@@ -3582,6 +3584,10 @@ public class StatusBar extends SystemUI implements DemoMode,
if (!mBouncerShowing) { if (!mBouncerShowing) {
updatePanelExpansionForKeyguard(); updatePanelExpansionForKeyguard();
} }
// Notify overview proxy service of the new states
Dependency.get(OverviewProxyService.class).setSystemUiStateFlag(SYSUI_STATE_BOUNCER_SHOWING,
isBouncerShowing());
} }
/** /**