From 8132fb62f7b9aa95711d2432a51df03c57647e62 Mon Sep 17 00:00:00 2001 From: Marc Kassis Date: Wed, 8 Feb 2023 15:52:43 +0100 Subject: [PATCH] Emit HdrCapabilities metric. Bug: 234816344 Test: statsd_testdrive 10175 Change-Id: I3a362aa03d5c777a8b013524bc6bbd537c172aed --- .../stats/pull/StatsPullAtomService.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) 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 b3e915a1355f4..601d0e20d489d 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -20,6 +20,8 @@ import static android.app.AppOpsManager.OP_FLAG_SELF; import static android.app.AppOpsManager.OP_FLAG_TRUSTED_PROXIED; import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED; import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS; +import static android.hardware.display.HdrConversionMode.HDR_CONVERSION_PASSTHROUGH; +import static android.hardware.graphics.common.Hdr.DOLBY_VISION; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET; import static android.net.NetworkCapabilities.TRANSPORT_WIFI; @@ -38,6 +40,7 @@ import static android.os.storage.VolumeInfo.TYPE_PUBLIC; import static android.provider.Settings.Global.NETSTATS_UID_BUCKET_DURATION; import static android.telephony.TelephonyManager.UNKNOWN_CARRIER_ID; import static android.util.MathUtils.constrain; +import static android.view.Display.HdrCapabilities.HDR_TYPE_INVALID; import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR; import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__A11Y_BUTTON; @@ -245,6 +248,7 @@ import java.util.concurrent.Executor; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; /** @@ -743,6 +747,8 @@ public class StatsPullAtomService extends SystemService { return pullSystemServerPinnerStats(atomTag, data); case FrameworkStatsLog.PENDING_INTENTS_PER_PACKAGE: return pullPendingIntentsPerPackage(atomTag, data); + case FrameworkStatsLog.HDR_CAPABILITIES: + return pullHdrCapabilities(atomTag, data); default: throw new UnsupportedOperationException("Unknown tagId=" + atomTag); } @@ -943,6 +949,7 @@ public class StatsPullAtomService extends SystemService { registerMediaCapabilitiesStats(); registerPendingIntentsPerPackagePuller(); registerPinnerServiceStats(); + registerHdrCapabilitiesPuller(); } private void initAndRegisterNetworkStatsPullers() { @@ -4720,6 +4727,37 @@ public class StatsPullAtomService extends SystemService { ); } + private int pullHdrCapabilities(int atomTag, List pulledData) { + DisplayManager displayManager = mContext.getSystemService(DisplayManager.class); + Display display = displayManager.getDisplay(Display.DEFAULT_DISPLAY); + + int hdrConversionMode = displayManager.getHdrConversionMode().getConversionMode(); + int preferredHdrType = displayManager.getHdrConversionMode().getPreferredHdrOutputType(); + boolean userDisabledHdrConversion = hdrConversionMode == HDR_CONVERSION_PASSTHROUGH; + int forceHdrFormat = preferredHdrType == HDR_TYPE_INVALID ? 0 : preferredHdrType; + boolean hasDolbyVisionIssue = hasDolbyVisionIssue(display); + + pulledData.add(FrameworkStatsLog.buildStatsEvent(atomTag, + new byte[0], userDisabledHdrConversion, forceHdrFormat, hasDolbyVisionIssue)); + + return StatsManager.PULL_SUCCESS; + } + + private boolean hasDolbyVisionIssue(Display display) { + AtomicInteger modesSupportingDolbyVision = new AtomicInteger(); + Arrays.stream(display.getSupportedModes()) + .map(Display.Mode::getSupportedHdrTypes) + .filter(types -> Arrays.stream(types).anyMatch(hdrType -> hdrType == DOLBY_VISION)) + .forEach(ignored -> modesSupportingDolbyVision.incrementAndGet()); + + if (modesSupportingDolbyVision.get() != 0 + && modesSupportingDolbyVision.get() < display.getSupportedModes().length) { + return true; + } + + return false; + } + private int pullPendingIntentsPerPackage(int atomTag, List pulledData) { List pendingIntentStats = LocalServices.getService(ActivityManagerInternal.class).getPendingIntentStats(); @@ -4740,6 +4778,16 @@ public class StatsPullAtomService extends SystemService { ); } + private void registerHdrCapabilitiesPuller() { + int tagId = FrameworkStatsLog.HDR_CAPABILITIES; + mStatsManager.setPullAtomCallback( + tagId, + null, // use default PullAtomMetadata values + DIRECT_EXECUTOR, + mStatsCallbackImpl + ); + } + int pullSystemServerPinnerStats(int atomTag, List pulledData) { PinnerService pinnerService = LocalServices.getService(PinnerService.class); List pinnedFileStats = pinnerService.dumpDataForStatsd();