Loading services/core/java/com/android/server/media/RemoteDisplayProviderProxy.java +33 −16 Original line number Original line Diff line number Diff line Loading @@ -25,8 +25,9 @@ import android.media.IRemoteDisplayProvider; import android.media.RemoteDisplayState; import android.media.RemoteDisplayState; import android.os.Handler; import android.os.Handler; import android.os.IBinder; import android.os.IBinder; import android.os.RemoteException; import android.os.IBinder.DeathRecipient; import android.os.IBinder.DeathRecipient; import android.os.Looper; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserHandle; import android.util.Log; import android.util.Log; import android.util.Slog; import android.util.Slog; Loading @@ -35,10 +36,8 @@ import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.lang.ref.WeakReference; import java.util.Objects; import java.util.Objects; /** /** Maintains a connection to a particular remote display provider service. */ * Maintains a connection to a particular remote display provider service. final class RemoteDisplayProviderProxy { */ final class RemoteDisplayProviderProxy implements ServiceConnection { private static final String TAG = "RemoteDisplayProvider"; // max. 23 chars private static final String TAG = "RemoteDisplayProvider"; // max. 23 chars private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); Loading @@ -61,12 +60,15 @@ final class RemoteDisplayProviderProxy implements ServiceConnection { private RemoteDisplayState mDisplayState; private RemoteDisplayState mDisplayState; private boolean mScheduledDisplayStateChangedCallback; private boolean mScheduledDisplayStateChangedCallback; public RemoteDisplayProviderProxy(Context context, ComponentName componentName, private final ServiceConnection mServiceConnection = int userId) { new ServiceConnectionImpl(); /* package */ RemoteDisplayProviderProxy( Context context, ComponentName componentName, int userId, Looper looper) { mContext = context; mContext = context; mComponentName = componentName; mComponentName = componentName; mUserId = userId; mUserId = userId; mHandler = new Handler(); mHandler = new Handler(looper); } } public void dump(PrintWriter pw, String prefix) { public void dump(PrintWriter pw, String prefix) { Loading Loading @@ -190,7 +192,10 @@ final class RemoteDisplayProviderProxy implements ServiceConnection { Intent service = new Intent(RemoteDisplayState.SERVICE_INTERFACE); Intent service = new Intent(RemoteDisplayState.SERVICE_INTERFACE); service.setComponent(mComponentName); service.setComponent(mComponentName); try { try { mBound = mContext.bindServiceAsUser(service, this, mBound = mContext.bindServiceAsUser( service, mServiceConnection, Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE, Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE, new UserHandle(mUserId)); new UserHandle(mUserId)); if (!mBound && DEBUG) { if (!mBound && DEBUG) { Loading @@ -212,12 +217,11 @@ final class RemoteDisplayProviderProxy implements ServiceConnection { mBound = false; mBound = false; disconnect(); disconnect(); mContext.unbindService(this); mContext.unbindService(mServiceConnection); } } } } @Override private void onServiceConnectedOnHandler(IBinder service) { public void onServiceConnected(ComponentName name, IBinder service) { if (DEBUG) { if (DEBUG) { Slog.d(TAG, this + ": Connected"); Slog.d(TAG, this + ": Connected"); } } Loading @@ -241,8 +245,7 @@ final class RemoteDisplayProviderProxy implements ServiceConnection { } } } } @Override private void onServiceDisconnectedOnHandler() { public void onServiceDisconnected(ComponentName name) { if (DEBUG) { if (DEBUG) { Slog.d(TAG, this + ": Service disconnected"); Slog.d(TAG, this + ": Service disconnected"); } } Loading Loading @@ -322,6 +325,20 @@ final class RemoteDisplayProviderProxy implements ServiceConnection { void onDisplayStateChanged(RemoteDisplayProviderProxy provider, RemoteDisplayState state); 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 class Connection implements DeathRecipient { private final IRemoteDisplayProvider mProvider; private final IRemoteDisplayProvider mProvider; private final ProviderCallback mCallback; private final ProviderCallback mCallback; Loading services/core/java/com/android/server/media/RemoteDisplayProviderWatcher.java +5 −3 Original line number Original line Diff line number Diff line Loading @@ -121,9 +121,11 @@ public final class RemoteDisplayProviderWatcher { int sourceIndex = findProvider(serviceInfo.packageName, serviceInfo.name); int sourceIndex = findProvider(serviceInfo.packageName, serviceInfo.name); if (sourceIndex < 0) { if (sourceIndex < 0) { RemoteDisplayProviderProxy provider = RemoteDisplayProviderProxy provider = new RemoteDisplayProviderProxy(mContext, new RemoteDisplayProviderProxy( mContext, new ComponentName(serviceInfo.packageName, serviceInfo.name), new ComponentName(serviceInfo.packageName, serviceInfo.name), mUserId); mUserId, mHandler.getLooper()); provider.start(); provider.start(); mProviders.add(targetIndex++, provider); mProviders.add(targetIndex++, provider); mCallback.addProvider(provider); mCallback.addProvider(provider); Loading Loading
services/core/java/com/android/server/media/RemoteDisplayProviderProxy.java +33 −16 Original line number Original line Diff line number Diff line Loading @@ -25,8 +25,9 @@ import android.media.IRemoteDisplayProvider; import android.media.RemoteDisplayState; import android.media.RemoteDisplayState; import android.os.Handler; import android.os.Handler; import android.os.IBinder; import android.os.IBinder; import android.os.RemoteException; import android.os.IBinder.DeathRecipient; import android.os.IBinder.DeathRecipient; import android.os.Looper; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserHandle; import android.util.Log; import android.util.Log; import android.util.Slog; import android.util.Slog; Loading @@ -35,10 +36,8 @@ import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.lang.ref.WeakReference; import java.util.Objects; import java.util.Objects; /** /** Maintains a connection to a particular remote display provider service. */ * Maintains a connection to a particular remote display provider service. final class RemoteDisplayProviderProxy { */ final class RemoteDisplayProviderProxy implements ServiceConnection { private static final String TAG = "RemoteDisplayProvider"; // max. 23 chars private static final String TAG = "RemoteDisplayProvider"; // max. 23 chars private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); Loading @@ -61,12 +60,15 @@ final class RemoteDisplayProviderProxy implements ServiceConnection { private RemoteDisplayState mDisplayState; private RemoteDisplayState mDisplayState; private boolean mScheduledDisplayStateChangedCallback; private boolean mScheduledDisplayStateChangedCallback; public RemoteDisplayProviderProxy(Context context, ComponentName componentName, private final ServiceConnection mServiceConnection = int userId) { new ServiceConnectionImpl(); /* package */ RemoteDisplayProviderProxy( Context context, ComponentName componentName, int userId, Looper looper) { mContext = context; mContext = context; mComponentName = componentName; mComponentName = componentName; mUserId = userId; mUserId = userId; mHandler = new Handler(); mHandler = new Handler(looper); } } public void dump(PrintWriter pw, String prefix) { public void dump(PrintWriter pw, String prefix) { Loading Loading @@ -190,7 +192,10 @@ final class RemoteDisplayProviderProxy implements ServiceConnection { Intent service = new Intent(RemoteDisplayState.SERVICE_INTERFACE); Intent service = new Intent(RemoteDisplayState.SERVICE_INTERFACE); service.setComponent(mComponentName); service.setComponent(mComponentName); try { try { mBound = mContext.bindServiceAsUser(service, this, mBound = mContext.bindServiceAsUser( service, mServiceConnection, Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE, Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE, new UserHandle(mUserId)); new UserHandle(mUserId)); if (!mBound && DEBUG) { if (!mBound && DEBUG) { Loading @@ -212,12 +217,11 @@ final class RemoteDisplayProviderProxy implements ServiceConnection { mBound = false; mBound = false; disconnect(); disconnect(); mContext.unbindService(this); mContext.unbindService(mServiceConnection); } } } } @Override private void onServiceConnectedOnHandler(IBinder service) { public void onServiceConnected(ComponentName name, IBinder service) { if (DEBUG) { if (DEBUG) { Slog.d(TAG, this + ": Connected"); Slog.d(TAG, this + ": Connected"); } } Loading @@ -241,8 +245,7 @@ final class RemoteDisplayProviderProxy implements ServiceConnection { } } } } @Override private void onServiceDisconnectedOnHandler() { public void onServiceDisconnected(ComponentName name) { if (DEBUG) { if (DEBUG) { Slog.d(TAG, this + ": Service disconnected"); Slog.d(TAG, this + ": Service disconnected"); } } Loading Loading @@ -322,6 +325,20 @@ final class RemoteDisplayProviderProxy implements ServiceConnection { void onDisplayStateChanged(RemoteDisplayProviderProxy provider, RemoteDisplayState state); 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 class Connection implements DeathRecipient { private final IRemoteDisplayProvider mProvider; private final IRemoteDisplayProvider mProvider; private final ProviderCallback mCallback; private final ProviderCallback mCallback; Loading
services/core/java/com/android/server/media/RemoteDisplayProviderWatcher.java +5 −3 Original line number Original line Diff line number Diff line Loading @@ -121,9 +121,11 @@ public final class RemoteDisplayProviderWatcher { int sourceIndex = findProvider(serviceInfo.packageName, serviceInfo.name); int sourceIndex = findProvider(serviceInfo.packageName, serviceInfo.name); if (sourceIndex < 0) { if (sourceIndex < 0) { RemoteDisplayProviderProxy provider = RemoteDisplayProviderProxy provider = new RemoteDisplayProviderProxy(mContext, new RemoteDisplayProviderProxy( mContext, new ComponentName(serviceInfo.packageName, serviceInfo.name), new ComponentName(serviceInfo.packageName, serviceInfo.name), mUserId); mUserId, mHandler.getLooper()); provider.start(); provider.start(); mProviders.add(targetIndex++, provider); mProviders.add(targetIndex++, provider); mCallback.addProvider(provider); mCallback.addProvider(provider); Loading