Handle the case where root task could be null.

- If a root task is quickly destroyed, conerting its token to task
  object will return null.
- Handle that case as it happens in a few Activity related tests.

Bug: 297060765
Bug: 299972488
Test: atest AssistantStackTests
Test: atest StartActivityTests
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:f384fa30fbf13ec5b1721bc0e52e1065be4cbed2)
Merged-In: I179055fd434656c8116661b9f39adfdcef249ce7
Change-Id: I179055fd434656c8116661b9f39adfdcef249ce7
diff --git a/builtInServices/api/module-lib-current.txt b/builtInServices/api/module-lib-current.txt
index f72c56d..b6e285f 100644
--- a/builtInServices/api/module-lib-current.txt
+++ b/builtInServices/api/module-lib-current.txt
@@ -142,7 +142,7 @@
   }
 
   public final class TaskWrapper {
-    method public static com.android.server.wm.TaskWrapper createFromToken(@NonNull android.os.IBinder);
+    method @Nullable public static com.android.server.wm.TaskWrapper createFromToken(@NonNull android.os.IBinder);
     method public com.android.server.wm.TaskWrapper getRootTask();
     method public com.android.server.wm.TaskDisplayAreaWrapper getTaskDisplayArea();
     method public int getUserId();
diff --git a/builtInServices/src/com/android/server/wm/TaskWrapper.java b/builtInServices/src/com/android/server/wm/TaskWrapper.java
index 448ab62..0d4125c 100644
--- a/builtInServices/src/com/android/server/wm/TaskWrapper.java
+++ b/builtInServices/src/com/android/server/wm/TaskWrapper.java
@@ -35,14 +35,16 @@
     }
 
     /** @hide */
+    @Nullable
     public static TaskWrapper create(@Nullable Task task) {
         if (task == null) return null;
         return new TaskWrapper(task);
     }
 
     /** Creates an instance of {@link TaskWrapper} based on the task's remote {@code token}. */
+    @Nullable
     public static TaskWrapper createFromToken(@NonNull IBinder token) {
-        return new TaskWrapper((Task) WindowContainer.fromBinder(token));
+        return create((Task) WindowContainer.fromBinder(token));
     }
 
     /**
diff --git a/updatableServices/src/com/android/server/wm/CarActivityInterceptorUpdatableImpl.java b/updatableServices/src/com/android/server/wm/CarActivityInterceptorUpdatableImpl.java
index c5beffb..21a92e9 100644
--- a/updatableServices/src/com/android/server/wm/CarActivityInterceptorUpdatableImpl.java
+++ b/updatableServices/src/com/android/server/wm/CarActivityInterceptorUpdatableImpl.java
@@ -124,6 +124,10 @@
     private boolean isRootTaskUserSameAsActivityUser(IBinder rootTaskToken,
             ActivityInterceptorInfoWrapper activityInterceptorInfoWrapper) {
         TaskWrapper rootTask = TaskWrapper.createFromToken(rootTaskToken);
+        if (rootTask == null) {
+            Slogf.w(TAG, "Root task not found.");
+            return false;
+        }
         int userIdFromActivity = activityInterceptorInfoWrapper.getUserId();
         int userIdFromRootTask = mBuiltIn.getUserAssignedToDisplay(rootTask
                 .getTaskDisplayArea().getDisplay().getDisplayId());