Merge "Add logcat logs for splitscreen launch failures" into udc-qpr-dev
This commit is contained in:
@@ -89,4 +89,9 @@ public class SplitScreenUtils {
|
||||
int userId1, int userId2) {
|
||||
return (packageName1 != null && packageName1.equals(packageName2)) && (userId1 == userId2);
|
||||
}
|
||||
|
||||
/** Generates a common log message for split screen failures */
|
||||
public static String splitFailureMessage(String caller, String reason) {
|
||||
return "(" + caller + ") Splitscreen aborted: " + reason;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSIT
|
||||
import static com.android.wm.shell.common.split.SplitScreenUtils.isValidToSplit;
|
||||
import static com.android.wm.shell.common.split.SplitScreenUtils.reverseSplitPosition;
|
||||
import static com.android.wm.shell.common.split.SplitScreenUtils.samePackage;
|
||||
import static com.android.wm.shell.common.split.SplitScreenUtils.splitFailureMessage;
|
||||
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_UNDEFINED;
|
||||
import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_SPLIT_SCREEN;
|
||||
import static com.android.wm.shell.transition.Transitions.ENABLE_SHELL_TRANSITIONS;
|
||||
@@ -50,6 +51,7 @@ import android.os.Bundle;
|
||||
import android.os.RemoteException;
|
||||
import android.os.UserHandle;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.Log;
|
||||
import android.util.Slog;
|
||||
import android.view.IRemoteAnimationFinishedCallback;
|
||||
import android.view.IRemoteAnimationRunner;
|
||||
@@ -551,6 +553,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
} else {
|
||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
|
||||
"Cancel entering split as not supporting multi-instances");
|
||||
Log.w(TAG, splitFailureMessage("startShortcut",
|
||||
"app package " + packageName + " does not support multi-instance"));
|
||||
Toast.makeText(mContext, R.string.dock_multi_instances_not_supported_text,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
@@ -580,6 +584,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
taskId = INVALID_TASK_ID;
|
||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
|
||||
"Cancel entering split as not supporting multi-instances");
|
||||
Log.w(TAG, splitFailureMessage("startShortcutAndTaskWithLegacyTransition",
|
||||
"app package " + packageName1 + " does not support multi-instance"));
|
||||
Toast.makeText(mContext, R.string.dock_multi_instances_not_supported_text,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
@@ -612,6 +618,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
taskId = INVALID_TASK_ID;
|
||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
|
||||
"Cancel entering split as not supporting multi-instances");
|
||||
Log.w(TAG, splitFailureMessage("startShortcutAndTask",
|
||||
"app package " + packageName1 + " does not support multi-instance"));
|
||||
Toast.makeText(mContext, R.string.dock_multi_instances_not_supported_text,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
@@ -647,6 +655,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
taskId = INVALID_TASK_ID;
|
||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
|
||||
"Cancel entering split as not supporting multi-instances");
|
||||
Log.w(TAG, splitFailureMessage("startIntentAndTaskWithLegacyTransition",
|
||||
"app package " + packageName1 + " does not support multi-instance"));
|
||||
Toast.makeText(mContext, R.string.dock_multi_instances_not_supported_text,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
@@ -677,6 +687,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
taskId = INVALID_TASK_ID;
|
||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
|
||||
"Cancel entering split as not supporting multi-instances");
|
||||
Log.w(TAG, splitFailureMessage("startIntentAndTask",
|
||||
"app package " + packageName1 + " does not support multi-instance"));
|
||||
Toast.makeText(mContext, R.string.dock_multi_instances_not_supported_text,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
@@ -705,6 +717,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
pendingIntent2 = null;
|
||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
|
||||
"Cancel entering split as not supporting multi-instances");
|
||||
Log.w(TAG, splitFailureMessage("startIntentsWithLegacyTransition",
|
||||
"app package " + packageName1 + " does not support multi-instance"));
|
||||
Toast.makeText(mContext, R.string.dock_multi_instances_not_supported_text,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
@@ -734,6 +748,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
pendingIntent2 = null;
|
||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
|
||||
"Cancel entering split as not supporting multi-instances");
|
||||
Log.w(TAG, splitFailureMessage("startIntents",
|
||||
"app package " + packageName1 + " does not support multi-instance"));
|
||||
Toast.makeText(mContext, R.string.dock_multi_instances_not_supported_text,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
@@ -780,6 +796,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
} else {
|
||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
|
||||
"Cancel entering split as not supporting multi-instances");
|
||||
Log.w(TAG, splitFailureMessage("startIntent",
|
||||
"app package " + packageName1 + " does not support multi-instance"));
|
||||
Toast.makeText(mContext, R.string.dock_multi_instances_not_supported_text,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
|
||||
@@ -41,6 +41,7 @@ import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSIT
|
||||
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_UNDEFINED;
|
||||
import static com.android.wm.shell.common.split.SplitScreenConstants.splitPositionToString;
|
||||
import static com.android.wm.shell.common.split.SplitScreenUtils.reverseSplitPosition;
|
||||
import static com.android.wm.shell.common.split.SplitScreenUtils.splitFailureMessage;
|
||||
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_MAIN;
|
||||
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_SIDE;
|
||||
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_UNDEFINED;
|
||||
@@ -473,6 +474,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
if (isEnteringSplit && mSideStage.getChildCount() == 0) {
|
||||
mMainExecutor.execute(() -> exitSplitScreen(
|
||||
null /* childrenToTop */, EXIT_REASON_UNKNOWN));
|
||||
Log.w(TAG, splitFailureMessage("startShortcut",
|
||||
"side stage was not populated"));
|
||||
mSplitUnsupportedToast.show();
|
||||
}
|
||||
|
||||
@@ -560,6 +563,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
if (isEnteringSplit && mSideStage.getChildCount() == 0) {
|
||||
mMainExecutor.execute(() -> exitSplitScreen(
|
||||
null /* childrenToTop */, EXIT_REASON_UNKNOWN));
|
||||
Log.w(TAG, splitFailureMessage("startIntentLegacy",
|
||||
"side stage was not populated"));
|
||||
mSplitUnsupportedToast.show();
|
||||
}
|
||||
|
||||
@@ -1090,6 +1095,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
mMainExecutor.execute(() ->
|
||||
exitSplitScreen(mMainStage.getChildCount() == 0
|
||||
? mSideStage : mMainStage, EXIT_REASON_UNKNOWN));
|
||||
Log.w(TAG, splitFailureMessage("onRemoteAnimationFinishedOrCancelled",
|
||||
"main or side stage was not populated."));
|
||||
mSplitUnsupportedToast.show();
|
||||
} else {
|
||||
mSyncQueue.queue(evictWct);
|
||||
@@ -1109,6 +1116,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
if (mMainStage.getChildCount() == 0 || mSideStage.getChildCount() == 0) {
|
||||
mMainExecutor.execute(() -> exitSplitScreen(mMainStage.getChildCount() == 0
|
||||
? mSideStage : mMainStage, EXIT_REASON_UNKNOWN));
|
||||
Log.w(TAG, splitFailureMessage("onRemoteAnimationFinished",
|
||||
"main or side stage was not populated"));
|
||||
mSplitUnsupportedToast.show();
|
||||
return;
|
||||
}
|
||||
@@ -2704,12 +2713,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
}
|
||||
} else {
|
||||
if (mainChild == null || sideChild == null) {
|
||||
Log.w(TAG, "Launched 2 tasks in split, but didn't receive"
|
||||
+ " 2 tasks in transition. Possibly one of them failed to launch");
|
||||
final int dismissTop = mainChild != null ? STAGE_TYPE_MAIN :
|
||||
(sideChild != null ? STAGE_TYPE_SIDE : STAGE_TYPE_UNDEFINED);
|
||||
mSplitTransitions.mPendingEnter.cancel(
|
||||
(cancelWct, cancelT) -> prepareExitSplitScreen(dismissTop, cancelWct));
|
||||
Log.w(TAG, splitFailureMessage("startPendingEnterAnimation",
|
||||
"launched 2 tasks in split, but didn't receive "
|
||||
+ "2 tasks in transition. Possibly one of them failed to launch"));
|
||||
mSplitUnsupportedToast.show();
|
||||
return true;
|
||||
}
|
||||
@@ -3169,7 +3179,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNoLongerSupportMultiWindow() {
|
||||
public void onNoLongerSupportMultiWindow(ActivityManager.RunningTaskInfo taskInfo) {
|
||||
if (mMainStage.isActive()) {
|
||||
final boolean isMainStage = mMainStageListener == this;
|
||||
if (!ENABLE_SHELL_TRANSITIONS) {
|
||||
@@ -3184,6 +3194,9 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
prepareExitSplitScreen(stageType, wct);
|
||||
mSplitTransitions.startDismissTransition(wct, StageCoordinator.this, stageType,
|
||||
EXIT_REASON_APP_DOES_NOT_SUPPORT_MULTIWINDOW);
|
||||
Log.w(TAG, splitFailureMessage("onNoLongerSupportMultiWindow",
|
||||
"app package " + taskInfo.baseActivity.getPackageName()
|
||||
+ " does not support splitscreen, or is a controlled activity type"));
|
||||
mSplitUnsupportedToast.show();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,7 +81,7 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener {
|
||||
|
||||
void onRootTaskVanished();
|
||||
|
||||
void onNoLongerSupportMultiWindow();
|
||||
void onNoLongerSupportMultiWindow(ActivityManager.RunningTaskInfo taskInfo);
|
||||
}
|
||||
|
||||
private final Context mContext;
|
||||
@@ -226,7 +226,7 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener {
|
||||
taskInfo.getWindowingMode())) {
|
||||
// Leave split screen if the task no longer supports multi window or have
|
||||
// uncontrolled task.
|
||||
mCallbacks.onNoLongerSupportMultiWindow();
|
||||
mCallbacks.onNoLongerSupportMultiWindow(taskInfo);
|
||||
return;
|
||||
}
|
||||
mChildrenTaskInfo.put(taskInfo.taskId, taskInfo);
|
||||
|
||||
@@ -161,7 +161,7 @@ public final class StageTaskListenerTests extends ShellTestCase {
|
||||
childTask.supportsMultiWindow = false;
|
||||
|
||||
mStageTaskListener.onTaskInfoChanged(childTask);
|
||||
verify(mCallbacks).onNoLongerSupportMultiWindow();
|
||||
verify(mCallbacks).onNoLongerSupportMultiWindow(childTask);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user