Fix potential NPE when removing TaskOrganizerController

Since unregister can be called from other process, the
TaskOrganizerState may be removed from different thread.

Bug: 139371701
Test: atest TaskOrganizerTests
Change-Id: I4ede04e68fdf70f55f65db4193035d9266445ee3
diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java
index 15b483c..eddb2ce 100644
--- a/services/core/java/com/android/server/wm/TaskOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java
@@ -75,7 +75,9 @@
             synchronized (mGlobalLock) {
                 final TaskOrganizerState state = mTaskOrganizerStates.remove(
                         mTaskOrganizer.asBinder());
-                state.dispose();
+                if (state != null) {
+                    state.dispose();
+                }
             }
         }
     };
@@ -216,9 +218,20 @@
 
     @Override
     public void unregisterTaskOrganizer(ITaskOrganizer organizer) {
-        final TaskOrganizerState state = mTaskOrganizerStates.remove(organizer.asBinder());
-        state.unlinkDeath();
-        state.dispose();
+        enforceStackPermission("unregisterTaskOrganizer()");
+        final long origId = Binder.clearCallingIdentity();
+        try {
+            synchronized (mGlobalLock) {
+                final TaskOrganizerState state = mTaskOrganizerStates.remove(organizer.asBinder());
+                if (state == null) {
+                    return;
+                }
+                state.unlinkDeath();
+                state.dispose();
+            }
+        } finally {
+            Binder.restoreCallingIdentity(origId);
+        }
     }
 
     ITaskOrganizer getTaskOrganizer(int windowingMode) {