Merge "Update TaplOpenCloseAllApps click position to dismiss All Apps" into main
diff --git a/aconfig/launcher.aconfig b/aconfig/launcher.aconfig
index 9080284..af175ce 100644
--- a/aconfig/launcher.aconfig
+++ b/aconfig/launcher.aconfig
@@ -83,3 +83,10 @@
description: "Enables two pane widget picker for unfolded foldables"
bug: "313922374"
}
+
+flag {
+ name: "enable_tablet_two_pane_picker_v2"
+ namespace: "launcher"
+ description: "Enables full width two pane widget picker for tablets in landscape and portrait"
+ bug: "315055849"
+}
diff --git a/protos/launcher_atom.proto b/protos/launcher_atom.proto
index 5a9e147..8240f11 100644
--- a/protos/launcher_atom.proto
+++ b/protos/launcher_atom.proto
@@ -138,7 +138,7 @@
}
}
-// Next value 54
+// Next value 55
enum Attribute {
option allow_alias = true;
@@ -200,6 +200,7 @@
DATA_SOURCE_APPSEARCH_CATEGORY_SRP_PREVIEW = 48;
DATA_SOURCE_APPSEARCH_ENTITY_SRP_PREVIEW = 49;
DATA_SOURCE_AIAI_SEARCH_ROOT = 47;
+ DATA_SOURCE_LAUNCHER = 54;
// Web suggestions provided by AGA
ALL_APPS_SEARCH_RESULT_WEB_SUGGEST = 39;
diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
index d6ab54e..8db63e3 100644
--- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
+++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
@@ -55,6 +55,7 @@
import static com.android.launcher3.config.FeatureFlags.KEYGUARD_ANIMATION;
import static com.android.launcher3.config.FeatureFlags.SEPARATE_RECENTS_ACTIVITY;
import static com.android.launcher3.model.data.ItemInfo.NO_MATCHING_ID;
+import static com.android.launcher3.testing.shared.TestProtocol.WALLPAPER_OPEN_ANIMATION_FINISHED_MESSAGE;
import static com.android.launcher3.util.DisplayController.isTransientTaskbar;
import static com.android.launcher3.util.Executors.ORDERED_BG_EXECUTOR;
import static com.android.launcher3.util.MultiPropertyFactory.MULTI_PROPERTY_VALUE;
@@ -120,6 +121,7 @@
import com.android.launcher3.LauncherAnimationRunner.RemoteAnimationFactory;
import com.android.launcher3.anim.AnimationSuccessListener;
import com.android.launcher3.anim.AnimatorListeners;
+import com.android.launcher3.compat.AccessibilityManagerCompat;
import com.android.launcher3.dragndrop.DragLayer;
import com.android.launcher3.icons.FastBitmapDrawable;
import com.android.launcher3.model.data.ItemInfo;
@@ -1651,6 +1653,15 @@
if (launcherIsForceInvisibleOrOpening) {
addCujInstrumentation(anim, playFallBackAnimation
? CUJ_APP_CLOSE_TO_HOME_FALLBACK : CUJ_APP_CLOSE_TO_HOME);
+
+ anim.addListener(new AnimationSuccessListener() {
+ @Override
+ public void onAnimationSuccess(Animator animator) {
+ AccessibilityManagerCompat.sendTestProtocolEventToTest(
+ mLauncher, WALLPAPER_OPEN_ANIMATION_FINISHED_MESSAGE);
+ }
+ });
+
// Only register the content animation for cancellation when state changes
mLauncher.getStateManager().setCurrentAnimation(anim);
diff --git a/quickstep/src/com/android/quickstep/TaskIconCache.java b/quickstep/src/com/android/quickstep/TaskIconCache.java
index 20a751b..1b3f598 100644
--- a/quickstep/src/com/android/quickstep/TaskIconCache.java
+++ b/quickstep/src/com/android/quickstep/TaskIconCache.java
@@ -31,7 +31,6 @@
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.SparseArray;
-import android.view.accessibility.AccessibilityManager;
import androidx.annotation.WorkerThread;
@@ -45,6 +44,7 @@
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.DisplayController.DisplayInfoChangeListener;
import com.android.launcher3.util.DisplayController.Info;
+import com.android.launcher3.util.FlagOp;
import com.android.launcher3.util.Preconditions;
import com.android.quickstep.util.CancellableTask;
import com.android.quickstep.util.TaskKeyLruCache;
@@ -62,7 +62,6 @@
public class TaskIconCache implements DisplayInfoChangeListener {
private final Executor mBgExecutor;
- private final AccessibilityManager mAccessibilityManager;
private final Context mContext;
private final TaskKeyLruCache<TaskCacheEntry> mIconCache;
@@ -79,7 +78,6 @@
public TaskIconCache(Context context, Executor bgExecutor, IconProvider iconProvider) {
mContext = context;
mBgExecutor = bgExecutor;
- mAccessibilityManager = context.getSystemService(AccessibilityManager.class);
mIconProvider = iconProvider;
Resources res = context.getResources();
@@ -238,14 +236,11 @@
if ((index = mDefaultIcons.indexOfKey(userId)) >= 0) {
return mDefaultIcons.valueAt(index).newIcon(mContext);
} else {
- try (BaseIconFactory li = getIconFactory()) {
- BitmapInfo info = mDefaultIconBase.withFlags(
- li.getBitmapFlagOp(new IconOptions()
- .setUser(UserCache.INSTANCE.get(mContext)
- .getUserInfo(UserHandle.of(userId)))));
- mDefaultIcons.put(userId, info);
- return info.newIcon(mContext);
- }
+ BitmapInfo info = mDefaultIconBase.withFlags(
+ UserCache.INSTANCE.get(mContext).getUserInfo(UserHandle.of(userId))
+ .applyBitmapInfoFlags(FlagOp.NO_OP));
+ mDefaultIcons.put(userId, info);
+ return info.newIcon(mContext);
}
}
}
diff --git a/quickstep/src/com/android/quickstep/util/SplitSelectDataHolder.kt b/quickstep/src/com/android/quickstep/util/SplitSelectDataHolder.kt
index 423ba43..c013483 100644
--- a/quickstep/src/com/android/quickstep/util/SplitSelectDataHolder.kt
+++ b/quickstep/src/com/android/quickstep/util/SplitSelectDataHolder.kt
@@ -93,6 +93,7 @@
private var secondTaskId: Int = INVALID_TASK_ID
private var initialIntent: Intent? = null
private var secondIntent: Intent? = null
+ private var widgetSecondIntent: Intent? = null
private var initialUser: UserHandle? = null
private var secondUser: UserHandle? = null
private var initialPendingIntent: PendingIntent? = null
@@ -167,6 +168,16 @@
secondUser = pendingIntent.creatorUserHandle
}
+ /**
+ * Similar to [setSecondTask] except this is to be called for widgets which can pass through
+ * an extra intent from their RemoteResponse.
+ * See [android.widget.RemoteViews.RemoteResponse.getLaunchOptions].first
+ */
+ fun setSecondWidget(pendingIntent: PendingIntent, widgetIntent: Intent?) {
+ setSecondTask(pendingIntent)
+ widgetSecondIntent = widgetIntent
+ }
+
private fun getShortcutInfo(intent: Intent?, user: UserHandle?): ShortcutInfo? {
val intentPackage = intent?.getPackage() ?: return null
val shortcutId = intent.getStringExtra(ShortcutKey.EXTRA_SHORTCUT_ID)
@@ -241,6 +252,7 @@
secondTaskId,
initialPendingIntent,
secondPendingIntent,
+ widgetSecondIntent,
initialUser?.identifier ?: -1,
secondUser?.identifier ?: -1,
initialShortcut,
@@ -257,7 +269,8 @@
* Note that both [initialIntent] and [secondIntent] will be nullified on method return
*
* One caveat is that if [secondPendingIntent] is set, we will use that and *not* attempt to
- * convert [secondIntent]
+ * convert [secondIntent].
+ * This also leaves [widgetSecondIntent] untouched.
*/
private fun convertIntentsToFinalTypes() {
initialShortcut = getShortcutInfo(initialIntent, initialUser)
@@ -343,6 +356,7 @@
var secondTaskId: Int = INVALID_TASK_ID,
var initialPendingIntent: PendingIntent? = null,
var secondPendingIntent: PendingIntent? = null,
+ var widgetSecondIntent: Intent? = null,
var initialUserId: Int = -1,
var secondUserId: Int = -1,
var initialShortcut: ShortcutInfo? = null,
diff --git a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
index 145707b..8b27a85 100644
--- a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
+++ b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
@@ -32,6 +32,7 @@
import static com.android.quickstep.util.SplitSelectDataHolder.SPLIT_TASK_SHORTCUT;
import static com.android.quickstep.util.SplitSelectDataHolder.SPLIT_TASK_TASK;
import static com.android.quickstep.views.DesktopTaskView.isDesktopModeSupported;
+import static com.android.wm.shell.common.split.SplitScreenConstants.KEY_EXTRA_WIDGET_INTENT;
import static com.android.wm.shell.common.split.SplitScreenConstants.SNAP_TO_50_50;
import android.animation.Animator;
@@ -355,6 +356,10 @@
mSplitSelectDataHolder.setSecondTask(pendingIntent);
}
+ public void setSecondWidget(PendingIntent pendingIntent, Intent widgetIntent) {
+ mSplitSelectDataHolder.setSecondWidget(pendingIntent, widgetIntent);
+ }
+
/**
* To be called when we want to launch split pairs from Overview. Split can be initiated from
* either Overview or home, or all apps. Either both taskIds are set, or a pending intent + a
@@ -380,11 +385,13 @@
ShortcutInfo secondShortcut = launchData.getSecondShortcut();
PendingIntent firstPI = launchData.getInitialPendingIntent();
PendingIntent secondPI = launchData.getSecondPendingIntent();
+ Intent widgetIntent = launchData.getWidgetSecondIntent();
int firstUserId = launchData.getInitialUserId();
int secondUserId = launchData.getSecondUserId();
int initialStagePosition = launchData.getInitialStagePosition();
Bundle optionsBundle = options1.toBundle();
-
+ Bundle extrasBundle = new Bundle(1);
+ extrasBundle.putParcelable(KEY_EXTRA_WIDGET_INTENT, widgetIntent);
if (TaskAnimationManager.ENABLE_SHELL_TRANSITIONS) {
final RemoteTransition remoteTransition = getShellRemoteTransition(firstTaskId,
secondTaskId, callback, "LaunchSplitPair");
@@ -396,7 +403,7 @@
case SPLIT_TASK_PENDINGINTENT ->
mSystemUiProxy.startIntentAndTask(secondPI, secondUserId, optionsBundle,
- firstTaskId, null /*options2*/, initialStagePosition, snapPosition,
+ firstTaskId, extrasBundle, initialStagePosition, snapPosition,
remoteTransition, shellInstanceId);
case SPLIT_TASK_SHORTCUT ->
@@ -411,9 +418,9 @@
case SPLIT_PENDINGINTENT_PENDINGINTENT ->
mSystemUiProxy.startIntents(firstPI, firstUserId, firstShortcut,
- optionsBundle, secondPI, secondUserId, secondShortcut,
- null /*options2*/, initialStagePosition, snapPosition,
- remoteTransition, shellInstanceId);
+ optionsBundle, secondPI, secondUserId, secondShortcut, extrasBundle,
+ initialStagePosition, snapPosition, remoteTransition,
+ shellInstanceId);
case SPLIT_SHORTCUT_TASK ->
mSystemUiProxy.startShortcutAndTask(firstShortcut, optionsBundle,
diff --git a/quickstep/src/com/android/quickstep/util/SplitToWorkspaceController.java b/quickstep/src/com/android/quickstep/util/SplitToWorkspaceController.java
index 9313342..e705285 100644
--- a/quickstep/src/com/android/quickstep/util/SplitToWorkspaceController.java
+++ b/quickstep/src/com/android/quickstep/util/SplitToWorkspaceController.java
@@ -72,7 +72,8 @@
* @return {@code true} if we can attempt launch the widget into split, {@code false} otherwise
* to allow launcher to handle the click
*/
- public boolean handleSecondWidgetSelectionForSplit(View view, PendingIntent pendingIntent) {
+ public boolean handleSecondWidgetSelectionForSplit(View view, PendingIntent pendingIntent,
+ Intent remoteResponseIntent) {
if (shouldIgnoreSecondSplitLaunch()) {
return false;
}
@@ -86,7 +87,7 @@
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
view.post(() -> {
- mController.setSecondTask(pendingIntent);
+ mController.setSecondWidget(pendingIntent, remoteResponseIntent);
// Convert original widgetView into bitmap to use for animation
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index 7d15f7b..5443ff9 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -70,6 +70,7 @@
import com.android.launcher3.celllayout.DelegatedCellDrawing;
import com.android.launcher3.celllayout.ItemConfiguration;
import com.android.launcher3.celllayout.ReorderAlgorithm;
+import com.android.launcher3.celllayout.ReorderParameters;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.dragndrop.DraggableView;
import com.android.launcher3.folder.PreviewBackground;
@@ -1748,8 +1749,11 @@
protected ItemConfiguration findReorderSolution(int pixelX, int pixelY, int minSpanX,
int minSpanY, int spanX, int spanY, int[] direction, View dragView, boolean decX,
ItemConfiguration solution) {
- return createReorderAlgorithm().findReorderSolution(pixelX, pixelY, minSpanX, minSpanY,
- spanX, spanY, direction, dragView, decX, solution);
+ ItemConfiguration configuration = new ItemConfiguration();
+ copyCurrentStateToSolution(configuration);
+ ReorderParameters parameters = new ReorderParameters(pixelX, pixelY, spanX, spanY, minSpanX,
+ minSpanY, dragView, configuration);
+ return createReorderAlgorithm().findReorderSolution(parameters, decX);
}
public void copyCurrentStateToSolution(ItemConfiguration solution) {
@@ -1779,8 +1783,12 @@
*/
public ItemConfiguration calculateReorder(int pixelX, int pixelY, int minSpanX, int minSpanY,
int spanX, int spanY, View dragView) {
- return createReorderAlgorithm().calculateReorder(pixelX, pixelY, minSpanX, minSpanY,
- spanX, spanY, dragView);
+ ItemConfiguration configuration = new ItemConfiguration();
+ copyCurrentStateToSolution(configuration);
+ return createReorderAlgorithm().calculateReorder(
+ new ReorderParameters(pixelX, pixelY, spanX, spanY, minSpanX, minSpanY, dragView,
+ configuration)
+ );
}
int[] performReorder(int pixelX, int pixelY, int minSpanX, int minSpanY, int spanX, int spanY,
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 0278e4f..126efbb 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -22,7 +22,6 @@
import static android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
import static com.android.app.animation.Interpolators.EMPHASIZED;
-import static com.android.launcher3.AbstractFloatingView.TYPE_ALL;
import static com.android.launcher3.AbstractFloatingView.TYPE_FOLDER;
import static com.android.launcher3.AbstractFloatingView.TYPE_ICON_SURFACE;
import static com.android.launcher3.AbstractFloatingView.TYPE_REBIND_SAFE;
@@ -351,14 +350,9 @@
// UI and state for the overview panel
private View mOverviewPanel;
- @Thunk
- boolean mWorkspaceLoading = true;
-
// Used to notify when an activity launch has been deferred because launcher is not yet resumed
// TODO: See if we can remove this later
private Runnable mOnDeferredActivityLaunchCallback;
-
- private ViewOnDrawExecutor mPendingExecutor;
private OnPreDrawListener mOnInitialBindListener;
private LauncherModel mModel;
@@ -1075,7 +1069,7 @@
}
private void logStopAndResume(boolean isResume) {
- if (mPendingExecutor != null) return;
+ if (mModelCallbacks.getPendingExecutor() != null) return;
int pageIndex = mWorkspace.isOverlayShown() ? -1 : mWorkspace.getCurrentPage();
int statsLogOrdinal = mStateManager.getState().statsLogOrdinal;
@@ -1715,7 +1709,7 @@
mAppWidgetHolder.destroy();
TextKeyListener.getInstance().release();
- clearPendingBinds();
+ mModelCallbacks.clearPendingBinds();
LauncherAppState.getIDP(this).removeOnChangeListener(this);
mOverlayManager.onActivityDestroyed();
@@ -2077,48 +2071,9 @@
return mModelCallbacks.getPagesToBindSynchronously(orderedScreenIds);
}
- /**
- * Clear any pending bind callbacks. This is called when is loader is planning to
- * perform a full rebind from scratch.
- */
- @Override
- public void clearPendingBinds() {
- if (mPendingExecutor != null) {
- mPendingExecutor.cancel();
- mPendingExecutor = null;
-
- // We might have set this flag previously and forgot to clear it.
- mAppsView.getAppsStore()
- .disableDeferUpdatesSilently(AllAppsStore.DEFER_UPDATES_NEXT_DRAW);
- }
- }
-
- /**
- * Refreshes the shortcuts shown on the workspace.
- * <p>
- * Implementation of the method from LauncherModel.Callbacks.
- */
@Override
public void startBinding() {
- TraceHelper.INSTANCE.beginSection("startBinding");
- // Floating panels (except the full widget sheet) are associated with individual icons. If
- // we are starting a fresh bind, close all such panels as all the icons are about
- // to go away.
- AbstractFloatingView.closeOpenViews(this, true, TYPE_ALL & ~TYPE_REBIND_SAFE);
-
- setWorkspaceLoading(true);
-
- // Clear the workspace because it's going to be rebound
- mDragController.cancelDrag();
-
- mWorkspace.clearDropTargets();
- mWorkspace.removeAllWorkspaceScreens();
- mAppWidgetHolder.clearViews();
-
- if (mHotseat != null) {
- mHotseat.resetLayout(getDeviceProfile().isVerticalBarLayout());
- }
- TraceHelper.INSTANCE.endSection();
+ mModelCallbacks.startBinding();
}
@Override
@@ -2500,8 +2455,8 @@
}
public void clearPendingExecutor(ViewOnDrawExecutor executor) {
- if (mPendingExecutor == executor) {
- mPendingExecutor = null;
+ if (mModelCallbacks.getPendingExecutor() == executor) {
+ mModelCallbacks.setPendingExecutor(null);
}
}
@@ -2512,9 +2467,9 @@
mModelCallbacks.setSynchronouslyBoundPages(boundPages);
mModelCallbacks.setPagesToBindSynchronously(new IntSet());
- clearPendingBinds();
+ mModelCallbacks.clearPendingBinds();
ViewOnDrawExecutor executor = new ViewOnDrawExecutor(pendingTasks);
- mPendingExecutor = executor;
+ mModelCallbacks.setPendingExecutor(executor);
if (!isInState(ALL_APPS)) {
mAppsView.getAppsStore().enableDeferUpdates(AllAppsStore.DEFER_UPDATES_NEXT_DRAW);
pendingTasks.add(() -> mAppsView.getAppsStore().disableDeferUpdates(
@@ -2568,7 +2523,7 @@
TraceHelper.INSTANCE.beginSection("finishBindingItems");
mWorkspace.restoreInstanceStateForRemainingPages();
- setWorkspaceLoading(false);
+ mModelCallbacks.setWorkspaceLoading(false);
if (mPendingActivityResult != null) {
handleActivityResult(mPendingActivityResult.requestCode,
@@ -2851,7 +2806,7 @@
writer.println(prefix + "Misc:");
dumpMisc(prefix + "\t", writer);
- writer.println(prefix + "\tmWorkspaceLoading=" + mWorkspaceLoading);
+ writer.println(prefix + "\tmWorkspaceLoading=" + mModelCallbacks.getWorkspaceLoading());
writer.println(prefix + "\tmPendingRequestArgs=" + mPendingRequestArgs
+ " mPendingActivityResult=" + mPendingActivityResult);
writer.println(prefix + "\tmRotationHelper: " + mRotationHelper);
@@ -3079,21 +3034,17 @@
// Getters and Setters
- private void setWorkspaceLoading(boolean value) {
- mWorkspaceLoading = value;
- }
-
public boolean isWorkspaceLocked() {
- return mWorkspaceLoading || mPendingRequestArgs != null;
+ return isWorkspaceLoading() || mPendingRequestArgs != null;
}
public boolean isWorkspaceLoading() {
- return mWorkspaceLoading;
+ return mModelCallbacks.getWorkspaceLoading();
}
@Override
public boolean isBindingItems() {
- return mWorkspaceLoading;
+ return isWorkspaceLoading();
}
/**
diff --git a/src/com/android/launcher3/ModelCallbacks.kt b/src/com/android/launcher3/ModelCallbacks.kt
index bcd30d3..51d7690 100644
--- a/src/com/android/launcher3/ModelCallbacks.kt
+++ b/src/com/android/launcher3/ModelCallbacks.kt
@@ -2,6 +2,7 @@
import androidx.annotation.UiThread
import com.android.launcher3.WorkspaceLayoutManager.FIRST_SCREEN_ID
+import com.android.launcher3.allapps.AllAppsStore
import com.android.launcher3.config.FeatureFlags
import com.android.launcher3.config.FeatureFlags.shouldShowFirstPageWidget
import com.android.launcher3.model.BgDataModel
@@ -18,6 +19,8 @@
import com.android.launcher3.util.IntSet
import com.android.launcher3.util.PackageUserKey
import com.android.launcher3.util.Preconditions
+import com.android.launcher3.util.TraceHelper
+import com.android.launcher3.util.ViewOnDrawExecutor
import com.android.launcher3.widget.PendingAddWidgetInfo
import com.android.launcher3.widget.model.WidgetsListBaseEntry
import java.util.function.Predicate
@@ -27,11 +30,55 @@
var synchronouslyBoundPages = LIntSet()
var pagesToBindSynchronously = LIntSet()
- var isFirstPagePinnedItemEnabled =
+ private var isFirstPagePinnedItemEnabled =
(BuildConfig.QSB_ON_FIRST_SCREEN && !FeatureFlags.ENABLE_SMARTSPACE_REMOVAL.get())
var stringCache: StringCache? = null
+ var pendingExecutor: ViewOnDrawExecutor? = null
+
+ var workspaceLoading = true
+
+ /**
+ * Refreshes the shortcuts shown on the workspace.
+ *
+ * Implementation of the method from LauncherModel.Callbacks.
+ */
+ override fun startBinding() {
+ TraceHelper.INSTANCE.beginSection("startBinding")
+ // Floating panels (except the full widget sheet) are associated with individual icons. If
+ // we are starting a fresh bind, close all such panels as all the icons are about
+ // to go away.
+ AbstractFloatingView.closeOpenViews(
+ launcher,
+ true,
+ AbstractFloatingView.TYPE_ALL and AbstractFloatingView.TYPE_REBIND_SAFE.inv()
+ )
+ workspaceLoading = true
+
+ // Clear the workspace because it's going to be rebound
+ launcher.dragController.cancelDrag()
+ launcher.workspace.clearDropTargets()
+ launcher.workspace.removeAllWorkspaceScreens()
+ launcher.appWidgetHolder.clearViews()
+ launcher.hotseat?.resetLayout(launcher.deviceProfile.isVerticalBarLayout)
+ TraceHelper.INSTANCE.endSection()
+ }
+
+ /**
+ * Clear any pending bind callbacks. This is called when is loader is planning to perform a full
+ * rebind from scratch.
+ */
+ override fun clearPendingBinds() {
+ pendingExecutor?.cancel() ?: return
+ pendingExecutor = null
+
+ // We might have set this flag previously and forgot to clear it.
+ launcher.appsView.appsStore.disableDeferUpdatesSilently(
+ AllAppsStore.DEFER_UPDATES_NEXT_DRAW
+ )
+ }
+
override fun preAddApps() {
// If there's an undo snackbar, force it to complete to ensure empty screens are removed
// before trying to add new items.
@@ -119,7 +166,7 @@
val visibleIds =
when {
!pagesToBindSynchronously.isEmpty -> pagesToBindSynchronously
- !launcher.isWorkspaceLoading -> launcher.workspace.currentPageScreenIds
+ !workspaceLoading -> launcher.workspace.currentPageScreenIds
else -> synchronouslyBoundPages
}
// Launcher IntArray has the same name as Kotlin IntArray
diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java
index b74699a..e0f6101 100644
--- a/src/com/android/launcher3/Utilities.java
+++ b/src/com/android/launcher3/Utilities.java
@@ -79,7 +79,6 @@
import com.android.launcher3.dragndrop.FolderAdaptiveIcon;
import com.android.launcher3.graphics.TintedDrawableSpan;
-import com.android.launcher3.icons.BaseIconFactory;
import com.android.launcher3.icons.BitmapInfo;
import com.android.launcher3.icons.LauncherIcons;
import com.android.launcher3.icons.ShortcutCachingLogic;
@@ -91,6 +90,7 @@
import com.android.launcher3.shortcuts.ShortcutKey;
import com.android.launcher3.shortcuts.ShortcutRequest;
import com.android.launcher3.testing.shared.ResourceUtils;
+import com.android.launcher3.util.FlagOp;
import com.android.launcher3.util.IntArray;
import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
import com.android.launcher3.util.Themes;
@@ -676,12 +676,11 @@
}
if (badge == null) {
- try (LauncherIcons li = LauncherIcons.obtain(context)) {
- badge = BitmapInfo.LOW_RES_INFO.withFlags(
- li.getBitmapFlagOp(new BaseIconFactory.IconOptions().setUser(
- UserCache.INSTANCE.get(context).getUserInfo(info.user))))
- .getBadgeDrawable(context, useTheme);
- }
+ badge = BitmapInfo.LOW_RES_INFO.withFlags(
+ UserCache.INSTANCE.get(context)
+ .getUserInfo(info.user)
+ .applyBitmapInfoFlags(FlagOp.NO_OP))
+ .getBadgeDrawable(context, useTheme);
if (badge == null) {
badge = new ColorDrawable(Color.TRANSPARENT);
}
diff --git a/src/com/android/launcher3/celllayout/MulticellReorderAlgorithm.java b/src/com/android/launcher3/celllayout/MulticellReorderAlgorithm.java
index 7deb653..8d0cf13 100644
--- a/src/com/android/launcher3/celllayout/MulticellReorderAlgorithm.java
+++ b/src/com/android/launcher3/celllayout/MulticellReorderAlgorithm.java
@@ -48,28 +48,24 @@
}
@Override
- public ItemConfiguration closestEmptySpaceReorder(int pixelX, int pixelY, int minSpanX,
- int minSpanY, int spanX, int spanY) {
+ public ItemConfiguration closestEmptySpaceReorder(ReorderParameters reorderParameters) {
return removeSeamFromSolution(simulateSeam(
- () -> super.closestEmptySpaceReorder(pixelX, pixelY, minSpanX, minSpanY, spanX,
- spanY)));
+ () -> super.closestEmptySpaceReorder(reorderParameters))
+ );
}
@Override
- public ItemConfiguration findReorderSolution(int pixelX, int pixelY, int minSpanX,
- int minSpanY, int spanX, int spanY, int[] direction, View dragView, boolean decX,
- ItemConfiguration solution) {
+ public ItemConfiguration findReorderSolution(ReorderParameters reorderParameters,
+ boolean decX) {
return removeSeamFromSolution(simulateSeam(
- () -> super.findReorderSolution(pixelX, pixelY, minSpanX, minSpanY, spanX, spanY,
- direction, dragView, decX, solution)));
+ () -> super.findReorderSolution(reorderParameters, decX)));
}
@Override
- public ItemConfiguration dropInPlaceSolution(int pixelX, int pixelY, int spanX,
- int spanY,
- View dragView) {
- return removeSeamFromSolution(simulateSeam(
- () -> super.dropInPlaceSolution(pixelX, pixelY, spanX, spanY, dragView)));
+ public ItemConfiguration dropInPlaceSolution(ReorderParameters reorderParameters) {
+ return removeSeamFromSolution(
+ simulateSeam(() -> super.dropInPlaceSolution(reorderParameters))
+ );
}
void addSeam() {
diff --git a/src/com/android/launcher3/celllayout/ReorderAlgorithm.java b/src/com/android/launcher3/celllayout/ReorderAlgorithm.java
index 7385c0a..42b6991 100644
--- a/src/com/android/launcher3/celllayout/ReorderAlgorithm.java
+++ b/src/com/android/launcher3/celllayout/ReorderAlgorithm.java
@@ -45,36 +45,28 @@
* This method differs from closestEmptySpaceReorder and dropInPlaceSolution because this method
* will move items around and will change the shape of the item if possible to try to find a
* solution.
- *
+ * <p>
* When changing the size of the widget this method will try first subtracting -1 in the x
* dimension and then subtracting -1 in the y dimension until finding a possible solution or
* until it no longer can reduce the span.
*
- * @param pixelX X coordinate in pixels in the screen
- * @param pixelY Y coordinate in pixels in the screen
- * @param minSpanX minimum possible horizontal span it will try to find a solution for.
- * @param minSpanY minimum possible vertical span it will try to find a solution for.
- * @param spanX horizontal cell span
- * @param spanY vertical cell span
- * @param direction direction in which it will try to push the items intersecting the desired
- * view
- * @param dragView view being dragged in reorder
- * @param decX whether it will decrease the horizontal or vertical span if it can't find a
- * solution for the current span.
- * @param solution variable to store the solution
+ * @param decX whether it will decrease the horizontal or vertical span if it can't find a
+ * solution for the current span.
* @return the same solution variable
*/
- public ItemConfiguration findReorderSolution(int pixelX, int pixelY, int minSpanX,
- int minSpanY, int spanX, int spanY, int[] direction, View dragView, boolean decX,
- ItemConfiguration solution) {
- return findReorderSolutionRecursive(pixelX, pixelY, minSpanX, minSpanY, spanX, spanY,
- direction, dragView, decX, solution);
+ public ItemConfiguration findReorderSolution(ReorderParameters reorderParameters,
+ boolean decX) {
+ return findReorderSolutionRecursive(reorderParameters.getPixelX(),
+ reorderParameters.getPixelY(), reorderParameters.getMinSpanX(),
+ reorderParameters.getMinSpanY(), reorderParameters.getSpanX(),
+ reorderParameters.getSpanY(), mCellLayout.mDirectionVector,
+ reorderParameters.getDragView(), decX, reorderParameters.getSolution());
}
- private ItemConfiguration findReorderSolutionRecursive(int pixelX, int pixelY,
- int minSpanX, int minSpanY, int spanX, int spanY, int[] direction, View dragView,
- boolean decX, ItemConfiguration solution) {
+ private ItemConfiguration findReorderSolutionRecursive(int pixelX, int pixelY, int minSpanX,
+ int minSpanY, int spanX, int spanY, int[] direction, View dragView, boolean decX,
+ ItemConfiguration solution) {
// Copy the current state into the solution. This solution will be manipulated as necessary.
mCellLayout.copyCurrentStateToSolution(solution);
// Copy the current occupied array into the temporary occupied array. This array will be
@@ -89,8 +81,8 @@
boolean success;
// First we try the exact nearest position of the item being dragged,
// we will then want to try to move this around to other neighbouring positions
- success = rearrangementExists(result[0], result[1], spanX, spanY, direction,
- dragView, solution);
+ success = rearrangementExists(result[0], result[1], spanX, spanY, direction, dragView,
+ solution);
if (!success) {
// We try shrinking the widget down to size in an alternating pattern, shrink 1 in
@@ -135,10 +127,11 @@
// and not by the views hash which is "random".
// The views are sorted twice, once for the X position and a second time for the Y position
// to ensure same order everytime.
- Comparator comparator = Comparator.comparing(view ->
- ((CellLayoutLayoutParams) ((View) view).getLayoutParams()).getCellX())
- .thenComparing(view ->
- ((CellLayoutLayoutParams) ((View) view).getLayoutParams()).getCellY());
+ Comparator comparator = Comparator.comparing(
+ view -> ((CellLayoutLayoutParams) ((View) view).getLayoutParams()).getCellX()
+ ).thenComparing(
+ view -> ((CellLayoutLayoutParams) ((View) view).getLayoutParams()).getCellY()
+ );
List<View> views = solution.map.keySet().stream().sorted(comparator).toList();
for (View child : views) {
if (child == ignoreView) continue;
@@ -158,15 +151,13 @@
// First we try to find a solution which respects the push mechanic. That is,
// we try to find a solution such that no displaced item travels through another item
// without also displacing that item.
- if (attemptPushInDirection(intersectingViews, occupiedRect, direction,
- ignoreView,
+ if (attemptPushInDirection(intersectingViews, occupiedRect, direction, ignoreView,
solution)) {
return true;
}
// Next we try moving the views as a block, but without requiring the push mechanic.
- if (addViewsToTempLocation(intersectingViews, occupiedRect, direction,
- ignoreView,
+ if (addViewsToTempLocation(intersectingViews, occupiedRect, direction, ignoreView,
solution)) {
return true;
}
@@ -180,8 +171,8 @@
return true;
}
- private boolean addViewToTempLocation(View v, Rect rectOccupiedByPotentialDrop,
- int[] direction, ItemConfiguration currentState) {
+ private boolean addViewToTempLocation(View v, Rect rectOccupiedByPotentialDrop, int[] direction,
+ ItemConfiguration currentState) {
CellAndSpan c = currentState.map.get(v);
boolean success = false;
mCellLayout.mTmpOccupied.markCells(c, false);
@@ -305,16 +296,16 @@
int temp = direction[1];
direction[1] = 0;
- if (pushViewsToTempLocation(intersectingViews, occupied, direction,
- ignoreView, solution)) {
+ if (pushViewsToTempLocation(intersectingViews, occupied, direction, ignoreView,
+ solution)) {
return true;
}
direction[1] = temp;
temp = direction[0];
direction[0] = 0;
- if (pushViewsToTempLocation(intersectingViews, occupied, direction,
- ignoreView, solution)) {
+ if (pushViewsToTempLocation(intersectingViews, occupied, direction, ignoreView,
+ solution)) {
return true;
}
// Revert the direction
@@ -325,16 +316,16 @@
direction[1] *= -1;
temp = direction[1];
direction[1] = 0;
- if (pushViewsToTempLocation(intersectingViews, occupied, direction,
- ignoreView, solution)) {
+ if (pushViewsToTempLocation(intersectingViews, occupied, direction, ignoreView,
+ solution)) {
return true;
}
direction[1] = temp;
temp = direction[0];
direction[0] = 0;
- if (pushViewsToTempLocation(intersectingViews, occupied, direction,
- ignoreView, solution)) {
+ if (pushViewsToTempLocation(intersectingViews, occupied, direction, ignoreView,
+ solution)) {
return true;
}
// revert the direction
@@ -345,15 +336,15 @@
} else {
// If the direction vector has a single non-zero component, we push first in the
// direction of the vector
- if (pushViewsToTempLocation(intersectingViews, occupied, direction,
- ignoreView, solution)) {
+ if (pushViewsToTempLocation(intersectingViews, occupied, direction, ignoreView,
+ solution)) {
return true;
}
// Then we try the opposite direction
direction[0] *= -1;
direction[1] *= -1;
- if (pushViewsToTempLocation(intersectingViews, occupied, direction,
- ignoreView, solution)) {
+ if (pushViewsToTempLocation(intersectingViews, occupied, direction, ignoreView,
+ solution)) {
return true;
}
// Switch the direction back
@@ -367,16 +358,16 @@
int temp = direction[1];
direction[1] = direction[0];
direction[0] = temp;
- if (pushViewsToTempLocation(intersectingViews, occupied, direction,
- ignoreView, solution)) {
+ if (pushViewsToTempLocation(intersectingViews, occupied, direction, ignoreView,
+ solution)) {
return true;
}
// Then we try the opposite direction
direction[0] *= -1;
direction[1] *= -1;
- if (pushViewsToTempLocation(intersectingViews, occupied, direction,
- ignoreView, solution)) {
+ if (pushViewsToTempLocation(intersectingViews, occupied, direction, ignoreView,
+ solution)) {
return true;
}
// Switch the direction back
@@ -446,63 +437,59 @@
/**
* Returns a "reorder" if there is empty space without rearranging anything.
*
- * @param pixelX X coordinate in pixels in the screen
- * @param pixelY Y coordinate in pixels in the screen
- * @param spanX horizontal cell span
- * @param spanY vertical cell span
- * @param dragView view being dragged in reorder
* @return the configuration that represents the found reorder
*/
- public ItemConfiguration dropInPlaceSolution(int pixelX, int pixelY, int spanX,
- int spanY, View dragView) {
- int[] result = mCellLayout.findNearestAreaIgnoreOccupied(pixelX, pixelY, spanX, spanY,
- new int[2]);
+ public ItemConfiguration dropInPlaceSolution(ReorderParameters reorderParameters) {
+ int[] result = mCellLayout.findNearestAreaIgnoreOccupied(reorderParameters.getPixelX(),
+ reorderParameters.getPixelY(), reorderParameters.getSpanX(),
+ reorderParameters.getSpanY(), new int[2]);
ItemConfiguration solution = new ItemConfiguration();
mCellLayout.copyCurrentStateToSolution(solution);
solution.isSolution = !isConfigurationRegionOccupied(
- new Rect(result[0], result[1], result[0] + spanX, result[1] + spanY),
- solution,
- dragView
- );
+ new Rect(result[0], result[1], result[0] + reorderParameters.getSpanX(),
+ result[1] + reorderParameters.getSpanY()), solution,
+ reorderParameters.getDragView());
if (!solution.isSolution) {
return solution;
}
solution.cellX = result[0];
solution.cellY = result[1];
- solution.spanX = spanX;
- solution.spanY = spanY;
+ solution.spanX = reorderParameters.getSpanX();
+ solution.spanY = reorderParameters.getSpanY();
return solution;
}
- private boolean isConfigurationRegionOccupied(Rect region,
- ItemConfiguration configuration, View ignoreView) {
- return configuration.map.entrySet()
+ private boolean isConfigurationRegionOccupied(Rect region, ItemConfiguration configuration,
+ View ignoreView) {
+ return configuration.map
+ .entrySet()
.stream()
.filter(entry -> entry.getKey() != ignoreView)
.map(Entry::getValue)
- .anyMatch(cellAndSpan -> region.intersect(cellAndSpan.cellX, cellAndSpan.cellY,
+ .anyMatch(cellAndSpan -> region.intersect(
+ cellAndSpan.cellX,
+ cellAndSpan.cellY,
cellAndSpan.cellX + cellAndSpan.spanX,
- cellAndSpan.cellY + cellAndSpan.spanY));
+ cellAndSpan.cellY + cellAndSpan.spanY
+ )
+ );
}
/**
* Returns a "reorder" where we simply drop the item in the closest empty space, without moving
* any other item in the way.
*
- * @param pixelX X coordinate in pixels in the screen
- * @param pixelY Y coordinate in pixels in the screen
- * @param spanX horizontal cell span
- * @param spanY vertical cell span
* @return the configuration that represents the found reorder
*/
- public ItemConfiguration closestEmptySpaceReorder(int pixelX, int pixelY,
- int minSpanX, int minSpanY, int spanX, int spanY) {
+ public ItemConfiguration closestEmptySpaceReorder(ReorderParameters reorderParameters) {
ItemConfiguration solution = new ItemConfiguration();
int[] result = new int[2];
int[] resultSpan = new int[2];
- mCellLayout.findNearestVacantArea(pixelX, pixelY, minSpanX, minSpanY, spanX, spanY, result,
- resultSpan);
+ mCellLayout.findNearestVacantArea(reorderParameters.getPixelX(),
+ reorderParameters.getPixelY(), reorderParameters.getMinSpanX(),
+ reorderParameters.getMinSpanY(), reorderParameters.getSpanX(),
+ reorderParameters.getSpanY(), result, resultSpan);
if (result[0] >= 0 && result[1] >= 0) {
mCellLayout.copyCurrentStateToSolution(solution);
solution.cellX = result[0];
@@ -521,32 +508,19 @@
* the workspace to make space for the new item, this function return a solution for that
* reorder.
*
- * @param pixelX X coordinate in the screen of the dragView in pixels
- * @param pixelY Y coordinate in the screen of the dragView in pixels
- * @param minSpanX minimum horizontal span the item can be shrunk to
- * @param minSpanY minimum vertical span the item can be shrunk to
- * @param spanX occupied horizontal span
- * @param spanY occupied vertical span
- * @param dragView the view of the item being draged
* @return returns a solution for the given parameters, the solution contains all the icons and
* the locations they should be in the given solution.
*/
- public ItemConfiguration calculateReorder(int pixelX, int pixelY, int minSpanX,
- int minSpanY, int spanX, int spanY, View dragView) {
- getDirectionVectorForDrop(pixelX, pixelY, spanX, spanY, dragView,
- mCellLayout.mDirectionVector);
+ public ItemConfiguration calculateReorder(ReorderParameters reorderParameters) {
+ getDirectionVectorForDrop(reorderParameters, mCellLayout.mDirectionVector);
- ItemConfiguration dropInPlaceSolution = dropInPlaceSolution(pixelX, pixelY, spanX, spanY,
- dragView);
+ ItemConfiguration dropInPlaceSolution = dropInPlaceSolution(reorderParameters);
// Find a solution involving pushing / displacing any items in the way
- ItemConfiguration swapSolution = findReorderSolution(pixelX, pixelY, minSpanX,
- minSpanY, spanX, spanY, mCellLayout.mDirectionVector, dragView, true,
- new ItemConfiguration());
+ ItemConfiguration swapSolution = findReorderSolution(reorderParameters, true);
// We attempt the approach which doesn't shuffle views at all
- ItemConfiguration closestSpaceSolution = closestEmptySpaceReorder(pixelX, pixelY, minSpanX,
- minSpanY, spanX, spanY);
+ ItemConfiguration closestSpaceSolution = closestEmptySpaceReorder(reorderParameters);
// If the reorder solution requires resizing (shrinking) the item being dropped, we instead
// favor a solution in which the item is not resized, but
@@ -586,21 +560,26 @@
* those cells. Instead we use some heuristics to often lock the vector to up, down, left
* or right, which helps make pushing feel right.
*/
- private void getDirectionVectorForDrop(int dragViewCenterX, int dragViewCenterY, int spanX,
- int spanY, View dragView, int[] resultDirection) {
+ public void getDirectionVectorForDrop(ReorderParameters reorderParameters,
+ int[] resultDirection) {
//TODO(adamcohen) b/151776141 use the items visual center for the direction vector
int[] targetDestination = new int[2];
- mCellLayout.findNearestAreaIgnoreOccupied(dragViewCenterX, dragViewCenterY, spanX, spanY,
- targetDestination);
+ mCellLayout.findNearestAreaIgnoreOccupied(reorderParameters.getPixelX(),
+ reorderParameters.getPixelY(), reorderParameters.getSpanX(),
+ reorderParameters.getSpanY(), targetDestination);
Rect dragRect = new Rect();
- mCellLayout.cellToRect(targetDestination[0], targetDestination[1], spanX, spanY, dragRect);
- dragRect.offset(dragViewCenterX - dragRect.centerX(), dragViewCenterY - dragRect.centerY());
+ mCellLayout.cellToRect(targetDestination[0], targetDestination[1],
+ reorderParameters.getSpanX(), reorderParameters.getSpanY(), dragRect);
+ dragRect.offset(reorderParameters.getPixelX() - dragRect.centerX(),
+ reorderParameters.getPixelY() - dragRect.centerY());
Rect region = new Rect(targetDestination[0], targetDestination[1],
- targetDestination[0] + spanX, targetDestination[1] + spanY);
- Rect dropRegionRect = mCellLayout.getIntersectingRectanglesInRegion(region, dragView);
+ targetDestination[0] + reorderParameters.getSpanX(),
+ targetDestination[1] + reorderParameters.getSpanY());
+ Rect dropRegionRect = mCellLayout.getIntersectingRectanglesInRegion(region,
+ reorderParameters.getDragView());
if (dropRegionRect == null) dropRegionRect = new Rect(region);
int dropRegionSpanX = dropRegionRect.width();
@@ -609,13 +588,17 @@
mCellLayout.cellToRect(dropRegionRect.left, dropRegionRect.top, dropRegionRect.width(),
dropRegionRect.height(), dropRegionRect);
- int deltaX = (dropRegionRect.centerX() - dragViewCenterX) / spanX;
- int deltaY = (dropRegionRect.centerY() - dragViewCenterY) / spanY;
+ int deltaX = (dropRegionRect.centerX() - reorderParameters.getPixelX())
+ / reorderParameters.getSpanX();
+ int deltaY = (dropRegionRect.centerY() - reorderParameters.getPixelY())
+ / reorderParameters.getSpanY();
- if (dropRegionSpanX == mCellLayout.getCountX() || spanX == mCellLayout.getCountX()) {
+ if (dropRegionSpanX == mCellLayout.getCountX()
+ || reorderParameters.getSpanX() == mCellLayout.getCountX()) {
deltaX = 0;
}
- if (dropRegionSpanY == mCellLayout.getCountY() || spanY == mCellLayout.getCountY()) {
+ if (dropRegionSpanY == mCellLayout.getCountY()
+ || reorderParameters.getSpanY() == mCellLayout.getCountY()) {
deltaY = 0;
}
diff --git a/src/com/android/launcher3/celllayout/ReorderParameters.kt b/src/com/android/launcher3/celllayout/ReorderParameters.kt
new file mode 100644
index 0000000..3fdf35c
--- /dev/null
+++ b/src/com/android/launcher3/celllayout/ReorderParameters.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2023 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.launcher3.celllayout
+
+import android.view.View
+
+class ReorderParameters(
+ val pixelX: Int,
+ val pixelY: Int,
+ val spanX: Int,
+ val spanY: Int,
+ val minSpanX: Int,
+ val minSpanY: Int,
+ val dragView: View?,
+ val solution: ItemConfiguration
+) {}
diff --git a/src/com/android/launcher3/testing/TestInformationHandler.java b/src/com/android/launcher3/testing/TestInformationHandler.java
index 40bb6ad..1b1d347 100644
--- a/src/com/android/launcher3/testing/TestInformationHandler.java
+++ b/src/com/android/launcher3/testing/TestInformationHandler.java
@@ -15,8 +15,8 @@
*/
package com.android.launcher3.testing;
-import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.launcher3.allapps.AllAppsStore.DEFER_UPDATES_TEST;
+import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.launcher3.config.FeatureFlags.FOLDABLE_SINGLE_PAGE;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
@@ -297,10 +297,8 @@
}
protected boolean isLauncherInitialized() {
- Launcher launcher = Launcher.ACTIVITY_TRACKER.getCreatedActivity();
- return launcher == null
- || (LauncherAppState.getInstance(mContext).getModel().isModelLoaded()
- && !launcher.isBindingItems());
+ return Launcher.ACTIVITY_TRACKER.getCreatedActivity() == null
+ || LauncherAppState.getInstance(mContext).getModel().isModelLoaded();
}
protected Activity getCurrentActivity() {
diff --git a/tests/assets/ReorderWidgets/full_reorder_case b/tests/assets/ReorderWidgets/full_reorder_case
index 33ebaae..850e4fd 100644
--- a/tests/assets/ReorderWidgets/full_reorder_case
+++ b/tests/assets/ReorderWidgets/full_reorder_case
@@ -20,7 +20,7 @@
bbmm
iimm
iiaa
-arguments: 0 3
+arguments: 0 2
board: 4x4
xxxx
bbii
diff --git a/tests/assets/ReorderWidgets/simple_reorder_case b/tests/assets/ReorderWidgets/simple_reorder_case
index f5eb7b6..2c50ce4 100644
--- a/tests/assets/ReorderWidgets/simple_reorder_case
+++ b/tests/assets/ReorderWidgets/simple_reorder_case
@@ -34,7 +34,7 @@
--mm
--mm
----
-arguments: 3 3
+arguments: 2 2
board: 4x4
xxxx
----
diff --git a/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java b/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java
index d5a645e..7621acd 100644
--- a/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java
+++ b/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java
@@ -30,6 +30,8 @@
public static final String FOLDER_OPENED_MESSAGE = "TAPL_FOLDER_OPENED";
public static final String SEARCH_RESULT_COMPLETE = "SEARCH_RESULT_COMPLETE";
public static final String LAUNCHER_ACTIVITY_STOPPED_MESSAGE = "TAPL_LAUNCHER_ACTIVITY_STOPPED";
+ public static final String WALLPAPER_OPEN_ANIMATION_FINISHED_MESSAGE =
+ "TAPL_WALLPAPER_OPEN_ANIMATION_FINISHED";
public static final int NORMAL_STATE_ORDINAL = 0;
public static final int SPRING_LOADED_STATE_ORDINAL = 1;
public static final int OVERVIEW_STATE_ORDINAL = 2;
diff --git a/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTest.java b/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTest.java
index 28471f6..e1af774 100644
--- a/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTest.java
+++ b/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTest.java
@@ -191,9 +191,21 @@
int[] testCaseXYinPixels = new int[2];
cl.regionToCenterPoint(x, y, spanX, spanY, testCaseXYinPixels);
- ItemConfiguration solution = cl.createReorderAlgorithm().calculateReorder(
- testCaseXYinPixels[0], testCaseXYinPixels[1], minSpanX, minSpanY, spanX, spanY,
- null);
+ ItemConfiguration configuration = new ItemConfiguration();
+ cl.copyCurrentStateToSolution(configuration);
+ ItemConfiguration solution = cl.createReorderAlgorithm()
+ .calculateReorder(
+ new ReorderParameters(
+ testCaseXYinPixels[0],
+ testCaseXYinPixels[1],
+ spanX,
+ spanY,
+ minSpanX,
+ minSpanY,
+ null,
+ configuration
+ )
+ );
if (solution == null) {
solution = new ItemConfiguration();
solution.isSolution = false;
diff --git a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java
index b2ce400..cce4c5b 100644
--- a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java
+++ b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java
@@ -113,9 +113,11 @@
}
private void setResult(boolean success) {
- getInstrumentation().getTargetContext().sendBroadcast(
- WidgetConfigActivity.getCommandIntent(WidgetConfigActivity.class,
- success ? "clickOK" : "clickCancel"));
+ mLauncher.executeAndWaitForWallpaperAnimation(() ->
+ getInstrumentation().getTargetContext().sendBroadcast(
+ WidgetConfigActivity.getCommandIntent(WidgetConfigActivity.class,
+ success ? "clickOK" : "clickCancel")),
+ "setting widget coinfig result");
}
/**
diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
index fb81700..f8e0f3d 100644
--- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
+++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
@@ -2313,4 +2313,14 @@
}
return result;
}
+
+ /** Executes a runnable and waits for the wallpaper-open animation completion. */
+ public void executeAndWaitForWallpaperAnimation(Runnable r, String actionName) {
+ executeAndWaitForLauncherEvent(
+ () -> r.run(),
+ event -> TestProtocol.WALLPAPER_OPEN_ANIMATION_FINISHED_MESSAGE
+ .equals(event.getClassName().toString()),
+ () -> "Didn't detect finishing wallpaper-open animation",
+ actionName);
+ }
}
diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java b/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java
index 38cc321..4a0131b 100644
--- a/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java
+++ b/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java
@@ -20,6 +20,8 @@
import androidx.test.uiautomator.By;
import androidx.test.uiautomator.UiObject2;
+import com.android.launcher3.testing.shared.TestProtocol;
+
/** Represents the menu of an overview task. */
public class OverviewTaskMenu {
@@ -59,8 +61,13 @@
try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck();
LauncherInstrumentation.Closable c = mLauncher.addContextLayer(
"before tapping the app info menu item")) {
- mLauncher.clickLauncherObject(
- mLauncher.findObjectInContainer(mMenu, By.text("App info")));
+ mLauncher.executeAndWaitForLauncherEvent(
+ () -> mLauncher.clickLauncherObject(
+ mLauncher.findObjectInContainer(mMenu, By.text("App info"))),
+ event -> TestProtocol.LAUNCHER_ACTIVITY_STOPPED_MESSAGE
+ .equals(event.getClassName().toString()),
+ () -> "Launcher activity didn't stop",
+ "tapped app info menu item");
try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer(
"tapped app info menu item")) {