Use DeviceConfig in MediaMetricsManagerService

Bug: 186764459
Test: atest MediaMetricsAtomTests
Change-Id: I1a4b0ce802973c5d96a6662f4315db10f08fee96
This commit is contained in:
shubang
2021-05-24 14:26:04 -07:00
committed by Shubang Lu
parent 55b9b53e34
commit d21b78c125

View File

@@ -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;
}
}
}