summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xservices/core/java/com/android/server/tv/TvInputManagerService.java88
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.