diff options
| author | 2025-01-14 08:56:35 -0800 | |
|---|---|---|
| committer | 2025-01-14 08:56:35 -0800 | |
| commit | 2368dd45b4bb20008fa85dda12657ddad2cbd089 (patch) | |
| tree | cc93ed1bbc8f568161c02f808ef88097b3836e6d | |
| parent | 4e362be1b980033624ee419f84f638581a19b64d (diff) | |
| parent | c614f4b4b272c899e6d5520282bddc7c68160ab3 (diff) | |
Merge "Move calls to RemoteDisplayProviderProxy out of the main thread" into main
| -rw-r--r-- | services/core/java/com/android/server/media/RemoteDisplayProviderProxy.java | 49 | ||||
| -rw-r--r-- | services/core/java/com/android/server/media/RemoteDisplayProviderWatcher.java | 8 |
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); |