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

Commit 143e118f authored by Svet Ganov's avatar Svet Ganov Committed by Android (Google) Code Review
Browse files

Merge "Make grant default permission more robust." into mnc-dev

parents ae3584bd ba3ba81e
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -431,6 +431,8 @@ final class DefaultPermissionGrantPolicy {
                    }
                    }
                }
                }
            }
            }

            mService.mSettings.onDefaultRuntimePermissionsGrantedLPr(userId);
        }
        }
    }
    }


+11 −5
Original line number Original line Diff line number Diff line
@@ -14110,6 +14110,8 @@ public class PackageManagerService extends IPackageManager.Stub {
            Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled);
            Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled);
        }
        }
        int[] grantPermissionsUserIds = EMPTY_INT_ARRAY;
        synchronized (mPackages) {
        synchronized (mPackages) {
            // Verify that all of the preferred activity components actually
            // Verify that all of the preferred activity components actually
            // exist.  It is possible for applications to be updated and at
            // exist.  It is possible for applications to be updated and at
@@ -14139,16 +14141,20 @@ public class PackageManagerService extends IPackageManager.Stub {
                            mSettings.mPreferredActivities.keyAt(i));
                            mSettings.mPreferredActivities.keyAt(i));
                }
                }
            }
            }
            for (int userId : UserManagerService.getInstance().getUserIds()) {
                if (!mSettings.areDefaultRuntimePermissionsGrantedLPr(userId)) {
                    grantPermissionsUserIds = ArrayUtils.appendInt(
                            grantPermissionsUserIds, userId);
                }
            }
        }
        }
        sUserManager.systemReady();
        sUserManager.systemReady();
        // If we upgraded grant all default permissions before kicking off.
        // If we upgraded grant all default permissions before kicking off.
        if (isFirstBoot() || (CLEAR_RUNTIME_PERMISSIONS_ON_UPGRADE && mIsUpgrade)) {
        for (int userId : grantPermissionsUserIds) {
            updatePermissionsLPw(null, null, UPDATE_PERMISSIONS_ALL);
            for (int userId : UserManagerService.getInstance().getUserIds()) {
            mDefaultPermissionPolicy.grantDefaultPermissions(userId);
            mDefaultPermissionPolicy.grantDefaultPermissions(userId);
        }
        }
        }
        // Kick off any messages waiting for system ready
        // Kick off any messages waiting for system ready
        if (mPostSystemReadyMessages != null) {
        if (mPostSystemReadyMessages != null) {
+45 −3
Original line number Original line Diff line number Diff line
@@ -195,6 +195,7 @@ final class Settings {
    private static final String ATTR_BLOCK_UNINSTALL = "blockUninstall";
    private static final String ATTR_BLOCK_UNINSTALL = "blockUninstall";
    private static final String ATTR_DOMAIN_VERIFICATON_STATE = "domainVerificationStatus";
    private static final String ATTR_DOMAIN_VERIFICATON_STATE = "domainVerificationStatus";
    private static final String ATTR_PACKAGE_NAME= "packageName";
    private static final String ATTR_PACKAGE_NAME= "packageName";
    private static final String ATTR_FINGERPRINT = "fingerprint";


    private final Object mLock;
    private final Object mLock;


@@ -1177,6 +1178,16 @@ final class Settings {
        }
        }
    }
    }


    boolean areDefaultRuntimePermissionsGrantedLPr(int userId) {
        return mRuntimePermissionsPersistence
                .areDefaultRuntimPermissionsGrantedLPr(userId);
    }

    void onDefaultRuntimePermissionsGrantedLPr(int userId) {
        mRuntimePermissionsPersistence
                .onDefaultRuntimePermissionsGrantedLPr(userId);
    }

    /**
    /**
     * Returns whether the current database has is older than {@code version}
     * Returns whether the current database has is older than {@code version}
     * for apps on internal storage.
     * for apps on internal storage.
@@ -4364,15 +4375,33 @@ final class Settings {
        private final Object mLock;
        private final Object mLock;


        @GuardedBy("mLock")
        @GuardedBy("mLock")
        private SparseBooleanArray mWriteScheduled = new SparseBooleanArray();
        private final SparseBooleanArray mWriteScheduled = new SparseBooleanArray();

        @GuardedBy("mLock")
        // The mapping keys are user ids.
        private final SparseLongArray mLastNotWrittenMutationTimesMillis = new SparseLongArray();

        @GuardedBy("mLock")
        // The mapping keys are user ids.
        private final SparseArray<String> mFingerprints = new SparseArray<>();


        @GuardedBy("mLock")
        @GuardedBy("mLock")
        private SparseLongArray mLastNotWrittenMutationTimesMillis = new SparseLongArray();
        // The mapping keys are user ids.
        private final SparseBooleanArray mDefaultPermissionsGranted = new SparseBooleanArray();


        public RuntimePermissionPersistence(Object lock) {
        public RuntimePermissionPersistence(Object lock) {
            mLock = lock;
            mLock = lock;
        }
        }


        public boolean areDefaultRuntimPermissionsGrantedLPr(int userId) {
            return mDefaultPermissionsGranted.get(userId);
        }

        public void onDefaultRuntimePermissionsGrantedLPr(int userId) {
            mFingerprints.put(userId, Build.FINGERPRINT);
            writePermissionsForUserAsyncLPr(userId);
        }

        public void writePermissionsForUserSyncLPr(int userId) {
        public void writePermissionsForUserSyncLPr(int userId) {
            mHandler.removeMessages(userId);
            mHandler.removeMessages(userId);
            writePermissionsSync(userId);
            writePermissionsSync(userId);
@@ -4457,6 +4486,9 @@ final class Settings {
                serializer.startDocument(null, true);
                serializer.startDocument(null, true);
                serializer.startTag(null, TAG_RUNTIME_PERMISSIONS);
                serializer.startTag(null, TAG_RUNTIME_PERMISSIONS);


                String fingerprint = mFingerprints.get(userId);
                serializer.attribute(null, ATTR_FINGERPRINT, fingerprint);

                final int packageCount = permissionsForPackage.size();
                final int packageCount = permissionsForPackage.size();
                for (int i = 0; i < packageCount; i++) {
                for (int i = 0; i < packageCount; i++) {
                    String packageName = permissionsForPackage.keyAt(i);
                    String packageName = permissionsForPackage.keyAt(i);
@@ -4481,6 +4513,9 @@ final class Settings {
                serializer.endDocument();
                serializer.endDocument();
                destination.finishWrite(out);
                destination.finishWrite(out);


                if (Build.FINGERPRINT.equals(fingerprint)) {
                    mDefaultPermissionsGranted.put(userId, true);
                }
            // Any error while writing is fatal.
            // Any error while writing is fatal.
            } catch (Throwable t) {
            } catch (Throwable t) {
                Slog.wtf(PackageManagerService.TAG,
                Slog.wtf(PackageManagerService.TAG,
@@ -4559,6 +4594,13 @@ final class Settings {
                }
                }


                switch (parser.getName()) {
                switch (parser.getName()) {
                    case TAG_RUNTIME_PERMISSIONS: {
                        String fingerprint = parser.getAttributeValue(null, ATTR_FINGERPRINT);
                        mFingerprints.put(userId, fingerprint);
                        final boolean defaultsGranted = Build.FINGERPRINT.equals(fingerprint);
                        mDefaultPermissionsGranted.put(userId, defaultsGranted);
                    } break;

                    case TAG_PACKAGE: {
                    case TAG_PACKAGE: {
                        String name = parser.getAttributeValue(null, ATTR_NAME);
                        String name = parser.getAttributeValue(null, ATTR_NAME);
                        PackageSetting ps = mPackages.get(name);
                        PackageSetting ps = mPackages.get(name);