diff options
| -rwxr-xr-x | services/core/java/com/android/server/tv/TvInputManagerService.java | 88 |
1 files changed, 72 insertions, 16 deletions
diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index 4e35e577ccfe..510893b2940b 100755 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -338,6 +338,7 @@ public final class TvInputManagerService extends SystemService { inputState = new TvInputState(); } inputState.info = info; + inputState.uid = getInputUid(info); inputMap.put(info.getId(), inputState); } @@ -372,6 +373,16 @@ public final class TvInputManagerService extends SystemService { userState.inputMap = inputMap; } + private int getInputUid(TvInputInfo info) { + try { + return getContext().getPackageManager().getApplicationInfo( + info.getServiceInfo().packageName, 0).uid; + } catch (NameNotFoundException e) { + Slog.w(TAG, "Unable to get UID for " + info, e); + return Process.INVALID_UID; + } + } + @GuardedBy("mLock") private void buildTvContentRatingSystemListLocked(int userId) { UserState userState = getOrCreateUserStateLocked(userId); @@ -406,7 +417,7 @@ public final class TvInputManagerService extends SystemService { return; } if (mUserStates.contains(mCurrentUserId)) { - UserState userState = mUserStates.get(mCurrentUserId); + UserState userState = getUserStateLocked(mCurrentUserId); List<SessionState> sessionStatesToRelease = new ArrayList<>(); for (SessionState sessionState : userState.sessionStateMap.values()) { if (sessionState.session != null && !sessionState.isRecordingSession) { @@ -475,7 +486,7 @@ public final class TvInputManagerService extends SystemService { private void removeUser(int userId) { synchronized (mLock) { - UserState userState = mUserStates.get(userId); + UserState userState = getUserStateLocked(userId); if (userState == null) { return; } @@ -536,7 +547,7 @@ public final class TvInputManagerService extends SystemService { @GuardedBy("mLock") private UserState getOrCreateUserStateLocked(int userId) { - UserState userState = mUserStates.get(userId); + UserState userState = getUserStateLocked(userId); if (userState == null) { userState = new UserState(mContext, userId); mUserStates.put(userId, userState); @@ -911,6 +922,7 @@ public final class TvInputManagerService extends SystemService { return; } inputState.info = inputInfo; + inputState.uid = getInputUid(inputInfo); int n = userState.mCallbacks.beginBroadcast(); for (int i = 0; i < n; ++i) { @@ -1287,6 +1299,8 @@ public final class TvInputManagerService extends SystemService { TvInputInfo info = inputState.info; ServiceState serviceState = userState.serviceStateMap.get(info.getComponent()); if (serviceState == null) { + int tisUid = PackageManager.getApplicationInfoAsUserCached( + info.getComponent().getPackageName(), 0, resolvedUserId).uid; serviceState = new ServiceState(info.getComponent(), resolvedUserId); userState.serviceStateMap.put(info.getComponent(), serviceState); } @@ -1320,7 +1334,7 @@ public final class TvInputManagerService extends SystemService { updateServiceConnectionLocked(info.getComponent(), resolvedUserId); } logTuneStateChanged(FrameworkStatsLog.TIF_TUNE_STATE_CHANGED__STATE__CREATED, - sessionState); + sessionState, inputState); } } finally { Binder.restoreCallingIdentity(identity); @@ -1338,12 +1352,16 @@ public final class TvInputManagerService extends SystemService { final long identity = Binder.clearCallingIdentity(); try { SessionState sessionState = null; + UserState userState = null; synchronized (mLock) { sessionState = releaseSessionLocked(sessionToken, callingUid, resolvedUserId); + userState = getUserStateLocked(userId); } if (sessionState != null) { + TvInputState tvInputState = TvInputManagerService.getTvInputState(sessionState, + userState); logTuneStateChanged(FrameworkStatsLog.TIF_TUNE_STATE_CHANGED__STATE__RELEASED, - sessionState); + sessionState, tvInputState); } } finally { Binder.restoreCallingIdentity(identity); @@ -1398,9 +1416,11 @@ public final class TvInputManagerService extends SystemService { userId, "setSurface"); final long identity = Binder.clearCallingIdentity(); SessionState sessionState = null; + UserState userState = null; try { synchronized (mLock) { try { + userState = getUserStateLocked(userId); sessionState = getSessionStateLocked(sessionToken, callingUid, resolvedUserId); if (sessionState.hardwareSessionToken == null) { @@ -1423,7 +1443,8 @@ public final class TvInputManagerService extends SystemService { ? FrameworkStatsLog.TIF_TUNE_STATE_CHANGED__STATE__SURFACE_ATTACHED : FrameworkStatsLog.TIF_TUNE_STATE_CHANGED__STATE__SURFACE_DETACHED; - logTuneStateChanged(state, sessionState); + logTuneStateChanged(state, sessionState, + TvInputManagerService.getTvInputState(sessionState, userState)); } Binder.restoreCallingIdentity(identity); } @@ -1514,7 +1535,8 @@ public final class TvInputManagerService extends SystemService { logTuneStateChanged( FrameworkStatsLog.TIF_TUNE_STATE_CHANGED__STATE__TUNE_STARTED, - sessionState); + sessionState, + TvInputManagerService.getTvInputState(sessionState, userState)); // Log the start of watch. SomeArgs args = SomeArgs.obtain(); args.arg1 = sessionState.componentName.getPackageName(); @@ -2338,6 +2360,16 @@ public final class TvInputManagerService extends SystemService { } } + @Nullable + private static TvInputState getTvInputState( + SessionState sessionState, + @Nullable UserState userState) { + if (userState != null) { + return userState.inputMap.get(sessionState.inputId); + } + return null; + } + @GuardedBy("mLock") private List<TunedInfo> getCurrentTunedInfosInternalLocked( UserState userState, int callingPid, int callingUid) { @@ -2416,12 +2448,13 @@ public final class TvInputManagerService extends SystemService { * <li>{@link SessionState#sessionId} * </ul> */ - private void logTuneStateChanged(int state, SessionState sessionState) { - // TODO(b/165372105): log the tis uid. + private void logTuneStateChanged(int state, SessionState sessionState, + @Nullable TvInputState inputState) { // TODO(b/173536904): log input type and id FrameworkStatsLog.write(FrameworkStatsLog.TIF_TUNE_CHANGED, - new int[]{sessionState.callingUid}, - new String[]{"tif_player"}, state, sessionState.sessionId); + new int[]{sessionState.callingUid, + inputState == null ? Process.INVALID_UID : inputState.uid}, + new String[]{"tif_player", "tv_input_service"}, state, sessionState.sessionId); } private static final class UserState { @@ -2521,10 +2554,25 @@ public final class TvInputManagerService extends SystemService { } private static final class TvInputState { - // A TvInputInfo object which represents the TV input. + + /** A TvInputInfo object which represents the TV input. */ private TvInputInfo info; - // The state of TV input. Connected by default. + /** + * The kernel user-ID that has been assigned to the application the TvInput is a part of. + * + * <p> + * Currently this is not a unique ID (multiple applications can have + * the same uid). + */ + private int uid; + + /** + * The state of TV input. + * + * <p> + * Connected by default + */ private int state = INPUT_STATE_CONNECTED; @Override @@ -2619,7 +2667,7 @@ public final class TvInputManagerService extends SystemService { Slog.d(TAG, "onServiceConnected(component=" + component + ")"); } synchronized (mLock) { - UserState userState = mUserStates.get(mUserId); + UserState userState = getUserStateLocked(mUserId); if (userState == null) { // The user was removed while connecting. mContext.unbindService(this); @@ -2889,11 +2937,13 @@ public final class TvInputManagerService extends SystemService { if (mSessionState.session == null || mSessionState.client == null) { return; } + TvInputState tvInputState = getTvInputState(mSessionState, + getUserStateLocked(mCurrentUserId)); try { mSessionState.client.onVideoAvailable(mSessionState.seq); logTuneStateChanged( FrameworkStatsLog.TIF_TUNE_STATE_CHANGED__STATE__VIDEO_AVAILABLE, - mSessionState); + mSessionState, tvInputState); } catch (RemoteException e) { Slog.e(TAG, "error in onVideoAvailable", e); } @@ -2909,6 +2959,8 @@ public final class TvInputManagerService extends SystemService { if (mSessionState.session == null || mSessionState.client == null) { return; } + TvInputState tvInputState = getTvInputState(mSessionState, + getUserStateLocked(mCurrentUserId)); try { mSessionState.client.onVideoUnavailable(reason, mSessionState.seq); int loggedReason = reason + FrameworkStatsLog @@ -2920,7 +2972,7 @@ public final class TvInputManagerService extends SystemService { loggedReason = FrameworkStatsLog .TIF_TUNE_STATE_CHANGED__STATE__VIDEO_UNAVAILABLE_REASON_UNKNOWN; } - logTuneStateChanged(loggedReason, mSessionState); + logTuneStateChanged(loggedReason, mSessionState, tvInputState); } catch (RemoteException e) { Slog.e(TAG, "error in onVideoUnavailable", e); } @@ -3106,6 +3158,10 @@ public final class TvInputManagerService extends SystemService { } } + private UserState getUserStateLocked(int userId) { + return mUserStates.get(userId); + } + private static final class WatchLogHandler extends Handler { // There are only two kinds of watch events that can happen on the system: // 1. The current TV input session is tuned to a new channel. |