Merge "Add LAUNCHER_APP_LAUNCH_PENDING_INTENT where an app is launched through pending intent." into udc-dev
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index f5202b7..3a6566a 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -147,6 +147,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
@@ -662,6 +663,14 @@
} else {
runningTasks = mGestureState.getRunningTask().getPlaceholderTasks();
}
+
+ // Safeguard against any null tasks being sent to recents view, happens when quickswitching
+ // very quickly w/ split tasks because TopTaskTracker provides stale information compared to
+ // actual running tasks in the recents animation.
+ // TODO(b/236226779), Proper fix (ag/22237143)
+ if (Arrays.stream(runningTasks).anyMatch(Objects::isNull)) {
+ return;
+ }
mRecentsView.onGestureAnimationStart(runningTasks, mDeviceState.getRotationTouchHelper());
}
@@ -915,7 +924,12 @@
if (DesktopTaskView.DESKTOP_MODE_SUPPORTED && targets.hasDesktopTasks()) {
mRemoteTargetHandles = mTargetGluer.assignTargetsForDesktop(targets);
} else {
+ int untrimmedAppCount = mRemoteTargetHandles.length;
mRemoteTargetHandles = mTargetGluer.assignTargetsForSplitScreen(targets);
+ if (mRemoteTargetHandles.length < untrimmedAppCount && mIsSwipeForSplit) {
+ updateIsGestureForSplit(mRemoteTargetHandles.length);
+ setupRecentsViewUi();
+ }
}
mRecentsAnimationController = controller;
mRecentsAnimationTargets = targets;
diff --git a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
index d9c269a..84b90b9 100644
--- a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
+++ b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
@@ -29,12 +29,15 @@
import com.android.quickstep.views.DesktopTaskView;
import java.util.ArrayList;
+import java.util.Arrays;
/**
* Glues together the necessary components to animate a remote target using a
* {@link TaskViewSimulator}
*/
public class RemoteTargetGluer {
+ private static final int DEFAULT_NUM_HANDLES = 2;
+
private RemoteTargetHandle[] mRemoteTargetHandles;
private SplitBounds mSplitBounds;
@@ -62,8 +65,9 @@
}
}
- int[] splitIds = TopTaskTracker.INSTANCE.get(context).getRunningSplitTaskIds();
- init(context, sizingStrategy, splitIds.length == 2 ? 2 : 1, false /* forDesktop */);
+ // Assume 2 handles needed for split, scale down as needed later on when we actually
+ // get remote targets
+ init(context, sizingStrategy, DEFAULT_NUM_HANDLES, false /* forDesktop */);
}
private void init(Context context, BaseActivityInterface sizingStrategy, int numHandles,
@@ -108,6 +112,17 @@
* the left/top task, index 1 right/bottom.
*/
public RemoteTargetHandle[] assignTargetsForSplitScreen(RemoteAnimationTargets targets) {
+ // Resize the mRemoteTargetHandles array since we started assuming split screen, but
+ // targets.apps is the ultimate source of truth here
+ long appCount = Arrays.stream(targets.apps)
+ .filter(app -> app.mode == targets.targetMode)
+ .count();
+ if (appCount < mRemoteTargetHandles.length) {
+ RemoteTargetHandle[] newHandles = new RemoteTargetHandle[(int) appCount];
+ System.arraycopy(mRemoteTargetHandles, 0/*src*/, newHandles, 0/*dst*/, (int) appCount);
+ mRemoteTargetHandles = newHandles;
+ }
+
if (mRemoteTargetHandles.length == 1) {
// If we're not in split screen, the splitIds count doesn't really matter since we
// should always hit this case.
@@ -233,6 +248,14 @@
targets.targetMode);
}
+ /**
+ * The object returned by this is may be modified in
+ * {@link #assignTargetsForSplitScreen(RemoteAnimationTargets)}, specifically the length of the
+ * array may be shortened based on the number of RemoteAnimationTargets present.
+ * <p>
+ * This can be accessed at any time, however the count will be more accurate if accessed after
+ * calling one of the respective assignTargets*() methods
+ */
public RemoteTargetHandle[] getRemoteTargetHandles() {
return mRemoteTargetHandles;
}
diff --git a/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java b/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java
index 1b4fdc4..25ac47a 100644
--- a/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java
+++ b/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java
@@ -82,7 +82,8 @@
mContext = context;
mDeviceState = deviceState;
mGestureState = gestureState;
- mIsSwipeForSplit = TopTaskTracker.INSTANCE.get(context).getRunningSplitTaskIds().length > 1;
+ updateIsGestureForSplit(TopTaskTracker.INSTANCE.get(context)
+ .getRunningSplitTaskIds().length);
mTargetGluer = new RemoteTargetGluer(mContext, mGestureState.getActivityInterface());
mRemoteTargetHandles = mTargetGluer.getRemoteTargetHandles();
@@ -280,6 +281,10 @@
return out;
}
+ protected void updateIsGestureForSplit(int targetCount) {
+ mIsSwipeForSplit = targetCount > 1;
+ }
+
private RectFSpringAnim getWindowAnimationToHomeInternal(
HomeAnimationFactory homeAnimationFactory, RectF targetRect,
TransformParams transformParams, TaskViewSimulator taskViewSimulator,
diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java
index 2ce6c78..dd82ecf 100644
--- a/src/com/android/launcher3/folder/FolderAnimationManager.java
+++ b/src/com/android/launcher3/folder/FolderAnimationManager.java
@@ -273,6 +273,8 @@
// {@link #onAnimationEnd} before B reads new UI state from {@link #onAnimationStart}.
a.addListener(new AnimatorListenerAdapter() {
private CellLayout mCellLayout;
+
+ private boolean mFolderClipChildren;
private boolean mFolderClipToPadding;
private boolean mContentClipChildren;
private boolean mContentClipToPadding;
@@ -283,12 +285,14 @@
public void onAnimationStart(Animator animator) {
super.onAnimationStart(animator);
mCellLayout = mContent.getCurrentCellLayout();
+ mFolderClipChildren = mFolder.getClipChildren();
mFolderClipToPadding = mFolder.getClipToPadding();
mContentClipChildren = mContent.getClipChildren();
mContentClipToPadding = mContent.getClipToPadding();
mCellLayoutClipChildren = mCellLayout.getClipChildren();
mCellLayoutClipPadding = mCellLayout.getClipToPadding();
+ mFolder.setClipChildren(false);
mFolder.setClipToPadding(false);
mContent.setClipChildren(false);
mContent.setClipToPadding(false);
@@ -309,6 +313,7 @@
mFolder.mFooter.setTranslationX(0f);
mFolder.mFolderName.setAlpha(1f);
+ mFolder.setClipChildren(mFolderClipChildren);
mFolder.setClipToPadding(mFolderClipToPadding);
mContent.setClipChildren(mContentClipChildren);
mContent.setClipToPadding(mContentClipToPadding);
diff --git a/src/com/android/launcher3/util/ContentWriter.java b/src/com/android/launcher3/util/ContentWriter.java
index 7c5ef4d..9910dc2 100644
--- a/src/com/android/launcher3/util/ContentWriter.java
+++ b/src/com/android/launcher3/util/ContentWriter.java
@@ -106,7 +106,7 @@
public int commit() {
if (mCommitParams != null) {
- mCommitParams.mDbController.update(
+ return mCommitParams.mDbController.update(
Favorites.TABLE_NAME, getValues(mContext),
mCommitParams.mWhere, mCommitParams.mSelectionArgs);
}
diff --git a/src/com/android/launcher3/widget/BaseLauncherAppWidgetHostView.java b/src/com/android/launcher3/widget/BaseLauncherAppWidgetHostView.java
index 2742882..580b4f1 100644
--- a/src/com/android/launcher3/widget/BaseLauncherAppWidgetHostView.java
+++ b/src/com/android/launcher3/widget/BaseLauncherAppWidgetHostView.java
@@ -105,6 +105,7 @@
mEnforcedRectangle);
setOutlineProvider(mCornerRadiusEnforcementOutline);
setClipToOutline(true);
+ invalidateOutline();
}
/** Returns the corner radius currently enforced, in pixels. */
diff --git a/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java b/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java
index 723ea17..8dd1de4 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java
@@ -42,7 +42,6 @@
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import com.android.launcher3.R;
-import com.android.launcher3.model.data.PackageItemInfo;
import com.android.launcher3.recyclerview.ViewHolderBinder;
import com.android.launcher3.util.LabelComparator;
import com.android.launcher3.util.PackageUserKey;
@@ -58,7 +57,6 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
-import java.util.Map;
import java.util.OptionalInt;
import java.util.function.IntSupplier;
import java.util.function.Predicate;
@@ -174,9 +172,6 @@
mAllEntries.clear();
mAllEntries.add(new WidgetListSpaceEntry());
tempEntries.stream().sorted(mRowComparator).forEach(mAllEntries::add);
- if (shouldClearVisibleEntries()) {
- mVisibleEntries.clear();
- }
updateVisibleEntries();
}
@@ -426,29 +421,6 @@
updateVisibleEntries();
}
- /**
- * Returns {@code true} if there is a change in {@link #mAllEntries} that results in an
- * invalidation of {@link #mVisibleEntries}. e.g. there is change in the device language.
- */
- private boolean shouldClearVisibleEntries() {
- Map<PackageUserKey, PackageItemInfo> packagesInfo =
- mAllEntries.stream()
- .filter(entry -> entry instanceof WidgetsListHeaderEntry)
- .map(entry -> entry.mPkgItem)
- .collect(Collectors.toMap(
- entry -> PackageUserKey.fromPackageItemInfo(entry),
- entry -> entry));
- for (WidgetsListBaseEntry visibleEntry: mVisibleEntries) {
- PackageUserKey key = PackageUserKey.fromPackageItemInfo(visibleEntry.mPkgItem);
- PackageItemInfo packageItemInfo = packagesInfo.get(key);
- if (packageItemInfo != null
- && !visibleEntry.mPkgItem.title.equals(packageItemInfo.title)) {
- return true;
- }
- }
- return false;
- }
-
/** Comparator for sorting WidgetListRowEntry based on package title. */
public static class WidgetListBaseRowEntryComparator implements
Comparator<WidgetsListBaseEntry> {