Combine successive PermPolicySvc syncs
As often we update many permissions and app-ops at once. Bug: 132704705 Test: RestrictedPermissionsTest Change-Id: I57176b3ec3e6f11b7dae8c14811b82094628d28a
This commit is contained in:
@@ -47,11 +47,14 @@ import android.permission.PermissionControllerManager;
|
|||||||
import android.permission.PermissionManagerInternal;
|
import android.permission.PermissionManagerInternal;
|
||||||
import android.provider.Telephony;
|
import android.provider.Telephony;
|
||||||
import android.telecom.TelecomManager;
|
import android.telecom.TelecomManager;
|
||||||
|
import android.util.ArraySet;
|
||||||
|
import android.util.Pair;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
import android.util.SparseBooleanArray;
|
import android.util.SparseBooleanArray;
|
||||||
import android.util.SparseIntArray;
|
import android.util.SparseIntArray;
|
||||||
|
|
||||||
import com.android.internal.annotations.GuardedBy;
|
import com.android.internal.annotations.GuardedBy;
|
||||||
|
import com.android.internal.util.function.pooled.PooledLambda;
|
||||||
import com.android.server.FgThread;
|
import com.android.server.FgThread;
|
||||||
import com.android.server.LocalServices;
|
import com.android.server.LocalServices;
|
||||||
import com.android.server.SystemService;
|
import com.android.server.SystemService;
|
||||||
@@ -76,6 +79,13 @@ public final class PermissionPolicyService extends SystemService {
|
|||||||
@GuardedBy("mLock")
|
@GuardedBy("mLock")
|
||||||
private final SparseBooleanArray mIsStarted = new SparseBooleanArray();
|
private final SparseBooleanArray mIsStarted = new SparseBooleanArray();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether an async {@link #synchronizePackagePermissionsAndAppOpsForUser} is currently
|
||||||
|
* scheduled for a package/user.
|
||||||
|
*/
|
||||||
|
@GuardedBy("mLock")
|
||||||
|
private final ArraySet<Pair<String, Integer>> mIsPackageSyncsScheduled = new ArraySet<>();
|
||||||
|
|
||||||
public PermissionPolicyService(@NonNull Context context) {
|
public PermissionPolicyService(@NonNull Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
|
|
||||||
@@ -111,11 +121,26 @@ public final class PermissionPolicyService extends SystemService {
|
|||||||
});
|
});
|
||||||
|
|
||||||
permManagerInternal.addOnRuntimePermissionStateChangedListener(
|
permManagerInternal.addOnRuntimePermissionStateChangedListener(
|
||||||
(packageName, changedUserId) -> {
|
this::synchronizePackagePermissionsAndAppOpsAsyncForUser);
|
||||||
if (isStarted(changedUserId)) {
|
}
|
||||||
synchronizePackagePermissionsAndAppOpsForUser(packageName, changedUserId);
|
|
||||||
|
private void synchronizePackagePermissionsAndAppOpsAsyncForUser(@NonNull String packageName,
|
||||||
|
@UserIdInt int changedUserId) {
|
||||||
|
if (isStarted(changedUserId)) {
|
||||||
|
synchronized (mLock) {
|
||||||
|
if (mIsPackageSyncsScheduled.add(new Pair<>(packageName, changedUserId))) {
|
||||||
|
FgThread.getHandler().sendMessage(PooledLambda.obtainMessage(
|
||||||
|
PermissionPolicyService
|
||||||
|
::synchronizePackagePermissionsAndAppOpsForUser,
|
||||||
|
this, packageName, changedUserId));
|
||||||
|
} else {
|
||||||
|
if (DEBUG) {
|
||||||
|
Slog.v(LOG_TAG, "sync for " + packageName + "/" + changedUserId
|
||||||
|
+ " already scheduled");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -230,10 +255,14 @@ public final class PermissionPolicyService extends SystemService {
|
|||||||
*/
|
*/
|
||||||
private void synchronizePackagePermissionsAndAppOpsForUser(@NonNull String packageName,
|
private void synchronizePackagePermissionsAndAppOpsForUser(@NonNull String packageName,
|
||||||
@UserIdInt int userId) {
|
@UserIdInt int userId) {
|
||||||
|
synchronized (mLock) {
|
||||||
|
mIsPackageSyncsScheduled.remove(new Pair<>(packageName, userId));
|
||||||
|
}
|
||||||
|
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Slog.v(LOG_TAG,
|
Slog.v(LOG_TAG,
|
||||||
"synchronizePackagePermissionsAndAppOpsForUser(" + packageName + ", " + userId
|
"synchronizePackagePermissionsAndAppOpsForUser(" + packageName + ", "
|
||||||
+ ")");
|
+ userId + ")");
|
||||||
}
|
}
|
||||||
|
|
||||||
final PackageManagerInternal packageManagerInternal = LocalServices.getService(
|
final PackageManagerInternal packageManagerInternal = LocalServices.getService(
|
||||||
|
|||||||
Reference in New Issue
Block a user