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

Commit 5f63b839 authored by Joel Galenson's avatar Joel Galenson
Browse files

Add new method to count how many apps have used permissions

Bug: 121256299
Test: Called API and looked at result.
Change-Id: If055093a81598cf36a5d1b745ee5397974ee4106
parent efad1da2
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -4860,6 +4860,14 @@ package android.permission {
    field public static final android.os.Parcelable.Creator<android.permission.RuntimePermissionPresentationInfo> CREATOR;
    field public static final android.os.Parcelable.Creator<android.permission.RuntimePermissionPresentationInfo> CREATOR;
  }
  }
  public final class RuntimePermissionUsageInfo implements android.os.Parcelable {
    ctor public RuntimePermissionUsageInfo(java.lang.CharSequence, int);
    method public int describeContents();
    method public java.lang.CharSequence getName();
    method public int getAppAccessCount();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.permission.RuntimePermissionUsageInfo> CREATOR;
  }
}
}
package android.permissionpresenterservice {
package android.permissionpresenterservice {
+1 −0
Original line number Original line Diff line number Diff line
@@ -31,4 +31,5 @@ oneway interface IPermissionController {
    void revokeRuntimePermission(String packageName, String permissionName);
    void revokeRuntimePermission(String packageName, String permissionName);
    void countPermissionApps(in List<String> permissionNames, boolean countOnlyGranted,
    void countPermissionApps(in List<String> permissionNames, boolean countOnlyGranted,
            boolean countSystem, in RemoteCallback callback);
            boolean countSystem, in RemoteCallback callback);
    void getPermissionUsages(boolean countSystem, long numMillis, in RemoteCallback callback);
}
}
+94 −0
Original line number Original line Diff line number Diff line
@@ -18,6 +18,7 @@ package android.permission;


import static android.permission.PermissionControllerService.SERVICE_INTERFACE;
import static android.permission.PermissionControllerService.SERVICE_INTERFACE;


import static com.android.internal.util.Preconditions.checkArgumentNonnegative;
import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull;
import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull;
import static com.android.internal.util.Preconditions.checkNotNull;
import static com.android.internal.util.Preconditions.checkNotNull;


@@ -146,6 +147,20 @@ public final class PermissionControllerManager {
        void onCountPermissionApps(int numApps);
        void onCountPermissionApps(int numApps);
    }
    }


    /**
     * Callback for delivering the result of {@link #getPermissionUsages}.
     *
     * @hide
     */
    public interface OnPermissionUsageResultCallback {
        /**
         * The result for {@link #getPermissionUsages}.
         *
         * @param users The users list.
         */
        void onPermissionUsageResult(@NonNull List<RuntimePermissionUsageInfo> users);
    }

    private final @NonNull Context mContext;
    private final @NonNull Context mContext;


    /**
    /**
@@ -263,6 +278,28 @@ public final class PermissionControllerManager {
                handler == null ? sRemoteService.getHandler() : handler));
                handler == null ? sRemoteService.getHandler() : handler));
    }
    }


    /**
     * Count how many apps have used permissions.
     *
     * @param countSystem Also count system apps
     * @param numMillis The number of milliseconds in the past to check for uses
     * @param executor Executor on which to invoke the callback
     * @param callback Callback to receive the result
     *
     * @hide
     */
    @RequiresPermission(Manifest.permission.GET_RUNTIME_PERMISSIONS)
    public void getPermissionUsages(boolean countSystem, long numMillis,
            @NonNull @CallbackExecutor Executor executor,
            @NonNull OnPermissionUsageResultCallback callback) {
        checkArgumentNonnegative(numMillis);
        checkNotNull(executor);
        checkNotNull(callback);

        sRemoteService.scheduleRequest(new PendingGetPermissionUsagesRequest(sRemoteService,
                countSystem, numMillis, executor, callback));
    }

    /**
    /**
     * A connection to the remote service
     * A connection to the remote service
     */
     */
