From 25e0813e6eb6315b1016db805fa9b791b4ae5cc2 Mon Sep 17 00:00:00 2001 From: Yohei Yukawa Date: Wed, 22 Jun 2016 16:31:41 -0700 Subject: Add InputMethodService#exposeContent() This is a follow up CL to my previous CLs [1][2] that introduced InputConnection#commitContent(InputContentInfo, Bundle) API to enable IMEs to send a content to the target application. With this CL, IME developers are able to temporarily expose InputContentInfo object to the target package without permanently granting URI permission. Although calling IMS#exposeContent() is allowed only for the IME that is currently selected, the client is able to request a temporary read-only access even after the current IME is switched to any other IME as long as the client keeps InputContentInfo object. Here is a sample code snippet about how to use this mechanism. [IME] InputContentInfo contentInfo = new InputContentInfo( contentUri, new ClipDescription(description, new String[]{mimeType}), linkUrl); exposeContent(contentInfo, getCurrentInputEditorInfo()); getCurrentInputConnection().commitContent(inputContentInfo, null); [App] try { contentInfo.requestPermission(); // Load inputContentInfo.getContentUri() here. } finally { contentInfo.releasePermission(); } [1]: Iaadf934a997ffcd6000a516cc3c1873db56e60ad 152944f4909c47917473293b258d266435c6ab35 [2]: Ica1ba3154795c1bf44e140dfe639b299f83cd8af adebb52588b098a1af678d4e33a234ef1ce783b2 Bug: 29450031 Change-Id: I2772889ca01f2ecb2cdeed4e04a9319bdf7bc5a6 --- .../inputmethodservice/InputMethodService.java | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'core/java/android/inputmethodservice/InputMethodService.java') diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index 4799773d9ed6..8e0e0b0e4b9a 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -23,6 +23,7 @@ import android.annotation.CallSuper; import android.annotation.DrawableRes; import android.annotation.IntDef; import android.annotation.MainThread; +import android.annotation.NonNull; import android.app.ActivityManager; import android.app.Dialog; import android.content.Context; @@ -65,6 +66,7 @@ import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.InputBinding; import android.view.inputmethod.InputConnection; +import android.view.inputmethod.InputContentInfo; import android.view.inputmethod.InputMethod; import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodSubtype; @@ -2597,6 +2599,39 @@ public class InputMethodService extends AbstractInputMethodService { return mImm.getInputMethodWindowVisibleHeight(); } + /** + * Allow the receiver of {@link InputContentInfo} to obtain a temporary read-only access + * permission to the content. + * + *

Make sure that the content provider owning the Uri sets the + * {@link android.R.styleable#AndroidManifestProvider_grantUriPermissions + * grantUriPermissions} attribute in its manifest or included the + * {@link android.R.styleable#AndroidManifestGrantUriPermission + * <grant-uri-permissions>} tag. Otherwise {@link InputContentInfo#requestPermission()} + * can fail.

+ * + *

Although calling this API is allowed only for the IME that is currently selected, the + * client is able to request a temporary read-only access even after the current IME is switched + * to any other IME as long as the client keeps {@link InputContentInfo} object.

+ * + * @param inputContentInfo Content to be temporarily exposed from the input method to the + * application. + * This cannot be {@code null}. + * @param editorInfo The editor that receives {@link InputContentInfo}. + * @return {@code false} if we cannot allow a temporary access permission. + */ + public final boolean exposeContent(@NonNull InputContentInfo inputContentInfo, + @NonNull EditorInfo editorInfo) { + if (inputContentInfo == null) { + throw new NullPointerException("inputContentInfo"); + } + if (editorInfo == null) { + throw new NullPointerException("editorInfo"); + } + + return mImm.exposeContent(mToken, inputContentInfo, editorInfo); + } + /** * Performs a dump of the InputMethodService's internal state. Override * to add your own information to the dump. -- cgit v1.2.3