Loading services/core/java/com/android/server/tv/TvInputManagerService.java +61 −33 Original line number Diff line number Diff line Loading @@ -180,7 +180,7 @@ public final class TvInputManagerService extends SystemService { try { results = mContentResolver.applyBatch(TvContract.AUTHORITY, operations); } catch (RemoteException | OperationApplicationException e) { Slog.e(TAG, "error in applyBatch" + e); Slog.e(TAG, "error in applyBatch", e); } if (DEBUG) { Loading Loading @@ -217,7 +217,9 @@ public final class TvInputManagerService extends SystemService { UserState userState = getUserStateLocked(userId); userState.packageSet.clear(); if (DEBUG) Slog.d(TAG, "buildTvInputList"); if (DEBUG) { Slog.d(TAG, "buildTvInputList"); } PackageManager pm = mContext.getPackageManager(); List<ResolveInfo> services = pm.queryIntentServices( new Intent(TvInputService.SERVICE_INTERFACE), Loading Loading @@ -247,7 +249,7 @@ public final class TvInputManagerService extends SystemService { try { inputList.add(TvInputInfo.createTvInputInfo(mContext, ri)); } catch (XmlPullParserException | IOException e) { Slog.e(TAG, "Failed to load TV input " + si.name, e); Slog.e(TAG, "failed to load TV input " + si.name, e); continue; } } Loading @@ -259,7 +261,9 @@ public final class TvInputManagerService extends SystemService { Map<String, TvInputState> inputMap = new HashMap<String, TvInputState>(); for (TvInputInfo info : inputList) { if (DEBUG) Slog.d(TAG, "add " + info.getId()); if (DEBUG) { Slog.d(TAG, "add " + info.getId()); } TvInputState state = userState.inputMap.get(info.getId()); if (state == null) { state = new TvInputState(); Loading Loading @@ -348,7 +352,13 @@ public final class TvInputManagerService extends SystemService { } userState.serviceStateMap.clear(); // Clear everything else. userState.inputMap.clear(); userState.packageSet.clear(); userState.ratingSystemXmlUriSet.clear(); userState.clientStateMap.clear(); userState.callbackSet.clear(); userState.mainSessionToken = null; mUserStates.remove(userId); } Loading Loading @@ -475,7 +485,7 @@ public final class TvInputManagerService extends SystemService { try { clientToken.linkToDeath(clientState, 0); } catch (RemoteException e) { Slog.e(TAG, "Client is already died."); Slog.e(TAG, "client process has already died", e); } userState.clientStateMap.put(clientToken, clientState); return clientState; Loading Loading @@ -509,7 +519,7 @@ public final class TvInputManagerService extends SystemService { try { session.asBinder().linkToDeath(sessionState, 0); } catch (RemoteException e) { Slog.e(TAG, "Session is already died."); Slog.e(TAG, "session process has already died", e); } IBinder clientToken = sessionState.mClient.asBinder(); Loading Loading @@ -543,7 +553,7 @@ public final class TvInputManagerService extends SystemService { // originated from. sessionState.mClient.onChannelRetuned(channelUri, sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onChannelRetuned"); Slog.e(TAG, "error in onChannelRetuned", e); } } } Loading @@ -560,7 +570,7 @@ public final class TvInputManagerService extends SystemService { try { sessionState.mClient.onTracksChanged(tracks, sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onTracksChanged"); Slog.e(TAG, "error in onTracksChanged", e); } } } Loading @@ -577,7 +587,7 @@ public final class TvInputManagerService extends SystemService { try { sessionState.mClient.onTrackSelected(type, trackId, sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onTrackSelected"); Slog.e(TAG, "error in onTrackSelected", e); } } } Loading @@ -594,7 +604,7 @@ public final class TvInputManagerService extends SystemService { try { sessionState.mClient.onVideoAvailable(sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onVideoAvailable"); Slog.e(TAG, "error in onVideoAvailable", e); } } } Loading @@ -611,7 +621,7 @@ public final class TvInputManagerService extends SystemService { try { sessionState.mClient.onVideoUnavailable(reason, sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onVideoUnavailable"); Slog.e(TAG, "error in onVideoUnavailable", e); } } } Loading @@ -628,7 +638,7 @@ public final class TvInputManagerService extends SystemService { try { sessionState.mClient.onContentAllowed(sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onContentAllowed"); Slog.e(TAG, "error in onContentAllowed", e); } } } Loading @@ -645,7 +655,7 @@ public final class TvInputManagerService extends SystemService { try { sessionState.mClient.onContentBlocked(rating, sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onContentBlocked"); Slog.e(TAG, "error in onContentBlocked", e); } } } Loading @@ -664,7 +674,7 @@ public final class TvInputManagerService extends SystemService { sessionState.mClient.onLayoutSurface(left, top, right, bottom, sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onLayoutSurface"); Slog.e(TAG, "error in onLayoutSurface", e); } } } Loading @@ -682,7 +692,7 @@ public final class TvInputManagerService extends SystemService { sessionState.mClient.onSessionEvent(eventType, eventArgs, sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onSessionEvent"); Slog.e(TAG, "error in onSessionEvent", e); } } } Loading @@ -704,8 +714,8 @@ public final class TvInputManagerService extends SystemService { IBinder sessionToken, InputChannel channel, int seq) { try { client.onSessionCreated(inputId, sessionToken, channel, seq); } catch (RemoteException exception) { Slog.e(TAG, "error in onSessionCreated", exception); } catch (RemoteException e) { Slog.e(TAG, "error in onSessionCreated", e); } } Loading @@ -719,7 +729,7 @@ public final class TvInputManagerService extends SystemService { try { sessionState.mSession.release(); } catch (RemoteException e) { Slog.w(TAG, "session is already disapeared", e); Slog.e(TAG, "session process has already died", e); } sessionState.mSession = null; } Loading Loading @@ -749,6 +759,10 @@ public final class TvInputManagerService extends SystemService { clientState.mSessionTokens.remove(sessionToken); if (clientState.isEmpty()) { userState.clientStateMap.remove(sessionState.mClient.asBinder()); if (userState.clientStateMap.isEmpty()) { // No longer need to keep the callbacks since there is no client. userState.callbackSet.clear(); } } } Loading Loading @@ -789,26 +803,26 @@ public final class TvInputManagerService extends SystemService { private void notifyInputAddedLocked(UserState userState, String inputId) { if (DEBUG) { Slog.d(TAG, "notifyInputAdded: inputId = " + inputId); Slog.d(TAG, "notifyInputAddedLocked(inputId=" + inputId + ")"); } for (ITvInputManagerCallback callback : userState.callbackSet) { try { callback.onInputAdded(inputId); } catch (RemoteException e) { Slog.e(TAG, "Failed to report added input to callback."); Slog.e(TAG, "failed to report added input to callback", e); } } } private void notifyInputRemovedLocked(UserState userState, String inputId) { if (DEBUG) { Slog.d(TAG, "notifyInputRemovedLocked: inputId = " + inputId); Slog.d(TAG, "notifyInputRemovedLocked(inputId=" + inputId + ")"); } for (ITvInputManagerCallback callback : userState.callbackSet) { try { callback.onInputRemoved(inputId); } catch (RemoteException e) { Slog.e(TAG, "Failed to report removed input to callback."); Slog.e(TAG, "failed to report removed input to callback", e); } } } Loading @@ -816,22 +830,22 @@ public final class TvInputManagerService extends SystemService { private void notifyInputStateChangedLocked(UserState userState, String inputId, int state, ITvInputManagerCallback targetCallback) { if (DEBUG) { Slog.d(TAG, "notifyInputStateChangedLocked: inputId = " + inputId + "; state = " + state); Slog.d(TAG, "notifyInputStateChangedLocked(inputId=" + inputId + ", state=" + state + ")"); } if (targetCallback == null) { for (ITvInputManagerCallback callback : userState.callbackSet) { try { callback.onInputStateChanged(inputId, state); } catch (RemoteException e) { Slog.e(TAG, "Failed to report state change to callback."); Slog.e(TAG, "failed to report state change to callback", e); } } } else { try { targetCallback.onInputStateChanged(inputId, state); } catch (RemoteException e) { Slog.e(TAG, "Failed to report state change to callback."); Slog.e(TAG, "failed to report state change to callback", e); } } } Loading Loading @@ -912,8 +926,22 @@ public final class TvInputManagerService extends SystemService { final long identity = Binder.clearCallingIdentity(); try { synchronized (mLock) { UserState userState = getUserStateLocked(resolvedUserId); final UserState userState = getUserStateLocked(resolvedUserId); userState.callbackSet.add(callback); try { callback.asBinder().linkToDeath(new IBinder.DeathRecipient() { @Override public void binderDied() { synchronized (mLock) { if (userState.callbackSet != null) { userState.callbackSet.remove(callback); } } } }, 0); } catch (RemoteException e) { Slog.e(TAG, "client process has already died", e); } for (TvInputState state : userState.inputMap.values()) { notifyInputStateChangedLocked(userState, state.mInfo.getId(), state.mState, callback); Loading Loading @@ -1103,7 +1131,7 @@ public final class TvInputManagerService extends SystemService { @Override public void releaseSession(IBinder sessionToken, int userId) { if (DEBUG) { Slog.d(TAG, "releaseSession(): " + sessionToken); Slog.d(TAG, "releaseSession(sessionToken=" + sessionToken + ")"); } final int callingUid = Binder.getCallingUid(); final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid, Loading @@ -1121,7 +1149,7 @@ public final class TvInputManagerService extends SystemService { @Override public void setMainSession(IBinder sessionToken, int userId) { if (DEBUG) { Slog.d(TAG, "setMainSession(): " + sessionToken); Slog.d(TAG, "setMainSession(sessionToken=" + sessionToken + ")"); } final int callingUid = Binder.getCallingUid(); final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid, Loading Loading @@ -1290,7 +1318,7 @@ public final class TvInputManagerService extends SystemService { getSessionLocked(sessionToken, callingUid, resolvedUserId) .requestUnblockContent(unblockedRating); } catch (RemoteException e) { Slog.e(TAG, "error in unblockContent", e); Slog.e(TAG, "error in requestUnblockContent", e); } } } finally { Loading Loading @@ -1351,7 +1379,7 @@ public final class TvInputManagerService extends SystemService { getSessionLocked(sessionToken, callingUid, resolvedUserId) .appPrivateCommand(command, data); } catch (RemoteException e) { Slog.e(TAG, "error in sendAppPrivateCommand", e); Slog.e(TAG, "error in appPrivateCommand", e); } } } finally { Loading Loading @@ -1516,7 +1544,7 @@ public final class TvInputManagerService extends SystemService { synchronized (mLock) { UserState userState = getUserStateLocked(resolvedUserId); if (userState.inputMap.get(inputId) == null) { Slog.e(TAG, "Input not found for " + inputId); Slog.e(TAG, "input not found for " + inputId); return false; } for (SessionState sessionState : userState.sessionStateMap.values()) { Loading Loading @@ -2004,7 +2032,7 @@ public final class TvInputManagerService extends SystemService { buildTvInputListLocked(mUserId); mTvInputHardwareManager.removeTvInput(inputId); } else { Slog.e(TAG, "TvInputInfo with inputId=" + inputId + " not found."); Slog.e(TAG, "failed to remove input " + inputId); } } } Loading Loading
services/core/java/com/android/server/tv/TvInputManagerService.java +61 −33 Original line number Diff line number Diff line Loading @@ -180,7 +180,7 @@ public final class TvInputManagerService extends SystemService { try { results = mContentResolver.applyBatch(TvContract.AUTHORITY, operations); } catch (RemoteException | OperationApplicationException e) { Slog.e(TAG, "error in applyBatch" + e); Slog.e(TAG, "error in applyBatch", e); } if (DEBUG) { Loading Loading @@ -217,7 +217,9 @@ public final class TvInputManagerService extends SystemService { UserState userState = getUserStateLocked(userId); userState.packageSet.clear(); if (DEBUG) Slog.d(TAG, "buildTvInputList"); if (DEBUG) { Slog.d(TAG, "buildTvInputList"); } PackageManager pm = mContext.getPackageManager(); List<ResolveInfo> services = pm.queryIntentServices( new Intent(TvInputService.SERVICE_INTERFACE), Loading Loading @@ -247,7 +249,7 @@ public final class TvInputManagerService extends SystemService { try { inputList.add(TvInputInfo.createTvInputInfo(mContext, ri)); } catch (XmlPullParserException | IOException e) { Slog.e(TAG, "Failed to load TV input " + si.name, e); Slog.e(TAG, "failed to load TV input " + si.name, e); continue; } } Loading @@ -259,7 +261,9 @@ public final class TvInputManagerService extends SystemService { Map<String, TvInputState> inputMap = new HashMap<String, TvInputState>(); for (TvInputInfo info : inputList) { if (DEBUG) Slog.d(TAG, "add " + info.getId()); if (DEBUG) { Slog.d(TAG, "add " + info.getId()); } TvInputState state = userState.inputMap.get(info.getId()); if (state == null) { state = new TvInputState(); Loading Loading @@ -348,7 +352,13 @@ public final class TvInputManagerService extends SystemService { } userState.serviceStateMap.clear(); // Clear everything else. userState.inputMap.clear(); userState.packageSet.clear(); userState.ratingSystemXmlUriSet.clear(); userState.clientStateMap.clear(); userState.callbackSet.clear(); userState.mainSessionToken = null; mUserStates.remove(userId); } Loading Loading @@ -475,7 +485,7 @@ public final class TvInputManagerService extends SystemService { try { clientToken.linkToDeath(clientState, 0); } catch (RemoteException e) { Slog.e(TAG, "Client is already died."); Slog.e(TAG, "client process has already died", e); } userState.clientStateMap.put(clientToken, clientState); return clientState; Loading Loading @@ -509,7 +519,7 @@ public final class TvInputManagerService extends SystemService { try { session.asBinder().linkToDeath(sessionState, 0); } catch (RemoteException e) { Slog.e(TAG, "Session is already died."); Slog.e(TAG, "session process has already died", e); } IBinder clientToken = sessionState.mClient.asBinder(); Loading Loading @@ -543,7 +553,7 @@ public final class TvInputManagerService extends SystemService { // originated from. sessionState.mClient.onChannelRetuned(channelUri, sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onChannelRetuned"); Slog.e(TAG, "error in onChannelRetuned", e); } } } Loading @@ -560,7 +570,7 @@ public final class TvInputManagerService extends SystemService { try { sessionState.mClient.onTracksChanged(tracks, sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onTracksChanged"); Slog.e(TAG, "error in onTracksChanged", e); } } } Loading @@ -577,7 +587,7 @@ public final class TvInputManagerService extends SystemService { try { sessionState.mClient.onTrackSelected(type, trackId, sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onTrackSelected"); Slog.e(TAG, "error in onTrackSelected", e); } } } Loading @@ -594,7 +604,7 @@ public final class TvInputManagerService extends SystemService { try { sessionState.mClient.onVideoAvailable(sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onVideoAvailable"); Slog.e(TAG, "error in onVideoAvailable", e); } } } Loading @@ -611,7 +621,7 @@ public final class TvInputManagerService extends SystemService { try { sessionState.mClient.onVideoUnavailable(reason, sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onVideoUnavailable"); Slog.e(TAG, "error in onVideoUnavailable", e); } } } Loading @@ -628,7 +638,7 @@ public final class TvInputManagerService extends SystemService { try { sessionState.mClient.onContentAllowed(sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onContentAllowed"); Slog.e(TAG, "error in onContentAllowed", e); } } } Loading @@ -645,7 +655,7 @@ public final class TvInputManagerService extends SystemService { try { sessionState.mClient.onContentBlocked(rating, sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onContentBlocked"); Slog.e(TAG, "error in onContentBlocked", e); } } } Loading @@ -664,7 +674,7 @@ public final class TvInputManagerService extends SystemService { sessionState.mClient.onLayoutSurface(left, top, right, bottom, sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onLayoutSurface"); Slog.e(TAG, "error in onLayoutSurface", e); } } } Loading @@ -682,7 +692,7 @@ public final class TvInputManagerService extends SystemService { sessionState.mClient.onSessionEvent(eventType, eventArgs, sessionState.mSeq); } catch (RemoteException e) { Slog.e(TAG, "error in onSessionEvent"); Slog.e(TAG, "error in onSessionEvent", e); } } } Loading @@ -704,8 +714,8 @@ public final class TvInputManagerService extends SystemService { IBinder sessionToken, InputChannel channel, int seq) { try { client.onSessionCreated(inputId, sessionToken, channel, seq); } catch (RemoteException exception) { Slog.e(TAG, "error in onSessionCreated", exception); } catch (RemoteException e) { Slog.e(TAG, "error in onSessionCreated", e); } } Loading @@ -719,7 +729,7 @@ public final class TvInputManagerService extends SystemService { try { sessionState.mSession.release(); } catch (RemoteException e) { Slog.w(TAG, "session is already disapeared", e); Slog.e(TAG, "session process has already died", e); } sessionState.mSession = null; } Loading Loading @@ -749,6 +759,10 @@ public final class TvInputManagerService extends SystemService { clientState.mSessionTokens.remove(sessionToken); if (clientState.isEmpty()) { userState.clientStateMap.remove(sessionState.mClient.asBinder()); if (userState.clientStateMap.isEmpty()) { // No longer need to keep the callbacks since there is no client. userState.callbackSet.clear(); } } } Loading Loading @@ -789,26 +803,26 @@ public final class TvInputManagerService extends SystemService { private void notifyInputAddedLocked(UserState userState, String inputId) { if (DEBUG) { Slog.d(TAG, "notifyInputAdded: inputId = " + inputId); Slog.d(TAG, "notifyInputAddedLocked(inputId=" + inputId + ")"); } for (ITvInputManagerCallback callback : userState.callbackSet) { try { callback.onInputAdded(inputId); } catch (RemoteException e) { Slog.e(TAG, "Failed to report added input to callback."); Slog.e(TAG, "failed to report added input to callback", e); } } } private void notifyInputRemovedLocked(UserState userState, String inputId) { if (DEBUG) { Slog.d(TAG, "notifyInputRemovedLocked: inputId = " + inputId); Slog.d(TAG, "notifyInputRemovedLocked(inputId=" + inputId + ")"); } for (ITvInputManagerCallback callback : userState.callbackSet) { try { callback.onInputRemoved(inputId); } catch (RemoteException e) { Slog.e(TAG, "Failed to report removed input to callback."); Slog.e(TAG, "failed to report removed input to callback", e); } } } Loading @@ -816,22 +830,22 @@ public final class TvInputManagerService extends SystemService { private void notifyInputStateChangedLocked(UserState userState, String inputId, int state, ITvInputManagerCallback targetCallback) { if (DEBUG) { Slog.d(TAG, "notifyInputStateChangedLocked: inputId = " + inputId + "; state = " + state); Slog.d(TAG, "notifyInputStateChangedLocked(inputId=" + inputId + ", state=" + state + ")"); } if (targetCallback == null) { for (ITvInputManagerCallback callback : userState.callbackSet) { try { callback.onInputStateChanged(inputId, state); } catch (RemoteException e) { Slog.e(TAG, "Failed to report state change to callback."); Slog.e(TAG, "failed to report state change to callback", e); } } } else { try { targetCallback.onInputStateChanged(inputId, state); } catch (RemoteException e) { Slog.e(TAG, "Failed to report state change to callback."); Slog.e(TAG, "failed to report state change to callback", e); } } } Loading Loading @@ -912,8 +926,22 @@ public final class TvInputManagerService extends SystemService { final long identity = Binder.clearCallingIdentity(); try { synchronized (mLock) { UserState userState = getUserStateLocked(resolvedUserId); final UserState userState = getUserStateLocked(resolvedUserId); userState.callbackSet.add(callback); try { callback.asBinder().linkToDeath(new IBinder.DeathRecipient() { @Override public void binderDied() { synchronized (mLock) { if (userState.callbackSet != null) { userState.callbackSet.remove(callback); } } } }, 0); } catch (RemoteException e) { Slog.e(TAG, "client process has already died", e); } for (TvInputState state : userState.inputMap.values()) { notifyInputStateChangedLocked(userState, state.mInfo.getId(), state.mState, callback); Loading Loading @@ -1103,7 +1131,7 @@ public final class TvInputManagerService extends SystemService { @Override public void releaseSession(IBinder sessionToken, int userId) { if (DEBUG) { Slog.d(TAG, "releaseSession(): " + sessionToken); Slog.d(TAG, "releaseSession(sessionToken=" + sessionToken + ")"); } final int callingUid = Binder.getCallingUid(); final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid, Loading @@ -1121,7 +1149,7 @@ public final class TvInputManagerService extends SystemService { @Override public void setMainSession(IBinder sessionToken, int userId) { if (DEBUG) { Slog.d(TAG, "setMainSession(): " + sessionToken); Slog.d(TAG, "setMainSession(sessionToken=" + sessionToken + ")"); } final int callingUid = Binder.getCallingUid(); final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid, Loading Loading @@ -1290,7 +1318,7 @@ public final class TvInputManagerService extends SystemService { getSessionLocked(sessionToken, callingUid, resolvedUserId) .requestUnblockContent(unblockedRating); } catch (RemoteException e) { Slog.e(TAG, "error in unblockContent", e); Slog.e(TAG, "error in requestUnblockContent", e); } } } finally { Loading Loading @@ -1351,7 +1379,7 @@ public final class TvInputManagerService extends SystemService { getSessionLocked(sessionToken, callingUid, resolvedUserId) .appPrivateCommand(command, data); } catch (RemoteException e) { Slog.e(TAG, "error in sendAppPrivateCommand", e); Slog.e(TAG, "error in appPrivateCommand", e); } } } finally { Loading Loading @@ -1516,7 +1544,7 @@ public final class TvInputManagerService extends SystemService { synchronized (mLock) { UserState userState = getUserStateLocked(resolvedUserId); if (userState.inputMap.get(inputId) == null) { Slog.e(TAG, "Input not found for " + inputId); Slog.e(TAG, "input not found for " + inputId); return false; } for (SessionState sessionState : userState.sessionStateMap.values()) { Loading Loading @@ -2004,7 +2032,7 @@ public final class TvInputManagerService extends SystemService { buildTvInputListLocked(mUserId); mTvInputHardwareManager.removeTvInput(inputId); } else { Slog.e(TAG, "TvInputInfo with inputId=" + inputId + " not found."); Slog.e(TAG, "failed to remove input " + inputId); } } } Loading