@@ -521,4 +558,61 @@ public final class PermissionControllerManager {
            }
            }
        }
        }
    }
    }

    /**
     * Request for {@link #getPermissionUsages}
     */
    private static final class PendingGetPermissionUsagesRequest extends
            AbstractRemoteService.PendingRequest<RemoteService, IPermissionController> {
        private final @NonNull OnPermissionUsageResultCallback mCallback;
        private final boolean mCountSystem;
        private final long mNumMillis;

        private final @NonNull RemoteCallback mRemoteCallback;

        private PendingGetPermissionUsagesRequest(@NonNull RemoteService service,
                boolean countSystem, long numMillis, @NonNull @CallbackExecutor Executor executor,
                @NonNull OnPermissionUsageResultCallback callback) {
            super(service);

            mCountSystem = countSystem;
            mNumMillis = numMillis;
            mCallback = callback;

            mRemoteCallback = new RemoteCallback(result -> executor.execute(() -> {
                long token = Binder.clearCallingIdentity();
                try {
                    final List<RuntimePermissionUsageInfo> reportedUsers;
                    List<RuntimePermissionUsageInfo> users = null;
                    if (result != null) {
                        users = result.getParcelableArrayList(KEY_RESULT);
                    } else {
                        users = Collections.emptyList();
                    }
                    reportedUsers = users;

                    callback.onPermissionUsageResult(reportedUsers);
                } finally {
                    Binder.restoreCallingIdentity(token);

                    finish();
                }
            }), null);
        }

        @Override
        protected void onTimeout(RemoteService remoteService) {
            mCallback.onPermissionUsageResult(Collections.emptyList());
        }

        @Override
        public void run() {
            try {
                getService().getServiceInterface().getPermissionUsages(mCountSystem, mNumMillis,
                        mRemoteCallback);
            } catch (RemoteException e) {
                Log.e(TAG, "Error counting permission users", e);
            }
        }
    }
}
}
+39 −0
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
package android.permission;
package android.permission;


import static com.android.internal.util.Preconditions.checkArgument;
import static com.android.internal.util.Preconditions.checkArgument;
import static com.android.internal.util.Preconditions.checkArgumentNonnegative;
import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull;
import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull;
import static com.android.internal.util.Preconditions.checkNotNull;
import static com.android.internal.util.Preconditions.checkNotNull;
import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
@@ -112,6 +113,17 @@ public abstract class PermissionControllerService extends Service {
    public abstract int onCountPermissionApps(@NonNull List<String> permissionNames,
    public abstract int onCountPermissionApps(@NonNull List<String> permissionNames,
            boolean countOnlyGranted, boolean countSystem);
            boolean countOnlyGranted, boolean countSystem);


    /**
     * Count how many apps have used permissions.
     *
     * @param countSystem Also count system apps
     * @param numMillis The number of milliseconds in the past to check for uses
     *
     * @return descriptions of the users of permissions
     */
    public abstract @NonNull List<RuntimePermissionUsageInfo>
            onPermissionUsageResult(boolean countSystem, long numMillis);

    @Override
    @Override
    public final IBinder onBind(Intent intent) {
    public final IBinder onBind(Intent intent) {
        return new IPermissionController.Stub() {
        return new IPermissionController.Stub() {
@@ -187,6 +199,20 @@ public abstract class PermissionControllerService extends Service {
                                PermissionControllerService.this, permissionNames, countOnlyGranted,
                                PermissionControllerService.this, permissionNames, countOnlyGranted,
                                countSystem, callback));
                                countSystem, callback));
            }
            }

            @Override
            public void getPermissionUsages(boolean countSystem, long numMillis,
                    RemoteCallback callback) {
                checkArgumentNonnegative(numMillis);
                checkNotNull(callback, "callback");

                enforceCallingPermission(Manifest.permission.GET_RUNTIME_PERMISSIONS, null);

                mHandler.sendMessage(
                        obtainMessage(PermissionControllerService::getPermissionUsages,
                                PermissionControllerService.this, countSystem, numMillis,
                                callback));
            }
        };
        };
    }
    }


@@ -230,4 +256,17 @@ public abstract class PermissionControllerService extends Service {
        result.putInt(PermissionControllerManager.KEY_RESULT, numApps);
        result.putInt(PermissionControllerManager.KEY_RESULT, numApps);
        callback.sendResult(result);
        callback.sendResult(result);
    }
    }

    private void getPermissionUsages(boolean countSystem, long numMillis,
            @NonNull RemoteCallback callback) {
        List<RuntimePermissionUsageInfo> users =
                onPermissionUsageResult(countSystem, numMillis);
        if (users != null && !users.isEmpty()) {
            Bundle result = new Bundle();
            result.putParcelableList(PermissionControllerManager.KEY_RESULT, users);
            callback.sendResult(result);
        } else {
            callback.sendResult(null);
        }
    }
}
}
+19 −0
Original line number Original line Diff line number Diff line
/**
 * Copyright (c) 2019, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.permission;

parcelable RuntimePermissionUsageInfo;
 No newline at end of file
Loading