diff options
| -rw-r--r-- | services/core/java/com/android/server/media/metrics/MediaMetricsManagerService.java | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/media/metrics/MediaMetricsManagerService.java b/services/core/java/com/android/server/media/metrics/MediaMetricsManagerService.java index 1e0142c496b0..17716f897a59 100644 --- a/services/core/java/com/android/server/media/metrics/MediaMetricsManagerService.java +++ b/services/core/java/com/android/server/media/metrics/MediaMetricsManagerService.java @@ -17,6 +17,7 @@ package com.android.server.media.metrics; import android.content.Context; +import android.content.pm.PackageManager; import android.media.metrics.IMediaMetricsManager; import android.media.metrics.NetworkEvent; import android.media.metrics.PlaybackErrorEvent; @@ -24,19 +25,29 @@ import android.media.metrics.PlaybackMetrics; import android.media.metrics.PlaybackStateEvent; import android.media.metrics.TrackChangeEvent; import android.os.Binder; +import android.provider.DeviceConfig; import android.util.Base64; +import android.util.Slog; import android.util.StatsEvent; import android.util.StatsLog; import com.android.server.SystemService; import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.List; /** * System service manages media metrics. */ public final class MediaMetricsManagerService extends SystemService { + private static final String TAG = "MediaMetricsManagerService"; + // TODO: update these constants when finalized + private static final String MEDIA_METRICS_MODE = "media_metrics_mode"; + private static final int MEDIA_METRICS_MODE_OFF = 0; + private static final int MEDIA_METRICS_MODE_ON = 1; private final SecureRandom mSecureRandom; + private List<String> mBlockList = new ArrayList<>(); /** * Initializes the playback metrics manager service. @@ -56,6 +67,9 @@ public final class MediaMetricsManagerService extends SystemService { private final class BinderService extends IMediaMetricsManager.Stub { @Override public void reportPlaybackMetrics(String sessionId, PlaybackMetrics metrics, int userId) { + if (!shouldWriteStats()) { + return; + } StatsEvent statsEvent = StatsEvent.newBuilder() .setAtomId(320) .writeInt(Binder.getCallingUid()) @@ -85,6 +99,9 @@ public final class MediaMetricsManagerService extends SystemService { @Override public void reportPlaybackStateEvent( String sessionId, PlaybackStateEvent event, int userId) { + if (!shouldWriteStats()) { + return; + } StatsEvent statsEvent = StatsEvent.newBuilder() .setAtomId(322) .writeString(sessionId) @@ -115,6 +132,9 @@ public final class MediaMetricsManagerService extends SystemService { @Override public void reportPlaybackErrorEvent( String sessionId, PlaybackErrorEvent event, int userId) { + if (!shouldWriteStats()) { + return; + } StatsEvent statsEvent = StatsEvent.newBuilder() .setAtomId(323) .writeString(sessionId) @@ -129,6 +149,9 @@ public final class MediaMetricsManagerService extends SystemService { public void reportNetworkEvent( String sessionId, NetworkEvent event, int userId) { + if (!shouldWriteStats()) { + return; + } StatsEvent statsEvent = StatsEvent.newBuilder() .setAtomId(321) .writeString(sessionId) @@ -142,6 +165,9 @@ public final class MediaMetricsManagerService extends SystemService { @Override public void reportTrackChangeEvent( String sessionId, TrackChangeEvent event, int userId) { + if (!shouldWriteStats()) { + return; + } StatsEvent statsEvent = StatsEvent.newBuilder() .setAtomId(324) .writeString(sessionId) @@ -164,5 +190,33 @@ public final class MediaMetricsManagerService extends SystemService { .build(); StatsLog.write(statsEvent); } + + private boolean shouldWriteStats() { + int uid = Binder.getCallingUid(); + + final long identity = Binder.clearCallingIdentity(); + int mode = DeviceConfig.getInt( + DeviceConfig.NAMESPACE_MEDIA, MEDIA_METRICS_MODE, MEDIA_METRICS_MODE_OFF); + Binder.restoreCallingIdentity(identity); + + if (mode != MEDIA_METRICS_MODE_ON) { + return false; + } + if (mBlockList.isEmpty()) { + return true; + } + + PackageManager pm = getContext().getPackageManager(); + String[] packages = pm.getPackagesForUid(uid); + if (packages == null) { + // The valid application UID range is from android.os.Process.FIRST_APPLICATION_UID + // to android.os.Process.LAST_APPLICATION_UID. + // UIDs outside this range will not have a package and will therefore be false. + Slog.d(TAG, "null package from uid " + uid); + return false; + } + // TODO: check calling package with allowlist/blocklist. + return true; + } } } |