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

Commit 983294b3 authored by Hai Zhang's avatar Hai Zhang
Browse files

Don't throw exception for destroyed RoleUserState.

This is inherently racy upon user removal and thus we should just
ignore the persistence for destroyed states.

Also added missing synchronization for getHeldRoles().

Fixes: 138776514
Test: presubmit
Change-Id: I3f67d48377b43181a844c612cb39ce85017cd8d3
parent c7487391
Loading
Loading
Loading
Loading
+14 −35
Original line number Diff line number Diff line
@@ -121,8 +121,6 @@ public class RoleUserState {
     */
    public int getVersion() {
        synchronized (mLock) {
            throwIfDestroyedLocked();

            return mVersion;
        }
    }
@@ -134,8 +132,6 @@ public class RoleUserState {
     */
    public void setVersion(int version) {
        synchronized (mLock) {
            throwIfDestroyedLocked();

            if (mVersion == version) {
                return;
            }
@@ -163,8 +159,6 @@ public class RoleUserState {
     */
    public void setPackagesHash(@Nullable String packagesHash) {
        synchronized (mLock) {
            throwIfDestroyedLocked();

            if (Objects.equals(mPackagesHash, packagesHash)) {
                return;
            }
@@ -182,8 +176,6 @@ public class RoleUserState {
     */
    public boolean isRoleAvailable(@NonNull String roleName) {
        synchronized (mLock) {
            throwIfDestroyedLocked();

            return mRoles.containsKey(roleName);
        }
    }
@@ -198,8 +190,6 @@ public class RoleUserState {
    @Nullable
    public ArraySet<String> getRoleHolders(@NonNull String roleName) {
        synchronized (mLock) {
            throwIfDestroyedLocked();

            ArraySet<String> packageNames = mRoles.get(roleName);
            if (packageNames == null) {
                return null;
@@ -217,8 +207,6 @@ public class RoleUserState {
     */
    public boolean addRoleName(@NonNull String roleName) {
        synchronized (mLock) {
            throwIfDestroyedLocked();

            if (!mRoles.containsKey(roleName)) {
                mRoles.put(roleName, new ArraySet<>());
                Slog.i(LOG_TAG, "Added new role: " + roleName);
@@ -237,8 +225,6 @@ public class RoleUserState {
     */
    public void setRoleNames(@NonNull List<String> roleNames) {
        synchronized (mLock) {
            throwIfDestroyedLocked();

            boolean changed = false;

            for (int i = mRoles.size() - 1; i >= 0; i--) {
@@ -279,8 +265,6 @@ public class RoleUserState {
        boolean changed;

        synchronized (mLock) {
            throwIfDestroyedLocked();

            ArraySet<String> roleHolders = mRoles.get(roleName);
            if (roleHolders == null) {
                Slog.e(LOG_TAG, "Cannot add role holder for unknown role, role: " + roleName
@@ -312,8 +296,6 @@ public class RoleUserState {
        boolean changed;

        synchronized (mLock) {
            throwIfDestroyedLocked();

            ArraySet<String> roleHolders = mRoles.get(roleName);
            if (roleHolders == null) {
                Slog.e(LOG_TAG, "Cannot remove role holder for unknown role, role: " + roleName
@@ -338,14 +320,16 @@ public class RoleUserState {
     */
    @NonNull
    public List<String> getHeldRoles(@NonNull String packageName) {
        ArrayList<String> result = new ArrayList<>();
        synchronized (mLock) {
            List<String> roleNames = new ArrayList<>();
            int size = mRoles.size();
            for (int i = 0; i < size; i++) {
                if (mRoles.valueAt(i).contains(packageName)) {
                result.add(mRoles.keyAt(i));
                    roleNames.add(mRoles.keyAt(i));
                }
            }
            return roleNames;
        }
        return result;
    }

    /**
@@ -353,7 +337,9 @@ public class RoleUserState {
     */
    @GuardedBy("mLock")
    private void scheduleWriteFileLocked() {
        throwIfDestroyedLocked();
        if (mDestroyed) {
            return;
        }

        if (!mWriteScheduled) {
            mWriteHandler.sendMessageDelayed(PooledLambda.obtainMessage(RoleUserState::writeFile,
@@ -537,8 +523,6 @@ public class RoleUserState {
        String packagesHash;
        ArrayMap<String, ArraySet<String>> roles;
        synchronized (mLock) {
            throwIfDestroyedLocked();

            version = mVersion;
            packagesHash = mPackagesHash;
            roles = snapshotRolesLocked();
@@ -602,20 +586,15 @@ public class RoleUserState {
     */
    public void destroy() {
        synchronized (mLock) {
            throwIfDestroyedLocked();
            if (mDestroyed) {
                throw new IllegalStateException("This RoleUserState has already been destroyed");
            }
            mWriteHandler.removeCallbacksAndMessages(null);
            getFile(mUserId).delete();
            mDestroyed = true;
        }
    }

    @GuardedBy("mLock")
    private void throwIfDestroyedLocked() {
        if (mDestroyed) {
            throw new IllegalStateException("This RoleUserState has already been destroyed");
        }
    }

    @NonNull
    private static File getFile(@UserIdInt int userId) {
        return new File(Environment.getUserSystemDirectory(userId), ROLES_FILE_NAME);