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

Commit 2cbceb9e authored by Evan Severson's avatar Evan Severson
Browse files

Fix deadlock when creating new OneTimePermissionUserManager

Registering the broadcast receiver should happen outside of the lock.

Change-Id: I8bbcd1ca3aff56d6d7ad4f4d63eec47671501493
Test: Set up work profile
Fixes: 153999597
parent b86e5a77
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -81,9 +81,6 @@ public class OneTimePermissionUserManager {
        mAlarmManager = context.getSystemService(AlarmManager.class);
        mPermissionControllerManager = context.getSystemService(PermissionControllerManager.class);
        mHandler = context.getMainThreadHandler();

        // Listen for tracked uid being uninstalled
        context.registerReceiver(mUninstallListener, new IntentFilter(Intent.ACTION_UID_REMOVED));
    }

    /**
@@ -170,6 +167,14 @@ public class OneTimePermissionUserManager {
                PROPERTY_KILLED_DELAY_CONFIG_KEY, DEFAULT_KILLED_DELAY_MILLIS);
    }

    /**
     * Register to listen for Uids being uninstalled. This must be done outside of the
     * PermissionManagerService lock.
     */
    void registerUninstallListener() {
        mContext.registerReceiver(mUninstallListener, new IntentFilter(Intent.ACTION_UID_REMOVED));
    }

    /**
     * A class which watches a package for inactivity and notifies the permission controller when
     * the package becomes inactive
+9 −6
Original line number Diff line number Diff line
@@ -3210,17 +3210,20 @@ public class PermissionManagerService extends IPermissionManager.Stub {
    }

    private OneTimePermissionUserManager getOneTimePermissionUserManager(@UserIdInt int userId) {
        OneTimePermissionUserManager oneTimePermissionUserManager;
        synchronized (mLock) {
            OneTimePermissionUserManager oneTimePermissionUserManager =
            oneTimePermissionUserManager =
                    mOneTimePermissionUserManagers.get(userId);
            if (oneTimePermissionUserManager == null) {
            if (oneTimePermissionUserManager != null) {
                return oneTimePermissionUserManager;
            }
            oneTimePermissionUserManager = new OneTimePermissionUserManager(
                    mContext.createContextAsUser(UserHandle.of(userId), /*flags*/ 0));
            mOneTimePermissionUserManagers.put(userId, oneTimePermissionUserManager);
        }
        oneTimePermissionUserManager.registerUninstallListener();
        return oneTimePermissionUserManager;
    }
    }

    @Override
    public void startOneTimePermissionSession(String packageName, @UserIdInt int userId,