Handle the failure of session creation request in TvInputManagerService.

Bug: 14073508
Change-Id: Idc9da323bb0000300faf662c7db031214ae6136c
diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java
index 79c4a50..16ed7fe 100644
--- a/services/core/java/com/android/server/tv/TvInputManagerService.java
+++ b/services/core/java/com/android/server/tv/TvInputManagerService.java
@@ -277,8 +277,14 @@
                 }
                 synchronized (mLock) {
                     sessionState.session = session;
-                    sendSessionTokenToClientLocked(sessionState.client, sessionState.name,
-                            sessionToken, sessionState.seq, userId);
+                    if (session == null) {
+                        removeSessionStateLocked(sessionToken, userId);
+                        sendSessionTokenToClientLocked(sessionState.client, sessionState.name, null,
+                                sessionState.seq, userId);
+                    } else {
+                        sendSessionTokenToClientLocked(sessionState.client, sessionState.name,
+                                sessionToken, sessionState.seq, userId);
+                    }
                 }
             }
         };
@@ -288,6 +294,7 @@
             service.createSession(callback);
         } catch (RemoteException e) {
             Log.e(TAG, "error in createSession", e);
+            removeSessionStateLocked(sessionToken, userId);
             sendSessionTokenToClientLocked(sessionState.client, sessionState.name, null,
                     sessionState.seq, userId);
         }
@@ -307,6 +314,19 @@
         }
     }
 
+    private void removeSessionStateLocked(IBinder sessionToken, int userId) {
+        // Remove the session state from the global session state map of the current user.
+        UserState userState = getUserStateLocked(userId);
+        SessionState sessionState = userState.sessionStateMap.remove(sessionToken);
+
+        // Also remove the session state from the session state map of the current service.
+        ServiceState serviceState = userState.serviceStateMap.get(sessionState.name);
+        if (serviceState != null) {
+            serviceState.sessionStateMap.remove(sessionToken);
+        }
+        updateServiceConnectionLocked(sessionState.name, userId);
+    }
+
     private final class BinderService extends ITvInputManager.Stub {
         @Override
         public List<TvInputInfo> getTvInputList(int userId) {
@@ -474,17 +494,7 @@
                         Log.e(TAG, "error in release", e);
                     }
 
-                    // Remove its state from the global session state map of the current user.
-                    UserState userState = getUserStateLocked(resolvedUserId);
-                    SessionState sessionState = userState.sessionStateMap.remove(sessionToken);
-
-                    // Also remove it from the session state map of the current service.
-                    ServiceState serviceState = userState.serviceStateMap.get(sessionState.name);
-                    if (serviceState != null) {
-                        serviceState.sessionStateMap.remove(sessionToken);
-                    }
-
-                    updateServiceConnectionLocked(sessionState.name, resolvedUserId);
+                    removeSessionStateLocked(sessionToken, resolvedUserId);
                 }
             } finally {
                 Binder.restoreCallingIdentity(identity);