Merge "Workaround for handling the restart of an already visible task" into udc-dev am: 0da5208bb3
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/23785437 Change-Id: Icd31107e3d5f3e8496bf4ac974a23d49396ee695 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -144,6 +144,7 @@ import com.android.quickstep.util.StaggeredWorkspaceAnim;
|
|||||||
import com.android.quickstep.util.SurfaceTransaction;
|
import com.android.quickstep.util.SurfaceTransaction;
|
||||||
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
|
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
|
||||||
import com.android.quickstep.util.SurfaceTransactionApplier;
|
import com.android.quickstep.util.SurfaceTransactionApplier;
|
||||||
|
import com.android.quickstep.util.TaskRestartedDuringLaunchListener;
|
||||||
import com.android.quickstep.util.WorkspaceRevealAnim;
|
import com.android.quickstep.util.WorkspaceRevealAnim;
|
||||||
import com.android.quickstep.views.FloatingWidgetView;
|
import com.android.quickstep.views.FloatingWidgetView;
|
||||||
import com.android.quickstep.views.RecentsView;
|
import com.android.quickstep.views.RecentsView;
|
||||||
@@ -299,6 +300,12 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
|||||||
boolean fromRecents = isLaunchingFromRecents(v, null /* targets */);
|
boolean fromRecents = isLaunchingFromRecents(v, null /* targets */);
|
||||||
RunnableList onEndCallback = new RunnableList();
|
RunnableList onEndCallback = new RunnableList();
|
||||||
|
|
||||||
|
// Handle the case where an already visible task is launched which results in no transition
|
||||||
|
TaskRestartedDuringLaunchListener restartedListener =
|
||||||
|
new TaskRestartedDuringLaunchListener();
|
||||||
|
restartedListener.register(onEndCallback::executeAllAndDestroy);
|
||||||
|
onEndCallback.add(restartedListener::unregister);
|
||||||
|
|
||||||
mAppLaunchRunner = new AppLaunchAnimationRunner(v, onEndCallback);
|
mAppLaunchRunner = new AppLaunchAnimationRunner(v, onEndCallback);
|
||||||
ItemInfo tag = (ItemInfo) v.getTag();
|
ItemInfo tag = (ItemInfo) v.getTag();
|
||||||
if (tag != null && tag.shouldUseBackgroundAnimation()) {
|
if (tag != null && tag.shouldUseBackgroundAnimation()) {
|
||||||
|
|||||||
@@ -345,11 +345,13 @@ public class QuickstepLauncher extends Launcher {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RunnableList startActivitySafely(View v, Intent intent, ItemInfo item) {
|
public RunnableList startActivitySafely(View v, Intent intent, ItemInfo item) {
|
||||||
// Only pause is taskbar controller is not present
|
// Only pause is taskbar controller is not present until the transition (if it exists) ends
|
||||||
mHotseatPredictionController.setPauseUIUpdate(getTaskbarUIController() == null);
|
mHotseatPredictionController.setPauseUIUpdate(getTaskbarUIController() == null);
|
||||||
RunnableList result = super.startActivitySafely(v, intent, item);
|
RunnableList result = super.startActivitySafely(v, intent, item);
|
||||||
if (getTaskbarUIController() == null && result == null) {
|
if (result == null) {
|
||||||
mHotseatPredictionController.setPauseUIUpdate(false);
|
if (getTaskbarUIController() == null) {
|
||||||
|
mHotseatPredictionController.setPauseUIUpdate(false);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
result.add(() -> mHotseatPredictionController.setPauseUIUpdate(false));
|
result.add(() -> mHotseatPredictionController.setPauseUIUpdate(false));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* 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.quickstep.util;
|
||||||
|
|
||||||
|
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.app.ActivityManager;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
|
import com.android.launcher3.util.ActivityLifecycleCallbacksAdapter;
|
||||||
|
import com.android.quickstep.RecentsModel;
|
||||||
|
import com.android.systemui.shared.system.TaskStackChangeListener;
|
||||||
|
import com.android.systemui.shared.system.TaskStackChangeListeners;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class tracks the failure of a task launch through the Launcher.startActivitySafely() call,
|
||||||
|
* in an edge case in which a task may already be visible on screen (ie. in PIP) and no transition
|
||||||
|
* will be run in WM, which results in expected callbacks to not be processed.
|
||||||
|
*
|
||||||
|
* We transiently register a task stack listener during a task launch and if the restart signal is
|
||||||
|
* received, then the registered callback will be notified.
|
||||||
|
*/
|
||||||
|
public class TaskRestartedDuringLaunchListener implements TaskStackChangeListener {
|
||||||
|
|
||||||
|
private static final String TAG = "TaskRestartedDuringLaunchListener";
|
||||||
|
|
||||||
|
private @NonNull Runnable mTaskRestartedCallback = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a failure listener callback if it detects a scenario in which an app launch
|
||||||
|
* resulted in an already existing task to be "restarted".
|
||||||
|
*/
|
||||||
|
public void register(@NonNull Runnable taskRestartedCallback) {
|
||||||
|
TaskStackChangeListeners.getInstance().registerTaskStackListener(this);
|
||||||
|
mTaskRestartedCallback = taskRestartedCallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregisters the failure listener.
|
||||||
|
*/
|
||||||
|
public void unregister() {
|
||||||
|
TaskStackChangeListeners.getInstance().unregisterTaskStackListener(this);
|
||||||
|
mTaskRestartedCallback = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task,
|
||||||
|
boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) {
|
||||||
|
if (wasVisible) {
|
||||||
|
Log.d(TAG, "Detected activity restart during launch for task=" + task.taskId);
|
||||||
|
mTaskRestartedCallback.run();
|
||||||
|
unregister();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user