summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Santiago Seifert <aquilescanta@google.com> 2025-01-14 08:56:35 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-01-14 08:56:35 -0800
commit2368dd45b4bb20008fa85dda12657ddad2cbd089 (patch)
treecc93ed1bbc8f568161c02f808ef88097b3836e6d
parent4e362be1b980033624ee419f84f638581a19b64d (diff)
parentc614f4b4b272c899e6d5520282bddc7c68160ab3 (diff)
Merge "Move calls to RemoteDisplayProviderProxy out of the main thread" into main
-rw-r--r--services/core/java/com/android/server/media/RemoteDisplayProviderProxy.java49
-rw-r--r--services/core/java/com/android/server/media/RemoteDisplayProviderWatcher.java8
2 files changed, 38 insertions, 19 deletions
diff --git a/services/core/java/com/android/server/media/RemoteDisplayProviderProxy.java b/services/core/java/com/android/server/media/RemoteDisplayProviderProxy.java
index ba98a0a9fd4e..fd1bea9ae639 100644
--- a/services/core/java/com/android/server/media/RemoteDisplayProviderProxy.java
+++ b/services/core/java/com/android/server/media/RemoteDisplayProviderProxy.java
@@ -25,8 +25,9 @@ import android.media.IRemoteDisplayProvider;
import android.media.RemoteDisplayState;
import android.os.Handler;
import android.os.IBinder;
-import android.os.RemoteException;
import android.os.IBinder.DeathRecipient;
+import android.os.Looper;
+import android.os.RemoteException;
import android.os.UserHandle;
import android.util.Log;
import android.util.Slog;
@@ -35,10 +36,8 @@ import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.util.Objects;
-/**
- * Maintains a connection to a particular remote display provider service.
- */
-final class RemoteDisplayProviderProxy implements ServiceConnection {
+/** Maintains a connection to a particular remote display provider service. */
+final class RemoteDisplayProviderProxy {
private static final String TAG = "RemoteDisplayProvider"; // max. 23 chars
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -61,12 +60,15 @@ final class RemoteDisplayProviderProxy implements ServiceConnection {
private RemoteDisplayState mDisplayState;
private boolean mScheduledDisplayStateChangedCallback;
- public RemoteDisplayProviderProxy(Context context, ComponentName componentName,
- int userId) {
+ private final ServiceConnection mServiceConnection =
+ new ServiceConnectionImpl();
+
+ /* package */ RemoteDisplayProviderProxy(
+ Context context, ComponentName componentName, int userId, Looper looper) {
mContext = context;
mComponentName = componentName;
mUserId = userId;
- mHandler = new Handler();
+ mHandler = new Handler(looper);
}
public void dump(PrintWriter pw, String prefix) {
@@ -190,9 +192,12 @@ final class RemoteDisplayProviderProxy implements ServiceConnection {
Intent service = new Intent(RemoteDisplayState.SERVICE_INTERFACE);
service.setComponent(mComponentName);
try {
- mBound = mContext.bindServiceAsUser(service, this,
- Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE,
- new UserHandle(mUserId));
+ mBound =
+ mContext.bindServiceAsUser(
+ service,
+ mServiceConnection,
+ Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE,
+ new UserHandle(mUserId));
if (!mBound && DEBUG) {
Slog.d(TAG, this + ": Bind failed");
}
@@ -212,12 +217,11 @@ final class RemoteDisplayProviderProxy implements ServiceConnection {
mBound = false;
disconnect();
- mContext.unbindService(this);
+ mContext.unbindService(mServiceConnection);
}
}
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
+ private void onServiceConnectedOnHandler(IBinder service) {
if (DEBUG) {
Slog.d(TAG, this + ": Connected");
}
@@ -241,8 +245,7 @@ final class RemoteDisplayProviderProxy implements ServiceConnection {
}
}
- @Override
- public void onServiceDisconnected(ComponentName name) {
+ private void onServiceDisconnectedOnHandler() {
if (DEBUG) {
Slog.d(TAG, this + ": Service disconnected");
}
@@ -322,6 +325,20 @@ final class RemoteDisplayProviderProxy implements ServiceConnection {
void onDisplayStateChanged(RemoteDisplayProviderProxy provider, RemoteDisplayState state);
}
+ // All methods in this class are called on the main thread.
+ private final class ServiceConnectionImpl implements ServiceConnection {
+
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ mHandler.post(() -> onServiceConnectedOnHandler(service));
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ mHandler.post(RemoteDisplayProviderProxy.this::onServiceDisconnectedOnHandler);
+ }
+ }
+
private final class Connection implements DeathRecipient {
private final IRemoteDisplayProvider mProvider;
private final ProviderCallback mCallback;
diff --git a/services/core/java/com/android/server/media/RemoteDisplayProviderWatcher.java b/services/core/java/com/android/server/media/RemoteDisplayProviderWatcher.java
index 64c451d03caa..cc03c805fef0 100644
--- a/services/core/java/com/android/server/media/RemoteDisplayProviderWatcher.java
+++ b/services/core/java/com/android/server/media/RemoteDisplayProviderWatcher.java
@@ -121,9 +121,11 @@ public final class RemoteDisplayProviderWatcher {
int sourceIndex = findProvider(serviceInfo.packageName, serviceInfo.name);
if (sourceIndex < 0) {
RemoteDisplayProviderProxy provider =
- new RemoteDisplayProviderProxy(mContext,
- new ComponentName(serviceInfo.packageName, serviceInfo.name),
- mUserId);
+ new RemoteDisplayProviderProxy(
+ mContext,
+ new ComponentName(serviceInfo.packageName, serviceInfo.name),
+ mUserId,
+ mHandler.getLooper());
provider.start();
mProviders.add(targetIndex++, provider);
mCallback.addProvider(provider);