IconAppChipView wrong position after rotation with menu opened
The chip menu was updated to a wrong position when the chip menu was visible and the display orientation changed. An animation to hide the TaskMenuView was happening during the rotation. The animation started before the rotation with wrong positions associated to it, thus, updating the position of the IconAppChipView with wrong X and Y position.
Fix: 320633351
Flag: ACONFIG com.android.launcher3.enable_grid_only_overview TEAMFOOD
Flag: ACONFIG com.android.launcher3.enable_overview_icon_menu TEAMFOOD
Test: TaplTestsSplitscreen.testAppChipIsPositionedCorrectlyAfterRotation
Change-Id: Id19ce02f09fa5ff50c6caeab02286d548a520c94
diff --git a/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.java b/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.java
index 24b48db..8648b56 100644
--- a/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.java
+++ b/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.java
@@ -602,7 +602,7 @@
: iconMenuParams.width / 2f);
iconAppChipView.setPivotY(
isRtl ? (iconMenuParams.height / 2f) : iconMenuParams.width / 2f);
- iconAppChipView.setTranslationY(0);
+ iconAppChipView.setSplitTranslationY(0);
iconAppChipView.setRotation(getDegreesRotated());
}
@@ -641,12 +641,14 @@
primaryIconView.setTranslationX(0);
secondaryIconView.setTranslationX(0);
if (enableOverviewIconMenu()) {
+ IconAppChipView primaryAppChipView = (IconAppChipView) primaryIconView;
+ IconAppChipView secondaryAppChipView = (IconAppChipView) secondaryIconView;
if (primaryIconView.getLayoutDirection() == LAYOUT_DIRECTION_RTL) {
- secondaryIconView.setTranslationY(-primarySnapshotHeight);
- primaryIconView.setTranslationY(0);
+ secondaryAppChipView.setSplitTranslationY(-primarySnapshotHeight);
+ primaryAppChipView.setSplitTranslationY(0);
} else {
int secondarySnapshotHeight = groupedTaskViewHeight - primarySnapshotHeight;
- primaryIconView.setTranslationY(secondarySnapshotHeight);
+ primaryAppChipView.setSplitTranslationY(secondarySnapshotHeight);
}
} else if (splitConfig.initiatedFromSeascape) {
// if the split was initiated from seascape,
diff --git a/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.java b/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.java
index 2f996e1..60e6a25 100644
--- a/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.java
+++ b/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.java
@@ -639,7 +639,7 @@
iconAppChipView.setPivotX(0);
iconAppChipView.setPivotY(0);
- iconAppChipView.setTranslationY(0);
+ iconAppChipView.setSplitTranslationY(0);
iconAppChipView.setRotation(getDegreesRotated());
}
@@ -655,6 +655,8 @@
: new FrameLayout.LayoutParams(primaryIconParams);
if (enableOverviewIconMenu()) {
+ IconAppChipView primaryAppChipView = (IconAppChipView) primaryIconView;
+ IconAppChipView secondaryAppChipView = (IconAppChipView) secondaryIconView;
primaryIconParams.gravity = TOP | START;
secondaryIconParams.gravity = TOP | START;
secondaryIconParams.topMargin = primaryIconParams.topMargin;
@@ -662,16 +664,16 @@
if (deviceProfile.isLeftRightSplit) {
if (isRtl) {
int secondarySnapshotWidth = groupedTaskViewWidth - primarySnapshotWidth;
- primaryIconView.setTranslationX(-secondarySnapshotWidth);
+ primaryAppChipView.setSplitTranslationX(-secondarySnapshotWidth);
} else {
- secondaryIconView.setTranslationX(primarySnapshotWidth);
+ secondaryAppChipView.setSplitTranslationX(primarySnapshotWidth);
}
} else {
- primaryIconView.setTranslationX(0);
- secondaryIconView.setTranslationX(0);
+ primaryAppChipView.setSplitTranslationX(0);
+ secondaryAppChipView.setSplitTranslationX(0);
int dividerThickness = Math.min(splitConfig.visualDividerBounds.width(),
splitConfig.visualDividerBounds.height());
- secondaryIconView.setTranslationY(
+ secondaryAppChipView.setSplitTranslationY(
primarySnapshotHeight + (deviceProfile.isTablet ? 0 : dividerThickness));
}
} else if (deviceProfile.isLeftRightSplit) {
diff --git a/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.java b/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.java
index 9090d14..a964639 100644
--- a/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.java
+++ b/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.java
@@ -244,7 +244,7 @@
iconAppChipView.setPivotX(isRtl ? iconMenuParams.width / 2f : iconCenter);
iconAppChipView.setPivotY(
isRtl ? iconMenuParams.width / 2f : iconCenter - iconMenuMargin);
- iconAppChipView.setTranslationY(0);
+ iconAppChipView.setSplitTranslationY(0);
iconAppChipView.setRotation(getDegreesRotated());
}
@@ -281,12 +281,15 @@
primaryIconView.setTranslationX(0);
secondaryIconView.setTranslationX(0);
if (enableOverviewIconMenu()) {
+ IconAppChipView primaryAppChipView = (IconAppChipView) primaryIconView;
+ IconAppChipView secondaryAppChipView = (IconAppChipView) secondaryIconView;
if (isRtl) {
- primaryIconView.setTranslationY(groupedTaskViewHeight - primarySnapshotHeight);
- secondaryIconView.setTranslationY(0);
+ primaryAppChipView.setSplitTranslationY(
+ groupedTaskViewHeight - primarySnapshotHeight);
+ secondaryAppChipView.setSplitTranslationY(0);
} else {
- secondaryIconView.setTranslationY(-primarySnapshotHeight);
- primaryIconView.setTranslationY(0);
+ secondaryAppChipView.setSplitTranslationY(-primarySnapshotHeight);
+ primaryAppChipView.setSplitTranslationY(0);
}
} else if (splitConfig.initiatedFromSeascape) {
// if the split was initiated from seascape,
diff --git a/quickstep/src/com/android/quickstep/views/IconAppChipView.java b/quickstep/src/com/android/quickstep/views/IconAppChipView.java
index 958c28a..cb3566e 100644
--- a/quickstep/src/com/android/quickstep/views/IconAppChipView.java
+++ b/quickstep/src/com/android/quickstep/views/IconAppChipView.java
@@ -18,6 +18,8 @@
import static com.android.app.animation.Interpolators.EMPHASIZED;
import static com.android.app.animation.Interpolators.LINEAR;
import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY;
+import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_X;
+import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_Y;
import android.animation.Animator;
import android.animation.AnimatorSet;
@@ -42,6 +44,7 @@
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
+import com.android.launcher3.util.MultiPropertyFactory;
import com.android.launcher3.util.MultiValueAlpha;
import com.android.quickstep.orientation.RecentsPagedOrientationHandler;
import com.android.quickstep.util.RecentsOrientedState;
@@ -87,6 +90,67 @@
private int mMaxWidth = Integer.MAX_VALUE;
+ private static final int INDEX_SPLIT_TRANSLATION = 0;
+ private static final int INDEX_MENU_TRANSLATION = 1;
+ private static final int INDEX_COUNT_TRANSLATION = 2;
+
+ private final MultiPropertyFactory<View> mViewTranslationX;
+ private final MultiPropertyFactory<View> mViewTranslationY;
+
+ /**
+ * Sets the view split x-axis translation
+ * @param translationX x-axis translation
+ */
+ public void setSplitTranslationX(float translationX) {
+ mViewTranslationX.get(INDEX_SPLIT_TRANSLATION).setValue(translationX);
+ }
+
+ /**
+ * Sets the view split y-axis translation
+ * @param translationY y-axis translation
+ */
+ public void setSplitTranslationY(float translationY) {
+ mViewTranslationY.get(INDEX_SPLIT_TRANSLATION).setValue(translationY);
+ }
+
+ /**
+ * Gets the menu x-axis translation for split task
+ */
+ public MultiPropertyFactory<View>.MultiProperty getMenuTranslationX() {
+ return mViewTranslationX.get(INDEX_MENU_TRANSLATION);
+ }
+
+ /**
+ * Translate the View on the X-axis without overriding the raw translation.
+ * This function is used for the menu split animation. It allows external animations to
+ * translate this view without affecting the value of the original translation. Thus,
+ * it is possible to restore the initial translation value.
+ *
+ * @param translationX Animated translation to be aggregated to the raw translation.
+ */
+ public void setMenuTranslationX(float translationX) {
+ mViewTranslationX.get(INDEX_MENU_TRANSLATION).setValue(translationX);
+ }
+
+ /**
+ * Gets the menu y-axis translation for split task
+ */
+ public MultiPropertyFactory<View>.MultiProperty getMenuTranslationY() {
+ return mViewTranslationY.get(INDEX_MENU_TRANSLATION);
+ }
+
+ /**
+ * Translate the View on the Y-axis without overriding the raw translation.
+ * This function is used for the menu split animation. It allows external animations to
+ * translate this view without affecting the value of the original translation. Thus,
+ * it is possible to restore the initial translation value.
+ *
+ * @param translationY Animated translation to be aggregated to the raw translation.
+ */
+ public void setMenuTranslationY(float translationY) {
+ mViewTranslationY.get(INDEX_MENU_TRANSLATION).setValue(translationY);
+ }
+
public IconAppChipView(Context context) {
this(context, null);
}
@@ -136,6 +200,13 @@
R.dimen.task_thumbnail_icon_menu_arrow_size);
mIconViewDrawableExpandedSize = res.getDimensionPixelSize(
R.dimen.task_thumbnail_icon_menu_app_icon_expanded_size);
+
+ mViewTranslationX = new MultiPropertyFactory<>(this, VIEW_TRANSLATE_X,
+ INDEX_COUNT_TRANSLATION,
+ Float::sum);
+ mViewTranslationY = new MultiPropertyFactory<>(this, VIEW_TRANSLATE_Y,
+ INDEX_COUNT_TRANSLATION,
+ Float::sum);
}
@Override
diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/src/com/android/quickstep/views/TaskMenuView.java
index 6404383..39f1e46 100644
--- a/quickstep/src/com/android/quickstep/views/TaskMenuView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.java
@@ -18,6 +18,7 @@
import static com.android.app.animation.Interpolators.EMPHASIZED;
import static com.android.launcher3.Flags.enableOverviewIconMenu;
+import static com.android.launcher3.util.MultiPropertyFactory.MULTI_PROPERTY_VALUE;
import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT;
import static com.android.quickstep.views.TaskThumbnailView.DIM_ALPHA;
@@ -78,8 +79,6 @@
private LinearLayout mOptionLayout;
private float mMenuTranslationYBeforeOpen;
private float mMenuTranslationXBeforeOpen;
- private float mIconViewTranslationYBeforeOpen;
- private float mIconViewTranslationXBeforeOpen;
public TaskMenuView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
@@ -277,8 +276,6 @@
private void animateOpen() {
mMenuTranslationYBeforeOpen = getTranslationY();
mMenuTranslationXBeforeOpen = getTranslationX();
- mIconViewTranslationYBeforeOpen = getIconView().getTranslationY();
- mIconViewTranslationXBeforeOpen = getIconView().getTranslationX();
animateOpenOrClosed(false);
mIsOpen = true;
}
@@ -323,10 +320,10 @@
: mMenuTranslationYBeforeOpen + additionalTranslationY);
translationYAnim.setInterpolator(EMPHASIZED);
+ IconAppChipView iconAppChip = (IconAppChipView) mTaskContainer.getIconView().asView();
ObjectAnimator menuTranslationYAnim = ObjectAnimator.ofFloat(
- getIconView(), TRANSLATION_Y,
- closing ? mIconViewTranslationYBeforeOpen
- : mIconViewTranslationYBeforeOpen + additionalTranslationY);
+ iconAppChip.getMenuTranslationY(),
+ MULTI_PROPERTY_VALUE, closing ? 0 : additionalTranslationY);
menuTranslationYAnim.setInterpolator(EMPHASIZED);
mOpenCloseAnimator.playTogether(translationYAnim, menuTranslationYAnim);
@@ -344,10 +341,10 @@
: mMenuTranslationXBeforeOpen - additionalTranslationX);
translationXAnim.setInterpolator(EMPHASIZED);
+ IconAppChipView iconAppChip = (IconAppChipView) mTaskContainer.getIconView().asView();
ObjectAnimator menuTranslationXAnim = ObjectAnimator.ofFloat(
- getIconView(), TRANSLATION_X,
- closing ? mIconViewTranslationXBeforeOpen
- : mIconViewTranslationXBeforeOpen - additionalTranslationX);
+ iconAppChip.getMenuTranslationX(),
+ MULTI_PROPERTY_VALUE, closing ? 0 : -additionalTranslationX);
menuTranslationXAnim.setInterpolator(EMPHASIZED);
mOpenCloseAnimator.playTogether(translationXAnim, menuTranslationXAnim);
@@ -387,9 +384,11 @@
private void resetOverviewIconMenu() {
if (enableOverviewIconMenu()) {
- ((IconAppChipView) mTaskContainer.getIconView()).reset();
+ IconAppChipView iconAppChipView = (IconAppChipView) mTaskContainer.getIconView();
+ iconAppChipView.reset();
+ iconAppChipView.setMenuTranslationX(0);
+ iconAppChipView.setMenuTranslationY(0);
setTranslationY(mMenuTranslationYBeforeOpen);
- getIconView().setTranslationY(mIconViewTranslationYBeforeOpen);
}
}