add minimum support of zoned int32 / float array

- TODO: add tests for zoned array, add more api in Java level

bug: 26473518

Change-Id: I114838e3214457474830b4b10228348f083a7ca7
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java
index 697c493..a9c0270 100644
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java
+++ b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java
@@ -541,10 +541,8 @@
 public static final int VEHICLE_VALUE_TYPE_STRING = 0x01;
 public static final int VEHICLE_VALUE_TYPE_BYTES = 0x02;
 public static final int VEHICLE_VALUE_TYPE_BOOLEAN = 0x03;
-public static final int VEHICLE_VALUE_TYPE_ZONED_INT32 = 0x04;
-public static final int VEHICLE_VALUE_TYPE_ZONED_FLOAT = 0x05;
-public static final int VEHICLE_VALUE_TYPE_ZONED_BOOLEAN = 0x06;
-public static final int VEHICLE_VALUE_TYPE_INT64 = 0x07;
+public static final int VEHICLE_VALUE_TYPE_ZONED_BOOLEAN = 0x04;
+public static final int VEHICLE_VALUE_TYPE_INT64 = 0x05;
 public static final int VEHICLE_VALUE_TYPE_FLOAT = 0x10;
 public static final int VEHICLE_VALUE_TYPE_FLOAT_VEC2 = 0x11;
 public static final int VEHICLE_VALUE_TYPE_FLOAT_VEC3 = 0x12;
@@ -553,14 +551,18 @@
 public static final int VEHICLE_VALUE_TYPE_INT32_VEC2 = 0x21;
 public static final int VEHICLE_VALUE_TYPE_INT32_VEC3 = 0x22;
 public static final int VEHICLE_VALUE_TYPE_INT32_VEC4 = 0x23;
+public static final int VEHICLE_VALUE_TYPE_ZONED_FLOAT = 0x30;
+public static final int VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2 = 0x31;
+public static final int VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3 = 0x32;
+public static final int VEHICLE_VALUE_TYPE_ZONED_INT32 = 0x40;
+public static final int VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2 = 0x41;
+public static final int VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3 = 0x42;
 public static String enumToString(int v) {
 switch(v) {
 case VEHICLE_VALUE_TYPE_SHOUD_NOT_USE: return "VEHICLE_VALUE_TYPE_SHOUD_NOT_USE";
 case VEHICLE_VALUE_TYPE_STRING: return "VEHICLE_VALUE_TYPE_STRING";
 case VEHICLE_VALUE_TYPE_BYTES: return "VEHICLE_VALUE_TYPE_BYTES";
 case VEHICLE_VALUE_TYPE_BOOLEAN: return "VEHICLE_VALUE_TYPE_BOOLEAN";
-case VEHICLE_VALUE_TYPE_ZONED_INT32: return "VEHICLE_VALUE_TYPE_ZONED_INT32";
-case VEHICLE_VALUE_TYPE_ZONED_FLOAT: return "VEHICLE_VALUE_TYPE_ZONED_FLOAT";
 case VEHICLE_VALUE_TYPE_ZONED_BOOLEAN: return "VEHICLE_VALUE_TYPE_ZONED_BOOLEAN";
 case VEHICLE_VALUE_TYPE_INT64: return "VEHICLE_VALUE_TYPE_INT64";
 case VEHICLE_VALUE_TYPE_FLOAT: return "VEHICLE_VALUE_TYPE_FLOAT";
@@ -571,6 +573,12 @@
 case VEHICLE_VALUE_TYPE_INT32_VEC2: return "VEHICLE_VALUE_TYPE_INT32_VEC2";
 case VEHICLE_VALUE_TYPE_INT32_VEC3: return "VEHICLE_VALUE_TYPE_INT32_VEC3";
 case VEHICLE_VALUE_TYPE_INT32_VEC4: return "VEHICLE_VALUE_TYPE_INT32_VEC4";
+case VEHICLE_VALUE_TYPE_ZONED_FLOAT: return "VEHICLE_VALUE_TYPE_ZONED_FLOAT";
+case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2: return "VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2";
+case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3: return "VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3";
+case VEHICLE_VALUE_TYPE_ZONED_INT32: return "VEHICLE_VALUE_TYPE_ZONED_INT32";
+case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2: return "VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2";
+case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3: return "VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3";
 default: return "UNKNOWN";
 }
 }
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueUtil.java b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueUtil.java
index 2b72163..e34e473 100644
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueUtil.java
+++ b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueUtil.java
@@ -88,7 +88,7 @@
     public static VehiclePropValue createZonedIntValue(int property, int zone, int value,
             long timestamp) {
         return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32,timestamp).
-                setZonedValue(ZonedValue.newBuilder().setZoneOrWindow(zone).setInt32Value(value).
+                setZonedValue(ZonedValue.newBuilder().setZoneOrWindow(zone).addInt32Values(value).
                         build()).
                 build();
     }
