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

Commit 098aa5cf authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 11494200 from 8f727bc4 to 24Q2-release

Change-Id: Ifae3e141b516e743afe5d436f4dabfbcff971c73
parents cc387c09 8f727bc4
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -893,8 +893,9 @@ public class DeviceIdleController extends SystemService
            }
            // Fall through when quick doze is not requested.

            if (!mIsOffBody) {
                // Quick doze was not requested and device is on body so turn the device active.
            if (!mIsOffBody && !mForceIdle) {
                // Quick doze wasn't requested, doze wasn't forced and device is on body
                // so turn the device active.
                mActiveReason = ACTIVE_REASON_ONBODY;
                becomeActiveLocked("on_body", Process.myUid());
            }
+183 −55
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ import android.util.SparseArray;
import android.util.SparseArrayMap;
import android.util.SparseIntArray;
import android.util.SparseLongArray;
import android.util.SparseSetArray;
import android.util.TimeUtils;

import com.android.internal.annotations.GuardedBy;
@@ -158,19 +159,6 @@ public final class FlexibilityController extends StateController {
    @GuardedBy("mLock")
    private final SparseLongArray mLastSeenConstraintTimesElapsed = new SparseLongArray();

    private DeviceIdleInternal mDeviceIdleInternal;
    private final ArraySet<String> mPowerAllowlistedApps = new ArraySet<>();

    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            switch (intent.getAction()) {
                case PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED:
                    mHandler.post(FlexibilityController.this::updatePowerAllowlistCache);
                    break;
            }
        }
    };
    @VisibleForTesting
    @GuardedBy("mLock")
    final FlexibilityTracker mFlexibilityTracker;
