summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Mang <alexmang@google.com>2021-03-15 18:53:03 -0700
committerAlex Mang <alexmang@google.com>2021-03-18 11:17:54 -0700
commite1d8be7afe28da250e3e1c6efc541edd14c7dbe8 (patch)
tree5dd3f83267dc8cf06a5f074940c48a5f748ace40
parentf9ea6dbadacf82cb248f12fa117610ddd9ddf52b (diff)
Switch over RemoteCallbackList to handle callbacks.
Increases complexity, but given the limited # of apps a user has, this shouldn't be a big problem. Bug: 162609730 Tested: atest WhitelistTest, Manually on device Change-Id: I4504b7eb7b503a95d663c375f481c997022d23fe
-rw-r--r--services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java87
1 files changed, 16 insertions, 71 deletions
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
index f4a8ccd184e5..25ea12b1c341 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
@@ -58,6 +58,7 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.ParcelFileDescriptor;
+import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ShellCallback;
@@ -69,7 +70,6 @@ import android.provider.Settings;
import android.service.contentcapture.ActivityEvent.ActivityEventType;
import android.service.contentcapture.IDataShareCallback;
import android.service.contentcapture.IDataShareReadAdapter;
-import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.LocalLog;
import android.util.Pair;
@@ -174,6 +174,9 @@ public final class ContentCaptureManagerService extends
@GuardedBy("mLock")
private final Set<String> mPackagesWithShareRequests = new HashSet<>();
+ private final RemoteCallbackList<IContentCaptureOptionsCallback> mCallbacks =
+ new RemoteCallbackList<>();
+
final GlobalContentCaptureOptions mGlobalContentCaptureOptions =
new GlobalContentCaptureOptions();
@@ -497,16 +500,15 @@ public final class ContentCaptureManagerService extends
}
void updateOptions(String packageName, ContentCaptureOptions options) {
- ArraySet<CallbackRecord> records;
- synchronized (mLock) {
- records = mContentCaptureManagerServiceStub.mCallbacks.get(packageName);
- if (records != null) {
- int N = records.size();
- for (int i = 0; i < N; i++) {
- records.valueAt(i).setContentCaptureOptions(options);
+ mCallbacks.broadcast((callback, pkg) -> {
+ if (pkg.equals(packageName)) {
+ try {
+ callback.setContentCaptureOptions(options);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Unable to send setContentCaptureOptions(): " + e);
}
}
- }
+ });
}
private ActivityManagerInternal getAmInternal() {
@@ -616,8 +618,6 @@ public final class ContentCaptureManagerService extends
}
final class ContentCaptureManagerServiceStub extends IContentCaptureManager.Stub {
- @GuardedBy("mLock")
- private final ArrayMap<String, ArraySet<CallbackRecord>> mCallbacks = new ArrayMap<>();
@Override
public void startSession(@NonNull IBinder activityToken,
@@ -778,39 +778,19 @@ public final class ContentCaptureManagerService extends
IContentCaptureOptionsCallback callback) {
assertCalledByPackageOwner(packageName);
- CallbackRecord record = new CallbackRecord(callback, packageName);
- record.registerObserver();
-
- synchronized (mLock) {
- ArraySet<CallbackRecord> records = mCallbacks.get(packageName);
- if (records == null) {
- records = new ArraySet<>();
- }
- records.add(record);
- mCallbacks.put(packageName, records);
- }
+ mCallbacks.register(callback, packageName);
// Set options here in case it was updated before this was registered.
final int userId = UserHandle.getCallingUserId();
final ContentCaptureOptions options = mGlobalContentCaptureOptions.getOptions(userId,
packageName);
if (options != null) {
- record.setContentCaptureOptions(options);
- }
- }
-
- private void unregisterContentCaptureOptionsCallback(CallbackRecord record) {
- synchronized (mLock) {
- ArraySet<CallbackRecord> records = mCallbacks.get(record.mPackageName);
- if (records != null) {
- records.remove(record);
- }
-
- if (records == null || records.isEmpty()) {
- mCallbacks.remove(record.mPackageName);
+ try {
+ callback.setContentCaptureOptions(options);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Unable to send setContentCaptureOptions(): " + e);
}
}
- record.unregisterObserver();
}
@Override
@@ -1277,39 +1257,4 @@ public final class ContentCaptureManagerService extends
mDataShareRequest.getPackageName());
}
}
-
- private final class CallbackRecord implements IBinder.DeathRecipient {
- private final String mPackageName;
- private final IContentCaptureOptionsCallback mCallback;
-
- private CallbackRecord(IContentCaptureOptionsCallback callback, String packageName) {
- mCallback = callback;
- mPackageName = packageName;
- }
-
- private void setContentCaptureOptions(ContentCaptureOptions options) {
- try {
- mCallback.setContentCaptureOptions(options);
- } catch (RemoteException e) {
- Slog.w(TAG, "Unable to send setContentCaptureOptions(): " + e);
- }
- }
-
- private void registerObserver() {
- try {
- mCallback.asBinder().linkToDeath(this, 0);
- } catch (RemoteException e) {
- Slog.w(TAG, "Failed to register callback cleanup " + e);
- }
- }
-
- private void unregisterObserver() {
- mCallback.asBinder().unlinkToDeath(this, 0);
- }
-
- @Override
- public void binderDied() {
- mContentCaptureManagerServiceStub.unregisterContentCaptureOptionsCallback(this);
- }
- }
}