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

Commit 36744c71 authored by Hai Zhang's avatar Hai Zhang
Browse files

Refactor PermissionsState to be a data class for migration.

PackageManager Settings will now read permission state from
PermissionManager as well, to maintain compatibility for dump and the
package list file. As a result, we no longer need to write back to
this legacy state before dump and writing package list. We still need
to do so before we finish persistence migration though.

The new AppIdPermissionState will be a system API once we finish
migration of BasePermission.

Bug: 158736025
Test: presubmit
Change-Id: I3c7f20cef54084255108a0a889d8a3d7e3ab9d88
parent 26b039a8
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -143,6 +143,17 @@ public class IntArray implements Cloneable {
        mSize += count;
    }

    /**
     * Adds the values in the specified array to this array.
     */
    public void addAll(int[] values) {
        final int count = values.length;
        ensureCapacity(count);

        System.arraycopy(values, 0, mValues, mSize, count);
        mSize += count;
    }

    /**
     * Ensures capacity to append at least <code>count</code> values.
     */
+7 −10
Original line number Diff line number Diff line
@@ -1850,7 +1850,6 @@ public class PackageManagerService extends IPackageManager.Stub
                    Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);
                    synchronized (mLock) {
                        removeMessages(WRITE_PACKAGE_LIST);
                        mPermissionManager.writeStateToPackageSettingsTEMP();
                        mSettings.writePackageListLPr(msg.arg1);
                    }
                    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
@@ -2687,7 +2686,8 @@ public class PackageManagerService extends IPackageManager.Stub
                (i, pm) ->
                        new Settings(Environment.getDataDirectory(),
                                i.getPermissionManagerServiceInternal().getPermissionSettings(),
                                RuntimePermissionsPersistence.createInstance(), lock),
                                RuntimePermissionsPersistence.createInstance(),
                                i.getPermissionManagerServiceInternal(), lock),
                new Injector.LocalServicesProducer<>(ActivityTaskManagerInternal.class),
                new Injector.LocalServicesProducer<>(ActivityManagerInternal.class),
                new Injector.LocalServicesProducer<>(DeviceIdleInternal.class),
@@ -4486,8 +4486,8 @@ public class PackageManagerService extends IPackageManager.Stub
        AndroidPackage p = ps.pkg;
        if (p != null) {
            // Compute GIDs only if requested
            final int[] gids = (flags & PackageManager.GET_GIDS) == 0
                    ? EMPTY_INT_ARRAY : mPermissionManager.getPackageGids(ps.name, userId);
            final int[] gids = (flags & PackageManager.GET_GIDS) == 0 ? EMPTY_INT_ARRAY
                    : mPermissionManager.getGidsForUid(UserHandle.getUid(userId, ps.appId));
            // Compute granted permissions only if package has requested permissions
            final Set<String> permissions = ArrayUtils.isEmpty(p.getRequestedPermissions())
                    ? Collections.emptySet()
@@ -4962,13 +4962,13 @@ public class PackageManagerService extends IPackageManager.Stub
                }
                // TODO: Shouldn't this be checking for package installed state for userId and
                // return null?
                return mPermissionManager.getPackageGids(packageName, userId);
                return mPermissionManager.getGidsForUid(UserHandle.getUid(userId, ps.appId));
            }
            if ((flags & MATCH_KNOWN_PACKAGES) != 0) {
                final PackageSetting ps = mSettings.mPackages.get(packageName);
                if (ps != null && ps.isMatch(flags)
                        && !shouldFilterApplicationLocked(ps, callingUid, userId)) {
                    return mPermissionManager.getPackageGids(packageName, userId);
                    return mPermissionManager.getGidsForUid(UserHandle.getUid(userId, ps.appId));
                }
            }
        }
@@ -18967,7 +18967,7 @@ public class PackageManagerService extends IPackageManager.Stub
                    }
                    if ((deletedPs.sharedUser == null || deletedPs.sharedUser.packages.size() == 0)
                            && !isUpdatedSystemApp(deletedPs)) {
                        mPermissionManager.removePermissionsStateTEMP(removedAppId);
                        mPermissionManager.removeAppIdStateTEMP(removedAppId);
                    }
                    mPermissionManager.updatePermissions(deletedPs.name, null);
                    if (deletedPs.sharedUser != null) {
@@ -21838,8 +21838,6 @@ public class PackageManagerService extends IPackageManager.Stub
    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
        if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return;
        mPermissionManager.writeStateToPackageSettingsTEMP();
        DumpState dumpState = new DumpState();
        boolean fullPreferred = false;
        boolean checkin = false;
@@ -23718,7 +23716,6 @@ public class PackageManagerService extends IPackageManager.Stub
            mDirtyUsers.remove(userId);
            mUserNeedsBadging.delete(userId);
            mPermissionManager.onUserRemoved(userId);
            mPermissionManager.writeStateToPackageSettingsTEMP();
            mSettings.removeUserLPw(userId);
            mPendingBroadcasts.remove(userId);
            mInstantAppRegistry.onUserRemovedLPw(userId);
+2 −2
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ import android.util.proto.ProtoOutputStream;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.permission.PermissionsState;
import com.android.server.pm.permission.AppIdPermissionState;
import com.android.server.pm.pkg.PackageStateUnserialized;

import java.io.File;
@@ -215,7 +215,7 @@ public class PackageSetting extends PackageSettingBase {
    }

    @Override
    public PermissionsState getPermissionsState() {
    public AppIdPermissionState getPermissionsState() {
        return (sharedUser != null)
                ? sharedUser.getPermissionsState()
                : super.getPermissionsState();
+5 −5
Original line number Diff line number Diff line
@@ -19,23 +19,23 @@ package com.android.server.pm;
import android.content.pm.ApplicationInfo;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.pm.permission.PermissionsState;
import com.android.server.pm.permission.AppIdPermissionState;

@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
public abstract class SettingBase {
    int pkgFlags;
    int pkgPrivateFlags;

    protected final PermissionsState mPermissionsState;
    protected final AppIdPermissionState mPermissionsState;

    SettingBase(int pkgFlags, int pkgPrivateFlags) {
        setFlags(pkgFlags);
        setPrivateFlags(pkgPrivateFlags);
        mPermissionsState = new PermissionsState();
        mPermissionsState = new AppIdPermissionState();
    }

    SettingBase(SettingBase orig) {
        mPermissionsState = new PermissionsState();
        mPermissionsState = new AppIdPermissionState();
        doCopy(orig);
    }

@@ -49,7 +49,7 @@ public abstract class SettingBase {
        mPermissionsState.copyFrom(orig.mPermissionsState);
    }

    public PermissionsState getPermissionsState() {
    public AppIdPermissionState getPermissionsState() {
        return mPermissionsState;
    }

+103 −127

File changed.

Preview size limit exceeded, changes collapsed.

Loading