Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2665c08b authored by Guojing Yuan's avatar Guojing Yuan Committed by Android (Google) Code Review
Browse files

Merge "[CDM ContextSync] ContextSync support APIs" into udc-dev

parents bfe8bcef 1e5e9969
Loading
Loading
Loading
Loading
+147 −0
Original line number Diff line number Diff line
@@ -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
@@ -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;
+12 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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);
+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
+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
+34 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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);

@@ -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