diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java index f06447bfc5..494b953e53 100644 --- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java @@ -1124,6 +1124,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener if (target.mode == mode && target.taskInfo != null // Compare component name instead of task-id because transitions will promote // the target up to the root task while getTaskId returns the leaf. + && target.taskInfo.topActivity != null && target.taskInfo.topActivity.equals(mLauncher.getComponentName())) { return true; } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java index 5144d9a5f5..59393d7b5b 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java @@ -243,7 +243,19 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar if (!mTouchEnabled) { return true; } - mControllerCallbacks.onTouchEvent(event); + if (mIconLayoutBounds.contains((int) event.getX(), (int) event.getY())) { + // Don't allow long pressing between icons. + return true; + } + if (mControllerCallbacks.onTouchEvent(event)) { + int oldAction = event.getAction(); + try { + event.setAction(MotionEvent.ACTION_CANCEL); + return super.onTouchEvent(event); + } finally { + event.setAction(oldAction); + } + } return super.onTouchEvent(event); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java index 40b0e18d27..f1748afce3 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java @@ -223,7 +223,11 @@ public class TaskbarViewController { return view -> mControllers.taskbarStashController.updateAndAnimateIsStashedInApp(true); } - public void onTouchEvent(MotionEvent motionEvent) { + /** + * Get the first chance to handle TaskbarView#onTouchEvent, and return whether we want to + * consume the touch so TaskbarView treats it as an ACTION_CANCEL. + */ + public boolean onTouchEvent(MotionEvent motionEvent) { final float x = motionEvent.getRawX(); final float y = motionEvent.getRawY(); switch (motionEvent.getAction()) { @@ -239,6 +243,7 @@ public class TaskbarViewController { mControllers.taskbarStashController.startStashHint( /* animateForward= */ false); mCanceledStashHint = true; + return true; } break; case MotionEvent.ACTION_UP: @@ -249,6 +254,7 @@ public class TaskbarViewController { } break; } + return false; } } } diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index 6e90a3a5a7..4c46683a50 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -805,7 +805,9 @@ public abstract class AbsSwipeUpHandler, mActivityInitListener.unregister(); mStateCallback.setStateOnUiThread(STATE_GESTURE_CANCELLED | STATE_HANDLER_INVALIDATED); - TaskViewUtils.setDividerBarShown(mRecentsAnimationTargets.nonApps, true); + if (mRecentsAnimationTargets != null) { + TaskViewUtils.setDividerBarShown(mRecentsAnimationTargets.nonApps, true); + } // Defer clearing the controller and the targets until after we've updated the state mRecentsAnimationController = null; diff --git a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java index 780032e11b..0efe6666a8 100644 --- a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java +++ b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java @@ -33,11 +33,8 @@ import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; -import android.os.SystemClock; -import android.util.Log; import android.util.SparseIntArray; -import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.tracing.OverviewComponentObserverProto; import com.android.launcher3.tracing.TouchInteractionServiceProto; import com.android.launcher3.util.SimpleBroadcastReceiver; @@ -132,16 +129,6 @@ public final class OverviewComponentObserver { private void updateOverviewTargets() { ComponentName defaultHome = PackageManagerWrapper.getInstance() .getHomeActivities(new ArrayList<>()); - if (TestProtocol.sDebugTracing && defaultHome == null) { - Log.d(TestProtocol.THIRD_PARTY_LAUNCHER_NOT_SET, "getHomeActivities returned null"); - while ((defaultHome = - PackageManagerWrapper.getInstance().getHomeActivities(new ArrayList<>())) - == null) { - SystemClock.sleep(10); - } - Log.d(TestProtocol.THIRD_PARTY_LAUNCHER_NOT_SET, - "getHomeActivities returned non-null: " + defaultHome); - } mIsHomeDisabled = mDeviceState.isHomeDisabled(); mIsDefaultHome = Objects.equals(mMyHomeIntent.getComponent(), defaultHome); diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 810eccea8a..e99835e0c8 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -1351,8 +1351,10 @@ public abstract class RecentsView getHeight() - getPaddingBottom() diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 3754dc147b..94dbe00401 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -554,6 +554,14 @@ public class Launcher extends StatefulActivity implements Launche AbstractFloatingView.closeOpenViews(this, false, TYPE_ICON_SURFACE); } + @Override + public void onMultiWindowModeChanged(boolean isInMultiWindowMode, Configuration newConfig) { + super.onMultiWindowModeChanged(isInMultiWindowMode, newConfig); + // Always update device profile when multi window mode changed. + initDeviceProfile(mDeviceProfile.inv); + dispatchDeviceProfileChanged(); + } + @Override public void onConfigurationChanged(Configuration newConfig) { int diff = newConfig.diff(mOldConfig); @@ -592,11 +600,9 @@ public class Launcher extends StatefulActivity implements Launche private void initDeviceProfile(InvariantDeviceProfile idp) { // Load configuration-specific DeviceProfile - mDeviceProfile = idp.getDeviceProfile(this); - if (isInMultiWindowMode()) { - mDeviceProfile = mDeviceProfile.getMultiWindowProfile( - this, getMultiWindowDisplaySize()); - } + mDeviceProfile = isInMultiWindowMode() + ? mDeviceProfile.getMultiWindowProfile(this, getMultiWindowDisplaySize()) + : idp.getDeviceProfile(this); onDeviceProfileInitiated(); mModelWriter = mModel.getWriter(getDeviceProfile().isVerticalBarLayout(), true, this); @@ -1195,7 +1201,7 @@ public class Launcher extends StatefulActivity implements Launche // Until the workspace is bound, ensure that we keep the wallpaper offset locked to the // default state, otherwise we will update to the wrong offsets in RTL mWorkspace.lockWallpaperToDefaultPage(); - mWorkspace.bindAndInitFirstWorkspaceScreen(null /* recycled qsb */); + mWorkspace.bindAndInitFirstWorkspaceScreen(); mDragController.addDragListener(mWorkspace); // Get the search/delete/uninstall bar diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index 696e89716f..2f9b5af050 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -1046,7 +1046,7 @@ public abstract class PagedView extends ViewGrou /** * If being flinged and user touches the screen, initiate drag; otherwise don't. */ - private void updateIsBeingDraggedOnTouchDown(MotionEvent ev) { + protected void updateIsBeingDraggedOnTouchDown(MotionEvent ev) { // mScroller.isFinished should be false when being flinged. final int xDist = Math.abs(mScroller.getFinalX() - mScroller.getCurrX()); final boolean finishedScrolling = (mScroller.isFinished() || xDist < mPageSlop / 3); diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 94ec903b86..b197e1cb08 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -223,6 +223,9 @@ public class Workspace extends PagedView // Variables relating to touch disambiguation (scrolling workspace vs. scrolling a widget) private float mXDown; private float mYDown; + private View mQsb; + private boolean mIsEventOverQsb; + final static float START_DAMPING_TOUCH_SLOP_ANGLE = (float) Math.PI / 6; final static float MAX_SWIPE_ANGLE = (float) Math.PI / 3; final static float TOUCH_SLOP_DAMPING_FACTOR = 4; @@ -548,9 +551,8 @@ public class Workspace extends PagedView /** * Initializes and binds the first page - * @param qsb an existing qsb to recycle or null. */ - public void bindAndInitFirstWorkspaceScreen(View qsb) { + public void bindAndInitFirstWorkspaceScreen() { if (!FeatureFlags.QSB_ON_FIRST_SCREEN) { return; } @@ -558,10 +560,10 @@ public class Workspace extends PagedView // Add the first page CellLayout firstPage = insertNewWorkspaceScreen(Workspace.FIRST_SCREEN_ID, getChildCount()); // Always add a QSB on the first screen. - if (qsb == null) { + if (mQsb == null) { // In transposed layout, we add the QSB in the Grid. As workspace does not touch the // edges, we do not need a full width QSB. - qsb = LayoutInflater.from(getContext()) + mQsb = LayoutInflater.from(getContext()) .inflate(R.layout.search_container_workspace, firstPage, false); } @@ -570,8 +572,9 @@ public class Workspace extends PagedView CellLayout.LayoutParams lp = new CellLayout.LayoutParams(0, 0, firstPage.getCountX(), cellVSpan); lp.canReorder = false; - if (!firstPage.addViewToCellLayout(qsb, 0, R.id.search_container_workspace, lp, true)) { + if (!firstPage.addViewToCellLayout(mQsb, 0, R.id.search_container_workspace, lp, true)) { Log.e(TAG, "Failed to add to item at (0, 0) to CellLayout"); + mQsb = null; } } @@ -581,9 +584,8 @@ public class Workspace extends PagedView disableLayoutTransitions(); // Recycle the QSB widget - View qsb = findViewById(R.id.search_container_workspace); - if (qsb != null) { - ((ViewGroup) qsb.getParent()).removeView(qsb); + if (mQsb != null) { + ((ViewGroup) mQsb.getParent()).removeView(mQsb); } // Remove the pages and clear the screen models @@ -596,7 +598,7 @@ public class Workspace extends PagedView mLauncher.mHandler.removeCallbacksAndMessages(DeferredWidgetRefresh.class); // Ensure that the first page is always present - bindAndInitFirstWorkspaceScreen(qsb); + bindAndInitFirstWorkspaceScreen(); // Re-enable the layout transitions enableLayoutTransitions(); @@ -922,17 +924,25 @@ public class Workspace extends PagedView } @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) { - mXDown = ev.getX(); - mYDown = ev.getY(); + protected void updateIsBeingDraggedOnTouchDown(MotionEvent ev) { + super.updateIsBeingDraggedOnTouchDown(ev); + + mXDown = ev.getX(); + mYDown = ev.getY(); + if (mQsb != null) { + mTempFXY[0] = mXDown + getScrollX(); + mTempFXY[1] = mYDown + getScrollY(); + Utilities.mapCoordInSelfToDescendant(mQsb, this, mTempFXY); + mIsEventOverQsb = mQsb.getLeft() <= mTempFXY[0] && mQsb.getRight() >= mTempFXY[0] + && mQsb.getTop() <= mTempFXY[1] && mQsb.getBottom() >= mTempFXY[1]; + } else { + mIsEventOverQsb = false; } - return super.onInterceptTouchEvent(ev); } @Override protected void determineScrollingStart(MotionEvent ev) { - if (!isFinishedSwitchingState()) return; + if (!isFinishedSwitchingState() || mIsEventOverQsb) return; float deltaX = ev.getX() - mXDown; float absDeltaX = Math.abs(deltaX); diff --git a/src/com/android/launcher3/testing/TestProtocol.java b/src/com/android/launcher3/testing/TestProtocol.java index c4848112ef..42a38b6271 100644 --- a/src/com/android/launcher3/testing/TestProtocol.java +++ b/src/com/android/launcher3/testing/TestProtocol.java @@ -117,7 +117,6 @@ public final class TestProtocol { public static final String PERMANENT_DIAG_TAG = "TaplTarget"; public static final String WORK_PROFILE_REMOVED = "b/159671700"; public static final String FALLBACK_ACTIVITY_NO_SET = "b/181019015"; - public static final String THIRD_PARTY_LAUNCHER_NOT_SET = "b/187080582"; public static final String TASK_VIEW_ID_CRASH = "b/195430732"; public static final String L3_SWIPE_TO_HOME = "b/192018189"; }