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);