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

Commit a49ef29f authored by Dmitrii Merkurev's avatar Dmitrii Merkurev Committed by Android (Google) Code Review
Browse files

Merge "Currently, Uri Permissions read/write grants are modified/accessed...

Merge "Currently, Uri Permissions read/write grants  are modified/accessed from different parts across the system:"
parents 73e1b385 655f1a45
Loading
Loading
Loading
Loading
+82 −58
Original line number Original line Diff line number Diff line
@@ -30,7 +30,9 @@ import com.android.server.am.UriPermissionOwnerProto;
import com.google.android.collect.Sets;
import com.google.android.collect.Sets;


import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Iterator;
import java.util.List;


public class UriPermissionOwner {
public class UriPermissionOwner {
    private final UriGrantsManagerInternal mService;
    private final UriGrantsManagerInternal mService;
@@ -79,10 +81,13 @@ public class UriPermissionOwner {
    }
    }


    void removeUriPermission(GrantUri grantUri, int mode, String targetPgk, int targetUserId) {
    void removeUriPermission(GrantUri grantUri, int mode, String targetPgk, int targetUserId) {
        final List<UriPermission> permissionsToRemove = new ArrayList<>();

        synchronized (this) {
            if ((mode & FLAG_GRANT_READ_URI_PERMISSION) != 0 && mReadPerms != null) {
            if ((mode & FLAG_GRANT_READ_URI_PERMISSION) != 0 && mReadPerms != null) {
            Iterator<UriPermission> it = mReadPerms.iterator();
                final Iterator<UriPermission> it = mReadPerms.iterator();
                while (it.hasNext()) {
                while (it.hasNext()) {
                UriPermission perm = it.next();
                    final UriPermission perm = it.next();
                    if (grantUri != null && !grantUri.equals(perm.uri)) {
                    if (grantUri != null && !grantUri.equals(perm.uri)) {
                        continue;
                        continue;
                    }
                    }
@@ -92,18 +97,19 @@ public class UriPermissionOwner {
                    if (targetUserId != UserHandle.USER_ALL && targetUserId != perm.targetUserId) {
                    if (targetUserId != UserHandle.USER_ALL && targetUserId != perm.targetUserId) {
                        continue;
                        continue;
                    }
                    }
                    permissionsToRemove.add(perm);
                    perm.removeReadOwner(this);
                    perm.removeReadOwner(this);
                mService.removeUriPermissionIfNeeded(perm);
                    it.remove();
                    it.remove();
                }
                }
                if (mReadPerms.isEmpty()) {
                if (mReadPerms.isEmpty()) {
                    mReadPerms = null;
                    mReadPerms = null;
                }
                }
            }
            }

            if ((mode & FLAG_GRANT_WRITE_URI_PERMISSION) != 0 && mWritePerms != null) {
            if ((mode & FLAG_GRANT_WRITE_URI_PERMISSION) != 0 && mWritePerms != null) {
            Iterator<UriPermission> it = mWritePerms.iterator();
                final Iterator<UriPermission> it = mWritePerms.iterator();
                while (it.hasNext()) {
                while (it.hasNext()) {
                UriPermission perm = it.next();
                    final UriPermission perm = it.next();
                    if (grantUri != null && !grantUri.equals(perm.uri)) {
                    if (grantUri != null && !grantUri.equals(perm.uri)) {
                        continue;
                        continue;
                    }
                    }
@@ -113,8 +119,8 @@ public class UriPermissionOwner {
                    if (targetUserId != UserHandle.USER_ALL && targetUserId != perm.targetUserId) {
                    if (targetUserId != UserHandle.USER_ALL && targetUserId != perm.targetUserId) {
                        continue;
                        continue;
                    }
                    }
                    permissionsToRemove.add(perm);
                    perm.removeWriteOwner(this);
                    perm.removeWriteOwner(this);
                mService.removeUriPermissionIfNeeded(perm);
                    it.remove();
                    it.remove();
                }
                }
                if (mWritePerms.isEmpty()) {
                if (mWritePerms.isEmpty()) {
@@ -123,55 +129,73 @@ public class UriPermissionOwner {
            }
            }
        }
        }


        final int permissionsToRemoveSize = permissionsToRemove.size();
        for (int i = 0; i < permissionsToRemoveSize; i++) {
            mService.removeUriPermissionIfNeeded(permissionsToRemove.get(i));
        }
    }

    public void addReadPermission(UriPermission perm) {
    public void addReadPermission(UriPermission perm) {
        synchronized (this) {
            if (mReadPerms == null) {
            if (mReadPerms == null) {
                mReadPerms = Sets.newArraySet();
                mReadPerms = Sets.newArraySet();
            }
            }
            mReadPerms.add(perm);
            mReadPerms.add(perm);
        }
        }
    }


    public void addWritePermission(UriPermission perm) {
    public void addWritePermission(UriPermission perm) {
        synchronized (this) {
            if (mWritePerms == null) {
            if (mWritePerms == null) {
                mWritePerms = Sets.newArraySet();
                mWritePerms = Sets.newArraySet();
            }
            }
            mWritePerms.add(perm);
            mWritePerms.add(perm);
        }
        }
    }


    public void removeReadPermission(UriPermission perm) {
    public void removeReadPermission(UriPermission perm) {
        synchronized (this) {
            mReadPerms.remove(perm);
            mReadPerms.remove(perm);
            if (mReadPerms.isEmpty()) {
            if (mReadPerms.isEmpty()) {
                mReadPerms = null;
                mReadPerms = null;
            }
            }
        }
        }
    }


    public void removeWritePermission(UriPermission perm) {
    public void removeWritePermission(UriPermission perm) {
        synchronized (this) {
            mWritePerms.remove(perm);
            mWritePerms.remove(perm);
            if (mWritePerms.isEmpty()) {
            if (mWritePerms.isEmpty()) {
                mWritePerms = null;
                mWritePerms = null;
            }
            }
        }
        }
    }


    public void dump(PrintWriter pw, String prefix) {
    public void dump(PrintWriter pw, String prefix) {
        synchronized (this) {
            if (mReadPerms != null) {
            if (mReadPerms != null) {
            pw.print(prefix); pw.print("readUriPermissions="); pw.println(mReadPerms);
                pw.print(prefix);
                pw.print("readUriPermissions=");
                pw.println(mReadPerms);
            }
            }
            if (mWritePerms != null) {
            if (mWritePerms != null) {
            pw.print(prefix); pw.print("writeUriPermissions="); pw.println(mWritePerms);
                pw.print(prefix);
                pw.print("writeUriPermissions=");
                pw.println(mWritePerms);
            }
        }
        }
    }
    }


    public void dumpDebug(ProtoOutputStream proto, long fieldId) {
    public void dumpDebug(ProtoOutputStream proto, long fieldId) {
        long token = proto.start(fieldId);
        long token = proto.start(fieldId);
        proto.write(UriPermissionOwnerProto.OWNER, mOwner.toString());
        proto.write(UriPermissionOwnerProto.OWNER, mOwner.toString());
        synchronized (this) {
            if (mReadPerms != null) {
            if (mReadPerms != null) {
            synchronized (mReadPerms) {
                for (UriPermission p : mReadPerms) {
                for (UriPermission p : mReadPerms) {
                    p.uri.dumpDebug(proto, UriPermissionOwnerProto.READ_PERMS);
                    p.uri.dumpDebug(proto, UriPermissionOwnerProto.READ_PERMS);
                }
                }
            }
            }
        }
            if (mWritePerms != null) {
            if (mWritePerms != null) {
            synchronized (mWritePerms) {
                for (UriPermission p : mWritePerms) {
                for (UriPermission p : mWritePerms) {
                    p.uri.dumpDebug(proto, UriPermissionOwnerProto.WRITE_PERMS);
                    p.uri.dumpDebug(proto, UriPermissionOwnerProto.WRITE_PERMS);
                }
                }