Loading core/java/android/companion/CompanionDeviceManager.java +147 −0 Original line number Diff line number Diff line Loading @@ -800,6 +800,119 @@ public final class CompanionDeviceManager { } } /** * Listener for any changes to {@link com.android.server.companion.transport.Transport}. * * @hide */ public interface OnTransportsChangedListener { /** * Invoked when a change occurs to any of the transports * * @param associations all the associations which have connected transports */ void onTransportsChanged(@NonNull List<AssociationInfo> associations); } /** * Register a listener for any changes to * {@link com.android.server.companion.transport.Transport}. Your app will receive a callback to * {@link OnTransportsChangedListener} immediately with all the existing transports. * * @hide */ public void addOnTransportsChangedListener( @NonNull Executor executor, @NonNull OnTransportsChangedListener listener) { final OnTransportsChangedListenerProxy proxy = new OnTransportsChangedListenerProxy( executor, listener); try { mService.addOnTransportsChangedListener(proxy); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Unregister a listener to stop receiving any changes to * {@link com.android.server.companion.transport.Transport}. * * @hide */ public void removeOnTransportsChangedListener( @NonNull OnTransportsChangedListener listener) { final OnTransportsChangedListenerProxy proxy = new OnTransportsChangedListenerProxy( null, listener); try { mService.removeOnTransportsChangedListener(proxy); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Send a message to remote devices * * @hide */ public void sendMessage(int messageType, byte[] data, int[] associationIds) { try { mService.sendMessage(messageType, data, associationIds); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Listener when a message is received for the registered message type * * @see #addOnMessageReceivedListener(Executor, int, OnMessageReceivedListener) * * @hide */ public interface OnMessageReceivedListener { /** * Called when a message is received */ void onMessageReceived(int associationId, byte[] data); } /** * Register a listener to receive callbacks when a message is received by the given type * * @see com.android.server.companion.transport.Transport for supported message types * * @hide */ public void addOnMessageReceivedListener(@NonNull Executor executor, int messageType, OnMessageReceivedListener listener) { final OnMessageReceivedListenerProxy proxy = new OnMessageReceivedListenerProxy( executor, listener); try { mService.addOnMessageReceivedListener(messageType, proxy); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Unregister a listener to stop receiving callbacks when a message is received by the given * type * * @see com.android.server.companion.transport.Transport for supported message types * * @hide */ public void removeOnMessageReceivedListener(int messageType, OnMessageReceivedListener listener) { final OnMessageReceivedListenerProxy proxy = new OnMessageReceivedListenerProxy( null, listener); try { mService.removeOnMessageReceivedListener(messageType, proxy); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Checks whether the bluetooth device represented by the mac address was recently associated * with the companion app. This allows these devices to skip the Bluetooth pairing dialog if Loading Loading @@ -1277,6 +1390,40 @@ public final class CompanionDeviceManager { } } private static class OnTransportsChangedListenerProxy extends IOnTransportsChangedListener.Stub { private final Executor mExecutor; private final OnTransportsChangedListener mListener; private OnTransportsChangedListenerProxy(Executor executor, OnTransportsChangedListener listener) { mExecutor = executor; mListener = listener; } @Override public void onTransportsChanged(@NonNull List<AssociationInfo> associations) { mExecutor.execute(() -> mListener.onTransportsChanged(associations)); } } private static class OnMessageReceivedListenerProxy extends IOnMessageReceivedListener.Stub { private final Executor mExecutor; private final OnMessageReceivedListener mListener; private OnMessageReceivedListenerProxy(Executor executor, OnMessageReceivedListener listener) { mExecutor = executor; mListener = listener; } @Override public void onMessageReceived(int associationId, byte[] data) { mExecutor.execute(() -> mListener.onMessageReceived(associationId, data)); } } private static class SystemDataTransferCallbackProxy extends ISystemDataTransferCallback.Stub { private final Executor mExecutor; private final OutcomeReceiver<Void, CompanionException> mCallback; Loading core/java/android/companion/ICompanionDeviceManager.aidl +12 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package android.companion; import android.app.PendingIntent; import android.companion.IAssociationRequestCallback; import android.companion.IOnAssociationsChangedListener; import android.companion.IOnMessageReceivedListener; import android.companion.IOnTransportsChangedListener; import android.companion.ISystemDataTransferCallback; import android.companion.AssociationInfo; import android.companion.AssociationRequest; Loading Loading @@ -67,6 +69,16 @@ interface ICompanionDeviceManager { void removeOnAssociationsChangedListener(IOnAssociationsChangedListener listener, int userId); void addOnTransportsChangedListener(IOnTransportsChangedListener listener); void removeOnTransportsChangedListener(IOnTransportsChangedListener listener); void sendMessage(int messageType, in byte[] data, in int[] associationIds); void addOnMessageReceivedListener(int messageType, IOnMessageReceivedListener listener); void removeOnMessageReceivedListener(int messageType, IOnMessageReceivedListener listener); void notifyDeviceAppeared(int associationId); void notifyDeviceDisappeared(int associationId); Loading core/java/android/companion/IOnMessageReceivedListener.aidl 0 → 100644 +23 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing per missions and * limitations under the License. */ package android.companion; /** @hide */ interface IOnMessageReceivedListener { oneway void onMessageReceived(int associationId, in byte[] data); } No newline at end of file core/java/android/companion/IOnTransportsChangedListener.aidl 0 → 100644 +25 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing per missions and * limitations under the License. */ package android.companion; import android.companion.AssociationInfo; /** @hide */ interface IOnTransportsChangedListener { oneway void onTransportsChanged(in List<AssociationInfo> associations); } No newline at end of file services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +34 −1 Original line number Diff line number Diff line Loading @@ -59,6 +59,8 @@ import android.companion.DeviceNotAssociatedException; import android.companion.IAssociationRequestCallback; import android.companion.ICompanionDeviceManager; import android.companion.IOnAssociationsChangedListener; import android.companion.IOnMessageReceivedListener; import android.companion.IOnTransportsChangedListener; import android.companion.ISystemDataTransferCallback; import android.content.ComponentName; import android.content.Context; Loading Loading @@ -232,7 +234,7 @@ public class CompanionDeviceManagerService extends SystemService { /* cdmService */this, mAssociationStore); mCompanionAppController = new CompanionApplicationController( context, mAssociationStore, mDevicePresenceMonitor); mTransportManager = new CompanionTransportManager(context); mTransportManager = new CompanionTransportManager(context, mAssociationStore); mSystemDataTransferProcessor = new SystemDataTransferProcessor(this, mAssociationStore, mSystemDataTransferRequestStore, mTransportManager); Loading Loading @@ -600,6 +602,37 @@ public class CompanionDeviceManagerService extends SystemService { mListeners.unregister(listener); } @Override @GuardedBy("CompanionDeviceManagerService.this.mTransportManager.mTransports") public void addOnTransportsChangedListener(IOnTransportsChangedListener listener) { mTransportManager.addListener(listener); } @Override @GuardedBy("CompanionDeviceManagerService.this.mTransportManager.mTransports") public void removeOnTransportsChangedListener(IOnTransportsChangedListener listener) { mTransportManager.removeListener(listener); } @Override @GuardedBy("CompanionDeviceManagerService.this.mTransportManager.mTransports") public void sendMessage(int messageType, byte[] data, int[] associationIds) { mTransportManager.sendMessage(messageType, data, associationIds); } @Override @GuardedBy("CompanionDeviceManagerService.this.mTransportManager.mTransports") public void addOnMessageReceivedListener(int messageType, IOnMessageReceivedListener listener) { mTransportManager.addListener(messageType, listener); } @Override public void removeOnMessageReceivedListener(int messageType, IOnMessageReceivedListener listener) { mTransportManager.removeListener(messageType, listener); } @Override public void legacyDisassociate(String deviceMacAddress, String packageName, int userId) { Log.i(TAG, "legacyDisassociate() pkg=u" + userId + "/" + packageName Loading Loading
core/java/android/companion/CompanionDeviceManager.java +147 −0 Original line number Diff line number Diff line Loading @@ -800,6 +800,119 @@ public final class CompanionDeviceManager { } } /** * Listener for any changes to {@link com.android.server.companion.transport.Transport}. * * @hide */ public interface OnTransportsChangedListener { /** * Invoked when a change occurs to any of the transports * * @param associations all the associations which have connected transports */ void onTransportsChanged(@NonNull List<AssociationInfo> associations); } /** * Register a listener for any changes to * {@link com.android.server.companion.transport.Transport}. Your app will receive a callback to * {@link OnTransportsChangedListener} immediately with all the existing transports. * * @hide */ public void addOnTransportsChangedListener( @NonNull Executor executor, @NonNull OnTransportsChangedListener listener) { final OnTransportsChangedListenerProxy proxy = new OnTransportsChangedListenerProxy( executor, listener); try { mService.addOnTransportsChangedListener(proxy); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Unregister a listener to stop receiving any changes to * {@link com.android.server.companion.transport.Transport}. * * @hide */ public void removeOnTransportsChangedListener( @NonNull OnTransportsChangedListener listener) { final OnTransportsChangedListenerProxy proxy = new OnTransportsChangedListenerProxy( null, listener); try { mService.removeOnTransportsChangedListener(proxy); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Send a message to remote devices * * @hide */ public void sendMessage(int messageType, byte[] data, int[] associationIds) { try { mService.sendMessage(messageType, data, associationIds); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Listener when a message is received for the registered message type * * @see #addOnMessageReceivedListener(Executor, int, OnMessageReceivedListener) * * @hide */ public interface OnMessageReceivedListener { /** * Called when a message is received */ void onMessageReceived(int associationId, byte[] data); } /** * Register a listener to receive callbacks when a message is received by the given type * * @see com.android.server.companion.transport.Transport for supported message types * * @hide */ public void addOnMessageReceivedListener(@NonNull Executor executor, int messageType, OnMessageReceivedListener listener) { final OnMessageReceivedListenerProxy proxy = new OnMessageReceivedListenerProxy( executor, listener); try { mService.addOnMessageReceivedListener(messageType, proxy); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Unregister a listener to stop receiving callbacks when a message is received by the given * type * * @see com.android.server.companion.transport.Transport for supported message types * * @hide */ public void removeOnMessageReceivedListener(int messageType, OnMessageReceivedListener listener) { final OnMessageReceivedListenerProxy proxy = new OnMessageReceivedListenerProxy( null, listener); try { mService.removeOnMessageReceivedListener(messageType, proxy); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Checks whether the bluetooth device represented by the mac address was recently associated * with the companion app. This allows these devices to skip the Bluetooth pairing dialog if Loading Loading @@ -1277,6 +1390,40 @@ public final class CompanionDeviceManager { } } private static class OnTransportsChangedListenerProxy extends IOnTransportsChangedListener.Stub { private final Executor mExecutor; private final OnTransportsChangedListener mListener; private OnTransportsChangedListenerProxy(Executor executor, OnTransportsChangedListener listener) { mExecutor = executor; mListener = listener; } @Override public void onTransportsChanged(@NonNull List<AssociationInfo> associations) { mExecutor.execute(() -> mListener.onTransportsChanged(associations)); } } private static class OnMessageReceivedListenerProxy extends IOnMessageReceivedListener.Stub { private final Executor mExecutor; private final OnMessageReceivedListener mListener; private OnMessageReceivedListenerProxy(Executor executor, OnMessageReceivedListener listener) { mExecutor = executor; mListener = listener; } @Override public void onMessageReceived(int associationId, byte[] data) { mExecutor.execute(() -> mListener.onMessageReceived(associationId, data)); } } private static class SystemDataTransferCallbackProxy extends ISystemDataTransferCallback.Stub { private final Executor mExecutor; private final OutcomeReceiver<Void, CompanionException> mCallback; Loading
core/java/android/companion/ICompanionDeviceManager.aidl +12 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package android.companion; import android.app.PendingIntent; import android.companion.IAssociationRequestCallback; import android.companion.IOnAssociationsChangedListener; import android.companion.IOnMessageReceivedListener; import android.companion.IOnTransportsChangedListener; import android.companion.ISystemDataTransferCallback; import android.companion.AssociationInfo; import android.companion.AssociationRequest; Loading Loading @@ -67,6 +69,16 @@ interface ICompanionDeviceManager { void removeOnAssociationsChangedListener(IOnAssociationsChangedListener listener, int userId); void addOnTransportsChangedListener(IOnTransportsChangedListener listener); void removeOnTransportsChangedListener(IOnTransportsChangedListener listener); void sendMessage(int messageType, in byte[] data, in int[] associationIds); void addOnMessageReceivedListener(int messageType, IOnMessageReceivedListener listener); void removeOnMessageReceivedListener(int messageType, IOnMessageReceivedListener listener); void notifyDeviceAppeared(int associationId); void notifyDeviceDisappeared(int associationId); Loading
core/java/android/companion/IOnMessageReceivedListener.aidl 0 → 100644 +23 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing per missions and * limitations under the License. */ package android.companion; /** @hide */ interface IOnMessageReceivedListener { oneway void onMessageReceived(int associationId, in byte[] data); } No newline at end of file
core/java/android/companion/IOnTransportsChangedListener.aidl 0 → 100644 +25 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing per missions and * limitations under the License. */ package android.companion; import android.companion.AssociationInfo; /** @hide */ interface IOnTransportsChangedListener { oneway void onTransportsChanged(in List<AssociationInfo> associations); } No newline at end of file
services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +34 −1 Original line number Diff line number Diff line Loading @@ -59,6 +59,8 @@ import android.companion.DeviceNotAssociatedException; import android.companion.IAssociationRequestCallback; import android.companion.ICompanionDeviceManager; import android.companion.IOnAssociationsChangedListener; import android.companion.IOnMessageReceivedListener; import android.companion.IOnTransportsChangedListener; import android.companion.ISystemDataTransferCallback; import android.content.ComponentName; import android.content.Context; Loading Loading @@ -232,7 +234,7 @@ public class CompanionDeviceManagerService extends SystemService { /* cdmService */this, mAssociationStore); mCompanionAppController = new CompanionApplicationController( context, mAssociationStore, mDevicePresenceMonitor); mTransportManager = new CompanionTransportManager(context); mTransportManager = new CompanionTransportManager(context, mAssociationStore); mSystemDataTransferProcessor = new SystemDataTransferProcessor(this, mAssociationStore, mSystemDataTransferRequestStore, mTransportManager); Loading Loading @@ -600,6 +602,37 @@ public class CompanionDeviceManagerService extends SystemService { mListeners.unregister(listener); } @Override @GuardedBy("CompanionDeviceManagerService.this.mTransportManager.mTransports") public void addOnTransportsChangedListener(IOnTransportsChangedListener listener) { mTransportManager.addListener(listener); } @Override @GuardedBy("CompanionDeviceManagerService.this.mTransportManager.mTransports") public void removeOnTransportsChangedListener(IOnTransportsChangedListener listener) { mTransportManager.removeListener(listener); } @Override @GuardedBy("CompanionDeviceManagerService.this.mTransportManager.mTransports") public void sendMessage(int messageType, byte[] data, int[] associationIds) { mTransportManager.sendMessage(messageType, data, associationIds); } @Override @GuardedBy("CompanionDeviceManagerService.this.mTransportManager.mTransports") public void addOnMessageReceivedListener(int messageType, IOnMessageReceivedListener listener) { mTransportManager.addListener(messageType, listener); } @Override public void removeOnMessageReceivedListener(int messageType, IOnMessageReceivedListener listener) { mTransportManager.removeListener(messageType, listener); } @Override public void legacyDisassociate(String deviceMacAddress, String packageName, int userId) { Log.i(TAG, "legacyDisassociate() pkg=u" + userId + "/" + packageName Loading