Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 20b906ab authored by Jeremy Sim's avatar Jeremy Sim
Browse files

Add logcat logs for splitscreen launch failures

This patch makes it so that splitscreen launch failures (when app doesn't support splitscreen, or multi-instance, or if app crashes) are logged in logcat.

Fixes: 280494204
Test: Manual
Change-Id: Ie3755330c9acf68631f8e39a9f8a760020c65b8f
parent 80684c3e
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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;
    }
}
+18 −0
Original line number Diff line number Diff line
@@ -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;
+16 −3
Original line number Diff line number Diff line
@@ -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;
            }
@@ -3159,7 +3169,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) {
@@ -3174,6 +3184,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();
            }
        }
+2 −2
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -161,7 +161,7 @@ public final class StageTaskListenerTests extends ShellTestCase {
        childTask.supportsMultiWindow = false;

        mStageTaskListener.onTaskInfoChanged(childTask);
        verify(mCallbacks).onNoLongerSupportMultiWindow();
        verify(mCallbacks).onNoLongerSupportMultiWindow(childTask);
    }

    @Test