Merge changes from topic "grid-size-migration" into ub-launcher3-rvc-dev
* changes:
fix GridBackupTableTest in comply with grid size migration
Turn on V2 migration algorithm feature flag
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/AppWindowAnimationHelper.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/AppWindowAnimationHelper.java
index 9309110..5abbd86 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/AppWindowAnimationHelper.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/AppWindowAnimationHelper.java
@@ -208,7 +208,6 @@
float alpha;
float cornerRadius = 0f;
float scale = Math.max(mCurrentRect.width(), mTargetRect.width()) / crop.width();
- int layer = RemoteAnimationProvider.getLayer(app, mBoostModeTargetLayers);
if (app.mode == params.mTargetSet.targetMode) {
alpha = mTaskAlphaCallback.getAlpha(app, params.mTargetAlpha);
if (app.activityType != RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) {
@@ -245,13 +244,11 @@
alpha = mBaseAlphaCallback.getAlpha(app, progress);
if (ENABLE_QUICKSTEP_LIVE_TILE.get() && params.mLauncherOnTop) {
crop = null;
- layer = Integer.MAX_VALUE;
}
}
builder.withAlpha(alpha)
.withMatrix(mTmpMatrix)
.withWindowCrop(crop)
- .withLayer(layer)
// Since radius is in Surface space, but we draw the rounded corners in screen
// space, we have to undo the scale
.withCornerRadius(cornerRadius / scale);
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskMenuView.java
index 80022b4..9b47520 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskMenuView.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskMenuView.java
@@ -40,6 +40,7 @@
import com.android.launcher3.anim.Interpolators;
import com.android.launcher3.anim.RoundedRectRevealOutlineProvider;
import com.android.launcher3.popup.SystemShortcut;
+import com.android.launcher3.touch.PagedOrientationHandler;
import com.android.launcher3.util.Themes;
import com.android.launcher3.views.BaseDragLayer;
import com.android.quickstep.TaskOverlayFactory;
@@ -150,9 +151,26 @@
return (type & TYPE_TASK_MENU) != 0;
}
- public void setPosition(float x, float y) {
- setX(x);
- setY(y + mThumbnailTopMargin);
+ public void setPosition(float x, float y, PagedOrientationHandler pagedOrientationHandler) {
+ float adjustedY = y + mThumbnailTopMargin;
+ // Changing pivot to make computations easier
+ // NOTE: Changing the pivots means the rotated view gets rotated about the new pivots set,
+ // which would render the X and Y position set here incorrect
+ setPivotX(0);
+ setPivotY(0);
+ setRotation(pagedOrientationHandler.getDegreesRotated());
+ setX(pagedOrientationHandler.getTaskMenuX(x, mTaskView.getThumbnail()));
+ setY(pagedOrientationHandler.getTaskMenuY(adjustedY, mTaskView.getThumbnail()));
+ }
+
+ public void onRotationChanged() {
+ if (mOpenCloseAnimator != null && mOpenCloseAnimator.isRunning()) {
+ mOpenCloseAnimator.end();
+ }
+ if (mIsOpen) {
+ mOptionLayout.removeAllViews();
+ populateAndLayoutMenu();
+ }
}
public static TaskMenuView showForTask(TaskView taskView) {
@@ -168,12 +186,16 @@
}
mActivity.getDragLayer().addView(this);
mTaskView = taskView;
- addMenuOptions(mTaskView);
- orientAroundTaskView(mTaskView);
+ populateAndLayoutMenu();
post(this::animateOpen);
return true;
}
+ private void populateAndLayoutMenu() {
+ addMenuOptions(mTaskView);
+ orientAroundTaskView(mTaskView);
+ }
+
private void addMenuOptions(TaskView taskView) {
Drawable icon = taskView.getTask().icon.getConstantState().newDrawable();
mTaskIcon.setDrawable(icon);
@@ -200,21 +222,26 @@
R.layout.task_view_menu_option, this, false);
menuOption.setIconAndLabelFor(
menuOptionView.findViewById(R.id.icon), menuOptionView.findViewById(R.id.text));
+ LayoutParams lp = (LayoutParams) menuOptionView.getLayoutParams();
+ mTaskView.getPagedOrientationHandler().setLayoutParamsForTaskMenuOptionItem(lp);
menuOptionView.setOnClickListener(menuOption);
mOptionLayout.addView(menuOptionView);
}
private void orientAroundTaskView(TaskView taskView) {
+ PagedOrientationHandler orientationHandler = taskView.getPagedOrientationHandler();
measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
mActivity.getDragLayer().getDescendantRectRelativeToSelf(taskView, sTempRect);
Rect insets = mActivity.getDragLayer().getInsets();
BaseDragLayer.LayoutParams params = (BaseDragLayer.LayoutParams) getLayoutParams();
- params.width = taskView.getMeasuredWidth();
+ params.width = orientationHandler.getTaskMenuWidth(taskView.getThumbnail());
params.gravity = Gravity.START;
setLayoutParams(params);
setScaleX(taskView.getScaleX());
setScaleY(taskView.getScaleY());
- setPosition(sTempRect.left - insets.left, sTempRect.top - insets.top);
+ mOptionLayout.setOrientation(orientationHandler.getTaskMenuLayoutOrientation());
+ setPosition(sTempRect.left - insets.left, sTempRect.top - insets.top,
+ taskView.getPagedOrientationHandler());
}
private void animateOpen() {
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java
index 12ef521..3cd2b32 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java
@@ -473,6 +473,7 @@
int iconRotation = orientationState.getTouchRotation();
PagedOrientationHandler orientationHandler = orientationState.getOrientationHandler();
boolean isRtl = orientationHandler.getRecentsRtlSetting(getResources());
+ LayoutParams snapshotParams = (LayoutParams) mSnapshotView.getLayoutParams();
int thumbnailPadding = (int) getResources().getDimension(R.dimen.task_thumbnail_top_margin);
LayoutParams iconParams = (LayoutParams) mIconView.getLayoutParams();
int rotation = orientationState.getTouchRotationDegrees();
@@ -480,7 +481,8 @@
case Surface.ROTATION_90:
iconParams.gravity = (isRtl ? END : START) | CENTER_VERTICAL;
iconParams.rightMargin = -thumbnailPadding;
- iconParams.leftMargin = iconParams.topMargin = iconParams.bottomMargin = 0;
+ iconParams.leftMargin = 0;
+ iconParams.topMargin = snapshotParams.topMargin / 2;
break;
case Surface.ROTATION_180:
iconParams.gravity = BOTTOM | CENTER_HORIZONTAL;
@@ -490,17 +492,21 @@
case Surface.ROTATION_270:
iconParams.gravity = (isRtl ? END : START) | CENTER_VERTICAL;
iconParams.leftMargin = -thumbnailPadding;
- iconParams.rightMargin = iconParams.topMargin = iconParams.bottomMargin = 0;
+ iconParams.rightMargin = 0;
+ iconParams.topMargin = snapshotParams.topMargin / 2;
break;
case Surface.ROTATION_0:
default:
iconParams.gravity = TOP | CENTER_HORIZONTAL;
- iconParams.leftMargin = iconParams.topMargin = iconParams.rightMargin =
- iconParams.bottomMargin = 0;
+ iconParams.leftMargin = iconParams.topMargin = iconParams.rightMargin = 0;
break;
}
mIconView.setLayoutParams(iconParams);
mIconView.setRotation(rotation);
+
+ if (mMenuView != null) {
+ mMenuView.onRotationChanged();
+ }
}
private void setIconAndDimTransitionProgress(float progress, boolean invert) {
@@ -607,7 +613,10 @@
}
if (mMenuView != null) {
- mMenuView.setPosition(getX() - getRecentsView().getScrollX(), getY());
+ PagedOrientationHandler pagedOrientationHandler = getPagedOrientationHandler();
+ RecentsView recentsView = getRecentsView();
+ mMenuView.setPosition(getX() - recentsView.getScrollX(),
+ getY() - recentsView.getScrollY(), pagedOrientationHandler);
mMenuView.setScaleX(getScaleX());
mMenuView.setScaleY(getScaleY());
}
@@ -932,6 +941,10 @@
return (RecentsView) getParent();
}
+ PagedOrientationHandler getPagedOrientationHandler() {
+ return getRecentsView().mOrientationState.getOrientationHandler();
+ }
+
public void notifyTaskLaunchFailed(String tag) {
String msg = "Failed to launch task";
if (mTask != null) {
diff --git a/quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java
index 70cbd82..1cb0aa4 100644
--- a/quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java
+++ b/quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java
@@ -611,7 +611,6 @@
.withWindowCrop(target.screenSpaceBounds)
.withAlpha(1f);
}
- builder.withLayer(RemoteAnimationProvider.getLayer(target, MODE_OPENING));
params[i] = builder.build();
}
surfaceApplier.scheduleApply(params);
@@ -718,7 +717,6 @@
params[i] = new SurfaceParams.Builder(target.leash)
.withAlpha(1f)
.withWindowCrop(target.screenSpaceBounds)
- .withLayer(RemoteAnimationProvider.getLayer(target, MODE_OPENING))
.withCornerRadius(cornerRadius)
.build();
}
@@ -775,7 +773,6 @@
}
params[i] = builder
.withWindowCrop(target.screenSpaceBounds)
- .withLayer(RemoteAnimationProvider.getLayer(target, MODE_CLOSING))
.build();
}
surfaceApplier.scheduleApply(params);
diff --git a/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java
index d58ab5d..ff98701 100644
--- a/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java
+++ b/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java
@@ -22,6 +22,7 @@
import com.android.launcher3.R;
import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureResult;
+import com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult;
/** A {@link TutorialController} for the Back tutorial. */
final class BackGestureTutorialController extends TutorialController {
@@ -114,4 +115,13 @@
break;
}
}
+
+ @Override
+ public void onNavBarGestureAttempted(NavBarGestureResult result) {
+ if (mTutorialType == BACK_NAVIGATION_COMPLETE) {
+ if (result == NavBarGestureResult.HOME_GESTURE_COMPLETED) {
+ mTutorialFragment.closeTutorial();
+ }
+ }
+ }
}
diff --git a/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java
index 0bf996d..95b3c79 100644
--- a/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java
+++ b/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java
@@ -21,6 +21,7 @@
import com.android.launcher3.R;
import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureResult;
+import com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult;
/** A {@link TutorialController} for the Home tutorial. */
final class HomeGestureTutorialController extends TutorialController {
@@ -82,4 +83,21 @@
break;
}
}
+
+ @Override
+ public void onNavBarGestureAttempted(NavBarGestureResult result) {
+ switch (mTutorialType) {
+ case HOME_NAVIGATION:
+ if (result == NavBarGestureResult.HOME_GESTURE_COMPLETED) {
+ hideHandCoachingAnimation();
+ mTutorialFragment.changeController(HOME_NAVIGATION_COMPLETE);
+ }
+ break;
+ case HOME_NAVIGATION_COMPLETE:
+ if (result == NavBarGestureResult.HOME_GESTURE_COMPLETED) {
+ mTutorialFragment.closeTutorial();
+ }
+ break;
+ }
+ }
}
diff --git a/quickstep/src/com/android/quickstep/interaction/NavBarGestureHandler.java b/quickstep/src/com/android/quickstep/interaction/NavBarGestureHandler.java
new file mode 100644
index 0000000..6d8caa2
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/interaction/NavBarGestureHandler.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep.interaction;
+
+import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.HOME_GESTURE_COMPLETED;
+import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.HOME_NOT_STARTED_TOO_FAR_FROM_EDGE;
+import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.HOME_OR_OVERVIEW_NOT_STARTED_WRONG_SWIPE_DIRECTION;
+import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.OVERVIEW_GESTURE_COMPLETED;
+import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.OVERVIEW_NOT_STARTED_TOO_FAR_FROM_EDGE;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Point;
+import android.view.Display;
+import android.view.MotionEvent;
+import android.view.Surface;
+import android.view.View;
+import android.view.View.OnTouchListener;
+
+import com.android.launcher3.ResourceUtils;
+import com.android.quickstep.SysUINavigationMode.Mode;
+import com.android.quickstep.util.NavBarPosition;
+import com.android.quickstep.util.TriggerSwipeUpTouchTracker;
+
+/** Utility class to handle home gestures. */
+public class NavBarGestureHandler implements OnTouchListener {
+
+ private static final String LOG_TAG = "NavBarGestureHandler";
+
+ private final Point mDisplaySize = new Point();
+ private final TriggerSwipeUpTouchTracker mSwipeUpTouchTracker;
+ private int mBottomGestureHeight;
+ private boolean mTouchCameFromNavBar;
+ private NavBarGestureAttemptCallback mGestureCallback;
+
+ NavBarGestureHandler(Context context) {
+ final Display display = context.getDisplay();
+ final int displayRotation;
+ if (display == null) {
+ displayRotation = Surface.ROTATION_0;
+ } else {
+ displayRotation = display.getRotation();
+ display.getRealSize(mDisplaySize);
+ }
+ mSwipeUpTouchTracker =
+ new TriggerSwipeUpTouchTracker(context, true /*disableHorizontalSwipe*/,
+ new NavBarPosition(Mode.NO_BUTTON, displayRotation),
+ null /*onInterceptTouch*/, this::onSwipeUp);
+
+ final Resources resources = context.getResources();
+ mBottomGestureHeight =
+ ResourceUtils.getNavbarSize(ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE, resources);
+ }
+
+ void registerNavBarGestureAttemptCallback(NavBarGestureAttemptCallback callback) {
+ mGestureCallback = callback;
+ }
+
+ void unregisterNavBarGestureAttemptCallback() {
+ mGestureCallback = null;
+ }
+
+ private void onSwipeUp(boolean wasFling) {
+ if (mGestureCallback == null) {
+ return;
+ }
+ if (mTouchCameFromNavBar) {
+ mGestureCallback.onNavBarGestureAttempted(wasFling
+ ? HOME_GESTURE_COMPLETED : OVERVIEW_GESTURE_COMPLETED);
+ } else {
+ mGestureCallback.onNavBarGestureAttempted(wasFling
+ ? HOME_NOT_STARTED_TOO_FAR_FROM_EDGE : OVERVIEW_NOT_STARTED_TOO_FAR_FROM_EDGE);
+ }
+ }
+
+ @Override
+ public boolean onTouch(View view, MotionEvent motionEvent) {
+ int action = motionEvent.getAction();
+ boolean intercepted = mSwipeUpTouchTracker.interceptedTouch();
+ if (action == MotionEvent.ACTION_DOWN) {
+ mTouchCameFromNavBar = motionEvent.getRawY() >= mDisplaySize.y - mBottomGestureHeight;
+ mSwipeUpTouchTracker.init();
+ } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
+ if (mGestureCallback != null && !intercepted && mTouchCameFromNavBar) {
+ mGestureCallback.onNavBarGestureAttempted(
+ HOME_OR_OVERVIEW_NOT_STARTED_WRONG_SWIPE_DIRECTION);
+ intercepted = true;
+ }
+ }
+ mSwipeUpTouchTracker.onMotionEvent(motionEvent);
+ return intercepted;
+ }
+
+ enum NavBarGestureResult {
+ UNKNOWN,
+ HOME_GESTURE_COMPLETED,
+ OVERVIEW_GESTURE_COMPLETED,
+ HOME_NOT_STARTED_TOO_FAR_FROM_EDGE,
+ OVERVIEW_NOT_STARTED_TOO_FAR_FROM_EDGE,
+ HOME_OR_OVERVIEW_NOT_STARTED_WRONG_SWIPE_DIRECTION // Side swipe on nav bar.
+ }
+
+ /** Callback to let the UI react to attempted nav bar gestures. */
+ interface NavBarGestureAttemptCallback {
+ /** Called whenever any touch is completed. */
+ void onNavBarGestureAttempted(NavBarGestureResult result);
+ }
+}
diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialController.java b/quickstep/src/com/android/quickstep/interaction/TutorialController.java
index f0cb567..69c61ce 100644
--- a/quickstep/src/com/android/quickstep/interaction/TutorialController.java
+++ b/quickstep/src/com/android/quickstep/interaction/TutorialController.java
@@ -26,9 +26,11 @@
import androidx.annotation.Nullable;
import com.android.launcher3.R;
-import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureResult;
+import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureAttemptCallback;
+import com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureAttemptCallback;
-abstract class TutorialController {
+abstract class TutorialController implements BackGestureAttemptCallback,
+ NavBarGestureAttemptCallback {
final TutorialFragment mTutorialFragment;
final TutorialType mTutorialType;
@@ -58,8 +60,6 @@
mActionButton = rootView.findViewById(R.id.gesture_tutorial_fragment_action_button);
}
- abstract void onBackGestureAttempted(BackGestureResult result);
-
@Nullable
Integer getTitleStringId() {
return null;
@@ -86,6 +86,7 @@
void hideHandCoachingAnimation() {
mHandCoachingAnimation.stop();
+ mHandCoachingView.setVisibility(View.INVISIBLE);
}
@CallSuper
diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java b/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java
index 6346a9b..3d02525 100644
--- a/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java
+++ b/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java
@@ -21,7 +21,9 @@
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
+import android.view.MotionEvent;
import android.view.View;
+import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.WindowInsets;
@@ -31,13 +33,11 @@
import androidx.fragment.app.FragmentActivity;
import com.android.launcher3.R;
-import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureAttemptCallback;
-import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureResult;
import com.android.quickstep.interaction.TutorialController.TutorialType;
import java.net.URISyntaxException;
-abstract class TutorialFragment extends Fragment implements BackGestureAttemptCallback {
+abstract class TutorialFragment extends Fragment implements OnTouchListener {
private static final String LOG_TAG = "TutorialFragment";
private static final String SYSTEM_NAVIGATION_SETTING_INTENT =
@@ -52,6 +52,7 @@
View mRootView;
TutorialHandAnimation mHandCoachingAnimation;
EdgeBackGestureHandler mEdgeBackGestureHandler;
+ NavBarGestureHandler mNavBarGestureHandler;
public static TutorialFragment newInstance(TutorialType tutorialType) {
TutorialFragment fragment = getFragmentForTutorialType(tutorialType);
@@ -91,13 +92,14 @@
Bundle args = savedInstanceState != null ? savedInstanceState : getArguments();
mTutorialType = (TutorialType) args.getSerializable(KEY_TUTORIAL_TYPE);
mEdgeBackGestureHandler = new EdgeBackGestureHandler(getContext());
- mEdgeBackGestureHandler.registerBackGestureAttemptCallback(this);
+ mNavBarGestureHandler = new NavBarGestureHandler(getContext());
}
@Override
public void onDestroy() {
super.onDestroy();
mEdgeBackGestureHandler.unregisterBackGestureAttemptCallback();
+ mNavBarGestureHandler.unregisterNavBarGestureAttemptCallback();
}
@Override
@@ -111,7 +113,7 @@
mEdgeBackGestureHandler.setInsets(systemInsets.left, systemInsets.right);
return insets;
});
- mRootView.setOnTouchListener(mEdgeBackGestureHandler);
+ mRootView.setOnTouchListener(this);
mHandCoachingAnimation = new TutorialHandAnimation(getContext(), mRootView,
getHandAnimationResId());
return mRootView;
@@ -129,6 +131,13 @@
mHandCoachingAnimation.stop();
}
+ @Override
+ public boolean onTouch(View view, MotionEvent motionEvent) {
+ // Note: Using logical or to ensure both functions get called.
+ return mEdgeBackGestureHandler.onTouch(view, motionEvent)
+ | mNavBarGestureHandler.onTouch(view, motionEvent);
+ }
+
void onAttachedToWindow() {
mEdgeBackGestureHandler.setViewGroupParent((ViewGroup) getRootView());
}
@@ -140,6 +149,8 @@
void changeController(TutorialType tutorialType) {
mTutorialController = createController(tutorialType);
mTutorialController.transitToController();
+ mEdgeBackGestureHandler.registerBackGestureAttemptCallback(mTutorialController);
+ mNavBarGestureHandler.registerNavBarGestureAttemptCallback(mTutorialController);
mTutorialType = tutorialType;
}
@@ -157,13 +168,6 @@
return mHandCoachingAnimation;
}
- @Override
- public void onBackGestureAttempted(BackGestureResult result) {
- if (mTutorialController != null) {
- mTutorialController.onBackGestureAttempted(result);
- }
- }
-
void closeTutorial() {
FragmentActivity activity = getActivity();
if (activity != null) {
diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialHandAnimation.java b/quickstep/src/com/android/quickstep/interaction/TutorialHandAnimation.java
index 5362aaf..c810e43 100644
--- a/quickstep/src/com/android/quickstep/interaction/TutorialHandAnimation.java
+++ b/quickstep/src/com/android/quickstep/interaction/TutorialHandAnimation.java
@@ -45,6 +45,7 @@
/** [Re]starts animation for the given tutorial. */
void startLoopedAnimation(TutorialType tutorialType) {
+ mHandCoachingView.setVisibility(View.VISIBLE);
if (mGestureAnimation.isRunning()) {
stop();
}
diff --git a/quickstep/src/com/android/quickstep/util/NavBarPosition.java b/quickstep/src/com/android/quickstep/util/NavBarPosition.java
index 74e6b29..0a98e1b 100644
--- a/quickstep/src/com/android/quickstep/util/NavBarPosition.java
+++ b/quickstep/src/com/android/quickstep/util/NavBarPosition.java
@@ -35,6 +35,11 @@
mDisplayRotation = info.rotation;
}
+ public NavBarPosition(SysUINavigationMode.Mode mode, int displayRotation) {
+ mMode = mode;
+ mDisplayRotation = displayRotation;
+ }
+
public boolean isRightEdge() {
return mMode != NO_BUTTON && mDisplayRotation == Surface.ROTATION_90;
}
diff --git a/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java b/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java
index 21b97ec..4cd0206 100644
--- a/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java
+++ b/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java
@@ -62,15 +62,12 @@
static void prepareTargetsForFirstFrame(RemoteAnimationTargetCompat[] targets,
TransactionCompat t, int boostModeTargets) {
for (RemoteAnimationTargetCompat target : targets) {
- t.setLayer(target.leash, getLayer(target, boostModeTargets));
t.show(target.leash);
}
}
public static int getLayer(RemoteAnimationTargetCompat target, int boostModeTarget) {
- return target.mode == boostModeTarget
- ? Z_BOOST_BASE + target.prefixOrderIndex
- : target.prefixOrderIndex;
+ return target.prefixOrderIndex;
}
/**
diff --git a/robolectric_tests/src/com/android/launcher3/model/DbDowngradeHelperTest.java b/robolectric_tests/src/com/android/launcher3/model/DbDowngradeHelperTest.java
index b7340cf..bbbe21e 100644
--- a/robolectric_tests/src/com/android/launcher3/model/DbDowngradeHelperTest.java
+++ b/robolectric_tests/src/com/android/launcher3/model/DbDowngradeHelperTest.java
@@ -130,7 +130,7 @@
}
helper.close();
- helper = new DatabaseHelper(mContext, DB_FILE) {
+ helper = new DatabaseHelper(mContext, DB_FILE, false) {
@Override
public void onOpen(SQLiteDatabase db) { }
};
@@ -161,7 +161,7 @@
DbDowngradeHelper.updateSchemaFile(mSchemaFile, LauncherProvider.SCHEMA_VERSION, mContext);
- DatabaseHelper dbHelper = new DatabaseHelper(mContext, DB_FILE) {
+ DatabaseHelper dbHelper = new DatabaseHelper(mContext, DB_FILE, false) {
@Override
public void onOpen(SQLiteDatabase db) { }
};
diff --git a/robolectric_tests/src/com/android/launcher3/provider/RestoreDbTaskTest.java b/robolectric_tests/src/com/android/launcher3/provider/RestoreDbTaskTest.java
index 58174c7..ee73b82 100644
--- a/robolectric_tests/src/com/android/launcher3/provider/RestoreDbTaskTest.java
+++ b/robolectric_tests/src/com/android/launcher3/provider/RestoreDbTaskTest.java
@@ -95,7 +95,7 @@
private final long mProfileId;
MyDatabaseHelper(long profileId) {
- super(RuntimeEnvironment.application, null);
+ super(RuntimeEnvironment.application, null, false);
mProfileId = profileId;
}
diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java
index e8e88c4..d7d4a27 100644
--- a/src/com/android/launcher3/BubbleTextView.java
+++ b/src/com/android/launcher3/BubbleTextView.java
@@ -79,8 +79,10 @@
private static final int[] STATE_PRESSED = new int[] {android.R.attr.state_pressed};
- private final PointF mTranslationForReorder = new PointF(0, 0);
- private float mScaleForReorder = 1f;
+ private final PointF mTranslationForReorderBounce = new PointF(0, 0);
+ private final PointF mTranslationForReorderPreview = new PointF(0, 0);
+
+ private float mScaleForReorderBounce = 1f;
private static final Property<BubbleTextView, Float> DOT_SCALE_PROPERTY
= new Property<BubbleTextView, Float>(Float.TYPE, "dotScale") {
@@ -675,24 +677,39 @@
return mIconSize;
}
- public void setReorderOffset(float x, float y) {
- mTranslationForReorder.set(x, y);
- super.setTranslationX(x);
- super.setTranslationY(y);
+ private void updateTranslation() {
+ super.setTranslationX(mTranslationForReorderBounce.x + mTranslationForReorderPreview.x);
+ super.setTranslationY(mTranslationForReorderBounce.y + mTranslationForReorderPreview.y);
}
- public void getReorderOffset(PointF offset) {
- offset.set(mTranslationForReorder);
+ public void setReorderBounceOffset(float x, float y) {
+ mTranslationForReorderBounce.set(x, y);
+ updateTranslation();
}
- public void setReorderScale(float scale) {
- mScaleForReorder = scale;
+ public void getReorderBounceOffset(PointF offset) {
+ offset.set(mTranslationForReorderBounce);
+ }
+
+ @Override
+ public void setReorderPreviewOffset(float x, float y) {
+ mTranslationForReorderPreview.set(x, y);
+ updateTranslation();
+ }
+
+ @Override
+ public void getReorderPreviewOffset(PointF offset) {
+ offset.set(mTranslationForReorderPreview);
+ }
+
+ public void setReorderBounceScale(float scale) {
+ mScaleForReorderBounce = scale;
super.setScaleX(scale);
super.setScaleY(scale);
}
- public float getReorderScale() {
- return mScaleForReorder;
+ public float getReorderBounceScale() {
+ return mScaleForReorderBounce;
}
public View getView() {
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index 71a787f..ed71ddc 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -852,9 +852,10 @@
int delay, boolean permanent, boolean adjustOccupied) {
ShortcutAndWidgetContainer clc = getShortcutsAndWidgets();
- if (clc.indexOfChild(child) != -1) {
+ if (clc.indexOfChild(child) != -1 && (child instanceof Reorderable)) {
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
final ItemInfo info = (ItemInfo) child.getTag();
+ final Reorderable item = (Reorderable) child;
// We cancel any existing animations
if (mReorderAnimators.containsKey(lp)) {
@@ -862,13 +863,18 @@
mReorderAnimators.remove(lp);
}
- final int oldX = lp.x;
- final int oldY = lp.y;
+
if (adjustOccupied) {
GridOccupancy occupied = permanent ? mOccupied : mTmpOccupied;
occupied.markCells(lp.cellX, lp.cellY, lp.cellHSpan, lp.cellVSpan, false);
occupied.markCells(cellX, cellY, lp.cellHSpan, lp.cellVSpan, true);
}
+
+ // Compute the new x and y position based on the new cellX and cellY
+ // We leverage the actual layout logic in the layout params and hence need to modify
+ // state and revert that state.
+ final int oldX = lp.x;
+ final int oldY = lp.y;
lp.isLockedToGrid = true;
if (permanent) {
lp.cellX = info.cellX = cellX;
@@ -878,15 +884,23 @@
lp.tmpCellY = cellY;
}
clc.setupLp(child);
- lp.isLockedToGrid = false;
final int newX = lp.x;
final int newY = lp.y;
-
lp.x = oldX;
lp.y = oldY;
+ lp.isLockedToGrid = false;
+ // End compute new x and y
+
+ item.getReorderPreviewOffset(mTmpPointF);
+ final float initPreviewOffsetX = mTmpPointF.x;
+ final float initPreviewOffsetY = mTmpPointF.y;
+ final float finalPreviewOffsetX = newX - oldX;
+ final float finalPreviewOffsetY = newY - oldY;
+
// Exit early if we're not actually moving the view
- if (oldX == newX && oldY == newY) {
+ if (finalPreviewOffsetX == 0 && finalPreviewOffsetY == 0
+ && initPreviewOffsetX == 0 && initPreviewOffsetY == 0) {
lp.isLockedToGrid = true;
return true;
}
@@ -899,9 +913,9 @@
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float r = (Float) animation.getAnimatedValue();
- lp.x = (int) ((1 - r) * oldX + r * newX);
- lp.y = (int) ((1 - r) * oldY + r * newY);
- child.requestLayout();
+ float x = (1 - r) * initPreviewOffsetX + r * finalPreviewOffsetX;
+ float y = (1 - r) * initPreviewOffsetY + r * finalPreviewOffsetY;
+ item.setReorderPreviewOffset(x, y);
}
});
va.addListener(new AnimatorListenerAdapter() {
@@ -912,6 +926,7 @@
// place just yet.
if (!cancelled) {
lp.isLockedToGrid = true;
+ item.setReorderPreviewOffset(0, 0);
child.requestLayout();
}
if (mReorderAnimators.containsKey(lp)) {
@@ -1930,10 +1945,10 @@
finalDeltaX = 0;
finalDeltaY = 0;
- child.getReorderOffset(mTmpPointF);
+ child.getReorderBounceOffset(mTmpPointF);
initDeltaX = mTmpPointF.x;
initDeltaY = mTmpPointF.y;
- initScale = child.getReorderScale();
+ initScale = child.getReorderBounceScale();
finalScale = mChildScale - (CHILD_DIVIDEND / child.getView().getWidth()) * initScale;
int dir = mode == MODE_HINT ? -1 : 1;
@@ -2010,9 +2025,9 @@
float r1 = (mode == MODE_HINT && repeating) ? 1.0f : animationProgress;
float x = r1 * finalDeltaX + (1 - r1) * initDeltaX;
float y = r1 * finalDeltaY + (1 - r1) * initDeltaY;
- child.setReorderOffset(x, y);
+ child.setReorderBounceOffset(x, y);
float s = animationProgress * finalScale + (1 - animationProgress) * initScale;
- child.setReorderScale(s);
+ child.setReorderBounceScale(s);
}
private void cancel() {
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index 0a1fad1..63b90ae 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -17,6 +17,7 @@
package com.android.launcher3;
import static com.android.launcher3.Utilities.getDevicePrefs;
+import static com.android.launcher3.Utilities.getPointString;
import static com.android.launcher3.config.FeatureFlags.APPLY_CONFIG_AT_RUNTIME;
import static com.android.launcher3.settings.SettingsActivity.GRID_OPTIONS_PREFERENCE_KEY;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
@@ -69,6 +70,9 @@
public static final MainThreadInitializedObject<InvariantDeviceProfile> INSTANCE =
new MainThreadInitializedObject<>(InvariantDeviceProfile::new);
+ public static final String KEY_MIGRATION_SRC_WORKSPACE_SIZE = "migration_src_workspace_size";
+ public static final String KEY_MIGRATION_SRC_HOTSEAT_COUNT = "migration_src_hotseat_count";
+
private static final String KEY_IDP_GRID_NAME = "idp_grid_name";
private static final float ICON_SIZE_DEFINED_IN_APP_DP = 48;
@@ -165,6 +169,10 @@
if (!newGridName.equals(gridName)) {
Utilities.getPrefs(context).edit().putString(KEY_IDP_GRID_NAME, newGridName).apply();
}
+ Utilities.getPrefs(context).edit()
+ .putInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT, numHotseatIcons)
+ .putString(KEY_MIGRATION_SRC_WORKSPACE_SIZE, getPointString(numColumns, numRows))
+ .apply();
mConfigMonitor = new ConfigMonitor(context,
APPLY_CONFIG_AT_RUNTIME.get() ? this::onConfigChanged : this::killProcess);
diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java
index ac3a5b0..21cd04e 100644
--- a/src/com/android/launcher3/LauncherProvider.java
+++ b/src/com/android/launcher3/LauncherProvider.java
@@ -146,7 +146,8 @@
*/
protected synchronized void createDbIfNotExists() {
if (mOpenHelper == null) {
- mOpenHelper = DatabaseHelper.createDatabaseHelper(getContext());
+ mOpenHelper = DatabaseHelper.createDatabaseHelper(
+ getContext(), false /* forMigration */);
if (RestoreDbTask.isPending(getContext())) {
if (!RestoreDbTask.performRestore(getContext(), mOpenHelper,
@@ -426,7 +427,8 @@
InvariantDeviceProfile.INSTANCE.get(getContext()).dbFile,
Favorites.TMP_TABLE,
() -> mOpenHelper,
- () -> DatabaseHelper.createDatabaseHelper(getContext())));
+ () -> DatabaseHelper.createDatabaseHelper(
+ getContext(), true /* forMigration */)));
return result;
}
}
@@ -437,7 +439,8 @@
prepForMigration(
arg /* dbFile */,
Favorites.PREVIEW_TABLE_NAME,
- () -> DatabaseHelper.createDatabaseHelper(getContext(), arg),
+ () -> DatabaseHelper.createDatabaseHelper(
+ getContext(), arg, true /* forMigration */),
() -> mOpenHelper));
return result;
}
@@ -601,20 +604,22 @@
public static class DatabaseHelper extends NoLocaleSQLiteHelper implements
LayoutParserCallback {
private final Context mContext;
+ private final boolean mForMigration;
private int mMaxItemId = -1;
private int mMaxScreenId = -1;
private boolean mBackupTableExists;
- static DatabaseHelper createDatabaseHelper(Context context) {
- return createDatabaseHelper(context, null);
+ static DatabaseHelper createDatabaseHelper(Context context, boolean forMigration) {
+ return createDatabaseHelper(context, null, forMigration);
}
- static DatabaseHelper createDatabaseHelper(Context context, String dbName) {
+ static DatabaseHelper createDatabaseHelper(Context context, String dbName,
+ boolean forMigration) {
if (dbName == null) {
dbName = MULTI_DB_GRID_MIRATION_ALGO.get() ? InvariantDeviceProfile.INSTANCE.get(
context).dbFile : LauncherFiles.LAUNCHER_DB;
}
- DatabaseHelper databaseHelper = new DatabaseHelper(context, dbName);
+ DatabaseHelper databaseHelper = new DatabaseHelper(context, dbName, forMigration);
// Table creation sometimes fails silently, which leads to a crash loop.
// This way, we will try to create a table every time after crash, so the device
// would eventually be able to recover.
@@ -635,9 +640,10 @@
/**
* Constructor used in tests and for restore.
*/
- public DatabaseHelper(Context context, String dbName) {
+ public DatabaseHelper(Context context, String dbName, boolean forMigration) {
super(context, dbName, SCHEMA_VERSION);
mContext = context;
+ mForMigration = forMigration;
}
protected void initIds() {
@@ -662,7 +668,9 @@
// Fresh and clean launcher DB.
mMaxItemId = initializeMaxItemId(db);
- onEmptyDbCreated();
+ if (!mForMigration) {
+ onEmptyDbCreated();
+ }
}
protected void onAddOrDeleteOp(SQLiteDatabase db) {
diff --git a/src/com/android/launcher3/Reorderable.java b/src/com/android/launcher3/Reorderable.java
index 5112eaf..047fb01 100644
--- a/src/com/android/launcher3/Reorderable.java
+++ b/src/com/android/launcher3/Reorderable.java
@@ -22,17 +22,24 @@
public interface Reorderable {
/**
- * Set the offset related to reorder hint and "bounce" animations
+ * Set the offset related to reorder hint and bounce animations
*/
- void setReorderOffset(float x, float y);
+ void setReorderBounceOffset(float x, float y);
- void getReorderOffset(PointF offset);
+ void getReorderBounceOffset(PointF offset);
+
+ /**
+ * Set the offset related to previewing the new reordered position
+ */
+ void setReorderPreviewOffset(float x, float y);
+
+ void getReorderPreviewOffset(PointF offset);
/**
* Set the scale related to reorder hint and "bounce" animations
*/
- void setReorderScale(float scale);
- float getReorderScale();
+ void setReorderBounceScale(float scale);
+ float getReorderBounceScale();
/**
* Get the com.android.view related to this object
diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java
index 7fc6d54..b875a0b 100644
--- a/src/com/android/launcher3/folder/FolderIcon.java
+++ b/src/com/android/launcher3/folder/FolderIcon.java
@@ -121,8 +121,9 @@
private float mDotScale;
private Animator mDotScaleAnim;
- private final PointF mTranslationForReorder = new PointF(0, 0);
- private float mScaleForReorder = 1f;
+ private final PointF mTranslationForReorderBounce = new PointF(0, 0);
+ private final PointF mTranslationForReorderPreview = new PointF(0, 0);
+ private float mScaleForReorderBounce = 1f;
private static final Property<FolderIcon, Float> DOT_SCALE_PROPERTY
= new Property<FolderIcon, Float>(Float.TYPE, "dotScale") {
@@ -712,25 +713,39 @@
mPreviewItemManager.onFolderClose(currentPage);
}
-
- public void setReorderOffset(float x, float y) {
- mTranslationForReorder.set(x, y);
- super.setTranslationX(x);
- super.setTranslationY(y);
+ private void updateTranslation() {
+ super.setTranslationX(mTranslationForReorderBounce.x + mTranslationForReorderPreview.x);
+ super.setTranslationY(mTranslationForReorderBounce.y + mTranslationForReorderPreview.y);
}
- public void getReorderOffset(PointF offset) {
- offset.set(mTranslationForReorder);
+ public void setReorderBounceOffset(float x, float y) {
+ mTranslationForReorderBounce.set(x, y);
+ updateTranslation();
}
- public void setReorderScale(float scale) {
- mScaleForReorder = scale;
+ public void getReorderBounceOffset(PointF offset) {
+ offset.set(mTranslationForReorderBounce);
+ }
+
+ @Override
+ public void setReorderPreviewOffset(float x, float y) {
+ mTranslationForReorderPreview.set(x, y);
+ updateTranslation();
+ }
+
+ @Override
+ public void getReorderPreviewOffset(PointF offset) {
+ offset.set(mTranslationForReorderPreview);
+ }
+
+ public void setReorderBounceScale(float scale) {
+ mScaleForReorderBounce = scale;
super.setScaleX(scale);
super.setScaleY(scale);
}
- public float getReorderScale() {
- return mScaleForReorder;
+ public float getReorderBounceScale() {
+ return mScaleForReorderBounce;
}
public View getView() {
diff --git a/src/com/android/launcher3/model/GridSizeMigrationTask.java b/src/com/android/launcher3/model/GridSizeMigrationTask.java
index b27e4ea..e8a52bd 100644
--- a/src/com/android/launcher3/model/GridSizeMigrationTask.java
+++ b/src/com/android/launcher3/model/GridSizeMigrationTask.java
@@ -1,5 +1,7 @@
package com.android.launcher3.model;
+import static com.android.launcher3.InvariantDeviceProfile.KEY_MIGRATION_SRC_HOTSEAT_COUNT;
+import static com.android.launcher3.InvariantDeviceProfile.KEY_MIGRATION_SRC_WORKSPACE_SIZE;
import static com.android.launcher3.LauncherSettings.Settings.EXTRA_VALUE;
import static com.android.launcher3.Utilities.getPointString;
import static com.android.launcher3.Utilities.parsePoint;
@@ -53,9 +55,6 @@
private static final String TAG = "GridSizeMigrationTask";
private static final boolean DEBUG = true;
- private static final String KEY_MIGRATION_SRC_WORKSPACE_SIZE = "migration_src_workspace_size";
- private static final String KEY_MIGRATION_SRC_HOTSEAT_COUNT = "migration_src_hotseat_count";
-
// These are carefully selected weights for various item types (Math.random?), to allow for
// the least absurd migration experience.
private static final float WT_SHORTCUT = 1;
@@ -894,8 +893,7 @@
String gridSizeString = getPointString(idp.numColumns, idp.numRows);
return !gridSizeString.equals(prefs.getString(KEY_MIGRATION_SRC_WORKSPACE_SIZE, ""))
- || idp.numHotseatIcons != prefs.getInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT,
- idp.numHotseatIcons);
+ || idp.numHotseatIcons != prefs.getInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT, -1);
}
/** See {@link #migrateGridIfNeeded(Context, InvariantDeviceProfile)} */
diff --git a/src/com/android/launcher3/model/GridSizeMigrationTaskV2.java b/src/com/android/launcher3/model/GridSizeMigrationTaskV2.java
index 1c44fc3..4a28218 100644
--- a/src/com/android/launcher3/model/GridSizeMigrationTaskV2.java
+++ b/src/com/android/launcher3/model/GridSizeMigrationTaskV2.java
@@ -16,6 +16,8 @@
package com.android.launcher3.model;
+import static com.android.launcher3.InvariantDeviceProfile.KEY_MIGRATION_SRC_HOTSEAT_COUNT;
+import static com.android.launcher3.InvariantDeviceProfile.KEY_MIGRATION_SRC_WORKSPACE_SIZE;
import static com.android.launcher3.Utilities.getPointString;
import static com.android.launcher3.provider.LauncherDbUtils.dropTable;
@@ -63,9 +65,6 @@
*/
public class GridSizeMigrationTaskV2 {
- public static final String KEY_MIGRATION_SRC_WORKSPACE_SIZE = "migration_src_workspace_size";
- public static final String KEY_MIGRATION_SRC_HOTSEAT_COUNT = "migration_src_hotseat_count";
-
private static final String TAG = "GridSizeMigrationTaskV2";
private static final boolean DEBUG = true;
@@ -110,8 +109,7 @@
String gridSizeString = getPointString(idp.numColumns, idp.numRows);
return !gridSizeString.equals(prefs.getString(KEY_MIGRATION_SRC_WORKSPACE_SIZE, ""))
- || idp.numHotseatIcons != prefs.getInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT,
- idp.numHotseatIcons);
+ || idp.numHotseatIcons != prefs.getInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT, -1);
}
/** See {@link #migrateGridIfNeeded(Context, InvariantDeviceProfile)} */
@@ -148,14 +146,6 @@
SharedPreferences prefs = Utilities.getPrefs(context);
String gridSizeString = getPointString(idp.numColumns, idp.numRows);
-
- if (gridSizeString.equals(prefs.getString(KEY_MIGRATION_SRC_WORKSPACE_SIZE, ""))
- && idp.numHotseatIcons == prefs.getInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT,
- idp.numHotseatIcons)) {
- // Skip if workspace and hotseat sizes have not changed.
- return true;
- }
-
HashSet<String> validPackages = getValidPackages(context);
int srcHotseatCount = prefs.getInt(KEY_MIGRATION_SRC_HOTSEAT_COUNT, idp.numHotseatIcons);
diff --git a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java
index e290685..dc50053 100644
--- a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java
+++ b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java
@@ -16,6 +16,7 @@
package com.android.launcher3.touch;
+import static android.widget.ListPopupWindow.WRAP_CONTENT;
import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_X;
import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_Y;
import static com.android.launcher3.touch.SingleAxisSwipeDetector.HORIZONTAL;
@@ -30,6 +31,7 @@
import android.view.VelocityTracker;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
+import android.widget.LinearLayout;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.PagedView;
@@ -224,6 +226,33 @@
}
@Override
+ public float getTaskMenuX(float x, View thumbnailView) {
+ return thumbnailView.getMeasuredWidth() + x;
+ }
+
+ @Override
+ public float getTaskMenuY(float y, View thumbnailView) {
+ return y;
+ }
+
+ @Override
+ public int getTaskMenuWidth(View view) {
+ return view.getMeasuredHeight();
+ }
+
+ @Override
+ public int getTaskMenuLayoutOrientation() {
+ return LinearLayout.HORIZONTAL;
+ }
+
+ @Override
+ public void setLayoutParamsForTaskMenuOptionItem(LinearLayout.LayoutParams lp) {
+ lp.width = 0;
+ lp.height = WRAP_CONTENT;
+ lp.weight = 1;
+ }
+
+ @Override
public ChildBounds getChildBounds(View child, int childStart, int pageCenter,
boolean layoutChild) {
final int childHeight = child.getMeasuredHeight();
diff --git a/src/com/android/launcher3/touch/PagedOrientationHandler.java b/src/com/android/launcher3/touch/PagedOrientationHandler.java
index b8396e1..cc15f99 100644
--- a/src/com/android/launcher3/touch/PagedOrientationHandler.java
+++ b/src/com/android/launcher3/touch/PagedOrientationHandler.java
@@ -27,6 +27,7 @@
import android.view.VelocityTracker;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
+import android.widget.LinearLayout;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.PagedView;
@@ -90,6 +91,11 @@
void getCurveProperties(PagedView view, Rect insets, CurveProperties out);
boolean isGoingUp(float displacement);
boolean isLayoutNaturalToLauncher();
+ float getTaskMenuX(float x, View thumbnailView);
+ float getTaskMenuY(float y, View thumbnailView);
+ int getTaskMenuWidth(View view);
+ int getTaskMenuLayoutOrientation();
+ void setLayoutParamsForTaskMenuOptionItem(LinearLayout.LayoutParams lp);
/**
* Maps the velocity from the coordinate plane of the foreground app to that
diff --git a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java
index dad00a4..7c30e29 100644
--- a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java
+++ b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java
@@ -30,6 +30,7 @@
import android.view.VelocityTracker;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
+import android.widget.LinearLayout;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.PagedView;
@@ -222,6 +223,31 @@
}
@Override
+ public float getTaskMenuX(float x, View thumbnailView) {
+ return x;
+ }
+
+ @Override
+ public float getTaskMenuY(float y, View thumbnailView) {
+ return y;
+ }
+
+ @Override
+ public int getTaskMenuWidth(View view) {
+ return view.getMeasuredWidth();
+ }
+
+ @Override
+ public int getTaskMenuLayoutOrientation() {
+ return LinearLayout.VERTICAL;
+ }
+
+ @Override
+ public void setLayoutParamsForTaskMenuOptionItem(LinearLayout.LayoutParams lp) {
+ // no-op, defaults are fine
+ }
+
+ @Override
public ChildBounds getChildBounds(View child, int childStart, int pageCenter,
boolean layoutChild) {
final int childWidth = child.getMeasuredWidth();
diff --git a/src/com/android/launcher3/touch/SeascapePagedViewHandler.java b/src/com/android/launcher3/touch/SeascapePagedViewHandler.java
index 5ce8a57..7beb7f7 100644
--- a/src/com/android/launcher3/touch/SeascapePagedViewHandler.java
+++ b/src/com/android/launcher3/touch/SeascapePagedViewHandler.java
@@ -20,6 +20,7 @@
import android.graphics.PointF;
import android.graphics.RectF;
import android.view.Surface;
+import android.view.View;
import com.android.launcher3.Utilities;
@@ -64,4 +65,14 @@
float oldY = velocity.y;
velocity.set(oldY, -oldX);
}
+
+ @Override
+ public float getTaskMenuX(float x, View thumbnailView) {
+ return x;
+ }
+
+ @Override
+ public float getTaskMenuY(float y, View thumbnailView) {
+ return y + thumbnailView.getMeasuredHeight();
+ }
}
diff --git a/src/com/android/launcher3/widget/NavigableAppWidgetHostView.java b/src/com/android/launcher3/widget/NavigableAppWidgetHostView.java
index 5ea01d9..a4e7daa 100644
--- a/src/com/android/launcher3/widget/NavigableAppWidgetHostView.java
+++ b/src/com/android/launcher3/widget/NavigableAppWidgetHostView.java
@@ -46,8 +46,9 @@
*/
private final PointF mTranslationForCentering = new PointF(0, 0);
- private final PointF mTranslationForReorder = new PointF(0, 0);
- private float mScaleForReorder = 1f;
+ private final PointF mTranslationForReorderBounce = new PointF(0, 0);
+ private final PointF mTranslationForReorderPreview = new PointF(0, 0);
+ private float mScaleForReorderBounce = 1f;
@ViewDebug.ExportedProperty(category = "launcher")
private boolean mChildrenFocused;
@@ -152,45 +153,63 @@
setSelected(childIsFocused);
}
- public void setScaleToFit(float scale) {
- mScaleToFit = scale;
- super.setScaleX(scale * mScaleForReorder);
- super.setScaleY(scale * mScaleForReorder);
- }
-
- public float getScaleToFit() {
- return mScaleToFit;
- }
-
public View getView() {
return this;
}
+ private void updateTranslation() {
+ super.setTranslationX(mTranslationForReorderBounce.x + mTranslationForReorderPreview.x
+ + mTranslationForCentering.x);
+ super.setTranslationY(mTranslationForReorderBounce.y + mTranslationForReorderPreview.y
+ + mTranslationForCentering.y);
+ }
public void setTranslationForCentering(float x, float y) {
mTranslationForCentering.set(x, y);
- super.setTranslationX(x + mTranslationForReorder.x);
- super.setTranslationY(y + mTranslationForReorder.y);
+ updateTranslation();
}
- public void setReorderOffset(float x, float y) {
- mTranslationForReorder.set(x, y);
- super.setTranslationX(mTranslationForCentering.x + x);
- super.setTranslationY(mTranslationForCentering.y + y);
+ public void setReorderBounceOffset(float x, float y) {
+ mTranslationForReorderBounce.set(x, y);
+ updateTranslation();
}
- public void getReorderOffset(PointF offset) {
- offset.set(mTranslationForReorder);
+ public void getReorderBounceOffset(PointF offset) {
+ offset.set(mTranslationForReorderBounce);
}
- public void setReorderScale(float scale) {
- mScaleForReorder = scale;
- super.setScaleX(mScaleToFit * scale);
- super.setScaleY(mScaleToFit * scale);
+ @Override
+ public void setReorderPreviewOffset(float x, float y) {
+ mTranslationForReorderPreview.set(x, y);
+ updateTranslation();
}
- public float getReorderScale() {
- return mScaleForReorder;
+ @Override
+ public void getReorderPreviewOffset(PointF offset) {
+ offset.set(mTranslationForReorderPreview);
+ }
+
+ private void updateScale() {
+ super.setScaleX(mScaleToFit * mScaleForReorderBounce);
+ super.setScaleY(mScaleToFit * mScaleForReorderBounce);
+ }
+
+ public void setReorderBounceScale(float scale) {
+ mScaleForReorderBounce = scale;
+ updateScale();
+ }
+
+ public float getReorderBounceScale() {
+ return mScaleForReorderBounce;
+ }
+
+ public void setScaleToFit(float scale) {
+ mScaleToFit = scale;
+ updateScale();
+ }
+
+ public float getScaleToFit() {
+ return mScaleToFit;
}
@Override
diff --git a/tests/src/com/android/launcher3/ui/ActivityLeakTracker.java b/tests/src/com/android/launcher3/ui/ActivityLeakTracker.java
index 0b5ce02..e9258e9 100644
--- a/tests/src/com/android/launcher3/ui/ActivityLeakTracker.java
+++ b/tests/src/com/android/launcher3/ui/ActivityLeakTracker.java
@@ -77,6 +77,8 @@
}
}
+ if (liveActivities > 2) return false;
+
// It's OK to have 1 leaked activity if no active activities exist.
return liveActivities == 0 ? destroyedActivities <= 1 : destroyedActivities == 0;
}