diff options
| author | 2021-05-20 20:15:20 +0000 | |
|---|---|---|
| committer | 2021-05-20 20:15:20 +0000 | |
| commit | f4dab5f7693b011d9b6af301861d21398b3cfa02 (patch) | |
| tree | b705e22367d2b9870f76a92b33443cf8b90344d9 | |
| parent | 7ed7f6fb8b4184f02be710173f4ac1f76c4a46b6 (diff) | |
| parent | ab937a7145b70e218d707de3c8dd00778e4571d6 (diff) | |
Merge "Revert "Revert "Allow pulling down the status bar in visual immersive mode""" into sc-dev
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java | 28 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/DisplayPolicy.java | 9 |
2 files changed, 37 insertions, 0 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index 779ba1c6ac6d..8465889876b4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -16,6 +16,9 @@ package com.android.systemui.statusbar.phone; +import static android.view.MotionEvent.ACTION_DOWN; +import static android.view.MotionEvent.ACTION_MOVE; +import static android.view.MotionEvent.ACTION_UP; import static android.view.WindowInsets.Type.systemBars; import static com.android.systemui.ScreenDecorations.DisplayCutoutView.boundsFromDirection; @@ -29,6 +32,7 @@ import android.util.Pair; import android.view.Display; import android.view.DisplayCutout; import android.view.Gravity; +import android.view.MotionEvent; import android.view.View; import android.view.WindowInsets; import android.widget.FrameLayout; @@ -49,6 +53,8 @@ public class StatusBarWindowView extends FrameLayout { private int mRightInset = 0; private int mTopInset = 0; + private float mTouchDownY = 0; + public StatusBarWindowView(Context context, AttributeSet attrs) { super(context, attrs); } @@ -67,6 +73,28 @@ public class StatusBarWindowView extends FrameLayout { return windowInsets; } + /** + * This is specifically for pulling down the status bar as a consistent motion in the visual + * immersive mode. In the visual immersive mode, after the system detects a system gesture + * motion from the top, we show permanent bars, and then forward the touch events from the + * focused window to the status bar window. However, since the first relayed event is out of + * bound of the status bar view, in order for the touch event to be correctly dispatched down, + * we jot down the position Y of the initial touch down event, offset it to 0 in the y-axis, + * and calculate the movement based on first touch down position. + */ + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + if (ev.getAction() == ACTION_DOWN && ev.getRawY() > getHeight()) { + mTouchDownY = ev.getRawY(); + ev.setLocation(ev.getRawX(), mTopInset); + } else if (ev.getAction() == ACTION_MOVE && mTouchDownY != 0) { + ev.setLocation(ev.getRawX(), mTopInset + ev.getRawY() - mTouchDownY); + } else if (ev.getAction() == ACTION_UP) { + mTouchDownY = 0; + } + return super.dispatchTouchEvent(ev); + } + private void applyMargins() { final int count = getChildCount(); for (int i = 0; i < count; i++) { diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 30151c3cb9c2..70f2d64e89aa 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -2420,6 +2420,15 @@ public class DisplayPolicy { } else { // Restore visibilities and positions of system bars. controlTarget.showInsets(Type.statusBars() | Type.navigationBars(), false); + // To further allow the pull-down-from-the-top gesture to pull down the notification + // shade as a consistent motion, we reroute the touch events here from the currently + // touched window to the status bar after making it visible. + if (swipeTarget == mStatusBar) { + final boolean transferred = mStatusBar.transferTouch(); + if (!transferred) { + Slog.i(TAG, "Could not transfer touch to the status bar"); + } + } } mImmersiveModeConfirmation.confirmCurrentPrompt(); } |