summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/stats/pull/StatsPullAtomService.java136
1 files changed, 124 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index fbfe9db0dca6..7cdae58e9a99 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -93,9 +93,12 @@ import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
import android.content.pm.UserInfo;
import android.hardware.biometrics.BiometricsProtoEnums;
+import android.hardware.display.DisplayManager;
import android.hardware.face.FaceManager;
import android.hardware.fingerprint.FingerprintManager;
import android.media.AudioManager;
+import android.media.MediaDrm;
+import android.media.UnsupportedSchemeException;
import android.net.ConnectivityManager;
import android.net.INetworkStatsService;
import android.net.INetworkStatsSession;
@@ -164,6 +167,7 @@ import android.util.Slog;
import android.util.SparseArray;
import android.util.StatsEvent;
import android.util.proto.ProtoOutputStream;
+import android.view.Display;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.procstats.IProcessStats;
@@ -4492,10 +4496,8 @@ public class StatsPullAtomService extends SystemService {
// get the surround sound metrics information
Map<Integer, Boolean> surroundEncodingsMap = audioManager.getSurroundFormats();
- byte[] surroundEncodings =
- getAudioEncodingsAsProto(new ArrayList(surroundEncodingsMap.keySet()));
- byte[] sinkSurroundEncodings =
- getAudioEncodingsAsProto(audioManager.getReportedSurroundFormats());
+ byte[] surroundEncodings = toBytes(new ArrayList(surroundEncodingsMap.keySet()));
+ byte[] sinkSurroundEncodings = toBytes(audioManager.getReportedSurroundFormats());
List<Integer> disabledSurroundEncodingsList = new ArrayList<>();
List<Integer> enabledSurroundEncodingsList = new ArrayList<>();
for (int surroundEncoding: surroundEncodingsMap.keySet()) {
@@ -4505,24 +4507,68 @@ public class StatsPullAtomService extends SystemService {
enabledSurroundEncodingsList.add(surroundEncoding);
}
}
- byte[] disabledSurroundEncodings = getAudioEncodingsAsProto(disabledSurroundEncodingsList);
- byte[] enabledSurroundEncodings = getAudioEncodingsAsProto(enabledSurroundEncodingsList);
+ byte[] disabledSurroundEncodings = toBytes(disabledSurroundEncodingsList);
+ byte[] enabledSurroundEncodings = toBytes(enabledSurroundEncodingsList);
int surroundOutputMode = audioManager.getEncodedSurroundMode();
- // TODO(b/203185126) : Remove the display capabilities metrics mock and retrieve actual
- // metrics
- byte[] mockByteArray = new byte[0];
+ DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
+ Display display = displayManager.getDisplay(Display.DEFAULT_DISPLAY);
+ // get the display capabilities metrics information
+ Display.HdrCapabilities hdrCapabilities = display.getHdrCapabilities();
+ byte[] sinkHdrFormats = new byte[]{};
+ if (hdrCapabilities != null) {
+ sinkHdrFormats = toBytes(hdrCapabilities.getSupportedHdrTypes());
+ }
+ byte[] sinkDisplayModes = toBytes(display.getSupportedModes());
+ int hdcpLevel = -1;
+ List<UUID> uuids = MediaDrm.getSupportedCryptoSchemes();
+ try {
+ if (!uuids.isEmpty()) {
+ MediaDrm mediaDrm = new MediaDrm(uuids.get(0));
+ hdcpLevel = mediaDrm.getConnectedHdcpLevel();
+ }
+ } catch (UnsupportedSchemeException exception) {
+ Slog.e(TAG, "pulling hdcp level failed.", exception);
+ hdcpLevel = -1;
+ }
+
+ // get the display settings metrics information
+ int matchContentFrameRateUserPreference =
+ displayManager.getMatchContentFrameRateUserPreference();
+ byte[] userDisabledHdrTypes = toBytes(displayManager.getUserDisabledHdrTypes());
+ Display.Mode userPreferredDisplayMode = displayManager.getUserPreferredDisplayMode();
+ int userPreferredWidth = userPreferredDisplayMode != null
+ ? userPreferredDisplayMode.getPhysicalWidth() : -1;
+ int userPreferredHeight = userPreferredDisplayMode != null
+ ? userPreferredDisplayMode.getPhysicalHeight() : -1;
+ float userPreferredRefreshRate = userPreferredDisplayMode != null
+ ? userPreferredDisplayMode.getRefreshRate() : 0.0f;
+ boolean hasUserDisabledAllm = false;
+ try {
+ hasUserDisabledAllm = Settings.Secure.getIntForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.MINIMAL_POST_PROCESSING_ALLOWED,
+ 1) == 0;
+ } catch (Settings.SettingNotFoundException exception) {
+ Slog.e(
+ TAG, "unable to find setting for MINIMAL_POST_PROCESSING_ALLOWED.",
+ exception);
+ hasUserDisabledAllm = false;
+ }
+
pulledData.add(
FrameworkStatsLog.buildStatsEvent(
atomTag, surroundEncodings, sinkSurroundEncodings,
disabledSurroundEncodings, enabledSurroundEncodings, surroundOutputMode,
- mockByteArray, mockByteArray, -1, -1, mockByteArray,
- -1, -1, 0.0f, false));
+ sinkHdrFormats, sinkDisplayModes, hdcpLevel,
+ matchContentFrameRateUserPreference, userDisabledHdrTypes,
+ userPreferredWidth, userPreferredHeight, userPreferredRefreshRate,
+ hasUserDisabledAllm));
return StatsManager.PULL_SUCCESS;
}
- private byte[] getAudioEncodingsAsProto(List<Integer> audioEncodings) {
+ private byte[] toBytes(List<Integer> audioEncodings) {
ProtoOutputStream protoOutputStream = new ProtoOutputStream();
for (int audioEncoding : audioEncodings) {
protoOutputStream.write(
@@ -4532,6 +4578,72 @@ public class StatsPullAtomService extends SystemService {
return protoOutputStream.getBytes();
}
+ private byte[] toBytes(int[] array) {
+ ProtoOutputStream protoOutputStream = new ProtoOutputStream();
+ for (int element : array) {
+ protoOutputStream.write(
+ ProtoOutputStream.FIELD_COUNT_REPEATED | ProtoOutputStream.FIELD_TYPE_ENUM | 1,
+ element);
+ }
+ return protoOutputStream.getBytes();
+ }
+
+ private byte[] toBytes(Display.Mode[] displayModes) {
+ Map<Integer, Integer> modeGroupIds = createModeGroups(displayModes);
+ ProtoOutputStream protoOutputStream = new ProtoOutputStream();
+ for (Display.Mode element : displayModes) {
+ ProtoOutputStream protoOutputStreamMode = new ProtoOutputStream();
+ protoOutputStreamMode.write(
+ ProtoOutputStream.FIELD_COUNT_SINGLE | ProtoOutputStream.FIELD_TYPE_INT32 | 1,
+ element.getPhysicalHeight());
+ protoOutputStreamMode.write(
+ ProtoOutputStream.FIELD_COUNT_SINGLE | ProtoOutputStream.FIELD_TYPE_INT32 | 2,
+ element.getPhysicalWidth());
+ protoOutputStreamMode.write(
+ ProtoOutputStream.FIELD_COUNT_SINGLE | ProtoOutputStream.FIELD_TYPE_FLOAT | 3,
+ element.getRefreshRate());
+ protoOutputStreamMode.write(
+ ProtoOutputStream.FIELD_COUNT_SINGLE | ProtoOutputStream.FIELD_TYPE_INT32 | 4,
+ modeGroupIds.get(element.getModeId()));
+ protoOutputStream.write(
+ ProtoOutputStream.FIELD_COUNT_REPEATED
+ | ProtoOutputStream.FIELD_TYPE_MESSAGE | 1,
+ protoOutputStreamMode.getBytes());
+ }
+ return protoOutputStream.getBytes();
+ }
+
+ // Returns map modeId -> groupId such that all modes with the same group have alternative
+ // refresh rates
+ private Map<Integer, Integer> createModeGroups(Display.Mode[] supportedModes) {
+ Map<Integer, Integer> modeGroupIds = new ArrayMap<>();
+ int groupId = 1;
+ for (Display.Mode mode : supportedModes) {
+ if (modeGroupIds.containsKey(mode.getModeId())) {
+ continue;
+ }
+ modeGroupIds.put(mode.getModeId(), groupId);
+ for (float refreshRate : mode.getAlternativeRefreshRates()) {
+ int alternativeModeId = findModeId(supportedModes, mode.getPhysicalWidth(),
+ mode.getPhysicalHeight(), refreshRate);
+ if (alternativeModeId != -1 && !modeGroupIds.containsKey(alternativeModeId)) {
+ modeGroupIds.put(alternativeModeId, groupId);
+ }
+ }
+ groupId++;
+ }
+ return modeGroupIds;
+ }
+
+ private int findModeId(Display.Mode[] modes, int width, int height, float refreshRate) {
+ for (Display.Mode mode : modes) {
+ if (mode.matches(width, height, refreshRate)) {
+ return mode.getModeId();
+ }
+ }
+ return -1;
+ }
+
/**
* Counts how many accessibility services (including features) there are in the colon-separated
* string list.