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

Commit e9d60f87 authored by Tony Huang's avatar Tony Huang
Browse files

Fix some exception occrued possible code

1.
When removeTask, task surface might be null so check null before
call migrateToNewSurfaceControl.
Refactor code in dispose too.

2.
onTaskInfoChanged callback might before onTaskAppeared or after
onTaskVanished in race condition then cause crash. Avoid it by
check TaskAppearedInfo is null or not in the list.

This is temp workaround and it should finally fixed in
TaskOrganizerController side.

Bug: 161803994
Bug: 174482124
Test: check app lunch, split screen, pip
Test: atest WMShellUnitTests
Test: atest WmTests:WindowOrganizerTests
Change-Id: Iec5ec516ed71589832366c2b61e91c8804139f6e
parent 087a5215
Loading
Loading
Loading
Loading
+6 −3
Original line number Original line Diff line number Diff line
@@ -31,14 +31,12 @@ import android.os.Binder;
import android.os.IBinder;
import android.os.IBinder;
import android.util.ArrayMap;
import android.util.ArrayMap;
import android.util.Log;
import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseArray;
import android.view.SurfaceControl;
import android.view.SurfaceControl;
import android.window.ITaskOrganizerController;
import android.window.ITaskOrganizerController;
import android.window.TaskAppearedInfo;
import android.window.TaskAppearedInfo;
import android.window.TaskOrganizer;
import android.window.TaskOrganizer;


import androidx.annotation.BinderThread;
import androidx.annotation.NonNull;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.Nullable;


@@ -47,7 +45,6 @@ import com.android.internal.protolog.common.ProtoLog;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.TransactionPool;
import com.android.wm.shell.common.TransactionPool;
import com.android.wm.shell.common.annotations.ShellMainThread;
import com.android.wm.shell.startingsurface.StartingSurfaceDrawer;
import com.android.wm.shell.startingsurface.StartingSurfaceDrawer;


import java.io.PrintWriter;
import java.io.PrintWriter;
@@ -275,6 +272,12 @@ public class ShellTaskOrganizer extends TaskOrganizer {
        synchronized (mLock) {
        synchronized (mLock) {
            ProtoLog.v(WM_SHELL_TASK_ORG, "Task info changed taskId=%d", taskInfo.taskId);
            ProtoLog.v(WM_SHELL_TASK_ORG, "Task info changed taskId=%d", taskInfo.taskId);
            final TaskAppearedInfo data = mTasks.get(taskInfo.taskId);
            final TaskAppearedInfo data = mTasks.get(taskInfo.taskId);
            if (data == null) {
                // TODO(b/171749427): It means onTaskInfoChanged send before onTaskAppeared or
                //  after onTaskVanished, it should be fixed in controller side.
                return;
            }

            final TaskListener oldListener = getTaskListener(data.getTaskInfo());
            final TaskListener oldListener = getTaskListener(data.getTaskInfo());
            final TaskListener newListener = getTaskListener(taskInfo);
            final TaskListener newListener = getTaskListener(taskInfo);
            mTasks.put(taskInfo.taskId, new TaskAppearedInfo(taskInfo, data.getLeash()));
            mTasks.put(taskInfo.taskId, new TaskAppearedInfo(taskInfo, data.getLeash()));
+4 −3
Original line number Original line Diff line number Diff line
@@ -272,7 +272,9 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {


        void removeTask(Task t) {
        void removeTask(Task t) {
            if (t.mTaskAppearedSent) {
            if (t.mTaskAppearedSent) {
                if (t.getSurfaceControl() != null) {
                    t.migrateToNewSurfaceControl();
                    t.migrateToNewSurfaceControl();
                }
                t.mTaskAppearedSent = false;
                t.mTaskAppearedSent = false;
                mOrganizer.onTaskVanished(t);
                mOrganizer.onTaskVanished(t);
            }
            }
@@ -288,8 +290,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
            // possible.
            // possible.
            while (!mOrganizedTasks.isEmpty()) {
            while (!mOrganizedTasks.isEmpty()) {
                final Task t = mOrganizedTasks.get(0);
                final Task t = mOrganizedTasks.get(0);
                t.updateTaskOrganizerState(true /* forceUpdate */);
                if (!t.updateTaskOrganizerState(true /* forceUpdate */)) {
                if (mOrganizedTasks.contains(t)) {
                    removeTask(t);
                    removeTask(t);
                }
                }
            }
            }