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

Commit 8c73c06e authored by Miranda Kephart's avatar Miranda Kephart
Browse files

Put clipboard image uri in clipData for share intent

If the URI is only set in EXTRA_STREAM, grantPermissions is not
able to pick up and add the GRANT_READ_URI permission. Add ClipData
to the share intent sent from the clipboard UI to correctly
propagate the permission through.

Bug: 288272806
Fix: 288272806
Test: manual (copy image -> share -> verify preview appears); atest IntentCreatorTest
Change-Id: Ic52ff10cab62f1cab9fd81d93011b0454885c21e
parent 9a35ddf5
Loading
Loading
Loading
Loading
+9 −2
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.clipboardoverlay;
package com.android.systemui.clipboardoverlay;


import android.content.ClipData;
import android.content.ClipData;
import android.content.ClipDescription;
import android.content.ComponentName;
import android.content.ComponentName;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
@@ -41,10 +42,16 @@ class IntentCreator {
        // From the ACTION_SEND docs:
        // From the ACTION_SEND docs:
        //   "If using EXTRA_TEXT, the MIME type should be "text/plain"; otherwise it should be the
        //   "If using EXTRA_TEXT, the MIME type should be "text/plain"; otherwise it should be the
        //    MIME type of the data in EXTRA_STREAM"
        //    MIME type of the data in EXTRA_STREAM"
        if (clipData.getItemAt(0).getUri() != null) {
        Uri uri = clipData.getItemAt(0).getUri();
        if (uri != null) {
            // We don't use setData here because some apps interpret this as "to:".
            // We don't use setData here because some apps interpret this as "to:".
            shareIntent.setType(clipData.getDescription().getMimeType(0));
            shareIntent.setType(clipData.getDescription().getMimeType(0));
            shareIntent.putExtra(Intent.EXTRA_STREAM, clipData.getItemAt(0).getUri());
            // Include URI in ClipData also, so that grantPermission picks it up.
            shareIntent.setClipData(new ClipData(
                    new ClipDescription(
                            "content", new String[]{clipData.getDescription().getMimeType(0)}),
                    new ClipData.Item(uri)));
            shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        } else {
        } else {
            shareIntent.putExtra(
            shareIntent.putExtra(
+2 −1
Original line number Original line Diff line number Diff line
@@ -126,7 +126,8 @@ public class IntentCreatorTest extends SysuiTestCase {
        assertEquals(Intent.ACTION_CHOOSER, intent.getAction());
        assertEquals(Intent.ACTION_CHOOSER, intent.getAction());
        assertFlags(intent, EXTERNAL_INTENT_FLAGS);
        assertFlags(intent, EXTERNAL_INTENT_FLAGS);
        Intent target = intent.getParcelableExtra(Intent.EXTRA_INTENT, Intent.class);
        Intent target = intent.getParcelableExtra(Intent.EXTRA_INTENT, Intent.class);
        assertEquals(uri, target.getData());
        assertEquals(uri, target.getParcelableExtra(Intent.EXTRA_STREAM, Uri.class));
        assertEquals(uri, target.getClipData().getItemAt(0).getUri());
        assertEquals("image/png", target.getType());
        assertEquals("image/png", target.getType());
    }
    }