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

Commit a7fdcc92 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add new method to count how many apps have used permissions"

parents 1cf011cd 5f63b839
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -4880,6 +4880,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