@@ -97,14 +97,14 @@
             long timestamp) {
         return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN,timestamp).
                 setZonedValue(ZonedValue.newBuilder().setZoneOrWindow(zone).
-                        setInt32Value(value ? 1 : 0).build()).
+                        addInt32Values(value ? 1 : 0).build()).
                 build();
     }
 
     public static VehiclePropValue createZonedFloatValue(int property, int zone, float value,
             long timestamp) {
         return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT,timestamp).
-                setZonedValue(ZonedValue.newBuilder().setZoneOrWindow(zone).setFloatValue(value).
+                setZonedValue(ZonedValue.newBuilder().setZoneOrWindow(zone).addFloatValues(value).
                         build()).
                 build();
     }
diff --git a/libvehiclenetwork/native/VehicleNetworkProtoUtil.cpp b/libvehiclenetwork/native/VehicleNetworkProtoUtil.cpp
index 6d48ef9..f32a689 100644
--- a/libvehiclenetwork/native/VehicleNetworkProtoUtil.cpp
+++ b/libvehiclenetwork/native/VehicleNetworkProtoUtil.cpp
@@ -52,13 +52,11 @@
                 out.set_bytes_value(in.value.bytes_value.data, in.value.bytes_value.len);
             }
         } break;
-        case VEHICLE_VALUE_TYPE_FLOAT: {
-            out.add_float_values(in.value.float_value);
-        } break;
+        case VEHICLE_VALUE_TYPE_FLOAT:
         case VEHICLE_VALUE_TYPE_FLOAT_VEC2:
         case VEHICLE_VALUE_TYPE_FLOAT_VEC3:
         case VEHICLE_VALUE_TYPE_FLOAT_VEC4: {
-            int expectedSize = in.value_type - VEHICLE_VALUE_TYPE_FLOAT_VEC2 + 2;
+            int expectedSize = in.value_type - VEHICLE_VALUE_TYPE_FLOAT + 1;
             for (int i = 0; i < expectedSize; i++) {
                 out.add_float_values(in.value.float_array[i]);
             }
@@ -66,31 +64,46 @@
         case VEHICLE_VALUE_TYPE_INT64: {
             out.set_int64_value(in.value.int64_value);
         } break;
-        case VEHICLE_VALUE_TYPE_INT32:
         case VEHICLE_VALUE_TYPE_BOOLEAN: {
             out.add_int32_values(in.value.int32_value);
         } break;
+        case VEHICLE_VALUE_TYPE_INT32:
         case VEHICLE_VALUE_TYPE_INT32_VEC2:
         case VEHICLE_VALUE_TYPE_INT32_VEC3:
         case VEHICLE_VALUE_TYPE_INT32_VEC4: {
-            int expectedSize = in.value_type - VEHICLE_VALUE_TYPE_INT32_VEC2 + 2;
+            int expectedSize = in.value_type - VEHICLE_VALUE_TYPE_INT32 + 1;
             for (int i = 0; i < expectedSize; i++) {
                 out.add_int32_values(in.value.int32_array[i]);
             }
         } break;
+        case VEHICLE_VALUE_TYPE_ZONED_BOOLEAN:
         case VEHICLE_VALUE_TYPE_ZONED_INT32:
-        case VEHICLE_VALUE_TYPE_ZONED_BOOLEAN: {
+        case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
+        case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3: {
+            int expectedSize;
+            if (in.value_type == VEHICLE_VALUE_TYPE_ZONED_BOOLEAN) {
+                expectedSize = 1;
+            } else {
+                expectedSize = in.value_type - VEHICLE_VALUE_TYPE_ZONED_INT32 + 1;
+            }
             ZonedValue* zonedValue = new ZonedValue();
             ASSERT_OR_HANDLE_NO_MEMORY(zonedValue, return NO_MEMORY);
-            zonedValue->set_zone_or_window(in.value.zoned_int32_value.zone);
-            zonedValue->set_int32_value(in.value.zoned_int32_value.value);
+            zonedValue->set_zone_or_window(in.value.zoned_int32_array.zone);
+            for (int i = 0; i < expectedSize; i++) {
+                zonedValue->add_int32_values(in.value.zoned_int32_array.values[i]);
+            }
             out.set_allocated_zoned_value(zonedValue);
         } break;
-        case VEHICLE_VALUE_TYPE_ZONED_FLOAT: {
+        case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
+        case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
+        case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3: {
+            int expectedSize = in.value_type - VEHICLE_VALUE_TYPE_ZONED_FLOAT + 1;
             ZonedValue* zonedValue = new ZonedValue();
             ASSERT_OR_HANDLE_NO_MEMORY(zonedValue, return NO_MEMORY);
-            zonedValue->set_zone_or_window(in.value.zoned_int32_value.zone);
-            zonedValue->set_float_value(in.value.zoned_float_value.value);
+            zonedValue->set_zone_or_window(in.value.zoned_float_array.zone);
+            for (int i = 0; i < expectedSize; i++) {
+                zonedValue->add_float_values(in.value.zoned_float_array.values[i]);
+            }
             out.set_allocated_zoned_value(zonedValue);
         } break;
     }
@@ -181,7 +194,6 @@
             }
             out.value.int64_value = in.int64_value();
         } break;
