Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8132fb62 authored by Marc Kassis's avatar Marc Kassis
Browse files

Emit HdrCapabilities metric.

Bug: 234816344
Test: statsd_testdrive 10175
Change-Id: I3a362aa03d5c777a8b013524bc6bbd537c172aed
parent f052b987
Loading
Loading
Loading
Loading
+48 −0
Original line number Diff line number Diff line
@@ -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<StatsEvent> 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<StatsEvent> pulledData) {
        List<PendingIntentStats> 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<StatsEvent> pulledData) {
        PinnerService pinnerService = LocalServices.getService(PinnerService.class);
        List<PinnedFileStats> pinnedFileStats = pinnerService.dumpDataForStatsd();