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

Commit 448c1ea8 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Apps using storage must have runtime permission.

A major goal of the Q release is to promote user transparency around
permission usage, and to also give user controls over those
permissions.  To further this goal, all apps requesting the
internal WRITE_MEDIA_STORAGE permission must also request (and be
granted) the "Storage" runtime permission in order to gain the
associated access.

If the user revokes the "Storage" runtime permission, then the app
must lose all access granted to it via WRITE_MEDIA_STORAGE.

Bug: 129144016
Test: atest android.permission.cts.ProviderPermissionTest#testWriteMediaStorage
Change-Id: I7e747de0107cf9364a0ff2401686906340d31995
parent f4a7a585
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -680,9 +680,11 @@ package android.content.pm {
    field public static final String FEATURE_ADOPTABLE_STORAGE = "android.software.adoptable_storage";
    field public static final String FEATURE_FILE_BASED_ENCRYPTION = "android.software.file_based_encryption";
    field public static final int FLAG_PERMISSION_HIDDEN = 1024; // 0x400
    field public static final int FLAG_PERMISSION_POLICY_FIXED = 4; // 0x4
    field public static final int FLAG_PERMISSION_REVIEW_REQUIRED = 64; // 0x40
    field public static final int FLAG_PERMISSION_REVOKE_ON_UPGRADE = 8; // 0x8
    field public static final int FLAG_PERMISSION_REVOKE_WHEN_REQUESTED = 128; // 0x80
    field public static final int FLAG_PERMISSION_SYSTEM_FIXED = 16; // 0x10
    field public static final int FLAG_PERMISSION_USER_FIXED = 2; // 0x2
    field public static final int FLAG_PERMISSION_USER_SET = 1; // 0x1
    field public static final int MATCH_FACTORY_ONLY = 2097152; // 0x200000
+1 −6
Original line number Diff line number Diff line
@@ -3525,12 +3525,7 @@ public abstract class ContentResolver implements ContentInterface {
     */
    public @NonNull Bitmap loadThumbnail(@NonNull Uri uri, @NonNull Size size,
            @Nullable CancellationSignal signal) throws IOException {
        Objects.requireNonNull(uri);
        Objects.requireNonNull(size);

        try (ContentProviderClient client = acquireContentProviderClient(uri)) {
            return loadThumbnail(client, uri, size, signal, ImageDecoder.ALLOCATOR_SOFTWARE);
        }
        return loadThumbnail(this, uri, size, signal, ImageDecoder.ALLOCATOR_SOFTWARE);
    }

    /** {@hide} */
+2 −0
Original line number Diff line number Diff line
@@ -2990,6 +2990,7 @@ public abstract class PackageManager {
     * @hide
     */
    @SystemApi
    @TestApi
    public static final int FLAG_PERMISSION_POLICY_FIXED =  1 << 2;

    /**
@@ -3013,6 +3014,7 @@ public abstract class PackageManager {
     * @hide
     */
    @SystemApi
    @TestApi
    public static final int FLAG_PERMISSION_SYSTEM_FIXED =  1 << 4;

    /**
+4 −5
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.annotation.UnsupportedAppUsage;
import android.app.Activity;
import android.app.AppGlobals;
import android.content.ClipData;
import android.content.ContentInterface;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.ContentUris;
@@ -1714,11 +1715,9 @@ public final class MediaStore {
                    url = cr.insert(EXTERNAL_CONTENT_URI, values);

                    if (source != null) {
                        OutputStream imageOut = cr.openOutputStream(url);
                        try {
                            source.compress(Bitmap.CompressFormat.JPEG, 50, imageOut);
                        } finally {
                            imageOut.close();
                        try (OutputStream out = new ParcelFileDescriptor.AutoCloseOutputStream(
                                cr.openFile(url, "w", null))) {
                            source.compress(Bitmap.CompressFormat.JPEG, 50, out);
                        }

                        long id = ContentUris.parseId(url);