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

Commit ba3ba81e authored by Svet Ganov's avatar Svet Ganov Committed by Svetoslav
Browse files

Make grant default permission more robust.

Change-Id: If492ee3305774419671bbdb72b438c8e540005e9
parent 5da8ed16
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -403,6 +403,8 @@ final class DefaultPermissionGrantPolicy {
                    }
                    }
                }
                }
            }
            }

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


+11 −5
Original line number Original line Diff line number Diff line
@@ -14023,6 +14023,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
@@ -14052,16 +14054,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.
@@ -4334,15 +4345,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);
@@ -4427,6 +4456,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);
@@ -4451,6 +4483,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,
@@ -4529,6 +4564,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);