From 949afed4324118662b06a6d9843e448af5d51f4a Mon Sep 17 00:00:00 2001 From: Gray Mackall Date: Wed, 8 Nov 2023 11:09:58 -0800 Subject: [PATCH 01/11] fix lint regarding unclosed file descriptor --- .../io/flutter/plugin/platform/PlatformPlugin.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java b/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java index 41ffa23853c7c..5898f95a12d5d 100644 --- a/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java +++ b/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java @@ -25,6 +25,7 @@ import io.flutter.Log; import io.flutter.embedding.engine.systemchannels.PlatformChannel; import java.io.FileNotFoundException; +import java.io.IOException; import java.util.List; /** Android implementation of the platform plugin. */ @@ -517,9 +518,12 @@ private CharSequence getClipboardData(PlatformChannel.ClipboardContentFormat for if (clip == null) return null; if (format == null || format == PlatformChannel.ClipboardContentFormat.PLAIN_TEXT) { ClipData.Item item = clip.getItemAt(0); + AssetFileDescriptor assetFileDescriptor = null; if (item.getUri() != null) - activity.getContentResolver().openTypedAssetFileDescriptor(item.getUri(), "text/*", null); - return item.coerceToText(activity); + assetFileDescriptor = activity.getContentResolver().openTypedAssetFileDescriptor(item.getUri(), "text/*", null); + CharSequence charSequence = item.coerceToText(activity); + if (assetFileDescriptor != null) assetFileDescriptor.close(); + return charSequence; } } catch (SecurityException e) { Log.w( @@ -531,6 +535,9 @@ private CharSequence getClipboardData(PlatformChannel.ClipboardContentFormat for return null; } catch (FileNotFoundException e) { return null; + } catch (IOException e) { + Log.w(TAG, "Failed to close AssetFileDescriptor while accessing clipboard data.", e); + return null; } return null; From 01b30bf4cf8919f36abc1d8d29d0568404a240d2 Mon Sep 17 00:00:00 2001 From: Gray Mackall Date: Wed, 8 Nov 2023 11:10:24 -0800 Subject: [PATCH 02/11] format --- .../android/io/flutter/plugin/platform/PlatformPlugin.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java b/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java index 5898f95a12d5d..21d4f93d33888 100644 --- a/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java +++ b/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java @@ -520,7 +520,10 @@ private CharSequence getClipboardData(PlatformChannel.ClipboardContentFormat for ClipData.Item item = clip.getItemAt(0); AssetFileDescriptor assetFileDescriptor = null; if (item.getUri() != null) - assetFileDescriptor = activity.getContentResolver().openTypedAssetFileDescriptor(item.getUri(), "text/*", null); + assetFileDescriptor = + activity + .getContentResolver() + .openTypedAssetFileDescriptor(item.getUri(), "text/*", null); CharSequence charSequence = item.coerceToText(activity); if (assetFileDescriptor != null) assetFileDescriptor.close(); return charSequence; From c14d85367b206f02b5f657c768dded3fa425a34f Mon Sep 17 00:00:00 2001 From: Gray Mackall Date: Wed, 8 Nov 2023 11:28:38 -0800 Subject: [PATCH 03/11] add missing import --- .../android/io/flutter/plugin/platform/PlatformPlugin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java b/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java index 21d4f93d33888..0083db9ff389b 100644 --- a/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java +++ b/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java @@ -11,6 +11,7 @@ import android.content.ClipDescription; import android.content.ClipboardManager; import android.content.Context; +import android.content.res.AssetFileDescriptor; import android.os.Build; import android.view.HapticFeedbackConstants; import android.view.SoundEffectConstants; From 5c838eb9602e2e8dc0fca61a449ce664f77a9575 Mon Sep 17 00:00:00 2001 From: Gray Mackall Date: Wed, 8 Nov 2023 12:21:09 -0800 Subject: [PATCH 04/11] still return charsequence if we fail to close fd --- .../android/io/flutter/plugin/platform/PlatformPlugin.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java b/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java index 0083db9ff389b..c3c14dff25213 100644 --- a/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java +++ b/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java @@ -514,6 +514,7 @@ private CharSequence getClipboardData(PlatformChannel.ClipboardContentFormat for if (!clipboard.hasPrimaryClip()) return null; + CharSequence charSequence = null; try { ClipData clip = clipboard.getPrimaryClip(); if (clip == null) return null; @@ -525,7 +526,7 @@ private CharSequence getClipboardData(PlatformChannel.ClipboardContentFormat for activity .getContentResolver() .openTypedAssetFileDescriptor(item.getUri(), "text/*", null); - CharSequence charSequence = item.coerceToText(activity); + charSequence = item.coerceToText(activity); if (assetFileDescriptor != null) assetFileDescriptor.close(); return charSequence; } @@ -541,7 +542,7 @@ private CharSequence getClipboardData(PlatformChannel.ClipboardContentFormat for return null; } catch (IOException e) { Log.w(TAG, "Failed to close AssetFileDescriptor while accessing clipboard data.", e); - return null; + return charSequence; } return null; From c08f1d3afe1877d930386cc613e5986e6078b0df Mon Sep 17 00:00:00 2001 From: Gray Mackall Date: Wed, 8 Nov 2023 13:28:27 -0800 Subject: [PATCH 05/11] add a test that we still succeed when the file descriptor fails to close --- .../plugin/platform/PlatformPluginTest.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java index 3a77e6ae68cc1..8ea834e14262a 100644 --- a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java +++ b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java @@ -11,6 +11,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.anyBoolean; +import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -98,6 +99,37 @@ public void platformPlugin_getClipboardData() throws IOException { assertNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); } + @Config(sdk = 29) + @Test + public void platformPlugin_getClipboardDataSucceedsOnFileDescriptorIOException() throws IOException { + ClipboardManager clipboardManager = ctx.getSystemService(ClipboardManager.class); + + View fakeDecorView = mock(View.class); + Window fakeWindow = mock(Window.class); + when(fakeWindow.getDecorView()).thenReturn(fakeDecorView); + Activity fakeActivity = mock(Activity.class); + when(fakeActivity.getWindow()).thenReturn(fakeWindow); + when(fakeActivity.getSystemService(Context.CLIPBOARD_SERVICE)).thenReturn(clipboardManager); + PlatformChannel fakePlatformChannel = mock(PlatformChannel.class); + PlatformPlugin platformPlugin = new PlatformPlugin(fakeActivity, fakePlatformChannel); + + ClipboardContentFormat clipboardFormat = ClipboardContentFormat.PLAIN_TEXT; + assertNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); + ClipData clip = ClipData.newPlainText("label", "Text"); + clipboardManager.setPrimaryClip(clip); + assertNotNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); + + Uri uri = Uri.parse("content://media/external_primary/images/media/"); + clip = ClipData.newUri(contentResolver, "URI", uri); + clipboardManager.setPrimaryClip(clip); + ContentResolver fakeContentResolver = mock(ContentResolver.class); + AssetFileDescriptor fakeAssetFileDescriptor = mock(AssetFileDescriptor.class); + when(fakeActivity.getContentResolver()).thenReturn(fakeContentResolver); + when(fakeContentResolver.openTypedAssetFileDescriptor(uri, anyString(), null)).thenReturn(fakeAssetFileDescriptor); + when(fakeAssetFileDescriptor.close()).thenThrow(IOException); + assertNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); + } + @SuppressWarnings("deprecation") // ClipboardManager.getText @Config(sdk = 28) From 2d00337f2b27dc798887b7c334ce8441904f1a1f Mon Sep 17 00:00:00 2001 From: Gray Mackall Date: Wed, 8 Nov 2023 13:28:47 -0800 Subject: [PATCH 06/11] format --- .../test/io/flutter/plugin/platform/PlatformPluginTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java index 8ea834e14262a..5d13441371718 100644 --- a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java +++ b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java @@ -101,7 +101,8 @@ public void platformPlugin_getClipboardData() throws IOException { @Config(sdk = 29) @Test - public void platformPlugin_getClipboardDataSucceedsOnFileDescriptorIOException() throws IOException { + public void platformPlugin_getClipboardDataSucceedsOnFileDescriptorIOException() + throws IOException { ClipboardManager clipboardManager = ctx.getSystemService(ClipboardManager.class); View fakeDecorView = mock(View.class); @@ -125,7 +126,8 @@ public void platformPlugin_getClipboardDataSucceedsOnFileDescriptorIOException() ContentResolver fakeContentResolver = mock(ContentResolver.class); AssetFileDescriptor fakeAssetFileDescriptor = mock(AssetFileDescriptor.class); when(fakeActivity.getContentResolver()).thenReturn(fakeContentResolver); - when(fakeContentResolver.openTypedAssetFileDescriptor(uri, anyString(), null)).thenReturn(fakeAssetFileDescriptor); + when(fakeContentResolver.openTypedAssetFileDescriptor(uri, anyString(), null)) + .thenReturn(fakeAssetFileDescriptor); when(fakeAssetFileDescriptor.close()).thenThrow(IOException); assertNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); } From bb17dae9a1b213140374284fedc824f6c1b13a35 Mon Sep 17 00:00:00 2001 From: Gray Mackall Date: Wed, 8 Nov 2023 14:33:54 -0800 Subject: [PATCH 07/11] fix test? --- .../io/flutter/plugin/platform/PlatformPluginTest.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java index 5d13441371718..bc9561e9908da 100644 --- a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java +++ b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java @@ -24,6 +24,7 @@ import android.content.ClipboardManager; import android.content.ContentResolver; import android.content.Context; +import android.content.res.AssetFileDescriptor; import android.net.Uri; import android.os.Build; import android.view.View; @@ -120,15 +121,15 @@ public void platformPlugin_getClipboardDataSucceedsOnFileDescriptorIOException() clipboardManager.setPrimaryClip(clip); assertNotNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); + ContentResolver contentResolver = spy(ctx.getContentResolver()); Uri uri = Uri.parse("content://media/external_primary/images/media/"); clip = ClipData.newUri(contentResolver, "URI", uri); clipboardManager.setPrimaryClip(clip); - ContentResolver fakeContentResolver = mock(ContentResolver.class); AssetFileDescriptor fakeAssetFileDescriptor = mock(AssetFileDescriptor.class); - when(fakeActivity.getContentResolver()).thenReturn(fakeContentResolver); - when(fakeContentResolver.openTypedAssetFileDescriptor(uri, anyString(), null)) + when(fakeActivity.getContentResolver()).thenReturn(contentResolver); + when(contentResolver.openTypedAssetFileDescriptor(uri, anyString(), null)) .thenReturn(fakeAssetFileDescriptor); - when(fakeAssetFileDescriptor.close()).thenThrow(IOException); + when(fakeAssetFileDescriptor.close()).thenThrow(IOException.class); assertNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); } From 74b140fca48b0ff2f7e0d97990d04be7a47f6495 Mon Sep 17 00:00:00 2001 From: Gray Mackall Date: Thu, 9 Nov 2023 14:35:56 -0800 Subject: [PATCH 08/11] wip --- .../plugin/platform/PlatformPluginTest.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java index bc9561e9908da..82f867db6982a 100644 --- a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java +++ b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java @@ -12,6 +12,8 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.anyBoolean; import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -86,18 +88,28 @@ public void platformPlugin_getClipboardData() throws IOException { PlatformChannel fakePlatformChannel = mock(PlatformChannel.class); PlatformPlugin platformPlugin = new PlatformPlugin(fakeActivity, fakePlatformChannel); + // Successfully get the contents of the primary clip when they contain text. ClipboardContentFormat clipboardFormat = ClipboardContentFormat.PLAIN_TEXT; assertNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); ClipData clip = ClipData.newPlainText("label", "Text"); clipboardManager.setPrimaryClip(clip); assertNotNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); - ContentResolver contentResolver = ctx.getContentResolver(); + // Return null when the primary clip contains non-text media. + ContentResolver contentResolver = spy(ctx.getContentResolver()); when(fakeActivity.getContentResolver()).thenReturn(contentResolver); Uri uri = Uri.parse("content://media/external_primary/images/media/"); clip = ClipData.newUri(contentResolver, "URI", uri); clipboardManager.setPrimaryClip(clip); assertNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); + + // Still return text when the AssetFileDescriptor throws an IOException. + when(fakeActivity.getContentResolver()).thenReturn(contentResolver); + Uri textUri = Uri.parse("content://text/"); + when(contentResolver.getType(eq(textUri))).thenReturn("text/plain"); + clip = ClipData.newUri(contentResolver, "URI", uri); + clipboardManager.setPrimaryClip(clip); + assertNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); } @Config(sdk = 29) @@ -127,9 +139,10 @@ public void platformPlugin_getClipboardDataSucceedsOnFileDescriptorIOException() clipboardManager.setPrimaryClip(clip); AssetFileDescriptor fakeAssetFileDescriptor = mock(AssetFileDescriptor.class); when(fakeActivity.getContentResolver()).thenReturn(contentResolver); - when(contentResolver.openTypedAssetFileDescriptor(uri, anyString(), null)) + when(contentResolver.openTypedAssetFileDescriptor(eq(uri), anyString(), eq(null))) .thenReturn(fakeAssetFileDescriptor); - when(fakeAssetFileDescriptor.close()).thenThrow(IOException.class); + //when(fakeAssetFileDescriptor.close()).thenThrow(IOException.class); + doThrow(new IOException()).when(fakeAssetFileDescriptor).close(); assertNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); } From 3ad12e9c3c8c03c01bca2e84f620d335a2987870 Mon Sep 17 00:00:00 2001 From: Gray Mackall Date: Tue, 28 Nov 2023 15:03:17 -0800 Subject: [PATCH 09/11] actually make the test work for real this time --- .../plugin/platform/PlatformPluginTest.java | 47 ++++--------------- 1 file changed, 10 insertions(+), 37 deletions(-) diff --git a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java index fb65946a24979..ac75f506b5978 100644 --- a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java +++ b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java @@ -12,6 +12,7 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.anyBoolean; import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; @@ -23,6 +24,8 @@ import android.app.Activity; import android.content.ClipData; +import android.content.ClipData.Item; +import android.content.ClipDescription; import android.content.ClipboardManager; import android.content.ContentResolver; import android.content.Context; @@ -105,45 +108,15 @@ public void platformPlugin_getClipboardData() throws IOException { // Still return text when the AssetFileDescriptor throws an IOException. when(fakeActivity.getContentResolver()).thenReturn(contentResolver); - Uri textUri = Uri.parse("content://text/"); - when(contentResolver.getType(eq(textUri))).thenReturn("text/plain"); - clip = ClipData.newUri(contentResolver, "URI", uri); - clipboardManager.setPrimaryClip(clip); - assertNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); - } - - @Config(sdk = 29) - @Test - public void platformPlugin_getClipboardDataSucceedsOnFileDescriptorIOException() - throws IOException { - ClipboardManager clipboardManager = ctx.getSystemService(ClipboardManager.class); - - View fakeDecorView = mock(View.class); - Window fakeWindow = mock(Window.class); - when(fakeWindow.getDecorView()).thenReturn(fakeDecorView); - Activity fakeActivity = mock(Activity.class); - when(fakeActivity.getWindow()).thenReturn(fakeWindow); - when(fakeActivity.getSystemService(Context.CLIPBOARD_SERVICE)).thenReturn(clipboardManager); - PlatformChannel fakePlatformChannel = mock(PlatformChannel.class); - PlatformPlugin platformPlugin = new PlatformPlugin(fakeActivity, fakePlatformChannel); - - ClipboardContentFormat clipboardFormat = ClipboardContentFormat.PLAIN_TEXT; - assertNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); - ClipData clip = ClipData.newPlainText("label", "Text"); - clipboardManager.setPrimaryClip(clip); - assertNotNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); - - ContentResolver contentResolver = spy(ctx.getContentResolver()); - Uri uri = Uri.parse("content://media/external_primary/images/media/"); - clip = ClipData.newUri(contentResolver, "URI", uri); - clipboardManager.setPrimaryClip(clip); + ClipDescription clipDescription = new ClipDescription("label", new String[] {ClipDescription.MIMETYPE_TEXT_PLAIN, ClipDescription.MIMETYPE_TEXT_URILIST}); + ClipData.Item clipDataItem = new ClipData.Item("Text", null, uri); + ClipData clipData = new ClipData(clipDescription, clipDataItem); + clipboardManager.setPrimaryClip(clipData); AssetFileDescriptor fakeAssetFileDescriptor = mock(AssetFileDescriptor.class); - when(fakeActivity.getContentResolver()).thenReturn(contentResolver); - when(contentResolver.openTypedAssetFileDescriptor(eq(uri), anyString(), eq(null))) - .thenReturn(fakeAssetFileDescriptor); - //when(fakeAssetFileDescriptor.close()).thenThrow(IOException.class); + doReturn(fakeAssetFileDescriptor).when(contentResolver).openTypedAssetFileDescriptor(eq(uri), anyString(), eq(null)); doThrow(new IOException()).when(fakeAssetFileDescriptor).close(); - assertNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); + assertNotNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); + verify(fakeAssetFileDescriptor).close(); } @SuppressWarnings("deprecation") From e80a7f2351f358cff450ba4ee36d140dbcc69ffa Mon Sep 17 00:00:00 2001 From: Gray Mackall Date: Tue, 28 Nov 2023 15:19:49 -0800 Subject: [PATCH 10/11] format --- .../flutter/plugin/platform/PlatformPluginTest.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java index ac75f506b5978..51e66c91db30b 100644 --- a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java +++ b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java @@ -24,7 +24,6 @@ import android.app.Activity; import android.content.ClipData; -import android.content.ClipData.Item; import android.content.ClipDescription; import android.content.ClipboardManager; import android.content.ContentResolver; @@ -108,12 +107,19 @@ public void platformPlugin_getClipboardData() throws IOException { // Still return text when the AssetFileDescriptor throws an IOException. when(fakeActivity.getContentResolver()).thenReturn(contentResolver); - ClipDescription clipDescription = new ClipDescription("label", new String[] {ClipDescription.MIMETYPE_TEXT_PLAIN, ClipDescription.MIMETYPE_TEXT_URILIST}); + ClipDescription clipDescription = + new ClipDescription( + "label", + new String[] { + ClipDescription.MIMETYPE_TEXT_PLAIN, ClipDescription.MIMETYPE_TEXT_URILIST + }); ClipData.Item clipDataItem = new ClipData.Item("Text", null, uri); ClipData clipData = new ClipData(clipDescription, clipDataItem); clipboardManager.setPrimaryClip(clipData); AssetFileDescriptor fakeAssetFileDescriptor = mock(AssetFileDescriptor.class); - doReturn(fakeAssetFileDescriptor).when(contentResolver).openTypedAssetFileDescriptor(eq(uri), anyString(), eq(null)); + doReturn(fakeAssetFileDescriptor) + .when(contentResolver) + .openTypedAssetFileDescriptor(eq(uri), anyString(), eq(null)); doThrow(new IOException()).when(fakeAssetFileDescriptor).close(); assertNotNull(platformPlugin.mPlatformMessageHandler.getClipboardData(clipboardFormat)); verify(fakeAssetFileDescriptor).close(); From 3580c7bd91852fe9a9150f6589c8f85510fc1f0d Mon Sep 17 00:00:00 2001 From: Gray Mackall Date: Tue, 28 Nov 2023 15:50:20 -0800 Subject: [PATCH 11/11] remove the lint from the baseline, as it is fixed --- tools/android_lint/baseline.xml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/tools/android_lint/baseline.xml b/tools/android_lint/baseline.xml index b540917bd520e..2fccb83d76cf3 100644 --- a/tools/android_lint/baseline.xml +++ b/tools/android_lint/baseline.xml @@ -67,17 +67,6 @@ column="82"/> - - - -