@@ -182,6 +170,7 @@ public final class FlexibilityController extends StateController {
    private final FcHandler mHandler;
    @VisibleForTesting
    final PrefetchController mPrefetchController;
    private final SpecialAppTracker mSpecialAppTracker;

    /**
     * Stores the beginning of prefetch jobs lifecycle per app as a maximum of
@@ -355,16 +344,16 @@ public final class FlexibilityController extends StateController {
        mPercentsToDropConstraints =
                FcConfig.DEFAULT_PERCENTS_TO_DROP_FLEXIBLE_CONSTRAINTS;
        mPrefetchController = prefetchController;
        mSpecialAppTracker = new SpecialAppTracker();

        if (mFlexibilityEnabled) {
            registerBroadcastReceiver();
            mSpecialAppTracker.startTracking();
        }
    }

    @Override
    public void onSystemServicesReady() {
        mDeviceIdleInternal = LocalServices.getService(DeviceIdleInternal.class);
        mHandler.post(FlexibilityController.this::updatePowerAllowlistCache);
        mSpecialAppTracker.onSystemServicesReady();
    }

    @Override
@@ -453,6 +442,7 @@ public final class FlexibilityController extends StateController {
        final int userId = UserHandle.getUserId(uid);
        mPrefetchLifeCycleStart.delete(userId, packageName);
        mJobScoreTrackers.delete(uid, packageName);
        mSpecialAppTracker.onAppRemoved(userId, packageName);
        for (int i = mJobsToCheck.size() - 1; i >= 0; --i) {
            final JobStatus js = mJobsToCheck.valueAt(i);
            if ((js.getSourceUid() == uid && js.getSourcePackageName().equals(packageName))
@@ -466,6 +456,7 @@ public final class FlexibilityController extends StateController {
    @GuardedBy("mLock")
    public void onUserRemovedLocked(int userId) {
        mPrefetchLifeCycleStart.delete(userId);
        mSpecialAppTracker.onUserRemoved(userId);
        for (int u = mJobScoreTrackers.numMaps() - 1; u >= 0; --u) {
            final int uid = mJobScoreTrackers.keyAt(u);
            if (UserHandle.getUserId(uid) == userId) {
@@ -496,9 +487,10 @@ public final class FlexibilityController extends StateController {
                // Only exclude DEFAULT+ priority jobs for BFGS+ apps
                || (mService.getUidBias(js.getSourceUid()) >= JobInfo.BIAS_BOUND_FOREGROUND_SERVICE
                        && js.getEffectivePriority() >= PRIORITY_DEFAULT)
                // For apps in the power allowlist, automatically exclude DEFAULT+ priority jobs.
                // For special/privileged apps, automatically exclude DEFAULT+ priority jobs.
                || (js.getEffectivePriority() >= PRIORITY_DEFAULT
                        && mPowerAllowlistedApps.contains(js.getSourcePackageName()))
                        && mSpecialAppTracker.isSpecialApp(
                                js.getSourceUserId(), js.getSourcePackageName()))
                || hasEnoughSatisfiedConstraintsLocked(js)
                || mService.isCurrentlyRunningLocked(js);
    }
@@ -827,39 +819,6 @@ public final class FlexibilityController extends StateController {
        mFcConfig.processConstantLocked(properties, key);
    }

    private void registerBroadcastReceiver() {
        IntentFilter filter = new IntentFilter(PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED);
        mContext.registerReceiver(mBroadcastReceiver, filter);
    }

    private void unregisterBroadcastReceiver() {
        mContext.unregisterReceiver(mBroadcastReceiver);
    }

    private void updatePowerAllowlistCache() {
        if (mDeviceIdleInternal == null) {
            return;
        }

        // Don't call out to DeviceIdleController with the lock held.
        final String[] allowlistedPkgs = mDeviceIdleInternal.getFullPowerWhitelistExceptIdle();
        final ArraySet<String> changedPkgs = new ArraySet<>();
        synchronized (mLock) {
            changedPkgs.addAll(mPowerAllowlistedApps);
            mPowerAllowlistedApps.clear();
            for (final String pkgName : allowlistedPkgs) {
                mPowerAllowlistedApps.add(pkgName);
                if (changedPkgs.contains(pkgName)) {
                    changedPkgs.remove(pkgName);
                } else {
                    changedPkgs.add(pkgName);
                }
            }
            mPackagesToCheck.addAll(changedPkgs);
            mHandler.sendEmptyMessage(MSG_CHECK_PACKAGES);
        }
    }

    @VisibleForTesting
    class FlexibilityTracker {
        final ArrayList<ArraySet<JobStatus>> mTrackedJobs;
@@ -1343,12 +1302,12 @@ public final class FlexibilityController extends StateController {
                            mFlexibilityEnabled = true;
                            mPrefetchController
                                    .registerPrefetchChangedListener(mPrefetchChangedListener);
                            registerBroadcastReceiver();
                            mSpecialAppTracker.startTracking();
                        } else {
                            mFlexibilityEnabled = false;
                            mPrefetchController
                                    .unRegisterPrefetchChangedListener(mPrefetchChangedListener);
                            unregisterBroadcastReceiver();
                            mSpecialAppTracker.stopTracking();
                        }
                    }
                    break;
@@ -1653,6 +1612,176 @@ public final class FlexibilityController extends StateController {
        return mFcConfig;
    }

    private class SpecialAppTracker {
        /**
         * Lock for objects inside this class. This should never be held when attempting to acquire
         * {@link #mLock}. It is fine to acquire this if already holding {@link #mLock}.
         */
        private final Object mSatLock = new Object();

        private DeviceIdleInternal mDeviceIdleInternal;

        /** Set of all apps that have been deemed special, keyed by user ID. */
        private final SparseSetArray<String> mSpecialApps = new SparseSetArray<>();
        @GuardedBy("mSatLock")
        private final ArraySet<String> mPowerAllowlistedApps = new ArraySet<>();

        private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                switch (intent.getAction()) {
                    case PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED:
                        mHandler.post(SpecialAppTracker.this::updatePowerAllowlistCache);
                        break;
                }
            }
        };

        public boolean isSpecialApp(final int userId, @NonNull String packageName) {
            synchronized (mSatLock) {
                if (mSpecialApps.contains(UserHandle.USER_ALL, packageName)) {
                    return true;
                }
                if (mSpecialApps.contains(userId, packageName)) {
                    return true;
                }
            }
            return false;
        }

        private boolean isSpecialAppInternal(final int userId, @NonNull String packageName) {
            synchronized (mSatLock) {
                if (mPowerAllowlistedApps.contains(packageName)) {
                    return true;
                }
            }
            return false;
        }

        private void onAppRemoved(final int userId, String packageName) {
            synchronized (mSatLock) {
                // Don't touch the USER_ALL set here. If the app is completely removed from the
                // device, any list that affects USER_ALL should update and this would eventually
                // be updated with those lists no longer containing the app.
                mSpecialApps.remove(userId, packageName);
            }
        }

        private void onSystemServicesReady() {
            mDeviceIdleInternal = LocalServices.getService(DeviceIdleInternal.class);

            synchronized (mLock) {
                if (mFlexibilityEnabled) {
                    mHandler.post(SpecialAppTracker.this::updatePowerAllowlistCache);
                }
            }
        }

        private void onUserRemoved(final int userId) {
            synchronized (mSatLock) {
                mSpecialApps.remove(userId);
            }
        }

        private void startTracking() {
            IntentFilter filter = new IntentFilter(
                    PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED);
            mContext.registerReceiver(mBroadcastReceiver, filter);

            updatePowerAllowlistCache();
        }

        private void stopTracking() {
            mContext.unregisterReceiver(mBroadcastReceiver);

            synchronized (mSatLock) {
                mPowerAllowlistedApps.clear();
                mSpecialApps.clear();
            }
        }

        /**
         * Update the processed special app set for the specified user ID, only looking at the
         * specified set of apps. This method must <b>NEVER</b> be called while holding
         * {@link #mSatLock}.
         */
        private void updateSpecialAppSetUnlocked(final int userId, @NonNull ArraySet<String> pkgs) {
            // This method may need to acquire mLock, so ensure that mSatLock isn't held to avoid
            // lock inversion.
            if (Thread.holdsLock(mSatLock)) {
                throw new IllegalStateException("Must never hold local mSatLock");
            }
            if (pkgs.size() == 0) {
                return;
            }
            final ArraySet<String> changedPkgs = new ArraySet<>();

            synchronized (mSatLock) {
                for (int i = pkgs.size() - 1; i >= 0; --i) {
                    final String pkgName = pkgs.valueAt(i);
                    if (isSpecialAppInternal(userId, pkgName)) {
                        if (mSpecialApps.add(userId, pkgName)) {
                            changedPkgs.add(pkgName);
                        }
                    } else if (mSpecialApps.remove(userId, pkgName)) {
                        changedPkgs.add(pkgName);
                    }
                }
            }

            if (changedPkgs.size() > 0) {
                synchronized (mLock) {
                    mPackagesToCheck.addAll(changedPkgs);
                    mHandler.sendEmptyMessage(MSG_CHECK_PACKAGES);
                }
            }
        }

        private void updatePowerAllowlistCache() {
            if (mDeviceIdleInternal == null) {
                return;
            }

            // Don't call out to DeviceIdleController with the lock held.
            final String[] allowlistedPkgs = mDeviceIdleInternal.getFullPowerWhitelistExceptIdle();
            final ArraySet<String> changedPkgs = new ArraySet<>();
            synchronized (mSatLock) {
                changedPkgs.addAll(mPowerAllowlistedApps);
                mPowerAllowlistedApps.clear();
                for (String pkgName : allowlistedPkgs) {
                    mPowerAllowlistedApps.add(pkgName);
                    if (!changedPkgs.remove(pkgName)) {
                        // The package wasn't in the previous set of allowlisted apps. Add it
                        // since its state has changed.
                        changedPkgs.add(pkgName);
                    }
                }
            }

            // The full allowlist is currently user-agnostic, so use USER_ALL for these packages.
            updateSpecialAppSetUnlocked(UserHandle.USER_ALL, changedPkgs);
        }

        public void dump(@NonNull IndentingPrintWriter pw) {
            pw.println("Special apps:");
            pw.increaseIndent();

            synchronized (mSatLock) {
                for (int u = 0; u < mSpecialApps.size(); ++u) {
                    pw.print(mSpecialApps.keyAt(u));
                    pw.print(": ");
                    pw.println(mSpecialApps.valuesAt(u));
                }

                pw.println();
                pw.print("Power allowlisted packages: ");
                pw.println(mPowerAllowlistedApps);
            }

            pw.decreaseIndent();
        }
    }

    @Override
    @GuardedBy("mLock")
    public void dumpConstants(IndentingPrintWriter pw) {
@@ -1690,8 +1819,7 @@ public final class FlexibilityController extends StateController {
        pw.decreaseIndent();

        pw.println();
        pw.print("Power allowlisted packages: ");
        pw.println(mPowerAllowlistedApps);
        mSpecialAppTracker.dump(pw);

        pw.println();
        mFlexibilityTracker.dump(pw, predicate, nowElapsed);
+67 −0
Original line number Diff line number Diff line
@@ -10733,6 +10733,7 @@ package android.content {
    field public static final String DROPBOX_SERVICE = "dropbox";
    field public static final String EUICC_SERVICE = "euicc";
    field public static final String FILE_INTEGRITY_SERVICE = "file_integrity";
    field public static final String FINGERPRINT_SERVICE = "fingerprint";
    field public static final String GAME_SERVICE = "game";
    field public static final String GRAMMATICAL_INFLECTION_SERVICE = "grammatical_inflection";
    field public static final String HARDWARE_PROPERTIES_SERVICE = "hardware_properties";
@@ -18053,6 +18054,24 @@ package android.graphics.pdf {
    method public android.graphics.pdf.PdfDocument.PageInfo.Builder setContentRect(android.graphics.Rect);
  }
  public final class PdfRenderer implements java.lang.AutoCloseable {
    ctor public PdfRenderer(@NonNull android.os.ParcelFileDescriptor) throws java.io.IOException;
    method public void close();
    method public int getPageCount();
    method public android.graphics.pdf.PdfRenderer.Page openPage(int);
    method public boolean shouldScaleForPrinting();
  }
  public final class PdfRenderer.Page implements java.lang.AutoCloseable {
    method public void close();
    method public int getHeight();
    method public int getIndex();
    method public int getWidth();
    method public void render(@NonNull android.graphics.Bitmap, @Nullable android.graphics.Rect, @Nullable android.graphics.Matrix, int);
    field public static final int RENDER_MODE_FOR_DISPLAY = 1; // 0x1
    field public static final int RENDER_MODE_FOR_PRINT = 2; // 0x2
  }
}
package android.graphics.text {
@@ -20363,6 +20382,54 @@ package android.hardware.display {
}
package android.hardware.fingerprint {
  @Deprecated public class FingerprintManager {
    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.USE_BIOMETRIC, android.Manifest.permission.USE_FINGERPRINT}) public void authenticate(@Nullable android.hardware.fingerprint.FingerprintManager.CryptoObject, @Nullable android.os.CancellationSignal, int, @NonNull android.hardware.fingerprint.FingerprintManager.AuthenticationCallback, @Nullable android.os.Handler);
    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
    field public static final int FINGERPRINT_ACQUIRED_GOOD = 0; // 0x0
    field public static final int FINGERPRINT_ACQUIRED_IMAGER_DIRTY = 3; // 0x3
    field public static final int FINGERPRINT_ACQUIRED_INSUFFICIENT = 2; // 0x2
    field public static final int FINGERPRINT_ACQUIRED_PARTIAL = 1; // 0x1
    field public static final int FINGERPRINT_ACQUIRED_TOO_FAST = 5; // 0x5
    field public static final int FINGERPRINT_ACQUIRED_TOO_SLOW = 4; // 0x4
    field public static final int FINGERPRINT_ERROR_CANCELED = 5; // 0x5
    field public static final int FINGERPRINT_ERROR_HW_NOT_PRESENT = 12; // 0xc
    field public static final int FINGERPRINT_ERROR_HW_UNAVAILABLE = 1; // 0x1
    field public static final int FINGERPRINT_ERROR_LOCKOUT = 7; // 0x7
    field public static final int FINGERPRINT_ERROR_LOCKOUT_PERMANENT = 9; // 0x9
    field public static final int FINGERPRINT_ERROR_NO_FINGERPRINTS = 11; // 0xb
    field public static final int FINGERPRINT_ERROR_NO_SPACE = 4; // 0x4
    field public static final int FINGERPRINT_ERROR_TIMEOUT = 3; // 0x3
    field public static final int FINGERPRINT_ERROR_UNABLE_TO_PROCESS = 2; // 0x2
    field public static final int FINGERPRINT_ERROR_USER_CANCELED = 10; // 0xa
    field public static final int FINGERPRINT_ERROR_VENDOR = 8; // 0x8
  }
  @Deprecated public abstract static class FingerprintManager.AuthenticationCallback {
    ctor @Deprecated public FingerprintManager.AuthenticationCallback();
    method @Deprecated public void onAuthenticationError(int, CharSequence);
    method @Deprecated public void onAuthenticationFailed();
    method @Deprecated public void onAuthenticationHelp(int, CharSequence);
    method @Deprecated public void onAuthenticationSucceeded(android.hardware.fingerprint.FingerprintManager.AuthenticationResult);
  }
  @Deprecated public static class FingerprintManager.AuthenticationResult {
    method @Deprecated public android.hardware.fingerprint.FingerprintManager.CryptoObject getCryptoObject();
  }
  @Deprecated public static final class FingerprintManager.CryptoObject {
    ctor @Deprecated public FingerprintManager.CryptoObject(@NonNull java.security.Signature);
    ctor @Deprecated public FingerprintManager.CryptoObject(@NonNull javax.crypto.Cipher);
    ctor @Deprecated public FingerprintManager.CryptoObject(@NonNull javax.crypto.Mac);
    method @Deprecated public javax.crypto.Cipher getCipher();
    method @Deprecated public javax.crypto.Mac getMac();
    method @Deprecated public java.security.Signature getSignature();
  }
}
package android.hardware.input {
  public final class HostUsiVersion implements android.os.Parcelable {
+0 −49
Original line number Diff line number Diff line
@@ -35,7 +35,6 @@ package android.content {
    method @Deprecated @Nullable public String getFeatureId();
    method public abstract android.content.SharedPreferences getSharedPreferences(java.io.File, int);
    method public abstract java.io.File getSharedPreferencesPath(String);
    field public static final String FINGERPRINT_SERVICE = "fingerprint";
  }

  public class ContextWrapper extends android.content.Context {
@@ -146,54 +145,6 @@ package android.hardware {

}

package android.hardware.fingerprint {

  @Deprecated public class FingerprintManager {
    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.USE_BIOMETRIC, android.Manifest.permission.USE_FINGERPRINT}) public void authenticate(@Nullable android.hardware.fingerprint.FingerprintManager.CryptoObject, @Nullable android.os.CancellationSignal, int, @NonNull android.hardware.fingerprint.FingerprintManager.AuthenticationCallback, @Nullable android.os.Handler);
    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
    field public static final int FINGERPRINT_ACQUIRED_GOOD = 0; // 0x0
    field public static final int FINGERPRINT_ACQUIRED_IMAGER_DIRTY = 3; // 0x3
    field public static final int FINGERPRINT_ACQUIRED_INSUFFICIENT = 2; // 0x2
    field public static final int FINGERPRINT_ACQUIRED_PARTIAL = 1; // 0x1
    field public static final int FINGERPRINT_ACQUIRED_TOO_FAST = 5; // 0x5
    field public static final int FINGERPRINT_ACQUIRED_TOO_SLOW = 4; // 0x4
    field public static final int FINGERPRINT_ERROR_CANCELED = 5; // 0x5
    field public static final int FINGERPRINT_ERROR_HW_NOT_PRESENT = 12; // 0xc
    field public static final int FINGERPRINT_ERROR_HW_UNAVAILABLE = 1; // 0x1
    field public static final int FINGERPRINT_ERROR_LOCKOUT = 7; // 0x7
    field public static final int FINGERPRINT_ERROR_LOCKOUT_PERMANENT = 9; // 0x9
    field public static final int FINGERPRINT_ERROR_NO_FINGERPRINTS = 11; // 0xb
    field public static final int FINGERPRINT_ERROR_NO_SPACE = 4; // 0x4
    field public static final int FINGERPRINT_ERROR_TIMEOUT = 3; // 0x3
    field public static final int FINGERPRINT_ERROR_UNABLE_TO_PROCESS = 2; // 0x2
    field public static final int FINGERPRINT_ERROR_USER_CANCELED = 10; // 0xa
    field public static final int FINGERPRINT_ERROR_VENDOR = 8; // 0x8
  }

  @Deprecated public abstract static class FingerprintManager.AuthenticationCallback {
    ctor public FingerprintManager.AuthenticationCallback();
    method public void onAuthenticationError(int, CharSequence);
    method public void onAuthenticationFailed();
    method public void onAuthenticationHelp(int, CharSequence);
    method public void onAuthenticationSucceeded(android.hardware.fingerprint.FingerprintManager.AuthenticationResult);
  }

  @Deprecated public static class FingerprintManager.AuthenticationResult {
    method public android.hardware.fingerprint.FingerprintManager.CryptoObject getCryptoObject();
  }

  @Deprecated public static final class FingerprintManager.CryptoObject {
    ctor public FingerprintManager.CryptoObject(@NonNull java.security.Signature);
    ctor public FingerprintManager.CryptoObject(@NonNull javax.crypto.Cipher);
    ctor public FingerprintManager.CryptoObject(@NonNull javax.crypto.Mac);
    method public javax.crypto.Cipher getCipher();
    method public javax.crypto.Mac getMac();
    method public java.security.Signature getSignature();
  }

}

package android.media {

  public final class AudioFormat implements android.os.Parcelable {
+2 −4
Original line number Diff line number Diff line
@@ -1146,7 +1146,6 @@ package android.app {
  public static final class StatusBarManager.DisableInfo implements android.os.Parcelable {
    method public boolean areAllComponentsEnabled();
    method public int describeContents();
    method public boolean isBackDisabled();
    method public boolean isNavigateToHomeDisabled();
    method public boolean isNotificationPeekingDisabled();
    method public boolean isRecentsDisabled();
@@ -10422,8 +10421,7 @@ package android.nfc.cardemulation {
  @FlaggedApi("android.nfc.enable_nfc_mainline") public final class ApduServiceInfo implements android.os.Parcelable {
    ctor @FlaggedApi("android.nfc.enable_nfc_mainline") public ApduServiceInfo(@NonNull android.content.pm.PackageManager, @NonNull android.content.pm.ResolveInfo, boolean) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method @FlaggedApi("android.nfc.nfc_read_polling_loop") public void addPollingLoopFilter(@NonNull String);
    method @FlaggedApi("android.nfc.nfc_read_polling_loop") public void addPollingLoopFilterToAutoTransact(@NonNull String);
    method @FlaggedApi("android.nfc.nfc_read_polling_loop") public void addPollingLoopFilter(@NonNull String, boolean);
    method @FlaggedApi("android.nfc.nfc_observe_mode") public boolean defaultToObserveMode();
    method @FlaggedApi("android.nfc.enable_nfc_mainline") public int describeContents();
    method @FlaggedApi("android.nfc.enable_nfc_mainline") public void dump(@NonNull android.os.ParcelFileDescriptor, @NonNull java.io.PrintWriter, @NonNull String[]);
@@ -11531,7 +11529,7 @@ package android.permission {
  public final class PermissionManager {
    method public int checkDeviceIdentifierAccess(@Nullable String, @Nullable String, @Nullable String, int, int);
    method @FlaggedApi("android.permission.flags.device_aware_permission_apis_enabled") public static int checkPermission(@NonNull String, @NonNull String, @NonNull String, int);
    method @FlaggedApi("android.permission.flags.device_aware_permission_apis_enabled") public int checkPermission(@NonNull String, @NonNull String, @NonNull String);
    method @RequiresPermission(value=android.Manifest.permission.UPDATE_APP_OPS_STATS, conditional=true) public int checkPermissionForDataDelivery(@NonNull String, @NonNull android.content.AttributionSource, @Nullable String);
    method @RequiresPermission(value=android.Manifest.permission.UPDATE_APP_OPS_STATS, conditional=true) public int checkPermissionForDataDeliveryFromDataSource(@NonNull String, @NonNull android.content.AttributionSource, @Nullable String);
    method public int checkPermissionForPreflight(@NonNull String, @NonNull android.content.AttributionSource);
Loading