Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit a1440ca

Browse files
christopherfujinohamdikahloundnfield
authored
[flutter_releases] Flutter 1.22.3 engine cherrypicks (#22171)
* Update 1.22 engine to use Dart 2.10.3 * SecurityException: Permission Denial (#21290) Fix `java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider` Fixes flutter/flutter#66108 Co-authored-by: Dan Field <[email protected]> Co-authored-by: Hamdi Kahloun <[email protected]> Co-authored-by: Dan Field <[email protected]>
1 parent b8752bb commit a1440ca

File tree

4 files changed

+76
-6
lines changed

4 files changed

+76
-6
lines changed

DEPS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ vars = {
3434
# Dart is: https://github.com/dart-lang/sdk/blob/master/DEPS.
3535
# You can use //tools/dart/create_updated_flutter_deps.py to produce
3636
# updated revision list of existing dependencies.
37-
'dart_revision': '1d923a386d7a9f384435a2b4c1287b2937504566',
37+
'dart_revision': 'ecf9ce8ef42de11033801b2870e8b310c3722902',
3838

3939
# WARNING: DO NOT EDIT MANUALLY
4040
# The lines between blank lines above and below are generated by a script. See create_updated_flutter_deps.py

ci/licenses_golden/licenses_third_party

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Signature: fcda8704ef65a785787b4045cbe4f432
1+
Signature: 35f962fd83423ee7de3761729e0c25c4
22

33
UNUSED LICENSES:
44

shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
import androidx.annotation.NonNull;
1818
import androidx.annotation.Nullable;
1919
import androidx.annotation.VisibleForTesting;
20+
import io.flutter.Log;
2021
import io.flutter.embedding.engine.systemchannels.PlatformChannel;
22+
import java.io.FileNotFoundException;
2123
import java.util.List;
2224

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

3336
@VisibleForTesting
3437
final PlatformChannel.PlatformMessageHandler mPlatformMessageHandler =
@@ -280,11 +283,28 @@ private void popSystemNavigator() {
280283
private CharSequence getClipboardData(PlatformChannel.ClipboardContentFormat format) {
281284
ClipboardManager clipboard =
282285
(ClipboardManager) activity.getSystemService(Context.CLIPBOARD_SERVICE);
283-
ClipData clip = clipboard.getPrimaryClip();
284-
if (clip == null) return null;
285286

286-
if (format == null || format == PlatformChannel.ClipboardContentFormat.PLAIN_TEXT) {
287-
return clip.getItemAt(0).coerceToText(activity);
287+
if (!clipboard.hasPrimaryClip()) return null;
288+
289+
try {
290+
ClipData clip = clipboard.getPrimaryClip();
291+
if (clip == null) return null;
292+
if (format == null || format == PlatformChannel.ClipboardContentFormat.PLAIN_TEXT) {
293+
ClipData.Item item = clip.getItemAt(0);
294+
if (item.getUri() != null)
295+
activity.getContentResolver().openTypedAssetFileDescriptor(item.getUri(), "text/*", null);
296+
return item.coerceToText(activity);
297+
}
298+
} catch (SecurityException e) {
299+
Log.w(
300+
TAG,
301+
"Attempted to get clipboard data that requires additional permission(s).\n"
302+
+ "See the exception details for which permission(s) are required, and consider adding them to your Android Manifest as described in:\n"
303+
+ "https://developer.android.com/guide/topics/permissions/overview",
304+
e);
305+
return null;
306+
} catch (FileNotFoundException e) {
307+
return null;
288308
}
289309

290310
return null;

shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,27 @@
11
package io.flutter.plugin.platform;
22

3+
import static org.junit.Assert.assertEquals;
34
import static org.junit.Assert.assertFalse;
5+
import static org.junit.Assert.assertNotNull;
6+
import static org.junit.Assert.assertNull;
47
import static org.junit.Assert.assertTrue;
58
import static org.mockito.Mockito.mock;
69
import static org.mockito.Mockito.when;
710

811
import android.app.Activity;
12+
import android.content.ClipData;
913
import android.content.ClipboardManager;
14+
import android.content.ContentResolver;
1015
import android.content.Context;
16+
import android.media.RingtoneManager;
17+
import android.net.Uri;
1118
import android.view.View;
1219
import android.view.Window;
1320
import io.flutter.embedding.engine.systemchannels.PlatformChannel;
21+
import io.flutter.embedding.engine.systemchannels.PlatformChannel.ClipboardContentFormat;
22+
import java.io.ByteArrayInputStream;
23+
import java.io.IOException;
24+
import java.io.InputStream;
1425
import org.junit.Test;
1526
import org.junit.runner.RunWith;
1627
import org.robolectric.RobolectricTestRunner;
@@ -38,6 +49,45 @@ public void itIgnoresNewHapticEventsOnOldAndroidPlatforms() {
3849
platformPlugin.vibrateHapticFeedback(PlatformChannel.HapticFeedbackType.SELECTION_CLICK);
3950
}
4051

52+
@Config(sdk = 29)
53+
@Test
54+
public void platformPlugin_getClipboardData() throws IOException {
55+
ClipboardManager clipboardManager =
56+
RuntimeEnvironment.application.getSystemService(ClipboardManager.class);
57+
58+
View fakeDecorView = mock(View.class);
59+
Window fakeWindow = mock(Window.class);
60+
when(fakeWindow.getDecorView()).thenReturn(fakeDecorView);
61+
Activity fakeActivity = mock(Activity.class);
62+
when(fakeActivity.getWindow()).thenReturn(fakeWindow);
63+
when(fakeActivity.getSystemService(Context.CLIPBOARD_SERVICE)).thenReturn(clipboardManager);
64+
PlatformChannel fakePlatformChannel = mock(PlatformChannel.class);
65+
PlatformPlugin platformPlugin = new PlatformPlugin(fakeActivity, fakePlatformChannel);
66+
67+
ClipboardContentFormat clipboardFormat = ClipboardContentFormat.PLAIN_TEXT;
68+
assertNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat));
69+
ClipData clip = ClipData.newPlainText("label", "Text");
70+
clipboardManager.setPrimaryClip(clip);
71+
assertNotNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat));
72+
73+
ContentResolver contentResolver = RuntimeEnvironment.application.getContentResolver();
74+
Uri uri = Uri.parse("content://media/external_primary/images/media/");
75+
clip = ClipData.newUri(contentResolver, "URI", uri);
76+
clipboardManager.setPrimaryClip(clip);
77+
assertNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat));
78+
79+
uri =
80+
RingtoneManager.getActualDefaultRingtoneUri(
81+
RuntimeEnvironment.application.getApplicationContext(), RingtoneManager.TYPE_RINGTONE);
82+
clip = ClipData.newUri(contentResolver, "URI", uri);
83+
clipboardManager.setPrimaryClip(clip);
84+
String uriData =
85+
platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat).toString();
86+
InputStream uriInputStream = contentResolver.openInputStream(uri);
87+
InputStream dataInputStream = new ByteArrayInputStream(uriData.getBytes());
88+
assertEquals(dataInputStream.read(), uriInputStream.read());
89+
}
90+
4191
@Test
4292
public void platformPlugin_hasStrings() {
4393
ClipboardManager clipboardManager =

0 commit comments

Comments
 (0)