From 35d294387cca5ed467a830cf408c3c8866e847bc Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Mon, 14 Feb 2022 14:39:01 -0800 Subject: [PATCH 1/5] Init FloatingIconView properties before fetching drawable. & Make sure properties are reset when recycled. This fixes the bug that causes BubbleTextView drawable not to get set. Bug: 207389002 Test: locally disable loading AdaptiveIcons, ensure BubbleTextView drawable always gets drawn for closing animation Change-Id: Ifdbf3e733e27918c57a5e9b23e5a11b65f8f338c (cherry picked from commit b2670d205131eb7d22c700e0149085031d21db39) Merged-In: Ifdbf3e733e27918c57a5e9b23e5a11b65f8f338c --- .../android/launcher3/views/FloatingIconView.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/views/FloatingIconView.java b/src/com/android/launcher3/views/FloatingIconView.java index dc3ee43548..0a800c3c6e 100644 --- a/src/com/android/launcher3/views/FloatingIconView.java +++ b/src/com/android/launcher3/views/FloatingIconView.java @@ -564,6 +564,12 @@ public class FloatingIconView extends FrameLayout implements launcher, parent); view.recycle(); + // Init properties before getting the drawable. + view.mIsVerticalBarLayout = launcher.getDeviceProfile().isVerticalBarLayout(); + view.mIsOpening = isOpening; + view.mOriginalIcon = originalView; + view.mPositionOut = positionOut; + // Get the drawable on the background thread boolean shouldLoadIcon = originalView.getTag() instanceof ItemInfo && hideOriginal; if (shouldLoadIcon) { @@ -577,11 +583,6 @@ public class FloatingIconView extends FrameLayout implements } sIconLoadResult = null; - view.mIsVerticalBarLayout = launcher.getDeviceProfile().isVerticalBarLayout(); - view.mIsOpening = isOpening; - view.mOriginalIcon = originalView; - view.mPositionOut = positionOut; - // Match the position of the original view. view.matchPositionOf(launcher, originalView, isOpening, positionOut); @@ -639,6 +640,7 @@ public class FloatingIconView extends FrameLayout implements mLoadIconSignal = null; mEndRunnable = null; mFinalDrawableBounds.setEmpty(); + mIsOpening = false; mPositionOut = null; mListenerView.setListener(null); mOriginalIcon = null; From a2ba15674c96c3de948c5d4a50342b09d335f417 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 18 Feb 2022 09:22:58 +0000 Subject: [PATCH 2/5] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I90d6a4aacc6b554740d489cc7e7689b632c9a2eb --- res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index d83776caa3..d87d71c6a7 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -105,7 +105,7 @@ "Ordner: %1$s, %2$d oder mehr Elemente" "Hintergründe" "Hintergrund & Stil" - "Startbildschirm-Einstellungen" + "Einstellungen" "Von deinem Administrator deaktiviert" "Drehen des Startbildschirms zulassen" "Beim Drehen des Smartphones" From 634ddc934f81019e43fcadfa6ec0b7d391ab9755 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 18 Feb 2022 09:23:37 +0000 Subject: [PATCH 3/5] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I1a4cc201486cc623554b6169e59f00e31f17542a --- res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 4a3853f9b8..794ca4ec12 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -107,7 +107,7 @@ "Ordner: %1$s, %2$d oder mehr Elemente" "Hintergründe" "Hintergrund & Stil" - "Startbildschirm-Einstellungen" + "Einstellungen" "Von deinem Administrator deaktiviert" "Drehen des Startbildschirms zulassen" "Beim Drehen des Smartphones" From 98fda41b313ec9ae9b015a3880dcc55e907735d5 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 18 Feb 2022 09:24:16 +0000 Subject: [PATCH 4/5] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ie685cf732f6d413b10232c12c0b2faea1469b723 --- res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index a0c784f1fb..1ddd6528f5 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -103,7 +103,7 @@ "Ordner: %1$s, %2$d oder mehr Elemente" "Hintergründe" "Hintergrund & Stil" - "Startbildschirm-Einstellungen" + "Einstellungen" "Von deinem Administrator deaktiviert" "Drehen des Startbildschirms zulassen" "Beim Drehen des Smartphones" From 3516ecc5340c495cf0582ab685fecbdede20a286 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Thu, 17 Feb 2022 23:26:12 +0000 Subject: [PATCH 5/5] Allow split with an existing split task - Determine the task in the group being clicked in split-select mode and launch split using that selected task - Also make sure we don't handle drag cancel twice when we are animating the return of the drag surface Bug: 219060441 Test: Split from home/overview with fullscreen+fullscreen task, and with fullscreen+split task Change-Id: I48ec0a82812197803ff4b3698830a9cb705719e3 --- .../taskbar/TaskbarDragController.java | 6 +++ .../quickstep/views/FloatingTaskView.java | 19 ++------ .../quickstep/views/GroupedTaskView.java | 18 +++++++- .../android/quickstep/views/RecentsView.java | 44 ++++++++++--------- .../com/android/quickstep/views/TaskView.java | 24 +++++++++- 5 files changed, 73 insertions(+), 38 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java index 435eae47ee..6a2f62256b 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java @@ -469,13 +469,19 @@ public class TaskbarDragController extends DragController mAdditionalOffsetter; private final StatefulActivity mActivity; private final boolean mIsRtl; private final Rect mOutline = new Rect(); @@ -81,9 +79,8 @@ public class FloatingTaskView extends FrameLayout { } private void init(StatefulActivity launcher, View originalView, @Nullable Bitmap thumbnail, - Drawable icon, RectF positionOut, Consumer additionalOffsetter) { + Drawable icon, RectF positionOut) { mStartingPosition = positionOut; - mAdditionalOffsetter = additionalOffsetter; updateInitialPositionForView(originalView); final InsettableFrameLayout.LayoutParams lp = (InsettableFrameLayout.LayoutParams) getLayoutParams(); @@ -113,15 +110,13 @@ public class FloatingTaskView extends FrameLayout { * translation values from originalView will be used */ public static FloatingTaskView getFloatingTaskView(StatefulActivity launcher, - View originalView, @Nullable Bitmap thumbnail, Drawable icon, RectF positionOut, - @Nullable Consumer additionalOffsetter) { + View originalView, @Nullable Bitmap thumbnail, Drawable icon, RectF positionOut) { final BaseDragLayer dragLayer = launcher.getDragLayer(); ViewGroup parent = (ViewGroup) dragLayer.getParent(); final FloatingTaskView floatingView = (FloatingTaskView) launcher.getLayoutInflater() .inflate(R.layout.floating_split_select_view, parent, false); - floatingView.init(launcher, originalView, thumbnail, icon, positionOut, - additionalOffsetter); + floatingView.init(launcher, originalView, thumbnail, icon, positionOut); parent.addView(floatingView); return floatingView; } @@ -129,14 +124,8 @@ public class FloatingTaskView extends FrameLayout { public void updateInitialPositionForView(View originalView) { Rect viewBounds = new Rect(0, 0, originalView.getWidth(), originalView.getHeight()); Utilities.getBoundsForViewInDragLayer(mActivity.getDragLayer(), originalView, viewBounds, - true /* ignoreTransform */, null /* recycle */, + false /* ignoreTransform */, null /* recycle */, mStartingPosition); - if (mAdditionalOffsetter != null) { - mAdditionalOffsetter.accept(mStartingPosition); - } else { - mStartingPosition.offset(originalView.getTranslationX(), - originalView.getTranslationY()); - } final InsettableFrameLayout.LayoutParams lp = new InsettableFrameLayout.LayoutParams( Math.round(mStartingPosition.width()), Math.round(mStartingPosition.height())); diff --git a/quickstep/src/com/android/quickstep/views/GroupedTaskView.java b/quickstep/src/com/android/quickstep/views/GroupedTaskView.java index af9f818e4e..04af3c11ab 100644 --- a/quickstep/src/com/android/quickstep/views/GroupedTaskView.java +++ b/quickstep/src/com/android/quickstep/views/GroupedTaskView.java @@ -5,14 +5,17 @@ import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITIO import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT; import android.content.Context; +import android.graphics.PointF; import android.util.AttributeSet; import android.view.MotionEvent; +import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; +import com.android.launcher3.Utilities; import com.android.launcher3.util.RunnableList; import com.android.launcher3.util.SplitConfigurationOptions.StagedSplitBounds; import com.android.launcher3.util.TransformingTouchDelegate; @@ -52,7 +55,6 @@ public class GroupedTaskView extends TaskView { @Nullable private StagedSplitBounds mSplitBoundsConfig; private final DigitalWellBeingToast mDigitalWellBeingToast2; - public GroupedTaskView(Context context) { this(context, null); } @@ -204,6 +206,20 @@ public class GroupedTaskView extends TaskView { return new TaskThumbnailView[]{mSnapshotView, mSnapshotView2}; } + @Override + protected int getChildTaskIndexAtPosition(PointF position) { + if (isCoordInView(mIconView2, position) || isCoordInView(mSnapshotView2, position)) { + return 1; + } + return super.getChildTaskIndexAtPosition(position); + } + + private boolean isCoordInView(View v, PointF position) { + float[] localPos = new float[]{position.x, position.y}; + Utilities.mapCoordInSelfToDescendant(v, this, localPos); + return Utilities.pointInView(v, localPos[0], localPos[1], 0f /* slop */); + } + @Override public void onRecycle() { super.onRecycle(); diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index a042bff67f..cb7e08a255 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -619,7 +619,7 @@ public abstract class RecentsView floatingTaskViewStartingPosition.offset( - mSplitHiddenTaskView.getTranslationX(), - mSplitHiddenTaskView.getTranslationY() - )); + mSplitHiddenTaskView.getIconView().getDrawable(), startingTaskRect); mFirstFloatingTaskView.setAlpha(1); mFirstFloatingTaskView.addAnimation(anim, startingTaskRect, mTempRect, true /*fadeWithThumbnail*/); @@ -2741,7 +2737,7 @@ public abstract class RecentsView floatingTaskViewStartingPosition.offset( - taskView.getTranslationX(), - taskView.getTranslationY() - )); + thumbnailView, thumbnailView.getThumbnail(), + iconView.getDrawable(), secondTaskStartingBounds); mSecondFloatingTaskView.setAlpha(1); mSecondFloatingTaskView.addAnimation(pendingAnimation, secondTaskStartingBounds, - secondTaskEndingBounds, true /*fadeWithThumbnail*/); + secondTaskEndingBounds, true /* fadeWithThumbnail */); pendingAnimation.addEndListener(aBoolean -> - mSplitSelectStateController.setSecondTaskId(taskView.getTask().key.id, + mSplitSelectStateController.setSecondTaskId(task.key.id, aBoolean1 -> RecentsView.this.resetFromSplitSelectionState())); - mSecondSplitHiddenTaskView = taskView; - taskView.setVisibility(INVISIBLE); + if (containerTaskView.containsMultipleTasks()) { + // If we are launching from a child task, then only hide the thumbnail itself + mSecondSplitHiddenView = thumbnailView; + } else { + mSecondSplitHiddenView = containerTaskView; + } + mSecondSplitHiddenView.setVisibility(INVISIBLE); pendingAnimation.buildAnim().start(); } @@ -4059,8 +4061,8 @@ public abstract class RecentsView