Use DeviceConfig in MediaMetricsManagerService
Bug: 186764459 Test: atest MediaMetricsAtomTests Change-Id: I1a4b0ce802973c5d96a6662f4315db10f08fee96
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user