From bbb32865c8b0986bd224ac4b7e0fa09c31647346 Mon Sep 17 00:00:00 2001 From: zlshames Date: Sat, 15 Jan 2022 11:19:24 -0500 Subject: [PATCH 1/2] Adds contentCommitMimeTypes support --- .../engine/systemchannels/TextInputChannel.java | 17 +++++++++++++++++ .../flutter/plugin/editing/TextInputPlugin.java | 14 ++++---------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/shell/platform/android/io/flutter/embedding/engine/systemchannels/TextInputChannel.java b/shell/platform/android/io/flutter/embedding/engine/systemchannels/TextInputChannel.java index e2e3d34de2f66..2cb7d17032f28 100644 --- a/shell/platform/android/io/flutter/embedding/engine/systemchannels/TextInputChannel.java +++ b/shell/platform/android/io/flutter/embedding/engine/systemchannels/TextInputChannel.java @@ -16,6 +16,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Set; import org.json.JSONArray; @@ -459,6 +460,18 @@ public static Configuration fromJson(@NonNull JSONObject json) } } final Integer inputAction = inputActionFromTextInputAction(inputActionName); + + // Build list of content commit mime types from the passed in JSON list + List contentList = new ArrayList(); + JSONArray contentCommitMimeTypes = json.isNull("contentCommitMimeTypes") + ? null + : json.getJSONArray("contentCommitMimeTypes"); + if (contentCommitMimeTypes != null) { + for(int i = 0; i < contentCommitMimeTypes.length(); i++){ + contentList.add(contentCommitMimeTypes.optString(i)); + } + } + return new Configuration( json.optBoolean("obscureText"), json.optBoolean("autocorrect", true), @@ -470,6 +483,7 @@ public static Configuration fromJson(@NonNull JSONObject json) inputAction, json.isNull("actionLabel") ? null : json.getString("actionLabel"), json.isNull("autofill") ? null : Autofill.fromJson(json.getJSONObject("autofill")), + contentList.toArray(new String[contentList.size()]), fields); } @@ -626,6 +640,7 @@ public Autofill( @Nullable public final Integer inputAction; @Nullable public final String actionLabel; @Nullable public final Autofill autofill; + @Nullable public final String[] contentCommitMimeTypes; @Nullable public final Configuration[] fields; public Configuration( @@ -639,6 +654,7 @@ public Configuration( @Nullable Integer inputAction, @Nullable String actionLabel, @Nullable Autofill autofill, + @Nullable String[] contentCommitMimeTypes, @Nullable Configuration[] fields) { this.obscureText = obscureText; this.autocorrect = autocorrect; @@ -650,6 +666,7 @@ public Configuration( this.inputAction = inputAction; this.actionLabel = actionLabel; this.autofill = autofill; + this.contentCommitMimeTypes = contentCommitMimeTypes; this.fields = fields; } } diff --git a/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java b/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java index fbe23b8ae6f59..f6014bd353c34 100644 --- a/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java +++ b/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java @@ -340,16 +340,10 @@ public InputConnection createInputConnection( } outAttrs.imeOptions |= enterAction; - String[] imgTypeString = new String[] { - "image/png", - "image/bmp", - "image/jpg", - "image/tiff", - "image/gif", - "image/jpeg", - "image/webp" - }; - EditorInfoCompat.setContentMimeTypes(outAttrs, imgTypeString); + if (configuration.contentCommitMimeTypes != null) { + String[] imgTypeString = configuration.contentCommitMimeTypes; + EditorInfoCompat.setContentMimeTypes(outAttrs, imgTypeString); + } InputConnectionAdaptor connection = new InputConnectionAdaptor( From fa508254c8c3cb727145dac04ad763f8c1533743 Mon Sep 17 00:00:00 2001 From: zlshames Date: Sat, 15 Jan 2022 11:21:23 -0500 Subject: [PATCH 2/2] Formatting fixes --- .../systemchannels/TextInputChannel.java | 12 +++++---- .../editing/InputConnectionAdaptor.java | 25 +++++++++---------- .../editing/InputConnectionAdaptorTest.java | 4 +-- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/shell/platform/android/io/flutter/embedding/engine/systemchannels/TextInputChannel.java b/shell/platform/android/io/flutter/embedding/engine/systemchannels/TextInputChannel.java index 2cb7d17032f28..07c44d43e08c6 100644 --- a/shell/platform/android/io/flutter/embedding/engine/systemchannels/TextInputChannel.java +++ b/shell/platform/android/io/flutter/embedding/engine/systemchannels/TextInputChannel.java @@ -322,7 +322,8 @@ public void previous(int inputClientId) { public void commitContent(int inputClientId, Map content) { Log.v(TAG, "Sending 'commitContent' message."); channel.invokeMethod( - "TextInputClient.performAction", Arrays.asList(inputClientId, "TextInputAction.commitContent", content)); + "TextInputClient.performAction", + Arrays.asList(inputClientId, "TextInputAction.commitContent", content)); } /** Instructs Flutter to execute an "unspecified" action. */ @@ -463,11 +464,12 @@ public static Configuration fromJson(@NonNull JSONObject json) // Build list of content commit mime types from the passed in JSON list List contentList = new ArrayList(); - JSONArray contentCommitMimeTypes = json.isNull("contentCommitMimeTypes") - ? null - : json.getJSONArray("contentCommitMimeTypes"); + JSONArray contentCommitMimeTypes = + json.isNull("contentCommitMimeTypes") + ? null + : json.getJSONArray("contentCommitMimeTypes"); if (contentCommitMimeTypes != null) { - for(int i = 0; i < contentCommitMimeTypes.length(); i++){ + for (int i = 0; i < contentCommitMimeTypes.length(); i++) { contentList.add(contentCommitMimeTypes.optString(i)); } } diff --git a/shell/platform/android/io/flutter/plugin/editing/InputConnectionAdaptor.java b/shell/platform/android/io/flutter/plugin/editing/InputConnectionAdaptor.java index ff4d3c46ad108..fcca8535f0b5c 100644 --- a/shell/platform/android/io/flutter/plugin/editing/InputConnectionAdaptor.java +++ b/shell/platform/android/io/flutter/plugin/editing/InputConnectionAdaptor.java @@ -4,15 +4,10 @@ package io.flutter.plugin.editing; -import java.io.FileNotFoundException; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.util.Map; -import java.util.HashMap; - import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.text.DynamicLayout; @@ -28,17 +23,19 @@ import android.view.inputmethod.EditorInfo; import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedTextRequest; -import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputContentInfo; -import android.net.Uri; - -import androidx.core.view.inputmethod.InputConnectionCompat; +import android.view.inputmethod.InputMethodManager; import androidx.core.os.BuildCompat; - +import androidx.core.view.inputmethod.InputConnectionCompat; import io.flutter.Log; import io.flutter.embedding.android.KeyboardManager; import io.flutter.embedding.engine.FlutterJNI; import io.flutter.embedding.engine.systemchannels.TextInputChannel; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; class InputConnectionAdaptor extends BaseInputConnection implements ListenableEditingState.EditingStateWatcher { @@ -488,7 +485,8 @@ public boolean performEditorAction(int actionCode) { @Override public boolean commitContent(InputContentInfo inputContentInfo, int flags, Bundle opts) { // Ensure permission is granted - if (BuildCompat.isAtLeastNMR1() && (flags & InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0) { + if (BuildCompat.isAtLeastNMR1() + && (flags & InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0) { try { inputContentInfo.requestPermission(); } catch (Exception e) { @@ -537,7 +535,8 @@ public byte[] readStreamFully(InputStream is, int blocksize) { baos.write(buffer, 0, len); } return baos.toByteArray(); - } catch (Exception e) {} + } catch (Exception e) { + } return new byte[0]; } diff --git a/shell/platform/android/test/io/flutter/plugin/editing/InputConnectionAdaptorTest.java b/shell/platform/android/test/io/flutter/plugin/editing/InputConnectionAdaptorTest.java index 351dd034e4f9b..571ce2049305a 100644 --- a/shell/platform/android/test/io/flutter/plugin/editing/InputConnectionAdaptorTest.java +++ b/shell/platform/android/test/io/flutter/plugin/editing/InputConnectionAdaptorTest.java @@ -16,12 +16,11 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.view.inputmethod.InputContentInfo; -import android.net.Uri; import android.content.ClipDescription; import android.content.ClipboardManager; import android.content.Context; import android.content.res.AssetManager; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.text.InputType; @@ -34,6 +33,7 @@ import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.InputConnection; +import android.view.inputmethod.InputContentInfo; import android.view.inputmethod.InputMethodManager; import com.ibm.icu.lang.UCharacter; import com.ibm.icu.lang.UProperty;