Merge "Allow pulling down the status bar in visual immersive mode" into sc-dev am: 6b78883298

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13513299

Change-Id: I21785a24b4711ec49cf22b6be7cc4c19177c8c2b
This commit is contained in:
Tracy Zhou
2021-05-14 08:15:41 +00:00
committed by Automerger Merge Worker
2 changed files with 37 additions and 0 deletions

View File

@@ -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++) {

View File

@@ -2424,6 +2424,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();
}