Routing logic to use publisher ID

When publisher P is sending message for layer L, the routing
logic will send the message to all listeners that subscribed to either
layer L or Layer L + publisher P.

Test: all tests pass + added tests for new use cases
Bug: 63933446
Change-Id: I2f674149e7982ffede1f6426737ac1aef033b2c6
diff --git a/service/src/com/android/car/hal/VmsHalService.java b/service/src/com/android/car/hal/VmsHalService.java
index bb33cb6..a9282a1 100644
--- a/service/src/com/android/car/hal/VmsHalService.java
+++ b/service/src/com/android/car/hal/VmsHalService.java
@@ -32,6 +32,7 @@
 import android.hardware.automotive.vehicle.V2_1.VehicleProperty;
 import android.hardware.automotive.vehicle.V2_1.VmsBaseMessageIntegerValuesIndex;
 import android.hardware.automotive.vehicle.V2_1.VmsMessageType;
+import android.hardware.automotive.vehicle.V2_1.VmsDataMessageIntegerValuesIndex;
 import android.hardware.automotive.vehicle.V2_1.VmsOfferingMessageIntegerValuesIndex;
 import android.hardware.automotive.vehicle.V2_1.VmsSimpleMessageIntegerValuesIndex;
 import android.os.Binder;
@@ -100,10 +101,10 @@
      * The VmsSubscriberService implements this interface to receive data from the HAL.
      */
     public interface VmsHalSubscriberListener {
-        // Notify listener on a data Message.
-        void onDataMessage(VmsLayer layer, byte[] payload);
+        // Notifies the listener on a data Message from a publisher.
+        void onDataMessage(VmsLayer layer, int publisherId, byte[] payload);
 
-        // Notify listener on a change in available layers.
+        // Notifies the listener on a change in available layers.
         void onLayersAvaiabilityChange(List<VmsAssociatedLayer> availableLayers);
     }
 
@@ -178,21 +179,22 @@
         }
     }
 
-    public void removeDeadListener(IVmsSubscriberClient listener) {
+    public void removeDeadSubscriber(IVmsSubscriberClient listener) {
         synchronized (mLock) {
-            mRouting.removeDeadListener(listener);
+            mRouting.removeDeadSubscriber(listener);
         }
     }
 
-    public Set<IVmsSubscriberClient> getListeners(VmsLayer layer) {
+    public Set<IVmsSubscriberClient> getSubscribersForLayerFromPublisher(VmsLayer layer,
+                                                                         int publisherId) {
         synchronized (mLock) {
-            return mRouting.getListeners(layer);
+            return mRouting.getSubscribersForLayerFromPublisher(layer, publisherId);
         }
     }
 
-    public Set<IVmsSubscriberClient> getAllListeners() {
+    public Set<IVmsSubscriberClient> getAllSubscribers() {
         synchronized (mLock) {
-            return mRouting.getAllListeners();
+            return mRouting.getAllSubscribers();
         }
     }
 
@@ -265,9 +267,9 @@
         }
     }
 
-    public boolean containsListener(IVmsSubscriberClient listener) {
+    public boolean containsSubscriber(IVmsSubscriberClient subscriber) {
         synchronized (mLock) {
-            return mRouting.containsListener(listener);
+            return mRouting.containsSubscriber(subscriber);
         }
     }
 
@@ -409,25 +411,36 @@
                 integerValues.get(VmsSimpleMessageIntegerValuesIndex.VMS_LAYER_SUB_TYPE));
     }
 
+    private VmsLayer parseVmsLayerFromDataMessageIntegerValues(List<Integer> integerValues) {
+        return parseVmsLayerFromSimpleMessageIntegerValues(integerValues);
+    }
+
+    private int parsePublisherIdFromDataMessageIntegerValues(List<Integer> integerValues) {
+        return integerValues.get(VmsDataMessageIntegerValuesIndex.VMS_PUBLISHER_ID);
+    }
+
+
     /**
      * Data message format:
      * <ul>
      * <li>Message type.
      * <li>Layer id.
      * <li>Layer version.
+     * <li>Layer subtype.
+     * <li>Publisher ID.
      * <li>Payload.
      * </ul>
      */
     private void handleDataEvent(List<Integer> integerValues, byte[] payload) {
-        VmsLayer vmsLayer = parseVmsLayerFromSimpleMessageIntegerValues(integerValues);
+        VmsLayer vmsLayer = parseVmsLayerFromDataMessageIntegerValues(integerValues);
+        int publisherId = parsePublisherIdFromDataMessageIntegerValues(integerValues);
         if (DBG) {
-            Log.d(TAG,
-                    "Handling a data event for Layer: " + vmsLayer);
+            Log.d(TAG, "Handling a data event for Layer: " + vmsLayer);
         }
 
         // Send the message.
         for (VmsHalSubscriberListener listener : mSubscriberListeners) {
-            listener.onDataMessage(vmsLayer, payload);
+            listener.onDataMessage(vmsLayer, publisherId, payload);
         }
     }
 
@@ -442,8 +455,7 @@
     private void handleSubscribeEvent(List<Integer> integerValues) {
         VmsLayer vmsLayer = parseVmsLayerFromSimpleMessageIntegerValues(integerValues);
         if (DBG) {
-            Log.d(TAG,
-                    "Handling a subscribe event for Layer: " + vmsLayer);
+            Log.d(TAG, "Handling a subscribe event for Layer: " + vmsLayer);
         }
         addHalSubscription(vmsLayer);
     }
@@ -459,8 +471,7 @@
     private void handleUnsubscribeEvent(List<Integer> integerValues) {
         VmsLayer vmsLayer = parseVmsLayerFromSimpleMessageIntegerValues(integerValues);
         if (DBG) {
-            Log.d(TAG,
-                    "Handling an unsubscribe event for Layer: " + vmsLayer);
+            Log.d(TAG, "Handling an unsubscribe event for Layer: " + vmsLayer);
         }
         removeHalSubscription(vmsLayer);
     }
@@ -491,7 +502,8 @@
     private void handleOfferingEvent(List<Integer> integerValues) {
         int publisherId = integerValues.get(VmsOfferingMessageIntegerValuesIndex.PUBLISHER_ID);
         int numLayersDependencies =
-                integerValues.get(VmsOfferingMessageIntegerValuesIndex.VMS_NUMBER_OF_LAYERS_DEPENDENCIES);
+                integerValues.get(
+                        VmsOfferingMessageIntegerValuesIndex.VMS_NUMBER_OF_LAYERS_DEPENDENCIES);
         int idx = VmsOfferingMessageIntegerValuesIndex.FIRST_DEPENDENCIES_INDEX;
 
         List<VmsLayerDependency> offeredLayers = new ArrayList<>();