Workaround for apps to stop before removing the task

- With live tile enabled, the race between destroying the task and
  killing the process is more evident since the app may not get
  stopped at all.  For now, when dismissing, defer removing the
  task until we've finished the recents animation to allow the
  app to be stopped accordingly

Bug: 184899234
Test: Dismiss the task from overview, check that the app gets
      lifecycle events
Change-Id: Ib3ea479643d65859fe4cd580b4c347b87130a69d
This commit is contained in:
Winson Chung
2021-06-03 13:19:50 -07:00
parent f8ef794774
commit ccda7bc725
2 changed files with 22 additions and 11 deletions
@@ -350,8 +350,7 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> {
public void startHome() {
if (LIVE_TILE.get()) {
RecentsView recentsView = getOverviewPanel();
recentsView.switchToScreenshot(() -> recentsView.finishRecentsAnimation(true,
this::startHomeInternal));
recentsView.switchToScreenshotAndFinishAnimationToRecents(this::startHomeInternal);
} else {
startHomeInternal();
}
@@ -176,6 +176,10 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
TaskThumbnailCache.HighResLoadingState.HighResLoadingStateChangedCallback,
TaskVisualsChangeListener, SplitScreenBounds.OnChangeListener {
// TODO(b/184899234): We use this timeout to wait a fixed period after switching to the
// screenshot when dismissing the current live task to ensure the app can try and get stopped.
private static final int REMOVE_TASK_WAIT_FOR_APP_STOP_MS = 100;
public static final FloatProperty<RecentsView> CONTENT_ALPHA =
new FloatProperty<RecentsView>("contentAlpha") {
@Override
@@ -2423,8 +2427,11 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
if (success) {
if (shouldRemoveTask) {
if (dismissedTaskView.getTask() != null) {
UI_HELPER_EXECUTOR.execute(() -> ActivityManagerWrapper.getInstance()
.removeTask(dismissedTaskId));
switchToScreenshotAndFinishAnimationToRecents(() -> {
UI_HELPER_EXECUTOR.getHandler().postDelayed(() ->
ActivityManagerWrapper.getInstance().removeTask(
dismissedTaskId), REMOVE_TASK_WAIT_FOR_APP_STOP_MS);
});
mActivity.getStatsLogManager().logger()
.withItemInfo(dismissedTaskView.getItemInfo())
.log(LAUNCHER_TASK_DISMISS_SWIPE_UP);
@@ -2529,10 +2536,13 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
mPendingAnimation.addEndListener(isSuccess -> {
if (isSuccess) {
// Remove all the task views now
UI_HELPER_EXECUTOR.execute(
ActivityManagerWrapper.getInstance()::removeAllRecentTasks);
removeTasksViewsAndClearAllButton();
startHome();
switchToScreenshotAndFinishAnimationToRecents(() -> {
UI_HELPER_EXECUTOR.getHandler().postDelayed(
ActivityManagerWrapper.getInstance()::removeAllRecentTasks,
REMOVE_TASK_WAIT_FOR_APP_STOP_MS);
removeTasksViewsAndClearAllButton();
startHome();
});
}
mPendingAnimation = null;
});
@@ -2687,9 +2697,7 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (LIVE_TILE.get() && mEnableDrawingLiveTile && newConfig.orientation != mOrientation) {
switchToScreenshot(
() -> finishRecentsAnimation(true /* toRecents */,
this::updateRecentsRotation));
switchToScreenshotAndFinishAnimationToRecents(this::updateRecentsRotation);
mEnableDrawingLiveTile = false;
} else {
updateRecentsRotation();
@@ -3687,6 +3695,10 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
}
}
public void switchToScreenshotAndFinishAnimationToRecents(Runnable onFinishRunnable) {
switchToScreenshot(() -> finishRecentsAnimation(true /* toRecents */, onFinishRunnable));
}
/**
* Switch the current running task view to static snapshot mode,
* capturing the snapshot at the same time.