blob: 845fca1127dd1acd002e5e8c07f00c185e481bb6 [file] [log] [blame]
Yohei Yukawa25e08132016-06-22 16:31:41 -07001/*
2** Copyright 2016, The Android Open Source Project
3**
4** Licensed under the Apache License, Version 2.0 (the "License");
5** you may not use this file except in compliance with the License.
6** You may obtain a copy of the License at
7**
8** http://www.apache.org/licenses/LICENSE-2.0
9**
10** Unless required by applicable law or agreed to in writing, software
11** distributed under the License is distributed on an "AS IS" BASIS,
12** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13** See the License for the specific language governing permissions and
14** limitations under the License.
15*/
16
Yohei Yukawa603f4d02018-09-11 15:04:58 -070017package com.android.server.inputmethod;
Yohei Yukawa25e08132016-06-22 16:31:41 -070018
19import android.annotation.NonNull;
20import android.annotation.UserIdInt;
Wale Ogunwale6d50dcc2018-07-21 23:00:40 -070021import android.app.UriGrantsManager;
Yohei Yukawa25e08132016-06-22 16:31:41 -070022import android.content.Intent;
23import android.net.Uri;
24import android.os.Binder;
25import android.os.IBinder;
26import android.os.RemoteException;
27
28import com.android.internal.annotations.GuardedBy;
29import com.android.internal.inputmethod.IInputContentUriToken;
Yohei Yukawa603f4d02018-09-11 15:04:58 -070030import com.android.server.LocalServices;
Wale Ogunwale6d50dcc2018-07-21 23:00:40 -070031import com.android.server.uri.UriGrantsManagerInternal;
Yohei Yukawa25e08132016-06-22 16:31:41 -070032
33final class InputContentUriTokenHandler extends IInputContentUriToken.Stub {
34
35 @NonNull
36 private final Uri mUri;
37 private final int mSourceUid;
38 @NonNull
39 private final String mTargetPackage;
40 @UserIdInt
41 private final int mSourceUserId;
42 @UserIdInt
43 private final int mTargetUserId;
44
45 private final Object mLock = new Object();
46
47 @GuardedBy("mLock")
48 private IBinder mPermissionOwnerToken = null;
49
Yohei Yukawa79d1c752016-06-30 19:24:04 +000050 InputContentUriTokenHandler(@NonNull Uri contentUri, int sourceUid,
Yohei Yukawa25e08132016-06-22 16:31:41 -070051 @NonNull String targetPackage, @UserIdInt int sourceUserId,
52 @UserIdInt int targetUserId) {
53 mUri = contentUri;
54 mSourceUid = sourceUid;
55 mTargetPackage = targetPackage;
56 mSourceUserId = sourceUserId;
57 mTargetUserId = targetUserId;
Yohei Yukawa79d1c752016-06-30 19:24:04 +000058 }
59
60 @Override
61 public void take() {
62 synchronized (mLock) {
63 if (mPermissionOwnerToken != null) {
64 // Permission is already granted.
65 return;
66 }
67
Wale Ogunwale6d50dcc2018-07-21 23:00:40 -070068 mPermissionOwnerToken = LocalServices.getService(UriGrantsManagerInternal.class)
69 .newUriPermissionOwner("InputContentUriTokenHandler");
Yohei Yukawa79d1c752016-06-30 19:24:04 +000070
71 doTakeLocked(mPermissionOwnerToken);
72 }
73 }
74
75 private void doTakeLocked(@NonNull IBinder permissionOwner) {
76 long origId = Binder.clearCallingIdentity();
77 try {
78 try {
Wale Ogunwale6d50dcc2018-07-21 23:00:40 -070079 UriGrantsManager.getService().grantUriPermissionFromOwner(
Yohei Yukawa79d1c752016-06-30 19:24:04 +000080 permissionOwner, mSourceUid, mTargetPackage, mUri,
81 Intent.FLAG_GRANT_READ_URI_PERMISSION, mSourceUserId, mTargetUserId);
82 } catch (RemoteException e) {
83 e.rethrowFromSystemServer();
84 }
85 } finally {
86 Binder.restoreCallingIdentity(origId);
87 }
Yohei Yukawa25e08132016-06-22 16:31:41 -070088 }
89
90 @Override
91 public void release() {
92 synchronized (mLock) {
93 if (mPermissionOwnerToken == null) {
94 return;
95 }
96 try {
Wale Ogunwale6d50dcc2018-07-21 23:00:40 -070097 LocalServices.getService(UriGrantsManagerInternal.class)
98 .revokeUriPermissionFromOwner(mPermissionOwnerToken, mUri,
99 Intent.FLAG_GRANT_READ_URI_PERMISSION, mSourceUserId);
Yohei Yukawa25e08132016-06-22 16:31:41 -0700100 } finally {
101 mPermissionOwnerToken = null;
102 }
103 }
104 }
105
106 /**
107 * {@inheritDoc}
108 */
109 @Override
110 protected void finalize() throws Throwable {
111 try {
112 release();
113 } finally {
114 super.finalize();
115 }
116 }
117}