diff options
| author | 2016-06-30 19:37:35 +0000 | |
|---|---|---|
| committer | 2016-06-30 19:37:35 +0000 | |
| commit | 359acdee5faff503b2a859e8747aabe8fcbec350 (patch) | |
| tree | 14c4b6dec1a53c4c8d2c3454db53ace48b17a520 | |
| parent | 4414412d50ff05ae2c875fcbb546e79674cef8f8 (diff) | |
| parent | 8acb1a7570f797b387f08af166085008291d4d4b (diff) | |
Merge \"Revert \"Remove InputContentInfo#requestPermission()\"\" into nyc-mr1-dev
am: 8acb1a7570
Change-Id: If7fab0527a3d4f671985a663fc6aaf808d527ace
| -rw-r--r-- | api/current.txt | 1 | ||||
| -rw-r--r-- | api/system-current.txt | 1 | ||||
| -rw-r--r-- | api/test-current.txt | 1 | ||||
| -rw-r--r-- | core/java/android/view/inputmethod/InputConnection.java | 9 | ||||
| -rw-r--r-- | core/java/android/view/inputmethod/InputContentInfo.java | 16 | ||||
| -rw-r--r-- | core/java/com/android/internal/inputmethod/IInputContentUriToken.aidl | 1 | ||||
| -rw-r--r-- | core/java/com/android/internal/view/InputConnectionWrapper.java | 10 | ||||
| -rw-r--r-- | services/core/java/com/android/server/InputContentUriTokenHandler.java | 58 | ||||
| -rw-r--r-- | services/core/java/com/android/server/InputMethodManagerService.java | 2 |
9 files changed, 60 insertions, 39 deletions
diff --git a/api/current.txt b/api/current.txt index 45bfc3ffd99f..cffdb5d928f8 100644 --- a/api/current.txt +++ b/api/current.txt @@ -44923,6 +44923,7 @@ package android.view.inputmethod { method public android.content.ClipDescription getDescription(); method public android.net.Uri getLinkUri(); method public void releasePermission(); + method public void requestPermission(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.view.inputmethod.InputContentInfo> CREATOR; } diff --git a/api/system-current.txt b/api/system-current.txt index 4dd210a5bf0a..ac31444c8ddb 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -48091,6 +48091,7 @@ package android.view.inputmethod { method public android.content.ClipDescription getDescription(); method public android.net.Uri getLinkUri(); method public void releasePermission(); + method public void requestPermission(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.view.inputmethod.InputContentInfo> CREATOR; } diff --git a/api/test-current.txt b/api/test-current.txt index a85536245f7f..8011435cf8ce 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -45003,6 +45003,7 @@ package android.view.inputmethod { method public android.content.ClipDescription getDescription(); method public android.net.Uri getLinkUri(); method public void releasePermission(); + method public void requestPermission(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.view.inputmethod.InputContentInfo> CREATOR; } diff --git a/core/java/android/view/inputmethod/InputConnection.java b/core/java/android/view/inputmethod/InputConnection.java index ecfcbc5ee2fa..07910b60df3f 100644 --- a/core/java/android/view/inputmethod/InputConnection.java +++ b/core/java/android/view/inputmethod/InputConnection.java @@ -840,16 +840,15 @@ public interface InputConnection { public void closeConnection(); /** - * When this flag is used in {@link #commitContent(InputContentInfo, int, Bundle)}, the editor - * will be able to request read access to the content URI contained in the - * {@link InputContentInfo} object. + * When this flag is used, the editor will be able to request read access to the content URI + * contained in the {@link InputContentInfo} object. * * <p>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 #commitContent(InputContentInfo, int, Bundle)} can fail.</p> + * <grant-uri-permissions>} tag. Otherwise {@link InputContentInfo#requestPermission()} + * can fail.</p> * * <p>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 diff --git a/core/java/android/view/inputmethod/InputContentInfo.java b/core/java/android/view/inputmethod/InputContentInfo.java index df206432ed7a..9579bbf32835 100644 --- a/core/java/android/view/inputmethod/InputContentInfo.java +++ b/core/java/android/view/inputmethod/InputContentInfo.java @@ -163,6 +163,22 @@ public final class InputContentInfo implements Parcelable { } /** + * Requests a temporary read-only access permission for content URI associated with this object. + * + * <p>Does nothing if the temporary permission is already granted.</p> + */ + public void requestPermission() { + if (mUriToken == null) { + return; + } + try { + mUriToken.take(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } + + /** * Releases a temporary read-only access permission for content URI associated with this object. * * <p>Does nothing if the temporary permission is not granted.</p> diff --git a/core/java/com/android/internal/inputmethod/IInputContentUriToken.aidl b/core/java/com/android/internal/inputmethod/IInputContentUriToken.aidl index c259348072c0..8abc8074b5ac 100644 --- a/core/java/com/android/internal/inputmethod/IInputContentUriToken.aidl +++ b/core/java/com/android/internal/inputmethod/IInputContentUriToken.aidl @@ -22,5 +22,6 @@ import android.os.IBinder; * {@hide} */ interface IInputContentUriToken { + void take(); void release(); } diff --git a/core/java/com/android/internal/view/InputConnectionWrapper.java b/core/java/com/android/internal/view/InputConnectionWrapper.java index 15422b64b717..9a09dcccd1a7 100644 --- a/core/java/com/android/internal/view/InputConnectionWrapper.java +++ b/core/java/com/android/internal/view/InputConnectionWrapper.java @@ -517,22 +517,20 @@ public class InputConnectionWrapper implements InputConnection { public boolean commitContent(InputContentInfo inputContentInfo, int flags, Bundle opts) { boolean result = false; - final boolean grantUriPermission = - (flags & InputConnection.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0; if (isMethodMissing(MissingMethodFlags.COMMIT_CONTENT)) { // This method is not implemented. return false; } try { - if (grantUriPermission) { + if ((flags & InputConnection.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0) { final AbstractInputMethodService inputMethodService = mInputMethodService.get(); if (inputMethodService == null) { // This basically should not happen, because it's the the caller of this method. return false; } - // Temporarily grant URI permission. inputMethodService.exposeContent(inputContentInfo, this); } + InputContextCallback callback = InputContextCallback.getInstance(); mIInputContext.commitContent(inputContentInfo, flags, opts, callback.mSeq, callback); synchronized (callback) { @@ -542,10 +540,6 @@ public class InputConnectionWrapper implements InputConnection { } } callback.dispose(); - // If this request is not handled, then there is no reason to keep the URI permission. - if (grantUriPermission && !result) { - inputContentInfo.releasePermission(); - } } catch (RemoteException e) { return false; } diff --git a/services/core/java/com/android/server/InputContentUriTokenHandler.java b/services/core/java/com/android/server/InputContentUriTokenHandler.java index 12e1d627df1a..3f4972babf6e 100644 --- a/services/core/java/com/android/server/InputContentUriTokenHandler.java +++ b/services/core/java/com/android/server/InputContentUriTokenHandler.java @@ -45,40 +45,48 @@ final class InputContentUriTokenHandler extends IInputContentUriToken.Stub { @GuardedBy("mLock") private IBinder mPermissionOwnerToken = null; - static InputContentUriTokenHandler create(@NonNull Uri contentUri, int sourceUid, + InputContentUriTokenHandler(@NonNull Uri contentUri, int sourceUid, @NonNull String targetPackage, @UserIdInt int sourceUserId, @UserIdInt int targetUserId) { - final IBinder permissionOwner; - try { - permissionOwner = ActivityManagerNative.getDefault() - .newUriPermissionOwner("InputContentUriTokenHandler"); - } catch (RemoteException e) { - return null; + mUri = contentUri; + mSourceUid = sourceUid; + mTargetPackage = targetPackage; + mSourceUserId = sourceUserId; + mTargetUserId = targetUserId; + } + + @Override + public void take() { + synchronized (mLock) { + if (mPermissionOwnerToken != null) { + // Permission is already granted. + return; + } + + try { + mPermissionOwnerToken = ActivityManagerNative.getDefault() + .newUriPermissionOwner("InputContentUriTokenHandler"); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + + doTakeLocked(mPermissionOwnerToken); } + } + private void doTakeLocked(@NonNull IBinder permissionOwner) { long origId = Binder.clearCallingIdentity(); try { - ActivityManagerNative.getDefault().grantUriPermissionFromOwner( - permissionOwner, sourceUserId, targetPackage, contentUri, - Intent.FLAG_GRANT_READ_URI_PERMISSION, sourceUserId, targetUserId); - } catch (RemoteException e) { - return null; + try { + ActivityManagerNative.getDefault().grantUriPermissionFromOwner( + permissionOwner, mSourceUid, mTargetPackage, mUri, + Intent.FLAG_GRANT_READ_URI_PERMISSION, mSourceUserId, mTargetUserId); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } } finally { Binder.restoreCallingIdentity(origId); } - return new InputContentUriTokenHandler(contentUri, sourceUid, targetPackage, sourceUserId, - targetUserId, permissionOwner); - } - - private InputContentUriTokenHandler(@NonNull Uri contentUri, int sourceUid, - @NonNull String targetPackage, @UserIdInt int sourceUserId, - @UserIdInt int targetUserId, @NonNull IBinder permissionOwnerToken) { - mUri = contentUri; - mSourceUid = sourceUid; - mTargetPackage = targetPackage; - mSourceUserId = sourceUserId; - mTargetUserId = targetUserId; - mPermissionOwnerToken = permissionOwnerToken; } @Override diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java index 2c228291e384..e0d89f2fe6d3 100644 --- a/services/core/java/com/android/server/InputMethodManagerService.java +++ b/services/core/java/com/android/server/InputMethodManagerService.java @@ -3953,7 +3953,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } final int imeUserId = UserHandle.getUserId(uid); final int appUserId = UserHandle.getUserId(mCurClient.uid); - return InputContentUriTokenHandler.create(contentUri, uid, packageName, imeUserId, + return new InputContentUriTokenHandler(contentUri, uid, packageName, imeUserId, appUserId); } } |