-        case VEHICLE_VALUE_TYPE_INT32:
         case VEHICLE_VALUE_TYPE_BOOLEAN: {
             if (in.int32_values_size() != 1) {
                 if (canIgnoreNoData) {
@@ -192,10 +204,11 @@
             }
             out.value.int32_value = in.int32_values(0);
         } break;
+        case VEHICLE_VALUE_TYPE_INT32:
         case VEHICLE_VALUE_TYPE_INT32_VEC2:
         case VEHICLE_VALUE_TYPE_INT32_VEC3:
         case VEHICLE_VALUE_TYPE_INT32_VEC4: {
-            int expectedSize = out.value_type - VEHICLE_VALUE_TYPE_INT32_VEC2 + 2;
+            int expectedSize = out.value_type - VEHICLE_VALUE_TYPE_INT32 + 1;
             if (in.int32_values_size() != expectedSize) {
                 if (canIgnoreNoData) {
                     return NO_ERROR;
@@ -208,8 +221,10 @@
                 out.value.int32_array[i] = in.int32_values(i);
             }
         } break;
+        case VEHICLE_VALUE_TYPE_ZONED_BOOLEAN:
         case VEHICLE_VALUE_TYPE_ZONED_INT32:
-        case VEHICLE_VALUE_TYPE_ZONED_BOOLEAN: {
+        case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
+        case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3: {
             if (!in.has_zoned_value()) {
                 if (canIgnoreNoData) {
                     return NO_ERROR;
@@ -218,17 +233,28 @@
                 return BAD_VALUE;
             }
             const ZonedValue& zonedValue = in.zoned_value();
-            if (!zonedValue.has_int32_value()) {
+            int expectedSize;
+            if (out.value_type == VEHICLE_VALUE_TYPE_ZONED_BOOLEAN) {
+                expectedSize = 1;
+            } else {
+                expectedSize = out.value_type - VEHICLE_VALUE_TYPE_ZONED_INT32 + 1;
+            }
+            if (zonedValue.int32_values_size() != expectedSize) {
                 if (canIgnoreNoData) {
                     return NO_ERROR;
                 }
-                ALOGE("no int32 in zoned value");
+                ALOGE("Wrong data length in zoned int boolean value, expected:%d, got:%d",
+                        expectedSize, zonedValue.int32_values_size());
                 return BAD_VALUE;
             }
-            out.value.zoned_int32_value.zone = zonedValue.zone_or_window();
-            out.value.zoned_int32_value.value = zonedValue.int32_value();
+            out.value.zoned_int32_array.zone = zonedValue.zone_or_window();
+            for (int i = 0; i < expectedSize; i++) {
+                out.value.zoned_int32_array.values[i] = zonedValue.int32_values(i);
+            }
         } break;
-        case VEHICLE_VALUE_TYPE_ZONED_FLOAT: {
+        case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
+        case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
+        case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3: {
             if (!in.has_zoned_value()) {
                 if (canIgnoreNoData) {
                     return NO_ERROR;
@@ -237,15 +263,19 @@
                 return BAD_VALUE;
             }
             const ZonedValue& zonedValue = in.zoned_value();
-            if (!zonedValue.has_float_value()) {
+            int expectedSize = out.value_type - VEHICLE_VALUE_TYPE_ZONED_FLOAT + 1;
+            if (zonedValue.float_values_size() != expectedSize) {
                 if (canIgnoreNoData) {
                     return NO_ERROR;
                 }
-                ALOGE("no float in zoned value");
+                ALOGE("Wrong data length in zoned float value, expected:%d, got:%d",
+                                        expectedSize, zonedValue.float_values_size());
                 return BAD_VALUE;
             }
-            out.value.zoned_float_value.zone = zonedValue.zone_or_window();
-            out.value.zoned_float_value.value = zonedValue.float_value();
+            out.value.zoned_float_array.zone = zonedValue.zone_or_window();
+            for (int i = 0; i < expectedSize; i++) {
+                out.value.zoned_float_array.values[i] = zonedValue.float_values(i);
+            }
         } break;
         default: {
             if (canIgnoreNoData) {
diff --git a/libvehiclenetwork/proto/VehicleNetworkProto.proto b/libvehiclenetwork/proto/VehicleNetworkProto.proto
index b5ff406..4cd81e4 100644
--- a/libvehiclenetwork/proto/VehicleNetworkProto.proto
+++ b/libvehiclenetwork/proto/VehicleNetworkProto.proto
@@ -42,8 +42,8 @@
 
 message ZonedValue {
     required int32 zone_or_window = 1;
-    optional int32 int32_value = 2; // also covers boolean value.
-    optional float float_value = 3;
+    repeated int32 int32_values = 2; // also covers boolean value.
+    repeated float float_values = 3;
 };
 
 message VehiclePropValue {
diff --git a/service/src/com/android/car/hal/HvacHalService.java b/service/src/com/android/car/hal/HvacHalService.java
index ecb4c0d..b9b6923 100644
--- a/service/src/com/android/car/hal/HvacHalService.java
+++ b/service/src/com/android/car/hal/HvacHalService.java
@@ -107,13 +107,13 @@
         if(value != null) {
             switch(hvacProp.getType()) {
                 case CarHvacManager.PROPERTY_TYPE_BOOLEAN:
-                    hvacProp.setBooleanValue(value.getZonedValue().getInt32Value() == 1);
+                    hvacProp.setBooleanValue(value.getZonedValue().getInt32Values(0) == 1);
                     break;
                 case CarHvacManager.PROPERTY_TYPE_INT:
-                    hvacProp.setIntegerValue(value.getZonedValue().getInt32Value());
+                    hvacProp.setIntegerValue(value.getZonedValue().getInt32Values(0));
                     break;
                 case CarHvacManager.PROPERTY_TYPE_FLOAT:
-                    hvacProp.setFloatValue(value.getZonedValue().getFloatValue());
+                    hvacProp.setFloatValue(value.getZonedValue().getFloatValues(0));
                     break;
             }
             hvacProp.setZone(zone);
@@ -258,16 +258,16 @@
                 switch(halType) {
                     case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN:
                         event = new CarHvacEvent(CarHvacEvent.HVAC_EVENT_PROPERTY_CHANGE,
-                                hvacPropId, zone, v.getZonedValue().getInt32Value() == 1);
+                                hvacPropId, zone, v.getZonedValue().getInt32Values(0) == 1);
                         break;
                     case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT: {
                         event = new CarHvacEvent(CarHvacEvent.HVAC_EVENT_PROPERTY_CHANGE,
-                                hvacPropId, zone, v.getZonedValue().getFloatValue());
+                                hvacPropId, zone, v.getZonedValue().getFloatValues(0));
                         break;
                     }
                     case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32: {
                         event = new CarHvacEvent(CarHvacEvent.HVAC_EVENT_PROPERTY_CHANGE,
-                                hvacPropId, zone, v.getZonedValue().getInt32Value());
+                                hvacPropId, zone, v.getZonedValue().getInt32Values(0));
                         break;
                     }
                     default:
diff --git a/tests/carservice_test/src/com/android/support/car/test/CarHvacManagerTest.java b/tests/carservice_test/src/com/android/support/car/test/CarHvacManagerTest.java
index 2c3d4a6..1f12167 100644
--- a/tests/carservice_test/src/com/android/support/car/test/CarHvacManagerTest.java
+++ b/tests/carservice_test/src/com/android/support/car/test/CarHvacManagerTest.java
@@ -183,15 +183,11 @@
 
         @Override
         public synchronized void onPropertySet(VehiclePropValue value) {
-            Log.d(TAG, "onPropertySet intValue = " + value.getZonedValue().getInt32Value() +
-                    " floatValue = " + value.getZonedValue().getFloatValue());
             mMap.put(value.getProp(), value);
         }
 
         @Override
         public synchronized VehiclePropValue onPropertyGet(VehiclePropValue value) {
-            Log.d(TAG, "onPropertyGet intValue = " + value.getZonedValue().getInt32Value() +
-                    " floatValue = " + value.getZonedValue().getFloatValue());
             return mMap.get(value.getProp());
         }
 
diff --git a/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTestUtil.java b/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTestUtil.java
index 32d173e..0542cfb 100644
--- a/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTestUtil.java
+++ b/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTestUtil.java
@@ -38,10 +38,10 @@
                 break;
             case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32:
             case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN:
-                builder.setZonedValue(ZonedValue.newBuilder().setZoneOrWindow(0).setInt32Value(0).
+                builder.setZonedValue(ZonedValue.newBuilder().setZoneOrWindow(0).addInt32Values(0).
                         build());
             case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT:
-                builder.setZonedValue(ZonedValue.newBuilder().setZoneOrWindow(0).setFloatValue(0f).
+                builder.setZonedValue(ZonedValue.newBuilder().setZoneOrWindow(0).addFloatValues(0f).
                         build());
             case VehicleValueType.VEHICLE_VALUE_TYPE_INT64:
                 builder.setInt64Value(0);