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

Commit e42c4f3e authored by Philip P. Moltmann's avatar Philip P. Moltmann Committed by android-build-merger
Browse files

Combine successive PermPolicySvc syncs am: 78c155b8

am: 9f89ee25

Change-Id: I668f27886a2e3527422047a0dd35b836b58bd141
parents 3a1b7e61 9f89ee25
Loading
Loading
Loading
Loading
+36 −7
Original line number Diff line number Diff line
@@ -47,11 +47,14 @@ import android.permission.PermissionControllerManager;
import android.permission.PermissionManagerInternal;
import android.provider.Telephony;
import android.telecom.TelecomManager;
import android.util.ArraySet;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.SystemService;
@@ -76,6 +79,13 @@ public final class PermissionPolicyService extends SystemService {
    @GuardedBy("mLock")
    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) {
        super(context);

@@ -111,11 +121,26 @@ public final class PermissionPolicyService extends SystemService {
        });

        permManagerInternal.addOnRuntimePermissionStateChangedListener(
                (packageName, changedUserId) -> {
                this::synchronizePackagePermissionsAndAppOpsAsyncForUser);
    }

    private void synchronizePackagePermissionsAndAppOpsAsyncForUser(@NonNull String packageName,
            @UserIdInt int changedUserId) {
        if (isStarted(changedUserId)) {
                        synchronizePackagePermissionsAndAppOpsForUser(packageName, 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
@@ -230,10 +255,14 @@ public final class PermissionPolicyService extends SystemService {
     */
    private void synchronizePackagePermissionsAndAppOpsForUser(@NonNull String packageName,
            @UserIdInt int userId) {
        synchronized (mLock) {
            mIsPackageSyncsScheduled.remove(new Pair<>(packageName, userId));
        }

        if (DEBUG) {
            Slog.v(LOG_TAG,
                    "synchronizePackagePermissionsAndAppOpsForUser(" + packageName + ", " + userId
                            + ")");
                    "synchronizePackagePermissionsAndAppOpsForUser(" + packageName + ", "
                            + userId + ")");
        }

        final PackageManagerInternal packageManagerInternal = LocalServices.getService(