summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/media/metrics/MediaMetricsManagerService.java54
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;
+ }
}
}