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

Commit 07e6855f authored by Stanislav Zholnin's avatar Stanislav Zholnin
Browse files

Add API support for permission access timeline.

Test: in development
Bug: 176965672
Change-Id: Ib06452946fda2fcbd32ac6172ea4a43dabde7b67
parent 5d3166d4
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -423,6 +423,9 @@ package android.app {
    method @Nullable public static String opToPermission(@NonNull String);
    method @RequiresPermission("android.permission.MANAGE_APP_OPS_MODES") public void setMode(@NonNull String, int, @Nullable String, int);
    method @RequiresPermission("android.permission.MANAGE_APP_OPS_MODES") public void setUidMode(@NonNull String, int, int);
    field public static final int HISTORY_FLAGS_ALL = 3; // 0x3
    field public static final int HISTORY_FLAG_AGGREGATE = 1; // 0x1
    field public static final int HISTORY_FLAG_DISCRETE = 2; // 0x2
    field public static final String OPSTR_ACCEPT_HANDOVER = "android:accept_handover";
    field public static final String OPSTR_ACCESS_ACCESSIBILITY = "android:access_accessibility";
    field public static final String OPSTR_ACCESS_NOTIFICATIONS = "android:access_notifications";
@@ -536,9 +539,14 @@ package android.app {
    method public long getAccessDuration(int, int, int);
    method public long getBackgroundAccessCount(int);
    method public long getBackgroundAccessDuration(int);
    method @NonNull public java.util.List<android.app.AppOpsManager.AttributedOpEntry> getBackgroundDiscreteAccesses(int);
    method public long getBackgroundRejectCount(int);
    method @NonNull public android.app.AppOpsManager.AttributedOpEntry getDiscreteAccessAt(@IntRange(from=0) int);
    method @IntRange(from=0) public int getDiscreteAccessCount();
    method @NonNull public java.util.List<android.app.AppOpsManager.AttributedOpEntry> getDiscreteAccesses(int, int, int);
    method public long getForegroundAccessCount(int);
    method public long getForegroundAccessDuration(int);
    method @NonNull public java.util.List<android.app.AppOpsManager.AttributedOpEntry> getForegroundDiscreteAccesses(int);
    method public long getForegroundRejectCount(int);
    method @NonNull public String getOpName();
    method public long getRejectCount(int, int, int);
@@ -565,6 +573,7 @@ package android.app {
    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest build();
    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setAttributionTag(@Nullable String);
    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setFlags(int);
    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setHistoryFlags(int);
    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setOpNames(@Nullable java.util.List<java.lang.String>);
    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setPackageName(@Nullable String);
    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setUid(int);
+4 −0
Original line number Diff line number Diff line
@@ -224,6 +224,9 @@ package android.app {
    field public static final int HISTORICAL_MODE_DISABLED = 0; // 0x0
    field public static final int HISTORICAL_MODE_ENABLED_ACTIVE = 1; // 0x1
    field public static final int HISTORICAL_MODE_ENABLED_PASSIVE = 2; // 0x2
    field public static final int HISTORY_FLAGS_ALL = 3; // 0x3
    field public static final int HISTORY_FLAG_AGGREGATE = 1; // 0x1
    field public static final int HISTORY_FLAG_DISCRETE = 2; // 0x2
    field public static final String KEY_BG_STATE_SETTLE_TIME = "bg_state_settle_time";
    field public static final String KEY_FG_SERVICE_STATE_SETTLE_TIME = "fg_service_state_settle_time";
    field public static final String KEY_TOP_STATE_SETTLE_TIME = "top_state_settle_time";
@@ -238,6 +241,7 @@ package android.app {

  public static final class AppOpsManager.HistoricalOps implements android.os.Parcelable {
    ctor public AppOpsManager.HistoricalOps(long, long);
    method public void addDiscreteAccess(int, int, @NonNull String, @Nullable String, int, int, long, long);
    method public void increaseAccessCount(int, int, @NonNull String, @Nullable String, int, int, long);
    method public void increaseAccessDuration(int, int, @NonNull String, @Nullable String, int, int, long);
    method public void increaseRejectCount(int, int, @NonNull String, @Nullable String, int, int, long);
+366 −25

File changed.

Preview size limit exceeded, changes collapsed.

+3 −3
Original line number Diff line number Diff line
@@ -74,11 +74,11 @@ interface IAppOpsService {
    @UnsupportedAppUsage
    List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, in int[] ops);
    void getHistoricalOps(int uid, String packageName, String attributionTag, in List<String> ops,
            int filter, long beginTimeMillis, long endTimeMillis, int flags,
            int historyFlags, int filter, long beginTimeMillis, long endTimeMillis, int flags,
            in RemoteCallback callback);
    void getHistoricalOpsFromDiskRaw(int uid, String packageName, String attributionTag,
            in List<String> ops, int filter, long beginTimeMillis, long endTimeMillis, int flags,
            in RemoteCallback callback);
            in List<String> ops, int historyFlags, int filter, long beginTimeMillis,
            long endTimeMillis, int flags, in RemoteCallback callback);
    void offsetHistory(long duration);
    void setHistoryParameters(int mode, long baseSnapshotInterval, int compressionStep);
    void addHistoricalOps(in AppOpsManager.HistoricalOps ops);
+21 −9
Original line number Diff line number Diff line
@@ -843,11 +843,15 @@ public class AppOpsService extends IAppOpsService.Stub {
        public void accessed(int proxyUid, @Nullable String proxyPackageName,
                @Nullable String proxyAttributionTag, @AppOpsManager.UidState int uidState,
                @OpFlags int flags) {
            accessed(System.currentTimeMillis(), -1, proxyUid, proxyPackageName,
            long accessTime = System.currentTimeMillis();
            accessed(accessTime, -1, proxyUid, proxyPackageName,
                    proxyAttributionTag, uidState, flags);

            mHistoricalRegistry.incrementOpAccessedCount(parent.op, parent.uid, parent.packageName,
                    tag, uidState, flags);

            mHistoricalRegistry.mDiscreteRegistry.recordDiscreteAccess(parent.uid,
                    parent.packageName, parent.op, tag, flags, uidState, accessTime, -1);
        }

        /**
@@ -1004,8 +1008,10 @@ public class AppOpsService extends IAppOpsService.Stub {
                OpEventProxyInfo proxyCopy = event.getProxy() != null
                        ? new OpEventProxyInfo(event.getProxy()) : null;

                long accessDurationMillis =
                        SystemClock.elapsedRealtime() - event.getStartElapsedTime();
                NoteOpEvent finishedEvent = new NoteOpEvent(event.getStartTime(),
                        SystemClock.elapsedRealtime() - event.getStartElapsedTime(), proxyCopy);
                        accessDurationMillis, proxyCopy);
                mAccessEvents.put(makeKey(event.getUidState(), event.getFlags()),
                        finishedEvent);

@@ -1013,6 +1019,10 @@ public class AppOpsService extends IAppOpsService.Stub {
                        parent.packageName, tag, event.getUidState(),
                        event.getFlags(), finishedEvent.getDuration());

                mHistoricalRegistry.mDiscreteRegistry.recordDiscreteAccess(parent.uid,
                        parent.packageName, parent.op, tag, event.getFlags(), event.getUidState(),
                        event.getStartTime(), accessDurationMillis);

                mInProgressStartOpEventPool.release(event);

                if (mInProgressEvents.isEmpty()) {
@@ -2087,8 +2097,8 @@ public class AppOpsService extends IAppOpsService.Stub {

    @Override
    public void getHistoricalOps(int uid, String packageName, String attributionTag,
            List<String> opNames, int filter, long beginTimeMillis, long endTimeMillis,
            int flags, RemoteCallback callback) {
            List<String> opNames, int dataType, int filter, long beginTimeMillis,
            long endTimeMillis, int flags, RemoteCallback callback) {
        PackageManager pm = mContext.getPackageManager();

        ensureHistoricalOpRequestIsValid(uid, packageName, attributionTag, opNames, filter,
@@ -2120,14 +2130,14 @@ public class AppOpsService extends IAppOpsService.Stub {

        // Must not hold the appops lock
        mHandler.post(PooledLambda.obtainRunnable(HistoricalRegistry::getHistoricalOps,
                mHistoricalRegistry, uid, packageName, attributionTag, opNamesArray, filter,
                beginTimeMillis, endTimeMillis, flags, callback).recycleOnUse());
                mHistoricalRegistry, uid, packageName, attributionTag, opNamesArray, dataType,
                filter, beginTimeMillis, endTimeMillis, flags, callback).recycleOnUse());
    }

    @Override
    public void getHistoricalOpsFromDiskRaw(int uid, String packageName, String attributionTag,
            List<String> opNames, int filter, long beginTimeMillis, long endTimeMillis,
            int flags, RemoteCallback callback) {
            List<String> opNames, int dataType, int filter, long beginTimeMillis,
            long endTimeMillis, int flags, RemoteCallback callback) {
        ensureHistoricalOpRequestIsValid(uid, packageName, attributionTag, opNames, filter,
                beginTimeMillis, endTimeMillis, flags);
        Objects.requireNonNull(callback, "callback cannot be null");
@@ -2140,7 +2150,7 @@ public class AppOpsService extends IAppOpsService.Stub {

        // Must not hold the appops lock
        mHandler.post(PooledLambda.obtainRunnable(HistoricalRegistry::getHistoricalOpsFromDiskRaw,
                mHistoricalRegistry, uid, packageName, attributionTag, opNamesArray,
                mHistoricalRegistry, uid, packageName, attributionTag, opNamesArray, dataType,
                filter, beginTimeMillis, endTimeMillis, flags, callback).recycleOnUse());
    }

@@ -4759,6 +4769,7 @@ public class AppOpsService extends IAppOpsService.Stub {
                mFile.failWrite(stream);
            }
        }
        mHistoricalRegistry.mDiscreteRegistry.writeAndClearAccessHistory();
    }

    static class Shell extends ShellCommand {
@@ -6115,6 +6126,7 @@ public class AppOpsService extends IAppOpsService.Stub {
                "clearHistory");
        // Must not hold the appops lock
        mHistoricalRegistry.clearHistory();
        mHistoricalRegistry.mDiscreteRegistry.clearHistory();
    }

    @Override
Loading