Marshal dream overlay connection logic with Handler.
This changelist ensures all activity on the dream overlay service
connection occurs on the same thread with the user of a Handler.
Fixed: 230269347
Test: atest DreamOverlayTest
Change-Id: If3485de7225a4220457d297527d6c358076368a4
diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java
index 6a9afdb..eca83e5 100644
--- a/core/java/android/service/dreams/DreamService.java
+++ b/core/java/android/service/dreams/DreamService.java
@@ -251,6 +251,8 @@
// A Queue of pending requests to execute on the overlay.
private final ArrayDeque<Consumer<IDreamOverlay>> mRequests;
+ private Handler mHandler = new Handler(Looper.getMainLooper());
+
private boolean mBound;
OverlayConnection() {
@@ -259,34 +261,40 @@
public void bind(Context context, @Nullable ComponentName overlayService,
ComponentName dreamService) {
- if (overlayService == null) {
- return;
- }
+ mHandler.post(() -> {
+ if (overlayService == null) {
+ return;
+ }
- final ServiceInfo serviceInfo = fetchServiceInfo(context, dreamService);
+ final ServiceInfo serviceInfo = fetchServiceInfo(context, dreamService);
- final Intent overlayIntent = new Intent();
- overlayIntent.setComponent(overlayService);
- overlayIntent.putExtra(EXTRA_SHOW_COMPLICATIONS,
- fetchShouldShowComplications(context, serviceInfo));
+ final Intent overlayIntent = new Intent();
+ overlayIntent.setComponent(overlayService);
+ overlayIntent.putExtra(EXTRA_SHOW_COMPLICATIONS,
+ fetchShouldShowComplications(context, serviceInfo));
- context.bindService(overlayIntent,
- this, Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE);
- mBound = true;
+ context.bindService(overlayIntent,
+ this, Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE);
+ mBound = true;
+ });
}
public void unbind(Context context) {
- if (!mBound) {
- return;
- }
+ mHandler.post(() -> {
+ if (!mBound) {
+ return;
+ }
- context.unbindService(this);
- mBound = false;
+ context.unbindService(this);
+ mBound = false;
+ });
}
public void request(Consumer<IDreamOverlay> request) {
- mRequests.push(request);
- evaluate();
+ mHandler.post(() -> {
+ mRequests.push(request);
+ evaluate();
+ });
}
private void evaluate() {
@@ -304,15 +312,19 @@
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
- // Store Overlay and execute pending requests.
- mOverlay = IDreamOverlay.Stub.asInterface(service);
- evaluate();
+ mHandler.post(() -> {
+ // Store Overlay and execute pending requests.
+ mOverlay = IDreamOverlay.Stub.asInterface(service);
+ evaluate();
+ });
}
@Override
public void onServiceDisconnected(ComponentName name) {
- // Clear Overlay binder to prevent further request processing.
- mOverlay = null;
+ mHandler.post(() -> {
+ // Clear Overlay binder to prevent further request processing.
+ mOverlay = null;
+ });
}
}