Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
5d197bd
SecurityException: Permission Denial
hamdikahloun Sep 20, 2020
01f2153
SecurityException: Permission Denial
hamdikahloun Sep 20, 2020
9e4c909
Update PlatformPlugin.java
hamdikahloun Sep 20, 2020
795da8a
Update PlatformPlugin.java
hamdikahloun Sep 20, 2020
dce34fd
Merge branch 'master' into hamdikahloun-patch-SecurityException
hamdikahloun Sep 20, 2020
9443f65
Update PlatformPlugin.java
hamdikahloun Sep 20, 2020
8046589
Update PlatformPlugin.java
hamdikahloun Sep 28, 2020
6b74aa6
Update PlatformPlugin.java
hamdikahloun Sep 28, 2020
f1326fb
Update PlatformPlugin.java
hamdikahloun Sep 28, 2020
3a1fb98
TAG & Log
hamdikahloun Sep 29, 2020
8187b1a
SecurityException for Build Tools 29 and below
hamdikahloun Sep 29, 2020
1a28095
Add Test Uri ClipData
hamdikahloun Sep 29, 2020
ccd25ef
Add Test for Null Uri ClipData
hamdikahloun Sep 29, 2020
8f5417c
Update PlatformPluginTest.java
hamdikahloun Sep 29, 2020
d9ea4ae
Update PlatformPluginTest.java
hamdikahloun Sep 29, 2020
9668074
Update PlatformPluginTest.java
hamdikahloun Sep 29, 2020
b51174b
Update PlatformPluginTest.java
hamdikahloun Sep 29, 2020
7d5a882
Update PlatformPluginTest.java
hamdikahloun Sep 29, 2020
075248d
Update PlatformPluginTest.java
hamdikahloun Sep 29, 2020
a67c6be
Update PlatformPluginTest.java
hamdikahloun Sep 29, 2020
e57ea8a
Update PlatformPluginTest.java
hamdikahloun Sep 29, 2020
ccc1bb3
Update PlatformPluginTest.java
hamdikahloun Sep 30, 2020
051e3bd
Update PlatformPluginTest.java
hamdikahloun Sep 30, 2020
c87294f
platformPlugin_getClipboardData: assertEquals Test
hamdikahloun Oct 8, 2020
00b6be8
Update PlatformPluginTest.java
hamdikahloun Oct 8, 2020
8d04b8c
Update PlatformPluginTest.java
hamdikahloun Oct 8, 2020
5ebfcf4
Update shell/platform/android/io/flutter/plugin/platform/PlatformPlug…
dnfield Oct 8, 2020
06ca28b
Update PlatformPlugin.java
hamdikahloun Oct 8, 2020
e06d03b
Merge remote-tracking branch 'upstream/master' into hamdikahloun-patc…
hamdikahloun Oct 8, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import io.flutter.Log;
import io.flutter.embedding.engine.systemchannels.PlatformChannel;
import java.io.FileNotFoundException;
import java.util.List;

/** Android implementation of the platform plugin. */
Expand All @@ -29,6 +31,7 @@ public class PlatformPlugin {
private final PlatformChannel platformChannel;
private PlatformChannel.SystemChromeStyle currentTheme;
private int mEnabledOverlays;
private static final String TAG = "PlatformPlugin";

@VisibleForTesting
final PlatformChannel.PlatformMessageHandler mPlatformMessageHandler =
Expand Down Expand Up @@ -283,11 +286,25 @@ private CharSequence getClipboardData(PlatformChannel.ClipboardContentFormat for

if (!clipboard.hasPrimaryClip()) return null;

ClipData clip = clipboard.getPrimaryClip();
if (clip == null) return null;

if (format == null || format == PlatformChannel.ClipboardContentFormat.PLAIN_TEXT) {
return clip.getItemAt(0).coerceToText(activity);
try {
ClipData clip = clipboard.getPrimaryClip();
if (clip == null) return null;
if (format == null || format == PlatformChannel.ClipboardContentFormat.PLAIN_TEXT) {
ClipData.Item item = clip.getItemAt(0);
if (item.getUri() != null)
activity.getContentResolver().openTypedAssetFileDescriptor(item.getUri(), "text/*", null);
return item.coerceToText(activity);
}
} catch (SecurityException e) {
Log.w(
TAG,
"Attempted to get clipboard data that requires additional permission(s).\n"
+ "See the exception details for which permission(s) are required, and consider adding them to your Android Manifest as described in:\n"
+ "https://developer.android.com/guide/topics/permissions/overview",
e);
return null;
} catch (FileNotFoundException e) {
return null;
}

return null;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.flutter.plugin.platform;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
Expand All @@ -10,11 +11,17 @@
import android.app.Activity;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.ContentResolver;
import android.content.Context;
import android.media.RingtoneManager;
import android.net.Uri;
import android.view.View;
import android.view.Window;
import io.flutter.embedding.engine.systemchannels.PlatformChannel;
import io.flutter.embedding.engine.systemchannels.PlatformChannel.ClipboardContentFormat;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
Expand Down Expand Up @@ -42,8 +49,9 @@ public void itIgnoresNewHapticEventsOnOldAndroidPlatforms() {
platformPlugin.vibrateHapticFeedback(PlatformChannel.HapticFeedbackType.SELECTION_CLICK);
}

@Config(sdk = 29)
@Test
public void platformPlugin_getClipboardData() {
public void platformPlugin_getClipboardData() throws IOException {
ClipboardManager clipboardManager =
RuntimeEnvironment.application.getSystemService(ClipboardManager.class);

Expand All @@ -61,6 +69,23 @@ public void platformPlugin_getClipboardData() {
ClipData clip = ClipData.newPlainText("label", "Text");
clipboardManager.setPrimaryClip(clip);
assertNotNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat));

ContentResolver contentResolver = RuntimeEnvironment.application.getContentResolver();
Uri uri = Uri.parse("content://media/external_primary/images/media/");
clip = ClipData.newUri(contentResolver, "URI", uri);
clipboardManager.setPrimaryClip(clip);
assertNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat));

uri =
RingtoneManager.getActualDefaultRingtoneUri(
RuntimeEnvironment.application.getApplicationContext(), RingtoneManager.TYPE_RINGTONE);
clip = ClipData.newUri(contentResolver, "URI", uri);
clipboardManager.setPrimaryClip(clip);
String uriData =
platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat).toString();
InputStream uriInputStream = contentResolver.openInputStream(uri);
InputStream dataInputStream = new ByteArrayInputStream(uriData.getBytes());
assertEquals(dataInputStream.read(), uriInputStream.read());
}

@Test
Expand Down