diff --git a/core/java/android/view/inputmethod/InputContentInfo.java b/core/java/android/view/inputmethod/InputContentInfo.java index 9579bbf328355..b39705e0b1fa6 100644 --- a/core/java/android/view/inputmethod/InputContentInfo.java +++ b/core/java/android/view/inputmethod/InputContentInfo.java @@ -191,8 +191,6 @@ public final class InputContentInfo implements Parcelable { mUriToken.release(); } catch (RemoteException e) { e.rethrowFromSystemServer(); - } finally { - mUriToken = null; } } diff --git a/core/java/com/android/internal/view/IInputConnectionWrapper.java b/core/java/com/android/internal/view/IInputConnectionWrapper.java index 62e34a6780fc8..644c7e90f8b02 100644 --- a/core/java/com/android/internal/view/IInputConnectionWrapper.java +++ b/core/java/com/android/internal/view/IInputConnectionWrapper.java @@ -562,6 +562,8 @@ public abstract class IInputConnectionWrapper extends IInputContext.Stub { } case DO_COMMIT_CONTENT: { final int flags = msg.arg1; + final boolean grantUriPermission = + (flags & InputConnection.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0; SomeArgs args = (SomeArgs) msg.obj; try { InputConnection ic = getInputConnection(); @@ -577,9 +579,17 @@ public abstract class IInputConnectionWrapper extends IInputContext.Stub { args.callback.setCommitContentResult(false, args.seq); return; } - args.callback.setCommitContentResult( - ic.commitContent(inputContentInfo, flags, (Bundle) args.arg2), - args.seq); + if (grantUriPermission) { + inputContentInfo.requestPermission(); + } + final boolean result = + ic.commitContent(inputContentInfo, flags, (Bundle) args.arg2); + // If this request is not handled, then there is no reason to keep the URI + // permission. + if (grantUriPermission && !result) { + inputContentInfo.releasePermission(); + } + args.callback.setCommitContentResult(result, args.seq); } catch (RemoteException e) { Log.w(TAG, "Got RemoteException calling commitContent", e); }