Snap for 8112519 from 46728f6481 to tm-release

Change-Id: Ic671bc2881cee6c6fc1581158485c3d4b0b9727a
This commit is contained in:
Android Build Coastguard Worker
2022-01-25 02:09:11 +00:00
13 changed files with 217 additions and 50 deletions
@@ -38,6 +38,7 @@ import com.android.quickstep.views.TaskView;
import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
@@ -271,6 +272,14 @@ public class OverviewCommandHelper {
scheduleNextTask(cmd);
}
public void dump(PrintWriter pw) {
pw.println("OverviewCommandHelper:");
pw.println(" mPendingCommands=" + mPendingCommands.size());
if (!mPendingCommands.isEmpty()) {
pw.println(" pendingCommandType=" + mPendingCommands.get(0).type);
}
}
private static class CommandInfo {
public final long createTime = SystemClock.elapsedRealtime();
public final int type;
@@ -100,6 +100,7 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
private Handler mUiHandler = new Handler(Looper.getMainLooper());
private static final long HOME_APPEAR_DURATION = 250;
private static final long RECENTS_ANIMATION_TIMEOUT = 1000;
private RecentsDragLayer mDragLayer;
private ScrimView mScrimView;
@@ -116,6 +117,11 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
// Strong refs to runners which are cleared when the activity is destroyed
private RemoteAnimationFactory mActivityLaunchAnimationRunner;
// For handling degenerate cases where starting an activity doesn't actually trigger the remote
// animation callback
private final Handler mHandler = new Handler();
private final Runnable mAnimationStartTimeoutRunnable = this::onAnimationStartTimeout;
/**
* Init drag layer and overview panel views.
*/
@@ -220,6 +226,16 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
// TODO(b/137318995) This should go home, but doing so removes freeform windows
}
/**
* Called if the remote animation callback from #getActivityLaunchOptions() hasn't called back
* in a reasonable time due to a conflict with the recents animation.
*/
private void onAnimationStartTimeout() {
if (mActivityLaunchAnimationRunner != null) {
mActivityLaunchAnimationRunner.onAnimationCancelled();
}
}
@Override
public ActivityOptionsWrapper getActivityLaunchOptions(final View v, @Nullable ItemInfo item) {
if (!(v instanceof TaskView)) {
@@ -234,6 +250,7 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
public void onCreateAnimation(int transit, RemoteAnimationTargetCompat[] appTargets,
RemoteAnimationTargetCompat[] wallpaperTargets,
RemoteAnimationTargetCompat[] nonAppTargets, AnimationResult result) {
mHandler.removeCallbacks(mAnimationStartTimeoutRunnable);
AnimatorSet anim = composeRecentsLaunchAnimator(taskView, appTargets,
wallpaperTargets, nonAppTargets);
anim.addListener(resetStateListener());
@@ -243,6 +260,7 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
@Override
public void onAnimationCancelled() {
mHandler.removeCallbacks(mAnimationStartTimeoutRunnable);
onEndCallback.executeAllAndDestroy();
}
};
@@ -260,6 +278,7 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
activityOptions.options.setLaunchDisplayId(
(v != null && v.getDisplay() != null) ? v.getDisplay().getDisplayId()
: Display.DEFAULT_DISPLAY);
mHandler.postDelayed(mAnimationStartTimeoutRunnable, RECENTS_ANIMATION_TIMEOUT);
return activityOptions;
}
@@ -44,8 +44,9 @@ import com.android.launcher3.util.SplitConfigurationOptions;
import com.android.systemui.shared.recents.ISystemUiProxy;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.system.RemoteTransitionCompat;
import com.android.systemui.shared.system.smartspace.ISmartspaceCallback;
import com.android.systemui.shared.system.smartspace.ISmartspaceTransitionController;
import com.android.systemui.shared.system.smartspace.ILauncherUnlockAnimationController;
import com.android.systemui.shared.system.smartspace.ISysuiUnlockAnimationController;
import com.android.systemui.shared.system.smartspace.SmartspaceState;
import com.android.wm.shell.onehanded.IOneHanded;
import com.android.wm.shell.pip.IPip;
import com.android.wm.shell.pip.IPipAnimationListener;
@@ -73,7 +74,7 @@ public class SystemUiProxy implements ISystemUiProxy,
private ISystemUiProxy mSystemUiProxy;
private IPip mPip;
private ISmartspaceTransitionController mSmartspaceTransitionController;
private ISysuiUnlockAnimationController mSysuiUnlockAnimationController;
private ISplitScreen mSplitScreen;
private IOneHanded mOneHanded;
private IShellTransitions mShellTransitions;
@@ -90,7 +91,7 @@ public class SystemUiProxy implements ISystemUiProxy,
private IPipAnimationListener mPipAnimationListener;
private ISplitScreenListener mSplitScreenListener;
private IStartingWindowListener mStartingWindowListener;
private ISmartspaceCallback mSmartspaceCallback;
private ILauncherUnlockAnimationController mPendingLauncherUnlockAnimationController;
private IRecentTasksListener mRecentTasksListener;
private final ArrayList<RemoteTransitionCompat> mRemoteTransitions = new ArrayList<>();
@@ -157,7 +158,8 @@ public class SystemUiProxy implements ISystemUiProxy,
public void setProxy(ISystemUiProxy proxy, IPip pip, ISplitScreen splitScreen,
IOneHanded oneHanded, IShellTransitions shellTransitions,
IStartingWindow startingWindow, IRecentTasks recentTasks,
ISmartspaceTransitionController smartSpaceTransitionController) {
ISysuiUnlockAnimationController sysuiUnlockAnimationController) {
unlinkToDeath();
mSystemUiProxy = proxy;
mPip = pip;
@@ -165,7 +167,7 @@ public class SystemUiProxy implements ISystemUiProxy,
mOneHanded = oneHanded;
mShellTransitions = shellTransitions;
mStartingWindow = startingWindow;
mSmartspaceTransitionController = smartSpaceTransitionController;
mSysuiUnlockAnimationController = sysuiUnlockAnimationController;
mRecentTasks = recentTasks;
linkToDeath();
// re-attach the listeners once missing due to setProxy has not been initialized yet.
@@ -178,8 +180,10 @@ public class SystemUiProxy implements ISystemUiProxy,
if (mStartingWindowListener != null && mStartingWindow != null) {
setStartingWindowListener(mStartingWindowListener);
}
if (mSmartspaceCallback != null && mSmartspaceTransitionController != null) {
setSmartspaceCallback(mSmartspaceCallback);
if (mPendingLauncherUnlockAnimationController != null
&& mSysuiUnlockAnimationController != null) {
setLauncherUnlockAnimationController(mPendingLauncherUnlockAnimationController);
mPendingLauncherUnlockAnimationController = null;
}
for (int i = mRemoteTransitions.size() - 1; i >= 0; --i) {
registerRemoteTransition(mRemoteTransitions.get(i));
@@ -731,15 +735,42 @@ public class SystemUiProxy implements ISystemUiProxy,
// SmartSpace transitions
//
public void setSmartspaceCallback(ISmartspaceCallback callback) {
if (mSmartspaceTransitionController != null) {
/**
* Sets the instance of {@link ILauncherUnlockAnimationController} that System UI should use to
* control the launcher side of the unlock animation. This will also cause us to dispatch the
* current state of the smartspace to System UI (this will subsequently happen if the state
* changes).
*/
public void setLauncherUnlockAnimationController(
ILauncherUnlockAnimationController controller) {
if (mSysuiUnlockAnimationController != null) {
try {
mSmartspaceTransitionController.setSmartspace(callback);
mSysuiUnlockAnimationController.setLauncherUnlockController(controller);
if (controller != null) {
controller.dispatchSmartspaceStateToSysui();
}
} catch (RemoteException e) {
Log.w(TAG, "Failed call setStartingWindowListener", e);
}
} else {
mPendingLauncherUnlockAnimationController = controller;
}
}
/**
* Tells System UI that the Launcher's smartspace state has been updated, so that it can prepare
* the unlock animation accordingly.
*/
public void notifySysuiSmartspaceStateUpdated(SmartspaceState state) {
if (mSysuiUnlockAnimationController != null) {
try {
mSysuiUnlockAnimationController.onLauncherSmartspaceStateUpdated(state);
} catch (RemoteException e) {
Log.w(TAG, "Failed call notifySysuiSmartspaceStateUpdated", e);
e.printStackTrace();
}
}
mSmartspaceCallback = callback;
}
//
@@ -28,6 +28,7 @@ import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.SparseArray;
import android.view.accessibility.AccessibilityManager;
import androidx.annotation.WorkerThread;
@@ -62,7 +63,9 @@ public class TaskIconCache implements DisplayInfoChangeListener {
private final Context mContext;
private final TaskKeyLruCache<TaskCacheEntry> mIconCache;
private final BitmapInfo[] mDefaultIcons = new BitmapInfo[1];
private final SparseArray<BitmapInfo> mDefaultIcons = new SparseArray<>();
private BitmapInfo mDefaultIconBase = null;
private final IconProvider mIconProvider;
private BaseIconFactory mIconFactory;
@@ -208,12 +211,23 @@ public class TaskIconCache implements DisplayInfoChangeListener {
@WorkerThread
private Drawable getDefaultIcon(int userId) {
synchronized (mDefaultIcons) {
if (mDefaultIcons[0] == null) {
if (mDefaultIconBase == null) {
try (BaseIconFactory bif = getIconFactory()) {
mDefaultIcons[0] = bif.makeDefaultIcon();
mDefaultIconBase = bif.makeDefaultIcon();
}
}
int index;
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(UserHandle.of(userId))));
mDefaultIcons.put(userId, info);
return info.newIcon(mContext);
}
}
return mDefaultIcons[0].clone().withUser(UserHandle.of(userId)).newIcon(mContext);
}
}
@@ -36,6 +36,7 @@ import static com.android.launcher3.anim.Interpolators.TOUCH_RESPONSE_INTERPOLAT
import static com.android.launcher3.anim.Interpolators.clampToProgress;
import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE;
import static com.android.launcher3.statehandlers.DepthController.DEPTH;
import static com.android.quickstep.TaskAnimationManager.ENABLE_SHELL_TRANSITIONS;
import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING;
import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_OPENING;
@@ -168,7 +169,7 @@ public final class TaskViewUtils {
ENABLE_QUICKSTEP_LIVE_TILE.get() && v.getRecentsView().getRunningTaskIndex() != -1;
final RemoteAnimationTargets targets =
new RemoteAnimationTargets(appTargets, wallpaperTargets, nonAppTargets,
inLiveTileMode ? MODE_CLOSING : MODE_OPENING);
!ENABLE_SHELL_TRANSITIONS && inLiveTileMode ? MODE_CLOSING : MODE_OPENING);
final RemoteAnimationTargetCompat navBarTarget = targets.getNavBarRemoteAnimationTarget();
SurfaceTransactionApplier applier = new SurfaceTransactionApplier(v);
@@ -282,7 +283,8 @@ public final class TaskViewUtils {
topMostSimulators = remoteTargetHandles;
}
if (!skipViewChanges && parallaxCenterAndAdjacentTask && topMostSimulators.length > 0) {
if (!skipViewChanges && parallaxCenterAndAdjacentTask && topMostSimulators != null
&& topMostSimulators.length > 0) {
out.addFloat(v, VIEW_ALPHA, 1, 0, clampToProgress(LINEAR, 0.2f, 0.4f));
RemoteTargetHandle[] simulatorCopies = topMostSimulators;
@@ -31,8 +31,8 @@ import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SHE
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SHELL_SHELL_TRANSITIONS;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SHELL_SPLIT_SCREEN;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SHELL_STARTING_WINDOW;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SMARTSPACE_TRANSITION_CONTROLLER;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_UNLOCK_ANIMATION_CONTROLLER;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_TRACING_ENABLED;
@@ -105,7 +105,7 @@ import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.InputChannelCompat.InputEventReceiver;
import com.android.systemui.shared.system.InputConsumerController;
import com.android.systemui.shared.system.InputMonitorCompat;
import com.android.systemui.shared.system.smartspace.ISmartspaceTransitionController;
import com.android.systemui.shared.system.smartspace.ISysuiUnlockAnimationController;
import com.android.systemui.shared.tracing.ProtoTraceable;
import com.android.wm.shell.onehanded.IOneHanded;
import com.android.wm.shell.pip.IPip;
@@ -162,15 +162,15 @@ public class TouchInteractionService extends Service
bundle.getBinder(KEY_EXTRA_SHELL_SHELL_TRANSITIONS));
IStartingWindow startingWindow = IStartingWindow.Stub.asInterface(
bundle.getBinder(KEY_EXTRA_SHELL_STARTING_WINDOW));
ISmartspaceTransitionController smartspaceTransitionController =
ISmartspaceTransitionController.Stub.asInterface(
bundle.getBinder(KEY_EXTRA_SMARTSPACE_TRANSITION_CONTROLLER));
ISysuiUnlockAnimationController launcherUnlockAnimationController =
ISysuiUnlockAnimationController.Stub.asInterface(
bundle.getBinder(KEY_EXTRA_UNLOCK_ANIMATION_CONTROLLER));
IRecentTasks recentTasks = IRecentTasks.Stub.asInterface(
bundle.getBinder(KEY_EXTRA_RECENT_TASKS));
MAIN_EXECUTOR.execute(() -> {
SystemUiProxy.INSTANCE.get(TouchInteractionService.this).setProxy(proxy, pip,
splitscreen, onehanded, shellTransitions, startingWindow, recentTasks,
smartspaceTransitionController);
launcherUnlockAnimationController);
TouchInteractionService.this.initInputMonitor();
preloadOverview(true /* fromInit */);
});
@@ -942,6 +942,9 @@ public class TouchInteractionService extends Service
if (mOverviewComponentObserver != null) {
mOverviewComponentObserver.dump(pw);
}
if (mOverviewCommandHelper != null) {
mOverviewCommandHelper.dump(pw);
}
if (mGestureState != null) {
mGestureState.dump(pw);
}
@@ -0,0 +1,82 @@
/*
* Copyright (C) 2021 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.util;
import com.android.launcher3.Launcher;
import com.android.launcher3.Utilities;
/**
* Animation to animate in a workspace during the unlock transition.
*/
public class WorkspaceUnlockAnim {
/** Scale for the workspace icons at the beginning of the animation. */
private static final float START_SCALE = 0.9f;
/**
* Starting translation Y values for the animation. We use a larger value if we're animating in
* from a swipe, since there is more perceived upward movement when we unlock from a swipe.
*/
private static final int START_TRANSLATION_DP = 15;
private static final int START_TRANSLATION_SWIPE_DP = 60;
private Launcher mLauncher;
private float mUnlockAmount = 0f;
public WorkspaceUnlockAnim(Launcher launcher) {
mLauncher = launcher;
}
/**
* Called when we're about to make the Launcher window visible and play the unlock animation.
*
* This is a blocking call so that System UI knows it's safe to show the Launcher window without
* causing the Launcher contents to flicker on screen. Do not do anything expensive here.
*/
public void prepareForUnlock() {
mLauncher.getWorkspace().setAlpha(0f);
mLauncher.getHotseat().setAlpha(0f);
mUnlockAmount = 0f;
}
public void setUnlockAmount(float amount, boolean fromSwipe) {
mUnlockAmount = amount;
final float amountInverse = 1f - amount;
final float scale = START_SCALE + (1f - START_SCALE) * amount;
mLauncher.getWorkspace().setScaleX(scale);
mLauncher.getWorkspace().setScaleY(scale);
mLauncher.getWorkspace().setAlpha(amount);
mLauncher.getWorkspace().setPivotToScaleWithSelf(mLauncher.getHotseat());
mLauncher.getHotseat().setScaleX(scale);
mLauncher.getHotseat().setScaleY(scale);
mLauncher.getHotseat().setAlpha(amount);
if (fromSwipe) {
mLauncher.getWorkspace().setTranslationY(
Utilities.dpToPx(START_TRANSLATION_SWIPE_DP) * amountInverse);
mLauncher.getHotseat().setTranslationY(
Utilities.dpToPx(START_TRANSLATION_SWIPE_DP) * amountInverse);
} else {
mLauncher.getWorkspace().setTranslationY(
Utilities.dpToPx(START_TRANSLATION_DP) * amountInverse);
mLauncher.getHotseat().setTranslationY(
Utilities.dpToPx(START_TRANSLATION_DP) * amountInverse);
}
}
}
+11
View File
@@ -2789,6 +2789,17 @@ public class Launcher extends StatefulActivity<LauncherState> implements Launche
getDragLayer().announceForAccessibility(getString(stringResId));
}
/**
* Informs us that the overlay (-1 screen, typically), has either become visible or invisible.
*/
public void onOverlayVisibilityChanged(boolean visible) {}
/**
* Informs us that the page transition has ended, so that we can react to the newly selected
* page if we want to.
*/
public void onPageEndTransition() {}
/**
* Add the icons for all apps.
*
+12
View File
@@ -1135,6 +1135,10 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
stripEmptyScreens();
mStripScreensOnPageStopMoving = false;
}
// Inform the Launcher activity that the page transition ended so that it can react to the
// newly visible page if it wants to.
mLauncher.onPageEndTransition();
}
public void setLauncherOverlay(LauncherOverlay overlay) {
@@ -1211,6 +1215,10 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
.log(LAUNCHER_SWIPELEFT);
}
mOverlayShown = true;
// Let the Launcher activity know that the overlay is now visible.
mLauncher.onOverlayVisibilityChanged(mOverlayShown);
// Not announcing the overlay page for accessibility since it announces itself.
} else if (Float.compare(scroll, 0f) == 0) {
if (mOverlayShown) {
@@ -1234,6 +1242,10 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
announcePageForAccessibility();
}
mOverlayShown = false;
// Let the Launcher activity know that the overlay is no longer visible.
mLauncher.onOverlayVisibilityChanged(mOverlayShown);
tryRunOverlayCallback();
}
@@ -112,7 +112,7 @@ public class PackageUpdatedTask extends BaseModelUpdateTask {
activitiesLists.put(
packages[i], appsList.addPackage(context, packages[i], mUser));
}
flagOp = FlagOp.removeFlag(WorkspaceItemInfo.FLAG_DISABLED_NOT_AVAILABLE);
flagOp = FlagOp.NO_OP.removeFlag(WorkspaceItemInfo.FLAG_DISABLED_NOT_AVAILABLE);
break;
}
case OP_UPDATE:
@@ -134,7 +134,7 @@ public class PackageUpdatedTask extends BaseModelUpdateTask {
}
}
// Since package was just updated, the target must be available now.
flagOp = FlagOp.removeFlag(WorkspaceItemInfo.FLAG_DISABLED_NOT_AVAILABLE);
flagOp = FlagOp.NO_OP.removeFlag(WorkspaceItemInfo.FLAG_DISABLED_NOT_AVAILABLE);
break;
case OP_REMOVE: {
for (int i = 0; i < N; i++) {
@@ -148,13 +148,12 @@ public class PackageUpdatedTask extends BaseModelUpdateTask {
if (DEBUG) Log.d(TAG, "mAllAppsList.removePackage " + packages[i]);
appsList.removePackage(packages[i], mUser);
}
flagOp = FlagOp.addFlag(WorkspaceItemInfo.FLAG_DISABLED_NOT_AVAILABLE);
flagOp = FlagOp.NO_OP.addFlag(WorkspaceItemInfo.FLAG_DISABLED_NOT_AVAILABLE);
break;
case OP_SUSPEND:
case OP_UNSUSPEND:
flagOp = mOp == OP_SUSPEND ?
FlagOp.addFlag(WorkspaceItemInfo.FLAG_DISABLED_SUSPENDED) :
FlagOp.removeFlag(WorkspaceItemInfo.FLAG_DISABLED_SUSPENDED);
flagOp = FlagOp.NO_OP.setFlag(
WorkspaceItemInfo.FLAG_DISABLED_SUSPENDED, mOp == OP_SUSPEND);
if (DEBUG) Log.d(TAG, "mAllAppsList.(un)suspend " + N);
appsList.updateDisabledFlags(matcher, flagOp);
break;
@@ -162,9 +161,8 @@ public class PackageUpdatedTask extends BaseModelUpdateTask {
UserManagerState ums = new UserManagerState();
ums.init(UserCache.INSTANCE.get(context),
context.getSystemService(UserManager.class));
flagOp = ums.isUserQuiet(mUser)
? FlagOp.addFlag(WorkspaceItemInfo.FLAG_DISABLED_QUIET_USER)
: FlagOp.removeFlag(WorkspaceItemInfo.FLAG_DISABLED_QUIET_USER);
flagOp = FlagOp.NO_OP.setFlag(
WorkspaceItemInfo.FLAG_DISABLED_QUIET_USER, ums.isUserQuiet(mUser));
appsList.updateDisabledFlags(matcher, flagOp);
// We are not synchronizing here, as int operations are atomic
@@ -152,7 +152,7 @@ public abstract class StatefulActivity<STATE_TYPE extends BaseState<STATE_TYPE>>
/**
* Called if the Activity UI changed while the activity was not visible
*/
protected void onUiChangedWhileSleeping() { }
public void onUiChangedWhileSleeping() { }
private void handleDeferredResume() {
if (hasBeenResumed() && !getStateManager().getState().hasFlag(FLAG_NON_INTERACTIVE)) {
@@ -1,16 +0,0 @@
package com.android.launcher3.util;
public interface FlagOp {
FlagOp NO_OP = i -> i;
int apply(int flags);
static FlagOp addFlag(int flag) {
return i -> i | flag;
}
static FlagOp removeFlag(int flag) {
return i -> i & ~flag;
}
}
@@ -33,6 +33,7 @@ import com.android.launcher3.tapl.Widgets;
import com.android.launcher3.testcomponent.WidgetConfigActivity;
import com.android.launcher3.ui.AbstractLauncherUiTest;
import com.android.launcher3.ui.TestViewHelpers;
import com.android.launcher3.util.rule.ScreenRecordRule.ScreenRecord;
import com.android.launcher3.util.rule.ShellCommandRule;
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
@@ -72,6 +73,7 @@ public class AddConfigWidgetTest extends AbstractLauncherUiTest {
@Test
@PortraitLandscape
@ScreenRecord // b/215672979
public void testConfigCancelled() throws Throwable {
runTest(false);
}