Merge "Enabling quick-switch gesture in landscape mode (2 button UI)" into ub-launcher3-qt-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
943ce93bd5
+19
-31
@@ -35,19 +35,15 @@ import android.content.Context;
|
||||
import android.content.ContextWrapper;
|
||||
import android.content.Intent;
|
||||
import android.graphics.PointF;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.view.Display;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.Surface;
|
||||
import android.view.VelocityTracker;
|
||||
import android.view.ViewConfiguration;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import androidx.annotation.UiThread;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.util.Preconditions;
|
||||
import com.android.launcher3.util.RaceConditionTracker;
|
||||
@@ -62,10 +58,11 @@ import com.android.systemui.shared.system.BackgroundExecutor;
|
||||
import com.android.systemui.shared.system.InputConsumerController;
|
||||
import com.android.systemui.shared.system.InputMonitorCompat;
|
||||
import com.android.systemui.shared.system.QuickStepContract;
|
||||
import com.android.systemui.shared.system.WindowManagerWrapper;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import androidx.annotation.UiThread;
|
||||
|
||||
/**
|
||||
* Input consumer for handling events originating from an activity other than Launcher
|
||||
*/
|
||||
@@ -81,14 +78,12 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC
|
||||
private final Intent mHomeIntent;
|
||||
private final ActivityControlHelper mActivityControlHelper;
|
||||
private final OverviewCallbacks mOverviewCallbacks;
|
||||
private final TaskOverlayFactory mTaskOverlayFactory;
|
||||
private final InputConsumerController mInputConsumer;
|
||||
private final SwipeSharedState mSwipeSharedState;
|
||||
private final InputMonitorCompat mInputMonitorCompat;
|
||||
private final SysUINavigationMode.Mode mMode;
|
||||
|
||||
private final int mDisplayRotation;
|
||||
private final Rect mStableInsets = new Rect();
|
||||
|
||||
private final Consumer<OtherActivityInputConsumer> mOnCompleteCallback;
|
||||
private final MotionPauseDetector mMotionPauseDetector;
|
||||
@@ -123,7 +118,7 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC
|
||||
public OtherActivityInputConsumer(Context base, RunningTaskInfo runningTaskInfo,
|
||||
RecentsModel recentsModel, Intent homeIntent, ActivityControlHelper activityControl,
|
||||
boolean isDeferredDownTarget, OverviewCallbacks overviewCallbacks,
|
||||
TaskOverlayFactory taskOverlayFactory, InputConsumerController inputConsumer,
|
||||
InputConsumerController inputConsumer,
|
||||
Consumer<OtherActivityInputConsumer> onCompleteCallback,
|
||||
SwipeSharedState swipeSharedState, InputMonitorCompat inputMonitorCompat) {
|
||||
super(base);
|
||||
@@ -145,14 +140,10 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC
|
||||
boolean continuingPreviousGesture = swipeSharedState.getActiveListener() != null;
|
||||
mIsDeferredDownTarget = !continuingPreviousGesture && isDeferredDownTarget;
|
||||
mOverviewCallbacks = overviewCallbacks;
|
||||
mTaskOverlayFactory = taskOverlayFactory;
|
||||
mInputConsumer = inputConsumer;
|
||||
mSwipeSharedState = swipeSharedState;
|
||||
|
||||
Display display = getSystemService(WindowManager.class).getDefaultDisplay();
|
||||
mDisplayRotation = display.getRotation();
|
||||
WindowManagerWrapper.getInstance().getStableInsets(mStableInsets);
|
||||
|
||||
mDisplayRotation = getSystemService(WindowManager.class).getDefaultDisplay().getRotation();
|
||||
mDragSlop = QuickStepContract.getQuickStepDragSlopPx();
|
||||
mTouchSlop = QuickStepContract.getQuickStepTouchSlopPx();
|
||||
|
||||
@@ -171,16 +162,15 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC
|
||||
}
|
||||
|
||||
// Proxy events to recents view
|
||||
if (!isNavBarOnLeft() && !isNavBarOnRight()) {
|
||||
if (mPassedDragSlop && mInteractionHandler != null
|
||||
&& !mRecentsViewDispatcher.hasConsumer()) {
|
||||
mRecentsViewDispatcher.setConsumer(mInteractionHandler.getRecentsViewDispatcher());
|
||||
}
|
||||
int edgeFlags = ev.getEdgeFlags();
|
||||
ev.setEdgeFlags(edgeFlags | EDGE_NAV_BAR);
|
||||
mRecentsViewDispatcher.dispatchEvent(ev);
|
||||
ev.setEdgeFlags(edgeFlags);
|
||||
if (mPassedDragSlop && mInteractionHandler != null
|
||||
&& !mRecentsViewDispatcher.hasConsumer()) {
|
||||
mRecentsViewDispatcher.setConsumer(mInteractionHandler
|
||||
.getRecentsViewDispatcher(isNavBarOnLeft() || isNavBarOnRight()));
|
||||
}
|
||||
int edgeFlags = ev.getEdgeFlags();
|
||||
ev.setEdgeFlags(edgeFlags | EDGE_NAV_BAR);
|
||||
mRecentsViewDispatcher.dispatchEvent(ev);
|
||||
ev.setEdgeFlags(edgeFlags);
|
||||
|
||||
mVelocityTracker.addMovement(ev);
|
||||
if (ev.getActionMasked() == ACTION_POINTER_UP) {
|
||||
@@ -302,13 +292,11 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC
|
||||
}
|
||||
|
||||
private boolean isNavBarOnRight() {
|
||||
return SysUINavigationMode.INSTANCE.get(getBaseContext()).getMode() != NO_BUTTON
|
||||
&& mDisplayRotation == Surface.ROTATION_90 && mStableInsets.right > 0;
|
||||
return mMode != NO_BUTTON && mDisplayRotation == Surface.ROTATION_90;
|
||||
}
|
||||
|
||||
private boolean isNavBarOnLeft() {
|
||||
return SysUINavigationMode.INSTANCE.get(getBaseContext()).getMode() != NO_BUTTON
|
||||
&& mDisplayRotation == Surface.ROTATION_270 && mStableInsets.left > 0;
|
||||
return mMode != NO_BUTTON && mDisplayRotation == Surface.ROTATION_270;
|
||||
}
|
||||
|
||||
private void startTouchTrackingForWindowAnimation(long touchTimeMs) {
|
||||
@@ -414,13 +402,13 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC
|
||||
}
|
||||
|
||||
private float getDisplacement(MotionEvent ev) {
|
||||
float eventX = ev.getX();
|
||||
float eventY = ev.getY();
|
||||
float displacement = eventY - mDownPos.y;
|
||||
final float displacement;
|
||||
if (isNavBarOnRight()) {
|
||||
displacement = eventX - mDownPos.x;
|
||||
displacement = ev.getX() - mDownPos.x;
|
||||
} else if (isNavBarOnLeft()) {
|
||||
displacement = mDownPos.x - eventX;
|
||||
displacement = mDownPos.x - ev.getX();
|
||||
} else {
|
||||
displacement = ev.getY() - mDownPos.y;
|
||||
}
|
||||
return displacement;
|
||||
}
|
||||
|
||||
+2
-2
@@ -492,8 +492,8 @@ public class TouchInteractionService extends Service implements
|
||||
boolean shouldDefer = activityControl.deferStartingActivity(mActiveNavBarRegion, event);
|
||||
return new OtherActivityInputConsumer(this, runningTaskInfo, mRecentsModel,
|
||||
mOverviewComponentObserver.getOverviewIntent(), activityControl,
|
||||
shouldDefer, mOverviewCallbacks, mTaskOverlayFactory, mInputConsumer,
|
||||
this::onConsumerInactive, mSwipeSharedState, mInputMonitorCompat);
|
||||
shouldDefer, mOverviewCallbacks, mInputConsumer, this::onConsumerInactive,
|
||||
mSwipeSharedState, mInputMonitorCompat);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+2
-2
@@ -531,8 +531,8 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
|
||||
return TaskView.getCurveScaleForInterpolation(interpolation);
|
||||
}
|
||||
|
||||
public Consumer<MotionEvent> getRecentsViewDispatcher() {
|
||||
return mRecentsView != null ? mRecentsView::dispatchTouchEvent : null;
|
||||
public Consumer<MotionEvent> getRecentsViewDispatcher(boolean isTransposed) {
|
||||
return mRecentsView != null ? mRecentsView.getEventDispatcher(isTransposed) : null;
|
||||
}
|
||||
|
||||
@UiThread
|
||||
|
||||
@@ -45,6 +45,7 @@ import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Matrix;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
@@ -70,9 +71,6 @@ import android.view.accessibility.AccessibilityEvent;
|
||||
import android.view.accessibility.AccessibilityNodeInfo;
|
||||
import android.widget.ListView;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.dynamicanimation.animation.SpringForce;
|
||||
|
||||
import com.android.launcher3.BaseActivity;
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.Insettable;
|
||||
@@ -111,6 +109,9 @@ import com.android.systemui.shared.system.TaskStackChangeListener;
|
||||
import java.util.ArrayList;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.dynamicanimation.animation.SpringForce;
|
||||
|
||||
/**
|
||||
* A list of recent tasks.
|
||||
*/
|
||||
@@ -1639,4 +1640,26 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
|
||||
public ClearAllButton getClearAllButton() {
|
||||
return mClearAllButton;
|
||||
}
|
||||
|
||||
public Consumer<MotionEvent> getEventDispatcher(boolean isTransposed) {
|
||||
if (isTransposed) {
|
||||
Matrix transform = new Matrix();
|
||||
transform.setRotate(90);
|
||||
|
||||
if (getWidth() > 0 && getHeight() > 0) {
|
||||
float scale = ((float) getWidth()) / getHeight();
|
||||
transform.postScale(scale, 1 / scale);
|
||||
}
|
||||
|
||||
Matrix inverse = new Matrix();
|
||||
transform.invert(inverse);
|
||||
return e -> {
|
||||
e.transform(transform);
|
||||
super.onTouchEvent(e);
|
||||
e.transform(inverse);
|
||||
};
|
||||
} else {
|
||||
return super::onTouchEvent;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1088,10 +1088,8 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent ev) {
|
||||
super.onTouchEvent(ev);
|
||||
|
||||
// Skip touch handling if there are no pages to swipe
|
||||
if (getChildCount() <= 0) return super.onTouchEvent(ev);
|
||||
if (getChildCount() <= 0) return false;
|
||||
|
||||
acquireVelocityTrackerAndAddMovement(ev);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user