From 2ca6f8cd2347a6649308a566bbba4f4deb37f2ff Mon Sep 17 00:00:00 2001 From: Asaf Rosenfeld Date: Mon, 20 Mar 2017 12:59:33 -0700 Subject: Adding availability support to VMS subscribers Test: runtest -v -x carservice_unit_test/src/com/android/car/VmsRoutingTest.java runtest -v -x carservice_test/src/com/android/car/test/VmsSubscriberManagerTest.java runtest -v -x carservice_test/src/com/android/car/test/VmsPublisherSubscriberTest.java runtest -v -x carservice_test/src/com/android/car/test/VmsPublisherClientServiceTest.java Change-Id: I3570dc902a020463f1041f04fa31267fbdab39c0 --- .../car/vms/IOnVmsMessageReceivedListener.aidl | 27 --------- .../src/android/car/vms/IVmsSubscriberClient.aidl | 31 ++++++++++ .../src/android/car/vms/IVmsSubscriberService.aidl | 23 +++++--- .../src/android/car/vms/VmsSubscriberManager.java | 66 ++++++++++++++++------ 4 files changed, 95 insertions(+), 52 deletions(-) delete mode 100644 car-lib/src/android/car/vms/IOnVmsMessageReceivedListener.aidl create mode 100644 car-lib/src/android/car/vms/IVmsSubscriberClient.aidl (limited to 'car-lib') diff --git a/car-lib/src/android/car/vms/IOnVmsMessageReceivedListener.aidl b/car-lib/src/android/car/vms/IOnVmsMessageReceivedListener.aidl deleted file mode 100644 index f94493d566..0000000000 --- a/car-lib/src/android/car/vms/IOnVmsMessageReceivedListener.aidl +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2017 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 permissions and - * limitations under the License. - */ - -package android.car.vms; - -/** - * @hide - */ -oneway interface IOnVmsMessageReceivedListener { - /** - * A VmsService uses this callback to pass messages to subscribers. - */ - void onVmsMessageReceived(in int layerId, in int layerVersion, in byte[] payload) = 0; -} diff --git a/car-lib/src/android/car/vms/IVmsSubscriberClient.aidl b/car-lib/src/android/car/vms/IVmsSubscriberClient.aidl new file mode 100644 index 0000000000..8a0f546e82 --- /dev/null +++ b/car-lib/src/android/car/vms/IVmsSubscriberClient.aidl @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2017 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 permissions and + * limitations under the License. + */ + +package android.car.vms; + +import android.car.vms.VmsLayer; + +/** + * @hide + */ +oneway interface IVmsSubscriberClient { + /** + * A VmsService uses this callback to pass messages to subscribers. + */ + void onVmsMessageReceived(in int layerId, in int layerVersion, in byte[] payload) = 0; + + void onLayersAvailabilityChange(in List availableLayers) = 1; +} diff --git a/car-lib/src/android/car/vms/IVmsSubscriberService.aidl b/car-lib/src/android/car/vms/IVmsSubscriberService.aidl index b6c31946cf..40ee67fc25 100644 --- a/car-lib/src/android/car/vms/IVmsSubscriberService.aidl +++ b/car-lib/src/android/car/vms/IVmsSubscriberService.aidl @@ -16,7 +16,8 @@ package android.car.vms; -import android.car.vms.IOnVmsMessageReceivedListener; +import android.car.vms.IVmsSubscriberClient; +import android.car.vms.VmsLayer; /** * @hide @@ -25,8 +26,8 @@ interface IVmsSubscriberService { /** * Subscribes the listener to receive messages from layer/version. */ - void addOnVmsMessageReceivedListener( - in IOnVmsMessageReceivedListener listener, + void addVmsSubscriberClientListener( + in IVmsSubscriberClient listener, int layer, int version) = 0; @@ -35,13 +36,13 @@ interface IVmsSubscriberService { * service will not send any subscription notifications to publishers (i.e. this is a passive * subscriber). */ - void addOnVmsMessageReceivedPassiveListener(in IOnVmsMessageReceivedListener listener) = 1; + void addVmsSubscriberClientPassiveListener(in IVmsSubscriberClient listener) = 1; /**    * Tells the VmsSubscriberService a client unsubscribes to layer messages.    */ - void removeOnVmsMessageReceivedListener( - in IOnVmsMessageReceivedListener listener, + void removeVmsSubscriberClientListener( + in IVmsSubscriberClient listener, int layer, int version) = 2; @@ -49,6 +50,12 @@ interface IVmsSubscriberService {    * Tells the VmsSubscriberService a passive client unsubscribes. This will not unsubscribe * the listener from any specific layer it has subscribed to.    */ - void removeOnVmsMessageReceivedPassiveListener( - in IOnVmsMessageReceivedListener listener) = 3; + void removeVmsSubscriberClientPassiveListener( + in IVmsSubscriberClient listener) = 3; + + /** + * Tells the VmsSubscriberService a client requests the list of available layers. + * The service should call the client's onLayersAvailabilityChange in response. + */ + List getAvailableLayers() = 4; } diff --git a/car-lib/src/android/car/vms/VmsSubscriberManager.java b/car-lib/src/android/car/vms/VmsSubscriberManager.java index 26d63e8ab3..0bdab95c51 100644 --- a/car-lib/src/android/car/vms/VmsSubscriberManager.java +++ b/car-lib/src/android/car/vms/VmsSubscriberManager.java @@ -16,7 +16,6 @@ package android.car.vms; -import android.annotation.SystemApi; import android.car.Car; import android.car.CarManagerBase; import android.car.CarNotConnectedException; @@ -27,10 +26,9 @@ import android.os.Looper; import android.os.Message; import android.os.RemoteException; import android.util.Log; - import com.android.internal.annotations.GuardedBy; - import java.lang.ref.WeakReference; +import java.util.List; /** * API for interfacing with the VmsSubscriberService. It supports a single listener that can @@ -47,15 +45,18 @@ public final class VmsSubscriberManager implements CarManagerBase { private final Handler mHandler; private final IVmsSubscriberService mVmsSubscriberService; - private final IOnVmsMessageReceivedListener mIListener; + private final IVmsSubscriberClient mIListener; private final Object mListenerLock = new Object(); @GuardedBy("mListenerLock") - private OnVmsMessageReceivedListener mListener; + private VmsSubscriberClientListener mListener; - /** Interface exposed to VMS subscribers: it is a wrapper of IOnVmsMessageReceivedListener. */ - public interface OnVmsMessageReceivedListener { + /** Interface exposed to VMS subscribers: it is a wrapper of IVmsSubscriberClient. */ + public interface VmsSubscriberClientListener { /** Called when the property is updated */ void onVmsMessageReceived(int layerId, int layerVersion, byte[] payload); + + /** Called when layers availability change */ + void onLayersAvailabilityChange(List availableLayers); } /** @@ -64,6 +65,7 @@ public final class VmsSubscriberManager implements CarManagerBase { private final static class VmsEventHandler extends Handler { /** Constants handled in the handler */ private static final int ON_RECEIVE_MESSAGE_EVENT = 0; + private static final int ON_AVAILABILITY_CHANGE_EVENT = 1; private final WeakReference mMgr; @@ -74,9 +76,9 @@ public final class VmsSubscriberManager implements CarManagerBase { @Override public void handleMessage(Message msg) { + VmsSubscriberManager mgr = mMgr.get(); switch (msg.what) { case ON_RECEIVE_MESSAGE_EVENT: - VmsSubscriberManager mgr = mMgr.get(); if (mgr != null) { // Parse the message VmsDataMessage vmsDataMessage = (VmsDataMessage) msg.obj; @@ -87,6 +89,16 @@ public final class VmsSubscriberManager implements CarManagerBase { vmsDataMessage.getPayload()); } break; + case ON_AVAILABILITY_CHANGE_EVENT: + if (mgr != null) { + // Parse the message + List vmsAvailabilityChangeMessage = (List) msg.obj; + + // Dispatch the parsed message + mgr.dispatchOnAvailabilityChangeMessage(vmsAvailabilityChangeMessage); + } + break; + default: Log.e(VmsSubscriberManager.TAG, "Event type not handled: " + msg.what); break; @@ -97,7 +109,7 @@ public final class VmsSubscriberManager implements CarManagerBase { public VmsSubscriberManager(IBinder service, Handler handler) { mVmsSubscriberService = IVmsSubscriberService.Stub.asInterface(service); mHandler = new VmsEventHandler(this, handler.getLooper()); - mIListener = new IOnVmsMessageReceivedListener.Stub() { + mIListener = new IVmsSubscriberClient.Stub() { @Override public void onVmsMessageReceived(int layerId, int layerVersion, byte[] payload) throws RemoteException { @@ -108,6 +120,14 @@ public final class VmsSubscriberManager implements CarManagerBase { VmsEventHandler.ON_RECEIVE_MESSAGE_EVENT, vmsDataMessage)); } + + @Override + public void onLayersAvailabilityChange(List availableLayers) { + mHandler.sendMessage( + mHandler.obtainMessage( + VmsEventHandler.ON_AVAILABILITY_CHANGE_EVENT, + availableLayers)); + } }; } @@ -120,7 +140,7 @@ public final class VmsSubscriberManager implements CarManagerBase { * @param listener subscriber listener that will handle onVmsMessageReceived events. * @throws IllegalStateException if the listener was already set. */ - public void setListener(OnVmsMessageReceivedListener listener) { + public void setListener(VmsSubscriberClientListener listener) { if (DBG) { Log.d(TAG, "Setting listener."); } @@ -154,7 +174,7 @@ public final class VmsSubscriberManager implements CarManagerBase { if (DBG) { Log.d(TAG, "Subscribing to layer: " + layer + ", version: " + version); } - OnVmsMessageReceivedListener listener; + VmsSubscriberClientListener listener; synchronized (mListenerLock) { listener = mListener; } @@ -164,7 +184,7 @@ public final class VmsSubscriberManager implements CarManagerBase { throw new IllegalStateException("Listener was not set."); } try { - mVmsSubscriberService.addOnVmsMessageReceivedListener(mIListener, layer, version); + mVmsSubscriberService.addVmsSubscriberClientListener(mIListener, layer, version); } catch (RemoteException e) { Log.e(TAG, "Could not connect: ", e); throw new CarNotConnectedException(e); @@ -178,7 +198,7 @@ public final class VmsSubscriberManager implements CarManagerBase { if (DBG) { Log.d(TAG, "Subscribing passively to all data messages"); } - OnVmsMessageReceivedListener listener; + VmsSubscriberClientListener listener; synchronized (mListenerLock) { listener = mListener; } @@ -188,7 +208,7 @@ public final class VmsSubscriberManager implements CarManagerBase { throw new IllegalStateException("Listener was not set."); } try { - mVmsSubscriberService.addOnVmsMessageReceivedPassiveListener(mIListener); + mVmsSubscriberService.addVmsSubscriberClientPassiveListener(mIListener); } catch (RemoteException e) { Log.e(TAG, "Could not connect: ", e); throw new CarNotConnectedException(e); @@ -208,7 +228,7 @@ public final class VmsSubscriberManager implements CarManagerBase { if (DBG) { Log.d(TAG, "Unsubscribing from layer: " + layer + ", version: " + version); } - OnVmsMessageReceivedListener listener; + VmsSubscriberClientListener listener; synchronized (mListenerLock) { listener = mListener; } @@ -218,7 +238,7 @@ public final class VmsSubscriberManager implements CarManagerBase { throw new IllegalStateException("Listener was not set."); } try { - mVmsSubscriberService.removeOnVmsMessageReceivedListener(mIListener, layer, version); + mVmsSubscriberService.removeVmsSubscriberClientListener(mIListener, layer, version); } catch (RemoteException e) { Log.e(TAG, "Failed to unregister subscriber", e); // ignore @@ -228,7 +248,7 @@ public final class VmsSubscriberManager implements CarManagerBase { } private void dispatchOnReceiveMessage(int layerId, int layerVersion, byte[] payload) { - OnVmsMessageReceivedListener listener; + VmsSubscriberClientListener listener; synchronized (mListenerLock) { listener = mListener; } @@ -239,6 +259,18 @@ public final class VmsSubscriberManager implements CarManagerBase { listener.onVmsMessageReceived(layerId, layerVersion, payload); } + private void dispatchOnAvailabilityChangeMessage(List availableLayers) { + VmsSubscriberClientListener listener; + synchronized (mListenerLock) { + listener = mListener; + } + if (listener == null) { + Log.e(TAG, "Listener died, not dispatching event."); + return; + } + listener.onLayersAvailabilityChange(availableLayers); + } + /** @hide */ @Override public void onCarDisconnected() { -- cgit v1.2.3