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
This commit is contained in:
@@ -31,14 +31,12 @@ import android.os.Binder;
|
||||
import android.os.IBinder;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.Log;
|
||||
import android.util.Slog;
|
||||
import android.util.SparseArray;
|
||||
import android.view.SurfaceControl;
|
||||
import android.window.ITaskOrganizerController;
|
||||
import android.window.TaskAppearedInfo;
|
||||
import android.window.TaskOrganizer;
|
||||
|
||||
import androidx.annotation.BinderThread;
|
||||
import androidx.annotation.NonNull;
|
||||
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.SyncTransactionQueue;
|
||||
import com.android.wm.shell.common.TransactionPool;
|
||||
import com.android.wm.shell.common.annotations.ShellMainThread;
|
||||
import com.android.wm.shell.startingsurface.StartingSurfaceDrawer;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
@@ -275,6 +272,12 @@ public class ShellTaskOrganizer extends TaskOrganizer {
|
||||
synchronized (mLock) {
|
||||
ProtoLog.v(WM_SHELL_TASK_ORG, "Task info changed taskId=%d", 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 newListener = getTaskListener(taskInfo);
|
||||
mTasks.put(taskInfo.taskId, new TaskAppearedInfo(taskInfo, data.getLeash()));
|
||||
|
||||
@@ -272,7 +272,9 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
|
||||
|
||||
void removeTask(Task t) {
|
||||
if (t.mTaskAppearedSent) {
|
||||
t.migrateToNewSurfaceControl();
|
||||
if (t.getSurfaceControl() != null) {
|
||||
t.migrateToNewSurfaceControl();
|
||||
}
|
||||
t.mTaskAppearedSent = false;
|
||||
mOrganizer.onTaskVanished(t);
|
||||
}
|
||||
@@ -288,8 +290,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
|
||||
// possible.
|
||||
while (!mOrganizedTasks.isEmpty()) {
|
||||
final Task t = mOrganizedTasks.get(0);
|
||||
t.updateTaskOrganizerState(true /* forceUpdate */);
|
||||
if (mOrganizedTasks.contains(t)) {
|
||||
if (!t.updateTaskOrganizerState(true /* forceUpdate */)) {
|
||||
removeTask(t);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user