Add vehicle HAL mocking with carsystem and carsystemtest API

- System API and system test API for testing only added. Client
  should link only one of them.
- vehicle HAL mocking allows mocking vehicle HAL completely.
- Once mocking is started, for now, all previous states are forgotton,
  so stopping mocking does not return to original state. It is
  better to simply restart framework after test.
- Added skeleton code for audio focus handling. Detailed implementaiton
  will be added later.

bug: 24874617

Change-Id: I6e60daab3dc96769a94acc09a695f8f49dbb8536
(cherry picked from commit a32e24f50d5895a94d3a13d6ec2233af6e43dac5)
diff --git a/libvehiclenetwork/native/IVehicleNetwork.cpp b/libvehiclenetwork/native/IVehicleNetwork.cpp
index a3b17a5..388715d 100644
--- a/libvehiclenetwork/native/IVehicleNetwork.cpp
+++ b/libvehiclenetwork/native/IVehicleNetwork.cpp
@@ -37,6 +37,9 @@
     GET_PROPERTY,
     SUBSCRIBE,
     UNSUBSCRIBE,
+    INJECT_EVENT,
+    START_MOCKING,
+    STOP_MOCKING,
 };
 
 // ----------------------------------------------------------------------------
@@ -163,6 +166,41 @@
             ALOGI("unsubscribing property %d failed %d", property, status);
         }
     }
+
+    virtual status_t injectEvent(const vehicle_prop_value_t& value) {
+        Parcel data, reply;
+        data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
+        data.writeInt32(1); // 0 means no value. For compatibility with aidl based code.
+        std::unique_ptr<VehiclePropValue> v(new VehiclePropValue());
+        ASSERT_OR_HANDLE_NO_MEMORY(v.get(), return NO_MEMORY);
+        VehicleNetworkProtoUtil::toVehiclePropValue(value, *v.get());
+        int size = v->ByteSize();
+        WritableBlobHolder blob(new Parcel::WritableBlob());
+        ASSERT_OR_HANDLE_NO_MEMORY(blob.blob, return NO_MEMORY);
+        data.writeInt32(size);
+        data.writeBlob(size, false, blob.blob);
+        v->SerializeToArray(blob.blob->data(), size);
+        status_t status = remote()->transact(INJECT_EVENT, data, &reply);
+        return status;
+    }
+
+    virtual status_t startMocking(const sp<IVehicleNetworkHalMock>& mock) {
+        Parcel data, reply;
+        data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
+        data.writeStrongBinder(IInterface::asBinder(mock));
+        status_t status = remote()->transact(START_MOCKING, data, &reply);
+        return status;
+    }
+
+    virtual void stopMocking(const sp<IVehicleNetworkHalMock>& mock) {
+        Parcel data, reply;
+        data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
+        data.writeStrongBinder(IInterface::asBinder(mock));
+        status_t status = remote()->transact(STOP_MOCKING, data, &reply);
+        if (status != NO_ERROR) {
+            ALOGI("stop mocking failed %d", status);
+        }
+    }
 };
 
 IMPLEMENT_META_INTERFACE(VehicleNetwork, IVehicleNetwork::SERVICE_NAME);
@@ -280,6 +318,51 @@
             BinderUtil::fillNoResultReply(reply);
             return NO_ERROR;
         } break;
+        case INJECT_EVENT: {
+            CHECK_INTERFACE(IVehicleNetwork, data, reply);
+            if (data.readInt32() == 0) { // java side allows passing null with this.
+                return BAD_VALUE;
+            }
+            ScopedVehiclePropValue value;
+            ReadableBlobHolder blob(new Parcel::ReadableBlob());
+            ASSERT_OR_HANDLE_NO_MEMORY(blob.blob, return NO_MEMORY);
+            int32_t size = data.readInt32();
+            r = data.readBlob(size, blob.blob);
+            if (r != NO_ERROR) {
+                ALOGE("injectEvent:service, cannot read blob");
+                return r;
+            }
+            std::unique_ptr<VehiclePropValue> v(new VehiclePropValue());
+            ASSERT_OR_HANDLE_NO_MEMORY(v.get(), return NO_MEMORY);
+            if (!v->ParseFromArray(blob.blob->data(), size)) {
+                ALOGE("injectEvent:service, cannot parse data");
+                return BAD_VALUE;
+            }
+            r = VehicleNetworkProtoUtil::fromVehiclePropValue(*v.get(), value.value);
+            if (r != NO_ERROR) {
+                ALOGE("injectEvent:service, cannot convert data");
+                return BAD_VALUE;
+            }
+            r = injectEvent(value.value);
+            BinderUtil::fillNoResultReply(reply);
+            return r;
+        } break;
+        case START_MOCKING: {
+            CHECK_INTERFACE(IVehicleNetwork, data, reply);
+            sp<IVehicleNetworkHalMock> mock =
+                    interface_cast<IVehicleNetworkHalMock>(data.readStrongBinder());
+            r = startMocking(mock);
+            BinderUtil::fillNoResultReply(reply);
+            return r;
+        } break;
+        case STOP_MOCKING: {
+            CHECK_INTERFACE(IVehicleNetwork, data, reply);
+            sp<IVehicleNetworkHalMock> mock =
+                    interface_cast<IVehicleNetworkHalMock>(data.readStrongBinder());
+            stopMocking(mock);
+            BinderUtil::fillNoResultReply(reply);
+            return NO_ERROR;
+        } break;
         default:
             return BBinder::onTransact(code, data, reply, flags);
     }