Migrating Car service to new Vehicle HAL
- make car service work directly with Vehicle HAL
- getting rid of protobufs and dependencies on VNS
- get rid of CarTestManager / CarTestService and refactor
tests accordingly
- reworked ICarImpl to pass dependencies rather than
using singletons for better testing experience
Test: existing test should work, although some of the tests
(esp. audio) are broken and we will fix them in follow up CLs
Bug: b/31971746
Change-Id: I229969af332304ba3b1718f130cdf22038e86fad
Tests: tests adjusted to new data structures
diff --git a/car-lib/api/system-current.txt b/car-lib/api/system-current.txt
index 763114b..691960a 100644
--- a/car-lib/api/system-current.txt
+++ b/car-lib/api/system-current.txt
@@ -23,10 +23,11 @@
field public static final java.lang.String PERMISSION_CAR_HVAC = "android.car.permission.CAR_HVAC";
field public static final java.lang.String PERMISSION_CAR_PROJECTION = "android.car.permission.CAR_PROJECTION";
field public static final java.lang.String PERMISSION_CAR_RADIO = "android.car.permission.CAR_RADIO";
+ field public static final java.lang.String PERMISSION_CAR_TEST_SERVICE = "android.car.permission.CAR_TEST_SERVICE";
field public static final java.lang.String PERMISSION_CONTROL_APP_BLOCKING = "android.car.permission.CONTROL_APP_BLOCKING";
field public static final java.lang.String PERMISSION_FUEL = "android.car.permission.CAR_FUEL";
field public static final java.lang.String PERMISSION_MILEAGE = "android.car.permission.CAR_MILEAGE";
- field public static final java.lang.String PERMISSION_MOCK_VEHICLE_HAL = "android.car.permission.CAR_MOCK_VEHICLE_HAL";
+ field public static final deprecated java.lang.String PERMISSION_MOCK_VEHICLE_HAL = "android.car.permission.CAR_MOCK_VEHICLE_HAL";
field public static final java.lang.String PERMISSION_SPEED = "android.car.permission.CAR_SPEED";
field public static final java.lang.String PERMISSION_VENDOR_EXTENSION = "android.car.permission.CAR_VENDOR_EXTENSION";
field public static final java.lang.String PROJECTION_SERVICE = "projection";
diff --git a/car-lib/src/android/car/Car.java b/car-lib/src/android/car/Car.java
index ab4f9c9..aa3c799 100644
--- a/car-lib/src/android/car/Car.java
+++ b/car-lib/src/android/car/Car.java
@@ -21,8 +21,8 @@
import android.annotation.SystemApi;
import android.car.content.pm.CarPackageManager;
import android.car.hardware.CarSensorManager;
-import android.car.hardware.cabin.CarCabinManager;
import android.car.hardware.CarVendorExtensionManager;
+import android.car.hardware.cabin.CarCabinManager;
import android.car.hardware.camera.CarCameraManager;
import android.car.hardware.hvac.CarHvacManager;
import android.car.hardware.radio.CarRadioManager;
@@ -199,23 +199,26 @@
/**
* Permission necessary to mock vehicle hal for testing.
* @hide
+ * @deprecated mocking vehicle HAL in car service is no longer supported.
*/
@SystemApi
public static final String PERMISSION_MOCK_VEHICLE_HAL =
"android.car.permission.CAR_MOCK_VEHICLE_HAL";
- /** Type of car connection: platform runs directly in car. */
- public static final int CONNECTION_TYPE_EMBEDDED = 5;
/**
- * Type of car connection: platform runs directly in car but with mocked vehicle hal.
- * This will only happen in testing environment.
+ * Permission necessary to access CarTestService.
* @hide
*/
- public static final int CONNECTION_TYPE_EMBEDDED_MOCKING = 6;
+ @SystemApi
+ public static final String PERMISSION_CAR_TEST_SERVICE =
+ "android.car.permission.CAR_TEST_SERVICE";
+
+ /** Type of car connection: platform runs directly in car. */
+ public static final int CONNECTION_TYPE_EMBEDDED = 5;
/** @hide */
- @IntDef({CONNECTION_TYPE_EMBEDDED, CONNECTION_TYPE_EMBEDDED_MOCKING})
+ @IntDef({CONNECTION_TYPE_EMBEDDED})
@Retention(RetentionPolicy.SOURCE)
public @interface ConnectionType {}
@@ -234,14 +237,13 @@
private static final String CAR_SERVICE_CLASS = "com.android.car.CarService";
- private static final String CAR_TEST_MANAGER_CLASS = "android.car.CarTestManager";
-
private static final long CAR_SERVICE_BIND_RETRY_INTERVAL_MS = 500;
private static final long CAR_SERVICE_BIND_MAX_RETRY = 20;
private final Context mContext;
@GuardedBy("this")
private ICar mService;
+ private final boolean mOwnsService;
private static final int STATE_DISCONNECTED = 0;
private static final int STATE_CONNECTING = 1;
private static final int STATE_CONNECTED = 2;
@@ -339,12 +341,13 @@
mMainThreadEventHandler = determineMainThreadEventHandler(mEventHandler);
mService = null;
+ mOwnsService = true;
mServiceConnectionListenerClient = serviceConnectionListener;
}
/**
- * Car constructor when ICar binder is already available. *
+ * Car constructor when ICar binder is already available.
* @hide
*/
public Car(Context context, ICar service, @Nullable Handler handler) {
@@ -353,6 +356,7 @@
mMainThreadEventHandler = determineMainThreadEventHandler(mEventHandler);
mService = service;
+ mOwnsService = false;
mConnectionState = STATE_CONNECTED;
mServiceConnectionListenerClient = null;
}
@@ -401,7 +405,10 @@
tearDownCarManagers();
mService = null;
mConnectionState = STATE_DISCONNECTED;
- mContext.unbindService(mServiceConnectionListener);
+
+ if (mOwnsService) {
+ mContext.unbindService(mServiceConnectionListener);
+ }
}
}
diff --git a/car-lib/src/android/car/hardware/CarSensorManager.java b/car-lib/src/android/car/hardware/CarSensorManager.java
index 051d97f..83e8b3f 100644
--- a/car-lib/src/android/car/hardware/CarSensorManager.java
+++ b/car-lib/src/android/car/hardware/CarSensorManager.java
@@ -25,6 +25,7 @@
import android.car.CarManagerBase;
import android.car.CarNotConnectedException;
import android.content.Context;
+import android.os.Binder;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.IBinder;
@@ -32,13 +33,16 @@
import android.os.RemoteException;
import android.util.Log;
+import com.google.android.collect.Lists;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
-import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -459,7 +463,7 @@
private final WeakReference<CarSensorManager> mManager;
public CarSensorEventListenerToService(CarSensorManager manager) {
- mManager = new WeakReference<CarSensorManager>(manager);
+ mManager = new WeakReference<>(manager);
}
@Override
diff --git a/car-lib/src/android/car/hardware/CarVendorExtensionManager.java b/car-lib/src/android/car/hardware/CarVendorExtensionManager.java
index 1235fcd..b153d22 100644
--- a/car-lib/src/android/car/hardware/CarVendorExtensionManager.java
+++ b/car-lib/src/android/car/hardware/CarVendorExtensionManager.java
@@ -144,7 +144,7 @@
* defined as {@code VEHICLE_VALUE_TYPE_INT32} in vehicle HAL could be accessed using
* {@code Integer.class}.
* @param propId - property id which is matched with the one defined in vehicle HAL
- * @param area - vehicle area (e.g. {@code VEHICLE_ZONE_ROW_1_LEFT}
+ * @param area - vehicle area (e.g. {@code VehicleAreaZone.ROW_1_LEFT}
* or {@code VEHICLE_MIRROR_DRIVER_LEFT}
*
* @throws CarNotConnectedException if the connection to the car service has been lost.
@@ -178,7 +178,7 @@
* defined as {@code VEHICLE_VALUE_TYPE_INT32} in vehicle HAL could be accessed using
* {@code Integer.class}.
* @param propId - property id which is matched with the one defined in vehicle HAL
- * @param area - vehicle area (e.g. {@code VEHICLE_ZONE_ROW_1_LEFT}
+ * @param area - vehicle area (e.g. {@code VehicleAreaZone.ROW_1_LEFT}
* or {@code VEHICLE_MIRROR_DRIVER_LEFT}
* @param value - new value, this object should match a class provided in {@code propertyClass}
* argument.
diff --git a/car-support-lib/api/current.txt b/car-support-lib/api/current.txt
index 25d2002..deee527 100644
--- a/car-support-lib/api/current.txt
+++ b/car-support-lib/api/current.txt
@@ -13,7 +13,6 @@
field public static final java.lang.String AUDIO_SERVICE = "audio";
field public static final int CONNECTION_TYPE_ADB_EMULATOR = 4; // 0x4
field public static final int CONNECTION_TYPE_EMBEDDED = 5; // 0x5
- field public static final int CONNECTION_TYPE_EMBEDDED_MOCKING = 6; // 0x6
field public static final int CONNECTION_TYPE_EMULATOR = 0; // 0x0
field public static final int CONNECTION_TYPE_ON_DEVICE_EMULATOR = 3; // 0x3
field public static final int CONNECTION_TYPE_UNKNOWN = -1; // 0xffffffff
diff --git a/car-support-lib/src/android/support/car/Car.java b/car-support-lib/src/android/support/car/Car.java
index 59a6e34..4fb92ff 100644
--- a/car-support-lib/src/android/support/car/Car.java
+++ b/car-support-lib/src/android/support/car/Car.java
@@ -117,11 +117,7 @@
* Type of car connection: platform runs directly in car.
*/
public static final int CONNECTION_TYPE_EMBEDDED = 5;
- /**
- * Type of car connection: platform runs directly in car with mocked vehicle HAL. Occurs
- * only in a testing environment.
- */
- public static final int CONNECTION_TYPE_EMBEDDED_MOCKING = 6;
+
/**
* Unknown type (the support lib is likely out-of-date).
*/
@@ -135,10 +131,8 @@
CONNECTION_TYPES.add(CONNECTION_TYPE_ON_DEVICE_EMULATOR);
CONNECTION_TYPES.add(CONNECTION_TYPE_ADB_EMULATOR);
CONNECTION_TYPES.add(CONNECTION_TYPE_EMBEDDED);
- CONNECTION_TYPES.add(CONNECTION_TYPE_EMBEDDED_MOCKING);
}
-
/** @hide */
@IntDef({CONNECTION_TYPE_EMULATOR, CONNECTION_TYPE_USB, CONNECTION_TYPE_WIFI,
CONNECTION_TYPE_ON_DEVICE_EMULATOR, CONNECTION_TYPE_ADB_EMULATOR,
@@ -429,7 +423,7 @@
*
* @return One of {@link #CONNECTION_TYPE_USB}, {@link #CONNECTION_TYPE_WIFI},
* {@link #CONNECTION_TYPE_EMBEDDED}, {@link #CONNECTION_TYPE_ON_DEVICE_EMULATOR},
- * {@link #CONNECTION_TYPE_ADB_EMULATOR}, {@link #CONNECTION_TYPE_EMBEDDED_MOCKING},
+ * {@link #CONNECTION_TYPE_ADB_EMULATOR},
* {@link #CONNECTION_TYPE_UNKNOWN}.
* @throws CarNotConnectedException if the connection to the car service has been lost.
* @hide
diff --git a/car-systemtest-lib/Android.mk b/car-systemtest-lib/Android.mk
index 710a0d6..6e4def5 100644
--- a/car-systemtest-lib/Android.mk
+++ b/car-systemtest-lib/Android.mk
@@ -28,6 +28,4 @@
LOCAL_JAVA_LIBRARIES += android.car
-LOCAL_STATIC_JAVA_LIBRARIES += libvehiclenetwork-java
-
include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/car-systemtest-lib/src/android/car/test/CarTestManager.java b/car-systemtest-lib/src/android/car/test/CarTestManager.java
index 4a99207..52b01a6 100644
--- a/car-systemtest-lib/src/android/car/test/CarTestManager.java
+++ b/car-systemtest-lib/src/android/car/test/CarTestManager.java
@@ -15,21 +15,13 @@
*/
package android.car.test;
+import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
+import android.car.Car;
import android.car.CarManagerBase;
import android.os.IBinder;
import android.os.RemoteException;
-import com.android.car.vehiclenetwork.IVehicleNetworkHalMock;
-import com.android.car.vehiclenetwork.VehicleNetwork.VehicleNetworkHalMock;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehiclePropConfigsParcelable;
-import com.android.car.vehiclenetwork.VehiclePropValueParcelable;
-import com.android.internal.annotations.GuardedBy;
-
-import java.lang.ref.WeakReference;
-
/**
* API for testing only. Allows mocking vehicle hal.
* @hide
@@ -37,28 +29,11 @@
@SystemApi
public final class CarTestManager implements CarManagerBase {
- /**
- * Flag for {@link #startMocking(VehicleNetworkHalMock, int)}.
- * This is for passing no flag.
- */
- public static final int FLAG_MOCKING_NONE = 0x0;
-
- /**
- * Flag for {@link #startMocking(VehicleNetworkHalMock, int)}.
- * When this flag is set, shutdown request from mocked vehicle HAL will shutdown the system
- * instead of avoiding shutdown, which is the default behavior.
- * This can be used to test shutdown flow manually using mocking.
- */
- public static final int FLAG_MOCKING_REAL_SHUTDOWN = 0x1;
-
private final ICarTest mService;
- @GuardedBy("this")
- private VehicleNetworkHalMock mHalMock;
- private IVehicleNetworkHalMockImpl mHalMockImpl;
- public CarTestManager(CarTestManagerBinderWrapper wrapper) {
- mService = ICarTest.Stub.asInterface(wrapper.binder);
+ public CarTestManager(IBinder carServiceBinder) {
+ mService = ICarTest.Stub.asInterface(carServiceBinder);
}
@Override
@@ -67,127 +42,36 @@
}
/**
- * Inject vehicle prop value event.
- * @param value
+ * Releases all car services. This make sense for test purpose when it is necessary to reduce
+ * interference between testing and real instances of Car Service. For example changing audio
+ * focus in CarAudioService may affect framework's AudioManager listeners. AudioManager has a
+ * lot of complex logic which is hard to mock.
*/
- public void injectEvent(VehiclePropValue value) {
+ @RequiresPermission(Car.PERMISSION_CAR_TEST_SERVICE)
+ public void stopCarService(IBinder token) {
try {
- mService.injectEvent(new VehiclePropValueParcelable(value));
+ mService.stopCarService(token);
} catch (RemoteException e) {
handleRemoteException(e);
}
}
/**
- * Check if given property is supported by vehicle hal.
- * @param property
- * @return
+ * Re-initializes previously released car service.
+ *
+ * @see {@link #stopCarService(IBinder)}
*/
- public boolean isPropertySupported(int property) {
+ @RequiresPermission(Car.PERMISSION_CAR_TEST_SERVICE)
+ public void startCarService(IBinder token) {
try {
- return mService.isPropertySupported(property);
- } catch (RemoteException e) {
- handleRemoteException(e);
- }
- return false;
- }
- /**
- * Start mocking vehicle HAL. It is somewhat strange to re-use interface in lower level
- * API, but this is only for testing, and interface is exactly the same.
- * @param mock
- * @flags Combination of FLAG_MOCKING_*
- */
- public void startMocking(VehicleNetworkHalMock mock, int flags) {
- IVehicleNetworkHalMockImpl halMockImpl = new IVehicleNetworkHalMockImpl(this);
- synchronized (this) {
- mHalMock = mock;
- mHalMockImpl = halMockImpl;
- }
- try {
- mService.startMocking(halMockImpl, flags);
+ mService.startCarService(token);
} catch (RemoteException e) {
handleRemoteException(e);
}
}
- /**
- * Stop previously started mocking.
- */
- public void stopMocking() {
- IVehicleNetworkHalMockImpl halMockImpl;
- synchronized (this) {
- halMockImpl = mHalMockImpl;
- mHalMock = null;
- mHalMockImpl = null;
- }
- try {
- mService.stopMocking(halMockImpl);
- } catch (RemoteException e) {
- handleRemoteException(e);
- }
- }
-
- private synchronized VehicleNetworkHalMock getHalMock() {
- return mHalMock;
- }
-
- private void handleRemoteException(RemoteException e) {
+ private static void handleRemoteException(RemoteException e) {
// let test fail
throw new RuntimeException(e);
}
-
- private static class IVehicleNetworkHalMockImpl extends IVehicleNetworkHalMock.Stub {
- private final WeakReference<CarTestManager> mTestManager;
-
- private IVehicleNetworkHalMockImpl(CarTestManager testManager) {
- mTestManager = new WeakReference<CarTestManager>(testManager);
- }
-
- @Override
- public VehiclePropConfigsParcelable onListProperties() {
- CarTestManager testManager = mTestManager.get();
- if (testManager == null) {
- return null;
- }
- VehiclePropConfigs configs = testManager.getHalMock().onListProperties();
- return new VehiclePropConfigsParcelable(configs);
- }
-
- @Override
- public void onPropertySet(VehiclePropValueParcelable value) {
- CarTestManager testManager = mTestManager.get();
- if (testManager == null) {
- return;
- }
- testManager.getHalMock().onPropertySet(value.value);
- }
-
- @Override
- public VehiclePropValueParcelable onPropertyGet(VehiclePropValueParcelable value) {
- CarTestManager testManager = mTestManager.get();
- if (testManager == null) {
- return null;
- }
- VehiclePropValue retValue = testManager.getHalMock().onPropertyGet(value.value);
- return new VehiclePropValueParcelable(retValue);
- }
-
- @Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- CarTestManager testManager = mTestManager.get();
- if (testManager == null) {
- return;
- }
- testManager.getHalMock().onPropertySubscribe(property, sampleRate, zones);
- }
-
- @Override
- public void onPropertyUnsubscribe(int property) {
- CarTestManager testManager = mTestManager.get();
- if (testManager == null) {
- return;
- }
- testManager.getHalMock().onPropertyUnsubscribe(property);
- }
- }
}
diff --git a/car-systemtest-lib/src/android/car/test/ICarTest.aidl b/car-systemtest-lib/src/android/car/test/ICarTest.aidl
index 05a2adc..90153cd 100644
--- a/car-systemtest-lib/src/android/car/test/ICarTest.aidl
+++ b/car-systemtest-lib/src/android/car/test/ICarTest.aidl
@@ -16,17 +16,19 @@
package android.car.test;
-import com.android.car.vehiclenetwork.IVehicleNetworkHalMock;
-import com.android.car.vehiclenetwork.VehiclePropValueParcelable;
+import android.os.IBinder;
/** @hide */
interface ICarTest {
- /** For testing only. inject events. */
- void injectEvent(in VehiclePropValueParcelable value) = 1;
- /** For testing only. Start in mocking mode. */
- void startMocking(in IVehicleNetworkHalMock mock, int flags) = 2;
- /** Finish mocking mode. */
- void stopMocking(in IVehicleNetworkHalMock mock) = 3;
- /** If given property is supported or not */
- boolean isPropertySupported(int property) = 4;
+ /**
+ * Calling this method will effectively call release method for all car services. This make
+ * sense for test purpose when it is neccessary to reduce interference between testing and
+ * real instances of Car Service. For example changing audio focus in CarAudioService may
+ * affect framework's AudioManager listeners. AudioManager has a lot of complex logic which is
+ * hard to mock.
+ */
+ void stopCarService(IBinder token) = 1;
+
+ /** Re initializes car services that was previously released by #releaseCarService method. */
+ void startCarService(IBinder token) = 2;
}
diff --git a/car-systemtest-lib/src/android/car/test/VehicleHalEmulator.java b/car-systemtest-lib/src/android/car/test/VehicleHalEmulator.java
deleted file mode 100644
index 3091e6d..0000000
--- a/car-systemtest-lib/src/android/car/test/VehicleHalEmulator.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/*
- * Copyright (C) 2015 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.test;
-
-import android.car.Car;
-import android.car.CarNotConnectedException;
-import android.util.Log;
-
-import com.android.car.vehiclenetwork.VehicleNetwork.VehicleNetworkHalMock;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePermissionModel;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
-
-import java.lang.reflect.Field;
-import java.util.HashMap;
-
-/**
- * This is for mocking vehicle HAL and testing system's internal behavior.
- * By default, emulated vehicle HAL will have all properties defined with default values
- * returned for get call. Each test can replace default behavior with
- * {@link #addProperty(VehiclePropConfig, VehicleHalPropertyHandler)} or
- * {@link #addStaticProperty(VehiclePropConfig, VehiclePropValue)}.
- * To test a case where specific property should not be present, test can call
- * {@link #removeProperty(int)}.
- *
- * Adding / removing properties should be done before calling {@link #start()} as the call will
- * start emulating with properties added / removed up to now.
- * @hide
- */
-public class VehicleHalEmulator {
- private static final String TAG = VehicleHalEmulator.class.getSimpleName();
- /**
- * Interface for handler of each property.
- */
- public interface VehicleHalPropertyHandler {
- void onPropertySet(VehiclePropValue value);
- VehiclePropValue onPropertyGet(VehiclePropValue value);
- void onPropertySubscribe(int property, float sampleRate, int zones);
- void onPropertyUnsubscribe(int property);
- }
-
- private final HashMap<Integer, VehicleHalProperty> mProperties =
- new HashMap<>();
-
- private final CarTestManager mCarTestManager;
- private final HalMock mMock = new HalMock();
- private boolean mDefaultPropertiesPopulated = false;
- private boolean mStarted = false;
-
- /**
- * Constructor. Car instance passed should be already connected to car service.
- * @param car
- */
- public VehicleHalEmulator(Car car) {
- try {
- mCarTestManager = new CarTestManager(
- (CarTestManagerBinderWrapper) car.getCarManager(Car.TEST_SERVICE));
- } catch (CarNotConnectedException e) {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Add property to mocked vehicle hal.
- * @param config
- * @param handler
- */
- public synchronized void addProperty(VehiclePropConfig config,
- VehicleHalPropertyHandler handler) {
- populateDefaultPropertiesIfNecessary();
- VehicleHalProperty halProp = new VehicleHalProperty(config, handler);
- mProperties.put(config.getProp(), halProp);
- }
-
- /**
- * Add static property to mocked vehicle hal.
- * @param config
- * @param value
- */
- public synchronized void addStaticProperty(VehiclePropConfig config, VehiclePropValue value) {
- populateDefaultPropertiesIfNecessary();
- DefaultPropertyHandler handler = new DefaultPropertyHandler(config, value);
- VehicleHalProperty halProp = new VehicleHalProperty(config, handler);
- mProperties.put(config.getProp(), halProp);
- }
-
- /**
- * Remove this property from vehicle HAL properties. Emulated vehicle HAL will not have this
- * property. This is useful to test the case where specific property is not present.
- * @param property
- */
- public synchronized void removeProperty(int property) {
- populateDefaultPropertiesIfNecessary();
- mProperties.remove(property);
- }
-
- /**
- * Start emulation. All necessary properties should have been added / removed before this.
- */
- public void start() {
- populateDefaultPropertiesIfNecessary();
-
- mCarTestManager.startMocking(mMock, CarTestManager.FLAG_MOCKING_NONE);
- synchronized (this) {
- mStarted = true;
- }
- }
-
- /** Whether emulation is started or not. */
- public synchronized boolean isStarted() {
- return mStarted;
- }
-
- /**
- * Stop emulation. should be done before finishing test.
- */
- public void stop() {
- mCarTestManager.stopMocking();
- synchronized (this) {
- mStarted = false;
- }
- }
-
- /**
- * Inject given value to VNS which ultimately delivered as HAL event to clients.
- * This can be used to emulate H/W side change.
- * @param value
- */
- public void injectEvent(VehiclePropValue value) {
- mCarTestManager.injectEvent(value);
- }
-
- public static void assertPropertyForGet(VehiclePropConfig config, int property) {
- assertProperty(config, property);
- if ((config.getAccess() & VehiclePropAccess.VEHICLE_PROP_ACCESS_READ) == 0) {
- throw new IllegalArgumentException("cannot set write-only property 0x" +
- Integer.toHexString(config.getProp()));
- }
- }
-
- public static void assertPropertyForSet(VehiclePropConfig config, VehiclePropValue value) {
- assertProperty(config, value.getProp());
- if ((config.getAccess() & VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE) == 0) {
- throw new IllegalArgumentException("cannot set read-only property 0x" +
- Integer.toHexString(config.getProp()));
- }
- }
-
- public static void assertPropertyForSubscribe(VehiclePropConfig config, int property,
- float sampleRate, int zones) {
- assertPropertyForGet(config, property);
- if (config.getChangeMode() == VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_STATIC) {
- throw new IllegalStateException("cannot subscribe static property 0x" +
- Integer.toHexString(config.getProp()));
- }
- }
-
- public static void assertProperty(VehiclePropConfig config, int property) {
- if (config.getProp() != property) {
- throw new IllegalStateException("Wrong prop, expecting 0x" +
- Integer.toHexString(config.getProp()) + " while got 0x" +
- Integer.toHexString(property));
- }
- }
-
- private synchronized void populateDefaultPropertiesIfNecessary() {
- // TODO: Consider validating that emulation is not currently running (ie: mStarted = false)
- if (mDefaultPropertiesPopulated) {
- return;
- }
-
- Log.d(TAG, "VehicleHalEmulator populating default properties...");
-
- for (Field f : VehicleNetworkConsts.class.getDeclaredFields()) {
- if (f.getType() == int.class) {
- int property = 0;
- try {
- property = f.getInt(null);
- } catch (IllegalAccessException e) {
- continue;
- }
- int valueType = VehicleNetworkConsts.getVehicleValueType(property);
- if (valueType == VehicleValueType.VEHICLE_VALUE_TYPE_SHOUD_NOT_USE) {
- // invalid property or not a property
- continue;
- }
- // black list of properties which should not be into default property
- // as default value does not work.
- switch (property) {
- case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME:
- case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS:
- case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT:
- case VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE:
- case VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_BOOTUP_REASON:
- continue;
- }
- int changeMode = VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_STATIC;
- int[] changeModes = VehicleNetworkConsts.getVehicleChangeMode(property);
- if (changeModes != null) {
- changeMode = changeModes[0];
- }
- int[] accesses = VehicleNetworkConsts.getVehicleAccess(property);
- if (accesses == null) { // invalid
- continue;
- }
- VehiclePropConfig config = VehiclePropConfig.newBuilder().
- setProp(property).
- setAccess(accesses[0]).
- setChangeMode(changeMode).
- setValueType(valueType).
- setPermissionModel(
- VehiclePermissionModel.VEHICLE_PERMISSION_NO_RESTRICTION).
- addConfigArray(0).
- setSampleRateMax(0).
- setSampleRateMin(0).
- build();
- VehiclePropValue initialValue = VehiclePropValueUtil.createDummyValue(property,
- valueType);
- DefaultPropertyHandler handler = new DefaultPropertyHandler(config, initialValue);
- VehicleHalProperty halProp = new VehicleHalProperty(config, handler);
- mProperties.put(property, halProp);
- }
- }
- mDefaultPropertiesPopulated = true;
- }
-
- private synchronized VehiclePropConfigs handleListProperties() {
- Log.d(TAG, "handleListProperties sees " + mProperties.size() + " values.");
-
- VehiclePropConfigs.Builder builder = VehiclePropConfigs.newBuilder();
- for (VehicleHalProperty halProp : mProperties.values()) {
- builder.addConfigs(halProp.config);
- }
- return builder.build();
- }
-
- private synchronized void handlePropertySet(VehiclePropValue value) {
- getHalPropertyLocked(value.getProp()).handler.onPropertySet(value);
- }
-
- private synchronized VehiclePropValue handlePropertyGet(VehiclePropValue value) {
- return getHalPropertyLocked(value.getProp()).handler.onPropertyGet(value);
- }
-
- private synchronized void handlePropertySubscribe(int property, float sampleRate, int zones) {
- getHalPropertyLocked(property).handler.onPropertySubscribe(property, sampleRate, zones);
- }
-
- private synchronized void handlePropertyUnsubscribe(int property) {
- getHalPropertyLocked(property).handler.onPropertyUnsubscribe(property);
- }
-
- private VehicleHalProperty getHalPropertyLocked(int property) {
- VehicleHalProperty halProp = mProperties.get(property);
- if (halProp == null) {
- IllegalArgumentException e = new IllegalArgumentException();
- Log.i(TAG, "property not supported:" + Integer.toHexString(property), e);
- throw e;
- }
- return halProp;
- }
-
- private static class VehicleHalProperty {
- public final VehiclePropConfig config;
- public final VehicleHalPropertyHandler handler;
-
- public VehicleHalProperty(VehiclePropConfig config, VehicleHalPropertyHandler handler) {
- this.config = config;
- this.handler = handler;
- }
- }
-
- private static class DefaultPropertyHandler implements VehicleHalPropertyHandler {
- private final VehiclePropConfig mConfig;
- private VehiclePropValue mValue;
- private boolean mSubscribed = false;
-
- public DefaultPropertyHandler(VehiclePropConfig config, VehiclePropValue initialValue) {
- mConfig = config;
- mValue = initialValue;
- }
-
- @Override
- public synchronized void onPropertySet(VehiclePropValue value) {
- assertPropertyForSet(mConfig, value);
- mValue = value;
- }
-
- @Override
- public synchronized VehiclePropValue onPropertyGet(VehiclePropValue value) {
- assertPropertyForGet(mConfig, value.getProp());
- return mValue;
- }
-
- @Override
- public synchronized void onPropertySubscribe(int property, float sampleRate, int zones) {
- assertPropertyForSubscribe(mConfig, property, sampleRate, zones);
- mSubscribed = true;
- }
-
- @Override
- public synchronized void onPropertyUnsubscribe(int property) {
- assertProperty(mConfig, property);
- if (!mSubscribed) {
- throw new IllegalArgumentException("unsubscibe for not subscribed property 0x" +
- Integer.toHexString(property));
- }
- mSubscribed = false;
- }
-
- }
-
- private class HalMock implements VehicleNetworkHalMock {
-
- @Override
- public VehiclePropConfigs onListProperties() {
- return handleListProperties();
- }
-
- @Override
- public void onPropertySet(VehiclePropValue value) {
- handlePropertySet(value);
- }
-
- @Override
- public VehiclePropValue onPropertyGet(VehiclePropValue value) {
- return handlePropertyGet(value);
- }
-
- @Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- handlePropertySubscribe(property, sampleRate, zones);
- }
-
- @Override
- public void onPropertyUnsubscribe(int property) {
- handlePropertyUnsubscribe(property);
- }
- }
-}
diff --git a/car_product/build/car.mk b/car_product/build/car.mk
index 8243061..fe9b644 100644
--- a/car_product/build/car.mk
+++ b/car_product/build/car.mk
@@ -95,7 +95,6 @@
libvehiclenetwork-native \
libvehiclemonitor-native \
vns_policy.xml \
- vendor_vns_policy.xml #for testing, should be replaced by vendor
# Boot animation
PRODUCT_COPY_FILES += \
diff --git a/car_product/build/car_base.mk b/car_product/build/car_base.mk
index d192a81..4c65033 100644
--- a/car_product/build/car_base.mk
+++ b/car_product/build/car_base.mk
@@ -80,7 +80,8 @@
mdnsd \
requestsync \
wifi-service \
- A2dpSinkService
+ A2dpSinkService \
+ android.hardware.vehicle@2.0-service \
$(call inherit-product, $(SRC_TARGET_DIR)/product/core_minimal.mk)
diff --git a/car_product/sepolicy/file_contexts b/car_product/sepolicy/file_contexts
index 182c923..30d4471 100644
--- a/car_product/sepolicy/file_contexts
+++ b/car_product/sepolicy/file_contexts
@@ -5,4 +5,5 @@
/system/bin/vehicle_network_service u:object_r:vns_exec:s0
/system/bin/vehicle_monitor_service u:object_r:vms_exec:s0
+/system/bin/hw/android.hardware.vehicle@2.0-service u:object_r:hal_vehicle_exec:s0
###################################
diff --git a/car_product/sepolicy/hal_vehicle.te b/car_product/sepolicy/hal_vehicle.te
new file mode 100644
index 0000000..fcb34cf
--- /dev/null
+++ b/car_product/sepolicy/hal_vehicle.te
@@ -0,0 +1,13 @@
+# vehicle subsystem
+type hal_vehicle, domain;
+type hal_vehicle_exec, exec_type, file_type;
+
+# hwbinder access
+hwbinder_use(hal_vehicle)
+
+allow hal_vehicle system_app:binder { call };
+allow hal_vehicle priv_app:binder { call };
+allow hal_vehicle car_service:service_manager { add };
+
+# may be started by init
+init_daemon_domain(hal_vehicle)
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/IVehicleNetwork.aidl b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/IVehicleNetwork.aidl
deleted file mode 100644
index cd16b4d..0000000
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/IVehicleNetwork.aidl
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2015 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 com.android.car.vehiclenetwork;
-
-import com.android.car.vehiclenetwork.IVehicleNetworkHalMock;
-import com.android.car.vehiclenetwork.IVehicleNetworkListener;
-import com.android.car.vehiclenetwork.VehiclePropConfigsParcelable;
-import com.android.car.vehiclenetwork.VehiclePropValueParcelable;
-import com.android.car.vehiclenetwork.VehiclePropValuesParcelable;
-
-/**
- * Binder API to access vehicle network service.
- * @hide
- */
-interface IVehicleNetwork {
- VehiclePropConfigsParcelable listProperties(int property) = 0;
- /** For error case, exception will be thrown. */
- void setProperty(in VehiclePropValueParcelable value) = 1;
- VehiclePropValueParcelable getProperty(in VehiclePropValueParcelable value) = 2;
- /** For error case, exception will be thrown. */
- void subscribe(in IVehicleNetworkListener listener, int property, float sampleRate,
- int zones, int flags) = 3;
- void unsubscribe(in IVehicleNetworkListener listener, int property) = 4;
- /** For testing only. inject events. */
- void injectEvent(in VehiclePropValueParcelable value) = 5;
- /** For testing only. Start in mocking mode. */
- void startMocking(in IVehicleNetworkHalMock mock) = 6;
- /** Finish mocking mode. */
- void stopMocking(in IVehicleNetworkHalMock mock) = 7;
- void injectHalError(int errorCode, int property, int operation) = 8;
- void startErrorListening(in IVehicleNetworkListener listener) = 9;
- void stopErrorListening(in IVehicleNetworkListener listener) = 10;
- void startHalRestartMonitoring(in IVehicleNetworkListener listener) = 11;
- void stopHalRestartMonitoring(in IVehicleNetworkListener listener) = 12;
-}
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/IVehicleNetworkHalMock.aidl b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/IVehicleNetworkHalMock.aidl
deleted file mode 100644
index 18e295d..0000000
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/IVehicleNetworkHalMock.aidl
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2015 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 com.android.car.vehiclenetwork;
-
-import com.android.car.vehiclenetwork.VehiclePropConfigsParcelable;
-import com.android.car.vehiclenetwork.VehiclePropValueParcelable;
-
-/**
- * Listener for vehicle HAL mock. This is used for internal testing only.
- * @hide
- */
-interface IVehicleNetworkHalMock {
- VehiclePropConfigsParcelable onListProperties() = 0;
- void onPropertySet(in VehiclePropValueParcelable value) = 1;
- VehiclePropValueParcelable onPropertyGet(in VehiclePropValueParcelable value) = 2;
- void onPropertySubscribe(int property, float sampleRate, int zones) = 3;
- void onPropertyUnsubscribe(int property) = 4;
-}
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/IVehicleNetworkListener.aidl b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/IVehicleNetworkListener.aidl
deleted file mode 100644
index 6403e03..0000000
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/IVehicleNetworkListener.aidl
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2015 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 com.android.car.vehiclenetwork;
-
-import com.android.car.vehiclenetwork.VehiclePropValuesParcelable;
-import com.android.car.vehiclenetwork.VehiclePropValueParcelable;
-
-/**
- * Listener for vehicle network service. Intentionally both way as this is supposed to be
- * used between system components. Making this one way brings ordering issue.
- * @hide
- */
-interface IVehicleNetworkListener {
- void onVehicleNetworkEvents(in VehiclePropValuesParcelable values) = 0;
- void onHalError(int errorCode, int property, int operation) = 1;
- void onHalRestart(boolean inMocking) = 2;
- void onPropertySet(in VehiclePropValueParcelable value) = 3;
-}
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetwork.java b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetwork.java
deleted file mode 100644
index 7c8ff10..0000000
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetwork.java
+++ /dev/null
@@ -1,799 +0,0 @@
-/*
- * Copyright (C) 2015 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 com.android.car.vehiclenetwork;
-
-import static com.android.car.vehiclenetwork.VehiclePropValueUtil.getVectorLength;
-import static com.android.car.vehiclenetwork.VehiclePropValueUtil.isCustomProperty;
-import static com.android.car.vehiclenetwork.VehiclePropValueUtil.toFloatArray;
-import static com.android.car.vehiclenetwork.VehiclePropValueUtil.toIntArray;
-
-import android.annotation.IntDef;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.ServiceSpecificException;
-import android.util.Log;
-
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValues;
-import com.android.internal.annotations.GuardedBy;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.ref.WeakReference;
-
-/**
- * System API to access Vehicle network. This is only for system services and applications should
- * not use this. All APIs will fail with security error if normal app tries this.
- */
-public class VehicleNetwork {
- /**
- * Listener for VNS events.
- */
- public interface VehicleNetworkListener {
- /**
- * Notify HAL events. This requires subscribing the property
- */
- void onVehicleNetworkEvents(VehiclePropValues values);
- void onHalError(int errorCode, int property, int operation);
- void onHalRestart(boolean inMocking);
- void onPropertySet(VehiclePropValue value);
- }
-
- public interface VehicleNetworkHalMock {
- VehiclePropConfigs onListProperties();
- void onPropertySet(VehiclePropValue value);
- VehiclePropValue onPropertyGet(VehiclePropValue value);
- void onPropertySubscribe(int property, float sampleRate, int zones);
- void onPropertyUnsubscribe(int property);
- }
-
- /**
- * Flags to be used in #subscribe(int, float, int, int).
- */
- @Retention(RetentionPolicy.SOURCE)
- @IntDef({
- SubscribeFlags.HAL_EVENT,
- SubscribeFlags.SET_CALL,
- SubscribeFlags.DEFAULT,
- })
- public @interface SubscribeFlags {
- int HAL_EVENT = 0x1;
- int SET_CALL = 0x2;
- int DEFAULT = HAL_EVENT;
- }
-
- private static final String TAG = VehicleNetwork.class.getSimpleName();
-
- private final IVehicleNetwork mService;
- private final VehicleNetworkListener mListener;
- private final IVehicleNetworkListenerImpl mVehicleNetworkListener;
- private final EventHandler mEventHandler;
-
- @GuardedBy("this")
- private VehicleNetworkHalMock mHalMock;
- private IVehicleNetworkHalMock mHalMockImpl;
-
- private static final int VNS_CONNECT_MAX_RETRY = 10;
- private static final long VNS_RETRY_WAIT_TIME_MS = 1000;
- private static final int NO_ZONE = -1;
-
- /**
- * Factory method to create VehicleNetwork
- *
- * @param listener listener for listening events
- * @param looper Looper to dispatch listener events
- */
- public static VehicleNetwork createVehicleNetwork(VehicleNetworkListener listener,
- Looper looper) {
- int retryCount = 0;
- IVehicleNetwork service = null;
- while (true) {
- service = IVehicleNetwork.Stub.asInterface(ServiceManager.getService(
- IVehicleNetwork.class.getCanonicalName()));
- if (service != null) {
- break;
- }
- retryCount++;
- if (retryCount > VNS_CONNECT_MAX_RETRY) {
- break;
- }
- try {
- Thread.sleep(VNS_RETRY_WAIT_TIME_MS);
- } catch (InterruptedException e) {
- //ignore
- }
- }
- if (service == null) {
- throw new RuntimeException("Vehicle network service not available:" +
- IVehicleNetwork.class.getCanonicalName());
- }
- return new VehicleNetwork(service, listener, looper);
- }
-
- private VehicleNetwork(IVehicleNetwork service, VehicleNetworkListener listener,
- Looper looper) {
- mService = service;
- mListener = listener;
- mEventHandler = new EventHandler(looper);
- mVehicleNetworkListener = new IVehicleNetworkListenerImpl(this);
- }
-
- /**
- * List all properties from vehicle HAL
- *
- * @return all properties
- */
- public VehiclePropConfigs listProperties() {
- return listProperties(0 /* all */);
- }
-
- /**
- * Return configuration information of single property
- *
- * @param property vehicle property number defined in {@link VehicleNetworkConsts}. 0 has has
- * special meaning of list all properties.
- * @return null if given property does not exist.
- */
- public VehiclePropConfigs listProperties(int property) {
- try {
- VehiclePropConfigsParcelable parcelable = mService.listProperties(property);
- if (parcelable != null) {
- return parcelable.configs;
- }
- } catch (RemoteException e) {
- handleRemoteException(e);
- }
- return null;
- }
-
- /**
- * Set property which will lead into writing the value to vehicle HAL.
- *
- * @throws IllegalArgumentException If value set has wrong value like wrong valueType, wrong
- * data, and etc.
- */
- public void setProperty(VehiclePropValue value)
- throws IllegalArgumentException, ServiceSpecificException {
- VehiclePropValueParcelable parcelable = new VehiclePropValueParcelable(value);
- try {
- mService.setProperty(parcelable);
- } catch (RemoteException e) {
- handleRemoteException(e);
- }
- }
-
- /**
- * Set integer type property
- *
- * @throws IllegalArgumentException For type mismatch (=the property is not int type)
- */
- public void setIntProperty(int property, int value)
- throws IllegalArgumentException, ServiceSpecificException {
- VehiclePropValue v = VehiclePropValueUtil.createIntValue(property, value, 0);
- setProperty(v);
- }
-
- /**
- * Set int vector type property. Length of passed values should match with vector length.
- */
- public void setIntVectorProperty(int property, int[] values)
- throws IllegalArgumentException, ServiceSpecificException {
- VehiclePropValue v = VehiclePropValueUtil.createIntVectorValue(property, values, 0);
- setProperty(v);
- }
-
- /**
- * Set long type property.
- */
- public void setLongProperty(int property, long value)
- throws IllegalArgumentException, ServiceSpecificException {
- VehiclePropValue v = VehiclePropValueUtil.createLongValue(property, value, 0);
- setProperty(v);
- }
-
- /**
- * Set float type property.
- */
- public void setFloatProperty(int property, float value)
- throws IllegalArgumentException, ServiceSpecificException {
- VehiclePropValue v = VehiclePropValueUtil.createFloatValue(property, value, 0);
- setProperty(v);
- }
-
- /**
- * Set float vector type property. Length of values should match with vector length.
- */
- public void setFloatVectorProperty(int property, float[] values)
- throws IllegalArgumentException, ServiceSpecificException {
- VehiclePropValue v = VehiclePropValueUtil.createFloatVectorValue(property, values, 0);
- setProperty(v);
- }
-
- /**
- * Set boolean type property
- *
- * @throws IllegalArgumentException For type mismatch (=the property is not boolean type)
- */
- public void setBooleanProperty(int property, boolean value)
- throws IllegalArgumentException, ServiceSpecificException {
- VehiclePropValue v = VehiclePropValueUtil.createBooleanValue(property, value, 0);
- setProperty(v);
- }
-
- public void setStringProperty(int property, String value)
- throws IllegalArgumentException, ServiceSpecificException {
- VehiclePropValue v = VehiclePropValueUtil.createStringValue(property, value, 0);
- setProperty(v);
- }
-
- /**
- * Set zoned boolean type property
- *
- * @throws IllegalArgumentException For type mismatch (=the property is not boolean type)
- */
- public void setZonedBooleanProperty(int property, int zone, boolean value)
- throws IllegalArgumentException, ServiceSpecificException {
- VehiclePropValue v = VehiclePropValueUtil.createZonedBooleanValue(property, zone, value, 0);
- setProperty(v);
- }
-
- /**
- * Set zoned float type property
- *
- * @throws IllegalArgumentException For type mismatch (=the property is not float type)
- */
- public void setZonedFloatProperty(int property, int zone, float value)
- throws IllegalArgumentException, ServiceSpecificException {
- VehiclePropValue v = VehiclePropValueUtil.createZonedFloatValue(property, zone, value, 0);
- setProperty(v);
- }
-
- /**
- * Set zoned integer type property
- *
- * @throws IllegalArgumentException For type mismatch (=the property is not int type)
- */
- public void setZonedIntProperty(int property, int zone, int value)
- throws IllegalArgumentException, ServiceSpecificException {
- VehiclePropValue v = VehiclePropValueUtil.createZonedIntValue(property, zone, value, 0);
- setProperty(v);
- }
-
- /**
- * Set zoned int vector type property. Length of passed values should match with vector length.
- */
- public void setZonedIntVectorProperty(int property, int zone, int[] values)
- throws IllegalArgumentException, ServiceSpecificException {
- VehiclePropValue v = VehiclePropValueUtil
- .createZonedIntVectorValue(property, zone, values, 0);
- setProperty(v);
- }
-
- /**
- * Set zoned float vector type property. Length of passed values should match with vector
- * length.
- */
- public void setZonedFloatVectorProperty(int property, int zone, float[] values)
- throws IllegalArgumentException, ServiceSpecificException {
- VehiclePropValue v = VehiclePropValueUtil
- .createZonedFloatVectorValue(property, zone, values, 0);
- setProperty(v);
- }
-
- /**
- * Get property. This can be used for a property which does not require any other data.
- */
- public VehiclePropValue getProperty(int property) throws IllegalArgumentException,
- ServiceSpecificException {
- int valueType = VehicleNetworkConsts.getVehicleValueType(property);
- if (valueType == 0) {
- throw new IllegalArgumentException("Data type is unknown for property: " + property);
- }
- VehiclePropValue value = VehiclePropValueUtil.createBuilder(property, valueType, 0).build();
- return getProperty(value);
- }
-
- /**
- * Generic get method for any type of property. Some property may require setting data portion
- * as get may return different result depending on the data set.
- */
- public VehiclePropValue getProperty(VehiclePropValue value) throws IllegalArgumentException,
- ServiceSpecificException {
- VehiclePropValueParcelable parcelable = new VehiclePropValueParcelable(value);
- try {
- VehiclePropValueParcelable resParcelable = mService.getProperty(parcelable);
- if (resParcelable != null) {
- return resParcelable.value;
- }
- } catch (RemoteException e) {
- handleRemoteException(e);
- }
- return null;
- }
-
- /**
- * Get int type property.
- */
- public int getIntProperty(int property) throws IllegalArgumentException,
- ServiceSpecificException {
- VehiclePropValue v = getProperty(
- property, NO_ZONE, VehicleValueType.VEHICLE_VALUE_TYPE_INT32);
- if (v.getInt32ValuesCount() != 1) {
- throw new IllegalStateException();
- }
- return v.getInt32Values(0);
- }
-
- /**
- * Get zoned int type property.
- */
- public int getZonedIntProperty(int property, int zone) throws IllegalArgumentException,
- ServiceSpecificException {
- VehiclePropValue v = getProperty(
- property, zone, VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32);
- if (v.getInt32ValuesCount() != 1) {
- throw new IllegalStateException();
- }
- return v.getInt32Values(0);
- }
-
- /**
- * Get int vector type property. Length of values should match vector length.
- */
- public int[] getIntVectorProperty(int property) throws IllegalArgumentException,
- ServiceSpecificException {
- VehiclePropValue v = getProperty(
- property, NO_ZONE, VehicleValueType.VEHICLE_VALUE_TYPE_INT32);
- assertVectorLength(v.getInt32ValuesCount(), property, v.getValueType());
- return toIntArray(v.getInt32ValuesList());
- }
-
- /**
- * Get zoned int vector type property. Length of values should match vector length.
- */
- public int[] getZonedIntVectorProperty(int property, int zone)
- throws IllegalArgumentException, ServiceSpecificException {
- VehiclePropValue v = getProperty(
- property, zone, VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32);
- assertVectorLength(v.getInt32ValuesCount(), property, v.getValueType());
- return toIntArray(v.getInt32ValuesList());
- }
-
- /**
- * Get float type property.
- */
- public float getFloatProperty(int property) throws IllegalArgumentException,
- ServiceSpecificException {
- VehiclePropValue v = getProperty(
- property, NO_ZONE, VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT);
- if (v.getFloatValuesCount() != 1) {
- throw new IllegalStateException();
- }
- return v.getFloatValues(0);
- }
-
- /**
- * Get float vector type property. Length of values should match vector's length.
- */
- public float[] getFloatVectorProperty(int property) throws IllegalArgumentException,
- ServiceSpecificException {
- VehiclePropValue v = getProperty(
- property, NO_ZONE, VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT);
- assertVectorLength(v.getFloatValuesCount(), property, v.getValueType());
- return toFloatArray(v.getFloatValuesList());
- }
-
- /**
- * Get zoned float vector type property. Length of values should match vector's length.
- */
- public float[] getZonedFloatVectorProperty(int property, int zone)
- throws IllegalArgumentException, ServiceSpecificException {
- VehiclePropValue v = getProperty(property, zone,
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT);
- assertVectorLength(v.getFloatValuesCount(), property, v.getValueType());
- return toFloatArray(v.getFloatValuesList());
- }
-
- /**
- * Get long type property.
- */
- public long getLongProperty(int property) throws IllegalArgumentException,
- ServiceSpecificException {
- VehiclePropValue v = getProperty(
- property, NO_ZONE, VehicleValueType.VEHICLE_VALUE_TYPE_INT64);
- return v.getInt64Value();
- }
-
- /**
- * Get string type property.
- */
- public String getStringProperty(int property) throws IllegalArgumentException,
- ServiceSpecificException {
- VehiclePropValue v = getProperty(
- property, NO_ZONE, VehicleValueType.VEHICLE_VALUE_TYPE_STRING);
- return v.getStringValue();
- }
-
- /**
- * Subscribe given property with given sample rate.
- */
- public void subscribe(int property, float sampleRate) throws IllegalArgumentException {
- subscribe(property, sampleRate, 0);
- }
-
- /**
- * Subscribe given property with given sample rate and zones.
- */
- public void subscribe(int property, float sampleRate, int zones)
- throws IllegalArgumentException {
- try {
- mService.subscribe(mVehicleNetworkListener, property, sampleRate, zones,
- SubscribeFlags.DEFAULT);
- } catch (RemoteException e) {
- handleRemoteException(e);
- }
- }
-
- /**
- * Subscribe given property with given sample rate, zones and flags.
- */
- @SuppressWarnings("ResourceType")
- public void subscribe(int property, float sampleRate, int zones, @SubscribeFlags int flags)
- throws IllegalArgumentException {
- try {
- mService.subscribe(mVehicleNetworkListener, property, sampleRate, zones, flags);
- } catch (RemoteException e) {
- handleRemoteException(e);
- }
- }
-
- /**
- * Stop subscribing the property.
- */
- public void unsubscribe(int property) {
- try {
- mService.unsubscribe(mVehicleNetworkListener, property);
- } catch (RemoteException e) {
- handleRemoteException(e);
- }
- }
-
- /**
- * Inject given value to all clients subscribing the property. This is for testing.
- */
- public synchronized void injectEvent(VehiclePropValue value) {
- try {
- mService.injectEvent(new VehiclePropValueParcelable(value));
- } catch (RemoteException e) {
- handleRemoteException(e);
- }
- }
-
- /**
- * Start mocking of vehicle HAL. For testing only.
- */
- public synchronized void startMocking(VehicleNetworkHalMock mock) {
- mHalMock = mock;
- mHalMockImpl = new IVehicleNetworkHalMockImpl(this);
- try {
- mService.startMocking(mHalMockImpl);
- } catch (RemoteException e) {
- handleRemoteException(e);
- }
- }
-
- /**
- * Stop mocking of vehicle HAL. For testing only.
- */
- public synchronized void stopMocking() {
- if (mHalMockImpl == null) {
- return;
- }
- try {
- mService.stopMocking(mHalMockImpl);
- } catch (RemoteException e) {
- handleRemoteException(e);
- } finally {
- mHalMock = null;
- mHalMockImpl = null;
- }
- }
-
- /**
- * Start mocking of vehicle HAL. For testing only.
- */
- public synchronized void startMocking(IVehicleNetworkHalMock mock) {
- mHalMock = null;
- mHalMockImpl = mock;
- try {
- mService.startMocking(mHalMockImpl);
- } catch (RemoteException e) {
- handleRemoteException(e);
- }
- }
-
- /**
- * Stop mocking of vehicle HAL. For testing only.
- */
- public synchronized void stopMocking(IVehicleNetworkHalMock mock) {
- if (mock.asBinder() != mHalMockImpl.asBinder()) {
- return;
- }
- try {
- mService.stopMocking(mHalMockImpl);
- } catch (RemoteException e) {
- handleRemoteException(e);
- } finally {
- mHalMock = null;
- mHalMockImpl = null;
- }
- }
-
- public synchronized void injectHalError(int errorCode, int property, int operation) {
- try {
- mService.injectHalError(errorCode, property, operation);
- } catch (RemoteException e) {
- handleRemoteException(e);
- }
- }
-
- public synchronized void startErrorListening() {
- try {
- mService.startErrorListening(mVehicleNetworkListener);
- } catch (RemoteException e) {
- handleRemoteException(e);
- }
- }
-
- public synchronized void stopErrorListening() {
- try {
- mService.stopErrorListening(mVehicleNetworkListener);
- } catch (RemoteException e) {
- handleRemoteException(e);
- }
- }
-
- public synchronized void startHalRestartMonitoring() {
- try {
- mService.startHalRestartMonitoring(mVehicleNetworkListener);
- } catch (RemoteException e) {
- handleRemoteException(e);
- }
- }
-
- public synchronized void stopHalRestartMonitoring() {
- try {
- mService.stopHalRestartMonitoring(mVehicleNetworkListener);
- } catch (RemoteException e) {
- handleRemoteException(e);
- }
- }
-
- private synchronized VehicleNetworkHalMock getHalMock() {
- return mHalMock;
- }
-
- private void handleRemoteException(RemoteException e) {
- throw new RuntimeException("Vehicle network service not working ", e);
- }
-
- private void handleVehicleNetworkEvents(VehiclePropValues values) {
- mListener.onVehicleNetworkEvents(values);
- }
-
- private void handleHalError(int errorCode, int property, int operation) {
- mListener.onHalError(errorCode, property, operation);
- }
-
- private void handleHalRestart(boolean inMocking) {
- mListener.onHalRestart(inMocking);
- }
-
- private void handleOnPropertySet(VehiclePropValue value) {
- mListener.onPropertySet(value);
- }
-
- private class EventHandler extends Handler {
-
- private static final int MSG_EVENTS = 0;
- private static final int MSG_HAL_ERROR = 1;
- private static final int MSG_HAL_RESTART = 2;
- private static final int MSG_ON_PROPERTY_SET = 3;
-
- private EventHandler(Looper looper) {
- super(looper);
- }
-
- private void notifyEvents(VehiclePropValues values) {
- Message msg = obtainMessage(MSG_EVENTS, values);
- sendMessage(msg);
- }
-
- private void notifyHalError(int errorCode, int property, int operation) {
- Message msg = obtainMessage(MSG_HAL_ERROR, errorCode, property, operation);
- sendMessage(msg);
- }
-
- private void notifyHalRestart(boolean inMocking) {
- Message msg = obtainMessage(MSG_HAL_RESTART, inMocking ? 1 : 0, 0);
- sendMessage(msg);
- }
-
- private void notifyPropertySet(VehiclePropValue value) {
- Message msg = obtainMessage(MSG_ON_PROPERTY_SET, value);
- sendMessage(msg);
- }
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_EVENTS:
- handleVehicleNetworkEvents((VehiclePropValues) msg.obj);
- break;
- case MSG_HAL_ERROR:
- handleHalError(msg.arg1, msg.arg2, (Integer) msg.obj);
- break;
- case MSG_HAL_RESTART:
- handleHalRestart(msg.arg1 == 1);
- break;
- case MSG_ON_PROPERTY_SET:
- handleOnPropertySet((VehiclePropValue) msg.obj);
- default:
- Log.w(TAG, "Unknown message:" + msg.what, new RuntimeException());
- break;
- }
- }
- }
-
- private static class IVehicleNetworkListenerImpl extends IVehicleNetworkListener.Stub {
-
- private final WeakReference<VehicleNetwork> mVehicleNetwork;
-
- private IVehicleNetworkListenerImpl(VehicleNetwork vehicleNetwork) {
- mVehicleNetwork = new WeakReference<>(vehicleNetwork);
- }
-
- @Override
- public void onVehicleNetworkEvents(VehiclePropValuesParcelable values) {
- VehicleNetwork vehicleNetwork = mVehicleNetwork.get();
- if (vehicleNetwork != null) {
- vehicleNetwork.mEventHandler.notifyEvents(values.values);
- }
- }
-
- @Override
- public void onPropertySet(VehiclePropValueParcelable value) {
- VehicleNetwork vehicleNetwork = mVehicleNetwork.get();
- if (vehicleNetwork != null) {
- vehicleNetwork.mEventHandler.notifyPropertySet(value.value);
- }
- }
-
- @Override
- public void onHalError(int errorCode, int property, int operation) {
- VehicleNetwork vehicleNetwork = mVehicleNetwork.get();
- if (vehicleNetwork != null) {
- vehicleNetwork.mEventHandler.notifyHalError(errorCode, property, operation);
- }
- }
-
- @Override
- public void onHalRestart(boolean inMocking) {
- VehicleNetwork vehicleNetwork = mVehicleNetwork.get();
- if (vehicleNetwork != null) {
- vehicleNetwork.mEventHandler.notifyHalRestart(inMocking);
- }
- }
- }
-
- private static class IVehicleNetworkHalMockImpl extends IVehicleNetworkHalMock.Stub {
- private final WeakReference<VehicleNetwork> mVehicleNetwork;
-
- private IVehicleNetworkHalMockImpl(VehicleNetwork vehicleNewotk) {
- mVehicleNetwork = new WeakReference<>(vehicleNewotk);
- }
-
- @Override
- public VehiclePropConfigsParcelable onListProperties() {
- VehicleNetwork vehicleNetwork = mVehicleNetwork.get();
- if (vehicleNetwork == null) {
- return null;
- }
- VehiclePropConfigs configs = vehicleNetwork.getHalMock().onListProperties();
- return new VehiclePropConfigsParcelable(configs);
- }
-
- @Override
- public void onPropertySet(VehiclePropValueParcelable value) {
- VehicleNetwork vehicleNetwork = mVehicleNetwork.get();
- if (vehicleNetwork == null) {
- return;
- }
- vehicleNetwork.getHalMock().onPropertySet(value.value);
- }
-
- @Override
- public VehiclePropValueParcelable onPropertyGet(VehiclePropValueParcelable value) {
- VehicleNetwork vehicleNetwork = mVehicleNetwork.get();
- if (vehicleNetwork == null) {
- return null;
- }
- VehiclePropValue resValue = vehicleNetwork.getHalMock().onPropertyGet(value.value);
- return new VehiclePropValueParcelable(resValue);
- }
-
- @Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- VehicleNetwork vehicleNetwork = mVehicleNetwork.get();
- if (vehicleNetwork == null) {
- return;
- }
- vehicleNetwork.getHalMock().onPropertySubscribe(property, sampleRate, zones);
- }
-
- @Override
- public void onPropertyUnsubscribe(int property) {
- VehicleNetwork vehicleNetwork = mVehicleNetwork.get();
- if (vehicleNetwork == null) {
- return;
- }
- vehicleNetwork.getHalMock().onPropertyUnsubscribe(property);
- }
- }
-
- private VehiclePropValue getProperty(int property, int zone, int customPropetyDataType) {
- boolean isCustom = isCustomProperty(property);
- int valueType = isCustom
- ? customPropetyDataType
- : VehicleNetworkConsts.getVehicleValueType(property);
-
- VehiclePropValue.Builder valuePrototypeBuilder =
- VehiclePropValueUtil.createBuilder(property, valueType, 0);
-
- if (zone != NO_ZONE) {
- valuePrototypeBuilder.setZone(zone);
- }
-
- VehiclePropValue v = getProperty(valuePrototypeBuilder.build());
- if (v == null) {
- // if property is invalid, IllegalArgumentException should have been thrown
- // from getProperty.
- throw new IllegalStateException();
- }
-
- if (!isCustom && v.getValueType() != valueType) {
- throw new IllegalArgumentException(
- "Unexpected type for property 0x" + Integer.toHexString(property) +
- " got:0x" + Integer.toHexString(v.getValueType())
- + ", expecting:0x" + Integer.toHexString(valueType));
- }
- return v;
- }
-
- private void assertVectorLength(int actual, int property, int valueType) {
- int expectedLen = getVectorLength(valueType);
- if (expectedLen != actual) {
- throw new IllegalStateException("Invalid array size for property: " + property
- + ". Expected: " + expectedLen
- + ", actual: " + actual);
- }
- }
-}
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java
deleted file mode 100644
index 047b3ab..0000000
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java
+++ /dev/null
@@ -1,1365 +0,0 @@
-
-/*
- * Copyright (C) 2015 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.
- */
-
-// Autogenerated from vehicle.h using
-// libvehiclenetwork/tool/vehiclehal_code_gen.py.
-// Do not modify manually.
-
-package com.android.car.vehiclenetwork;
-
-public class VehicleNetworkConsts {
-
-public static final int VEHICLE_PROPERTY_INVALID = 0x0;
-public static final int VEHICLE_PROPERTY_INFO_VIN = 0x00000100;
-public static final int VEHICLE_PROPERTY_INFO_MAKE = 0x00000101;
-public static final int VEHICLE_PROPERTY_INFO_MODEL = 0x00000102;
-public static final int VEHICLE_PROPERTY_INFO_MODEL_YEAR = 0x00000103;
-public static final int VEHICLE_PROPERTY_INFO_FUEL_CAPACITY = 0x00000104;
-public static final int VEHICLE_PROPERTY_PERF_ODOMETER = 0x00000204;
-public static final int VEHICLE_PROPERTY_PERF_VEHICLE_SPEED = 0x00000207;
-public static final int VEHICLE_PROPERTY_ENGINE_COOLANT_TEMP = 0x00000301;
-public static final int VEHICLE_PROPERTY_ENGINE_OIL_TEMP = 0x00000304;
-public static final int VEHICLE_PROPERTY_ENGINE_RPM = 0x00000305;
-public static final int VEHICLE_PROPERTY_GEAR_SELECTION = 0x00000400;
-public static final int VEHICLE_PROPERTY_CURRENT_GEAR = 0x00000401;
-public static final int VEHICLE_PROPERTY_PARKING_BRAKE_ON = 0x00000402;
-public static final int VEHICLE_PROPERTY_DRIVING_STATUS = 0x00000404;
-public static final int VEHICLE_PROPERTY_FUEL_LEVEL_LOW = 0x00000405;
-public static final int VEHICLE_PROPERTY_NIGHT_MODE = 0x00000407;
-public static final int VEHICLE_PROPERTY_HVAC_FAN_SPEED = 0x00000500;
-public static final int VEHICLE_PROPERTY_HVAC_FAN_DIRECTION = 0x00000501;
-public static final int VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT = 0x00000502;
-public static final int VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET = 0x00000503;
-public static final int VEHICLE_PROPERTY_HVAC_DEFROSTER = 0x00000504;
-public static final int VEHICLE_PROPERTY_HVAC_AC_ON = 0x00000505;
-public static final int VEHICLE_PROPERTY_HVAC_MAX_AC_ON = 0x00000506;
-public static final int VEHICLE_PROPERTY_HVAC_MAX_DEFROST_ON = 0x00000507;
-public static final int VEHICLE_PROPERTY_HVAC_RECIRC_ON = 0x00000508;
-public static final int VEHICLE_PROPERTY_HVAC_DUAL_ON = 0x00000509;
-public static final int VEHICLE_PROPERTY_HVAC_AUTO_ON = 0x0000050A;
-public static final int VEHICLE_PROPERTY_HVAC_SEAT_TEMPERATURE = 0x0000050B;
-public static final int VEHICLE_PROPERTY_HVAC_SIDE_MIRROR_HEAT = 0x0000050C;
-public static final int VEHICLE_PROPERTY_HVAC_STEERING_WHEEL_TEMP = 0x0000050D;
-public static final int VEHICLE_PROPERTY_HVAC_TEMPERATURE_UNITS = 0x0000050E;
-public static final int VEHICLE_PROPERTY_HVAC_ACTUAL_FAN_SPEED_RPM = 0x0000050F;
-public static final int VEHICLE_PROPERTY_HVAC_POWER_ON = 0x00000510;
-public static final int VEHICLE_PROPERTY_HVAC_FAN_DIRECTION_AVAILABLE = 0x00000511;
-public static final int VEHICLE_PROPERTY_ENV_OUTSIDE_TEMPERATURE = 0x00000703;
-public static final int VEHICLE_PROPERTY_ENV_CABIN_TEMPERATURE = 0x00000704;
-public static final int VEHICLE_PROPERTY_RADIO_PRESET = 0x00000801;
-public static final int VEHICLE_PROPERTY_AUDIO_FOCUS = 0x00000900;
-public static final int VEHICLE_PROPERTY_AUDIO_VOLUME = 0x00000901;
-public static final int VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT = 0x00000902;
-public static final int VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY = 0x00000903;
-public static final int VEHICLE_PROPERTY_AUDIO_HW_VARIANT = 0x00000904;
-public static final int VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT = 0x00000905;
-public static final int VEHICLE_PROPERTY_AP_POWER_STATE = 0x00000A00;
-public static final int VEHICLE_PROPERTY_DISPLAY_BRIGHTNESS = 0x00000A01;
-public static final int VEHICLE_PROPERTY_AP_POWER_BOOTUP_REASON = 0x00000A02;
-public static final int VEHICLE_PROPERTY_HW_KEY_INPUT = 0x00000A10;
-public static final int VEHICLE_PROPERTY_INSTRUMENT_CLUSTER_INFO = 0x00000A20;
-public static final int VEHICLE_PROPERTY_UNIX_TIME = 0x00000A30;
-public static final int VEHICLE_PROPERTY_CURRENT_TIME_IN_SECONDS = 0x00000A31;
-public static final int VEHICLE_PROPERTY_DOOR_POS = 0x00000B00;
-public static final int VEHICLE_PROPERTY_DOOR_MOVE = 0x00000B01;
-public static final int VEHICLE_PROPERTY_DOOR_LOCK = 0x00000B02;
-public static final int VEHICLE_PROPERTY_MIRROR_Z_POS = 0x00000B40;
-public static final int VEHICLE_PROPERTY_MIRROR_Z_MOVE = 0x00000B41;
-public static final int VEHICLE_PROPERTY_MIRROR_Y_POS = 0x00000B42;
-public static final int VEHICLE_PROPERTY_MIRROR_Y_MOVE = 0x00000B43;
-public static final int VEHICLE_PROPERTY_MIRROR_LOCK = 0x00000B44;
-public static final int VEHICLE_PROPERTY_MIRROR_FOLD = 0x00000B45;
-public static final int VEHICLE_PROPERTY_SEAT_MEMORY_SELECT = 0x00000B80;
-public static final int VEHICLE_PROPERTY_SEAT_MEMORY_SET = 0x00000B81;
-public static final int VEHICLE_PROPERTY_SEAT_BELT_BUCKLED = 0x00000B82;
-public static final int VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_POS = 0x00000B83;
-public static final int VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_MOVE = 0x00000B84;
-public static final int VEHICLE_PROPERTY_SEAT_FORE_AFT_POS = 0x00000B85;
-public static final int VEHICLE_PROPERTY_SEAT_FORE_AFT_MOVE = 0x00000B86;
-public static final int VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_POS = 0x00000B87;
-public static final int VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_MOVE = 0x00000B88;
-public static final int VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_POS = 0x00000B89;
-public static final int VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_MOVE = 0x00000B8A;
-public static final int VEHICLE_PROPERTY_SEAT_HEIGHT_POS = 0x00000B8B;
-public static final int VEHICLE_PROPERTY_SEAT_HEIGHT_MOVE = 0x00000B8C;
-public static final int VEHICLE_PROPERTY_SEAT_DEPTH_POS = 0x00000B8D;
-public static final int VEHICLE_PROPERTY_SEAT_DEPTH_MOVE = 0x00000B8E;
-public static final int VEHICLE_PROPERTY_SEAT_TILT_POS = 0x00000B8F;
-public static final int VEHICLE_PROPERTY_SEAT_TILT_MOVE = 0x00000B90;
-public static final int VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_POS = 0x00000B91;
-public static final int VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_MOVE = 0x00000B92;
-public static final int VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_POS = 0x00000B93;
-public static final int VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_MOVE = 0x00000B94;
-public static final int VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_POS = 0x00000B95;
-public static final int VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_MOVE = 0x00000B96;
-public static final int VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_POS = 0x00000B97;
-public static final int VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_MOVE = 0x00000B98;
-public static final int VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_POS = 0x00000B99;
-public static final int VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_MOVE = 0x00000B9A;
-public static final int VEHICLE_PROPERTY_WINDOW_POS = 0x00000BC0;
-public static final int VEHICLE_PROPERTY_WINDOW_MOVE = 0x00000BC1;
-public static final int VEHICLE_PROPERTY_WINDOW_VENT_POS = 0x00000BC2;
-public static final int VEHICLE_PROPERTY_WINDOW_VENT_MOVE = 0x00000BC3;
-public static final int VEHICLE_PROPERTY_WINDOW_LOCK = 0x00000BC4;
-public static final int VEHICLE_PROPERTY_CUSTOM_START = 0x70000000;
-public static final int VEHICLE_PROPERTY_CUSTOM_END = 0x73ffffff;
-public static final int VEHICLE_PROPERTY_INTERNAL_START = 0x74000000;
-public static final int VEHICLE_PROPERTY_INTERNAL_END = 0x74ffffff;
-public static final int VEHICLE_PROPERTY_INTERNAL_AUDIO_STREAM_STATE = 0x74000000;
-public static int getVehicleValueType(int property) {
-switch (property) {
-case VEHICLE_PROPERTY_INFO_VIN: return VehicleValueType.VEHICLE_VALUE_TYPE_STRING;
-case VEHICLE_PROPERTY_INFO_MAKE: return VehicleValueType.VEHICLE_VALUE_TYPE_STRING;
-case VEHICLE_PROPERTY_INFO_MODEL: return VehicleValueType.VEHICLE_VALUE_TYPE_STRING;
-case VEHICLE_PROPERTY_INFO_MODEL_YEAR: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32;
-case VEHICLE_PROPERTY_INFO_FUEL_CAPACITY: return VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT;
-case VEHICLE_PROPERTY_PERF_ODOMETER: return VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT;
-case VEHICLE_PROPERTY_PERF_VEHICLE_SPEED: return VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT;
-case VEHICLE_PROPERTY_ENGINE_COOLANT_TEMP: return VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT;
-case VEHICLE_PROPERTY_ENGINE_OIL_TEMP: return VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT;
-case VEHICLE_PROPERTY_ENGINE_RPM: return VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT;
-case VEHICLE_PROPERTY_GEAR_SELECTION: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32;
-case VEHICLE_PROPERTY_CURRENT_GEAR: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32;
-case VEHICLE_PROPERTY_PARKING_BRAKE_ON: return VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN;
-case VEHICLE_PROPERTY_DRIVING_STATUS: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32;
-case VEHICLE_PROPERTY_FUEL_LEVEL_LOW: return VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN;
-case VEHICLE_PROPERTY_NIGHT_MODE: return VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN;
-case VEHICLE_PROPERTY_HVAC_FAN_SPEED: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_HVAC_FAN_DIRECTION: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT;
-case VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT;
-case VEHICLE_PROPERTY_HVAC_DEFROSTER: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN;
-case VEHICLE_PROPERTY_HVAC_AC_ON: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN;
-case VEHICLE_PROPERTY_HVAC_MAX_AC_ON: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN;
-case VEHICLE_PROPERTY_HVAC_MAX_DEFROST_ON: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN;
-case VEHICLE_PROPERTY_HVAC_RECIRC_ON: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN;
-case VEHICLE_PROPERTY_HVAC_DUAL_ON: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN;
-case VEHICLE_PROPERTY_HVAC_AUTO_ON: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN;
-case VEHICLE_PROPERTY_HVAC_SEAT_TEMPERATURE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_HVAC_SIDE_MIRROR_HEAT: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32;
-case VEHICLE_PROPERTY_HVAC_STEERING_WHEEL_TEMP: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32;
-case VEHICLE_PROPERTY_HVAC_TEMPERATURE_UNITS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_HVAC_ACTUAL_FAN_SPEED_RPM: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_HVAC_POWER_ON: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN;
-case VEHICLE_PROPERTY_HVAC_FAN_DIRECTION_AVAILABLE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_ENV_OUTSIDE_TEMPERATURE: return VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT;
-case VEHICLE_PROPERTY_ENV_CABIN_TEMPERATURE: return VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT;
-case VEHICLE_PROPERTY_RADIO_PRESET: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4;
-case VEHICLE_PROPERTY_AUDIO_FOCUS: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4;
-case VEHICLE_PROPERTY_AUDIO_VOLUME: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC3;
-case VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2;
-case VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2;
-case VEHICLE_PROPERTY_AUDIO_HW_VARIANT: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32;
-case VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4;
-case VEHICLE_PROPERTY_AP_POWER_STATE: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2;
-case VEHICLE_PROPERTY_DISPLAY_BRIGHTNESS: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32;
-case VEHICLE_PROPERTY_AP_POWER_BOOTUP_REASON: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32;
-case VEHICLE_PROPERTY_HW_KEY_INPUT: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4;
-case VEHICLE_PROPERTY_INSTRUMENT_CLUSTER_INFO: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4;
-case VEHICLE_PROPERTY_UNIX_TIME: return VehicleValueType.VEHICLE_VALUE_TYPE_INT64;
-case VEHICLE_PROPERTY_CURRENT_TIME_IN_SECONDS: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32;
-case VEHICLE_PROPERTY_DOOR_POS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_DOOR_MOVE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_DOOR_LOCK: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN;
-case VEHICLE_PROPERTY_MIRROR_Z_POS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_MIRROR_Z_MOVE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_MIRROR_Y_POS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_MIRROR_Y_MOVE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_MIRROR_LOCK: return VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN;
-case VEHICLE_PROPERTY_MIRROR_FOLD: return VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN;
-case VEHICLE_PROPERTY_SEAT_MEMORY_SELECT: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_MEMORY_SET: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_BELT_BUCKLED: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN;
-case VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_POS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_MOVE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_FORE_AFT_POS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_FORE_AFT_MOVE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_POS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_MOVE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_POS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_MOVE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_HEIGHT_POS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_HEIGHT_MOVE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_DEPTH_POS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_DEPTH_MOVE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_TILT_POS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_TILT_MOVE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_POS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_MOVE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_POS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_MOVE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_POS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_MOVE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_POS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_MOVE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_POS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_MOVE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_WINDOW_POS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_WINDOW_MOVE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_WINDOW_VENT_POS: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_WINDOW_VENT_MOVE: return VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-case VEHICLE_PROPERTY_WINDOW_LOCK: return VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN;
-case VEHICLE_PROPERTY_INTERNAL_AUDIO_STREAM_STATE: return VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2;
-default: return VehicleValueType.VEHICLE_VALUE_TYPE_SHOUD_NOT_USE;
-}
-}
-
-public static String getVehiclePropertyName(int property) {
-switch (property) {
-case VEHICLE_PROPERTY_INVALID: return "VEHICLE_PROPERTY_INVALID";
-case VEHICLE_PROPERTY_INFO_VIN: return "VEHICLE_PROPERTY_INFO_VIN";
-case VEHICLE_PROPERTY_INFO_MAKE: return "VEHICLE_PROPERTY_INFO_MAKE";
-case VEHICLE_PROPERTY_INFO_MODEL: return "VEHICLE_PROPERTY_INFO_MODEL";
-case VEHICLE_PROPERTY_INFO_MODEL_YEAR: return "VEHICLE_PROPERTY_INFO_MODEL_YEAR";
-case VEHICLE_PROPERTY_INFO_FUEL_CAPACITY: return "VEHICLE_PROPERTY_INFO_FUEL_CAPACITY";
-case VEHICLE_PROPERTY_PERF_ODOMETER: return "VEHICLE_PROPERTY_PERF_ODOMETER";
-case VEHICLE_PROPERTY_PERF_VEHICLE_SPEED: return "VEHICLE_PROPERTY_PERF_VEHICLE_SPEED";
-case VEHICLE_PROPERTY_ENGINE_COOLANT_TEMP: return "VEHICLE_PROPERTY_ENGINE_COOLANT_TEMP";
-case VEHICLE_PROPERTY_ENGINE_OIL_TEMP: return "VEHICLE_PROPERTY_ENGINE_OIL_TEMP";
-case VEHICLE_PROPERTY_ENGINE_RPM: return "VEHICLE_PROPERTY_ENGINE_RPM";
-case VEHICLE_PROPERTY_GEAR_SELECTION: return "VEHICLE_PROPERTY_GEAR_SELECTION";
-case VEHICLE_PROPERTY_CURRENT_GEAR: return "VEHICLE_PROPERTY_CURRENT_GEAR";
-case VEHICLE_PROPERTY_PARKING_BRAKE_ON: return "VEHICLE_PROPERTY_PARKING_BRAKE_ON";
-case VEHICLE_PROPERTY_DRIVING_STATUS: return "VEHICLE_PROPERTY_DRIVING_STATUS";
-case VEHICLE_PROPERTY_FUEL_LEVEL_LOW: return "VEHICLE_PROPERTY_FUEL_LEVEL_LOW";
-case VEHICLE_PROPERTY_NIGHT_MODE: return "VEHICLE_PROPERTY_NIGHT_MODE";
-case VEHICLE_PROPERTY_HVAC_FAN_SPEED: return "VEHICLE_PROPERTY_HVAC_FAN_SPEED";
-case VEHICLE_PROPERTY_HVAC_FAN_DIRECTION: return "VEHICLE_PROPERTY_HVAC_FAN_DIRECTION";
-case VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT: return "VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT";
-case VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET: return "VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET";
-case VEHICLE_PROPERTY_HVAC_DEFROSTER: return "VEHICLE_PROPERTY_HVAC_DEFROSTER";
-case VEHICLE_PROPERTY_HVAC_AC_ON: return "VEHICLE_PROPERTY_HVAC_AC_ON";
-case VEHICLE_PROPERTY_HVAC_MAX_AC_ON: return "VEHICLE_PROPERTY_HVAC_MAX_AC_ON";
-case VEHICLE_PROPERTY_HVAC_MAX_DEFROST_ON: return "VEHICLE_PROPERTY_HVAC_MAX_DEFROST_ON";
-case VEHICLE_PROPERTY_HVAC_RECIRC_ON: return "VEHICLE_PROPERTY_HVAC_RECIRC_ON";
-case VEHICLE_PROPERTY_HVAC_DUAL_ON: return "VEHICLE_PROPERTY_HVAC_DUAL_ON";
-case VEHICLE_PROPERTY_HVAC_AUTO_ON: return "VEHICLE_PROPERTY_HVAC_AUTO_ON";
-case VEHICLE_PROPERTY_HVAC_SEAT_TEMPERATURE: return "VEHICLE_PROPERTY_HVAC_SEAT_TEMPERATURE";
-case VEHICLE_PROPERTY_HVAC_SIDE_MIRROR_HEAT: return "VEHICLE_PROPERTY_HVAC_SIDE_MIRROR_HEAT";
-case VEHICLE_PROPERTY_HVAC_STEERING_WHEEL_TEMP: return "VEHICLE_PROPERTY_HVAC_STEERING_WHEEL_TEMP";
-case VEHICLE_PROPERTY_HVAC_TEMPERATURE_UNITS: return "VEHICLE_PROPERTY_HVAC_TEMPERATURE_UNITS";
-case VEHICLE_PROPERTY_HVAC_ACTUAL_FAN_SPEED_RPM: return "VEHICLE_PROPERTY_HVAC_ACTUAL_FAN_SPEED_RPM";
-case VEHICLE_PROPERTY_HVAC_POWER_ON: return "VEHICLE_PROPERTY_HVAC_POWER_ON";
-case VEHICLE_PROPERTY_HVAC_FAN_DIRECTION_AVAILABLE: return "VEHICLE_PROPERTY_HVAC_FAN_DIRECTION_AVAILABLE";
-case VEHICLE_PROPERTY_ENV_OUTSIDE_TEMPERATURE: return "VEHICLE_PROPERTY_ENV_OUTSIDE_TEMPERATURE";
-case VEHICLE_PROPERTY_ENV_CABIN_TEMPERATURE: return "VEHICLE_PROPERTY_ENV_CABIN_TEMPERATURE";
-case VEHICLE_PROPERTY_RADIO_PRESET: return "VEHICLE_PROPERTY_RADIO_PRESET";
-case VEHICLE_PROPERTY_AUDIO_FOCUS: return "VEHICLE_PROPERTY_AUDIO_FOCUS";
-case VEHICLE_PROPERTY_AUDIO_VOLUME: return "VEHICLE_PROPERTY_AUDIO_VOLUME";
-case VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT: return "VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT";
-case VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY: return "VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY";
-case VEHICLE_PROPERTY_AUDIO_HW_VARIANT: return "VEHICLE_PROPERTY_AUDIO_HW_VARIANT";
-case VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT: return "VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT";
-case VEHICLE_PROPERTY_AP_POWER_STATE: return "VEHICLE_PROPERTY_AP_POWER_STATE";
-case VEHICLE_PROPERTY_DISPLAY_BRIGHTNESS: return "VEHICLE_PROPERTY_DISPLAY_BRIGHTNESS";
-case VEHICLE_PROPERTY_AP_POWER_BOOTUP_REASON: return "VEHICLE_PROPERTY_AP_POWER_BOOTUP_REASON";
-case VEHICLE_PROPERTY_HW_KEY_INPUT: return "VEHICLE_PROPERTY_HW_KEY_INPUT";
-case VEHICLE_PROPERTY_INSTRUMENT_CLUSTER_INFO: return "VEHICLE_PROPERTY_INSTRUMENT_CLUSTER_INFO";
-case VEHICLE_PROPERTY_UNIX_TIME: return "VEHICLE_PROPERTY_UNIX_TIME";
-case VEHICLE_PROPERTY_CURRENT_TIME_IN_SECONDS: return "VEHICLE_PROPERTY_CURRENT_TIME_IN_SECONDS";
-case VEHICLE_PROPERTY_DOOR_POS: return "VEHICLE_PROPERTY_DOOR_POS";
-case VEHICLE_PROPERTY_DOOR_MOVE: return "VEHICLE_PROPERTY_DOOR_MOVE";
-case VEHICLE_PROPERTY_DOOR_LOCK: return "VEHICLE_PROPERTY_DOOR_LOCK";
-case VEHICLE_PROPERTY_MIRROR_Z_POS: return "VEHICLE_PROPERTY_MIRROR_Z_POS";
-case VEHICLE_PROPERTY_MIRROR_Z_MOVE: return "VEHICLE_PROPERTY_MIRROR_Z_MOVE";
-case VEHICLE_PROPERTY_MIRROR_Y_POS: return "VEHICLE_PROPERTY_MIRROR_Y_POS";
-case VEHICLE_PROPERTY_MIRROR_Y_MOVE: return "VEHICLE_PROPERTY_MIRROR_Y_MOVE";
-case VEHICLE_PROPERTY_MIRROR_LOCK: return "VEHICLE_PROPERTY_MIRROR_LOCK";
-case VEHICLE_PROPERTY_MIRROR_FOLD: return "VEHICLE_PROPERTY_MIRROR_FOLD";
-case VEHICLE_PROPERTY_SEAT_MEMORY_SELECT: return "VEHICLE_PROPERTY_SEAT_MEMORY_SELECT";
-case VEHICLE_PROPERTY_SEAT_MEMORY_SET: return "VEHICLE_PROPERTY_SEAT_MEMORY_SET";
-case VEHICLE_PROPERTY_SEAT_BELT_BUCKLED: return "VEHICLE_PROPERTY_SEAT_BELT_BUCKLED";
-case VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_POS: return "VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_POS";
-case VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_MOVE: return "VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_MOVE";
-case VEHICLE_PROPERTY_SEAT_FORE_AFT_POS: return "VEHICLE_PROPERTY_SEAT_FORE_AFT_POS";
-case VEHICLE_PROPERTY_SEAT_FORE_AFT_MOVE: return "VEHICLE_PROPERTY_SEAT_FORE_AFT_MOVE";
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_POS: return "VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_POS";
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_MOVE: return "VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_MOVE";
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_POS: return "VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_POS";
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_MOVE: return "VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_MOVE";
-case VEHICLE_PROPERTY_SEAT_HEIGHT_POS: return "VEHICLE_PROPERTY_SEAT_HEIGHT_POS";
-case VEHICLE_PROPERTY_SEAT_HEIGHT_MOVE: return "VEHICLE_PROPERTY_SEAT_HEIGHT_MOVE";
-case VEHICLE_PROPERTY_SEAT_DEPTH_POS: return "VEHICLE_PROPERTY_SEAT_DEPTH_POS";
-case VEHICLE_PROPERTY_SEAT_DEPTH_MOVE: return "VEHICLE_PROPERTY_SEAT_DEPTH_MOVE";
-case VEHICLE_PROPERTY_SEAT_TILT_POS: return "VEHICLE_PROPERTY_SEAT_TILT_POS";
-case VEHICLE_PROPERTY_SEAT_TILT_MOVE: return "VEHICLE_PROPERTY_SEAT_TILT_MOVE";
-case VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_POS: return "VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_POS";
-case VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_MOVE: return "VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_MOVE";
-case VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_POS: return "VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_POS";
-case VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_MOVE: return "VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_MOVE";
-case VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_POS: return "VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_POS";
-case VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_MOVE: return "VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_MOVE";
-case VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_POS: return "VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_POS";
-case VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_MOVE: return "VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_MOVE";
-case VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_POS: return "VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_POS";
-case VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_MOVE: return "VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_MOVE";
-case VEHICLE_PROPERTY_WINDOW_POS: return "VEHICLE_PROPERTY_WINDOW_POS";
-case VEHICLE_PROPERTY_WINDOW_MOVE: return "VEHICLE_PROPERTY_WINDOW_MOVE";
-case VEHICLE_PROPERTY_WINDOW_VENT_POS: return "VEHICLE_PROPERTY_WINDOW_VENT_POS";
-case VEHICLE_PROPERTY_WINDOW_VENT_MOVE: return "VEHICLE_PROPERTY_WINDOW_VENT_MOVE";
-case VEHICLE_PROPERTY_WINDOW_LOCK: return "VEHICLE_PROPERTY_WINDOW_LOCK";
-case VEHICLE_PROPERTY_INTERNAL_AUDIO_STREAM_STATE: return "VEHICLE_PROPERTY_INTERNAL_AUDIO_STREAM_STATE";
-default: return "UNKNOWN_PROPERTY";
-}
-}
-
-public static int[] getVehicleChangeMode(int property) {
-switch (property) {
-case VEHICLE_PROPERTY_INFO_VIN: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_STATIC };
-case VEHICLE_PROPERTY_INFO_MAKE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_STATIC };
-case VEHICLE_PROPERTY_INFO_MODEL: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_STATIC };
-case VEHICLE_PROPERTY_INFO_MODEL_YEAR: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_STATIC };
-case VEHICLE_PROPERTY_INFO_FUEL_CAPACITY: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_STATIC };
-case VEHICLE_PROPERTY_PERF_ODOMETER: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE , VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_CONTINUOUS };
-case VEHICLE_PROPERTY_PERF_VEHICLE_SPEED: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE , VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_CONTINUOUS };
-case VEHICLE_PROPERTY_ENGINE_COOLANT_TEMP: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE , VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_CONTINUOUS };
-case VEHICLE_PROPERTY_ENGINE_OIL_TEMP: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE , VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_CONTINUOUS };
-case VEHICLE_PROPERTY_ENGINE_RPM: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE , VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_CONTINUOUS };
-case VEHICLE_PROPERTY_GEAR_SELECTION: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_CURRENT_GEAR: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_PARKING_BRAKE_ON: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_DRIVING_STATUS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_FUEL_LEVEL_LOW: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_NIGHT_MODE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_FAN_SPEED: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_FAN_DIRECTION: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_DEFROSTER: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_AC_ON: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_MAX_AC_ON: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_MAX_DEFROST_ON: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_RECIRC_ON: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_DUAL_ON: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_AUTO_ON: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_SEAT_TEMPERATURE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_SIDE_MIRROR_HEAT: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_STEERING_WHEEL_TEMP: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_TEMPERATURE_UNITS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_ACTUAL_FAN_SPEED_RPM: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_POWER_ON: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_HVAC_FAN_DIRECTION_AVAILABLE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_STATIC };
-case VEHICLE_PROPERTY_ENV_OUTSIDE_TEMPERATURE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE , VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_CONTINUOUS };
-case VEHICLE_PROPERTY_ENV_CABIN_TEMPERATURE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE , VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_CONTINUOUS };
-case VEHICLE_PROPERTY_RADIO_PRESET: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_AUDIO_FOCUS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_AUDIO_VOLUME: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_AUDIO_HW_VARIANT: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_STATIC };
-case VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_AP_POWER_STATE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_DISPLAY_BRIGHTNESS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_AP_POWER_BOOTUP_REASON: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_STATIC };
-case VEHICLE_PROPERTY_HW_KEY_INPUT: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_INSTRUMENT_CLUSTER_INFO: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_UNIX_TIME: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_SET };
-case VEHICLE_PROPERTY_CURRENT_TIME_IN_SECONDS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_SET };
-case VEHICLE_PROPERTY_DOOR_POS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_DOOR_MOVE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_DOOR_LOCK: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_MIRROR_Z_POS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_MIRROR_Z_MOVE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_MIRROR_Y_POS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_MIRROR_Y_MOVE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_MIRROR_LOCK: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_MIRROR_FOLD: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_MEMORY_SELECT: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_MEMORY_SET: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_BELT_BUCKLED: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_POS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_MOVE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_FORE_AFT_POS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_FORE_AFT_MOVE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_POS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_MOVE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_POS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_MOVE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_HEIGHT_POS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_HEIGHT_MOVE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_DEPTH_POS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_DEPTH_MOVE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_TILT_POS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_TILT_MOVE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_POS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_MOVE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_POS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_MOVE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_POS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_MOVE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_POS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_MOVE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_POS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_MOVE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_WINDOW_POS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_WINDOW_MOVE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_WINDOW_VENT_POS: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_WINDOW_VENT_MOVE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_WINDOW_LOCK: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-case VEHICLE_PROPERTY_INTERNAL_AUDIO_STREAM_STATE: return new int[] { VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE };
-default: return null;
-}
-}
-
-public static int[] getVehicleAccess(int property) {
-switch (property) {
-case VEHICLE_PROPERTY_INFO_VIN: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_INFO_MAKE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_INFO_MODEL: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_INFO_MODEL_YEAR: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_INFO_FUEL_CAPACITY: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_PERF_ODOMETER: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_PERF_VEHICLE_SPEED: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_ENGINE_COOLANT_TEMP: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_ENGINE_OIL_TEMP: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_ENGINE_RPM: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_GEAR_SELECTION: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_CURRENT_GEAR: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_PARKING_BRAKE_ON: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_DRIVING_STATUS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_FUEL_LEVEL_LOW: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_NIGHT_MODE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_HVAC_FAN_SPEED: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_HVAC_FAN_DIRECTION: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_HVAC_DEFROSTER: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_HVAC_AC_ON: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_HVAC_MAX_AC_ON: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_HVAC_MAX_DEFROST_ON: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_HVAC_RECIRC_ON: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_HVAC_DUAL_ON: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_HVAC_AUTO_ON: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_HVAC_SEAT_TEMPERATURE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_HVAC_SIDE_MIRROR_HEAT: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_HVAC_STEERING_WHEEL_TEMP: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_HVAC_TEMPERATURE_UNITS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_HVAC_ACTUAL_FAN_SPEED_RPM: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_HVAC_POWER_ON: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_HVAC_FAN_DIRECTION_AVAILABLE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_ENV_OUTSIDE_TEMPERATURE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_ENV_CABIN_TEMPERATURE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_RADIO_PRESET: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_AUDIO_FOCUS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_AUDIO_VOLUME: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_AUDIO_HW_VARIANT: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_AP_POWER_STATE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_DISPLAY_BRIGHTNESS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ , VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_AP_POWER_BOOTUP_REASON: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_HW_KEY_INPUT: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ };
-case VEHICLE_PROPERTY_INSTRUMENT_CLUSTER_INFO: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_UNIX_TIME: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_CURRENT_TIME_IN_SECONDS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_DOOR_POS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_DOOR_MOVE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_DOOR_LOCK: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_MIRROR_Z_POS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_MIRROR_Z_MOVE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_MIRROR_Y_POS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_MIRROR_Y_MOVE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_MIRROR_LOCK: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_MIRROR_FOLD: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_SEAT_MEMORY_SELECT: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_SEAT_MEMORY_SET: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_SEAT_BELT_BUCKLED: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_POS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_MOVE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_SEAT_FORE_AFT_POS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_SEAT_FORE_AFT_MOVE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_POS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_MOVE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_POS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_MOVE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_SEAT_HEIGHT_POS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_SEAT_HEIGHT_MOVE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_SEAT_DEPTH_POS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_SEAT_DEPTH_MOVE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_SEAT_TILT_POS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_SEAT_TILT_MOVE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_POS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_MOVE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_POS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_MOVE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_POS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_MOVE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_POS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_MOVE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_POS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_MOVE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_WINDOW_POS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_WINDOW_MOVE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_WINDOW_VENT_POS: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_WINDOW_VENT_MOVE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE , VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE };
-case VEHICLE_PROPERTY_WINDOW_LOCK: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-case VEHICLE_PROPERTY_INTERNAL_AUDIO_STREAM_STATE: return new int[] { VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE };
-default: return null;
-}
-}
-
-public static int getVehicleZoneType(int property) {
-switch (property) {
-case VEHICLE_PROPERTY_HVAC_FAN_SPEED: return VehicleZoneType.VEHICLE_ZONE_TYPE_ZONE ;
-case VEHICLE_PROPERTY_HVAC_FAN_DIRECTION: return VehicleZoneType.VEHICLE_ZONE_TYPE_ZONE ;
-case VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT: return VehicleZoneType.VEHICLE_ZONE_TYPE_ZONE ;
-case VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET: return VehicleZoneType.VEHICLE_ZONE_TYPE_ZONE ;
-case VEHICLE_PROPERTY_HVAC_DEFROSTER: return VehicleZoneType.VEHICLE_ZONE_TYPE_WINDOW ;
-case VEHICLE_PROPERTY_HVAC_AC_ON: return VehicleZoneType.VEHICLE_ZONE_TYPE_ZONE ;
-case VEHICLE_PROPERTY_HVAC_MAX_AC_ON: return VehicleZoneType.VEHICLE_ZONE_TYPE_ZONE ;
-case VEHICLE_PROPERTY_HVAC_MAX_DEFROST_ON: return VehicleZoneType.VEHICLE_ZONE_TYPE_ZONE ;
-case VEHICLE_PROPERTY_HVAC_RECIRC_ON: return VehicleZoneType.VEHICLE_ZONE_TYPE_ZONE ;
-case VEHICLE_PROPERTY_HVAC_DUAL_ON: return VehicleZoneType.VEHICLE_ZONE_TYPE_ZONE ;
-case VEHICLE_PROPERTY_HVAC_AUTO_ON: return VehicleZoneType.VEHICLE_ZONE_TYPE_ZONE ;
-case VEHICLE_PROPERTY_HVAC_SEAT_TEMPERATURE: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_HVAC_ACTUAL_FAN_SPEED_RPM: return VehicleZoneType.VEHICLE_ZONE_TYPE_ZONE ;
-case VEHICLE_PROPERTY_HVAC_POWER_ON: return VehicleZoneType.VEHICLE_ZONE_TYPE_ZONE ;
-case VEHICLE_PROPERTY_HVAC_FAN_DIRECTION_AVAILABLE: return VehicleZoneType.VEHICLE_ZONE_TYPE_ZONE ;
-case VEHICLE_PROPERTY_DOOR_POS: return VehicleZoneType.VEHICLE_ZONE_TYPE_DOOR ;
-case VEHICLE_PROPERTY_DOOR_MOVE: return VehicleZoneType.VEHICLE_ZONE_TYPE_DOOR ;
-case VEHICLE_PROPERTY_DOOR_LOCK: return VehicleZoneType.VEHICLE_ZONE_TYPE_DOOR ;
-case VEHICLE_PROPERTY_MIRROR_Z_POS: return VehicleZoneType.VEHICLE_ZONE_TYPE_MIRROR ;
-case VEHICLE_PROPERTY_MIRROR_Z_MOVE: return VehicleZoneType.VEHICLE_ZONE_TYPE_MIRROR ;
-case VEHICLE_PROPERTY_MIRROR_Y_POS: return VehicleZoneType.VEHICLE_ZONE_TYPE_MIRROR ;
-case VEHICLE_PROPERTY_MIRROR_Y_MOVE: return VehicleZoneType.VEHICLE_ZONE_TYPE_MIRROR ;
-case VEHICLE_PROPERTY_SEAT_MEMORY_SELECT: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_MEMORY_SET: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_BELT_BUCKLED: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_POS: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_MOVE: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_FORE_AFT_POS: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_FORE_AFT_MOVE: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_POS: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_MOVE: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_POS: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_MOVE: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_HEIGHT_POS: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_HEIGHT_MOVE: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_DEPTH_POS: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_DEPTH_MOVE: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_TILT_POS: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_TILT_MOVE: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_POS: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_MOVE: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_POS: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_MOVE: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_POS: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_MOVE: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_POS: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_MOVE: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_POS: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-case VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_MOVE: return VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT ;
-default: return VehicleZoneType.VEHICLE_ZONE_TYPE_NONE;
-}
-}
-
-
-
-
-public static final String VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_RADIO_AM_FM = "RADIO_AM_FM";
-public static final String VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_RADIO_AM_FM_HD = "RADIO_AM_FM_HD";
-public static final String VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_RADIO_DAB = "RADIO_DAB";
-public static final String VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_RADIO_SATELLITE = "RADIO_SATELLITE";
-public static final String VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_CD_DVD = "CD_DVD";
-public static final String VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_AUX_IN0 = "AUX_IN0";
-public static final String VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_AUX_IN1 = "AUX_IN1";
-public static final String VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_EXT_NAV_GUIDANCE = "EXT_NAV_GUIDANCE";
-public static final String VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_EXT_VOICE_COMMAND = "EXT_VOICE_COMMAND";
-public static final String VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_EXT_VOICE_CALL = "EXT_VOICE_CALL";
-public static final String VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_EXT_SAFETY_ALERT = "EXT_SAFETY_ALERT";
-
-
-
-public static class VehicleHvacFanDirection {
-public static final int VEHICLE_HVAC_FAN_DIRECTION_FACE = 0x1;
-public static final int VEHICLE_HVAC_FAN_DIRECTION_FLOOR = 0x2;
-public static final int VEHICLE_HVAC_FAN_DIRECTION_FACE_AND_FLOOR = 0x3;
-public static final int VEHICLE_HVAC_FAN_DIRECTION_DEFROST = 0x4;
-public static final int VEHICLE_HVAC_FAN_DIRECTION_DEFROST_AND_FLOOR = 0x5;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_HVAC_FAN_DIRECTION_FACE: return "VEHICLE_HVAC_FAN_DIRECTION_FACE";
-case VEHICLE_HVAC_FAN_DIRECTION_FLOOR: return "VEHICLE_HVAC_FAN_DIRECTION_FLOOR";
-case VEHICLE_HVAC_FAN_DIRECTION_FACE_AND_FLOOR: return "VEHICLE_HVAC_FAN_DIRECTION_FACE_AND_FLOOR";
-case VEHICLE_HVAC_FAN_DIRECTION_DEFROST: return "VEHICLE_HVAC_FAN_DIRECTION_DEFROST";
-case VEHICLE_HVAC_FAN_DIRECTION_DEFROST_AND_FLOOR: return "VEHICLE_HVAC_FAN_DIRECTION_DEFROST_AND_FLOOR";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleRadioConsts {
-public static final int VEHICLE_RADIO_PRESET_MIN_VALUE = 1;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_RADIO_PRESET_MIN_VALUE: return "VEHICLE_RADIO_PRESET_MIN_VALUE";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleAudioFocusRequest {
-public static final int VEHICLE_AUDIO_FOCUS_REQUEST_GAIN = 0x1;
-public static final int VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT = 0x2;
-public static final int VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK = 0x3;
-public static final int VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_NO_DUCK = 0x4;
-public static final int VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE = 0x5;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AUDIO_FOCUS_REQUEST_GAIN: return "VEHICLE_AUDIO_FOCUS_REQUEST_GAIN";
-case VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT: return "VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT";
-case VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK: return "VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK";
-case VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_NO_DUCK: return "VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_NO_DUCK";
-case VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE: return "VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleAudioFocusState {
-public static final int VEHICLE_AUDIO_FOCUS_STATE_GAIN = 0x1;
-public static final int VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT = 0x2;
-public static final int VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_CAN_DUCK = 0x3;
-public static final int VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT = 0x4;
-public static final int VEHICLE_AUDIO_FOCUS_STATE_LOSS = 0x5;
-public static final int VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_EXLCUSIVE = 0x6;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AUDIO_FOCUS_STATE_GAIN: return "VEHICLE_AUDIO_FOCUS_STATE_GAIN";
-case VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT: return "VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT";
-case VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_CAN_DUCK: return "VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_CAN_DUCK";
-case VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT: return "VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT";
-case VEHICLE_AUDIO_FOCUS_STATE_LOSS: return "VEHICLE_AUDIO_FOCUS_STATE_LOSS";
-case VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_EXLCUSIVE: return "VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_EXLCUSIVE";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleAudioStreamFlag {
-public static final int VEHICLE_AUDIO_STREAM_STREAM0_FLAG = (0x1<<0);
-public static final int VEHICLE_AUDIO_STREAM_STREAM1_FLAG = (0x1<<1);
-public static final int VEHICLE_AUDIO_STREAM_STREAM2_FLAG = (0x1<<2);
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AUDIO_STREAM_STREAM0_FLAG: return "VEHICLE_AUDIO_STREAM_STREAM0_FLAG";
-case VEHICLE_AUDIO_STREAM_STREAM1_FLAG: return "VEHICLE_AUDIO_STREAM_STREAM1_FLAG";
-case VEHICLE_AUDIO_STREAM_STREAM2_FLAG: return "VEHICLE_AUDIO_STREAM_STREAM2_FLAG";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleAudioStream {
-public static final int VEHICLE_AUDIO_STREAM0 = 0;
-public static final int VEHICLE_AUDIO_STREAM1 = 1;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AUDIO_STREAM0: return "VEHICLE_AUDIO_STREAM0";
-case VEHICLE_AUDIO_STREAM1: return "VEHICLE_AUDIO_STREAM1";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleAudioExtFocusFlag {
-public static final int VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG = 0x0;
-public static final int VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT_FLAG = 0x1;
-public static final int VEHICLE_AUDIO_EXT_FOCUS_CAR_TRANSIENT_FLAG = 0x2;
-public static final int VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG = 0x4;
-public static final int VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG = 0x8;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG: return "VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG";
-case VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT_FLAG: return "VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT_FLAG";
-case VEHICLE_AUDIO_EXT_FOCUS_CAR_TRANSIENT_FLAG: return "VEHICLE_AUDIO_EXT_FOCUS_CAR_TRANSIENT_FLAG";
-case VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG: return "VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG";
-case VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG: return "VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleAudioFocusIndex {
-public static final int VEHICLE_AUDIO_FOCUS_INDEX_FOCUS = 0;
-public static final int VEHICLE_AUDIO_FOCUS_INDEX_STREAMS = 1;
-public static final int VEHICLE_AUDIO_FOCUS_INDEX_EXTERNAL_FOCUS_STATE = 2;
-public static final int VEHICLE_AUDIO_FOCUS_INDEX_AUDIO_CONTEXTS = 3;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AUDIO_FOCUS_INDEX_FOCUS: return "VEHICLE_AUDIO_FOCUS_INDEX_FOCUS";
-case VEHICLE_AUDIO_FOCUS_INDEX_STREAMS: return "VEHICLE_AUDIO_FOCUS_INDEX_STREAMS";
-case VEHICLE_AUDIO_FOCUS_INDEX_EXTERNAL_FOCUS_STATE: return "VEHICLE_AUDIO_FOCUS_INDEX_EXTERNAL_FOCUS_STATE";
-case VEHICLE_AUDIO_FOCUS_INDEX_AUDIO_CONTEXTS: return "VEHICLE_AUDIO_FOCUS_INDEX_AUDIO_CONTEXTS";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleAudioContextFlag {
-public static final int VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG = 0x1;
-public static final int VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG = 0x2;
-public static final int VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG = 0x4;
-public static final int VEHICLE_AUDIO_CONTEXT_CALL_FLAG = 0x8;
-public static final int VEHICLE_AUDIO_CONTEXT_ALARM_FLAG = 0x10;
-public static final int VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG = 0x20;
-public static final int VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG = 0x40;
-public static final int VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG = 0x80;
-public static final int VEHICLE_AUDIO_CONTEXT_CD_ROM_FLAG = 0x100;
-public static final int VEHICLE_AUDIO_CONTEXT_AUX_AUDIO_FLAG = 0x200;
-public static final int VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG = 0x400;
-public static final int VEHICLE_AUDIO_CONTEXT_RADIO_FLAG = 0x800;
-public static final int VEHICLE_AUDIO_CONTEXT_EXT_SOURCE_FLAG = 0x1000;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG: return "VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG";
-case VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG: return "VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG";
-case VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG: return "VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG";
-case VEHICLE_AUDIO_CONTEXT_CALL_FLAG: return "VEHICLE_AUDIO_CONTEXT_CALL_FLAG";
-case VEHICLE_AUDIO_CONTEXT_ALARM_FLAG: return "VEHICLE_AUDIO_CONTEXT_ALARM_FLAG";
-case VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG: return "VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG";
-case VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG: return "VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG";
-case VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG: return "VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG";
-case VEHICLE_AUDIO_CONTEXT_CD_ROM_FLAG: return "VEHICLE_AUDIO_CONTEXT_CD_ROM_FLAG";
-case VEHICLE_AUDIO_CONTEXT_AUX_AUDIO_FLAG: return "VEHICLE_AUDIO_CONTEXT_AUX_AUDIO_FLAG";
-case VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG: return "VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG";
-case VEHICLE_AUDIO_CONTEXT_RADIO_FLAG: return "VEHICLE_AUDIO_CONTEXT_RADIO_FLAG";
-case VEHICLE_AUDIO_CONTEXT_EXT_SOURCE_FLAG: return "VEHICLE_AUDIO_CONTEXT_EXT_SOURCE_FLAG";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleAudioVolumeCapabilityFlag {
-public static final int VEHICLE_AUDIO_VOLUME_CAPABILITY_PERSISTENT_STORAGE = 0x1;
-public static final int VEHICLE_AUDIO_VOLUME_CAPABILITY_MASTER_VOLUME_ONLY = 0x2;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AUDIO_VOLUME_CAPABILITY_PERSISTENT_STORAGE: return "VEHICLE_AUDIO_VOLUME_CAPABILITY_PERSISTENT_STORAGE";
-case VEHICLE_AUDIO_VOLUME_CAPABILITY_MASTER_VOLUME_ONLY: return "VEHICLE_AUDIO_VOLUME_CAPABILITY_MASTER_VOLUME_ONLY";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleAudioVolumeState {
-public static final int VEHICLE_AUDIO_VOLUME_STATE_OK = 0;
-public static final int VEHICLE_AUDIO_VOLUME_STATE_LIMIT_REACHED = 1;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AUDIO_VOLUME_STATE_OK: return "VEHICLE_AUDIO_VOLUME_STATE_OK";
-case VEHICLE_AUDIO_VOLUME_STATE_LIMIT_REACHED: return "VEHICLE_AUDIO_VOLUME_STATE_LIMIT_REACHED";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleAudioVolumeIndex {
-public static final int VEHICLE_AUDIO_VOLUME_INDEX_STREAM = 0;
-public static final int VEHICLE_AUDIO_VOLUME_INDEX_VOLUME = 1;
-public static final int VEHICLE_AUDIO_VOLUME_INDEX_STATE = 2;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AUDIO_VOLUME_INDEX_STREAM: return "VEHICLE_AUDIO_VOLUME_INDEX_STREAM";
-case VEHICLE_AUDIO_VOLUME_INDEX_VOLUME: return "VEHICLE_AUDIO_VOLUME_INDEX_VOLUME";
-case VEHICLE_AUDIO_VOLUME_INDEX_STATE: return "VEHICLE_AUDIO_VOLUME_INDEX_STATE";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleAudioVolumeLimitIndex {
-public static final int VEHICLE_AUDIO_VOLUME_LIMIT_INDEX_STREAM = 0;
-public static final int VEHICLE_AUDIO_VOLUME_LIMIT_INDEX_MAX_VOLUME = 1;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AUDIO_VOLUME_LIMIT_INDEX_STREAM: return "VEHICLE_AUDIO_VOLUME_LIMIT_INDEX_STREAM";
-case VEHICLE_AUDIO_VOLUME_LIMIT_INDEX_MAX_VOLUME: return "VEHICLE_AUDIO_VOLUME_LIMIT_INDEX_MAX_VOLUME";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleAudioRoutingPolicyIndex {
-public static final int VEHICLE_AUDIO_ROUTING_POLICY_INDEX_STREAM = 0;
-public static final int VEHICLE_AUDIO_ROUTING_POLICY_INDEX_CONTEXTS = 1;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AUDIO_ROUTING_POLICY_INDEX_STREAM: return "VEHICLE_AUDIO_ROUTING_POLICY_INDEX_STREAM";
-case VEHICLE_AUDIO_ROUTING_POLICY_INDEX_CONTEXTS: return "VEHICLE_AUDIO_ROUTING_POLICY_INDEX_CONTEXTS";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleAudioHwVariantConfigFlag {
-public static final int VEHICLE_AUDIO_HW_VARIANT_FLAG_INTERNAL_RADIO_FLAG = 0x1;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AUDIO_HW_VARIANT_FLAG_INTERNAL_RADIO_FLAG: return "VEHICLE_AUDIO_HW_VARIANT_FLAG_INTERNAL_RADIO_FLAG";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleApPowerStateConfigFlag {
-public static final int VEHICLE_AP_POWER_STATE_CONFIG_ENABLE_DEEP_SLEEP_FLAG = 0x1;
-public static final int VEHICLE_AP_POWER_STATE_CONFIG_SUPPORT_TIMER_POWER_ON_FLAG = 0x2;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AP_POWER_STATE_CONFIG_ENABLE_DEEP_SLEEP_FLAG: return "VEHICLE_AP_POWER_STATE_CONFIG_ENABLE_DEEP_SLEEP_FLAG";
-case VEHICLE_AP_POWER_STATE_CONFIG_SUPPORT_TIMER_POWER_ON_FLAG: return "VEHICLE_AP_POWER_STATE_CONFIG_SUPPORT_TIMER_POWER_ON_FLAG";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleApPowerState {
-public static final int VEHICLE_AP_POWER_STATE_OFF = 0;
-public static final int VEHICLE_AP_POWER_STATE_DEEP_SLEEP = 1;
-public static final int VEHICLE_AP_POWER_STATE_ON_DISP_OFF = 2;
-public static final int VEHICLE_AP_POWER_STATE_ON_FULL = 3;
-public static final int VEHICLE_AP_POWER_STATE_SHUTDOWN_PREPARE = 4;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AP_POWER_STATE_OFF: return "VEHICLE_AP_POWER_STATE_OFF";
-case VEHICLE_AP_POWER_STATE_DEEP_SLEEP: return "VEHICLE_AP_POWER_STATE_DEEP_SLEEP";
-case VEHICLE_AP_POWER_STATE_ON_DISP_OFF: return "VEHICLE_AP_POWER_STATE_ON_DISP_OFF";
-case VEHICLE_AP_POWER_STATE_ON_FULL: return "VEHICLE_AP_POWER_STATE_ON_FULL";
-case VEHICLE_AP_POWER_STATE_SHUTDOWN_PREPARE: return "VEHICLE_AP_POWER_STATE_SHUTDOWN_PREPARE";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleApPowerStateShutdownParam {
-public static final int VEHICLE_AP_POWER_SHUTDOWN_PARAM_SHUTDOWN_IMMEDIATELY = 1;
-public static final int VEHICLE_AP_POWER_SHUTDOWN_PARAM_CAN_SLEEP = 2;
-public static final int VEHICLE_AP_POWER_SHUTDOWN_PARAM_SHUTDOWN_ONLY = 3;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AP_POWER_SHUTDOWN_PARAM_SHUTDOWN_IMMEDIATELY: return "VEHICLE_AP_POWER_SHUTDOWN_PARAM_SHUTDOWN_IMMEDIATELY";
-case VEHICLE_AP_POWER_SHUTDOWN_PARAM_CAN_SLEEP: return "VEHICLE_AP_POWER_SHUTDOWN_PARAM_CAN_SLEEP";
-case VEHICLE_AP_POWER_SHUTDOWN_PARAM_SHUTDOWN_ONLY: return "VEHICLE_AP_POWER_SHUTDOWN_PARAM_SHUTDOWN_ONLY";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleApPowerSetState {
-public static final int VEHICLE_AP_POWER_SET_BOOT_COMPLETE = 0x1;
-public static final int VEHICLE_AP_POWER_SET_DEEP_SLEEP_ENTRY = 0x2;
-public static final int VEHICLE_AP_POWER_SET_DEEP_SLEEP_EXIT = 0x3;
-public static final int VEHICLE_AP_POWER_SET_SHUTDOWN_POSTPONE = 0x4;
-public static final int VEHICLE_AP_POWER_SET_SHUTDOWN_START = 0x5;
-public static final int VEHICLE_AP_POWER_SET_DISPLAY_OFF = 0x6;
-public static final int VEHICLE_AP_POWER_SET_DISPLAY_ON = 0x7;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AP_POWER_SET_BOOT_COMPLETE: return "VEHICLE_AP_POWER_SET_BOOT_COMPLETE";
-case VEHICLE_AP_POWER_SET_DEEP_SLEEP_ENTRY: return "VEHICLE_AP_POWER_SET_DEEP_SLEEP_ENTRY";
-case VEHICLE_AP_POWER_SET_DEEP_SLEEP_EXIT: return "VEHICLE_AP_POWER_SET_DEEP_SLEEP_EXIT";
-case VEHICLE_AP_POWER_SET_SHUTDOWN_POSTPONE: return "VEHICLE_AP_POWER_SET_SHUTDOWN_POSTPONE";
-case VEHICLE_AP_POWER_SET_SHUTDOWN_START: return "VEHICLE_AP_POWER_SET_SHUTDOWN_START";
-case VEHICLE_AP_POWER_SET_DISPLAY_OFF: return "VEHICLE_AP_POWER_SET_DISPLAY_OFF";
-case VEHICLE_AP_POWER_SET_DISPLAY_ON: return "VEHICLE_AP_POWER_SET_DISPLAY_ON";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleApPowerStateIndex {
-public static final int VEHICLE_AP_POWER_STATE_INDEX_STATE = 0;
-public static final int VEHICLE_AP_POWER_STATE_INDEX_ADDITIONAL = 1;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AP_POWER_STATE_INDEX_STATE: return "VEHICLE_AP_POWER_STATE_INDEX_STATE";
-case VEHICLE_AP_POWER_STATE_INDEX_ADDITIONAL: return "VEHICLE_AP_POWER_STATE_INDEX_ADDITIONAL";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleApPowerBootupReason {
-public static final int VEHICLE_AP_POWER_BOOTUP_REASON_USER_POWER_ON = 0;
-public static final int VEHICLE_AP_POWER_BOOTUP_REASON_USER_UNLOCK = 1;
-public static final int VEHICLE_AP_POWER_BOOTUP_REASON_TIMER = 2;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AP_POWER_BOOTUP_REASON_USER_POWER_ON: return "VEHICLE_AP_POWER_BOOTUP_REASON_USER_POWER_ON";
-case VEHICLE_AP_POWER_BOOTUP_REASON_USER_UNLOCK: return "VEHICLE_AP_POWER_BOOTUP_REASON_USER_UNLOCK";
-case VEHICLE_AP_POWER_BOOTUP_REASON_TIMER: return "VEHICLE_AP_POWER_BOOTUP_REASON_TIMER";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleHwKeyInputAction {
-public static final int VEHICLE_HW_KEY_INPUT_ACTION_DOWN = 0;
-public static final int VEHICLE_HW_KEY_INPUT_ACTION_UP = 1;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_HW_KEY_INPUT_ACTION_DOWN: return "VEHICLE_HW_KEY_INPUT_ACTION_DOWN";
-case VEHICLE_HW_KEY_INPUT_ACTION_UP: return "VEHICLE_HW_KEY_INPUT_ACTION_UP";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleDisplay {
-public static final int VEHICLE_DISPLAY_MAIN = 0;
-public static final int VEHICLE_DISPLAY_INSTRUMENT_CLUSTER = 1;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_DISPLAY_MAIN: return "VEHICLE_DISPLAY_MAIN";
-case VEHICLE_DISPLAY_INSTRUMENT_CLUSTER: return "VEHICLE_DISPLAY_INSTRUMENT_CLUSTER";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleInstumentClusterType {
-public static final int VEHICLE_INSTRUMENT_CLUSTER_TYPE_NONE = 0;
-public static final int VEHICLE_INSTRUMENT_CLUSTER_TYPE_HAL_INTERFACE = 1;
-public static final int VEHICLE_INSTRUMENT_CLUSTER_TYPE_EXTERNAL_DISPLAY = 2;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_INSTRUMENT_CLUSTER_TYPE_NONE: return "VEHICLE_INSTRUMENT_CLUSTER_TYPE_NONE";
-case VEHICLE_INSTRUMENT_CLUSTER_TYPE_HAL_INTERFACE: return "VEHICLE_INSTRUMENT_CLUSTER_TYPE_HAL_INTERFACE";
-case VEHICLE_INSTRUMENT_CLUSTER_TYPE_EXTERNAL_DISPLAY: return "VEHICLE_INSTRUMENT_CLUSTER_TYPE_EXTERNAL_DISPLAY";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleValueType {
-public static final int VEHICLE_VALUE_TYPE_SHOUD_NOT_USE = 0x00;
-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_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;
-public static final int VEHICLE_VALUE_TYPE_FLOAT_VEC4 = 0x13;
-public static final int VEHICLE_VALUE_TYPE_INT32 = 0x20;
-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_FLOAT_VEC4 = 0x33;
-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 final int VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4 = 0x43;
-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_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";
-case VEHICLE_VALUE_TYPE_FLOAT_VEC2: return "VEHICLE_VALUE_TYPE_FLOAT_VEC2";
-case VEHICLE_VALUE_TYPE_FLOAT_VEC3: return "VEHICLE_VALUE_TYPE_FLOAT_VEC3";
-case VEHICLE_VALUE_TYPE_FLOAT_VEC4: return "VEHICLE_VALUE_TYPE_FLOAT_VEC4";
-case VEHICLE_VALUE_TYPE_INT32: return "VEHICLE_VALUE_TYPE_INT32";
-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_FLOAT_VEC4: return "VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4";
-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";
-case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4: return "VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleUnitType {
-public static final int VEHICLE_UNIT_TYPE_SHOULD_NOT_USE = 0x00000000;
-public static final int VEHICLE_UNIT_TYPE_METER_PER_SEC = 0x00000001;
-public static final int VEHICLE_UNIT_TYPE_RPM = 0x00000002;
-public static final int VEHICLE_UNIT_TYPE_HZ = 0x00000003;
-public static final int VEHICLE_UNIT_TYPE_PERCENTILE = 0x00000010;
-public static final int VEHICLE_UNIT_TYPE_MILLIMETER = 0x00000020;
-public static final int VEHICLE_UNIT_TYPE_METER = 0x00000021;
-public static final int VEHICLE_UNIT_TYPE_KILOMETER = 0x00000023;
-public static final int VEHICLE_UNIT_TYPE_CELSIUS = 0x00000030;
-public static final int VEHICLE_UNIT_TYPE_FAHRENHEIT = 0x00000031;
-public static final int VEHICLE_UNIT_TYPE_KELVIN = 0x00000032;
-public static final int VEHICLE_UNIT_TYPE_MILLILITER = 0x00000040;
-public static final int VEHICLE_UNIT_TYPE_NANO_SECS = 0x00000050;
-public static final int VEHICLE_UNIT_TYPE_SECS = 0x00000053;
-public static final int VEHICLE_UNIT_TYPE_YEAR = 0x00000059;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_UNIT_TYPE_SHOULD_NOT_USE: return "VEHICLE_UNIT_TYPE_SHOULD_NOT_USE";
-case VEHICLE_UNIT_TYPE_METER_PER_SEC: return "VEHICLE_UNIT_TYPE_METER_PER_SEC";
-case VEHICLE_UNIT_TYPE_RPM: return "VEHICLE_UNIT_TYPE_RPM";
-case VEHICLE_UNIT_TYPE_HZ: return "VEHICLE_UNIT_TYPE_HZ";
-case VEHICLE_UNIT_TYPE_PERCENTILE: return "VEHICLE_UNIT_TYPE_PERCENTILE";
-case VEHICLE_UNIT_TYPE_MILLIMETER: return "VEHICLE_UNIT_TYPE_MILLIMETER";
-case VEHICLE_UNIT_TYPE_METER: return "VEHICLE_UNIT_TYPE_METER";
-case VEHICLE_UNIT_TYPE_KILOMETER: return "VEHICLE_UNIT_TYPE_KILOMETER";
-case VEHICLE_UNIT_TYPE_CELSIUS: return "VEHICLE_UNIT_TYPE_CELSIUS";
-case VEHICLE_UNIT_TYPE_FAHRENHEIT: return "VEHICLE_UNIT_TYPE_FAHRENHEIT";
-case VEHICLE_UNIT_TYPE_KELVIN: return "VEHICLE_UNIT_TYPE_KELVIN";
-case VEHICLE_UNIT_TYPE_MILLILITER: return "VEHICLE_UNIT_TYPE_MILLILITER";
-case VEHICLE_UNIT_TYPE_NANO_SECS: return "VEHICLE_UNIT_TYPE_NANO_SECS";
-case VEHICLE_UNIT_TYPE_SECS: return "VEHICLE_UNIT_TYPE_SECS";
-case VEHICLE_UNIT_TYPE_YEAR: return "VEHICLE_UNIT_TYPE_YEAR";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehiclePropChangeMode {
-public static final int VEHICLE_PROP_CHANGE_MODE_STATIC = 0x00;
-public static final int VEHICLE_PROP_CHANGE_MODE_ON_CHANGE = 0x01;
-public static final int VEHICLE_PROP_CHANGE_MODE_CONTINUOUS = 0x02;
-public static final int VEHICLE_PROP_CHANGE_MODE_POLL = 0x03;
-public static final int VEHICLE_PROP_CHANGE_MODE_ON_SET = 0x04;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_PROP_CHANGE_MODE_STATIC: return "VEHICLE_PROP_CHANGE_MODE_STATIC";
-case VEHICLE_PROP_CHANGE_MODE_ON_CHANGE: return "VEHICLE_PROP_CHANGE_MODE_ON_CHANGE";
-case VEHICLE_PROP_CHANGE_MODE_CONTINUOUS: return "VEHICLE_PROP_CHANGE_MODE_CONTINUOUS";
-case VEHICLE_PROP_CHANGE_MODE_POLL: return "VEHICLE_PROP_CHANGE_MODE_POLL";
-case VEHICLE_PROP_CHANGE_MODE_ON_SET: return "VEHICLE_PROP_CHANGE_MODE_ON_SET";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehiclePropAccess {
-public static final int VEHICLE_PROP_ACCESS_READ = 0x01;
-public static final int VEHICLE_PROP_ACCESS_WRITE = 0x02;
-public static final int VEHICLE_PROP_ACCESS_READ_WRITE = 0x03;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_PROP_ACCESS_READ: return "VEHICLE_PROP_ACCESS_READ";
-case VEHICLE_PROP_ACCESS_WRITE: return "VEHICLE_PROP_ACCESS_WRITE";
-case VEHICLE_PROP_ACCESS_READ_WRITE: return "VEHICLE_PROP_ACCESS_READ_WRITE";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehiclePermissionModel {
-public static final int VEHICLE_PERMISSION_NO_RESTRICTION = 0;
-public static final int VEHICLE_PERMISSION_OEM_ONLY = 0x1;
-public static final int VEHICLE_PERMISSION_SYSTEM_APP_ONLY = 0x2;
-public static final int VEHICLE_PERMISSION_OEM_OR_SYSTEM_APP = 0x3;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_PERMISSION_NO_RESTRICTION: return "VEHICLE_PERMISSION_NO_RESTRICTION";
-case VEHICLE_PERMISSION_OEM_ONLY: return "VEHICLE_PERMISSION_OEM_ONLY";
-case VEHICLE_PERMISSION_SYSTEM_APP_ONLY: return "VEHICLE_PERMISSION_SYSTEM_APP_ONLY";
-case VEHICLE_PERMISSION_OEM_OR_SYSTEM_APP: return "VEHICLE_PERMISSION_OEM_OR_SYSTEM_APP";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleDrivingStatus {
-public static final int VEHICLE_DRIVING_STATUS_UNRESTRICTED = 0x00;
-public static final int VEHICLE_DRIVING_STATUS_NO_VIDEO = 0x01;
-public static final int VEHICLE_DRIVING_STATUS_NO_KEYBOARD_INPUT = 0x02;
-public static final int VEHICLE_DRIVING_STATUS_NO_VOICE_INPUT = 0x04;
-public static final int VEHICLE_DRIVING_STATUS_NO_CONFIG = 0x08;
-public static final int VEHICLE_DRIVING_STATUS_LIMIT_MESSAGE_LEN = 0x10;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_DRIVING_STATUS_UNRESTRICTED: return "VEHICLE_DRIVING_STATUS_UNRESTRICTED";
-case VEHICLE_DRIVING_STATUS_NO_VIDEO: return "VEHICLE_DRIVING_STATUS_NO_VIDEO";
-case VEHICLE_DRIVING_STATUS_NO_KEYBOARD_INPUT: return "VEHICLE_DRIVING_STATUS_NO_KEYBOARD_INPUT";
-case VEHICLE_DRIVING_STATUS_NO_VOICE_INPUT: return "VEHICLE_DRIVING_STATUS_NO_VOICE_INPUT";
-case VEHICLE_DRIVING_STATUS_NO_CONFIG: return "VEHICLE_DRIVING_STATUS_NO_CONFIG";
-case VEHICLE_DRIVING_STATUS_LIMIT_MESSAGE_LEN: return "VEHICLE_DRIVING_STATUS_LIMIT_MESSAGE_LEN";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleGear {
-public static final int VEHICLE_GEAR_NEUTRAL = 0x0001;
-public static final int VEHICLE_GEAR_REVERSE = 0x0002;
-public static final int VEHICLE_GEAR_PARK = 0x0004;
-public static final int VEHICLE_GEAR_DRIVE = 0x0008;
-public static final int VEHICLE_GEAR_LOW = 0x0010;
-public static final int VEHICLE_GEAR_1 = 0x0010;
-public static final int VEHICLE_GEAR_2 = 0x0020;
-public static final int VEHICLE_GEAR_3 = 0x0040;
-public static final int VEHICLE_GEAR_4 = 0x0080;
-public static final int VEHICLE_GEAR_5 = 0x0100;
-public static final int VEHICLE_GEAR_6 = 0x0200;
-public static final int VEHICLE_GEAR_7 = 0x0400;
-public static final int VEHICLE_GEAR_8 = 0x0800;
-public static final int VEHICLE_GEAR_9 = 0x1000;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_GEAR_NEUTRAL: return "VEHICLE_GEAR_NEUTRAL";
-case VEHICLE_GEAR_REVERSE: return "VEHICLE_GEAR_REVERSE";
-case VEHICLE_GEAR_PARK: return "VEHICLE_GEAR_PARK";
-case VEHICLE_GEAR_DRIVE: return "VEHICLE_GEAR_DRIVE";
-case VEHICLE_GEAR_LOW: return "VEHICLE_GEAR_LOW";
-case VEHICLE_GEAR_2: return "VEHICLE_GEAR_2";
-case VEHICLE_GEAR_3: return "VEHICLE_GEAR_3";
-case VEHICLE_GEAR_4: return "VEHICLE_GEAR_4";
-case VEHICLE_GEAR_5: return "VEHICLE_GEAR_5";
-case VEHICLE_GEAR_6: return "VEHICLE_GEAR_6";
-case VEHICLE_GEAR_7: return "VEHICLE_GEAR_7";
-case VEHICLE_GEAR_8: return "VEHICLE_GEAR_8";
-case VEHICLE_GEAR_9: return "VEHICLE_GEAR_9";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleZone {
-public static final int VEHICLE_ZONE_ROW_1_LEFT = 0x00000001;
-public static final int VEHICLE_ZONE_ROW_1_CENTER = 0x00000002;
-public static final int VEHICLE_ZONE_ROW_1_RIGHT = 0x00000004;
-public static final int VEHICLE_ZONE_ROW_1_ALL = 0x00000008;
-public static final int VEHICLE_ZONE_ROW_2_LEFT = 0x00000010;
-public static final int VEHICLE_ZONE_ROW_2_CENTER = 0x00000020;
-public static final int VEHICLE_ZONE_ROW_2_RIGHT = 0x00000040;
-public static final int VEHICLE_ZONE_ROW_2_ALL = 0x00000080;
-public static final int VEHICLE_ZONE_ROW_3_LEFT = 0x00000100;
-public static final int VEHICLE_ZONE_ROW_3_CENTER = 0x00000200;
-public static final int VEHICLE_ZONE_ROW_3_RIGHT = 0x00000400;
-public static final int VEHICLE_ZONE_ROW_3_ALL = 0x00000800;
-public static final int VEHICLE_ZONE_ROW_4_LEFT = 0x00001000;
-public static final int VEHICLE_ZONE_ROW_4_CENTER = 0x00002000;
-public static final int VEHICLE_ZONE_ROW_4_RIGHT = 0x00004000;
-public static final int VEHICLE_ZONE_ROW_4_ALL = 0x00008000;
-public static final int VEHICLE_ZONE_ALL = 0x80000000;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_ZONE_ROW_1_LEFT: return "VEHICLE_ZONE_ROW_1_LEFT";
-case VEHICLE_ZONE_ROW_1_CENTER: return "VEHICLE_ZONE_ROW_1_CENTER";
-case VEHICLE_ZONE_ROW_1_RIGHT: return "VEHICLE_ZONE_ROW_1_RIGHT";
-case VEHICLE_ZONE_ROW_1_ALL: return "VEHICLE_ZONE_ROW_1_ALL";
-case VEHICLE_ZONE_ROW_2_LEFT: return "VEHICLE_ZONE_ROW_2_LEFT";
-case VEHICLE_ZONE_ROW_2_CENTER: return "VEHICLE_ZONE_ROW_2_CENTER";
-case VEHICLE_ZONE_ROW_2_RIGHT: return "VEHICLE_ZONE_ROW_2_RIGHT";
-case VEHICLE_ZONE_ROW_2_ALL: return "VEHICLE_ZONE_ROW_2_ALL";
-case VEHICLE_ZONE_ROW_3_LEFT: return "VEHICLE_ZONE_ROW_3_LEFT";
-case VEHICLE_ZONE_ROW_3_CENTER: return "VEHICLE_ZONE_ROW_3_CENTER";
-case VEHICLE_ZONE_ROW_3_RIGHT: return "VEHICLE_ZONE_ROW_3_RIGHT";
-case VEHICLE_ZONE_ROW_3_ALL: return "VEHICLE_ZONE_ROW_3_ALL";
-case VEHICLE_ZONE_ROW_4_LEFT: return "VEHICLE_ZONE_ROW_4_LEFT";
-case VEHICLE_ZONE_ROW_4_CENTER: return "VEHICLE_ZONE_ROW_4_CENTER";
-case VEHICLE_ZONE_ROW_4_RIGHT: return "VEHICLE_ZONE_ROW_4_RIGHT";
-case VEHICLE_ZONE_ROW_4_ALL: return "VEHICLE_ZONE_ROW_4_ALL";
-case VEHICLE_ZONE_ALL: return "VEHICLE_ZONE_ALL";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleSeat {
-public static final int VEHICLE_SEAT_ROW_1_LEFT = 0x0001;
-public static final int VEHICLE_SEAT_ROW_1_CENTER = 0x0002;
-public static final int VEHICLE_SEAT_ROW_1_RIGHT = 0x0004;
-public static final int VEHICLE_SEAT_ROW_2_LEFT = 0x0010;
-public static final int VEHICLE_SEAT_ROW_2_CENTER = 0x0020;
-public static final int VEHICLE_SEAT_ROW_2_RIGHT = 0x0040;
-public static final int VEHICLE_SEAT_ROW_3_LEFT = 0x0100;
-public static final int VEHICLE_SEAT_ROW_3_CENTER = 0x0200;
-public static final int VEHICLE_SEAT_ROW_3_RIGHT = 0x0400;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_SEAT_ROW_1_LEFT: return "VEHICLE_SEAT_ROW_1_LEFT";
-case VEHICLE_SEAT_ROW_1_CENTER: return "VEHICLE_SEAT_ROW_1_CENTER";
-case VEHICLE_SEAT_ROW_1_RIGHT: return "VEHICLE_SEAT_ROW_1_RIGHT";
-case VEHICLE_SEAT_ROW_2_LEFT: return "VEHICLE_SEAT_ROW_2_LEFT";
-case VEHICLE_SEAT_ROW_2_CENTER: return "VEHICLE_SEAT_ROW_2_CENTER";
-case VEHICLE_SEAT_ROW_2_RIGHT: return "VEHICLE_SEAT_ROW_2_RIGHT";
-case VEHICLE_SEAT_ROW_3_LEFT: return "VEHICLE_SEAT_ROW_3_LEFT";
-case VEHICLE_SEAT_ROW_3_CENTER: return "VEHICLE_SEAT_ROW_3_CENTER";
-case VEHICLE_SEAT_ROW_3_RIGHT: return "VEHICLE_SEAT_ROW_3_RIGHT";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleWindow {
-public static final int VEHICLE_WINDOW_FRONT_WINDSHIELD = 0x0001;
-public static final int VEHICLE_WINDOW_REAR_WINDSHIELD = 0x0002;
-public static final int VEHICLE_WINDOW_ROOF_TOP = 0x0004;
-public static final int VEHICLE_WINDOW_ROW_1_LEFT = 0x0010;
-public static final int VEHICLE_WINDOW_ROW_1_RIGHT = 0x0020;
-public static final int VEHICLE_WINDOW_ROW_2_LEFT = 0x0100;
-public static final int VEHICLE_WINDOW_ROW_2_RIGHT = 0x0200;
-public static final int VEHICLE_WINDOW_ROW_3_LEFT = 0x1000;
-public static final int VEHICLE_WINDOW_ROW_3_RIGHT = 0x2000;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_WINDOW_FRONT_WINDSHIELD: return "VEHICLE_WINDOW_FRONT_WINDSHIELD";
-case VEHICLE_WINDOW_REAR_WINDSHIELD: return "VEHICLE_WINDOW_REAR_WINDSHIELD";
-case VEHICLE_WINDOW_ROOF_TOP: return "VEHICLE_WINDOW_ROOF_TOP";
-case VEHICLE_WINDOW_ROW_1_LEFT: return "VEHICLE_WINDOW_ROW_1_LEFT";
-case VEHICLE_WINDOW_ROW_1_RIGHT: return "VEHICLE_WINDOW_ROW_1_RIGHT";
-case VEHICLE_WINDOW_ROW_2_LEFT: return "VEHICLE_WINDOW_ROW_2_LEFT";
-case VEHICLE_WINDOW_ROW_2_RIGHT: return "VEHICLE_WINDOW_ROW_2_RIGHT";
-case VEHICLE_WINDOW_ROW_3_LEFT: return "VEHICLE_WINDOW_ROW_3_LEFT";
-case VEHICLE_WINDOW_ROW_3_RIGHT: return "VEHICLE_WINDOW_ROW_3_RIGHT";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleDoor {
-public static final int VEHICLE_DOOR_ROW_1_LEFT = 0x00000001;
-public static final int VEHICLE_DOOR_ROW_1_RIGHT = 0x00000004;
-public static final int VEHICLE_DOOR_ROW_2_LEFT = 0x00000010;
-public static final int VEHICLE_DOOR_ROW_2_RIGHT = 0x00000040;
-public static final int VEHICLE_DOOR_ROW_3_LEFT = 0x00000100;
-public static final int VEHICLE_DOOR_ROW_3_RIGHT = 0x00000400;
-public static final int VEHICLE_DOOR_HOOD = 0x10000000;
-public static final int VEHICLE_DOOR_REAR = 0x20000000;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_DOOR_ROW_1_LEFT: return "VEHICLE_DOOR_ROW_1_LEFT";
-case VEHICLE_DOOR_ROW_1_RIGHT: return "VEHICLE_DOOR_ROW_1_RIGHT";
-case VEHICLE_DOOR_ROW_2_LEFT: return "VEHICLE_DOOR_ROW_2_LEFT";
-case VEHICLE_DOOR_ROW_2_RIGHT: return "VEHICLE_DOOR_ROW_2_RIGHT";
-case VEHICLE_DOOR_ROW_3_LEFT: return "VEHICLE_DOOR_ROW_3_LEFT";
-case VEHICLE_DOOR_ROW_3_RIGHT: return "VEHICLE_DOOR_ROW_3_RIGHT";
-case VEHICLE_DOOR_HOOD: return "VEHICLE_DOOR_HOOD";
-case VEHICLE_DOOR_REAR: return "VEHICLE_DOOR_REAR";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleMirror {
-public static final int VEHICLE_MIRROR_DRIVER_LEFT = 0x00000001;
-public static final int VEHICLE_MIRROR_DRIVER_RIGHT = 0x00000002;
-public static final int VEHICLE_MIRROR_DRIVER_CENTER = 0x00000004;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_MIRROR_DRIVER_LEFT: return "VEHICLE_MIRROR_DRIVER_LEFT";
-case VEHICLE_MIRROR_DRIVER_RIGHT: return "VEHICLE_MIRROR_DRIVER_RIGHT";
-case VEHICLE_MIRROR_DRIVER_CENTER: return "VEHICLE_MIRROR_DRIVER_CENTER";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleTurnSignal {
-public static final int VEHICLE_SIGNAL_NONE = 0x00;
-public static final int VEHICLE_SIGNAL_RIGHT = 0x01;
-public static final int VEHICLE_SIGNAL_LEFT = 0x02;
-public static final int VEHICLE_SIGNAL_EMERGENCY = 0x04;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_SIGNAL_NONE: return "VEHICLE_SIGNAL_NONE";
-case VEHICLE_SIGNAL_RIGHT: return "VEHICLE_SIGNAL_RIGHT";
-case VEHICLE_SIGNAL_LEFT: return "VEHICLE_SIGNAL_LEFT";
-case VEHICLE_SIGNAL_EMERGENCY: return "VEHICLE_SIGNAL_EMERGENCY";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleZoneType {
-public static final int VEHICLE_ZONE_TYPE_NONE = 0x00;
-public static final int VEHICLE_ZONE_TYPE_ZONE = 0x01;
-public static final int VEHICLE_ZONE_TYPE_SEAT = 0x02;
-public static final int VEHICLE_ZONE_TYPE_DOOR = 0x04;
-public static final int VEHICLE_ZONE_TYPE_WINDOW = 0x10;
-public static final int VEHICLE_ZONE_TYPE_MIRROR = 0x20;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_ZONE_TYPE_NONE: return "VEHICLE_ZONE_TYPE_NONE";
-case VEHICLE_ZONE_TYPE_ZONE: return "VEHICLE_ZONE_TYPE_ZONE";
-case VEHICLE_ZONE_TYPE_SEAT: return "VEHICLE_ZONE_TYPE_SEAT";
-case VEHICLE_ZONE_TYPE_DOOR: return "VEHICLE_ZONE_TYPE_DOOR";
-case VEHICLE_ZONE_TYPE_WINDOW: return "VEHICLE_ZONE_TYPE_WINDOW";
-case VEHICLE_ZONE_TYPE_MIRROR: return "VEHICLE_ZONE_TYPE_MIRROR";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleBoolean {
-public static final int VEHICLE_FALSE = 0x00;
-public static final int VEHICLE_TRUE = 0x01;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_FALSE: return "VEHICLE_FALSE";
-case VEHICLE_TRUE: return "VEHICLE_TRUE";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehiclePropertyOperation {
-public static final int VEHICLE_OPERATION_GENERIC = 0;
-public static final int VEHICLE_OPERATION_SET = 1;
-public static final int VEHICLE_OPERATION_GET = 2;
-public static final int VEHICLE_OPERATION_SUBSCRIBE = 3;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_OPERATION_GENERIC: return "VEHICLE_OPERATION_GENERIC";
-case VEHICLE_OPERATION_SET: return "VEHICLE_OPERATION_SET";
-case VEHICLE_OPERATION_GET: return "VEHICLE_OPERATION_GET";
-case VEHICLE_OPERATION_SUBSCRIBE: return "VEHICLE_OPERATION_SUBSCRIBE";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleAudioStreamState {
-public static final int VEHICLE_AUDIO_STREAM_STATE_STOPPED = 0;
-public static final int VEHICLE_AUDIO_STREAM_STATE_STARTED = 1;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AUDIO_STREAM_STATE_STOPPED: return "VEHICLE_AUDIO_STREAM_STATE_STOPPED";
-case VEHICLE_AUDIO_STREAM_STATE_STARTED: return "VEHICLE_AUDIO_STREAM_STATE_STARTED";
-default: return "UNKNOWN";
-}
-}
-}
-
-public static class VehicleAudioStreamStateIndex {
-public static final int VEHICLE_AUDIO_STREAM_STATE_INDEX_STATE = 0;
-public static final int VEHICLE_AUDIO_STREAM_STATE_INDEX_STREAM = 1;
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_AUDIO_STREAM_STATE_INDEX_STATE: return "VEHICLE_AUDIO_STREAM_STATE_INDEX_STATE";
-case VEHICLE_AUDIO_STREAM_STATE_INDEX_STREAM: return "VEHICLE_AUDIO_STREAM_STATE_INDEX_STREAM";
-default: return "UNKNOWN";
-}
-}
-}
-
-
-}
-
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkProtoUtil.java b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkProtoUtil.java
deleted file mode 100644
index e8eedc1..0000000
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkProtoUtil.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2015 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 com.android.car.vehiclenetwork;
-
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-
-import java.util.Arrays;
-
-public class VehicleNetworkProtoUtil {
- public static String VehiclePropValueToString(VehiclePropValue value) {
- StringBuilder sb = new StringBuilder();
- sb.append("prop:0x");
- sb.append(Integer.toHexString(value.getProp()));
- sb.append(" type:0x");
- sb.append(Integer.toHexString(value.getValueType()));
- sb.append(" floatValues:" + Arrays.toString(value.getFloatValuesList().toArray()));
- sb.append(" integerValues:" + Arrays.toString(value.getInt32ValuesList().toArray()));
- return sb.toString();
- }
-
- public static String VehiclePropConfigToString(VehiclePropConfig config) {
- StringBuilder sb = new StringBuilder();
- sb.append("prop:0x");
- sb.append(Integer.toHexString(config.getProp()));
- sb.append(" access:0x");
- sb.append(Integer.toHexString(config.getAccess()));
- sb.append(" change_mode:0x");
- sb.append(Integer.toHexString(config.getChangeMode()));
- sb.append(" value_type:0x");
- sb.append(Integer.toHexString(config.getValueType()));
- sb.append(" permission_model:0x");
- sb.append(Integer.toHexString(config.getPermissionModel()));
- return sb.toString();
- }
-
- public static boolean VehiclePropConfigEquals(VehiclePropConfig l, VehiclePropConfig r) {
- if (l.getProp() != r.getProp()) {
- return false;
- }
- if (l.getAccess() != r.getAccess()) {
- return false;
- }
- if (l.getChangeMode() != r.getChangeMode()) {
- return false;
- }
- if (l.getValueType() != r.getValueType()) {
- return false;
- }
- if (l.getPermissionModel() != r.getPermissionModel()) {
- return false;
- }
- return true;
- }
-}
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropConfigUtil.java b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropConfigUtil.java
deleted file mode 100644
index 2482f39..0000000
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropConfigUtil.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2015 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 com.android.car.vehiclenetwork;
-
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePermissionModel;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Utility class to help creating VehiclePropConfig.
- */
-public class VehiclePropConfigUtil {
-
- public static VehiclePropConfig createStaticStringProperty(int property) {
- return getBuilder(property,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_STATIC,
- VehicleValueType.VEHICLE_VALUE_TYPE_STRING,
- VehiclePermissionModel.VEHICLE_PERMISSION_NO_RESTRICTION,
- 0, 0f, 0f)
- .build();
- }
-
- public static VehiclePropConfig createZonedProperty(
- int property, int propAccess, int changeType, int valueType, int zones,
- int configFlags) {
- return VehiclePropConfig.newBuilder().
- setProp(property).
- setAccess(propAccess).
- setChangeMode(changeType).
- setValueType(valueType).
- setPermissionModel(VehiclePermissionModel.VEHICLE_PERMISSION_NO_RESTRICTION).
- setZones(zones).
- addConfigArray(configFlags).
- setSampleRateMax(0).
- setSampleRateMin(0).
- build();
- }
-
- public static VehiclePropConfig createProperty(
- int property, int propAccess, int changeType, int valueType, int configFlags) {
- return getBuilder(property,
- propAccess,
- changeType,
- valueType,
- VehiclePermissionModel.VEHICLE_PERMISSION_NO_RESTRICTION,
- configFlags, 0f, 0f)
- .build();
- }
-
- public static VehiclePropConfig.Builder getBuilder(int property, int access, int changeMode,
- int type, int permissionModel, int configFlags, float sampleRateMax,
- float sampleRateMin) {
- List<Integer> emptyList = new ArrayList<Integer>();
- return getBuilder(property, access, changeMode, type, permissionModel, configFlags,
- sampleRateMax, sampleRateMin, emptyList, emptyList);
- }
-
- public static VehiclePropConfig.Builder getBuilder(int property, int access, int changeMode,
- int type, int permissionModel, int configFlags, float sampleRateMax,
- float sampleRateMin, List<Integer> int32Maxs, List<Integer> int32Mins) {
- return VehiclePropConfig.newBuilder().
- setProp(property).
- setAccess(access).
- setChangeMode(changeMode).
- setValueType(type).
- setPermissionModel(permissionModel).
- addConfigArray(configFlags).
- setSampleRateMax(sampleRateMax).
- setSampleRateMin(sampleRateMin)
- .addAllInt32Maxs(int32Maxs)
- .addAllInt32Mins(int32Mins);
- }
-}
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropConfigsParcelable.aidl b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropConfigsParcelable.aidl
deleted file mode 100644
index 48219f0..0000000
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropConfigsParcelable.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2015 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 com.android.car.vehiclenetwork;
-
-parcelable VehiclePropConfigsParcelable;
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropConfigsParcelable.java b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropConfigsParcelable.java
deleted file mode 100644
index 29b20b6..0000000
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropConfigsParcelable.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2015 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 com.android.car.vehiclenetwork;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
-import com.google.protobuf.InvalidProtocolBufferException;
-
-public class VehiclePropConfigsParcelable implements Parcelable {
-
- public final VehiclePropConfigs configs;
-
- public VehiclePropConfigsParcelable(VehiclePropConfigs configs) {
- this.configs = configs;
- }
-
- public VehiclePropConfigsParcelable(Parcel in) {
- byte[] blob = in.readBlob();
- try {
- configs = VehiclePropConfigs.parseFrom(blob);
- } catch (InvalidProtocolBufferException e) {
- throw new IllegalArgumentException(e);
- }
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- // this is never used for java side as service is implemented in native side.
- dest.writeBlob(configs.toByteArray());
- }
-
- public static final Creator<VehiclePropConfigsParcelable> CREATOR =
- new Creator<VehiclePropConfigsParcelable>() {
- @Override
- public VehiclePropConfigsParcelable createFromParcel(Parcel in) {
- return new VehiclePropConfigsParcelable(in);
- }
-
- @Override
- public VehiclePropConfigsParcelable[] newArray(int size) {
- return new VehiclePropConfigsParcelable[size];
- }
- };
-}
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueParcelable.aidl b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueParcelable.aidl
deleted file mode 100644
index 6f0fd38..0000000
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueParcelable.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2015 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 com.android.car.vehiclenetwork;
-
-parcelable VehiclePropValueParcelable;
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueParcelable.java b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueParcelable.java
deleted file mode 100644
index 00b3045..0000000
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueParcelable.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2015 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 com.android.car.vehiclenetwork;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.Parcelable.Creator;
-
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.google.protobuf.InvalidProtocolBufferException;
-
-public class VehiclePropValueParcelable implements Parcelable {
-
- public final VehiclePropValue value;
-
- public VehiclePropValueParcelable(VehiclePropValue value) {
- this.value = value;
- }
-
- public VehiclePropValueParcelable(Parcel in) {
- byte[] blob = in.readBlob();
- try {
- value = VehiclePropValue.parseFrom(blob);
- } catch (InvalidProtocolBufferException e) {
- throw new IllegalArgumentException(e);
- }
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- // this is never used for java side as service is implemented in native side.
- dest.writeBlob(value.toByteArray());
- }
-
- public static final Creator<VehiclePropValueParcelable> CREATOR =
- new Creator<VehiclePropValueParcelable>() {
- @Override
- public VehiclePropValueParcelable createFromParcel(Parcel in) {
- return new VehiclePropValueParcelable(in);
- }
-
- @Override
- public VehiclePropValueParcelable[] newArray(int size) {
- return new VehiclePropValueParcelable[size];
- }
- };
-}
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueUtil.java b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueUtil.java
deleted file mode 100644
index 5e47546..0000000
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueUtil.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright (C) 2015 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 com.android.car.vehiclenetwork;
-
-import static java.lang.Integer.toHexString;
-
-import com.google.protobuf.ByteString;
-
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Utility class to help creating VehiclePropValue.
- */
-public final class VehiclePropValueUtil {
-
- /** To prevent creating of utility class */
- private VehiclePropValueUtil() {}
-
- public static VehiclePropValue createIntValue(int property, int value, long timestamp) {
- return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_INT32, timestamp).
- addInt32Values(value).
- build();
- }
-
- public static VehiclePropValue createIntVectorValue(int property, int[] values,
- long timestamp) {
- VehiclePropValue.Builder builder = createBuilder(property,
- getVectorValueType(VehicleValueType.VEHICLE_VALUE_TYPE_INT32, values.length),
- timestamp);
- for (int v : values) {
- builder.addInt32Values(v);
- }
- return builder.build();
- }
-
- public static VehiclePropValue createFloatValue(int property, float value, long timestamp) {
- return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT, timestamp).
- addFloatValues(value).
- build();
- }
-
- public static VehiclePropValue createFloatVectorValue(int property, float[] values,
- long timestamp) {
- VehiclePropValue.Builder builder = createBuilder(property,
- getVectorValueType(VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT, values.length),
- timestamp);
- for (float v : values) {
- builder.addFloatValues(v);
- }
- return builder.build();
- }
-
- public static VehiclePropValue createLongValue(int property, long value, long timestamp) {
- return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_INT64, timestamp).
- setInt64Value(value).
- build();
- }
-
- public static VehiclePropValue createStringValue(int property, String value, long timestamp) {
- return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_STRING, timestamp).
- setStringValue(value).
- build();
- }
-
- public static VehiclePropValue createBooleanValue(int property, boolean value, long timestamp) {
- return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN, timestamp).
- addInt32Values(value ? 1 : 0).
- build();
- }
-
- public static VehiclePropValue createBytesValue(int property, byte[] value, long timestamp) {
- return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_BYTES, timestamp).
- setBytesValue(ByteString.copyFrom(value)).
- build();
- }
-
- public static VehiclePropValue createZonedIntValue(int property, int zone, int value,
- long timestamp) {
- return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32, timestamp).
- setZone(zone).
- addInt32Values(value).
- build();
- }
-
- public static VehiclePropValue createZonedIntVectorValue(int property, int zone, int[] values,
- long timestamp) {
- int valueType = getVectorValueType(
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32, values.length);
- VehiclePropValue.Builder builder = createBuilder(property, valueType, timestamp).
- setZone(zone);
- for (int value : values) {
- builder.addInt32Values(value);
- }
- return builder.build();
- }
-
- public static VehiclePropValue createZonedFloatVectorValue(int property, int zone,
- float[] values, long timestamp) {
- int valueType = getVectorValueType(
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT, values.length);
- VehiclePropValue.Builder builder = createBuilder(property, valueType, timestamp).
- setZone(zone);
- for (float value : values) {
- builder.addFloatValues(value);
- }
- return builder.build();
- }
-
-
- public static VehiclePropValue createZonedBooleanValue(int property, int zone, boolean value,
- long timestamp) {
- return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN,timestamp).
- setZone(zone).
- addInt32Values(value ? 1 : 0).
- build();
- }
-
- public static VehiclePropValue createZonedFloatValue(int property, int zone, float value,
- long timestamp) {
- return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT,timestamp).
- setZone(zone).
- addFloatValues(value).
- build();
- }
-
- public static VehiclePropValue createDummyValue(int property, int valueType) {
- switch (valueType) {
- case VehicleValueType.VEHICLE_VALUE_TYPE_STRING: {
- return createStringValue(property, "dummy", 0);
- }
- case VehicleValueType.VEHICLE_VALUE_TYPE_BYTES: {
- return createBytesValue(property, new byte[1], 0);
- }
- case VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN: {
- return createBooleanValue(property, false, 0);
- }
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32: {
- return createZonedIntValue(property, 0, 0, 0);
- }
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT: {
- return createZonedFloatValue(property, 0, 0, 0);
- }
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN: {
- return createZonedBooleanValue(property, 0, false, 0);
- }
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT64: {
- return createLongValue(property, 0, 0);
- }
- case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT: {
- return createFloatValue(property, 0, 0);
- }
- case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC2:
- case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC3:
- case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC4:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4:{
- return createFloatVectorValue(property, new float[getVectorLength(valueType)], 0);
- }
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT32: {
- return createIntValue(property, 0, 0);
- }
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2:
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC3:
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4: {
- return createIntVectorValue(property, new int[getVectorLength(valueType)], 0);
- }
-
- }
- return null;
- }
-
- public static VehiclePropValue.Builder createBuilder(int property, int valueType,
- long timestamp) {
- return VehiclePropValue.newBuilder().
- setProp(property).
- setValueType(valueType).
- setTimestamp(timestamp);
- }
-
- public static int getVectorLength(int vehicleValueType) {
- switch (vehicleValueType) {
- case VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN:
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT32:
- case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT:
- return 1;
- case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC2:
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
- return 2;
- case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC3:
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC3:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
- return 3;
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4:
- case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC4:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4:
- return 4;
- default:
- throw new IllegalArgumentException("Unknown value type: " + vehicleValueType);
- }
- }
-
- public static boolean isCustomProperty(int property) {
- return property >= VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START &&
- property <= VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_END;
- }
-
- /** Converts {@link VehiclePropValue} to string just for debug purpose. */
- public static String toString(VehiclePropValue value) {
- if (value == null) {
- return String.valueOf(null);
- }
- return value.getClass().getSimpleName() + " { prop: 0x" + toHexString(value.getProp()) +
- ", valueType: 0x" + toHexString(value.getValueType()) +
- ", timestamp: " + value.getTimestamp() +
- ", int32Values: " + Arrays.toString(toIntArray(value.getInt32ValuesList())) +
- ", int64Value: " + value.getInt64Value() +
- ", floatValues: " + Arrays.toString(toFloatArray(value.getFloatValuesList())) +
- ", stringValue: " + value.getStringValue() +
- ", byteValue: " + Arrays.toString(value.getBytesValue().toByteArray()) +
- ", zone: {" + value.getZone() + "} }";
- }
-
- public static int[] toIntArray(List<Integer> collection) {
- int[] array = new int[collection.size()];
- int i = 0;
- for (int value : collection) {
- array[i++] = value;
- }
- return array;
- }
-
- public static float[] toFloatArray(List<Float> collection) {
- float[] array = new float[collection.size()];
- int i = 0;
- for (float value : collection) {
- array[i++] = value;
- }
- return array;
- }
-
- public static int getVectorValueType(int vehicleValueType, int length) {
- return vehicleValueType + length - 1;
- }
-}
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValuesParcelable.aidl b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValuesParcelable.aidl
deleted file mode 100644
index a5dd940..0000000
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValuesParcelable.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2015 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 com.android.car.vehiclenetwork;
-
-parcelable VehiclePropValuesParcelable;
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValuesParcelable.java b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValuesParcelable.java
deleted file mode 100644
index fbbed1e..0000000
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValuesParcelable.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2015 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 com.android.car.vehiclenetwork;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.Parcelable.Creator;
-
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValues;
-import com.google.protobuf.InvalidProtocolBufferException;
-
-/**
- * Have separate Parcelable for {@link VehiclePropValues} to use only one Blob.
- * Handling this as array of single entry can lead into having multiple Blob,
- * which can increase binder transfer size a lot (as each data can be below blob start size),
- * or can add lots of Blob, which brings lots of performance issue.
- */
-public class VehiclePropValuesParcelable implements Parcelable {
-
- public final VehiclePropValues values;
-
- public VehiclePropValuesParcelable(VehiclePropValues values) {
- this.values = values;
- }
-
- public VehiclePropValuesParcelable(Parcel in) {
- byte[] blob = in.readBlob();
- try {
- values = VehiclePropValues.parseFrom(blob);
- } catch (InvalidProtocolBufferException e) {
- throw new IllegalArgumentException(e);
- }
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- // this is never used for java side as service is implemented in native side.
- dest.writeBlob(values.toByteArray());
- }
-
- public static final Creator<VehiclePropValuesParcelable> CREATOR =
- new Creator<VehiclePropValuesParcelable>() {
- @Override
- public VehiclePropValuesParcelable createFromParcel(Parcel in) {
- return new VehiclePropValuesParcelable(in);
- }
-
- @Override
- public VehiclePropValuesParcelable[] newArray(int size) {
- return new VehiclePropValuesParcelable[size];
- }
- };
-}
diff --git a/service/Android.mk b/service/Android.mk
index 8731ccb..732b23c 100644
--- a/service/Android.mk
+++ b/service/Android.mk
@@ -35,7 +35,9 @@
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_JAVA_LIBRARIES += android.car
-LOCAL_STATIC_JAVA_LIBRARIES += libvehiclenetwork-java car-systemtest
+LOCAL_STATIC_JAVA_LIBRARIES += \
+ android.hardware.vehicle@2.0-java-static \
+ car-systemtest \
LOCAL_JNI_SHARED_LIBRARIES := libjni_car_service
@@ -52,7 +54,9 @@
LOCAL_MODULE := car-service-lib-for-test
LOCAL_JAVA_LIBRARIES += android.car
-LOCAL_STATIC_JAVA_LIBRARIES += libvehiclenetwork-java car-systemtest
+LOCAL_STATIC_JAVA_LIBRARIES += \
+ android.hardware.vehicle@2.0-java-static \
+ car-systemtest \
include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/service/src/com/android/car/BootReceiver.java b/service/src/com/android/car/BootReceiver.java
index ea96ca6..10c6f2f 100644
--- a/service/src/com/android/car/BootReceiver.java
+++ b/service/src/com/android/car/BootReceiver.java
@@ -23,8 +23,6 @@
import android.os.UserHandle;
import android.util.Log;
-import com.android.car.hal.VehicleHal;
-
/**
* When system boots up, start car service.
@@ -34,10 +32,9 @@
@Override
public void onReceive(Context context, Intent intent) {
Log.w(CarLog.TAG_SERVICE, "Starting...");
- VehicleHal hal = VehicleHal.getInstance();
- Intent carServiceintent = new Intent();
- carServiceintent.setPackage(context.getPackageName());
- carServiceintent.setAction(Car.CAR_SERVICE_INTERFACE_NAME);
- context.startServiceAsUser(carServiceintent, UserHandle.SYSTEM);
+ Intent carServiceIntent = new Intent();
+ carServiceIntent.setPackage(context.getPackageName());
+ carServiceIntent.setAction(Car.CAR_SERVICE_INTERFACE_NAME);
+ context.startServiceAsUser(carServiceIntent, UserHandle.SYSTEM);
}
}
diff --git a/service/src/com/android/car/CarAudioService.java b/service/src/com/android/car/CarAudioService.java
index 17df7a0..e23ac93 100644
--- a/service/src/com/android/car/CarAudioService.java
+++ b/service/src/com/android/car/CarAudioService.java
@@ -171,8 +171,9 @@
CarAudioAttributesUtil.getAudioAttributesForCarUsage(
CarAudioAttributesUtil.CAR_AUDIO_USAGE_CARSERVICE_CAR_PROXY);
- public CarAudioService(Context context, CarInputService inputService) {
- mAudioHal = VehicleHal.getInstance().getAudioHal();
+ public CarAudioService(Context context, AudioHalService audioHal,
+ CarInputService inputService) {
+ mAudioHal = audioHal;
mContext = context;
mFocusHandlerThread = new HandlerThread(CarLog.TAG_AUDIO);
mSystemFocusListener = new SystemFocusListener();
@@ -221,10 +222,6 @@
AudioPolicy audioPolicy = null;
if (isFocusSupported || mUseDynamicRouting) {
audioPolicy = builder.build();
- int r = mAudioManager.registerAudioPolicy(audioPolicy);
- if (r != 0) {
- throw new RuntimeException("registerAudioPolicy failed " + r);
- }
}
mAudioHal.setFocusListener(this);
mAudioHal.setAudioRoutingPolicy(audioRoutingPolicy);
@@ -287,6 +284,12 @@
Arrays.fill(mExternalRoutings, 0);
}
mVolumeService.init();
+
+ // Register audio policy only after this class is fully initialized.
+ int r = mAudioManager.registerAudioPolicy(audioPolicy);
+ if (r != 0) {
+ throw new RuntimeException("registerAudioPolicy failed " + r);
+ }
}
private void setupDynamicRouting(AudioRoutingPolicy audioRoutingPolicy,
diff --git a/service/src/com/android/car/CarCabinService.java b/service/src/com/android/car/CarCabinService.java
index 47aaa76..cdf8635 100644
--- a/service/src/com/android/car/CarCabinService.java
+++ b/service/src/com/android/car/CarCabinService.java
@@ -18,14 +18,13 @@
import android.car.Car;
import android.content.Context;
-import com.android.car.CarLog;
-import com.android.car.hal.VehicleHal;
+
+import com.android.car.hal.CabinHalService;
public class CarCabinService extends CarPropertyServiceBase {
private final static boolean DBG = false;
- public CarCabinService(Context context) {
- super(context, VehicleHal.getInstance().getCabinHal(), Car.PERMISSION_CAR_CABIN, DBG,
- CarLog.TAG_CABIN);
+ public CarCabinService(Context context, CabinHalService cabinHal) {
+ super(context, cabinHal, Car.PERMISSION_CAR_CABIN, DBG, CarLog.TAG_CABIN);
}
}
diff --git a/service/src/com/android/car/CarCameraService.java b/service/src/com/android/car/CarCameraService.java
index 7d2608b..c1a71c4 100644
--- a/service/src/com/android/car/CarCameraService.java
+++ b/service/src/com/android/car/CarCameraService.java
@@ -16,9 +16,9 @@
package com.android.car;
-import android.content.Context;
import android.car.hardware.camera.CarCameraState;
import android.car.hardware.camera.ICarCamera;
+import android.content.Context;
import android.graphics.Rect;
import android.util.Log;
@@ -45,7 +45,11 @@
if (DBG) {
Log.d(TAG, "init called");
}
- mModule = nativeOpen();
+ try {
+ mModule = nativeOpen();
+ } catch (UnsatisfiedLinkError ex) {
+ Log.e(TAG, "Failed to open camera module: " + ex.getMessage());
+ }
if (mModule != 0) {
int[] cameraType = nativeGetSupportedCameras(mModule);
diff --git a/service/src/com/android/car/CarHvacService.java b/service/src/com/android/car/CarHvacService.java
index 99745ee..e22a38d 100644
--- a/service/src/com/android/car/CarHvacService.java
+++ b/service/src/com/android/car/CarHvacService.java
@@ -18,13 +18,13 @@
import android.car.Car;
import android.content.Context;
-import com.android.car.hal.VehicleHal;
+
+import com.android.car.hal.HvacHalService;
public class CarHvacService extends CarPropertyServiceBase {
- private final static boolean DBG = false;
+ private final static boolean DBG = false;
- public CarHvacService(Context context) {
- super(context, VehicleHal.getInstance().getHvacHal(), Car.PERMISSION_CAR_HVAC, DBG,
- CarLog.TAG_HVAC);
+ public CarHvacService(Context context, HvacHalService hvacHal) {
+ super(context, hvacHal, Car.PERMISSION_CAR_HVAC, DBG, CarLog.TAG_HVAC);
}
}
diff --git a/service/src/com/android/car/CarInfoService.java b/service/src/com/android/car/CarInfoService.java
index c51ee15..9715325 100644
--- a/service/src/com/android/car/CarInfoService.java
+++ b/service/src/com/android/car/CarInfoService.java
@@ -17,26 +17,21 @@
import android.car.CarInfoManager;
import android.car.ICarInfo;
-import android.car.annotation.ValueTypeDef;
import android.content.Context;
import android.os.Bundle;
import android.provider.Settings;
import com.android.car.hal.InfoHalService;
-import com.android.car.hal.VehicleHal;
import java.io.PrintWriter;
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Map;
public class CarInfoService extends ICarInfo.Stub implements CarServiceBase {
private final InfoHalService mInfoHal;
private final Context mContext;
- public CarInfoService(Context context) {
- mInfoHal = VehicleHal.getInstance().getInfoHal();
+ public CarInfoService(Context context, InfoHalService infoHal) {
+ mInfoHal = infoHal;
mContext = context;
}
diff --git a/service/src/com/android/car/CarInputService.java b/service/src/com/android/car/CarInputService.java
index 31c07d5..5ed9d49 100644
--- a/service/src/com/android/car/CarInputService.java
+++ b/service/src/com/android/car/CarInputService.java
@@ -60,6 +60,7 @@
private static final boolean DBG = false;
private final Context mContext;
+ private final InputHalService mInputHalService;
private final TelecomManager mTelecomManager;
private final InputManager mInputManager;
@@ -125,8 +126,9 @@
}
};
- public CarInputService(Context context) {
+ public CarInputService(Context context, InputHalService inputHalService) {
mContext = context;
+ mInputHalService = inputHalService;
mTelecomManager = context.getSystemService(TelecomManager.class);
mInputManager = context.getSystemService(InputManager.class);
}
@@ -181,14 +183,13 @@
@Override
public void init() {
- InputHalService hal = VehicleHal.getInstance().getInputHal();
- if (!hal.isKeyInputSupported()) {
+ if (!mInputHalService.isKeyInputSupported()) {
Log.w(CarLog.TAG_INPUT, "Hal does not support key input.");
return;
}
- hal.setInputListener(this);
+ mInputHalService.setInputListener(this);
mCarInputListenerBound = bindCarInputService();
}
diff --git a/service/src/com/android/car/CarNightService.java b/service/src/com/android/car/CarNightService.java
index 0d3af67..497f77c 100644
--- a/service/src/com/android/car/CarNightService.java
+++ b/service/src/com/android/car/CarNightService.java
@@ -18,12 +18,10 @@
import android.annotation.IntDef;
import android.app.UiModeManager;
-import android.car.Car;
import android.car.hardware.CarSensorEvent;
import android.car.hardware.CarSensorManager;
import android.car.hardware.ICarSensorEventListener;
import android.content.Context;
-import android.content.pm.PackageManager;
import android.util.Log;
import java.io.PrintWriter;
@@ -104,8 +102,9 @@
return mUiModeManager.getNightMode();
}
- CarNightService(Context context) {
+ CarNightService(Context context, CarSensorService sensorService) {
mContext = context;
+ mCarSensorService = sensorService;
mUiModeManager = (UiModeManager) mContext.getSystemService(Context.UI_MODE_SERVICE);
if (mUiModeManager == null) {
Log.w(CarLog.TAG_SENSOR,"Failed to get UI_MODE_SERVICE");
@@ -117,8 +116,6 @@
if (DBG) {
Log.d(CarLog.TAG_SENSOR,"CAR dayNight init.");
}
- mCarSensorService = (CarSensorService) ICarImpl.getInstance(mContext).getCarService(
- Car.SENSOR_SERVICE);
mCarSensorService.registerOrUpdateSensorListener(CarSensorManager.SENSOR_TYPE_NIGHT,
CarSensorManager.SENSOR_RATE_NORMAL, mICarSensorEventListener);
CarSensorEvent currentState = mCarSensorService.getLatestSensorEvent(
diff --git a/service/src/com/android/car/CarPowerManagementService.java b/service/src/com/android/car/CarPowerManagementService.java
index 34a67fa..22f8b09 100644
--- a/service/src/com/android/car/CarPowerManagementService.java
+++ b/service/src/com/android/car/CarPowerManagementService.java
@@ -15,23 +15,15 @@
*/
package com.android.car;
-import android.annotation.NonNull;
-import android.car.Car;
-import android.content.Context;
-import android.hardware.display.DisplayManager;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
-import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
import android.os.SystemClock;
import android.util.Log;
-import android.view.Display;
import com.android.car.hal.PowerHalService;
import com.android.car.hal.PowerHalService.PowerState;
-import com.android.car.hal.VehicleHal;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
@@ -95,23 +87,8 @@
int getWakeupTime();
}
- /** Interface to abstract all system interaction. Separated for testing. */
- public interface SystemInteface {
- void setDisplayState(boolean on);
- void releaseAllWakeLocks();
- void shutdown();
- void enterDeepSleep(int wakeupTimeSec);
- void switchToPartialWakeLock();
- void switchToFullWakeLock();
- void startDisplayStateMonitoring(CarPowerManagementService service);
- void stopDisplayStateMonitoring();
- boolean isSystemSupportingDeepSleep();
- boolean isWakeupCausedByTimer();
- }
-
- private final Context mContext;
private final PowerHalService mHal;
- private final SystemInteface mSystemInterface;
+ private final SystemInterface mSystemInterface;
private final HandlerThread mHandlerThread;
private final PowerHandler mHandler;
@@ -131,23 +108,10 @@
@GuardedBy("this")
private final LinkedList<PowerState> mPendingPowerStates = new LinkedList<>();
- private final int SHUTDOWN_POLLING_INTERVAL_MS = 2000;
- private final int SHUTDOWN_EXTEND_MAX_MS = 5000;
+ private final static int SHUTDOWN_POLLING_INTERVAL_MS = 2000;
+ private final static int SHUTDOWN_EXTEND_MAX_MS = 5000;
- /**
- * Constructor for full functionality.
- */
- public CarPowerManagementService(@NonNull Context context) {
- this(context, VehicleHal.getInstance().getPowerHal(),
- new SystemIntefaceImpl(context));
- }
-
- /**
- * Constructor for full functionality. Can inject external interfaces
- */
- public CarPowerManagementService(@NonNull Context context, @NonNull PowerHalService powerHal,
- @NonNull SystemInteface systemInterface) {
- mContext = context;
+ public CarPowerManagementService(PowerHalService powerHal, SystemInterface systemInterface) {
mHal = powerHal;
mSystemInterface = systemInterface;
mHandlerThread = new HandlerThread(CarLog.TAG_POWER);
@@ -161,7 +125,6 @@
*/
@VisibleForTesting
protected CarPowerManagementService() {
- mContext = null;
mHal = null;
mSystemInterface = null;
mHandlerThread = null;
@@ -174,7 +137,12 @@
if (mHal.isPowerStateSupported()) {
mHal.sendBootComplete();
PowerState currentState = mHal.getCurrentPowerState();
- onApPowerStateChange(currentState);
+ if (currentState != null) {
+ onApPowerStateChange(currentState);
+ } else {
+ Log.w(CarLog.TAG_POWER, "Unable to get get current power state during "
+ + "initialization");
+ }
} else {
Log.w(CarLog.TAG_POWER, "Vehicle hal does not support power state yet.");
onApPowerStateChange(new PowerState(PowerHalService.STATE_ON_FULL, 0));
@@ -246,7 +214,7 @@
if (mCurrentState == null) {
return;
}
- if (mCurrentState.state != PowerHalService.STATE_SHUTDOWN_PREPARE) {
+ if (mCurrentState.mState != PowerHalService.STATE_SHUTDOWN_PREPARE) {
return;
}
if (mCurrentState.canEnterDeepSleep()) {
@@ -300,7 +268,7 @@
}
Log.i(CarLog.TAG_POWER, "Power state change:" + state);
- switch (state.state) {
+ switch (state.mState) {
case PowerHalService.STATE_ON_DISP_OFF:
handleDisplayOff(state);
notifyPowerOn(false);
@@ -415,9 +383,7 @@
synchronized (this) {
mLastSleepEntryTime = SystemClock.elapsedRealtime();
}
- if (!shouldDoFakeShutdown()) { // if it is mocked, do not enter sleep.
- mSystemInterface.enterDeepSleep(wakeupTimeSec);
- }
+ mSystemInterface.enterDeepSleep(wakeupTimeSec);
mHal.sendSleepExit();
for (PowerServiceEventListener listener : mListeners) {
listener.onSleepExit();
@@ -426,7 +392,7 @@
doHandlePreprocessing(false /*shuttingDown*/);
} else {
PowerState currentState = mHal.getCurrentPowerState();
- if (needPowerStateChange(currentState)) {
+ if (currentState != null && needPowerStateChange(currentState)) {
onApPowerStateChange(currentState);
} else { // power controller woke-up but no power state change. Just shutdown.
Log.w(CarLog.TAG_POWER, "external sleep wake up, but no power state change:" +
@@ -439,7 +405,7 @@
private void doHandleNotifyPowerOn() {
boolean displayOn = false;
synchronized (this) {
- if (mCurrentState != null && mCurrentState.state == PowerHalService.STATE_ON_FULL) {
+ if (mCurrentState != null && mCurrentState.mState == PowerHalService.STATE_ON_FULL) {
displayOn = true;
}
}
@@ -468,9 +434,7 @@
wakeupTimeSec = getWakeupTime();
}
mHal.sendShutdownStart(wakeupTimeSec);
- if (!shouldDoFakeShutdown()) {
- mSystemInterface.shutdown();
- }
+ mSystemInterface.shutdown();
}
private int getWakeupTime() {
@@ -517,15 +481,6 @@
//TODO bug: 32065231
}
- private boolean shouldDoFakeShutdown() {
- ICarImpl carImpl = ICarImpl.getInstance(mContext);
- if (!carImpl.isInMocking()) {
- return false;
- }
- CarTestService testService = (CarTestService) carImpl.getCarService(Car.TEST_SERVICE);
- return !testService.shouldDoRealShutdownInMocking();
- }
-
public void handleMainDisplayChanged(boolean on) {
mHandler.handleMainDisplayStateChange(on);
}
@@ -611,151 +566,6 @@
}
}
- private static class SystemIntefaceImpl implements SystemInteface {
-
- private final PowerManager mPowerManager;
- private final DisplayManager mDisplayManager;
- private final WakeLock mFullWakeLock;
- private final WakeLock mPartialWakeLock;
- private final DisplayStateListener mDisplayListener;
- private CarPowerManagementService mService;
- private boolean mDisplayStateSet;
-
- private SystemIntefaceImpl(Context context) {
- mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
- mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
- mFullWakeLock = mPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, CarLog.TAG_POWER);
- mPartialWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
- CarLog.TAG_POWER);
- mDisplayListener = new DisplayStateListener();
- }
-
- @Override
- public void startDisplayStateMonitoring(CarPowerManagementService service) {
- synchronized (this) {
- mService = service;
- mDisplayStateSet = isMainDisplayOn();
- }
- mDisplayManager.registerDisplayListener(mDisplayListener, service.getHandler());
- }
-
- @Override
- public void stopDisplayStateMonitoring() {
- mDisplayManager.unregisterDisplayListener(mDisplayListener);
- }
-
- @Override
- public void setDisplayState(boolean on) {
- synchronized (this) {
- mDisplayStateSet = on;
- }
- if (on) {
- switchToFullWakeLock();
- Log.i(CarLog.TAG_POWER, "on display");
- mPowerManager.wakeUp(SystemClock.uptimeMillis());
- } else {
- switchToPartialWakeLock();
- Log.i(CarLog.TAG_POWER, "off display");
- mPowerManager.goToSleep(SystemClock.uptimeMillis());
- }
- }
-
- private boolean isMainDisplayOn() {
- Display disp = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
- return disp.getState() == Display.STATE_ON;
- }
-
- @Override
- public void shutdown() {
- mPowerManager.shutdown(false /* no confirm*/, null, true /* true */);
- }
-
- @Override
- public void enterDeepSleep(int wakeupTimeSec) {
- //TODO set wake up time, bug: 32061842
- mPowerManager.goToSleep(SystemClock.uptimeMillis(),
- PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN,
- PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
- }
-
- @Override
- public boolean isSystemSupportingDeepSleep() {
- //TODO should return by checking some kernel suspend control sysfs, bug: 32061842
- return false;
- }
-
- @Override
- public void switchToPartialWakeLock() {
- if (!mPartialWakeLock.isHeld()) {
- mPartialWakeLock.acquire();
- }
- if (mFullWakeLock.isHeld()) {
- mFullWakeLock.release();
- }
- }
-
- @Override
- public void switchToFullWakeLock() {
- if (!mFullWakeLock.isHeld()) {
- mFullWakeLock.acquire();
- }
- if (mPartialWakeLock.isHeld()) {
- mPartialWakeLock.release();
- }
- }
-
- @Override
- public void releaseAllWakeLocks() {
- if (mPartialWakeLock.isHeld()) {
- mPartialWakeLock.release();
- }
- if (mFullWakeLock.isHeld()) {
- mFullWakeLock.release();
- }
- }
-
- @Override
- public boolean isWakeupCausedByTimer() {
- //TODO bug: 32061842, check wake up reason and do necessary operation information should
- // come from kernel. it can be either power on or wake up for maintenance
- // power on will involve GPIO trigger from power controller
- // its own wakeup will involve timer expiration.
- return false;
- }
-
- private void handleMainDisplayChanged() {
- boolean isOn = isMainDisplayOn();
- CarPowerManagementService service;
- synchronized (this) {
- if (mDisplayStateSet == isOn) { // same as what is set
- return;
- }
- service = mService;
- }
- service.handleMainDisplayChanged(isOn);
- }
-
- private class DisplayStateListener implements DisplayManager.DisplayListener {
-
- @Override
- public void onDisplayAdded(int displayId) {
- //ignore
- }
-
- @Override
- public void onDisplayChanged(int displayId) {
- if (displayId == Display.DEFAULT_DISPLAY) {
- handleMainDisplayChanged();
- }
- }
-
- @Override
- public void onDisplayRemoved(int displayId) {
- //ignore
- }
- }
- }
-
private class ShutdownProcessingTimerTask extends TimerTask {
private final boolean mShutdownWhenCompleted;
private final int mExpirationCount;
diff --git a/service/src/com/android/car/CarRadioService.java b/service/src/com/android/car/CarRadioService.java
index c59983c..d12c9ae 100644
--- a/service/src/com/android/car/CarRadioService.java
+++ b/service/src/com/android/car/CarRadioService.java
@@ -28,7 +28,6 @@
import android.os.RemoteException;
import android.util.Log;
-import com.android.car.hal.VehicleHal;
import com.android.car.hal.RadioHalService;
import java.io.PrintWriter;
@@ -46,8 +45,8 @@
new HashMap<IBinder, RadioDeathRecipient>();
private final Context mContext;
- public CarRadioService(Context context) {
- mRadioHal = VehicleHal.getInstance().getRadioHal();
+ public CarRadioService(Context context, RadioHalService radioHal) {
+ mRadioHal = radioHal;
mContext = context;
}
diff --git a/service/src/com/android/car/CarSensorService.java b/service/src/com/android/car/CarSensorService.java
index 748d3c2..e9ab453 100644
--- a/service/src/com/android/car/CarSensorService.java
+++ b/service/src/com/android/car/CarSensorService.java
@@ -32,11 +32,13 @@
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
+import android.util.ArrayMap;
import android.util.Log;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
-import com.android.car.hal.VehicleHal;
+import com.google.android.collect.Lists;
+
import com.android.car.hal.SensorHalService;
import com.android.car.hal.SensorHalServiceBase;
import com.android.internal.annotations.GuardedBy;
@@ -81,9 +83,8 @@
private final ReentrantLock mSensorLock = new ReentrantLock();
/** hold clients callback */
@GuardedBy("mSensorLock")
- private final LinkedList<SensorClient> mClients = new LinkedList<SensorClient>();
- /** should be used only as temp data for event dispatching */
- private final LinkedList<SensorClient> mClientDispatchList = new LinkedList<>();
+ private final LinkedList<SensorClient> mClients = new LinkedList<>();
+
/** key: sensor type. */
@GuardedBy("mSensorLock")
private final SparseArray<SensorListeners> mSensorListeners = new SparseArray<>();
@@ -106,7 +107,7 @@
private final HandlerThread mHandlerThread;
private final SensorDispatchHandler mSensorDispatchHandler;
- public CarSensorService(Context context) {
+ public CarSensorService(Context context, SensorHalService sensorHal) {
mContext = context;
if (ENABLE_DISPATCHING_LIMIT) {
mHandlerThread = new HandlerThread("SENSOR", Process.THREAD_PRIORITY_AUDIO);
@@ -117,8 +118,8 @@
mSensorDispatchHandler = null;
}
// This triggers sensor hal init as well.
- mSensorHal = VehicleHal.getInstance().getSensorHal();
- mDrivingStatePolicy = new DrivingStatePolicy(context);
+ mSensorHal = sensorHal;
+ mDrivingStatePolicy = new DrivingStatePolicy(context, this);
mDayNightModePolicy = new DayNightModePolicy(context);
}
@@ -154,8 +155,8 @@
mDayNightModePolicy.registerSensorListener(this);
} else {
event = mSensorHal.getCurrentSensorValue(CarSensorManager.SENSOR_TYPE_NIGHT);
- Log.i(CarLog.TAG_SENSOR, "initial daynight:" + ((event == null)?
- "not ready" : + event.intValues[0]));
+ Log.i(CarLog.TAG_SENSOR, "initial daynight: "
+ + ((event == null) ? "not ready" : + event.intValues[0]));
}
if (event == null) {
event = DayNightModePolicy.getDefaultValue(CarSensorManager.SENSOR_TYPE_NIGHT);
@@ -226,6 +227,8 @@
}
private void processSensorData(List<CarSensorEvent> events) {
+ ArrayMap<SensorClient, List<CarSensorEvent>> eventsByClient = new ArrayMap<>();
+
mSensorLock.lock();
for (CarSensorEvent event: events) {
SensorRecord record = mSensorRecords.get(event.sensorType);
@@ -239,24 +242,35 @@
//TODO recycle new event, bug: 32094595
continue;
}
+
SensorListeners listeners = mSensorListeners.get(event.sensorType);
- if (listeners != null) {
- listeners.queueSensorEvent(event);
+ if (listeners == null) {
+ continue;
+ }
+
+ for (SensorClientWithRate clientWithRate : listeners.mSensorClients) {
+ SensorClient client = clientWithRate.getSensorClient();
+ List<CarSensorEvent> clientEvents = eventsByClient.get(client);
+ if (clientEvents == null) {
+ clientEvents = new LinkedList<>();
+ eventsByClient.put(client, clientEvents);
+ }
+ clientEvents.add(event);
}
}
}
- mClientDispatchList.addAll(mClients);
mSensorLock.unlock();
- for (SensorClient client: mClientDispatchList) {
- client.dispatchSensorUpdate();
+
+ for (ArrayMap.Entry<SensorClient, List<CarSensorEvent>> entry : eventsByClient.entrySet()) {
+ SensorClient client = entry.getKey();
+ List<CarSensorEvent> clientEvents = entry.getValue();
+
+ client.dispatchSensorUpdate(clientEvents);
}
- mClientDispatchList.clear();
}
/**
* Received sensor data from car.
- *
- * @param event
*/
@Override
public void onSensorEvents(List<CarSensorEvent> events) {
@@ -325,15 +339,14 @@
// If we have a cached event for this sensor, send the event.
SensorRecord record = mSensorRecords.get(sensorType);
if (record != null && record.lastEvent != null) {
- sensorClient.queueSensorEvent(record.lastEvent);
- sensorClient.dispatchSensorUpdate();
+ sensorClient.dispatchSensorUpdate(Lists.newArrayList(record.lastEvent));
}
if (sensorListeners == null) {
sensorListeners = new SensorListeners(rate);
mSensorListeners.put(sensorType, sensorListeners);
shouldStartSensors = true;
} else {
- oldRate = Integer.valueOf(sensorListeners.getRate());
+ oldRate = sensorListeners.getRate();
sensorClientWithRate = sensorListeners.findSensorClientWithRate(sensorClient);
}
if (sensorClientWithRate == null) {
@@ -635,7 +648,7 @@
private SensorClient findSensorClientLocked(ICarSensorEventListener listener) {
IBinder binder = listener.asBinder();
for (SensorClient sensorClient : mClients) {
- if (sensorClient.isHoldingListernerBinder(binder)) {
+ if (sensorClient.isHoldingListenerBinder(binder)) {
return sensorClient;
}
}
@@ -738,8 +751,6 @@
/** callback for sensor events */
private final ICarSensorEventListener mListener;
private final SparseBooleanArray mActiveSensors = new SparseBooleanArray();
- private final LinkedList<CarSensorEvent> mSensorsToDispatch =
- new LinkedList<CarSensorEvent>();
/** when false, it is already released */
private volatile boolean mActive = true;
@@ -757,7 +768,7 @@
return false;
}
- boolean isHoldingListernerBinder(IBinder listenerBinder) {
+ boolean isHoldingListenerBinder(IBinder listenerBinder) {
return mListener.asBinder() == listenerBinder;
}
@@ -794,17 +805,13 @@
removeClient(this);
}
- void queueSensorEvent(CarSensorEvent event) {
- mSensorsToDispatch.add(event);
- }
-
- void dispatchSensorUpdate() {
- if (mSensorsToDispatch.size() == 0) {
+ void dispatchSensorUpdate(List<CarSensorEvent> events) {
+ if (events.size() == 0) {
return;
}
if (mActive) {
try {
- mListener.onSensorChanged(mSensorsToDispatch);
+ mListener.onSensorChanged(events);
} catch (RemoteException e) {
//ignore. crash will be handled by death handler
}
@@ -813,14 +820,12 @@
Log.d(CarLog.TAG_SENSOR, "sensor update while client is already released");
}
}
- mSensorsToDispatch.clear();
}
void release() {
if (mActive) {
mListener.asBinder().unlinkToDeath(this, 0);
mActiveSensors.clear();
- mSensorsToDispatch.clear();
mActive = false;
}
}
@@ -920,12 +925,6 @@
return null;
}
- void queueSensorEvent(CarSensorEvent event) {
- for (SensorClientWithRate clientWithRate: mSensorClients) {
- clientWithRate.getSensorClient().queueSensorEvent(event);
- }
- }
-
void release() {
for (SensorClientWithRate clientWithRate: mSensorClients) {
clientWithRate.mSensorClient.release();
diff --git a/service/src/com/android/car/CarService.java b/service/src/com/android/car/CarService.java
index 475d4de..37df29d 100644
--- a/service/src/com/android/car/CarService.java
+++ b/service/src/com/android/car/CarService.java
@@ -15,28 +15,40 @@
*/
package com.android.car;
+import static android.os.SystemClock.elapsedRealtime;
+
+import android.annotation.Nullable;
import android.app.Service;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.hardware.vehicle.V2_0.IVehicle;
import android.os.Binder;
import android.os.IBinder;
import android.os.SystemProperties;
import android.util.Log;
-import com.android.car.hal.VehicleHal;
-
import java.io.FileDescriptor;
import java.io.PrintWriter;
public class CarService extends Service {
- // main thread only
+ /** Default vehicle HAL service name. */
+ private static final String VEHICLE_SERVICE_NAME = "Vehicle";
+
+ private static final long WAIT_FOR_VEHICLE_HAL_TIMEOUT_MS = 10_000;
+
private ICarImpl mICarImpl;
@Override
public void onCreate() {
Log.i(CarLog.TAG_SERVICE, "Service onCreate");
- mICarImpl = ICarImpl.getInstance(this);
+ IVehicle vehicle = getVehicle(WAIT_FOR_VEHICLE_HAL_TIMEOUT_MS);
+ if (vehicle == null) {
+ throw new IllegalStateException("Vehicle HAL service is not available.");
+ }
+
+ mICarImpl = new ICarImpl(this, vehicle, SystemInterface.getDefault(this));
+ mICarImpl.init();
SystemProperties.set("boot.car_service_created", "1");
super.onCreate();
}
@@ -44,7 +56,7 @@
@Override
public void onDestroy() {
Log.i(CarLog.TAG_SERVICE, "Service onDestroy");
- ICarImpl.releaseInstance();
+ mICarImpl.release();
super.onDestroy();
}
@@ -70,12 +82,30 @@
}
if (args == null || args.length == 0) {
writer.println("*dump car service*");
- writer.println("*dump HAL*");
- VehicleHal.getInstance().dump(writer);
- writer.println("*dump services*");
- ICarImpl.getInstance(this).dump(writer);
+ mICarImpl.dump(writer);
} else {
- ICarImpl.getInstance(this).execShellCmd(args, writer);
+ mICarImpl.execShellCmd(args, writer);
}
}
+
+ @Nullable
+ private IVehicle getVehicle(long waitMilliseconds) {
+ IVehicle vehicle = getVehicle();
+ long start = elapsedRealtime();
+ while (vehicle == null && (start + waitMilliseconds) > elapsedRealtime()) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ throw new RuntimeException("Sleep was interrupted", e);
+ }
+
+ vehicle = getVehicle();
+ }
+ return vehicle;
+ }
+
+ @Nullable
+ private IVehicle getVehicle() {
+ return IVehicle.getService(VEHICLE_SERVICE_NAME);
+ }
}
\ No newline at end of file
diff --git a/service/src/com/android/car/CarServiceUtils.java b/service/src/com/android/car/CarServiceUtils.java
index b47e22c..5467401 100644
--- a/service/src/com/android/car/CarServiceUtils.java
+++ b/service/src/com/android/car/CarServiceUtils.java
@@ -16,17 +16,16 @@
package com.android.car;
-import java.util.List;
-
import android.content.Context;
import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Binder;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
+import java.util.List;
+
/** Utility class */
public final class CarServiceUtils {
@@ -158,4 +157,13 @@
}
return array;
}
+
+ public static byte[] toByteArray(List<Byte> list) {
+ final int size = list.size();
+ final byte[] array = new byte[size];
+ for (int i = 0; i < size; ++i) {
+ array[i] = list.get(i);
+ }
+ return array;
+ }
}
diff --git a/service/src/com/android/car/CarTestService.java b/service/src/com/android/car/CarTestService.java
index 9541af1..ec1606c 100644
--- a/service/src/com/android/car/CarTestService.java
+++ b/service/src/com/android/car/CarTestService.java
@@ -15,41 +15,35 @@
*/
package com.android.car;
-import android.car.test.CarTestManager;
+import android.car.Car;
import android.car.test.ICarTest;
import android.content.Context;
import android.os.IBinder;
+import android.os.RemoteException;
import android.util.Log;
-import com.android.car.hal.VehicleHal;
-import com.android.car.vehiclenetwork.IVehicleNetworkHalMock;
-import com.android.car.vehiclenetwork.VehicleNetwork;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
-import com.android.car.vehiclenetwork.VehiclePropValueParcelable;
-
import java.io.PrintWriter;
-import java.util.NoSuchElementException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
/**
* Service to allow testing / mocking vehicle HAL.
* This service uses Vehicle HAL APIs directly (one exception) as vehicle HAL mocking anyway
* requires accessing that level directly.
*/
-public class CarTestService extends ICarTest.Stub implements CarServiceBase {
+class CarTestService extends ICarTest.Stub implements CarServiceBase {
+
+ private static final String TAG = CarTestService.class.getSimpleName();
private final Context mContext;
- private final VehicleNetwork mVehicleNetwork;
private final ICarImpl mICarImpl;
- private boolean mInMocking = false;
- private int mMockingFlags = 0;
- private Exception mException = null;
- private IVehicleNetworkHalMock mMock = null;
- private final MockDeathRecipient mDeathRecipient = new MockDeathRecipient();
- public CarTestService(Context context, ICarImpl carImpl) {
+ private final Map<IBinder, TokenDeathRecipient> mTokens = new HashMap<>();
+
+ CarTestService(Context context, ICarImpl carImpl) {
mContext = context;
mICarImpl = carImpl;
- mVehicleNetwork = VehicleHal.getInstance().getVehicleNetwork();
}
@Override
@@ -67,124 +61,59 @@
@Override
public void dump(PrintWriter writer) {
writer.println("*CarTestService*");
- writer.println(" mInMocking:" + mInMocking);
+ writer.println(" mTokens:" + Arrays.toString(mTokens.entrySet().toArray()));
}
@Override
- public void injectEvent(VehiclePropValueParcelable value) {
- ICarImpl.assertVehicleHalMockPermission(mContext);
- mVehicleNetwork.injectEvent(value.value);
- }
+ public void stopCarService(IBinder token) throws RemoteException {
+ Log.d(TAG, "stopCarService, token: " + token);
+ ICarImpl.assertPermission(mContext, Car.PERMISSION_CAR_TEST_SERVICE);
- @Override
- public void startMocking(final IVehicleNetworkHalMock mock, final int flags) {
- ICarImpl.assertVehicleHalMockPermission(mContext);
- CarServiceUtils.runOnMainSync(new Runnable() {
- @Override
- public void run() {
- try {
- synchronized (this) {
- mInMocking = true;
- mMockingFlags = flags;
- mException = null;
- if (mMock != null) {
- Log.w(CarLog.TAG_TEST,
- "New mocking started while previous one is not stopped");
- try {
- mMock.asBinder().unlinkToDeath(mDeathRecipient, 0);
- } catch (NoSuchElementException e) {
- //ignore
- }
- }
- mMock = mock;
- }
- mock.asBinder().linkToDeath(mDeathRecipient, 0);
- mVehicleNetwork.startMocking(mock);
- mICarImpl.startMocking();
- } catch (Exception e) {
- Log.w(CarLog.TAG_TEST, "startMocking failed", e);
- synchronized (this) {
- mException = e;
- mInMocking = false;
- mMockingFlags = 0;
- }
- }
- Log.i(CarLog.TAG_TEST, "start vehicle HAL mocking, flags:0x" +
- Integer.toHexString(flags));
- }
- });
synchronized (this) {
- if (mException != null) {
- throw new IllegalStateException(mException);
+ if (mTokens.containsKey(token)) {
+ Log.w(TAG, "Calling stopCarService twice with the same token.");
+ return;
+ }
+
+ TokenDeathRecipient deathRecipient = new TokenDeathRecipient(token);
+ mTokens.put(token, deathRecipient);
+ token.linkToDeath(deathRecipient, 0);
+
+ if (mTokens.size() == 1) {
+ mICarImpl.release();
}
}
}
@Override
- public void stopMocking(final IVehicleNetworkHalMock mock) {
- ICarImpl.assertVehicleHalMockPermission(mContext);
- CarServiceUtils.runOnMainSync(new Runnable() {
- @Override
- public void run() {
- try {
- synchronized (this) {
- if (!mInMocking) {
- throw new IllegalStateException("not in mocking");
- }
- if (mMock.asBinder() != mock.asBinder()) {
- throw new IllegalArgumentException("Try to stop mocking not owned");
- }
- try {
- mMock.asBinder().unlinkToDeath(mDeathRecipient, 0);
- } catch (NoSuchElementException e) {
- //ignore
- }
- }
- mVehicleNetwork.stopMocking(mock);
- mICarImpl.stopMocking();
- synchronized (this) {
- mInMocking = false;
- mMockingFlags = 0;
- mException = null;
- mMock = null;
- }
- Log.i(CarLog.TAG_TEST, "stop vehicle HAL mocking");
- } catch (Exception e) {
- Log.w(CarLog.TAG_TEST, "stopMocking failed", e);
- }
- }
- });
+ public void startCarService(IBinder token) throws RemoteException {
+ Log.d(TAG, "startCarService, token: " + token);
+ ICarImpl.assertPermission(mContext, Car.PERMISSION_CAR_TEST_SERVICE);
+ releaseToken(token);
}
- @Override
- public boolean isPropertySupported(int property) {
- VehiclePropConfigs configs = VehicleHal.getInstance().getVehicleNetwork().listProperties(
- property);
- return configs != null;
+ private synchronized void releaseToken(IBinder token) {
+ Log.d(TAG, "releaseToken, token: " + token);
+ DeathRecipient deathRecipient = mTokens.remove(token);
+ if (deathRecipient != null) {
+ token.unlinkToDeath(deathRecipient, 0);
+ }
+
+ if (mTokens.size() == 0) {
+ mICarImpl.init();
+ }
}
- public synchronized boolean isInMocking() {
- return mInMocking;
- }
+ private class TokenDeathRecipient implements DeathRecipient {
+ private final IBinder mToken;
- public synchronized boolean shouldDoRealShutdownInMocking() {
- return (mMockingFlags & CarTestManager.FLAG_MOCKING_REAL_SHUTDOWN) != 0;
- }
+ TokenDeathRecipient(IBinder token) throws RemoteException {
+ mToken = token;
+ }
- private class MockDeathRecipient implements IBinder.DeathRecipient {
@Override
public void binderDied() {
- CarServiceUtils.runOnMainSync(() -> {
- try {
- IVehicleNetworkHalMock mock;
- synchronized (this) {
- mock = mMock;
- }
- stopMocking(mock);
- } catch (Exception e) {
- //ignore
- }
- });
+ releaseToken(mToken);
}
}
-}
+}
\ No newline at end of file
diff --git a/service/src/com/android/car/CarVendorExtensionService.java b/service/src/com/android/car/CarVendorExtensionService.java
index 3808684..2e2d074 100644
--- a/service/src/com/android/car/CarVendorExtensionService.java
+++ b/service/src/com/android/car/CarVendorExtensionService.java
@@ -19,7 +19,7 @@
import android.car.Car;
import android.content.Context;
-import com.android.car.hal.VehicleHal;
+import com.android.car.hal.VendorExtensionHalService;
/**
* Service responsible for handling custom properties that were defined in vehicle HAL by OEMs.
@@ -28,8 +28,7 @@
private final static boolean DEBUG = false;
- public CarVendorExtensionService(Context context) {
- super(context, VehicleHal.getInstance().getVendorExtensionHal(),
- Car.PERMISSION_VENDOR_EXTENSION, DEBUG, CarLog.TAG_VENDOR_EXT);
+ public CarVendorExtensionService(Context context, VendorExtensionHalService vendorHal) {
+ super(context, vendorHal, Car.PERMISSION_VENDOR_EXTENSION, DEBUG, CarLog.TAG_VENDOR_EXT);
}
}
diff --git a/service/src/com/android/car/CarVolumeControllerFactory.java b/service/src/com/android/car/CarVolumeControllerFactory.java
index 79ada5a..ae7dc1b 100644
--- a/service/src/com/android/car/CarVolumeControllerFactory.java
+++ b/service/src/com/android/car/CarVolumeControllerFactory.java
@@ -30,7 +30,6 @@
import android.telecom.TelecomManager;
import android.util.ArrayMap;
import android.util.Log;
-import android.util.Pair;
import android.util.SparseArray;
import android.view.KeyEvent;
@@ -229,9 +228,6 @@
new SparseArray<>(VolumeUtils.CAR_AUDIO_CONTEXT.length);
// stream volume limit, the key is car audio context type
@GuardedBy("this")
- private final SparseArray<Integer> mCarContextVolumeMin =
- new SparseArray<>(VolumeUtils.CAR_AUDIO_CONTEXT.length);
- @GuardedBy("this")
private final RemoteCallbackList<IVolumeController> mVolumeControllers =
new RemoteCallbackList<>();
@GuardedBy("this")
@@ -374,19 +370,13 @@
private void initVolumeLimitLocked() {
for (int i : VolumeUtils.CAR_AUDIO_CONTEXT) {
int carStream = carContextToCarStream(i);
- Pair<Integer, Integer> volumeMinMax = mHal.getStreamVolumeLimit(carStream);
- int max;
- int min;
- if (volumeMinMax == null) {
+ Integer volumeMax = mHal.getStreamMaxVolume(carStream);
+ int max = volumeMax == null ? 0 : volumeMax;
+ if (max < 0) {
max = 0;
- min = 0;
- } else {
- max = volumeMinMax.second >= 0 ? volumeMinMax.second : 0;
- min = volumeMinMax.first >=0 ? volumeMinMax.first : 0;
}
// get default stream volume limit first.
mCarContextVolumeMax.put(i, max);
- mCarContextVolumeMin.put(i, min);
}
}
@@ -574,13 +564,7 @@
@Override
public int getStreamMinVolume(int stream) {
- synchronized (this) {
- if (VolumeUtils.carContextToAndroidStream(mCurrentContext) == stream) {
- return mCarContextVolumeMin.get(mCurrentContext);
- } else {
- return mCarContextVolumeMin.get(VolumeUtils.androidStreamToCarContext(stream));
- }
- }
+ return 0; // Min value is always zero.
}
@Override
@@ -669,8 +653,6 @@
dumpVolumes(writer, mCurrentCarContextVolume);
writer.println("mCarContextVolumeMax:");
dumpVolumes(writer, mCarContextVolumeMax);
- writer.println("mCarContextVolumeMin:");
- dumpVolumes(writer, mCarContextVolumeMin);
writer.println("Number of volume controllers:" +
mVolumeControllers.getRegisteredCallbackCount());
}
diff --git a/service/src/com/android/car/CarVolumeService.java b/service/src/com/android/car/CarVolumeService.java
index 74e7071..786c791 100644
--- a/service/src/com/android/car/CarVolumeService.java
+++ b/service/src/com/android/car/CarVolumeService.java
@@ -17,12 +17,11 @@
package com.android.car;
import android.content.Context;
+import android.hardware.vehicle.V2_0.VehicleAudioContextFlag;
import android.media.AudioAttributes;
import android.media.IVolumeController;
-import android.view.KeyEvent;
import com.android.car.hal.AudioHalService;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioContextFlag;
import java.io.PrintWriter;
@@ -38,7 +37,7 @@
private static final String TAG = "CarVolumeService";
public static int DEFAULT_CAR_AUDIO_CONTEXT =
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG;
+ VehicleAudioContextFlag.MUSIC_FLAG;
private final Context mContext;
private final AudioHalService mAudioHal;
private final CarAudioService mAudioService;
diff --git a/service/src/com/android/car/DrivingStatePolicy.java b/service/src/com/android/car/DrivingStatePolicy.java
index 4716c1e..2da7021 100644
--- a/service/src/com/android/car/DrivingStatePolicy.java
+++ b/service/src/com/android/car/DrivingStatePolicy.java
@@ -16,7 +16,6 @@
package com.android.car;
-import android.car.Car;
import android.car.hardware.CarSensorEvent;
import android.car.hardware.CarSensorManager;
import android.car.hardware.ICarSensorEventListener;
@@ -37,7 +36,7 @@
private final Context mContext;
private CarSensorService mSensorService;
- private int mDringState = CarSensorEvent.DRIVE_STATUS_FULLY_RESTRICTED;
+ private int mDrivingState = CarSensorEvent.DRIVE_STATUS_FULLY_RESTRICTED;
private SensorListener mSensorListener;
private boolean mIsReady = false;
private boolean mStarted = false;
@@ -54,8 +53,9 @@
}
};
- public DrivingStatePolicy(Context context) {
+ public DrivingStatePolicy(Context context, CarSensorService sensorService) {
mContext = context;
+ mSensorService = sensorService;
}
@Override
@@ -65,8 +65,6 @@
@Override
public synchronized void onSensorServiceReady() {
- mSensorService =
- (CarSensorService) ICarImpl.getInstance(mContext).getCarService(Car.SENSOR_SERVICE);
int sensorList[] = mSensorService.getSupportedSensors();
boolean hasSpeed = subscribeIfSupportedLocked(sensorList,
CarSensorManager.SENSOR_TYPE_CAR_SPEED, CarSensorManager.SENSOR_RATE_FASTEST);
@@ -118,7 +116,7 @@
@Override
public synchronized boolean requestSensorStart(int sensorType, int rate) {
mStarted = true;
- dispatchCarSensorEvent(mSensorListener, createEvent(mDringState));
+ dispatchCarSensorEvent(mSensorListener, createEvent(mDrivingState));
return true;
}
@@ -146,9 +144,9 @@
case CarSensorManager.SENSOR_TYPE_GEAR:
case CarSensorManager.SENSOR_TYPE_CAR_SPEED:
int drivingState = recalcDrivingStateLocked();
- if (drivingState != mDringState && mSensorListener != null) {
- mDringState = drivingState;
- dispatchCarSensorEvent(mSensorListener, createEvent(mDringState));
+ if (drivingState != mDrivingState && mSensorListener != null) {
+ mDrivingState = drivingState;
+ dispatchCarSensorEvent(mSensorListener, createEvent(mDrivingState));
}
break;
default:
diff --git a/service/src/com/android/car/ICarImpl.java b/service/src/com/android/car/ICarImpl.java
index b6386af..e05efaa 100644
--- a/service/src/com/android/car/ICarImpl.java
+++ b/service/src/com/android/car/ICarImpl.java
@@ -22,6 +22,7 @@
import android.car.cluster.renderer.IInstrumentClusterNavigation;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.hardware.vehicle.V2_0.IVehicle;
import android.os.IBinder;
import android.util.Log;
@@ -40,14 +41,16 @@
// load jni for all services here
static {
- System.loadLibrary("jni_car_service");
+ try {
+ System.loadLibrary("jni_car_service");
+ } catch (UnsatisfiedLinkError ex) {
+ // Unable to load native library when loaded from the testing framework.
+ Log.e(CarLog.TAG_SERVICE, "Failed to load jni_car_service library: " + ex.getMessage());
+ }
}
- @GuardedBy("ICarImpl.class")
- private static ICarImpl sInstance = null;
-
private final Context mContext;
- private final VehicleHal mHal;
+ private VehicleHal mHal;
private final SystemActivityMonitoringService mSystemActivityMonitoringService;
private final CarPowerManagementService mCarPowerManagementService;
@@ -68,54 +71,42 @@
private final SystemStateControllerService mSystemStateControllerService;
private final CarVendorExtensionService mCarVendorExtensionService;
+ private final CarServiceBase[] mAllServices;
+
/** Test only service. Populate it only when necessary. */
@GuardedBy("this")
private CarTestService mCarTestService;
- private final CarServiceBase[] mAllServices;
- public synchronized static ICarImpl getInstance(Context serviceContext) {
- if (sInstance == null) {
- sInstance = new ICarImpl(serviceContext);
- sInstance.init();
- }
- return sInstance;
- }
-
- public synchronized static void releaseInstance() {
- if (sInstance == null) {
- return;
- }
- sInstance.release();
- sInstance = null;
- }
-
- public ICarImpl(Context serviceContext) {
+ public ICarImpl(Context serviceContext, IVehicle vehicle, SystemInterface systemInterface) {
mContext = serviceContext;
- mHal = VehicleHal.getInstance();
+ mHal = new VehicleHal(vehicle);
mSystemActivityMonitoringService = new SystemActivityMonitoringService(serviceContext);
- mCarPowerManagementService = new CarPowerManagementService(serviceContext);
- mCarSensorService = new CarSensorService(serviceContext);
+ mCarPowerManagementService = new CarPowerManagementService(
+ mHal.getPowerHal(), systemInterface);
+ mCarSensorService = new CarSensorService(serviceContext, mHal.getSensorHal());
mCarPackageManagerService = new CarPackageManagerService(serviceContext, mCarSensorService,
mSystemActivityMonitoringService);
- mCarInputService = new CarInputService(serviceContext);
+ mCarInputService = new CarInputService(serviceContext, mHal.getInputHal());
mCarProjectionService = new CarProjectionService(serviceContext, mCarInputService);
mGarageModeService = new GarageModeService(mContext, mCarPowerManagementService);
- mCarInfoService = new CarInfoService(serviceContext);
+ mCarInfoService = new CarInfoService(serviceContext, mHal.getInfoHal());
mAppFocusService = new AppFocusService(serviceContext, mSystemActivityMonitoringService);
- mCarAudioService = new CarAudioService(serviceContext, mCarInputService);
- mCarCabinService = new CarCabinService(serviceContext);
- mCarHvacService = new CarHvacService(serviceContext);
- mCarRadioService = new CarRadioService(serviceContext);
+ mCarAudioService = new CarAudioService(serviceContext, mHal.getAudioHal(),
+ mCarInputService);
+ mCarCabinService = new CarCabinService(serviceContext, mHal.getCabinHal());
+ mCarHvacService = new CarHvacService(serviceContext, mHal.getHvacHal());
+ mCarRadioService = new CarRadioService(serviceContext, mHal.getRadioHal());
mCarCameraService = new CarCameraService(serviceContext);
- mCarNightService = new CarNightService(serviceContext);
+ mCarNightService = new CarNightService(serviceContext, mCarSensorService);
mInstrumentClusterService = new InstrumentClusterService(serviceContext,
mAppFocusService, mCarInputService);
mSystemStateControllerService = new SystemStateControllerService(serviceContext,
mCarPowerManagementService, mCarAudioService, this);
- mCarVendorExtensionService = new CarVendorExtensionService(serviceContext);
+ mCarVendorExtensionService = new CarVendorExtensionService(serviceContext,
+ mHal.getVendorExtensionHal());
// Be careful with order. Service depending on other service should be inited later.
- mAllServices = new CarServiceBase[] {
+ mAllServices = new CarServiceBase[]{
mSystemActivityMonitoringService,
mCarPowerManagementService,
mCarSensorService,
@@ -134,43 +125,22 @@
mCarProjectionService,
mSystemStateControllerService,
mCarVendorExtensionService
- };
+ };
}
- private void init() {
+ public void init() {
+ mHal.init();
for (CarServiceBase service: mAllServices) {
service.init();
}
}
- private void release() {
+ public void release() {
// release done in opposite order from init
for (int i = mAllServices.length - 1; i >= 0; i--) {
mAllServices[i].release();
}
- VehicleHal.releaseInstance();
- }
-
- /** Only for CarTestService */
- void startMocking() {
- reinitServices();
- }
-
- /** Only for CarTestService */
- void stopMocking() {
- reinitServices();
- }
-
- /** Reset all services when starting / stopping vehicle hal mocking */
- private void reinitServices() {
- for (int i = mAllServices.length - 1; i >= 0; i--) {
- mAllServices[i].release();
- }
- VehicleHal.getInstance().release();
- VehicleHal.getInstance().init();
- for (CarServiceBase service: mAllServices) {
- service.init();
- }
+ mHal.release();
}
@Override
@@ -210,7 +180,7 @@
assertVendorExtensionPermission(mContext);
return mCarVendorExtensionService;
case Car.TEST_SERVICE: {
- assertVehicleHalMockPermission(mContext);
+ assertPermission(mContext, Car.PERMISSION_CAR_TEST_SERVICE);
synchronized (this) {
if (mCarTestService == null) {
mCarTestService = new CarTestService(mContext, this);
@@ -226,11 +196,7 @@
@Override
public int getCarConnectionType() {
- if (!isInMocking()) {
- return Car.CONNECTION_TYPE_EMBEDDED;
- } else {
- return Car.CONNECTION_TYPE_EMBEDDED_MOCKING;
- }
+ return Car.CONNECTION_TYPE_EMBEDDED;
}
public CarServiceBase getCarInternalService(String serviceName) {
@@ -246,17 +212,6 @@
}
}
- /**
- * Whether mocking underlying HAL or not.
- * @return
- */
- public synchronized boolean isInMocking() {
- if (mCarTestService == null) {
- return false;
- }
- return mCarTestService.isInMocking();
- }
-
public static void assertVehicleHalMockPermission(Context context) {
assertPermission(context, Car.PERMISSION_MOCK_VEHICLE_HAL);
}
@@ -300,10 +255,11 @@
for (CarServiceBase service: mAllServices) {
service.dump(writer);
}
- CarTestService testService = mCarTestService;
- if (testService != null) {
- testService.dump(writer);
+ if (mCarTestService != null) {
+ mCarTestService.dump(writer);
}
+ writer.println("*Dump Vehicle HAL*");
+ mHal.dump(writer);
}
void execShellCmd(String[] args, PrintWriter writer) {
diff --git a/service/src/com/android/car/SystemInterface.java b/service/src/com/android/car/SystemInterface.java
new file mode 100644
index 0000000..6311d80
--- /dev/null
+++ b/service/src/com/android/car/SystemInterface.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2016 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 com.android.car;
+
+import android.content.Context;
+import android.hardware.display.DisplayManager;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
+import android.os.SystemClock;
+import android.util.Log;
+import android.view.Display;
+
+/**
+ * Interface to abstract all system interaction.
+ */
+public abstract class SystemInterface {
+ public abstract void setDisplayState(boolean on);
+ public abstract void releaseAllWakeLocks();
+ public abstract void shutdown();
+ public abstract void enterDeepSleep(int wakeupTimeSec);
+ public abstract void switchToPartialWakeLock();
+ public abstract void switchToFullWakeLock();
+ public abstract void startDisplayStateMonitoring(CarPowerManagementService service);
+ public abstract void stopDisplayStateMonitoring();
+ public abstract boolean isSystemSupportingDeepSleep();
+ public abstract boolean isWakeupCausedByTimer();
+
+
+ public static SystemInterface getDefault(Context context) {
+ return new SystemInterfaceImpl(context);
+ }
+
+ private static class SystemInterfaceImpl extends SystemInterface {
+ private final PowerManager mPowerManager;
+ private final DisplayManager mDisplayManager;
+ private final WakeLock mFullWakeLock;
+ private final WakeLock mPartialWakeLock;
+ private final DisplayStateListener mDisplayListener;
+ private CarPowerManagementService mService;
+ private boolean mDisplayStateSet;
+
+ private SystemInterfaceImpl(Context context) {
+ mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
+ mFullWakeLock = mPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK,
+ CarLog.TAG_POWER);
+ mPartialWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
+ CarLog.TAG_POWER);
+ mDisplayListener = new DisplayStateListener();
+ }
+
+ @Override
+ public void startDisplayStateMonitoring(CarPowerManagementService service) {
+ synchronized (this) {
+ mService = service;
+ mDisplayStateSet = isMainDisplayOn();
+ }
+ mDisplayManager.registerDisplayListener(mDisplayListener, service.getHandler());
+ }
+
+ @Override
+ public void stopDisplayStateMonitoring() {
+ mDisplayManager.unregisterDisplayListener(mDisplayListener);
+ }
+
+ @Override
+ public void setDisplayState(boolean on) {
+ synchronized (this) {
+ mDisplayStateSet = on;
+ }
+ if (on) {
+ switchToFullWakeLock();
+ Log.i(CarLog.TAG_POWER, "on display");
+ mPowerManager.wakeUp(SystemClock.uptimeMillis());
+ } else {
+ switchToPartialWakeLock();
+ Log.i(CarLog.TAG_POWER, "off display");
+ mPowerManager.goToSleep(SystemClock.uptimeMillis());
+ }
+ }
+
+ private boolean isMainDisplayOn() {
+ Display disp = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
+ return disp.getState() == Display.STATE_ON;
+ }
+
+ @Override
+ public void shutdown() {
+ mPowerManager.shutdown(false /* no confirm*/, null, true /* true */);
+ }
+
+ @Override
+ public void enterDeepSleep(int wakeupTimeSec) {
+ //TODO set wake up time, bug: 32061842
+ mPowerManager.goToSleep(SystemClock.uptimeMillis(),
+ PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN,
+ PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
+ }
+
+ @Override
+ public boolean isSystemSupportingDeepSleep() {
+ //TODO should return by checking some kernel suspend control sysfs, bug: 32061842
+ return false;
+ }
+
+ @Override
+ public void switchToPartialWakeLock() {
+ if (!mPartialWakeLock.isHeld()) {
+ mPartialWakeLock.acquire();
+ }
+ if (mFullWakeLock.isHeld()) {
+ mFullWakeLock.release();
+ }
+ }
+
+ @Override
+ public void switchToFullWakeLock() {
+ if (!mFullWakeLock.isHeld()) {
+ mFullWakeLock.acquire();
+ }
+ if (mPartialWakeLock.isHeld()) {
+ mPartialWakeLock.release();
+ }
+ }
+
+ @Override
+ public void releaseAllWakeLocks() {
+ if (mPartialWakeLock.isHeld()) {
+ mPartialWakeLock.release();
+ }
+ if (mFullWakeLock.isHeld()) {
+ mFullWakeLock.release();
+ }
+ }
+
+ @Override
+ public boolean isWakeupCausedByTimer() {
+ //TODO bug: 32061842, check wake up reason and do necessary operation information should
+ // come from kernel. it can be either power on or wake up for maintenance
+ // power on will involve GPIO trigger from power controller
+ // its own wakeup will involve timer expiration.
+ return false;
+ }
+
+ private void handleMainDisplayChanged() {
+ boolean isOn = isMainDisplayOn();
+ CarPowerManagementService service;
+ synchronized (this) {
+ if (mDisplayStateSet == isOn) { // same as what is set
+ return;
+ }
+ service = mService;
+ }
+ service.handleMainDisplayChanged(isOn);
+ }
+
+ private class DisplayStateListener implements DisplayManager.DisplayListener {
+
+ @Override
+ public void onDisplayAdded(int displayId) {
+ //ignore
+ }
+
+ @Override
+ public void onDisplayChanged(int displayId) {
+ if (displayId == Display.DEFAULT_DISPLAY) {
+ handleMainDisplayChanged();
+ }
+ }
+
+ @Override
+ public void onDisplayRemoved(int displayId) {
+ //ignore
+ }
+ }
+ }
+}
diff --git a/service/src/com/android/car/SystemStateControllerService.java b/service/src/com/android/car/SystemStateControllerService.java
index 5746300..63821c5 100644
--- a/service/src/com/android/car/SystemStateControllerService.java
+++ b/service/src/com/android/car/SystemStateControllerService.java
@@ -33,9 +33,9 @@
private final boolean mLockWhenMuting;
public SystemStateControllerService(Context context,
- CarPowerManagementService carPowerManagementSercvice,
+ CarPowerManagementService carPowerManagementService,
CarAudioService carAudioService, ICarImpl carImpl) {
- mCarPowerManagementService = carPowerManagementSercvice;
+ mCarPowerManagementService = carPowerManagementService;
mCarAudioService = carAudioService;
mICarImpl = carImpl;
Resources res = context.getResources();
@@ -51,16 +51,12 @@
@Override
public void onPowerOn(boolean displayOn) {
if (displayOn) {
- if (!mICarImpl.isInMocking()) {
- Log.i(CarLog.TAG_SYS, "Media unmute");
- mCarAudioService.unMuteMedia();
- }
+ Log.i(CarLog.TAG_SYS, "Media unmute");
+ mCarAudioService.unMuteMedia();
} else {
- if (!mICarImpl.isInMocking()) { // do not do this in mocking as it can affect test.
- Log.i(CarLog.TAG_SYS, "Media mute");
- mCarAudioService.muteMediaWithLock(mLockWhenMuting);
- //TODO store last context and resume or silence radio on display on. bug: 32096079
- }
+ Log.i(CarLog.TAG_SYS, "Media mute");
+ mCarAudioService.muteMediaWithLock(mLockWhenMuting);
+ //TODO store last context and resume or silence radio on display on. bug: 32096079
}
}
diff --git a/service/src/com/android/car/VolumeUtils.java b/service/src/com/android/car/VolumeUtils.java
index fac3350..c2a1a7a 100644
--- a/service/src/com/android/car/VolumeUtils.java
+++ b/service/src/com/android/car/VolumeUtils.java
@@ -17,16 +17,13 @@
package com.android.car;
import android.car.settings.CarSettings;
+import android.hardware.vehicle.V2_0.VehicleAudioContextFlag;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.util.Log;
import android.util.SparseArray;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioContextFlag;
-
-import java.util.ArrayList;
import java.util.Arrays;
-import java.util.List;
public class VolumeUtils {
private static final String TAG = "VolumeUtils";
@@ -42,50 +39,50 @@
};
public static final int[] CAR_AUDIO_CONTEXT = {
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CD_ROM_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_AUX_AUDIO_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG
+ VehicleAudioContextFlag.MUSIC_FLAG,
+ VehicleAudioContextFlag.NAVIGATION_FLAG,
+ VehicleAudioContextFlag.VOICE_COMMAND_FLAG,
+ VehicleAudioContextFlag.CALL_FLAG,
+ VehicleAudioContextFlag.ALARM_FLAG,
+ VehicleAudioContextFlag.NOTIFICATION_FLAG,
+ VehicleAudioContextFlag.UNKNOWN_FLAG,
+ VehicleAudioContextFlag.SAFETY_ALERT_FLAG,
+ VehicleAudioContextFlag.CD_ROM_FLAG,
+ VehicleAudioContextFlag.AUX_AUDIO_FLAG,
+ VehicleAudioContextFlag.SYSTEM_SOUND_FLAG,
+ VehicleAudioContextFlag.RADIO_FLAG
};
public static final SparseArray<String> CAR_AUDIO_CONTEXT_SETTINGS = new SparseArray<>();
static {
- CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG,
+ CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.UNKNOWN_FLAG,
CarSettings.Global.KEY_VOLUME_MUSIC);
- CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG,
+ CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.MUSIC_FLAG,
CarSettings.Global.KEY_VOLUME_MUSIC);
CAR_AUDIO_CONTEXT_SETTINGS.put(
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG,
+ VehicleAudioContextFlag.NAVIGATION_FLAG,
CarSettings.Global.KEY_VOLUME_NAVIGATION);
CAR_AUDIO_CONTEXT_SETTINGS.put(
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG,
+ VehicleAudioContextFlag.VOICE_COMMAND_FLAG,
CarSettings.Global.KEY_VOLUME_VOICE_COMMAND);
- CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG,
+ CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.CALL_FLAG,
CarSettings.Global.KEY_VOLUME_CALL);
- CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG,
+ CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.ALARM_FLAG,
CarSettings.Global.KEY_VOLUME_ALARM);
CAR_AUDIO_CONTEXT_SETTINGS.put(
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG,
+ VehicleAudioContextFlag.NOTIFICATION_FLAG,
CarSettings.Global.KEY_VOLUME_NOTIFICATION);
CAR_AUDIO_CONTEXT_SETTINGS.put(
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG,
+ VehicleAudioContextFlag.SAFETY_ALERT_FLAG,
CarSettings.Global.KEY_VOLUME_SAFETY_ALERT);
- CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CD_ROM_FLAG,
+ CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.CD_ROM_FLAG,
CarSettings.Global.KEY_VOLUME_CD_ROM);
- CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_AUX_AUDIO_FLAG,
+ CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.AUX_AUDIO_FLAG,
CarSettings.Global.KEY_VOLUME_AUX);
CAR_AUDIO_CONTEXT_SETTINGS.put(
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG,
+ VehicleAudioContextFlag.SYSTEM_SOUND_FLAG,
CarSettings.Global.KEY_VOLUME_SYSTEM_SOUND);
- CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG,
+ CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.RADIO_FLAG,
CarSettings.Global.KEY_VOLUME_RADIO);
}
@@ -105,35 +102,35 @@
public static int androidStreamToCarContext(int logicalAndroidStream) {
switch (logicalAndroidStream) {
case AudioManager.STREAM_VOICE_CALL:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG;
+ return VehicleAudioContextFlag.CALL_FLAG;
case AudioManager.STREAM_SYSTEM:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG;
+ return VehicleAudioContextFlag.SYSTEM_SOUND_FLAG;
case AudioManager.STREAM_RING:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG;
+ return VehicleAudioContextFlag.NOTIFICATION_FLAG;
case AudioManager.STREAM_MUSIC:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG;
+ return VehicleAudioContextFlag.MUSIC_FLAG;
case AudioManager.STREAM_ALARM:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG;
+ return VehicleAudioContextFlag.ALARM_FLAG;
case AudioManager.STREAM_NOTIFICATION:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG;
+ return VehicleAudioContextFlag.NOTIFICATION_FLAG;
case AudioManager.STREAM_DTMF:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG;
+ return VehicleAudioContextFlag.SYSTEM_SOUND_FLAG;
default:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG;
+ return VehicleAudioContextFlag.UNKNOWN_FLAG;
}
}
public static int carContextToAndroidStream(int carContext) {
switch (carContext) {
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG:
+ case VehicleAudioContextFlag.CALL_FLAG:
return AudioManager.STREAM_VOICE_CALL;
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG:
+ case VehicleAudioContextFlag.SYSTEM_SOUND_FLAG:
return AudioManager.STREAM_SYSTEM;
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG:
+ case VehicleAudioContextFlag.NOTIFICATION_FLAG:
return AudioManager.STREAM_NOTIFICATION;
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG:
+ case VehicleAudioContextFlag.MUSIC_FLAG:
return AudioManager.STREAM_MUSIC;
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG:
+ case VehicleAudioContextFlag.ALARM_FLAG:
return AudioManager.STREAM_ALARM;
default:
return AudioManager.STREAM_MUSIC;
diff --git a/service/src/com/android/car/hal/AudioHalService.java b/service/src/com/android/car/hal/AudioHalService.java
index cb73454..b3f8880 100644
--- a/service/src/com/android/car/hal/AudioHalService.java
+++ b/service/src/com/android/car/hal/AudioHalService.java
@@ -15,95 +15,89 @@
*/
package com.android.car.hal;
+import static android.hardware.vehicle.V2_0.VehicleProperty.AUDIO_EXT_ROUTING_HINT;
+import static android.hardware.vehicle.V2_0.VehicleProperty.AUDIO_FOCUS;
+import static android.hardware.vehicle.V2_0.VehicleProperty.AUDIO_HW_VARIANT;
+import static android.hardware.vehicle.V2_0.VehicleProperty.AUDIO_ROUTING_POLICY;
+import static android.hardware.vehicle.V2_0.VehicleProperty.AUDIO_VOLUME;
+import static android.hardware.vehicle.V2_0.VehicleProperty.AUDIO_VOLUME_LIMIT;
+import static com.android.car.CarServiceUtils.toIntArray;
+import static java.lang.Integer.toHexString;
+
+import android.annotation.Nullable;
import android.car.VehicleZoneUtil;
import android.car.media.CarAudioManager;
-import android.os.ServiceSpecificException;
+import android.hardware.vehicle.V2_0.VehicleAudioContextFlag;
+import android.hardware.vehicle.V2_0.VehicleAudioExtFocusFlag;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusIndex;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusRequest;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusState;
+import android.hardware.vehicle.V2_0.VehicleAudioHwVariantConfigFlag;
+import android.hardware.vehicle.V2_0.VehicleAudioRoutingPolicyIndex;
+import android.hardware.vehicle.V2_0.VehicleAudioVolumeCapabilityFlag;
+import android.hardware.vehicle.V2_0.VehicleAudioVolumeIndex;
+import android.hardware.vehicle.V2_0.VehicleAudioVolumeLimitIndex;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.text.TextUtils;
import android.util.Log;
-import android.util.Pair;
import com.android.car.AudioRoutingPolicy;
import com.android.car.CarAudioAttributesUtil;
import com.android.car.CarLog;
-import com.android.car.vehiclenetwork.VehicleNetwork;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioContextFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioExtFocusFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusRequest;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusState;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioHwVariantConfigFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioRoutingPolicyIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioStreamState;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioStreamStateIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioVolumeCapabilityFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioVolumeIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioVolumeLimitIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.HashMap;
-import java.util.LinkedList;
import java.util.List;
import java.util.Map;
-import java.util.Set;
public class AudioHalService extends HalServiceBase {
public static final int VEHICLE_AUDIO_FOCUS_REQUEST_INVALID = -1;
public static final int VEHICLE_AUDIO_FOCUS_REQUEST_GAIN =
- VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN;
+ VehicleAudioFocusRequest.REQUEST_GAIN;
public static final int VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT =
- VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT;
+ VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT;
public static final int VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK =
- VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK;
+ VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT_MAY_DUCK;
public static final int VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_NO_DUCK =
- VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_NO_DUCK;
+ VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT_NO_DUCK;
public static final int VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE =
- VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE;
-
- public static String audioFocusRequestToString(int request) {
- return VehicleAudioFocusRequest.enumToString(request);
- }
+ VehicleAudioFocusRequest.REQUEST_RELEASE;
public static final int VEHICLE_AUDIO_FOCUS_STATE_INVALID = -1;
public static final int VEHICLE_AUDIO_FOCUS_STATE_GAIN =
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN;
+ VehicleAudioFocusState.STATE_GAIN;
public static final int VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT =
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT;
+ VehicleAudioFocusState.STATE_GAIN_TRANSIENT;
public static final int VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_CAN_DUCK =
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_CAN_DUCK;
+ VehicleAudioFocusState.STATE_LOSS_TRANSIENT_CAN_DUCK;
public static final int VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT =
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT;
+ VehicleAudioFocusState.STATE_LOSS_TRANSIENT;
public static final int VEHICLE_AUDIO_FOCUS_STATE_LOSS =
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS;
+ VehicleAudioFocusState.STATE_LOSS;
public static final int VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_EXLCUSIVE =
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_EXLCUSIVE;
+ VehicleAudioFocusState.STATE_LOSS_TRANSIENT_EXLCUSIVE;
- public static String audioFocusStateToString(int state) {
- return VehicleAudioFocusState.enumToString(state);
- }
-
- public static final int VEHICLE_AUDIO_STREAM_STATE_STOPPED =
- VehicleAudioStreamState.VEHICLE_AUDIO_STREAM_STATE_STOPPED;
- public static final int VEHICLE_AUDIO_STREAM_STATE_STARTED =
- VehicleAudioStreamState.VEHICLE_AUDIO_STREAM_STATE_STARTED;
-
- public static String audioStreamStateToString(int state) {
- return VehicleAudioStreamState.enumToString(state);
- }
+ // TODO(pavelm): we don't have internal properties anymore
+// public static final int VEHICLE_AUDIO_STREAM_STATE_STOPPED =
+// VehicleAudioStreamState.VEHICLE_AUDIO_STREAM_STATE_STOPPED;
+// public static final int VEHICLE_AUDIO_STREAM_STATE_STARTED =
+// VehicleAudioStreamState.VEHICLE_AUDIO_STREAM_STATE_STARTED;
public static final int VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG =
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG;
+ VehicleAudioExtFocusFlag.NONE_FLAG;
public static final int VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT_FLAG =
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT_FLAG;
+ VehicleAudioExtFocusFlag.PERMANENT_FLAG;
public static final int VEHICLE_AUDIO_EXT_FOCUS_CAR_TRANSIENT_FLAG =
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_TRANSIENT_FLAG;
+ VehicleAudioExtFocusFlag.TRANSIENT_FLAG;
public static final int VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG =
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG;
+ VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG;
public static final int VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG =
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG;
+ VehicleAudioExtFocusFlag.MUTE_MEDIA_FLAG;
public static final int STREAM_NUM_DEFAULT = 0;
@@ -112,31 +106,31 @@
public static final int FOCUS_STATE_ARRAY_INDEX_EXTERNAL_FOCUS = 2;
public static final int AUDIO_CONTEXT_MUSIC_FLAG =
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG;
+ VehicleAudioContextFlag.MUSIC_FLAG;
public static final int AUDIO_CONTEXT_NAVIGATION_FLAG =
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG;
+ VehicleAudioContextFlag.NAVIGATION_FLAG;
public static final int AUDIO_CONTEXT_VOICE_COMMAND_FLAG =
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG;
+ VehicleAudioContextFlag.VOICE_COMMAND_FLAG;
public static final int AUDIO_CONTEXT_CALL_FLAG =
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG;
+ VehicleAudioContextFlag.CALL_FLAG;
public static final int AUDIO_CONTEXT_ALARM_FLAG =
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG;
+ VehicleAudioContextFlag.ALARM_FLAG;
public static final int AUDIO_CONTEXT_NOTIFICATION_FLAG =
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG;
+ VehicleAudioContextFlag.NOTIFICATION_FLAG;
public static final int AUDIO_CONTEXT_UNKNOWN_FLAG =
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG;
+ VehicleAudioContextFlag.UNKNOWN_FLAG;
public static final int AUDIO_CONTEXT_SAFETY_ALERT_FLAG =
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG;
+ VehicleAudioContextFlag.SAFETY_ALERT_FLAG;
public static final int AUDIO_CONTEXT_RADIO_FLAG =
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG;
+ VehicleAudioContextFlag.RADIO_FLAG;
public static final int AUDIO_CONTEXT_CD_ROM_FLAG =
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CD_ROM_FLAG;
+ VehicleAudioContextFlag.CD_ROM_FLAG;
public static final int AUDIO_CONTEXT_AUX_AUDIO_FLAG =
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_AUX_AUDIO_FLAG;
+ VehicleAudioContextFlag.AUX_AUDIO_FLAG;
public static final int AUDIO_CONTEXT_SYSTEM_SOUND_FLAG =
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG;
+ VehicleAudioContextFlag.SYSTEM_SOUND_FLAG;
public static final int AUDIO_CONTEXT_EXT_SOURCE_FLAG =
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_EXT_SOURCE_FLAG;
+ VehicleAudioContextFlag.EXT_SOURCE_FLAG;
public interface AudioHalFocusListener {
/**
@@ -193,60 +187,54 @@
}
public void setAudioRoutingPolicy(AudioRoutingPolicy policy) {
- VehicleNetwork vn = mVehicleHal.getVehicleNetwork();
- VehiclePropConfigs configs = vn.listProperties(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY);
- if (configs == null) {
+ if (!mVehicleHal.isPropertySupported(VehicleProperty.AUDIO_ROUTING_POLICY)) {
Log.w(CarLog.TAG_AUDIO,
- "Vehicle HAL did not implement VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY");
+ "Vehicle HAL did not implement VehicleProperty.AUDIO_ROUTING_POLICY");
return;
}
int[] policyToSet = new int[2];
for (int i = 0; i < policy.getPhysicalStreamsCount(); i++) {
- policyToSet[VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_STREAM] =
- i;
+ policyToSet[VehicleAudioRoutingPolicyIndex.STREAM] = i;
int contexts = 0;
for (int logicalStream : policy.getLogicalStreamsForPhysicalStream(i)) {
contexts |= logicalStreamToHalContextType(logicalStream);
}
- policyToSet[VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_CONTEXTS]
- = contexts;
+ policyToSet[VehicleAudioRoutingPolicyIndex.CONTEXTS] = contexts;
try {
- vn.setIntVectorProperty(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY,
- policyToSet);
- } catch (ServiceSpecificException e) {
- Log.e(CarLog.TAG_AUDIO, "Cannot write to VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY", e);
+ mVehicleHal.set(AUDIO_ROUTING_POLICY).to(policyToSet);
+ } catch (PropertyTimeoutException e) {
+ Log.e(CarLog.TAG_AUDIO, "Cannot write to VehicleProperty.AUDIO_ROUTING_POLICY", e);
}
}
}
/**
- * Returns the volume limits of a stream in the form <min, max>.
+ * Returns the volume limits of a stream. Returns null if max value wasn't defined for
+ * AUDIO_VOLUME property.
*/
- public synchronized Pair<Integer, Integer> getStreamVolumeLimit(int stream) {
- if (!isPropertySupportedLocked(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME)) {
- throw new IllegalStateException("VEHICLE_PROPERTY_AUDIO_VOLUME not supported");
+ @Nullable
+ public synchronized Integer getStreamMaxVolume(int stream) {
+ VehiclePropConfig config = mProperties.get(VehicleProperty.AUDIO_VOLUME);
+ if (config == null) {
+ throw new IllegalStateException("VehicleProperty.AUDIO_VOLUME not supported");
}
int supportedContext = getSupportedAudioVolumeContexts();
- VehiclePropConfig config = mProperties.get(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME);
- List<Integer> maxs = config.getInt32MaxsList();
- List<Integer> mins = config.getInt32MinsList();
- if (maxs.size() != mins.size()) {
- Log.e(CarLog.TAG_AUDIO, "Invalid volume prop config");
- return null;
+ int MAX_VALUES_FIRST_ELEMENT_INDEX = 4;
+ ArrayList<Integer> maxValues = new ArrayList<>();
+ for (int i = MAX_VALUES_FIRST_ELEMENT_INDEX; i < config.configArray.size(); i++) {
+ maxValues.add(config.configArray.get(i));
}
- Pair<Integer, Integer> result = null;
+ Integer result = null;
if (supportedContext != 0) {
int index = VehicleZoneUtil.zoneToIndex(supportedContext, stream);
- if (index < maxs.size()) {
- result = new Pair<>(mins.get(index), maxs.get(index));
+ if (index < maxValues.size()) {
+ result = maxValues.get(index);
}
} else {
- if (stream < maxs.size()) {
- result = new Pair<>(mins.get(stream), maxs.get(stream));
+ if (stream < maxValues.size()) {
+ result = maxValues.get(stream);
}
}
@@ -268,25 +256,25 @@
public static int logicalStreamWithExtTypeToHalContextType(int logicalStream, String extType) {
switch (logicalStream) {
case CarAudioManager.CAR_AUDIO_USAGE_RADIO:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG;
+ return VehicleAudioContextFlag.RADIO_FLAG;
case CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG;
+ return VehicleAudioContextFlag.CALL_FLAG;
case CarAudioManager.CAR_AUDIO_USAGE_MUSIC:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG;
+ return VehicleAudioContextFlag.MUSIC_FLAG;
case CarAudioManager.CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG;
+ return VehicleAudioContextFlag.NAVIGATION_FLAG;
case CarAudioManager.CAR_AUDIO_USAGE_VOICE_COMMAND:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG;
+ return VehicleAudioContextFlag.VOICE_COMMAND_FLAG;
case CarAudioManager.CAR_AUDIO_USAGE_ALARM:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG;
+ return VehicleAudioContextFlag.ALARM_FLAG;
case CarAudioManager.CAR_AUDIO_USAGE_NOTIFICATION:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG;
+ return VehicleAudioContextFlag.NOTIFICATION_FLAG;
case CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG;
+ return VehicleAudioContextFlag.SAFETY_ALERT_FLAG;
case CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SOUND:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG;
+ return VehicleAudioContextFlag.SYSTEM_SOUND_FLAG;
case CarAudioManager.CAR_AUDIO_USAGE_DEFAULT:
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG;
+ return VehicleAudioContextFlag.UNKNOWN_FLAG;
case CarAudioManager.CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE:
if (extType != null) {
switch (extType) {
@@ -297,13 +285,13 @@
return AudioHalService.AUDIO_CONTEXT_AUX_AUDIO_FLAG;
default:
if (extType.startsWith("RADIO_")) {
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG;
+ return VehicleAudioContextFlag.RADIO_FLAG;
} else {
return AudioHalService.AUDIO_CONTEXT_EXT_SOURCE_FLAG;
}
}
} else { // no external source specified. fall back to radio
- return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG;
+ return VehicleAudioContextFlag.RADIO_FLAG;
}
case CarAudioAttributesUtil.CAR_AUDIO_USAGE_CARSERVICE_BOTTOM:
case CarAudioAttributesUtil.CAR_AUDIO_USAGE_CARSERVICE_CAR_PROXY:
@@ -321,31 +309,31 @@
*/
public static int carContextToCarUsage(int carContext) {
switch (carContext) {
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG:
+ case VehicleAudioContextFlag.MUSIC_FLAG:
return CarAudioManager.CAR_AUDIO_USAGE_MUSIC;
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG:
+ case VehicleAudioContextFlag.NAVIGATION_FLAG:
return CarAudioManager.CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE;
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG:
+ case VehicleAudioContextFlag.ALARM_FLAG:
return CarAudioManager.CAR_AUDIO_USAGE_ALARM;
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG:
+ case VehicleAudioContextFlag.VOICE_COMMAND_FLAG:
return CarAudioManager.CAR_AUDIO_USAGE_VOICE_COMMAND;
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_AUX_AUDIO_FLAG:
+ case VehicleAudioContextFlag.AUX_AUDIO_FLAG:
return CarAudioManager.CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE;
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG:
+ case VehicleAudioContextFlag.CALL_FLAG:
return CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL;
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CD_ROM_FLAG:
+ case VehicleAudioContextFlag.CD_ROM_FLAG:
return CarAudioManager.CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE;
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG:
+ case VehicleAudioContextFlag.NOTIFICATION_FLAG:
return CarAudioManager.CAR_AUDIO_USAGE_NOTIFICATION;
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG:
+ case VehicleAudioContextFlag.RADIO_FLAG:
return CarAudioManager.CAR_AUDIO_USAGE_RADIO;
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG:
+ case VehicleAudioContextFlag.SAFETY_ALERT_FLAG:
return CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT;
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG:
+ case VehicleAudioContextFlag.SYSTEM_SOUND_FLAG:
return CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SOUND;
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG:
+ case VehicleAudioContextFlag.UNKNOWN_FLAG:
return CarAudioManager.CAR_AUDIO_USAGE_DEFAULT;
- case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_EXT_SOURCE_FLAG:
+ case VehicleAudioContextFlag.EXT_SOURCE_FLAG:
return CarAudioManager.CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE;
default:
Log.w(CarLog.TAG_AUDIO, "Unknown car context:" + carContext);
@@ -360,10 +348,9 @@
public void requestAudioFocusChange(int request, int streams, int extFocus, int audioContexts) {
int[] payload = { request, streams, extFocus, audioContexts };
try {
- mVehicleHal.getVehicleNetwork().setIntVectorProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, payload);
- } catch (ServiceSpecificException e) {
- Log.e(CarLog.TAG_AUDIO, "Cannot write to VEHICLE_PROPERTY_AUDIO_FOCUS", e);
+ mVehicleHal.set(AUDIO_FOCUS).to(payload);
+ } catch (PropertyTimeoutException e) {
+ Log.e(CarLog.TAG_AUDIO, "Cannot write to VehicleProperty.AUDIO_FOCUS", e);
// focus timeout will reset it anyway
}
}
@@ -371,36 +358,35 @@
public void setStreamVolume(int streamType, int index) {
int[] payload = {streamType, index, 0};
try {
- mVehicleHal.getVehicleNetwork().setIntVectorProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME, payload);
- } catch (ServiceSpecificException e) {
- Log.e(CarLog.TAG_AUDIO, "Cannot write to VEHICLE_PROPERTY_AUDIO_VOLUME", e);
+ mVehicleHal.set(VehicleProperty.AUDIO_VOLUME).to(payload);
+ } catch (PropertyTimeoutException e) {
+ Log.e(CarLog.TAG_AUDIO, "Cannot write to VehicleProperty.AUDIO_VOLUME", e);
//TODO should reset volume, bug: 32096870
}
}
public int getStreamVolume(int stream) {
int[] volume = {stream, 0, 0};
- VehiclePropValue streamVolume =
- VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME, volume, 0);
- VehiclePropValue value;
+ VehiclePropValue requestedStreamVolume = new VehiclePropValue();
+ requestedStreamVolume.prop = VehicleProperty.AUDIO_VOLUME;
+ requestedStreamVolume.value.int32Values.addAll(Arrays.asList(stream, 0 , 0));
+ VehiclePropValue propValue;
try {
- value = mVehicleHal.getVehicleNetwork().getProperty(streamVolume);
- } catch (ServiceSpecificException e) {
- Log.e(CarLog.TAG_AUDIO, "AUDIO_VOLUME not ready", e);
+ propValue = mVehicleHal.get(requestedStreamVolume);
+ } catch (PropertyTimeoutException e) {
+ Log.e(CarLog.TAG_AUDIO, "VehicleProperty.AUDIO_VOLUME not ready", e);
return 0;
}
- if (value.getInt32ValuesCount() != 3) {
+ if (propValue.value.int32Values.size() != 3) {
Log.e(CarLog.TAG_AUDIO, "returned value not valid");
throw new IllegalStateException("Invalid preset returned from service: "
- + value.getInt32ValuesList());
+ + Arrays.toString(propValue.value.int32Values.toArray()));
}
- int retStreamNum = value.getInt32Values(0);
- int retVolume = value.getInt32Values(1);
- int retVolumeState = value.getInt32Values(2);
+ int retStreamNum = propValue.value.int32Values.get(0);
+ int retVolume = propValue.value.int32Values.get(1);
+ int retVolumeState = propValue.value.int32Values.get(2);
if (retStreamNum != stream) {
Log.e(CarLog.TAG_AUDIO, "Stream number is not the same: "
@@ -415,31 +401,28 @@
}
public synchronized boolean isRadioExternal() {
- VehiclePropConfig config = mProperties.get(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT);
+ VehiclePropConfig config = mProperties.get(VehicleProperty.AUDIO_HW_VARIANT);
if (config == null) {
return true;
}
- return (config.getConfigArray(0) &
- VehicleAudioHwVariantConfigFlag.VEHICLE_AUDIO_HW_VARIANT_FLAG_INTERNAL_RADIO_FLAG)
- == 0;
+ return (config.configArray.get(0)
+ & VehicleAudioHwVariantConfigFlag.INTERNAL_RADIO_FLAG) == 0;
}
public synchronized boolean isFocusSupported() {
- return isPropertySupportedLocked(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS);
+ return isPropertySupportedLocked(AUDIO_FOCUS);
}
public synchronized boolean isAudioVolumeSupported() {
- return isPropertySupportedLocked(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME);
+ return isPropertySupportedLocked(VehicleProperty.AUDIO_VOLUME);
}
public synchronized int getSupportedAudioVolumeContexts() {
- if (!isPropertySupportedLocked(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME)) {
- throw new IllegalStateException("VEHICLE_PROPERTY_AUDIO_VOLUME not supported");
+ if (!isPropertySupportedLocked(VehicleProperty.AUDIO_VOLUME)) {
+ throw new IllegalStateException("VehicleProperty.AUDIO_VOLUME not supported");
}
- VehiclePropConfig config = mProperties.get(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME);
- return config.getConfigArray(0);
+ VehiclePropConfig config = mProperties.get(VehicleProperty.AUDIO_VOLUME);
+ return config.configArray.get(0);
}
/**
@@ -447,34 +430,32 @@
* @return
*/
public synchronized boolean isExternalAudioVolumePersistent() {
- if (!isPropertySupportedLocked(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME)) {
- throw new IllegalStateException("VEHICLE_PROPERTY_AUDIO_VOLUME not supported");
+ if (!isPropertySupportedLocked(VehicleProperty.AUDIO_VOLUME)) {
+ throw new IllegalStateException("VehicleProperty.AUDIO_VOLUME not supported");
}
- VehiclePropConfig config = mProperties.get(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME);
- if (config.getConfigArray(0) == 0) { // physical streams only
+ VehiclePropConfig config = mProperties.get(VehicleProperty.AUDIO_VOLUME);
+ if (config.configArray.get(0) == 0) { // physical streams only
return false;
}
- if ((config.getConfigArray(1) &
- VehicleAudioVolumeCapabilityFlag.VEHICLE_AUDIO_VOLUME_CAPABILITY_PERSISTENT_STORAGE)
- != 0) {
+ if ((config.configArray.get(1)
+ & VehicleAudioVolumeCapabilityFlag.PERSISTENT_STORAGE) != 0) {
return true;
}
return false;
}
public synchronized boolean isAudioVolumeLimitSupported() {
- return isPropertySupportedLocked(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT);
+ return isPropertySupportedLocked(AUDIO_VOLUME_LIMIT);
}
public synchronized boolean isAudioVolumeMasterOnly() {
- if (!isPropertySupportedLocked(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME)) {
- throw new IllegalStateException("VEHICLE_PROPERTY_AUDIO_VOLUME not supported");
+ if (!isPropertySupportedLocked(VehicleProperty.AUDIO_VOLUME)) {
+ throw new IllegalStateException("VehicleProperty.AUDIO_VOLUME not supported");
}
VehiclePropConfig config = mProperties.get(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME);
- if ((config.getConfigArray(1) &
- VehicleAudioVolumeCapabilityFlag.VEHICLE_AUDIO_VOLUME_CAPABILITY_MASTER_VOLUME_ONLY)
+ AUDIO_VOLUME);
+ if ((config.configArray.get(1) &
+ VehicleAudioVolumeCapabilityFlag.MASTER_VOLUME_ONLY)
!= 0) {
return true;
}
@@ -490,10 +471,10 @@
return new int[] { VEHICLE_AUDIO_FOCUS_STATE_GAIN, 0xffffffff, 0};
}
try {
- return mVehicleHal.getVehicleNetwork().getIntVectorProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS);
- } catch (ServiceSpecificException e) {
- Log.e(CarLog.TAG_AUDIO, "VEHICLE_PROPERTY_AUDIO_HW_VARIANT not ready", e);
+ VehiclePropValue propValue = mVehicleHal.get(VehicleProperty.AUDIO_FOCUS);
+ return toIntArray(propValue.value.int32Values);
+ } catch (PropertyTimeoutException e) {
+ Log.e(CarLog.TAG_AUDIO, "VehicleProperty.AUDIO_HW_VARIANT not ready", e);
return new int[] { VEHICLE_AUDIO_FOCUS_STATE_LOSS, 0x0, 0};
}
}
@@ -518,7 +499,7 @@
@Override
public String toString() {
- return "[bitPosition=" + bitPosition + ", physycalStreamNumber="
+ return "[bitPosition=" + bitPosition + ", physicalStreamNumber="
+ physicalStreamNumber + "]";
}
}
@@ -531,21 +512,22 @@
public Map<String, ExtRoutingSourceInfo> getExternalAudioRoutingTypes() {
VehiclePropConfig config;
synchronized (this) {
- if (!isPropertySupportedLocked(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT)) {
+ if (!isPropertySupportedLocked(AUDIO_EXT_ROUTING_HINT)) {
+ if (DBG) {
+ Log.i(CarLog.TAG_AUDIO, "AUDIO_EXT_ROUTING_HINT is not supported");
+ }
return null;
}
- config = mProperties.get(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT);
+ config = mProperties.get(AUDIO_EXT_ROUTING_HINT);
}
- if (!config.hasConfigString()) {
- Log.w(CarLog.TAG_HAL, "AUDIO_EXT_ROUTING_HINT with empty config string");
+ if (TextUtils.isEmpty(config.configString)) {
+ Log.w(CarLog.TAG_AUDIO, "AUDIO_EXT_ROUTING_HINT with empty config string");
return null;
}
Map<String, ExtRoutingSourceInfo> routingTypes = new HashMap<>();
- String configString = config.getConfigString();
+ String configString = config.configString;
if (DBG) {
- Log.i(CarLog.TAG_HAL, "AUDIO_EXT_ROUTING_HINT config string:" + configString);
+ Log.i(CarLog.TAG_AUDIO, "AUDIO_EXT_ROUTING_HINT config string:" + configString);
}
String[] routes = configString.split(",");
for (String routeString : routes) {
@@ -561,7 +543,7 @@
name = tokens[1];
physicalStreamNumber = Integer.parseInt(tokens[2]);
} else {
- Log.w(CarLog.TAG_AUDIO, "VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT has wrong entry:" +
+ Log.w(CarLog.TAG_AUDIO, "AUDIO_EXT_ROUTING_HINT has wrong entry:" +
routeString);
continue;
}
@@ -572,10 +554,9 @@
public void setExternalRoutingSource(int[] externalRoutings) {
try {
- mVehicleHal.getVehicleNetwork().setIntVectorProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT, externalRoutings);
- } catch (ServiceSpecificException e) {
- Log.e(CarLog.TAG_AUDIO, "Cannot write to VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT", e);
+ mVehicleHal.set(AUDIO_EXT_ROUTING_HINT).to(externalRoutings);
+ } catch (PropertyTimeoutException e) {
+ Log.e(CarLog.TAG_AUDIO, "Cannot write to VehicleProperty.AUDIO_EXT_ROUTING_HINT", e);
}
}
@@ -588,17 +569,16 @@
public synchronized void init() {
for (VehiclePropConfig config : mProperties.values()) {
if (VehicleHal.isPropertySubscribable(config)) {
- mVehicleHal.subscribeProperty(this, config.getProp(), 0);
+ mVehicleHal.subscribeProperty(this, config.prop, 0);
}
}
try {
- mVariant = mVehicleHal.getVehicleNetwork().getIntProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT);
+ mVariant = mVehicleHal.get(int.class, AUDIO_HW_VARIANT);
} catch (IllegalArgumentException e) {
// no variant. Set to default, 0.
mVariant = 0;
- } catch (ServiceSpecificException e) {
- Log.e(CarLog.TAG_AUDIO, "VEHICLE_PROPERTY_AUDIO_HW_VARIANT not ready", e);
+ } catch (PropertyTimeoutException e) {
+ Log.e(CarLog.TAG_AUDIO, "VehicleProperty.AUDIO_HW_VARIANT not ready", e);
mVariant = 0;
}
}
@@ -607,34 +587,35 @@
public synchronized void release() {
for (VehiclePropConfig config : mProperties.values()) {
if (VehicleHal.isPropertySubscribable(config)) {
- mVehicleHal.unsubscribeProperty(this, config.getProp());
+ mVehicleHal.unsubscribeProperty(this, config.prop);
}
}
mProperties.clear();
}
@Override
- public synchronized List<VehiclePropConfig> takeSupportedProperties(
- List<VehiclePropConfig> allProperties) {
+ public synchronized Collection<VehiclePropConfig> takeSupportedProperties(
+ Collection<VehiclePropConfig> allProperties) {
for (VehiclePropConfig p : allProperties) {
- switch (p.getProp()) {
- case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS:
- case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME:
- case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT:
- case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT:
- case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT:
- case VehicleNetworkConsts.VEHICLE_PROPERTY_INTERNAL_AUDIO_STREAM_STATE:
- mProperties.put(p.getProp(), p);
+ switch (p.prop) {
+ case VehicleProperty.AUDIO_FOCUS:
+ case VehicleProperty.AUDIO_VOLUME:
+ case VehicleProperty.AUDIO_VOLUME_LIMIT:
+ case VehicleProperty.AUDIO_HW_VARIANT:
+ case VehicleProperty.AUDIO_EXT_ROUTING_HINT:
+ // TODO(pavelm): we don't have internal properties anymore.
+// case VehicleProperty.INTERNAL_AUDIO_STREAM_STATE:
+ mProperties.put(p.prop, p);
break;
}
}
- return new LinkedList<VehiclePropConfig>(mProperties.values());
+ return new ArrayList<>(mProperties.values());
}
@Override
public void handleHalEvents(List<VehiclePropValue> values) {
- AudioHalFocusListener focusListener = null;
- AudioHalVolumeListener volumeListener = null;
+ AudioHalFocusListener focusListener;
+ AudioHalVolumeListener volumeListener;
synchronized (this) {
focusListener = mFocusListener;
volumeListener = mVolumeListener;
@@ -646,44 +627,38 @@
AudioHalVolumeListener volumeListener,
List<VehiclePropValue> values) {
for (VehiclePropValue v : values) {
- switch (v.getProp()) {
- case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS: {
- int focusState = v.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_FOCUS);
- int streams = v.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_STREAMS);
- int externalFocus = v.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_EXTERNAL_FOCUS_STATE);
+ ArrayList<Integer> vec = v.value.int32Values;
+ switch (v.prop) {
+ case VehicleProperty.AUDIO_FOCUS: {
+ int focusState = vec.get(VehicleAudioFocusIndex.FOCUS);
+ int streams = vec.get(VehicleAudioFocusIndex.STREAMS);
+ int externalFocus = vec.get(VehicleAudioFocusIndex.EXTERNAL_FOCUS_STATE);
if (focusListener != null) {
focusListener.onFocusChange(focusState, streams, externalFocus);
}
} break;
- case VehicleNetworkConsts.VEHICLE_PROPERTY_INTERNAL_AUDIO_STREAM_STATE: {
- int state = v.getInt32Values(
- VehicleAudioStreamStateIndex.VEHICLE_AUDIO_STREAM_STATE_INDEX_STATE);
- int streamNum = v.getInt32Values(
- VehicleAudioStreamStateIndex.VEHICLE_AUDIO_STREAM_STATE_INDEX_STREAM);
- if (focusListener != null) {
- focusListener.onStreamStatusChange(streamNum, state ==
- VehicleAudioStreamState.VEHICLE_AUDIO_STREAM_STATE_STARTED);
- }
- } break;
- case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME: {
- int volume = v.getInt32Values(
- VehicleAudioVolumeIndex.VEHICLE_AUDIO_VOLUME_INDEX_VOLUME);
- int streamNum = v.getInt32Values(
- VehicleAudioVolumeIndex.VEHICLE_AUDIO_VOLUME_INDEX_STREAM);
- int volumeState = v.getInt32Values(
- VehicleAudioVolumeIndex.VEHICLE_AUDIO_VOLUME_INDEX_STATE);
+ // TODO(pavelm): we don't have internal properties anymore
+// case INTERNAL_AUDIO_STREAM_STATE: {
+// int state = v.getInt32Values(
+// VehicleAudioStreamStateIndex.VEHICLE_AUDIO_STREAM_STATE_INDEX_STATE);
+// int streamNum = v.getInt32Values(
+// VehicleAudioStreamStateIndex.VEHICLE_AUDIO_STREAM_STATE_INDEX_STREAM);
+// if (focusListener != null) {
+// focusListener.onStreamStatusChange(streamNum, state ==
+// VehicleAudioStreamState.VEHICLE_AUDIO_STREAM_STATE_STARTED);
+// }
+// } break;
+ case AUDIO_VOLUME: {
+ int volume = vec.get(VehicleAudioVolumeIndex.INDEX_VOLUME);
+ int streamNum = vec.get(VehicleAudioVolumeIndex.INDEX_STREAM);
+ int volumeState = vec.get(VehicleAudioVolumeIndex.INDEX_STATE);
if (volumeListener != null) {
volumeListener.onVolumeChange(streamNum, volume, volumeState);
}
} break;
- case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT: {
- int stream = v.getInt32Values(
- VehicleAudioVolumeLimitIndex.VEHICLE_AUDIO_VOLUME_LIMIT_INDEX_STREAM);
- int maxVolume = v.getInt32Values(
- VehicleAudioVolumeLimitIndex.VEHICLE_AUDIO_VOLUME_LIMIT_INDEX_MAX_VOLUME);
+ case AUDIO_VOLUME_LIMIT: {
+ int stream = vec.get(VehicleAudioVolumeLimitIndex.STREAM);
+ int maxVolume = vec.get(VehicleAudioVolumeLimitIndex.MAX_VOLUME);
if (volumeListener != null) {
volumeListener.onVolumeLimitChange(stream, maxVolume);
}
diff --git a/service/src/com/android/car/hal/CabinHalService.java b/service/src/com/android/car/hal/CabinHalService.java
index 213f458..b0e5e21 100644
--- a/service/src/com/android/car/hal/CabinHalService.java
+++ b/service/src/com/android/car/hal/CabinHalService.java
@@ -16,8 +16,7 @@
package com.android.car.hal;
import android.car.hardware.cabin.CarCabinManager;
-
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
+import android.hardware.vehicle.V2_0.VehicleProperty;
public class CabinHalService extends PropertyHalServiceBase {
private static final boolean DBG = false;
@@ -25,127 +24,127 @@
private final ManagerToHalPropIdMap mMgrHalPropIdMap = ManagerToHalPropIdMap.create(new int[] {
CarCabinManager.ID_DOOR_POS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_DOOR_POS,
+ VehicleProperty.DOOR_POS,
CarCabinManager.ID_DOOR_MOVE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_DOOR_MOVE,
+ VehicleProperty.DOOR_MOVE,
CarCabinManager.ID_DOOR_LOCK,
- VehicleNetworkConsts.VEHICLE_PROPERTY_DOOR_LOCK,
+ VehicleProperty.DOOR_LOCK,
CarCabinManager.ID_MIRROR_Z_POS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_MIRROR_Z_POS,
+ VehicleProperty.MIRROR_Z_POS,
CarCabinManager.ID_MIRROR_Z_MOVE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_MIRROR_Z_MOVE,
+ VehicleProperty.MIRROR_Z_MOVE,
CarCabinManager.ID_MIRROR_Y_POS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_MIRROR_Y_POS,
+ VehicleProperty.MIRROR_Y_POS,
CarCabinManager.ID_MIRROR_Y_MOVE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_MIRROR_Y_MOVE,
+ VehicleProperty.MIRROR_Y_MOVE,
CarCabinManager.ID_MIRROR_LOCK,
- VehicleNetworkConsts.VEHICLE_PROPERTY_MIRROR_LOCK,
+ VehicleProperty.MIRROR_LOCK,
CarCabinManager.ID_MIRROR_FOLD,
- VehicleNetworkConsts.VEHICLE_PROPERTY_MIRROR_FOLD,
+ VehicleProperty.MIRROR_FOLD,
CarCabinManager.ID_SEAT_MEMORY_SELECT,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_MEMORY_SELECT,
+ VehicleProperty.SEAT_MEMORY_SELECT,
CarCabinManager.ID_SEAT_MEMORY_SET,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_MEMORY_SET,
+ VehicleProperty.SEAT_MEMORY_SET,
CarCabinManager.ID_SEAT_BELT_BUCKLED,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_BELT_BUCKLED,
+ VehicleProperty.SEAT_BELT_BUCKLED,
CarCabinManager.ID_SEAT_BELT_HEIGHT_POS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_POS,
+ VehicleProperty.SEAT_BELT_HEIGHT_POS,
CarCabinManager.ID_SEAT_BELT_HEIGHT_MOVE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_MOVE,
+ VehicleProperty.SEAT_BELT_HEIGHT_MOVE,
CarCabinManager.ID_SEAT_FORE_AFT_POS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_FORE_AFT_POS,
+ VehicleProperty.SEAT_FORE_AFT_POS,
CarCabinManager.ID_SEAT_FORE_AFT_MOVE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_FORE_AFT_MOVE,
+ VehicleProperty.SEAT_FORE_AFT_MOVE,
CarCabinManager.ID_SEAT_BACKREST_ANGLE_1_POS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_POS,
+ VehicleProperty.SEAT_BACKREST_ANGLE_1_POS,
CarCabinManager.ID_SEAT_BACKREST_ANGLE_1_MOVE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_MOVE,
+ VehicleProperty.SEAT_BACKREST_ANGLE_1_MOVE,
CarCabinManager.ID_SEAT_BACKREST_ANGLE_2_POS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_POS,
+ VehicleProperty.SEAT_BACKREST_ANGLE_2_POS,
CarCabinManager.ID_SEAT_BACKREST_ANGLE_2_MOVE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_MOVE,
+ VehicleProperty.SEAT_BACKREST_ANGLE_2_MOVE,
CarCabinManager.ID_SEAT_HEIGHT_POS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_HEIGHT_POS,
+ VehicleProperty.SEAT_HEIGHT_POS,
CarCabinManager.ID_SEAT_HEIGHT_MOVE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_HEIGHT_MOVE,
+ VehicleProperty.SEAT_HEIGHT_MOVE,
CarCabinManager.ID_SEAT_DEPTH_POS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_DEPTH_POS,
+ VehicleProperty.SEAT_DEPTH_POS,
CarCabinManager.ID_SEAT_DEPTH_MOVE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_DEPTH_MOVE,
+ VehicleProperty.SEAT_DEPTH_MOVE,
CarCabinManager.ID_SEAT_TILT_POS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_TILT_POS,
+ VehicleProperty.SEAT_TILT_POS,
CarCabinManager.ID_SEAT_TILT_MOVE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_TILT_MOVE,
+ VehicleProperty.SEAT_TILT_MOVE,
CarCabinManager.ID_SEAT_LUMBAR_FORE_AFT_POS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_POS,
+ VehicleProperty.SEAT_LUMBAR_FORE_AFT_POS,
CarCabinManager.ID_SEAT_LUMBAR_FORE_AFT_MOVE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_MOVE,
+ VehicleProperty.SEAT_LUMBAR_FORE_AFT_MOVE,
CarCabinManager.ID_SEAT_LUMBAR_SIDE_SUPPORT_POS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_POS,
+ VehicleProperty.SEAT_LUMBAR_SIDE_SUPPORT_POS,
CarCabinManager.ID_SEAT_LUMBAR_SIDE_SUPPORT_MOVE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_MOVE,
+ VehicleProperty.SEAT_LUMBAR_SIDE_SUPPORT_MOVE,
CarCabinManager.ID_SEAT_HEADREST_HEIGHT_POS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_POS,
+ VehicleProperty.SEAT_HEADREST_HEIGHT_POS,
CarCabinManager.ID_SEAT_HEADREST_HEIGHT_MOVE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_MOVE,
+ VehicleProperty.SEAT_HEADREST_HEIGHT_MOVE,
CarCabinManager.ID_SEAT_HEADREST_ANGLE_POS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_POS,
+ VehicleProperty.SEAT_HEADREST_ANGLE_POS,
CarCabinManager.ID_SEAT_HEADREST_ANGLE_MOVE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_MOVE,
+ VehicleProperty.SEAT_HEADREST_ANGLE_MOVE,
CarCabinManager.ID_SEAT_HEADREST_FORE_AFT_POS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_POS,
+ VehicleProperty.SEAT_HEADREST_FORE_AFT_POS,
CarCabinManager.ID_SEAT_HEADREST_FORE_AFT_MOVE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_MOVE,
+ VehicleProperty.SEAT_HEADREST_FORE_AFT_MOVE,
CarCabinManager.ID_WINDOW_POS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_WINDOW_POS,
+ VehicleProperty.WINDOW_POS,
CarCabinManager.ID_WINDOW_MOVE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_WINDOW_MOVE,
+ VehicleProperty.WINDOW_MOVE,
CarCabinManager.ID_WINDOW_VENT_POS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_WINDOW_VENT_POS,
+ VehicleProperty.WINDOW_VENT_POS,
CarCabinManager.ID_WINDOW_VENT_MOVE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_WINDOW_VENT_MOVE,
+ VehicleProperty.WINDOW_VENT_MOVE,
CarCabinManager.ID_WINDOW_LOCK,
- VehicleNetworkConsts.VEHICLE_PROPERTY_WINDOW_LOCK
+ VehicleProperty.WINDOW_LOCK
});
public CabinHalService(VehicleHal vehicleHal) {
diff --git a/service/src/com/android/car/hal/CarPropertyUtils.java b/service/src/com/android/car/hal/CarPropertyUtils.java
index c584f31..00cde28 100644
--- a/service/src/com/android/car/hal/CarPropertyUtils.java
+++ b/service/src/com/android/car/hal/CarPropertyUtils.java
@@ -15,46 +15,20 @@
*/
package com.android.car.hal;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_BYTES;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC2;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC3;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC4;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_INT32;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC3;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_STRING;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZoneType.VEHICLE_ZONE_TYPE_NONE;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZoneType.VEHICLE_ZONE_TYPE_ZONE;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZoneType.VEHICLE_ZONE_TYPE_DOOR;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZoneType.VEHICLE_ZONE_TYPE_WINDOW;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZoneType.VEHICLE_ZONE_TYPE_MIRROR;
-import static com.android.car.vehiclenetwork.VehiclePropValueUtil.getVectorValueType;
+import static com.android.car.CarServiceUtils.toByteArray;
import static java.lang.Integer.toHexString;
import android.car.VehicleAreaType;
import android.car.VehicleZoneUtil;
import android.car.hardware.CarPropertyConfig;
import android.car.hardware.CarPropertyValue;
+import android.hardware.vehicle.V2_0.VehicleArea;
+import android.hardware.vehicle.V2_0.VehicleAreaConfig;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehiclePropertyType;
-import com.google.protobuf.ByteString;
-
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-
+import java.util.Collections;
import java.util.List;
/**
@@ -68,168 +42,136 @@
/** Converts {@link VehiclePropValue} to {@link CarPropertyValue} */
static CarPropertyValue<?> toCarPropertyValue(
VehiclePropValue halValue, int propertyId) {
- Class<?> clazz = getJavaClass(halValue.getValueType());
- int areaId = halValue.getZone();
+ Class<?> clazz = getJavaClass(halValue.prop & VehiclePropertyType.MASK);
+ int areaId = halValue.areaId;
+ VehiclePropValue.RawValue v = halValue.value;
+
if (Boolean.class == clazz) {
- return new CarPropertyValue<>(propertyId, areaId, halValue.getInt32Values(0) == 1);
+ return new CarPropertyValue<>(propertyId, areaId, v.int32Values.get(0) == 1);
} else if (String.class == clazz) {
- return new CarPropertyValue<>(propertyId, areaId, halValue.getStringValue());
+ return new CarPropertyValue<>(propertyId, areaId, v.stringValue);
} else if (Long.class == clazz) {
- return new CarPropertyValue<>(propertyId, areaId, halValue.getInt64Value());
+ return new CarPropertyValue<>(propertyId, areaId, v.int64Values.get(0));
} else if (byte[].class == clazz) {
- byte[] halData = halValue.getBytesValue().toByteArray();
+ byte[] halData = toByteArray(v.bytes);
return new CarPropertyValue<>(propertyId, areaId, halData);
} else /* All list properties */ {
- Object[] values = getRawValueList(clazz, halValue).toArray();
+ Object[] values = getRawValueList(clazz, v).toArray();
return new CarPropertyValue<>(propertyId, areaId,
values.length == 1 ? values[0] : values);
}
}
/** Converts {@link CarPropertyValue} to {@link VehiclePropValue} */
- static VehiclePropValue toVehiclePropValue(CarPropertyValue hvacProp, int halPropId) {
- VehiclePropValue.Builder builder = VehiclePropValue.newBuilder();
- builder.setProp(halPropId);
+ static VehiclePropValue toVehiclePropValue(CarPropertyValue carProp, int halPropId) {
+ VehiclePropValue vehicleProp = new VehiclePropValue();
+ vehicleProp.prop = halPropId;
+ vehicleProp.areaId = carProp.getAreaId();
+ VehiclePropValue.RawValue v = vehicleProp.value;
- if (hvacProp.getAreaId() != 0) {
- builder.setZone(hvacProp.getAreaId());
- }
+ Object o = carProp.getValue();
- Object o = hvacProp.getValue();
-
- boolean hasArea = hvacProp.getAreaId() != 0;
- int vectorLength = (o instanceof Object[] ? ((Object[]) o).length : 0);
- int halType;
if (o instanceof Boolean) {
- halType = hasArea ? VEHICLE_VALUE_TYPE_ZONED_BOOLEAN : VEHICLE_VALUE_TYPE_BOOLEAN;
- builder.addInt32Values(((Boolean )o) ? 1 : 0);
+ v.int32Values.add(((Boolean )o) ? 1 : 0);
} else if (o instanceof Integer) {
- halType = hasArea ? VEHICLE_VALUE_TYPE_ZONED_INT32 : VEHICLE_VALUE_TYPE_INT32;
- builder.addInt32Values((Integer) o);
+ v.int32Values.add((Integer) o);
} else if (o instanceof Float) {
- halType = hasArea ? VEHICLE_VALUE_TYPE_ZONED_FLOAT : VEHICLE_VALUE_TYPE_FLOAT;
- builder.addFloatValues((Float) o);
+ v.floatValues.add((Float) o);
} else if (o instanceof Integer[]) {
- halType = getVectorValueType(
- hasArea ? VEHICLE_VALUE_TYPE_ZONED_INT32 : VEHICLE_VALUE_TYPE_ZONED_INT32,
- vectorLength);
- for (Integer i : (Integer[]) o) {
- builder.addInt32Values(i);
- }
+ Collections.addAll(v.int32Values, (Integer[]) o);
} else if (o instanceof Float[]) {
- halType = getVectorValueType(
- hasArea ? VEHICLE_VALUE_TYPE_ZONED_FLOAT : VEHICLE_VALUE_TYPE_ZONED_FLOAT,
- vectorLength);
- for (Float f : (Float[]) o) {
- builder.addFloatValues(f);
- }
+ Collections.addAll(v.floatValues, (Float[]) o);
} else if (o instanceof String) {
- halType = VEHICLE_VALUE_TYPE_STRING;
- builder.setStringValue((String) o);
+ v.stringValue = (String) o;
} else if (o instanceof byte[]) {
- halType = VEHICLE_VALUE_TYPE_BYTES; // We don't have zoned type in vehicle.h
- builder.setBytesValue(ByteString.copyFrom((byte[]) o));
+ for (byte b : (byte[]) o) {
+ v.bytes.add(b);
+ }
} else {
- throw new IllegalArgumentException("Unexpected type in: " + hvacProp);
+ throw new IllegalArgumentException("Unexpected type in: " + carProp);
}
- builder.setValueType(halType);
- return builder.build();
+
+ return vehicleProp;
}
/**
* Converts {@link VehiclePropConfig} to {@link CarPropertyConfig}.
*/
static CarPropertyConfig<?> toCarPropertyConfig(VehiclePropConfig p, int propertyId) {
- int[] areas = VehicleZoneUtil.listAllZones(p.getZones());
+ int[] areas = VehicleZoneUtil.listAllZones(p.supportedAreas);
- int areaType = getVehicleAreaType(VehicleNetworkConsts.getVehicleZoneType(p.getProp()));
+ int areaType = getVehicleAreaType(p.prop & VehicleArea.MASK);
- Class<?> clazz = getJavaClass(p.getValueType());
+ Class<?> clazz = getJavaClass(p.prop & VehiclePropertyType.MASK);
if (clazz == Boolean.class || clazz == byte[].class || clazz == String.class) {
return CarPropertyConfig
.newBuilder(clazz, propertyId, areaType, /* capacity */ 1)
.addAreas(areas)
.build();
} else {
- List mins;
- List maxs;
- if (classMatched(Integer.class, clazz)) {
- mins = p.getInt32MinsList();
- maxs = p.getInt32MaxsList();
- } else if (classMatched(Float.class, clazz)) {
- mins = p.getFloatMinsList();
- maxs = p.getFloatMaxsList();
- } else {
- throw new IllegalArgumentException("Unexpected type: " + clazz);
- }
CarPropertyConfig.Builder builder = CarPropertyConfig
- .newBuilder(clazz, propertyId, areaType, /* capacity */ mins.size());
- for (int i = 0; i < mins.size(); i++) {
- int areaId = areas.length == 0 ? 0 : areas[i];
- builder.addAreaConfig(areaId, mins.get(i), maxs.get(i));
+ .newBuilder(clazz, propertyId, areaType, /* capacity */ p.areaConfigs.size());
+
+ for (VehicleAreaConfig area : p.areaConfigs) {
+ if (classMatched(Integer.class, clazz)) {
+ builder.addAreaConfig(area.areaId, area.minInt32Value, area.maxInt32Value);
+ } else if (classMatched(Float.class, clazz)) {
+ builder.addAreaConfig(area.areaId, area.minFloatValue, area.maxFloatValue);
+ } else if (classMatched(Long.class, clazz)) {
+ builder.addAreaConfig(area.areaId, area.minInt64Value, area.maxInt64Value);
+ } else {
+ throw new IllegalArgumentException("Unexpected type: " + clazz);
+ }
}
return builder.build();
}
}
- private static @VehicleAreaType.VehicleAreaTypeValue int getVehicleAreaType(int zoneType) {
- switch (zoneType) {
- case VEHICLE_ZONE_TYPE_NONE:
+ private static @VehicleAreaType.VehicleAreaTypeValue int getVehicleAreaType(int halArea) {
+ switch (halArea) {
+ case VehicleArea.GLOBAL:
return VehicleAreaType.VEHICLE_AREA_TYPE_NONE;
- case VEHICLE_ZONE_TYPE_ZONE:
+ case VehicleArea.ZONE:
return VehicleAreaType.VEHICLE_AREA_TYPE_ZONE;
- case VEHICLE_ZONE_TYPE_SEAT:
+ case VehicleArea.SEAT:
return VehicleAreaType.VEHICLE_AREA_TYPE_SEAT;
- case VEHICLE_ZONE_TYPE_DOOR:
+ case VehicleArea.DOOR:
return VehicleAreaType.VEHICLE_AREA_TYPE_DOOR;
- case VEHICLE_ZONE_TYPE_WINDOW:
+ case VehicleArea.WINDOW:
return VehicleAreaType.VEHICLE_AREA_TYPE_WINDOW;
- case VEHICLE_ZONE_TYPE_MIRROR:
+ case VehicleArea.MIRROR:
return VehicleAreaType.VEHICLE_AREA_TYPE_MIRROR;
default:
- throw new RuntimeException("Unsupported zone type " + zoneType);
+ throw new RuntimeException("Unsupported area type " + halArea);
}
}
private static Class<?> getJavaClass(int halType) {
switch (halType) {
- case VEHICLE_VALUE_TYPE_BOOLEAN:
- case VEHICLE_VALUE_TYPE_ZONED_BOOLEAN:
+ case VehiclePropertyType.BOOLEAN:
return Boolean.class;
- case VEHICLE_VALUE_TYPE_FLOAT:
- case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
+ case VehiclePropertyType.FLOAT:
return Float.class;
- case VEHICLE_VALUE_TYPE_INT32:
- case VEHICLE_VALUE_TYPE_ZONED_INT32:
+ case VehiclePropertyType.INT32:
return Integer.class;
- case VEHICLE_VALUE_TYPE_INT32_VEC2:
- case VEHICLE_VALUE_TYPE_INT32_VEC3:
- case VEHICLE_VALUE_TYPE_INT32_VEC4:
- case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
- case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
- case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4:
+ case VehiclePropertyType.INT32_VEC:
return Integer[].class;
- case VEHICLE_VALUE_TYPE_FLOAT_VEC2:
- case VEHICLE_VALUE_TYPE_FLOAT_VEC3:
- case VEHICLE_VALUE_TYPE_FLOAT_VEC4:
- case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
- case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
- case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4:
+ case VehiclePropertyType.FLOAT_VEC:
return Float[].class;
- case VEHICLE_VALUE_TYPE_STRING:
+ case VehiclePropertyType.STRING:
return String.class;
- case VEHICLE_VALUE_TYPE_BYTES:
+ case VehiclePropertyType.BYTES:
return byte[].class;
default:
throw new IllegalArgumentException("Unexpected type: " + toHexString(halType));
}
}
- private static List getRawValueList(Class<?> clazz, VehiclePropValue vehiclePropValue) {
+ private static List getRawValueList(Class<?> clazz, VehiclePropValue.RawValue value) {
if (classMatched(Float.class, clazz)) {
- return vehiclePropValue.getFloatValuesList();
+ return value.floatValues;
} else if (classMatched(Integer.class, clazz)) {
- return vehiclePropValue.getInt32ValuesList();
+ return value.int32Values;
} else {
throw new IllegalArgumentException("Unexpected type: " + clazz);
}
diff --git a/service/src/com/android/car/hal/HalClient.java b/service/src/com/android/car/hal/HalClient.java
new file mode 100644
index 0000000..ee5e593
--- /dev/null
+++ b/service/src/com/android/car/hal/HalClient.java
@@ -0,0 +1,261 @@
+/*
+ * Copyright (C) 2016 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 com.android.car.hal;
+
+import static android.os.SystemClock.elapsedRealtime;
+
+import android.hardware.vehicle.V2_0.IVehicle;
+import android.hardware.vehicle.V2_0.IVehicle.getCallback;
+import android.hardware.vehicle.V2_0.IVehicleCallback;
+import android.hardware.vehicle.V2_0.StatusCode;
+import android.hardware.vehicle.V2_0.SubscribeFlags;
+import android.hardware.vehicle.V2_0.SubscribeOptions;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.os.Handler;
+import android.os.IHwBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.util.Log;
+
+import com.android.car.CarLog;
+
+import java.util.ArrayList;
+
+/**
+ * Vehicle HAL client. Interacts directly with Vehicle HAL interface {@link IVehicle}. Contains
+ * some logic for retriable properties, redirects Vehicle notifications into given looper thread.
+ */
+class HalClient {
+ /**
+ * If call to vehicle HAL returns StatusCode.TRY_AGAIN, than {@link HalClient} will retry to
+ * invoke that method again for this amount of milliseconds.
+ */
+ private static final int WAIT_CAP_FOR_RETRIABLE_RESULT_MS = 2000;
+
+ private static final int SLEEP_BETWEEN_RETRIABLE_INVOKES_MS = 50;
+
+ private final IVehicle mVehicle;
+
+ private final IVehicleCallback mInternalCallback;
+
+ /**
+ * Create HalClient object
+ *
+ * @param vehicle interface to the vehicle HAL
+ * @param looper looper that will be used to propagate notifications from vehicle HAL
+ * @param callback to propagate notifications from Vehicle HAL in the provided looper thread
+ */
+ HalClient(IVehicle vehicle, Looper looper, IVehicleCallback callback) {
+ mVehicle = vehicle;
+ Handler handler = new CallbackHandler(looper, callback);
+ mInternalCallback = new VehicleCallback(handler);
+ }
+
+ ArrayList<VehiclePropConfig> getAllPropConfigs() {
+ return mVehicle.getAllPropConfigs();
+ }
+
+ public void subscribe(int prop, float sampleRateHz) {
+ SubscribeOptions opt = new SubscribeOptions();
+ opt.propId = prop;
+ opt.sampleRate = sampleRateHz;
+ opt.flags = SubscribeFlags.HAL_EVENT;
+ ArrayList<SubscribeOptions> options = new ArrayList<>(1);
+ options.add(opt);
+ mVehicle.subscribe(mInternalCallback, options);
+ }
+
+ public void unsubscribe(int prop) {
+ mVehicle.unsubscribe(mInternalCallback, prop);
+ }
+
+ public void setValue(VehiclePropValue propValue) throws PropertyTimeoutException {
+ int status = invokeRetriable(() -> mVehicle.set(propValue),
+ WAIT_CAP_FOR_RETRIABLE_RESULT_MS, SLEEP_BETWEEN_RETRIABLE_INVOKES_MS);
+
+ if (StatusCode.INVALID_ARG == status) {
+ throw new IllegalArgumentException(
+ String.format("Failed to set value for: 0x%x, areaId: 0x%x",
+ propValue.prop, propValue.areaId));
+ }
+
+ if (StatusCode.TRY_AGAIN == status) {
+ throw new PropertyTimeoutException(propValue.prop);
+ }
+
+ if (StatusCode.OK != status) {
+ throw new IllegalStateException(
+ String.format("Failed to set property: 0x%x, areaId: 0x%x, "
+ + "code: %d", propValue.prop, propValue.areaId, status));
+ }
+ }
+
+ VehiclePropValue getValue(VehiclePropValue requestedPropValue) throws PropertyTimeoutException {
+ final ObjectWrapper<VehiclePropValue> valueWrapper = new ObjectWrapper<>();
+ int status = invokeRetriable(() -> {
+ ValueResult res = internalGet(requestedPropValue);
+ valueWrapper.object = res.propValue;
+ return res.status;
+ }, WAIT_CAP_FOR_RETRIABLE_RESULT_MS, SLEEP_BETWEEN_RETRIABLE_INVOKES_MS);
+
+ int propId = requestedPropValue.prop;
+ int areaId = requestedPropValue.areaId;
+ if (StatusCode.INVALID_ARG == status) {
+ throw new IllegalArgumentException(
+ String.format("Failed to get value for: 0x%x, areaId: 0x%x", propId, areaId));
+ }
+
+ if (StatusCode.TRY_AGAIN == status) {
+ throw new PropertyTimeoutException(propId);
+ }
+
+ if (StatusCode.OK != status || valueWrapper.object == null) {
+ throw new IllegalStateException(
+ String.format("Failed to get property: 0x%x, areaId: 0x%x, "
+ + "code: %d", propId, areaId, status));
+ }
+
+ return valueWrapper.object;
+ }
+
+ private ValueResult internalGet(VehiclePropValue requestedPropValue) {
+ final ValueResult result = new ValueResult();
+ mVehicle.get(requestedPropValue,
+ new getCallback() {
+ @Override
+ public void onValues(int status, VehiclePropValue propValue) {
+ result.status = status;
+ result.propValue = propValue;
+ }
+ });
+
+ return result;
+ }
+
+ interface RetriableCallback {
+ /** Returns {@link StatusCode} */
+ int action();
+ }
+
+ private static int invokeRetriable(RetriableCallback callback, long timeoutMs, long sleepMs) {
+ int status = callback.action();
+ long startTime = elapsedRealtime();
+ while (StatusCode.TRY_AGAIN == status && (elapsedRealtime() - startTime) < timeoutMs) {
+ try {
+ Thread.sleep(sleepMs);
+ } catch (InterruptedException e) {
+ Log.e(CarLog.TAG_HAL, "Thread was interrupted while waiting for vehicle HAL.", e);
+ break;
+ }
+
+ status = callback.action();
+ }
+ return status;
+ }
+
+ private static class ObjectWrapper<T> {
+ T object;
+ }
+
+ private static class ValueResult {
+ int status;
+ VehiclePropValue propValue;
+ }
+
+ private static class PropertySetError {
+ final int errorCode;
+ final int propId;
+ final int areaId;
+
+ PropertySetError(int errorCode, int propId, int areaId) {
+ this.errorCode = errorCode;
+ this.propId = propId;
+ this.areaId = areaId;
+ }
+ }
+
+ private static class CallbackHandler extends Handler {
+ private static final int MSG_ON_PROPERTY_SET = 1;
+ private static final int MSG_ON_PROPERTY_EVENT = 2;
+ private static final int MSG_ON_SET_ERROR = 3;
+
+ private final IVehicleCallback mCallback;
+
+ CallbackHandler(Looper looper, IVehicleCallback callback) {
+ super(looper);
+ mCallback = callback;
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+
+ switch (msg.what) {
+ case MSG_ON_PROPERTY_EVENT:
+ mCallback.onPropertyEvent((ArrayList<VehiclePropValue>) msg.obj);
+ break;
+ case MSG_ON_PROPERTY_SET:
+ mCallback.onPropertySet((VehiclePropValue) msg.obj);
+ break;
+ case MSG_ON_SET_ERROR:
+ PropertySetError obj = (PropertySetError) msg.obj;
+ mCallback.onPropertySetError(obj.errorCode, obj.propId, obj.areaId);
+ break;
+ default:
+ Log.e(CarLog.TAG_HAL, "Unexpected message: " + msg.what);
+ }
+ }
+ }
+
+ private static class VehicleCallback implements IVehicleCallback {
+ private Handler mHandler;
+
+ VehicleCallback(Handler handler) {
+ mHandler = handler;
+ }
+
+ @Override
+ public IHwBinder asBinder() {
+ return null;
+ }
+
+ @Override
+ public void onPropertyEvent(ArrayList<VehiclePropValue> propValues) {
+ mHandler.sendMessage(Message.obtain(
+ mHandler, CallbackHandler.MSG_ON_PROPERTY_EVENT, propValues));
+ }
+
+ @Override
+ public void onPropertySet(VehiclePropValue propValue) {
+ mHandler.sendMessage(Message.obtain(
+ mHandler, CallbackHandler.MSG_ON_PROPERTY_SET, propValue));
+ }
+
+ @Override
+ public void onPropertySetError(int errorCode, int propId, int areaId) {
+ mHandler.sendMessage(Message.obtain(
+ mHandler, CallbackHandler.MSG_ON_SET_ERROR,
+ new PropertySetError(errorCode, propId, areaId)));
+ }
+
+ @Override
+ public ArrayList<String> interfaceChain() {
+ return null;
+ }
+ }
+}
diff --git a/service/src/com/android/car/hal/HalServiceBase.java b/service/src/com/android/car/hal/HalServiceBase.java
index 3a801fd..30115ae 100644
--- a/service/src/com/android/car/hal/HalServiceBase.java
+++ b/service/src/com/android/car/hal/HalServiceBase.java
@@ -16,10 +16,13 @@
package com.android.car.hal;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
+
+import android.annotation.Nullable;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
import java.io.PrintWriter;
+import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
@@ -51,8 +54,11 @@
* @param allProperties
* @return null if no properties are supported.
*/
- public abstract List<VehiclePropConfig> takeSupportedProperties(
- List<VehiclePropConfig> allProperties);
+ @Nullable
+ public Collection<VehiclePropConfig> takeSupportedProperties(
+ Collection<VehiclePropConfig> allProperties) {
+ return null;
+ }
public abstract void handleHalEvents(List<VehiclePropValue> values);
diff --git a/service/src/com/android/car/hal/HvacHalService.java b/service/src/com/android/car/hal/HvacHalService.java
index b6996bf..77b5364 100644
--- a/service/src/com/android/car/hal/HvacHalService.java
+++ b/service/src/com/android/car/hal/HvacHalService.java
@@ -16,70 +16,51 @@
package com.android.car.hal;
import android.car.hardware.hvac.CarHvacManager;
-
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
+import android.hardware.vehicle.V2_0.VehicleProperty;
public class HvacHalService extends PropertyHalServiceBase {
private static final boolean DBG = false;
private static final String TAG = "HvacHalService";
private final ManagerToHalPropIdMap mMgrHalPropIdMap = ManagerToHalPropIdMap.create(new int[] {
- CarHvacManager.ID_MIRROR_DEFROSTER_ON,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_SIDE_MIRROR_HEAT,
+ CarHvacManager.ID_MIRROR_DEFROSTER_ON, VehicleProperty.HVAC_SIDE_MIRROR_HEAT,
- CarHvacManager.ID_STEERING_WHEEL_TEMP,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_STEERING_WHEEL_TEMP,
+ CarHvacManager.ID_STEERING_WHEEL_TEMP, VehicleProperty.HVAC_STEERING_WHEEL_TEMP,
- CarHvacManager.ID_OUTSIDE_AIR_TEMP,
- VehicleNetworkConsts.VEHICLE_PROPERTY_ENV_OUTSIDE_TEMPERATURE,
+ CarHvacManager.ID_OUTSIDE_AIR_TEMP, VehicleProperty.ENV_OUTSIDE_TEMPERATURE,
- CarHvacManager.ID_TEMPERATURE_UNITS,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_UNITS,
+ CarHvacManager.ID_TEMPERATURE_UNITS, VehicleProperty.HVAC_TEMPERATURE_UNITS,
- CarHvacManager.ID_ZONED_TEMP_SETPOINT,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET,
+ CarHvacManager.ID_ZONED_TEMP_SETPOINT, VehicleProperty.HVAC_TEMPERATURE_SET,
- CarHvacManager.ID_ZONED_TEMP_ACTUAL,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT,
+ CarHvacManager.ID_ZONED_TEMP_ACTUAL, VehicleProperty.HVAC_TEMPERATURE_CURRENT,
- CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_SPEED,
+ CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT, VehicleProperty.HVAC_FAN_SPEED,
- CarHvacManager.ID_ZONED_FAN_SPEED_RPM,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_ACTUAL_FAN_SPEED_RPM,
+ CarHvacManager.ID_ZONED_FAN_SPEED_RPM, VehicleProperty.HVAC_ACTUAL_FAN_SPEED_RPM,
CarHvacManager.ID_ZONED_FAN_POSITION_AVAILABLE,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_DIRECTION_AVAILABLE,
+ VehicleProperty.HVAC_FAN_DIRECTION_AVAILABLE,
- CarHvacManager.ID_ZONED_FAN_POSITION,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_DIRECTION,
+ CarHvacManager.ID_ZONED_FAN_POSITION, VehicleProperty.HVAC_FAN_DIRECTION,
- CarHvacManager.ID_ZONED_SEAT_TEMP,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_SEAT_TEMPERATURE,
+ CarHvacManager.ID_ZONED_SEAT_TEMP, VehicleProperty.HVAC_SEAT_TEMPERATURE,
- CarHvacManager.ID_ZONED_AC_ON,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_AC_ON,
+ CarHvacManager.ID_ZONED_AC_ON, VehicleProperty.HVAC_AC_ON,
- CarHvacManager.ID_ZONED_AUTOMATIC_MODE_ON,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_AUTO_ON,
+ CarHvacManager.ID_ZONED_AUTOMATIC_MODE_ON, VehicleProperty.HVAC_AUTO_ON,
- CarHvacManager.ID_ZONED_AIR_RECIRCULATION_ON,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_RECIRC_ON,
+ CarHvacManager.ID_ZONED_AIR_RECIRCULATION_ON,VehicleProperty.HVAC_RECIRC_ON,
- CarHvacManager.ID_ZONED_MAX_AC_ON,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_MAX_AC_ON,
+ CarHvacManager.ID_ZONED_MAX_AC_ON, VehicleProperty.HVAC_MAX_AC_ON,
- CarHvacManager.ID_ZONED_DUAL_ZONE_ON,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_DUAL_ON,
+ CarHvacManager.ID_ZONED_DUAL_ZONE_ON, VehicleProperty.HVAC_DUAL_ON,
- CarHvacManager.ID_ZONED_MAX_DEFROST_ON,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_MAX_DEFROST_ON,
+ CarHvacManager.ID_ZONED_MAX_DEFROST_ON, VehicleProperty.HVAC_MAX_DEFROST_ON,
- CarHvacManager.ID_ZONED_HVAC_POWER_ON,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_POWER_ON,
+ CarHvacManager.ID_ZONED_HVAC_POWER_ON, VehicleProperty.HVAC_POWER_ON,
- CarHvacManager.ID_WINDOW_DEFROSTER_ON,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_DEFROSTER
+ CarHvacManager.ID_WINDOW_DEFROSTER_ON, VehicleProperty.HVAC_DEFROSTER
});
public HvacHalService(VehicleHal vehicleHal) {
diff --git a/service/src/com/android/car/hal/InfoHalService.java b/service/src/com/android/car/hal/InfoHalService.java
index 490779b..56e3b08 100644
--- a/service/src/com/android/car/hal/InfoHalService.java
+++ b/service/src/com/android/car/hal/InfoHalService.java
@@ -16,17 +16,16 @@
package com.android.car.hal;
import android.car.CarInfoManager;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
import android.os.Bundle;
import android.util.Log;
import com.android.car.CarLog;
-import com.android.car.vehiclenetwork.VehicleNetwork;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
import java.io.PrintWriter;
-import java.util.HashMap;
+import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
@@ -50,23 +49,19 @@
}
@Override
- public synchronized List<VehiclePropConfig> takeSupportedProperties(
- List<VehiclePropConfig> allProperties) {
- VehicleNetwork vn = mHal.getVehicleNetwork();
- List<VehiclePropConfig> supported = new LinkedList<VehiclePropConfig>();
+ public synchronized Collection<VehiclePropConfig> takeSupportedProperties(
+ Collection<VehiclePropConfig> allProperties) {
+ List<VehiclePropConfig> supported = new LinkedList<>();
for (VehiclePropConfig p: allProperties) {
- switch (p.getProp()) {
- case VehicleNetworkConsts.VEHICLE_PROPERTY_INFO_MAKE:
- mBasicInfo.putString(CarInfoManager.BASIC_INFO_KEY_MANUFACTURER,
- vn.getStringProperty(p.getProp()));
+ switch (p.prop) {
+ case VehicleProperty.INFO_MAKE:
+ readPropertyToBundle(p.prop, CarInfoManager.BASIC_INFO_KEY_MANUFACTURER);
break;
- case VehicleNetworkConsts.VEHICLE_PROPERTY_INFO_MODEL:
- mBasicInfo.putString(CarInfoManager.BASIC_INFO_KEY_MODEL,
- vn.getStringProperty(p.getProp()));
+ case VehicleProperty.INFO_MODEL:
+ readPropertyToBundle(p.prop, CarInfoManager.BASIC_INFO_KEY_MODEL);
break;
- case VehicleNetworkConsts.VEHICLE_PROPERTY_INFO_MODEL_YEAR:
- mBasicInfo.putString(CarInfoManager.BASIC_INFO_KEY_MODEL_YEAR,
- vn.getStringProperty(p.getProp()));
+ case VehicleProperty.INFO_MODEL_YEAR:
+ readPropertyToBundle(p.prop, CarInfoManager.BASIC_INFO_KEY_MODEL_YEAR);
break;
default: // not supported
break;
@@ -75,10 +70,20 @@
return supported;
}
+ private void readPropertyToBundle(int prop, String key) {
+ String value = "";
+ try {
+ value = mHal.get(String.class, prop);
+ } catch (PropertyTimeoutException e) {
+ Log.e(CarLog.TAG_INFO, "Unable to read property", e);
+ }
+ mBasicInfo.putString(key, value);
+ }
+
@Override
public void handleHalEvents(List<VehiclePropValue> values) {
for (VehiclePropValue v : values) {
- logUnexpectedEvent(v.getProp());
+ logUnexpectedEvent(v.prop);
}
}
diff --git a/service/src/com/android/car/hal/InputHalService.java b/service/src/com/android/car/hal/InputHalService.java
index 41a4b87..6d6521f 100644
--- a/service/src/com/android/car/hal/InputHalService.java
+++ b/service/src/com/android/car/hal/InputHalService.java
@@ -15,6 +15,12 @@
*/
package com.android.car.hal;
+import static android.hardware.vehicle.V2_0.VehicleProperty.HW_KEY_INPUT;
+
+import android.hardware.vehicle.V2_0.VehicleDisplay;
+import android.hardware.vehicle.V2_0.VehicleHwKeyInputAction;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
import android.os.SystemClock;
import android.util.Log;
import android.util.SparseLongArray;
@@ -22,21 +28,17 @@
import android.view.KeyEvent;
import com.android.car.CarLog;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleDisplay;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleHwKeyInputAction;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
import java.io.PrintWriter;
+import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
public class InputHalService extends HalServiceBase {
- public static final int DISPLAY_MAIN = VehicleDisplay.VEHICLE_DISPLAY_MAIN;
- public static final int DISPLAY_INSTRUMENT_CLUSTER =
- VehicleDisplay.VEHICLE_DISPLAY_INSTRUMENT_CLUSTER;
+ public static final int DISPLAY_MAIN = VehicleDisplay.MAIN;
+ public static final int DISPLAY_INSTRUMENT_CLUSTER = VehicleDisplay.INSTRUMENT_CLUSTER;
+ private final VehicleHal mHal;
public interface InputListener {
void onKeyEvent(KeyEvent event, int targetDisplay);
@@ -48,6 +50,10 @@
private InputListener mListener;
private final SparseLongArray mKeyDownTimes = new SparseLongArray();
+ public InputHalService(VehicleHal hal) {
+ mHal = hal;
+ }
+
public void setInputListener(InputListener listener) {
synchronized (this) {
if (!mKeyInputSupported) {
@@ -56,8 +62,7 @@
}
mListener = listener;
}
- VehicleHal.getInstance().subscribeProperty(this,
- VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT, 0);
+ mHal.subscribeProperty(this, HW_KEY_INPUT, 0);
}
public synchronized boolean isKeyInputSupported() {
@@ -77,10 +82,11 @@
}
@Override
- public List<VehiclePropConfig> takeSupportedProperties(List<VehiclePropConfig> allProperties) {
- List<VehiclePropConfig> supported = new LinkedList<VehiclePropConfig>();
+ public Collection<VehiclePropConfig> takeSupportedProperties(
+ Collection<VehiclePropConfig> allProperties) {
+ List<VehiclePropConfig> supported = new LinkedList<>();
for (VehiclePropConfig p: allProperties) {
- if (p.getProp() == VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT) {
+ if (p.prop == HW_KEY_INPUT) {
supported.add(p);
synchronized (this) {
mKeyInputSupported = true;
@@ -92,7 +98,7 @@
@Override
public void handleHalEvents(List<VehiclePropValue> values) {
- InputListener listener = null;
+ InputListener listener;
synchronized (this) {
listener = mListener;
}
@@ -101,19 +107,18 @@
return;
}
for (VehiclePropValue v : values) {
- if (v.getProp() != VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT) {
+ if (v.prop != HW_KEY_INPUT) {
Log.e(CarLog.TAG_INPUT, "Wrong event dispatched, prop:0x" +
- Integer.toHexString(v.getProp()));
+ Integer.toHexString(v.prop));
continue;
}
- int action = (v.getInt32Values(0) ==
- VehicleHwKeyInputAction.VEHICLE_HW_KEY_INPUT_ACTION_DOWN) ?
+ int action = (v.value.int32Values.get(0) == VehicleHwKeyInputAction.ACTION_DOWN) ?
KeyEvent.ACTION_DOWN : KeyEvent.ACTION_UP;
- int code = v.getInt32Values(1);
- int display = v.getInt32Values(2);
+ int code = v.value.int32Values.get(1);
+ int display = v.value.int32Values.get(2);
if (DBG) {
- Log.i(CarLog.TAG_INPUT, "hal event code:" + code + ",action:" + action +
- ",display:" + display);
+ Log.i(CarLog.TAG_INPUT, "hal event code:" + code + ", action:" + action +
+ ", display:" + display);
}
dispatchKeyEvent(listener, action, code, display);
diff --git a/service/src/com/android/car/hal/PowerHalService.java b/service/src/com/android/car/hal/PowerHalService.java
index 580e7a7..ff43cfc 100644
--- a/service/src/com/android/car/hal/PowerHalService.java
+++ b/service/src/com/android/car/hal/PowerHalService.java
@@ -15,69 +15,64 @@
*/
package com.android.car.hal;
-import android.os.ServiceSpecificException;
+import static android.hardware.vehicle.V2_0.VehicleProperty.AP_POWER_STATE;
+import static android.hardware.vehicle.V2_0.VehicleProperty.DISPLAY_BRIGHTNESS;
+
+import android.annotation.Nullable;
+import android.hardware.vehicle.V2_0.VehicleApPowerSetState;
+import android.hardware.vehicle.V2_0.VehicleApPowerState;
+import android.hardware.vehicle.V2_0.VehicleApPowerStateConfigFlag;
+import android.hardware.vehicle.V2_0.VehicleApPowerStateIndex;
+import android.hardware.vehicle.V2_0.VehicleApPowerStateShutdownParam;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
import android.util.Log;
import com.android.car.CarLog;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleApPowerSetState;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleApPowerState;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleApPowerStateConfigFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleApPowerStateIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleApPowerStateShutdownParam;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
import com.android.internal.annotations.VisibleForTesting;
import java.io.PrintWriter;
+import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
public class PowerHalService extends HalServiceBase {
- public static final int STATE_OFF = VehicleApPowerState.VEHICLE_AP_POWER_STATE_OFF;
- public static final int STATE_DEEP_SLEEP =
- VehicleApPowerState.VEHICLE_AP_POWER_STATE_DEEP_SLEEP;
- public static final int STATE_ON_DISP_OFF =
- VehicleApPowerState.VEHICLE_AP_POWER_STATE_ON_DISP_OFF;
- public static final int STATE_ON_FULL = VehicleApPowerState.VEHICLE_AP_POWER_STATE_ON_FULL;
- public static final int STATE_SHUTDOWN_PREPARE =
- VehicleApPowerState.VEHICLE_AP_POWER_STATE_SHUTDOWN_PREPARE;
+ public static final int STATE_OFF = VehicleApPowerState.OFF;
+ public static final int STATE_DEEP_SLEEP = VehicleApPowerState.DEEP_SLEEP;
+ public static final int STATE_ON_DISP_OFF = VehicleApPowerState.ON_DISP_OFF;
+ public static final int STATE_ON_FULL = VehicleApPowerState.ON_FULL;
+ public static final int STATE_SHUTDOWN_PREPARE = VehicleApPowerState.SHUTDOWN_PREPARE;
@VisibleForTesting
- public static final int SET_BOOT_COMPLETE =
- VehicleApPowerSetState.VEHICLE_AP_POWER_SET_BOOT_COMPLETE;
+ public static final int SET_BOOT_COMPLETE = VehicleApPowerSetState.BOOT_COMPLETE;
@VisibleForTesting
- public static final int SET_DEEP_SLEEP_ENTRY =
- VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DEEP_SLEEP_ENTRY;
+ public static final int SET_DEEP_SLEEP_ENTRY = VehicleApPowerSetState.DEEP_SLEEP_ENTRY;
@VisibleForTesting
- public static final int SET_DEEP_SLEEP_EXIT =
- VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DEEP_SLEEP_EXIT;
+ public static final int SET_DEEP_SLEEP_EXIT = VehicleApPowerSetState.DEEP_SLEEP_EXIT;
@VisibleForTesting
- public static final int SET_SHUTDOWN_POSTPONE =
- VehicleApPowerSetState.VEHICLE_AP_POWER_SET_SHUTDOWN_POSTPONE;
+ public static final int SET_SHUTDOWN_POSTPONE = VehicleApPowerSetState.SHUTDOWN_POSTPONE;
@VisibleForTesting
- public static final int SET_SHUTDOWN_START =
- VehicleApPowerSetState.VEHICLE_AP_POWER_SET_SHUTDOWN_START;
+ public static final int SET_SHUTDOWN_START = VehicleApPowerSetState.SHUTDOWN_START;
@VisibleForTesting
- public static final int SET_DISPLAY_ON = VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DISPLAY_ON;
+ public static final int SET_DISPLAY_ON = VehicleApPowerSetState.DISPLAY_ON;
@VisibleForTesting
public static final int SET_DISPLAY_OFF =
- VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DISPLAY_OFF;
+ VehicleApPowerSetState.DISPLAY_OFF;
@VisibleForTesting
public static final int FLAG_SHUTDOWN_PARAM_CAN_SLEEP =
- VehicleApPowerStateShutdownParam.VEHICLE_AP_POWER_SHUTDOWN_PARAM_CAN_SLEEP;
+ VehicleApPowerStateShutdownParam.CAN_SLEEP;
@VisibleForTesting
public static final int FLAG_SHUTDOWN_IMMEDIATELY =
- VehicleApPowerStateShutdownParam.VEHICLE_AP_POWER_SHUTDOWN_PARAM_SHUTDOWN_IMMEDIATELY;
+ VehicleApPowerStateShutdownParam.SHUTDOWN_IMMEDIATELY;
public interface PowerEventListener {
/**
* Received power state change event.
* @param state One of STATE_*
- * @param param
*/
void onApPowerStateChange(PowerState state);
/**
@@ -91,12 +86,12 @@
/**
* One of STATE_*
*/
- public final int state;
- public final int param;
+ public final int mState;
+ public final int mParam;
public PowerState(int state, int param) {
- this.state = state;
- this.param = param;
+ this.mState = state;
+ this.mParam = param;
}
/**
@@ -106,12 +101,10 @@
* @throws IllegalStateException
*/
public boolean canEnterDeepSleep() {
- if (state != STATE_SHUTDOWN_PREPARE) {
+ if (mState != STATE_SHUTDOWN_PREPARE) {
throw new IllegalStateException("wrong state");
}
- return (param &
- VehicleApPowerStateShutdownParam.VEHICLE_AP_POWER_SHUTDOWN_PARAM_CAN_SLEEP) !=
- 0;
+ return (mParam & VehicleApPowerStateShutdownParam.CAN_SLEEP) != 0;
}
/**
@@ -121,12 +114,10 @@
* @throws IllegalStateException
*/
public boolean canPostponeShutdown() {
- if (state != STATE_SHUTDOWN_PREPARE) {
+ if (mState != STATE_SHUTDOWN_PREPARE) {
throw new IllegalStateException("wrong state");
}
- return (param &
- VehicleApPowerStateShutdownParam.VEHICLE_AP_POWER_SHUTDOWN_PARAM_SHUTDOWN_IMMEDIATELY)
- == 0;
+ return (mParam & VehicleApPowerStateShutdownParam.SHUTDOWN_IMMEDIATELY) == 0;
}
@Override
@@ -138,12 +129,12 @@
return false;
}
PowerState that = (PowerState) o;
- return this.state == that.state && this.param == that.param;
+ return this.mState == that.mState && this.mParam == that.mParam;
}
@Override
public String toString() {
- return "PowerState state:" + state + ",param:" + param;
+ return "PowerState state:" + mState + ", param:" + mParam;
}
}
@@ -174,98 +165,99 @@
public void sendBootComplete() {
Log.i(CarLog.TAG_POWER, "send boot complete");
- setPowerState(VehicleApPowerSetState.VEHICLE_AP_POWER_SET_BOOT_COMPLETE, 0);
+ setPowerState(VehicleApPowerSetState.BOOT_COMPLETE, 0);
}
public void sendSleepEntry() {
Log.i(CarLog.TAG_POWER, "send sleep entry");
- setPowerState(VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DEEP_SLEEP_ENTRY, 0);
+ setPowerState(VehicleApPowerSetState.DEEP_SLEEP_ENTRY, 0);
}
public void sendSleepExit() {
Log.i(CarLog.TAG_POWER, "send sleep exit");
- setPowerState(VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DEEP_SLEEP_EXIT, 0);
+ setPowerState(VehicleApPowerSetState.DEEP_SLEEP_EXIT, 0);
}
public void sendShutdownPostpone(int postponeTimeMs) {
Log.i(CarLog.TAG_POWER, "send shutdown postpone, time:" + postponeTimeMs);
- setPowerState(VehicleApPowerSetState.VEHICLE_AP_POWER_SET_SHUTDOWN_POSTPONE,
+ setPowerState(VehicleApPowerSetState.SHUTDOWN_POSTPONE,
postponeTimeMs);
}
public void sendShutdownStart(int wakeupTimeSec) {
Log.i(CarLog.TAG_POWER, "send shutdown start");
- setPowerState(VehicleApPowerSetState.VEHICLE_AP_POWER_SET_SHUTDOWN_START, 0);
+ setPowerState(VehicleApPowerSetState.SHUTDOWN_START, 0);
}
public void sendDisplayOn() {
Log.i(CarLog.TAG_POWER, "send display on");
- setPowerState(VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DISPLAY_ON, 0);
+ setPowerState(VehicleApPowerSetState.DISPLAY_ON, 0);
}
public void sendDisplayOff() {
Log.i(CarLog.TAG_POWER, "send display off");
- setPowerState(VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DISPLAY_OFF, 0);
+ setPowerState(VehicleApPowerSetState.DISPLAY_OFF, 0);
}
private void setPowerState(int state, int additionalParam) {
int[] values = { state, additionalParam };
try {
- mHal.getVehicleNetwork().setIntVectorProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE, values);
- } catch (ServiceSpecificException e) {
+ mHal.set(VehicleProperty.AP_POWER_STATE).to(values);
+ } catch (PropertyTimeoutException e) {
Log.e(CarLog.TAG_POWER, "cannot set to AP_POWER_STATE", e);
}
}
+ @Nullable
public PowerState getCurrentPowerState() {
- int[] state = mHal.getVehicleNetwork().getIntVectorProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE);
- return new PowerState(state[VehicleApPowerStateIndex.VEHICLE_AP_POWER_STATE_INDEX_STATE],
- state[VehicleApPowerStateIndex.VEHICLE_AP_POWER_STATE_INDEX_ADDITIONAL]);
+ int[] state;
+ try {
+ state = mHal.get(int[].class, VehicleProperty.AP_POWER_STATE);
+ } catch (PropertyTimeoutException e) {
+ Log.e(CarLog.TAG_POWER, "Cannot get AP_POWER_STATE", e);
+ return null;
+ }
+ return new PowerState(state[VehicleApPowerStateIndex.STATE],
+ state[VehicleApPowerStateIndex.ADDITIONAL]);
}
public synchronized boolean isPowerStateSupported() {
- VehiclePropConfig config = mProperties.get(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE);
+ VehiclePropConfig config = mProperties.get(VehicleProperty.AP_POWER_STATE);
return config != null;
}
public synchronized boolean isDeepSleepAllowed() {
- VehiclePropConfig config = mProperties.get(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE);
+ VehiclePropConfig config = mProperties.get(VehicleProperty.AP_POWER_STATE);
if (config == null) {
return false;
}
- return (config.getConfigArray(0) &
- VehicleApPowerStateConfigFlag.VEHICLE_AP_POWER_STATE_CONFIG_ENABLE_DEEP_SLEEP_FLAG)
- != 0;
+ return (config.configArray.get(0)
+ & VehicleApPowerStateConfigFlag.ENABLE_DEEP_SLEEP_FLAG) != 0;
}
public synchronized boolean isTimedWakeupAllowed() {
VehiclePropConfig config = mProperties.get(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE);
+ AP_POWER_STATE);
if (config == null) {
return false;
}
- return (config.getConfigArray(0) &
- VehicleApPowerStateConfigFlag.VEHICLE_AP_POWER_STATE_CONFIG_SUPPORT_TIMER_POWER_ON_FLAG)
- != 0;
+ return (config.configArray.get(0)
+ & VehicleApPowerStateConfigFlag.CONFIG_SUPPORT_TIMER_POWER_ON_FLAG) != 0;
}
@Override
public synchronized void init() {
for (VehiclePropConfig config : mProperties.values()) {
if (VehicleHal.isPropertySubscribable(config)) {
- mHal.subscribeProperty(this, config.getProp(), 0);
+ mHal.subscribeProperty(this, config.prop, 0);
}
}
- VehiclePropConfig brightnessProperty = mProperties.get(
- VehicleNetworkConsts.VEHICLE_PROPERTY_DISPLAY_BRIGHTNESS);
+ VehiclePropConfig brightnessProperty = mProperties.get(DISPLAY_BRIGHTNESS);
if (brightnessProperty != null) {
- mMaxDisplayBrightness = brightnessProperty.getInt32Maxs(0);
+ mMaxDisplayBrightness = brightnessProperty.areaConfigs.size() > 0
+ ? brightnessProperty.areaConfigs.get(0).maxInt32Value : 0;
if (mMaxDisplayBrightness <= 0) {
- Log.w(CarLog.TAG_POWER, "Max display brightness from vehicle HAL is invald:" +
+ Log.w(CarLog.TAG_POWER, "Max display brightness from vehicle HAL is invalid:" +
mMaxDisplayBrightness);
mMaxDisplayBrightness = 1;
}
@@ -278,17 +270,17 @@
}
@Override
- public synchronized List<VehiclePropConfig> takeSupportedProperties(
- List<VehiclePropConfig> allProperties) {
+ public synchronized Collection<VehiclePropConfig> takeSupportedProperties(
+ Collection<VehiclePropConfig> allProperties) {
for (VehiclePropConfig config : allProperties) {
- switch (config.getProp()) {
- case VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE:
- case VehicleNetworkConsts.VEHICLE_PROPERTY_DISPLAY_BRIGHTNESS:
- mProperties.put(config.getProp(), config);
+ switch (config.prop) {
+ case AP_POWER_STATE:
+ case DISPLAY_BRIGHTNESS:
+ mProperties.put(config.prop, config);
break;
}
}
- return new LinkedList<VehiclePropConfig>(mProperties.values());
+ return new LinkedList<>(mProperties.values());
}
@Override
@@ -297,7 +289,7 @@
synchronized (this) {
if (mListener == null) {
if (mQueuedEvents == null) {
- mQueuedEvents = new LinkedList<VehiclePropValue>();
+ mQueuedEvents = new LinkedList<>();
}
mQueuedEvents.addAll(values);
return;
@@ -309,20 +301,19 @@
private void dispatchEvents(List<VehiclePropValue> values, PowerEventListener listener) {
for (VehiclePropValue v : values) {
- switch (v.getProp()) {
- case VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE:
- listener.onApPowerStateChange(new PowerState(
- v.getInt32Values(
- VehicleApPowerStateIndex.VEHICLE_AP_POWER_STATE_INDEX_STATE),
- v.getInt32Values(
- VehicleApPowerStateIndex.VEHICLE_AP_POWER_STATE_INDEX_ADDITIONAL)));
+ switch (v.prop) {
+ case AP_POWER_STATE:
+ int state = v.value.int32Values.get(VehicleApPowerStateIndex.STATE);
+ int param = v.value.int32Values.get(VehicleApPowerStateIndex.ADDITIONAL);
+ listener.onApPowerStateChange(new PowerState(state, param));
break;
- case VehicleNetworkConsts.VEHICLE_PROPERTY_DISPLAY_BRIGHTNESS:
+ case DISPLAY_BRIGHTNESS:
int maxBrightness;
synchronized (this) {
maxBrightness = mMaxDisplayBrightness;
}
- listener.onDisplayBrightnessChange(v.getInt32Values(0) * 100 / maxBrightness);
+ listener.onDisplayBrightnessChange(
+ (v.value.int32Values.get(0) * 100) / maxBrightness);
break;
}
}
diff --git a/service/src/com/android/car/hal/PropertyHalServiceBase.java b/service/src/com/android/car/hal/PropertyHalServiceBase.java
index 79fd626..28dd4c6 100644
--- a/service/src/com/android/car/hal/PropertyHalServiceBase.java
+++ b/service/src/com/android/car/hal/PropertyHalServiceBase.java
@@ -19,20 +19,21 @@
import static com.android.car.hal.CarPropertyUtils.toVehiclePropValue;
import static java.lang.Integer.toHexString;
+import android.annotation.Nullable;
import android.car.hardware.CarPropertyConfig;
import android.car.hardware.CarPropertyValue;
import android.car.hardware.property.CarPropertyEvent;
-import android.os.ServiceSpecificException;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
import android.util.Log;
import android.util.SparseIntArray;
import com.android.car.CarLog;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
import com.android.internal.annotations.GuardedBy;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@@ -44,7 +45,6 @@
*/
public abstract class PropertyHalServiceBase extends HalServiceBase {
private final boolean mDbg;
- private final SparseIntArray mHalPropToValueType = new SparseIntArray();
private final ConcurrentHashMap<Integer, CarPropertyConfig<?>> mProps =
new ConcurrentHashMap<>();
private final String mTag;
@@ -81,6 +81,10 @@
return new ArrayList<>(mProps.values());
}
+ /**
+ * Returns property or null if property is not ready yet.
+ */
+ @Nullable
public CarPropertyValue getProperty(int mgrPropId, int areaId) {
int halPropId = managerToHalPropId(mgrPropId);
if (halPropId == NOT_SUPPORTED_PROPERTY) {
@@ -89,14 +93,8 @@
VehiclePropValue value = null;
try {
- VehiclePropValue valueRequest = VehiclePropValue.newBuilder()
- .setProp(halPropId)
- .setZone(areaId)
- .setValueType(mHalPropToValueType.get(halPropId))
- .build();
-
- value = mVehicleHal.getVehicleNetwork().getProperty(valueRequest);
- } catch (ServiceSpecificException e) {
+ value = mVehicleHal.get(halPropId, areaId);
+ } catch (PropertyTimeoutException e) {
Log.e(CarLog.TAG_PROPERTY, "get, property not ready 0x" + toHexString(halPropId), e);
}
@@ -111,8 +109,8 @@
}
VehiclePropValue halProp = toVehiclePropValue(prop, halPropId);
try {
- mVehicleHal.getVehicleNetwork().setProperty(halProp);
- } catch (ServiceSpecificException e) {
+ mVehicleHal.set(halProp);
+ } catch (PropertyTimeoutException e) {
Log.e(CarLog.TAG_PROPERTY, "set, property not ready 0x" + toHexString(halPropId), e);
throw new RuntimeException(e);
}
@@ -148,12 +146,12 @@
}
@Override
- public List<VehiclePropConfig> takeSupportedProperties(
- List<VehiclePropConfig> allProperties) {
+ public Collection<VehiclePropConfig> takeSupportedProperties(
+ Collection<VehiclePropConfig> allProperties) {
List<VehiclePropConfig> taken = new LinkedList<>();
for (VehiclePropConfig p : allProperties) {
- int mgrPropId = halToManagerPropId(p.getProp());
+ int mgrPropId = halToManagerPropId(p.prop);
if (mgrPropId == NOT_SUPPORTED_PROPERTY) {
continue; // The property is not handled by this HAL.
@@ -162,11 +160,10 @@
CarPropertyConfig config = CarPropertyUtils.toCarPropertyConfig(p, mgrPropId);
taken.add(p);
- mProps.put(p.getProp(), config);
- mHalPropToValueType.put(p.getProp(), p.getValueType());
+ mProps.put(p.prop, config);
if (mDbg) {
- Log.d(mTag, "takeSupportedProperties: " + toHexString(p.getProp()));
+ Log.d(mTag, "takeSupportedProperties: " + toHexString(p.prop));
}
}
return taken;
@@ -180,7 +177,7 @@
}
if (listener != null) {
for (VehiclePropValue v : values) {
- int prop = v.getProp();
+ int prop = v.prop;
int mgrPropId = halToManagerPropId(prop);
if (mgrPropId == NOT_SUPPORTED_PROPERTY) {
diff --git a/service/src/com/android/car/hal/PropertyTimeoutException.java b/service/src/com/android/car/hal/PropertyTimeoutException.java
new file mode 100644
index 0000000..2d6120d
--- /dev/null
+++ b/service/src/com/android/car/hal/PropertyTimeoutException.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2016 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 com.android.car.hal;
+
+import static java.lang.Integer.toHexString;
+
+/**
+ * This exception is raised when IVehicle#get or IVehicle#set returns StatusCode.TRY_AGAIN. This
+ * usually happens during boot-up meaning that Vehicle HAL is not ready to get or set that property.
+ */
+class PropertyTimeoutException extends Exception {
+ PropertyTimeoutException(int property) {
+ super("Property 0x" + toHexString(property) + " is not ready yet.");
+ }
+}
diff --git a/service/src/com/android/car/hal/RadioHalService.java b/service/src/com/android/car/hal/RadioHalService.java
index 68423d0..8cd8687 100644
--- a/service/src/com/android/car/hal/RadioHalService.java
+++ b/service/src/com/android/car/hal/RadioHalService.java
@@ -16,22 +16,23 @@
package com.android.car.hal;
+import android.annotation.Nullable;
import android.car.hardware.radio.CarRadioEvent;
import android.car.hardware.radio.CarRadioPreset;
-import android.os.ServiceSpecificException;
-import android.util.Log;
import android.hardware.radio.RadioManager;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.hardware.vehicle.V2_0.VehicleRadioConstants;
+import android.util.Log;
import com.android.car.CarLog;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
+import java.io.PrintWriter;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
-import java.io.PrintWriter;
/**
* This class exposes the Radio related features in the HAL layer.
@@ -48,7 +49,7 @@
private RadioListener mListener;
public interface RadioListener {
- public void onEvent(CarRadioEvent event);
+ void onEvent(CarRadioEvent event);
}
public RadioHalService(VehicleHal hal) {
@@ -65,9 +66,9 @@
}
@Override
- public synchronized List<VehiclePropConfig> takeSupportedProperties(
- List<VehiclePropConfig> allProperties) {
- List<VehiclePropConfig> supported = new LinkedList<VehiclePropConfig>();
+ public synchronized Collection<VehiclePropConfig> takeSupportedProperties(
+ Collection<VehiclePropConfig> allProperties) {
+ Collection<VehiclePropConfig> supported = new LinkedList<>();
for (VehiclePropConfig p : allProperties) {
if (handleRadioProperty(p)) {
supported.add(p);
@@ -81,7 +82,7 @@
if (DBG) {
Log.d(TAG, "handleHalEvents");
}
- RadioHalService.RadioListener radioListener = null;
+ RadioHalService.RadioListener radioListener;
synchronized (this) {
radioListener = mListener;
}
@@ -108,7 +109,7 @@
public void dump(PrintWriter writer) {
writer.println("*RadioHal*");
writer.println("**Supported properties**");
- writer.println(VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET);
+ writer.println(VehicleProperty.RADIO_PRESET);
if (mListener != null) {
writer.println("Hal service registered.");
}
@@ -121,7 +122,7 @@
mListener = listener;
// Subscribe to all radio properties.
- mHal.subscribeProperty(this, VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET, 0);
+ mHal.subscribeProperty(this, VehicleProperty.RADIO_PRESET, 0);
}
public synchronized void unregisterListener() {
@@ -130,8 +131,8 @@
}
mListener = null;
- // Unsubscribe from all propreties.
- mHal.unsubscribeProperty(this, VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET);
+ // Unsubscribe from all properties.
+ mHal.unsubscribeProperty(this, VehicleProperty.RADIO_PRESET);
}
public synchronized int getPresetCount() {
@@ -139,6 +140,7 @@
return mPresetCount;
}
+ @Nullable
public CarRadioPreset getRadioPreset(int presetNumber) {
// Check if the preset number is out of range. We should return NULL if that is the case.
if (DBG) {
@@ -148,30 +150,30 @@
throw new IllegalArgumentException("Preset number not valid: " + presetNumber);
}
- int[] presetArray = {presetNumber, 0, 0, 0};
- VehiclePropValue presetNumberValue =
- VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET, presetArray, 0);
+ VehiclePropValue presetNumberValue = new VehiclePropValue();
+ presetNumberValue.prop = VehicleProperty.RADIO_PRESET;
+ presetNumberValue.value.int32Values.addAll(Arrays.asList(presetNumber, 0, 0, 0));
VehiclePropValue presetConfig;
try {
- presetConfig = mHal.getVehicleNetwork().getProperty(presetNumberValue);
- } catch (ServiceSpecificException e) {
- Log.e(TAG, "property VEHICLE_PROPERTY_RADIO_PRESET not ready");
+ presetConfig = mHal.get(presetNumberValue);
+ } catch (PropertyTimeoutException e) {
+ Log.e(TAG, "property VehicleProperty.RADIO_PRESET not ready", e);
return null;
}
// Sanity check the output from HAL.
- if (presetConfig.getInt32ValuesCount() != 4) {
+ if (presetConfig.value.int32Values.size() != 4) {
Log.e(TAG, "Return value does not have 4 elements: " +
- presetConfig.getInt32ValuesList());
+ Arrays.toString(presetConfig.value.int32Values.toArray()));
throw new IllegalStateException(
- "Invalid preset returned from service: " + presetConfig.getInt32ValuesList());
+ "Invalid preset returned from service: "
+ + Arrays.toString(presetConfig.value.int32Values.toArray()));
}
- int retPresetNumber = presetConfig.getInt32Values(0);
- int retBand = presetConfig.getInt32Values(1);
- int retChannel = presetConfig.getInt32Values(2);
- int retSubChannel = presetConfig.getInt32Values(3);
+ int retPresetNumber = presetConfig.value.int32Values.get(0);
+ int retBand = presetConfig.value.int32Values.get(1);
+ int retChannel = presetConfig.value.int32Values.get(2);
+ int retSubChannel = presetConfig.value.int32Values.get(3);
if (retPresetNumber != presetNumber) {
Log.e(TAG, "Preset number is not the same: " + presetNumber + " vs " + retPresetNumber);
return null;
@@ -197,18 +199,13 @@
return false;
}
- VehiclePropValue setPresetValue =
- VehiclePropValueUtil.createBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4, 0)
- .addInt32Values(preset.getPresetNumber())
- .addInt32Values(preset.getBand())
- .addInt32Values(preset.getChannel())
- .addInt32Values(preset.getSubChannel())
- .build();
try {
- mHal.getVehicleNetwork().setProperty(setPresetValue);
- } catch (ServiceSpecificException e) {
+ mHal.set(VehicleProperty.RADIO_PRESET).to(new int[] {
+ preset.getPresetNumber(),
+ preset.getBand(),
+ preset.getChannel(),
+ preset.getSubChannel()});
+ } catch (PropertyTimeoutException e) {
Log.e(CarLog.TAG_POWER, "cannot set to RADIO_PRESET", e);
return false;
}
@@ -217,7 +214,7 @@
private boolean isValidPresetNumber(int presetNumber) {
// Check for preset number.
- if (presetNumber < VehicleNetworkConsts.VehicleRadioConsts.VEHICLE_RADIO_PRESET_MIN_VALUE
+ if (presetNumber < VehicleRadioConstants.VEHICLE_RADIO_PRESET_MIN_VALUE
|| presetNumber > mPresetCount) {
Log.e(TAG, "Preset number not in range (1, " + mPresetCount + ") - " + presetNumber);
return false;
@@ -238,10 +235,10 @@
}
private boolean handleRadioProperty(VehiclePropConfig property) {
- switch (property.getProp()) {
- case VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET:
+ switch (property.prop) {
+ case VehicleProperty.RADIO_PRESET:
// Extract the count of presets.
- mPresetCount = property.getConfigArray(0);
+ mPresetCount = property.configArray.get(0);
Log.d(TAG, "Read presets count: " + mPresetCount);
return true;
default:
@@ -251,15 +248,16 @@
}
private CarRadioEvent createCarRadioEvent(VehiclePropValue v) {
- switch (v.getProp()) {
- case VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET:
- if (v.getInt32ValuesCount() != 4) {
- Log.e(TAG, "Returned a wrong array size: " + v.getInt32ValuesCount());
+ switch (v.prop) {
+ case VehicleProperty.RADIO_PRESET:
+ int vecSize = v.value.int32Values.size();
+ if (vecSize != 4) {
+ Log.e(TAG, "Returned a wrong array size: " + vecSize);
return null;
}
Integer intValues[] = new Integer[4];
- v.getInt32ValuesList().toArray(intValues);
+ v.value.int32Values.toArray(intValues);
// Verify the correctness of the values.
if (!isValidPresetNumber(intValues[0]) && !isValidBand(intValues[1])) {
diff --git a/service/src/com/android/car/hal/SensorHalService.java b/service/src/com/android/car/hal/SensorHalService.java
index c21bddd..d2c2714 100644
--- a/service/src/com/android/car/hal/SensorHalService.java
+++ b/service/src/com/android/car/hal/SensorHalService.java
@@ -16,21 +16,30 @@
package com.android.car.hal;
+import static android.hardware.vehicle.V2_0.VehicleProperty.DRIVING_STATUS;
+import static android.hardware.vehicle.V2_0.VehicleProperty.FUEL_LEVEL_LOW;
+import static android.hardware.vehicle.V2_0.VehicleProperty.GEAR_SELECTION;
+import static android.hardware.vehicle.V2_0.VehicleProperty.NIGHT_MODE;
+import static android.hardware.vehicle.V2_0.VehicleProperty.PARKING_BRAKE_ON;
+import static android.hardware.vehicle.V2_0.VehicleProperty.PERF_VEHICLE_SPEED;
+import static java.lang.Integer.toHexString;
+
+import android.annotation.Nullable;
import android.car.hardware.CarSensorEvent;
import android.car.hardware.CarSensorManager;
-import android.os.ServiceSpecificException;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.hardware.vehicle.V2_0.VehiclePropertyAccess;
+import android.hardware.vehicle.V2_0.VehiclePropertyChangeMode;
import android.util.Log;
import android.util.SparseArray;
import com.android.car.CarLog;
import com.android.car.CarSensorEventFactory;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
import java.io.PrintWriter;
+import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
@@ -41,13 +50,12 @@
private static final boolean DBG_EVENTS = false;
- private static final int SENSOR_TYPE_INVALD = -1;
+ private static final int SENSOR_TYPE_INVALID = -1;
private final VehicleHal mHal;
private boolean mIsReady = false;
private SensorHalServiceBase.SensorListener mSensorListener;
- private final SparseArray<VehiclePropConfig> mSensorToHalProperty =
- new SparseArray<VehiclePropConfig>();
+ private final SparseArray<VehiclePropConfig> mSensorToHalProperty = new SparseArray<>();
public SensorHalService(VehicleHal hal) {
mHal = hal;
@@ -59,17 +67,14 @@
}
@Override
- public synchronized List<VehiclePropConfig> takeSupportedProperties(
- List<VehiclePropConfig> allProperties) {
- LinkedList<VehiclePropConfig> supportedProperties = new LinkedList<VehiclePropConfig>();
+ public synchronized Collection<VehiclePropConfig> takeSupportedProperties(
+ Collection<VehiclePropConfig> allProperties) {
+ LinkedList<VehiclePropConfig> supportedProperties = new LinkedList<>();
for (VehiclePropConfig halProperty : allProperties) {
- int sensor = getSensorTypeFromHalProperty(halProperty.getProp());
- if (sensor != SENSOR_TYPE_INVALD &&
- halProperty.getChangeMode() !=
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_STATIC &&
- (halProperty.getAccess() == VehiclePropAccess.VEHICLE_PROP_ACCESS_READ
- || halProperty.getAccess() ==
- VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE)) {
+ int sensor = getSensorTypeFromHalProperty(halProperty.prop);
+ if (sensor != SENSOR_TYPE_INVALID
+ && halProperty.changeMode != VehiclePropertyChangeMode.STATIC
+ && ((halProperty.access & VehiclePropertyAccess.READ) != 0)) {
supportedProperties.add(halProperty);
mSensorToHalProperty.append(sensor, halProperty);
}
@@ -83,8 +88,8 @@
mIsReady = false;
}
- // should be used only insidehandleHalEvents.
- private final LinkedList<CarSensorEvent> mEventsToDispatch = new LinkedList<CarSensorEvent>();
+ // Should be used only inside handleHalEvents method.
+ private final LinkedList<CarSensorEvent> mEventsToDispatch = new LinkedList<>();
@Override
public void handleHalEvents(List<VehiclePropValue> values) {
for (VehiclePropValue v : values) {
@@ -104,42 +109,42 @@
}
private CarSensorEvent createCarSensorEvent(VehiclePropValue v) {
- int property = v.getProp();
+ int property = v.prop;
int sensorType = getSensorTypeFromHalProperty(property);
- if (sensorType == SENSOR_TYPE_INVALD) {
+ if (sensorType == SENSOR_TYPE_INVALID) {
throw new RuntimeException("handleBooleanHalEvent no sensor defined for property " +
property);
}
switch (property) {
// boolean
- case VehicleNetworkConsts.VEHICLE_PROPERTY_NIGHT_MODE:
- case VehicleNetworkConsts.VEHICLE_PROPERTY_PARKING_BRAKE_ON:
- case VehicleNetworkConsts.VEHICLE_PROPERTY_FUEL_LEVEL_LOW: {
+ case VehicleProperty.NIGHT_MODE:
+ case VehicleProperty.PARKING_BRAKE_ON:
+ case VehicleProperty.FUEL_LEVEL_LOW: {
if (DBG_EVENTS) {
Log.i(CarLog.TAG_SENSOR, "boolean event, property:" +
- Integer.toHexString(property) + " value:" + v.getInt32Values(0));
+ toHexString(property) + " value:" + v.value.int32Values.get(0));
}
- return CarSensorEventFactory.createBooleanEvent(sensorType, v.getTimestamp(),
- v.getInt32Values(0) == 1);
+ return CarSensorEventFactory.createBooleanEvent(sensorType, v.timestamp,
+ v.value.int32Values.get(0) == 1);
}
// int
- case VehicleNetworkConsts.VEHICLE_PROPERTY_GEAR_SELECTION:
- case VehicleNetworkConsts.VEHICLE_PROPERTY_DRIVING_STATUS: {
+ case VehicleProperty.GEAR_SELECTION:
+ case VehicleProperty.DRIVING_STATUS: {
if (DBG_EVENTS) {
Log.i(CarLog.TAG_SENSOR, "int event, property:" +
- Integer.toHexString(property) + " value:" + v.getInt32Values(0));
+ toHexString(property) + " value:" + v.value.int32Values.get(0));
}
- return CarSensorEventFactory.createIntEvent(sensorType, v.getTimestamp(),
- v.getInt32Values(0));
+ return CarSensorEventFactory.createIntEvent(sensorType, v.timestamp,
+ v.value.int32Values.get(0));
}
// float
- case VehicleNetworkConsts.VEHICLE_PROPERTY_PERF_VEHICLE_SPEED: {
+ case VehicleProperty.PERF_VEHICLE_SPEED: {
if (DBG_EVENTS) {
Log.i(CarLog.TAG_SENSOR, "float event, property:" +
- Integer.toHexString(property) + " value:" + v.getFloatValues(0));
+ toHexString(property) + " value:" + v.value.floatValues.get(0));
}
- return CarSensorEventFactory.createFloatEvent(sensorType, v.getTimestamp(),
- v.getFloatValues(0));
+ return CarSensorEventFactory.createFloatEvent(sensorType, v.timestamp,
+ v.value.floatValues.get(0));
}
}
return null;
@@ -171,10 +176,11 @@
return false;
}
//TODO calculate sampling rate properly, bug: 32095903
- mHal.subscribeProperty(this, config.getProp(), fixSamplingRateForProperty(config, rate));
+ mHal.subscribeProperty(this, config.prop, fixSamplingRateForProperty(config, rate));
return true;
}
+ @Nullable
public CarSensorEvent getCurrentSensorValue(int sensorType) {
VehiclePropConfig config;
synchronized (this) {
@@ -182,23 +188,22 @@
}
if (config == null) {
Log.e(CarLog.TAG_SENSOR, "sensor type not available 0x" +
- Integer.toHexString(sensorType));
+ toHexString(sensorType));
return null;
}
try {
- VehiclePropValue value = mHal.getVehicleNetwork().getProperty(config.getProp());
+ VehiclePropValue value = mHal.get(config.prop);
return createCarSensorEvent(value);
- } catch (ServiceSpecificException e) {
- Log.e(CarLog.TAG_SENSOR, "property not ready 0x" +
- Integer.toHexString(config.getProp()), e);
+ } catch (PropertyTimeoutException e) {
+ Log.e(CarLog.TAG_SENSOR, "property not ready 0x" + toHexString(config.prop), e);
return null;
}
}
private float fixSamplingRateForProperty(VehiclePropConfig prop, int carSensorManagerRate) {
- switch (prop.getChangeMode()) {
- case VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE:
- case VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_SET:
+ switch (prop.changeMode) {
+ case VehiclePropertyChangeMode.ON_CHANGE:
+ case VehiclePropertyChangeMode.ON_SET:
return 0;
}
float rate = 1.0f;
@@ -213,11 +218,11 @@
default: // fall back to default.
break;
}
- if (rate > prop.getSampleRateMax()) {
- rate = prop.getSampleRateMax();
+ if (rate > prop.maxSampleRate) {
+ rate = prop.maxSampleRate;
}
- if (rate < prop.getSampleRateMin()) {
- rate = prop.getSampleRateMin();
+ if (rate < prop.minSampleRate) {
+ rate = prop.minSampleRate;
}
return rate;
}
@@ -228,7 +233,7 @@
if (config == null) {
return;
}
- mHal.unsubscribeProperty(this, config.getProp());
+ mHal.unsubscribeProperty(this, config.prop);
}
/**
@@ -239,20 +244,20 @@
*/
static int getSensorTypeFromHalProperty(int halPropertyType) {
switch (halPropertyType) {
- case VehicleNetworkConsts.VEHICLE_PROPERTY_PERF_VEHICLE_SPEED:
+ case PERF_VEHICLE_SPEED:
return CarSensorManager.SENSOR_TYPE_CAR_SPEED;
- case VehicleNetworkConsts.VEHICLE_PROPERTY_GEAR_SELECTION:
+ case GEAR_SELECTION:
return CarSensorManager.SENSOR_TYPE_GEAR;
- case VehicleNetworkConsts.VEHICLE_PROPERTY_NIGHT_MODE:
+ case NIGHT_MODE:
return CarSensorManager.SENSOR_TYPE_NIGHT;
- case VehicleNetworkConsts.VEHICLE_PROPERTY_PARKING_BRAKE_ON:
+ case PARKING_BRAKE_ON:
return CarSensorManager.SENSOR_TYPE_PARKING_BRAKE;
- case VehicleNetworkConsts.VEHICLE_PROPERTY_DRIVING_STATUS:
+ case DRIVING_STATUS:
return CarSensorManager.SENSOR_TYPE_DRIVING_STATUS;
- case VehicleNetworkConsts.VEHICLE_PROPERTY_FUEL_LEVEL_LOW:
+ case FUEL_LEVEL_LOW:
return CarSensorManager.SENSOR_TYPE_FUEL_LEVEL;
default:
- return SENSOR_TYPE_INVALD;
+ return SENSOR_TYPE_INVALID;
}
}
diff --git a/service/src/com/android/car/hal/SensorHalServiceBase.java b/service/src/com/android/car/hal/SensorHalServiceBase.java
index ab4dd6a..bf47f7b 100644
--- a/service/src/com/android/car/hal/SensorHalServiceBase.java
+++ b/service/src/com/android/car/hal/SensorHalServiceBase.java
@@ -17,11 +17,10 @@
package com.android.car.hal;
import android.car.hardware.CarSensorEvent;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-
-import java.io.PrintWriter;
+import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
@@ -44,7 +43,7 @@
void onSensorEvents(List<CarSensorEvent> events);
}
- private final LinkedList<CarSensorEvent> mDispatchQ = new LinkedList<CarSensorEvent>();
+ private final LinkedList<CarSensorEvent> mDispatchQ = new LinkedList<>();
public abstract void registerSensorListener(SensorListener listener);
@@ -83,9 +82,4 @@
// sensor provider.
throw new RuntimeException("should not be called");
}
-
- @Override
- public List<VehiclePropConfig> takeSupportedProperties(List<VehiclePropConfig> allProperties) {
- return null;
- }
}
diff --git a/service/src/com/android/car/hal/VehicleHal.java b/service/src/com/android/car/hal/VehicleHal.java
index 7c8d7be..182583d 100644
--- a/service/src/com/android/car/hal/VehicleHal.java
+++ b/service/src/com/android/car/hal/VehicleHal.java
@@ -16,6 +16,19 @@
package com.android.car.hal;
+import static com.android.car.CarServiceUtils.toByteArray;
+import static com.android.car.CarServiceUtils.toFloatArray;
+import static com.android.car.CarServiceUtils.toIntArray;
+import static java.lang.Integer.toHexString;
+
+import android.annotation.CheckResult;
+import android.hardware.vehicle.V2_0.IVehicle;
+import android.hardware.vehicle.V2_0.IVehicleCallback;
+import android.hardware.vehicle.V2_0.VehicleAreaConfig;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehiclePropertyAccess;
+import android.hardware.vehicle.V2_0.VehiclePropertyChangeMode;
import android.os.HandlerThread;
import android.os.SystemClock;
import android.util.ArraySet;
@@ -23,23 +36,17 @@
import android.util.SparseArray;
import com.android.car.CarLog;
-import com.android.car.vehiclenetwork.VehicleNetwork;
-import com.android.car.vehiclenetwork.VehicleNetwork.VehicleNetworkListener;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValues;
import com.android.internal.annotations.VisibleForTesting;
import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
-import java.util.LinkedList;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
/**
* Abstraction for vehicle HAL. This class handles interface with native HAL and do basic parsing
@@ -47,39 +54,13 @@
* implementation. It is responsibility of {@link HalServiceBase} to convert data to corresponding
* Car*Service for Car*Manager API.
*/
-public class VehicleHal implements VehicleNetworkListener {
+public class VehicleHal extends IVehicleCallback.Stub {
private static final boolean DBG = false;
- static {
- createInstance();
- }
-
- private static VehicleHal sInstance;
-
- public static synchronized VehicleHal getInstance() {
- if (sInstance == null) {
- createInstance();
- }
- return sInstance;
- }
-
- private static synchronized void createInstance() {
- sInstance = new VehicleHal();
- // init is handled in a separate thread to prevent blocking the calling thread for too
- // long.
- sInstance.init();
- }
-
- public static synchronized void releaseInstance() {
- if (sInstance != null) {
- sInstance.release();
- sInstance = null;
- }
- }
+ private static final int NO_AREA = -1;
private final HandlerThread mHandlerThread;
- private final VehicleNetwork mVehicleNetwork;
private final SensorHalService mSensorHal;
private final InfoHalService mInfoHal;
private final AudioHalService mAudioHal;
@@ -89,16 +70,17 @@
private final HvacHalService mHvacHal;
private final InputHalService mInputHal;
private final VendorExtensionHalService mVendorExtensionHal;
+ private final HalClient mHalClient;
/** stores handler for each HAL property. Property events are sent to handler. */
- private final SparseArray<HalServiceBase> mPropertyHandlers = new SparseArray<HalServiceBase>();
+ private final SparseArray<HalServiceBase> mPropertyHandlers = new SparseArray<>();
/** This is for iterating all HalServices with fixed order. */
private final HalServiceBase[] mAllServices;
- private final ArraySet<Integer> mSubscribedProperties = new ArraySet<Integer>();
+ private final ArraySet<Integer> mSubscribedProperties = new ArraySet<>();
private final HashMap<Integer, VehiclePropConfig> mAllProperties = new HashMap<>();
private final HashMap<Integer, VehiclePropertyEventInfo> mEventLog = new HashMap<>();
- private VehicleHal() {
+ public VehicleHal(IVehicle vehicle) {
mHandlerThread = new HandlerThread("VEHICLE-HAL");
mHandlerThread.start();
// passing this should be safe as long as it is just kept and not used in constructor
@@ -109,7 +91,7 @@
mCabinHal = new CabinHalService(this);
mRadioHal = new RadioHalService(this);
mHvacHal = new HvacHalService(this);
- mInputHal = new InputHalService();
+ mInputHal = new InputHalService(this);
mVendorExtensionHal = new VendorExtensionHalService(this);
mAllServices = new HalServiceBase[] {
mPowerHal,
@@ -122,14 +104,15 @@
mInputHal,
mVendorExtensionHal
};
- mVehicleNetwork = VehicleNetwork.createVehicleNetwork(this, mHandlerThread.getLooper());
+
+ mHalClient = new HalClient(vehicle, mHandlerThread.getLooper(), this /*IVehicleCallback*/);
}
/** Dummy version only for testing */
@VisibleForTesting
public VehicleHal(PowerHalService powerHal, SensorHalService sensorHal, InfoHalService infoHal,
AudioHalService audioHal, CabinHalService cabinHal, RadioHalService radioHal,
- HvacHalService hvacHal, VehicleNetwork vehicleNetwork) {
+ HvacHalService hvacHal, HalClient halClient) {
mHandlerThread = null;
mPowerHal = powerHal;
mSensorHal = sensorHal;
@@ -141,24 +124,21 @@
mInputHal = null;
mVendorExtensionHal = null;
mAllServices = null;
- mVehicleNetwork = vehicleNetwork;
+ mHalClient = halClient;
}
public void init() {
- VehiclePropConfigs properties = mVehicleNetwork.listProperties();
- // needs copy as getConfigsList gives unmodifiable one.
- List<VehiclePropConfig> propertiesList =
- new LinkedList<VehiclePropConfig>(properties.getConfigsList());
+ Set<VehiclePropConfig> properties = new HashSet<>(mHalClient.getAllPropConfigs());
synchronized (this) {
// Create map of all properties
- for (VehiclePropConfig p : propertiesList) {
- mAllProperties.put(p.getProp(), p);
+ for (VehiclePropConfig p : properties) {
+ mAllProperties.put(p.prop, p);
}
}
for (HalServiceBase service: mAllServices) {
- List<VehiclePropConfig> taken = service.takeSupportedProperties(propertiesList);
+ Collection<VehiclePropConfig> taken = service.takeSupportedProperties(properties);
if (taken == null) {
continue;
}
@@ -167,10 +147,10 @@
}
synchronized (this) {
for (VehiclePropConfig p: taken) {
- mPropertyHandlers.append(p.getProp(), service);
+ mPropertyHandlers.append(p.prop, service);
}
}
- propertiesList.removeAll(taken);
+ properties.removeAll(taken);
service.init();
}
}
@@ -182,7 +162,7 @@
}
synchronized (this) {
for (int p : mSubscribedProperties) {
- mVehicleNetwork.unsubscribe(p);
+ mHalClient.unsubscribe(p);
}
mSubscribedProperties.clear();
mAllProperties.clear();
@@ -228,19 +208,20 @@
private void assertServiceOwnerLocked(HalServiceBase service, int property) {
if (service != mPropertyHandlers.get(property)) {
- throw new IllegalArgumentException("Property 0x" + Integer.toHexString(property)
+ throw new IllegalArgumentException("Property 0x" + toHexString(property)
+ " is not owned by service: " + service);
}
}
/**
* Subscribe given property. Only Hal service owning the property can subscribe it.
- * @param service
- * @param property
- * @param samplingRateHz
*/
public void subscribeProperty(HalServiceBase service, int property,
float samplingRateHz) throws IllegalArgumentException {
+ if (DBG) {
+ Log.i(CarLog.TAG_HAL, "subscribeProperty, service:" + service
+ + ", property: 0x" + toHexString(property));
+ }
VehiclePropConfig config;
synchronized (this) {
config = mAllProperties.get(property);
@@ -254,13 +235,17 @@
assertServiceOwnerLocked(service, property);
mSubscribedProperties.add(property);
}
- mVehicleNetwork.subscribe(property, samplingRateHz);
+ mHalClient.subscribe(property, samplingRateHz);
} else {
Log.e(CarLog.TAG_HAL, "Cannot subscribe to property: " + property);
}
}
public void unsubscribeProperty(HalServiceBase service, int property) {
+ if (DBG) {
+ Log.i(CarLog.TAG_HAL, "unsubscribeProperty, service:" + service
+ + ", property: 0x" + toHexString(property));
+ }
VehiclePropConfig config;
synchronized (this) {
config = mAllProperties.get(property);
@@ -273,45 +258,116 @@
assertServiceOwnerLocked(service, property);
mSubscribedProperties.remove(property);
}
- mVehicleNetwork.unsubscribe(property);
+ mHalClient.unsubscribe(property);
} else {
Log.e(CarLog.TAG_HAL, "Cannot unsubscribe property: " + property);
}
}
- public VehicleNetwork getVehicleNetwork() {
- return mVehicleNetwork;
+ public boolean isPropertySupported(int propertyId) {
+ return mAllProperties.containsKey(propertyId);
}
- public static boolean isPropertySubscribable(VehiclePropConfig config) {
- if ((config.getAccess() & VehiclePropAccess.VEHICLE_PROP_ACCESS_READ) == 0 ||
- (config.getChangeMode() ==
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_STATIC)) {
+ public Collection<VehiclePropConfig> getAllPropConfigs() {
+ return mAllProperties.values();
+ }
+
+ public VehiclePropValue get(int propertyId) throws PropertyTimeoutException {
+ return get(propertyId, NO_AREA);
+ }
+
+ public VehiclePropValue get(int propertyId, int areaId) throws PropertyTimeoutException {
+ Log.i(CarLog.TAG_HAL, "get, property: 0x" + toHexString(propertyId)
+ + ", areaId: 0x" + toHexString(areaId));
+ VehiclePropValue propValue = new VehiclePropValue();
+ propValue.prop = propertyId;
+ propValue.areaId = areaId;
+ return mHalClient.getValue(propValue);
+ }
+
+ public <T> T get(Class clazz, int propertyId) throws PropertyTimeoutException {
+ return get(clazz, createPropValue(propertyId, NO_AREA));
+ }
+
+ public <T> T get(Class clazz, int propertyId, int areaId) throws PropertyTimeoutException {
+ return get(clazz, createPropValue(propertyId, areaId));
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T> T get(Class clazz, VehiclePropValue requestedPropValue)
+ throws PropertyTimeoutException {
+ VehiclePropValue propValue = mHalClient.getValue(requestedPropValue);
+ if (clazz == Integer.class || clazz == int.class) {
+ return (T) propValue.value.int32Values.get(0);
+ } else if (clazz == Boolean.class || clazz == boolean.class) {
+ return (T) Boolean.valueOf(propValue.value.int32Values.get(0) == 1);
+ } else if (clazz == Float.class || clazz == float.class) {
+ return (T) propValue.value.floatValues.get(0);
+ } else if (clazz == Integer[].class) {
+ Integer[] intArray = new Integer[propValue.value.int32Values.size()];
+ return (T) propValue.value.int32Values.toArray(intArray);
+ } else if (clazz == Float[].class) {
+ Float[] floatArray = new Float[propValue.value.floatValues.size()];
+ return (T) propValue.value.floatValues.toArray(floatArray);
+ } else if (clazz == int[].class) {
+ return (T) toIntArray(propValue.value.int32Values);
+ } else if (clazz == float[].class) {
+ return (T) toFloatArray(propValue.value.floatValues);
+ } else if (clazz == byte[].class) {
+ return (T) toByteArray(propValue.value.bytes);
+ } else if (clazz == String.class) {
+ return (T) propValue.value.stringValue;
+ } else {
+ throw new IllegalArgumentException("Unexpected type: " + clazz);
+ }
+ }
+
+ public VehiclePropValue get(VehiclePropValue requestedPropValue)
+ throws PropertyTimeoutException {
+ return mHalClient.getValue(requestedPropValue);
+ }
+
+ void set(VehiclePropValue propValue) throws PropertyTimeoutException {
+ mHalClient.setValue(propValue);
+ }
+
+ @CheckResult
+ VehiclePropValueSetter set(int propId) {
+ return new VehiclePropValueSetter(mHalClient, propId, NO_AREA);
+ }
+
+ @CheckResult
+ VehiclePropValueSetter set(int propId, int areaId) {
+ return new VehiclePropValueSetter(mHalClient, propId, areaId);
+ }
+
+ static boolean isPropertySubscribable(VehiclePropConfig config) {
+ if ((config.access & VehiclePropertyAccess.READ) == 0 ||
+ (config.changeMode == VehiclePropertyChangeMode.STATIC)) {
return false;
}
return true;
}
- public static void dumpProperties(PrintWriter writer, Collection<VehiclePropConfig> configs) {
+ static void dumpProperties(PrintWriter writer, Collection<VehiclePropConfig> configs) {
for (VehiclePropConfig config : configs) {
- writer.println("property " +
- VehicleNetworkConsts.getVehiclePropertyName(config.getProp()));
+ writer.println(String.format("property 0x%x", config.prop));
}
}
- private final ArraySet<HalServiceBase> mServicesToDispatch = new ArraySet<HalServiceBase>();
+ private final ArraySet<HalServiceBase> mServicesToDispatch = new ArraySet<>();
@Override
- public void onVehicleNetworkEvents(VehiclePropValues values) {
+ public void onPropertyEvent(ArrayList<VehiclePropValue> propValues) {
synchronized (this) {
- for (VehiclePropValue v : values.getValuesList()) {
- HalServiceBase service = mPropertyHandlers.get(v.getProp());
+ for (VehiclePropValue v : propValues) {
+ HalServiceBase service = mPropertyHandlers.get(v.prop);
service.getDispatchList().add(v);
mServicesToDispatch.add(service);
- VehiclePropertyEventInfo info = mEventLog.get(v.getProp());
+ VehiclePropertyEventInfo info = mEventLog.get(v.prop);
if (info == null) {
info = new VehiclePropertyEventInfo(v);
- mEventLog.put(v.getProp(), info);
+ mEventLog.put(v.prop, info);
} else {
info.addNewEvent(v);
}
@@ -330,19 +386,12 @@
}
@Override
- public void onHalError(int errorCode, int property, int operation) {
- Log.e(CarLog.TAG_HAL, "onHalError, errorCode:" + errorCode +
- " property:0x" + Integer.toHexString(property) +
- " operation:" + operation);
+ public void onPropertySetError(int errorCode, int propId, int areaId) {
+ Log.e(CarLog.TAG_HAL, String.format("onPropertySetError, errorCode: %d, prop: 0x%x, "
+ + "area: 0x%x", errorCode, propId, areaId));
// TODO propagate per property error to HAL services and handle global error, bug:32068464
}
- @Override
- public void onHalRestart(boolean inMocking) {
- Log.e(CarLog.TAG_HAL, "onHalRestart, inMocking:" + inMocking);
- // TODO restart things as other components started mocking. For now, ignore., bug:32068464
- }
-
public void dump(PrintWriter writer) {
writer.println("**dump HAL services**");
for (HalServiceBase service: mAllServices) {
@@ -354,30 +403,26 @@
configList = new ArrayList<>(mAllProperties.values());
}
+
writer.println("**All properties**");
for (VehiclePropConfig config : configList) {
- StringBuilder builder = new StringBuilder();
- builder.append("Property:0x").append(Integer.toHexString(config.getProp()));
- builder.append(",access:0x" + Integer.toHexString(config.getAccess()));
- builder.append(",changeMode:0x" + Integer.toHexString(config.getChangeMode()));
- builder.append(",valueType:0x" + Integer.toHexString(config.getValueType()));
- builder.append(",permission:0x" + Integer.toHexString(config.getPermissionModel()));
- builder.append(",zone:0x" + Integer.toHexString(
- config.hasZones() ? config.getZones() : 0));
- builder.append(",config:0x" + Integer.toHexString(config.getConfigArray(0)));
- builder.append(",fs min:" + config.getSampleRateMin());
- builder.append(",fs max:").append(config.getSampleRateMax());
- for (int i = 0; i < config.getFloatMaxsCount(); i++) {
- builder.append(",v min:" + config.getFloatMins(i));
- builder.append(",v max:" + config.getFloatMaxs(i));
- }
- for (int i = 0; i < config.getInt32MaxsCount(); i++) {
- builder.append(",v min:" + config.getInt32Mins(i));
- builder.append(",v max:" + config.getInt32Maxs(i));
- }
- for (int i = 0; i < config.getInt64MaxsCount(); i++) {
- builder.append(",v min:" + config.getInt64Mins(i));
- builder.append(",v max:" + config.getInt64Maxs(i));
+ StringBuilder builder = new StringBuilder()
+ .append("Property:0x").append(toHexString(config.prop))
+ .append(",access:0x").append(toHexString(config.access))
+ .append(",changeMode:0x").append(toHexString(config.changeMode))
+ .append(",permission:0x").append(toHexString(config.permissionModel))
+ .append(",areas:0x").append(toHexString(config.supportedAreas))
+ .append(",config:0x").append(Arrays.toString(config.configArray.toArray()))
+ .append(",fs min:").append(config.minSampleRate)
+ .append(",fs max:").append(config.maxSampleRate);
+ for (VehicleAreaConfig area : config.areaConfigs) {
+ builder.append(",areaId :").append(toHexString(area.areaId))
+ .append(",f min:").append(area.minFloatValue)
+ .append(",f max:").append(area.maxFloatValue)
+ .append(",i min:").append(area.minInt32Value)
+ .append(",i max:").append(area.maxInt32Value)
+ .append(",i64 min:").append(area.minInt64Value)
+ .append(",i64 max:").append(area.maxInt64Value);
}
writer.println(builder.toString());
}
@@ -396,35 +441,6 @@
}
}
- public static String dumpVehiclePropValue(VehiclePropValue value) {
- StringBuilder sb = new StringBuilder();
- sb.append("Property:0x" + Integer.toHexString(value.getProp()));
- sb.append(",timestamp:" + value.getTimestamp());
- sb.append(",value type:0x" + Integer.toHexString(value.getValueType()));
- sb.append(",zone:0x" + Integer.toHexString(value.getZone()));
- if (value.getInt32ValuesCount() > 0) {
- sb.append(",int32 values:");
- for (int i = 0; i < value.getInt32ValuesCount(); i++) {
- sb.append("," + value.getInt32Values(i));
- }
- }
- if (value.hasInt64Value()) {
- sb.append(",int64 value:" + value.getInt64Value());
- }
- if (value.getFloatValuesCount() > 0) {
- sb.append(",float values:");
- for (int i = 0; i < value.getFloatValuesCount(); i++) {
- sb.append("," + value.getFloatValues(i));
- }
- }
- if (value.hasStringValue()) {
- sb.append(",string value:" + value.getStringValue());
- }
- if (value.hasBytesValue()) {
- sb.append(",bytes value:" + value.getBytesValue());
- }
- return sb.toString();
- }
private static class VehiclePropertyEventInfo {
private int eventCount;
private VehiclePropValue lastEvent;
@@ -439,4 +455,76 @@
lastEvent = event;
}
}
+
+ final class VehiclePropValueSetter {
+ final WeakReference<HalClient> mClient;
+ final VehiclePropValue mPropValue;
+
+ private VehiclePropValueSetter(HalClient client, int propId, int areaId) {
+ mClient = new WeakReference<>(client);
+ mPropValue = new VehiclePropValue();
+ mPropValue.prop = propId;
+ mPropValue.areaId = areaId;
+ }
+
+ void to(boolean value) throws PropertyTimeoutException {
+ to(value ? 1 : 0);
+ }
+
+ void to(int value) throws PropertyTimeoutException {
+ mPropValue.value.int32Values.add(value);
+ submit();
+ }
+
+ void to(int[] values) throws PropertyTimeoutException {
+ for (int value : values) {
+ mPropValue.value.int32Values.add(value);
+ }
+ submit();
+ }
+
+ void to(Collection<Integer> values) throws PropertyTimeoutException {
+ mPropValue.value.int32Values.addAll(values);
+ submit();
+ }
+
+ void submit() throws PropertyTimeoutException {
+ HalClient client = mClient.get();
+ if (client != null) {
+ Log.i(CarLog.TAG_HAL, "set, property: 0x" + toHexString(mPropValue.prop)
+ + ", areaId: 0x" + toHexString(mPropValue.areaId));
+ client.setValue(mPropValue);
+ }
+ }
+ }
+
+ private static String dumpVehiclePropValue(VehiclePropValue value) {
+ final int MAX_BYTE_SIZE = 20;
+
+ StringBuilder sb = new StringBuilder()
+ .append("Property:0x").append(toHexString(value.prop))
+ .append(",timestamp:").append(value.timestamp)
+ .append(",zone:0x").append(toHexString(value.areaId))
+ .append(",floatValues: ").append(Arrays.toString(value.value.floatValues.toArray()))
+ .append(",int32Values: ").append(Arrays.toString(value.value.int32Values.toArray()))
+ .append(",int64Values: ")
+ .append(Arrays.toString(value.value.int64Values.toArray()));
+
+ if (value.value.bytes.size() > MAX_BYTE_SIZE) {
+ Object[] bytes = Arrays.copyOf(value.value.bytes.toArray(), MAX_BYTE_SIZE);
+ sb.append(",bytes: ").append(Arrays.toString(bytes));
+ } else {
+ sb.append(",bytes: ").append(Arrays.toString(value.value.bytes.toArray()));
+ }
+ sb.append(",string: ").append(value.value.stringValue);
+
+ return sb.toString();
+ }
+
+ private static VehiclePropValue createPropValue(int propId, int areaId) {
+ VehiclePropValue propValue = new VehiclePropValue();
+ propValue.prop = propId;
+ propValue.areaId = areaId;
+ return propValue;
+ }
}
diff --git a/service/src/com/android/car/hal/VendorExtensionHalService.java b/service/src/com/android/car/hal/VendorExtensionHalService.java
index adcc754..0630bae 100644
--- a/service/src/com/android/car/hal/VendorExtensionHalService.java
+++ b/service/src/com/android/car/hal/VendorExtensionHalService.java
@@ -16,13 +16,13 @@
package com.android.car.hal;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
+import android.hardware.vehicle.V2_0.VehiclePropertyGroup;
/**
* Implementation of {@link HalServiceBase} that responsible for custom properties that were defined
* by OEMs.
*/
-/*package*/ class VendorExtensionHalService extends PropertyHalServiceBase {
+public class VendorExtensionHalService extends PropertyHalServiceBase {
private final static String TAG = VendorExtensionHalService.class.getSimpleName();
private final static boolean DEBUG = false;
@@ -33,13 +33,15 @@
@Override
protected int managerToHalPropId(int managerPropId) {
- return VehiclePropValueUtil.isCustomProperty(managerPropId)
- ? managerPropId : NOT_SUPPORTED_PROPERTY;
+ return isVendorProperty(managerPropId) ? managerPropId : NOT_SUPPORTED_PROPERTY;
}
@Override
protected int halToManagerPropId(int halPropId) {
- return VehiclePropValueUtil.isCustomProperty(halPropId)
- ? halPropId : NOT_SUPPORTED_PROPERTY;
+ return isVendorProperty(halPropId) ? halPropId : NOT_SUPPORTED_PROPERTY;
+ }
+
+ private static boolean isVendorProperty(int property) {
+ return (property & VehiclePropertyGroup.MASK) == VehiclePropertyGroup.VENDOR;
}
}
\ No newline at end of file
diff --git a/service/src/com/android/car/pm/CarPackageManagerService.java b/service/src/com/android/car/pm/CarPackageManagerService.java
index 9f73b61..8a3bd94 100644
--- a/service/src/com/android/car/pm/CarPackageManagerService.java
+++ b/service/src/com/android/car/pm/CarPackageManagerService.java
@@ -31,8 +31,8 @@
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.ServiceInfo;
import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
import android.content.pm.Signature;
import android.content.res.Resources;
import android.os.Handler;
@@ -54,7 +54,6 @@
import com.android.internal.annotations.GuardedBy;
import java.io.PrintWriter;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
diff --git a/tests/EmbeddedKitchenSinkApp/Android.mk b/tests/EmbeddedKitchenSinkApp/Android.mk
index 1aba434..665d888 100644
--- a/tests/EmbeddedKitchenSinkApp/Android.mk
+++ b/tests/EmbeddedKitchenSinkApp/Android.mk
@@ -34,7 +34,10 @@
LOCAL_DEX_PREOPT := false
-LOCAL_STATIC_JAVA_LIBRARIES += car-systemtest
+LOCAL_STATIC_JAVA_LIBRARIES += \
+ android.hardware.vehicle@2.0-java-static \
+ vehicle-hal-support-lib \
+ car-service-lib-for-test \
LOCAL_JAVA_LIBRARIES += android.car
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/CarEmulator.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/CarEmulator.java
index 0cdcc32..9875049 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/CarEmulator.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/CarEmulator.java
@@ -16,365 +16,269 @@
package com.google.android.car.kitchensink;
+import static android.hardware.vehicle.V2_0.VehicleProperty.AUDIO_VOLUME_LIMIT;
+
import android.car.Car;
-import android.car.test.VehicleHalEmulator.VehicleHalPropertyHandler;
-import android.car.test.VehicleHalEmulator;
+import android.content.Context;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusIndex;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusRequest;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusState;
+import android.hardware.vehicle.V2_0.VehicleAudioVolumeIndex;
+import android.hardware.vehicle.V2_0.VehicleAudioVolumeLimitIndex;
+import android.hardware.vehicle.V2_0.VehicleHwKeyInputAction;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.hardware.vehicle.V2_0.VehiclePropertyAccess;
import android.os.SystemClock;
import android.util.SparseIntArray;
-import android.view.KeyEvent;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusRequest;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusState;
-import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePermissionModel;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
+import com.google.android.collect.Lists;
+
+import com.android.car.ICarImpl;
+import com.android.car.SystemInterface;
+import com.android.car.vehiclehal.VehiclePropValueBuilder;
+import com.android.car.vehiclehal.test.MockedVehicleHal;
+import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
+import com.android.car.vehiclehal.test.VehiclePropConfigBuilder;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
public class CarEmulator {
private final Car mCar;
- private final VehicleHalEmulator mHalEmulator;
+ private final MockedVehicleHal mHalEmulator;
private final AudioFocusPropertyHandler mAudioFocusPropertyHandler =
new AudioFocusPropertyHandler();
- private final AudioStreamStatePropertyHandler mAudioStreamStatePropertyHandler =
- new AudioStreamStatePropertyHandler();
private final AudioVolumeLimitPropertyHandler mAudioVolumeLimitPropertyHandler =
new AudioVolumeLimitPropertyHandler();
- private final SingleChannelVolumeHandler mVolumeHandler;
- private static final int STREAM_COUNT = 2;
- private static final int[] STREAM_MAX_VOLUME = {30, 30};
- private static final int[] STREAM_MIN_VOLUME = {0, 0};
- public CarEmulator(Car car) {
- mCar = car;
- mHalEmulator = new VehicleHalEmulator(car);
- List<Integer> maxVols = new ArrayList<>();
- List<Integer> minVols = new ArrayList<>();
- for(int i = 0; i < STREAM_COUNT; i++) {
- maxVols.add(STREAM_MAX_VOLUME[i]);
- minVols.add(STREAM_MIN_VOLUME[i]);
- }
- mVolumeHandler = new SingleChannelVolumeHandler(minVols, maxVols);
- int zones = (1<<maxVols.size()) - 1;
+ private static final Integer[] STREAM_MAX_VOLUME = {30, 30};
+
+ public static CarEmulator create(Context context) {
+ CarEmulator emulator = new CarEmulator(context);
+ emulator.init();
+ return emulator;
+ }
+
+ private CarEmulator(Context context) {
+ mHalEmulator = new MockedVehicleHal();
+ ICarImpl carService = new ICarImpl(context, mHalEmulator,
+ SystemInterface.getDefault(context));
+ mCar = new Car(context, carService, null /* Handler */);
+ }
+
+ public Car getCar() {
+ return mCar;
+ }
+
+ private void init() {
+ final int streamCount = STREAM_MAX_VOLUME.length;
+ SingleChannelVolumeHandler volumeHandler = new SingleChannelVolumeHandler(streamCount);
+
+ int supportedStreams = (1 << streamCount) - 1; // A bitwise mask of supported streams.
+
+ List<Integer> audioVolumeConfigArray = Lists.newArrayList(supportedStreams, 0, 0, 0);
+ audioVolumeConfigArray.addAll(Arrays.asList(STREAM_MAX_VOLUME));
mHalEmulator.addProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4,
- VehiclePermissionModel.VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
+ VehiclePropConfigBuilder.newBuilder(VehicleProperty.AUDIO_FOCUS).build(),
mAudioFocusPropertyHandler);
+ //TODO(b/32665590): no internal properties in Vehicle Hal 2.0
+// mHalEmulator.addProperty(
+// VehiclePropConfigUtil.getBuilder(
+// INTERNAL_AUDIO_STREAM_STATE,
+// VehiclePropertyAccess.READ_WRITE,
+// VehiclePropertyChangeMode.ON_CHANGE,
+// VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2,
+// VehiclePermissionModel.SYSTEM_APP_ONLY,
+// 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
+// NoOpPropertyHandler);
mHalEmulator.addProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_INTERNAL_AUDIO_STREAM_STATE,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2,
- VehiclePermissionModel.VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
- mAudioStreamStatePropertyHandler);
+ VehiclePropConfigBuilder.newBuilder(VehicleProperty.AUDIO_VOLUME)
+ .setConfigArray(audioVolumeConfigArray)
+ .build(),
+ volumeHandler);
mHalEmulator.addProperty(
- VehiclePropConfigUtil.getBuilder(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC3,
- VehiclePermissionModel.VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/,
- maxVols, minVols).setZones(zones).build(),
- mVolumeHandler);
- mHalEmulator.addProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2,
- VehiclePermissionModel.VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
+ VehiclePropConfigBuilder.newBuilder(VehicleProperty.AUDIO_VOLUME_LIMIT).build(),
mAudioVolumeLimitPropertyHandler);
mHalEmulator.addProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4,
- VehiclePermissionModel.VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
+ VehiclePropConfigBuilder.newBuilder(VehicleProperty.HW_KEY_INPUT)
+ .setAccess(VehiclePropertyAccess.READ)
+ .build(),
mHWKeyHandler);
}
public void start() {
- mHalEmulator.start();
}
public void stop() {
- mHalEmulator.stop();
}
public void setAudioFocusControl(boolean reject) {
mAudioFocusPropertyHandler.setAudioFocusControl(reject);
}
- public void injectVolumeKey(boolean volUp) {
- int[] values = {
- VehicleNetworkConsts.VehicleHwKeyInputAction.VEHICLE_HW_KEY_INPUT_ACTION_DOWN,
- volUp ? KeyEvent.KEYCODE_VOLUME_UP : KeyEvent.KEYCODE_VOLUME_DOWN, 0, 0 };
-
- VehiclePropValue injectValue = VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT, values,
- SystemClock.elapsedRealtimeNanos());
-
- mHalEmulator.injectEvent(injectValue);
-
- int[] upValues = {
- VehicleNetworkConsts.VehicleHwKeyInputAction.VEHICLE_HW_KEY_INPUT_ACTION_UP,
- volUp ? KeyEvent.KEYCODE_VOLUME_UP : KeyEvent.KEYCODE_VOLUME_DOWN, 0, 0 };
-
- injectValue = VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT, upValues,
- SystemClock.elapsedRealtimeNanos());
+ public void injectKey(int keyCode, int action) {
+ VehiclePropValue injectValue =
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.HW_KEY_INPUT)
+ .setTimestamp()
+ .addIntValue(action, keyCode, 0, 0)
+ .build();
mHalEmulator.injectEvent(injectValue);
}
- private final VehicleHalEmulator.VehicleHalPropertyHandler mHWKeyHandler =
- new VehicleHalEmulator.VehicleHalPropertyHandler() {
- @Override
- public void onPropertySet(VehiclePropValue value) {
- }
+ public void injectKey(int keyCode) {
+ injectKey(keyCode, VehicleHwKeyInputAction.ACTION_DOWN);
+ injectKey(keyCode, VehicleHwKeyInputAction.ACTION_UP);
+ }
+ private final VehicleHalPropertyHandler mHWKeyHandler =
+ new VehicleHalPropertyHandler() {
@Override
public VehiclePropValue onPropertyGet(VehiclePropValue value) {
- int[] values = {0, 0, 0, 0 };
- return VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT, values,
- SystemClock.elapsedRealtimeNanos());
- }
+ return VehiclePropValueBuilder.newBuilder(VehicleProperty.HW_KEY_INPUT)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(0, 0, 0, 0)
+ .build();
- @Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- }
-
- @Override
- public void onPropertyUnsubscribe(int property) {
}
};
private class AudioFocusPropertyHandler implements VehicleHalPropertyHandler {
private boolean mRejectFocus;
- private int mCurrentFocusState = VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS;
+ private int mCurrentFocusState = VehicleAudioFocusState.STATE_LOSS;
private int mCurrentFocusStreams = 0;
private int mCurrentFocusExtState = 0;
- public void setAudioFocusControl(boolean reject) {
- VehiclePropValue injectValue = null;
+ void setAudioFocusControl(boolean reject) {
+ boolean inject = false;
synchronized (this) {
if (reject) {
if (!mRejectFocus) {
- mCurrentFocusState = VehicleAudioFocusState
- .VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_EXLCUSIVE;
+ mCurrentFocusState = VehicleAudioFocusState.STATE_LOSS_TRANSIENT_EXLCUSIVE;
mCurrentFocusStreams = 0;
mCurrentFocusExtState = 0;
mRejectFocus = true;
- int[] values = { mCurrentFocusState, mCurrentFocusStreams,
- mCurrentFocusExtState, 0};
- injectValue = VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, values,
- SystemClock.elapsedRealtimeNanos());
+ inject = true;
}
} else {
if (mRejectFocus) {
- mCurrentFocusState = VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS;
+ mCurrentFocusState = VehicleAudioFocusState.STATE_LOSS;
mCurrentFocusStreams = 0;
mCurrentFocusExtState = 0;
- int[] values = { mCurrentFocusState, mCurrentFocusStreams,
- mCurrentFocusExtState, 0};
- injectValue = VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, values,
- SystemClock.elapsedRealtimeNanos());
+ inject = true;
}
mRejectFocus = false;
}
}
- if (injectValue != null) {
- mHalEmulator.injectEvent(injectValue);
+
+ if (inject) {
+ injectCurrentStateToHal();
}
}
@Override
public void onPropertySet(VehiclePropValue value) {
- VehiclePropValue injectValue = null;
synchronized (this) {
- if (mRejectFocus) {
- int[] values = { mCurrentFocusState, mCurrentFocusStreams,
- mCurrentFocusExtState, 0};
- injectValue = VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, values,
- SystemClock.elapsedRealtimeNanos());
- } else {
- int request = value.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_FOCUS);
- int requestedStreams = value.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_STREAMS);
- int requestedExtFocus = value.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_EXTERNAL_FOCUS_STATE);
- int response = VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS;
+ if (!mRejectFocus) {
+ ArrayList<Integer> v = value.value.int32Values;
+
+ int request = v.get(VehicleAudioFocusIndex.FOCUS);
+ int requestedStreams = v.get(VehicleAudioFocusIndex.STREAMS);
+ int requestedExtFocus = v.get(VehicleAudioFocusIndex.EXTERNAL_FOCUS_STATE);
+ int response = VehicleAudioFocusState.STATE_LOSS;
switch (request) {
- case VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN:
- response = VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN;
+ case VehicleAudioFocusRequest.REQUEST_GAIN:
+ response = VehicleAudioFocusState.STATE_GAIN;
break;
- case VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT:
- case VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK:
+ case VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT:
+ case VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT_MAY_DUCK:
response =
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT;
+ VehicleAudioFocusState.STATE_GAIN_TRANSIENT;
break;
- case VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE:
- response = VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS;
+ case VehicleAudioFocusRequest.REQUEST_RELEASE:
+ response = VehicleAudioFocusState.STATE_LOSS;
break;
}
mCurrentFocusState = response;
mCurrentFocusStreams = requestedStreams;
mCurrentFocusExtState = requestedExtFocus;
- int[] values = { mCurrentFocusState, mCurrentFocusStreams,
- mCurrentFocusExtState, 0};
- injectValue = VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, values,
- SystemClock.elapsedRealtimeNanos());
}
}
- if (injectValue != null) {
- mHalEmulator.injectEvent(injectValue);
- }
+ injectCurrentStateToHal();
+ }
+
+ private void injectCurrentStateToHal() {
+ mHalEmulator.injectEvent(VehiclePropValueBuilder.newBuilder(VehicleProperty.AUDIO_FOCUS)
+ .setTimestamp()
+ .addIntValue(mCurrentFocusState, mCurrentFocusStreams, mCurrentFocusExtState, 0)
+ .build());
}
@Override
public synchronized VehiclePropValue onPropertyGet(VehiclePropValue value) {
- int[] values = { mCurrentFocusState, mCurrentFocusStreams,
- mCurrentFocusExtState, 0};
- return VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, values,
- SystemClock.elapsedRealtimeNanos());
- }
-
- @Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- }
-
- @Override
- public void onPropertyUnsubscribe(int property) {
- }
- }
-
- private class AudioStreamStatePropertyHandler implements VehicleHalPropertyHandler {
- @Override
- public void onPropertySet(VehiclePropValue value) {
- }
-
- @Override
- public VehiclePropValue onPropertyGet(VehiclePropValue value) {
- //ignore
- return null;
- }
-
- @Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- }
-
- @Override
- public void onPropertyUnsubscribe(int property) {
+ return VehiclePropValueBuilder.newBuilder(VehicleProperty.AUDIO_FOCUS)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(mCurrentFocusState, mCurrentFocusStreams, mCurrentFocusExtState, 0)
+ .build();
}
}
private static class AudioVolumeLimitPropertyHandler implements VehicleHalPropertyHandler {
@Override
- public void onPropertySet(VehiclePropValue value) {
- }
-
- @Override
public VehiclePropValue onPropertyGet(VehiclePropValue value) {
- int stream = value.getInt32Values(
- VehicleNetworkConsts.VehicleAudioVolumeLimitIndex
- .VEHICLE_AUDIO_VOLUME_LIMIT_INDEX_STREAM);
+ int stream = value.value.int32Values.get(VehicleAudioVolumeLimitIndex.STREAM);
- int[] values = {stream, 20};
- VehiclePropValue propValue = VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT, values,
- SystemClock.elapsedRealtimeNanos());
- return propValue;
- }
-
- @Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- }
-
- @Override
- public void onPropertyUnsubscribe(int property) {
+ return VehiclePropValueBuilder.newBuilder(AUDIO_VOLUME_LIMIT)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(stream, 20)
+ .build();
}
}
- private class SingleChannelVolumeHandler implements
- VehicleHalEmulator.VehicleHalPropertyHandler {
- private final List<Integer> mMins;
- private final List<Integer> mMaxs;
+ private class SingleChannelVolumeHandler implements VehicleHalPropertyHandler {
private final SparseIntArray mCurrent;
- public SingleChannelVolumeHandler(List<Integer> mins, List<Integer> maxs) {
- mMins = mins;
- mMaxs = maxs;
- mCurrent = new SparseIntArray(mMins.size());
- // initialize the vol to be the min volume.
- for (int i = 0; i < mMins.size(); i++) {
- mCurrent.put(i, mMins.get(i));
+ SingleChannelVolumeHandler(int streamCount) {
+ mCurrent = new SparseIntArray(streamCount);
+ // Initialize the vol to be the min (mute) volume.
+ for (int i = 0; i < streamCount; i++) {
+ mCurrent.put(i, 0);
}
}
@Override
public void onPropertySet(VehiclePropValue value) {
- int stream = value.getInt32Values(
- VehicleNetworkConsts.VehicleAudioVolumeIndex.VEHICLE_AUDIO_VOLUME_INDEX_STREAM);
- int volume = value.getInt32Values(
- VehicleNetworkConsts.VehicleAudioVolumeIndex.VEHICLE_AUDIO_VOLUME_INDEX_VOLUME);
- int state = value.getInt32Values(
- VehicleNetworkConsts.VehicleAudioVolumeIndex.VEHICLE_AUDIO_VOLUME_INDEX_STATE);
+ ArrayList<Integer> v = value.value.int32Values;
- int[] values = {stream, volume, state};
- VehiclePropValue injectValue = VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME, values,
- SystemClock.elapsedRealtimeNanos());
+ int stream = v.get(VehicleAudioVolumeIndex.INDEX_STREAM);
+ int volume = v.get(VehicleAudioVolumeIndex.INDEX_VOLUME);
+ int state = v.get(VehicleAudioVolumeIndex.INDEX_STATE);
+
+ VehiclePropValue injectValue =
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.AUDIO_VOLUME)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(state, volume, state)
+ .build();
+
mCurrent.put(stream, volume);
mHalEmulator.injectEvent(injectValue);
}
@Override
public VehiclePropValue onPropertyGet(VehiclePropValue value) {
- int stream = value.getInt32Values(
- VehicleNetworkConsts.VehicleAudioVolumeIndex.VEHICLE_AUDIO_VOLUME_INDEX_STREAM);
-
+ int stream = value.value.int32Values.get(VehicleAudioVolumeIndex.INDEX_STREAM);
int volume = mCurrent.get(stream);
- int[] values = {stream, volume, 0};
- VehiclePropValue propValue = VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME, values,
- SystemClock.elapsedRealtimeNanos());
- return propValue;
- }
- @Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- }
-
- @Override
- public void onPropertyUnsubscribe(int property) {
+ return VehiclePropValueBuilder.newBuilder(VehicleProperty.AUDIO_VOLUME)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(stream, volume, 0)
+ .build();
}
}
}
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioTestFragment.java
index 079cc1e..dec0dc6 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioTestFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioTestFragment.java
@@ -42,6 +42,7 @@
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.RadioGroup;
import android.widget.TextView;
+import android.widget.Toast;
import android.widget.ToggleButton;
import com.google.android.car.kitchensink.CarEmulator;
@@ -421,7 +422,11 @@
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (mCarEmulator == null) {
- mCarEmulator = new CarEmulator(mCar);
+ //TODO(pavelm): need to do a full switch between emulated and normal mode
+ // all Car*Manager references should be invalidated.
+ Toast.makeText(AudioTestFragment.this.getContext(),
+ "Not supported yet :(", Toast.LENGTH_SHORT).show();
+ return;
}
if (isChecked) {
mRejectFocus.setActivated(true);
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/hvac/HvacTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/hvac/HvacTestFragment.java
index 476cc43..cb1a852 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/hvac/HvacTestFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/hvac/HvacTestFragment.java
@@ -22,6 +22,9 @@
import android.car.hardware.CarPropertyConfig;
import android.car.hardware.CarPropertyValue;
import android.car.hardware.hvac.CarHvacManager;
+import android.hardware.vehicle.V2_0.VehicleAreaWindow;
+import android.hardware.vehicle.V2_0.VehicleAreaZone;
+import android.hardware.vehicle.V2_0.VehicleHvacFanDirection;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
@@ -36,10 +39,6 @@
import com.google.android.car.kitchensink.R;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleHvacFanDirection;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleWindow;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZone;
-
import java.util.ArrayList;
import java.util.List;
@@ -98,21 +97,19 @@
break;
case CarHvacManager.ID_ZONED_FAN_POSITION:
switch((int)value.getValue()) {
- case VehicleHvacFanDirection.VEHICLE_HVAC_FAN_DIRECTION_FACE:
+ case VehicleHvacFanDirection.FACE:
mRbFanPositionFace.setChecked(true);
break;
- case VehicleHvacFanDirection.VEHICLE_HVAC_FAN_DIRECTION_FLOOR:
+ case VehicleHvacFanDirection.FLOOR:
mRbFanPositionFloor.setChecked(true);
break;
- case VehicleHvacFanDirection.
- VEHICLE_HVAC_FAN_DIRECTION_FACE_AND_FLOOR:
+ case VehicleHvacFanDirection.FACE_AND_FLOOR:
mRbFanPositionFaceAndFloor.setChecked(true);
break;
- case VehicleHvacFanDirection.VEHICLE_HVAC_FAN_DIRECTION_DEFROST:
+ case VehicleHvacFanDirection.DEFROST:
mRbFanPositionDefrost.setChecked(true);
break;
- case VehicleHvacFanDirection
- .VEHICLE_HVAC_FAN_DIRECTION_DEFROST_AND_FLOOR:
+ case VehicleHvacFanDirection.DEFROST_AND_FLOOR:
mRbFanPositionDefrostAndFloor.setChecked(true);
break;
default:
@@ -148,12 +145,12 @@
mTbMaxDefrost.setChecked((boolean)value.getValue());
break;
case CarHvacManager.ID_WINDOW_DEFROSTER_ON:
- if((zones & VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD) ==
- VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD) {
+ if((zones & VehicleAreaWindow.FRONT_WINDSHIELD) ==
+ VehicleAreaWindow.FRONT_WINDSHIELD) {
mTbDefrostFront.setChecked((boolean)value.getValue());
}
- if((zones & VehicleWindow.VEHICLE_WINDOW_REAR_WINDSHIELD) ==
- VehicleWindow.VEHICLE_WINDOW_REAR_WINDSHIELD) {
+ if((zones & VehicleAreaWindow.REAR_WINDSHIELD) ==
+ VehicleAreaWindow.REAR_WINDSHIELD) {
mTbDefrostRear.setChecked((boolean)value.getValue());
}
break;
@@ -325,19 +322,19 @@
int position;
switch(checkedId) {
case R.id.rbPositionFace:
- position = VehicleHvacFanDirection.VEHICLE_HVAC_FAN_DIRECTION_FACE;
+ position = VehicleHvacFanDirection.FACE;
break;
case R.id.rbPositionFloor:
- position = VehicleHvacFanDirection.VEHICLE_HVAC_FAN_DIRECTION_FLOOR;
+ position = VehicleHvacFanDirection.FLOOR;
break;
case R.id.rbPositionFaceAndFloor:
- position = VehicleHvacFanDirection.VEHICLE_HVAC_FAN_DIRECTION_FACE_AND_FLOOR;
+ position = VehicleHvacFanDirection.FACE_AND_FLOOR;
break;
case R.id.rbPositionDefrost:
- position = VehicleHvacFanDirection.VEHICLE_HVAC_FAN_DIRECTION_DEFROST;
+ position = VehicleHvacFanDirection.DEFROST;
break;
case R.id.rbPositionDefrostAndFloor:
- position = VehicleHvacFanDirection.VEHICLE_HVAC_FAN_DIRECTION_DEFROST_AND_FLOOR;
+ position = VehicleHvacFanDirection.DEFROST_AND_FLOOR;
break;
default:
throw new IllegalStateException("Unexpected fan position: " + checkedId);
@@ -418,12 +415,12 @@
mTempStep = 0.5f;
}
mZoneForSetTempD = 0;
- if (prop.hasArea(VehicleZone.VEHICLE_ZONE_ROW_1_LEFT)) {
- mZoneForSetTempD = VehicleZone.VEHICLE_ZONE_ROW_1_LEFT;
+ if (prop.hasArea(VehicleAreaZone.ROW_1_LEFT)) {
+ mZoneForSetTempD = VehicleAreaZone.ROW_1_LEFT;
}
mZoneForSetTempP = 0;
- if (prop.hasArea(VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT)) {
- mZoneForSetTempP = VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT;
+ if (prop.hasArea(VehicleAreaZone.ROW_1_RIGHT)) {
+ mZoneForSetTempP = VehicleAreaZone.ROW_1_RIGHT;
}
int[] areas = prop.getAreaIds();
if (mZoneForSetTempD == 0 && areas.length > 1) {
@@ -530,26 +527,26 @@
}
private void configureDefrosterOn(View v, CarPropertyConfig prop1) {
- if (prop1.hasArea(VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD)) {
+ if (prop1.hasArea(VehicleAreaWindow.FRONT_WINDSHIELD)) {
mTbDefrostFront = (ToggleButton) v.findViewById(R.id.tbDefrostFront);
mTbDefrostFront.setEnabled(true);
mTbDefrostFront.setOnClickListener(view -> {
try {
mCarHvacManager.setBooleanProperty(CarHvacManager.ID_WINDOW_DEFROSTER_ON,
- VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD,
+ VehicleAreaWindow.FRONT_WINDSHIELD,
mTbDefrostFront.isChecked());
} catch (CarNotConnectedException e) {
Log.e(TAG, "Failed to set HVAC window defroster property", e);
}
});
}
- if (prop1.hasArea(VehicleWindow.VEHICLE_WINDOW_REAR_WINDSHIELD)) {
+ if (prop1.hasArea(VehicleAreaWindow.REAR_WINDSHIELD)) {
mTbDefrostRear = (ToggleButton) v.findViewById(R.id.tbDefrostRear);
mTbDefrostRear.setEnabled(true);
mTbDefrostRear.setOnClickListener(view -> {
try {
mCarHvacManager.setBooleanProperty(CarHvacManager.ID_WINDOW_DEFROSTER_ON,
- VehicleWindow.VEHICLE_WINDOW_REAR_WINDSHIELD,
+ VehicleAreaWindow.REAR_WINDSHIELD,
mTbDefrostRear.isChecked());
} catch (CarNotConnectedException e) {
Log.e(TAG, "Failed to set HVAC window defroster property", e);
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/input/InputTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/input/InputTestFragment.java
index a177c00..ef8eb86 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/input/InputTestFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/input/InputTestFragment.java
@@ -17,42 +17,25 @@
import android.annotation.Nullable;
import android.annotation.StringRes;
-import android.car.Car;
-import android.car.CarNotConnectedException;
-import android.car.test.CarTestManager;
-import android.car.test.CarTestManagerBinderWrapper;
-import android.content.ComponentName;
-import android.content.ServiceConnection;
+import android.hardware.vehicle.V2_0.VehicleHwKeyInputAction;
import android.os.Bundle;
-import android.os.IBinder;
-import android.os.SystemClock;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
-import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
+import com.google.android.car.kitchensink.CarEmulator;
import com.google.android.car.kitchensink.R;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleHwKeyInputAction;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
-
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleHwKeyInputAction;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
-
-import com.google.android.car.kitchensink.R;
-
/**
* Test input event handling to system.
* vehicle hal should have VEHICLE_PROPERTY_HW_KEY_INPUT support for this to work.
@@ -63,10 +46,10 @@
private static final Button BREAK_LINE = null;
- private Car mCar;
- private CarTestManager mTestManager;
private final List<View> mButtons = new ArrayList<>();
+ private CarEmulator mCarEmulator;
+
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@@ -93,35 +76,9 @@
createButton(R.string.call_end, KeyEvent.KEYCODE_ENDCALL)
);
+ mCarEmulator = CarEmulator.create(getContext());
addButtonsToPanel((LinearLayout) view.findViewById(R.id.input_buttons), mButtons);
- mCar = Car.createCar(getContext(), new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- try {
- mTestManager = new CarTestManager(
- (CarTestManagerBinderWrapper) mCar.getCarManager(Car.TEST_SERVICE));
- } catch (CarNotConnectedException e) {
- throw new RuntimeException("Failed to create test service manager", e);
- }
- boolean hwKeySupported = mTestManager.isPropertySupported(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT);
- if (!hwKeySupported) {
- Log.w(TAG, "VEHICLE_PROPERTY_HW_KEY_INPUT not supported");
- }
-
- for (View v : mButtons) {
- if (v != null) {
- v.setEnabled(hwKeySupported);
- }
- }
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- }
- });
- mCar.connect();
return view;
}
@@ -139,50 +96,32 @@
return button;
}
- private void checkHwKeyInputSupported() {
- boolean hwKeyInputSupported = mTestManager.isPropertySupported(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT);
- if (!hwKeyInputSupported) {
- Log.w(TAG, "VEHICLE_PROPERTY_HW_KEY_INPUT not supported");
- }
-
- for (View v : mButtons) {
- if (v != null) {
- v.setEnabled(hwKeyInputSupported);
- }
- }
- }
-
private void handleTouchEvent(MotionEvent event, int keyCode) {
- int action = event.getActionMasked();
- Log.i(TAG, "handleTouchEvent, action:" + action + ",keyCode:" + keyCode);
- boolean shouldInject = false;
- boolean isDown = false;
- if (action == MotionEvent.ACTION_DOWN) {
- shouldInject = true;
- isDown = true;
- } else if (action == MotionEvent.ACTION_UP) {
- shouldInject = true;
- }
- if (shouldInject) {
- int[] values = { isDown ? VehicleHwKeyInputAction.VEHICLE_HW_KEY_INPUT_ACTION_DOWN :
- VehicleHwKeyInputAction.VEHICLE_HW_KEY_INPUT_ACTION_UP, keyCode, 0, 0 };
- long now = SystemClock.elapsedRealtimeNanos();
- mTestManager.injectEvent(VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT, values, now));
+ int androidAction = event.getActionMasked();
+ Log.i(TAG, "handleTouchEvent, action:" + androidAction + ",keyCode:" + keyCode);
+
+ switch (androidAction) {
+ case MotionEvent.ACTION_DOWN:
+ mCarEmulator.injectKey(keyCode, VehicleHwKeyInputAction.ACTION_DOWN);
+ break;
+ case MotionEvent.ACTION_UP:
+ mCarEmulator.injectKey(keyCode, VehicleHwKeyInputAction.ACTION_UP);
+ break;
+ default:
+ Log.w(TAG, "Unhandled touch action: " + androidAction);
+ break;
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
- mCar.disconnect();
}
private void addButtonsToPanel(LinearLayout root, List<View> buttons) {
LinearLayout panel = null;
for (View button : buttons) {
- if (button == BREAK_LINE) {
+ if (button == BREAK_LINE || panel == null) {
panel = new LinearLayout(getContext());
panel.setOrientation(LinearLayout.HORIZONTAL);
root.addView(panel);
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/volume/VolumeTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/volume/VolumeTestFragment.java
index 3bc34dd..6c987bb 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/volume/VolumeTestFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/volume/VolumeTestFragment.java
@@ -18,21 +18,18 @@
import android.car.Car;
import android.car.CarNotConnectedException;
import android.car.media.CarAudioManager;
-import android.content.ComponentName;
import android.content.Context;
-import android.content.ServiceConnection;
import android.media.AudioManager;
import android.media.IVolumeController;
import android.os.Bundle;
import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.util.SparseIntArray;
+import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -163,39 +160,30 @@
}
});
- mCar = Car.createCar(getContext(), new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- mCarEmulator = new CarEmulator(mCar);
- mCarEmulator.start();
- try {
- mCarAudioManager = (CarAudioManager) mCar.getCarManager(Car.AUDIO_SERVICE);
- initVolumeInfo();
- mCarAudioManager.setVolumeController(mVolumeController);
- } catch (CarNotConnectedException e) {
- Log.e(TAG, "Car not connected!");
+ mCarEmulator = CarEmulator.create(getContext());
+ mCar = mCarEmulator.getCar();
+ try {
+ mCarAudioManager = (CarAudioManager) mCar.getCarManager(Car.AUDIO_SERVICE);
+ initVolumeInfo();
+ mCarAudioManager.setVolumeController(mVolumeController);
+ } catch (CarNotConnectedException e) {
+ throw new RuntimeException(e); // Should never occur in car emulator.
+ }
- }
- }
- @Override
- public void onServiceDisconnected(ComponentName name) {
- }
- });
- mCar.connect();
mVolumeUp = (Button) v.findViewById(R.id.volume_up);
mVolumeDown = (Button) v.findViewById(R.id.volume_down);
mVolumeUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- mCarEmulator.injectVolumeKey(true);
+ mCarEmulator.injectKey(KeyEvent.KEYCODE_VOLUME_UP);
}
});
mVolumeDown.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- mCarEmulator.injectVolumeKey(false);
+ mCarEmulator.injectKey(KeyEvent.KEYCODE_VOLUME_DOWN);
}
});
diff --git a/tests/android_car_api_test/Android.mk b/tests/android_car_api_test/Android.mk
index 4048564..1489726 100644
--- a/tests/android_car_api_test/Android.mk
+++ b/tests/android_car_api_test/Android.mk
@@ -32,7 +32,9 @@
LOCAL_PROGUARD_ENABLED := disabled
-LOCAL_STATIC_JAVA_LIBRARIES += car-systemtest android-support-test
+LOCAL_STATIC_JAVA_LIBRARIES += \
+ android-support-test \
+ android.hardware.vehicle@2.0-java-static \
LOCAL_JAVA_LIBRARIES := android.car android.test.runner
diff --git a/tests/android_car_api_test/src/android/car/apitest/VehicleDoorTest.java b/tests/android_car_api_test/src/android/car/apitest/VehicleDoorTest.java
index 12998c8..53af5a5 100644
--- a/tests/android_car_api_test/src/android/car/apitest/VehicleDoorTest.java
+++ b/tests/android_car_api_test/src/android/car/apitest/VehicleDoorTest.java
@@ -16,28 +16,21 @@
package android.car.apitest;
import android.car.VehicleDoor;
+import android.hardware.vehicle.V2_0.VehicleAreaDoor;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-
@SmallTest
public class VehicleDoorTest extends AndroidTestCase {
public void testMatchWithVehicleHal() {
- assertEquals(VehicleNetworkConsts.VehicleDoor.VEHICLE_DOOR_HOOD, VehicleDoor.DOOR_HOOD);
- assertEquals(VehicleNetworkConsts.VehicleDoor.VEHICLE_DOOR_REAR, VehicleDoor.DOOR_REAR);
- assertEquals(VehicleNetworkConsts.VehicleDoor.VEHICLE_DOOR_ROW_1_LEFT,
- VehicleDoor.DOOR_ROW_1_LEFT);
- assertEquals(VehicleNetworkConsts.VehicleDoor.VEHICLE_DOOR_ROW_1_RIGHT,
- VehicleDoor.DOOR_ROW_1_RIGHT);
- assertEquals(VehicleNetworkConsts.VehicleDoor.VEHICLE_DOOR_ROW_2_LEFT,
- VehicleDoor.DOOR_ROW_2_LEFT);
- assertEquals(VehicleNetworkConsts.VehicleDoor.VEHICLE_DOOR_ROW_2_RIGHT,
- VehicleDoor.DOOR_ROW_2_RIGHT);
- assertEquals(VehicleNetworkConsts.VehicleDoor.VEHICLE_DOOR_ROW_3_LEFT,
- VehicleDoor.DOOR_ROW_3_LEFT);
- assertEquals(VehicleNetworkConsts.VehicleDoor.VEHICLE_DOOR_ROW_3_RIGHT,
- VehicleDoor.DOOR_ROW_3_RIGHT);
+ assertEquals(VehicleAreaDoor.HOOD, VehicleDoor.DOOR_HOOD);
+ assertEquals(VehicleAreaDoor.REAR, VehicleDoor.DOOR_REAR);
+ assertEquals(VehicleAreaDoor.ROW_1_LEFT, VehicleDoor.DOOR_ROW_1_LEFT);
+ assertEquals(VehicleAreaDoor.ROW_1_RIGHT, VehicleDoor.DOOR_ROW_1_RIGHT);
+ assertEquals(VehicleAreaDoor.ROW_2_LEFT, VehicleDoor.DOOR_ROW_2_LEFT);
+ assertEquals(VehicleAreaDoor.ROW_2_RIGHT, VehicleDoor.DOOR_ROW_2_RIGHT);
+ assertEquals(VehicleAreaDoor.ROW_3_LEFT, VehicleDoor.DOOR_ROW_3_LEFT);
+ assertEquals(VehicleAreaDoor.ROW_3_RIGHT, VehicleDoor.DOOR_ROW_3_RIGHT);
}
}
diff --git a/tests/android_car_api_test/src/android/car/apitest/VehicleSeatTest.java b/tests/android_car_api_test/src/android/car/apitest/VehicleSeatTest.java
index bbd85e9..36606dd 100644
--- a/tests/android_car_api_test/src/android/car/apitest/VehicleSeatTest.java
+++ b/tests/android_car_api_test/src/android/car/apitest/VehicleSeatTest.java
@@ -16,32 +16,22 @@
package android.car.apitest;
import android.car.VehicleSeat;
+import android.hardware.vehicle.V2_0.VehicleAreaSeat;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-
@SmallTest
public class VehicleSeatTest extends AndroidTestCase {
public void testMatchWithVehicleHal() {
- assertEquals(VehicleNetworkConsts.VehicleSeat.VEHICLE_SEAT_ROW_1_LEFT,
- VehicleSeat.SEAT_ROW_1_LEFT);
- assertEquals(VehicleNetworkConsts.VehicleSeat.VEHICLE_SEAT_ROW_1_CENTER,
- VehicleSeat.SEAT_ROW_1_CENTER);
- assertEquals(VehicleNetworkConsts.VehicleSeat.VEHICLE_SEAT_ROW_1_RIGHT,
- VehicleSeat.SEAT_ROW_1_RIGHT);
- assertEquals(VehicleNetworkConsts.VehicleSeat.VEHICLE_SEAT_ROW_2_LEFT,
- VehicleSeat.SEAT_ROW_2_LEFT);
- assertEquals(VehicleNetworkConsts.VehicleSeat.VEHICLE_SEAT_ROW_2_CENTER,
- VehicleSeat.SEAT_ROW_2_CENTER);
- assertEquals(VehicleNetworkConsts.VehicleSeat.VEHICLE_SEAT_ROW_2_RIGHT,
- VehicleSeat.SEAT_ROW_2_RIGHT);
- assertEquals(VehicleNetworkConsts.VehicleSeat.VEHICLE_SEAT_ROW_3_LEFT,
- VehicleSeat.SEAT_ROW_3_LEFT);
- assertEquals(VehicleNetworkConsts.VehicleSeat.VEHICLE_SEAT_ROW_3_CENTER,
- VehicleSeat.SEAT_ROW_3_CENTER);
- assertEquals(VehicleNetworkConsts.VehicleSeat.VEHICLE_SEAT_ROW_3_RIGHT,
- VehicleSeat.SEAT_ROW_3_RIGHT);
+ assertEquals(VehicleAreaSeat.ROW_1_LEFT, VehicleSeat.SEAT_ROW_1_LEFT);
+ assertEquals(VehicleAreaSeat.ROW_1_CENTER, VehicleSeat.SEAT_ROW_1_CENTER);
+ assertEquals(VehicleAreaSeat.ROW_1_RIGHT, VehicleSeat.SEAT_ROW_1_RIGHT);
+ assertEquals(VehicleAreaSeat.ROW_2_LEFT, VehicleSeat.SEAT_ROW_2_LEFT);
+ assertEquals(VehicleAreaSeat.ROW_2_CENTER, VehicleSeat.SEAT_ROW_2_CENTER);
+ assertEquals(VehicleAreaSeat.ROW_2_RIGHT, VehicleSeat.SEAT_ROW_2_RIGHT);
+ assertEquals(VehicleAreaSeat.ROW_3_LEFT, VehicleSeat.SEAT_ROW_3_LEFT);
+ assertEquals(VehicleAreaSeat.ROW_3_CENTER, VehicleSeat.SEAT_ROW_3_CENTER);
+ assertEquals(VehicleAreaSeat.ROW_3_RIGHT, VehicleSeat.SEAT_ROW_3_RIGHT);
}
}
diff --git a/tests/android_car_api_test/src/android/car/apitest/VehicleWindowTest.java b/tests/android_car_api_test/src/android/car/apitest/VehicleWindowTest.java
index 79677ed..7f1cfdf 100644
--- a/tests/android_car_api_test/src/android/car/apitest/VehicleWindowTest.java
+++ b/tests/android_car_api_test/src/android/car/apitest/VehicleWindowTest.java
@@ -16,32 +16,22 @@
package android.car.apitest;
import android.car.VehicleWindow;
+import android.hardware.vehicle.V2_0.VehicleAreaWindow;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-
@SmallTest
public class VehicleWindowTest extends AndroidTestCase {
public void testMatchWithVehicleHal() {
- assertEquals(VehicleNetworkConsts.VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD,
- VehicleWindow.WINDOW_FRONT_WINDSHIELD);
- assertEquals(VehicleNetworkConsts.VehicleWindow.VEHICLE_WINDOW_REAR_WINDSHIELD,
- VehicleWindow.WINDOW_REAR_WINDSHIELD);
- assertEquals(VehicleNetworkConsts.VehicleWindow.VEHICLE_WINDOW_ROOF_TOP,
- VehicleWindow.WINDOW_ROOF_TOP);
- assertEquals(VehicleNetworkConsts.VehicleWindow.VEHICLE_WINDOW_ROW_1_LEFT,
- VehicleWindow.WINDOW_ROW_1_LEFT);
- assertEquals(VehicleNetworkConsts.VehicleWindow.VEHICLE_WINDOW_ROW_1_RIGHT,
- VehicleWindow.WINDOW_ROW_1_RIGHT);
- assertEquals(VehicleNetworkConsts.VehicleWindow.VEHICLE_WINDOW_ROW_2_LEFT,
- VehicleWindow.WINDOW_ROW_2_LEFT);
- assertEquals(VehicleNetworkConsts.VehicleWindow.VEHICLE_WINDOW_ROW_2_RIGHT,
- VehicleWindow.WINDOW_ROW_2_RIGHT);
- assertEquals(VehicleNetworkConsts.VehicleWindow.VEHICLE_WINDOW_ROW_3_LEFT,
- VehicleWindow.WINDOW_ROW_3_LEFT);
- assertEquals(VehicleNetworkConsts.VehicleWindow.VEHICLE_WINDOW_ROW_3_RIGHT,
- VehicleWindow.WINDOW_ROW_3_RIGHT);
+ assertEquals(VehicleAreaWindow.FRONT_WINDSHIELD, VehicleWindow.WINDOW_FRONT_WINDSHIELD);
+ assertEquals(VehicleAreaWindow.REAR_WINDSHIELD, VehicleWindow.WINDOW_REAR_WINDSHIELD);
+ assertEquals(VehicleAreaWindow.ROOF_TOP, VehicleWindow.WINDOW_ROOF_TOP);
+ assertEquals(VehicleAreaWindow.ROW_1_LEFT, VehicleWindow.WINDOW_ROW_1_LEFT);
+ assertEquals(VehicleAreaWindow.ROW_1_RIGHT, VehicleWindow.WINDOW_ROW_1_RIGHT);
+ assertEquals(VehicleAreaWindow.ROW_2_LEFT, VehicleWindow.WINDOW_ROW_2_LEFT);
+ assertEquals(VehicleAreaWindow.ROW_2_RIGHT, VehicleWindow.WINDOW_ROW_2_RIGHT);
+ assertEquals(VehicleAreaWindow.ROW_3_LEFT, VehicleWindow.WINDOW_ROW_3_LEFT);
+ assertEquals(VehicleAreaWindow.ROW_3_RIGHT, VehicleWindow.WINDOW_ROW_3_RIGHT);
}
}
diff --git a/tests/android_car_api_test/src/android/car/apitest/VehicleZoneTest.java b/tests/android_car_api_test/src/android/car/apitest/VehicleZoneTest.java
index 93ff50a..794ef92 100644
--- a/tests/android_car_api_test/src/android/car/apitest/VehicleZoneTest.java
+++ b/tests/android_car_api_test/src/android/car/apitest/VehicleZoneTest.java
@@ -16,48 +16,30 @@
package android.car.apitest;
import android.car.VehicleZone;
+import android.hardware.vehicle.V2_0.VehicleAreaZone;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-
@SmallTest
public class VehicleZoneTest extends AndroidTestCase {
public void testMatchWithVehicleHal() {
- assertEquals(VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ALL, VehicleZone.ZONE_ALL);
- assertEquals(VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_1_ALL,
- VehicleZone.ZONE_ROW_1_ALL);
- assertEquals(VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_1_CENTER,
- VehicleZone.ZONE_ROW_1_CENTER);
- assertEquals(VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
- VehicleZone.ZONE_ROW_1_LEFT);
- assertEquals(VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT,
- VehicleZone.ZONE_ROW_1_RIGHT);
- assertEquals(VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_2_ALL,
- VehicleZone.ZONE_ROW_2_ALL);
- assertEquals(VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_2_CENTER,
- VehicleZone.ZONE_ROW_2_CENTER);
- assertEquals(VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_2_LEFT,
- VehicleZone.ZONE_ROW_2_LEFT);
- assertEquals(VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_2_RIGHT,
- VehicleZone.ZONE_ROW_2_RIGHT);
- assertEquals(VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_3_ALL,
- VehicleZone.ZONE_ROW_3_ALL);
- assertEquals(VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_3_CENTER,
- VehicleZone.ZONE_ROW_3_CENTER);
- assertEquals(VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_3_LEFT,
- VehicleZone.ZONE_ROW_3_LEFT);
- assertEquals(VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_3_RIGHT,
- VehicleZone.ZONE_ROW_3_RIGHT);
- assertEquals(VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_4_ALL,
- VehicleZone.ZONE_ROW_4_ALL);
- assertEquals(VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_4_CENTER,
- VehicleZone.ZONE_ROW_4_CENTER);
- assertEquals(VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_4_LEFT,
- VehicleZone.ZONE_ROW_4_LEFT);
- assertEquals(VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_4_RIGHT,
- VehicleZone.ZONE_ROW_4_RIGHT);
+ assertEquals(VehicleAreaZone.WHOLE_CABIN, VehicleZone.ZONE_ALL);
+ assertEquals(VehicleAreaZone.ROW_1, VehicleZone.ZONE_ROW_1_ALL);
+ assertEquals(VehicleAreaZone.ROW_1_CENTER, VehicleZone.ZONE_ROW_1_CENTER);
+ assertEquals(VehicleAreaZone.ROW_1_LEFT, VehicleZone.ZONE_ROW_1_LEFT);
+ assertEquals(VehicleAreaZone.ROW_1_RIGHT, VehicleZone.ZONE_ROW_1_RIGHT);
+ assertEquals(VehicleAreaZone.ROW_2, VehicleZone.ZONE_ROW_2_ALL);
+ assertEquals(VehicleAreaZone.ROW_2_CENTER, VehicleZone.ZONE_ROW_2_CENTER);
+ assertEquals(VehicleAreaZone.ROW_2_LEFT, VehicleZone.ZONE_ROW_2_LEFT);
+ assertEquals(VehicleAreaZone.ROW_2_RIGHT, VehicleZone.ZONE_ROW_2_RIGHT);
+ assertEquals(VehicleAreaZone.ROW_3, VehicleZone.ZONE_ROW_3_ALL);
+ assertEquals(VehicleAreaZone.ROW_3_CENTER, VehicleZone.ZONE_ROW_3_CENTER);
+ assertEquals(VehicleAreaZone.ROW_3_LEFT, VehicleZone.ZONE_ROW_3_LEFT);
+ assertEquals(VehicleAreaZone.ROW_3_RIGHT, VehicleZone.ZONE_ROW_3_RIGHT);
+ assertEquals(VehicleAreaZone.ROW_4, VehicleZone.ZONE_ROW_4_ALL);
+ assertEquals(VehicleAreaZone.ROW_4_CENTER, VehicleZone.ZONE_ROW_4_CENTER);
+ assertEquals(VehicleAreaZone.ROW_4_LEFT, VehicleZone.ZONE_ROW_4_LEFT);
+ assertEquals(VehicleAreaZone.ROW_4_RIGHT, VehicleZone.ZONE_ROW_4_RIGHT);
}
}
diff --git a/tests/carservice_test/Android.mk b/tests/carservice_test/Android.mk
index b8f7c00..dd7f8a3 100644
--- a/tests/carservice_test/Android.mk
+++ b/tests/carservice_test/Android.mk
@@ -33,6 +33,7 @@
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_STATIC_JAVA_LIBRARIES += car-service-lib-for-test \
+ vehicle-hal-support-lib \
car-systemtest \
android-support-test
diff --git a/tests/carservice_test/src/com/android/car/test/AppFocusTest.java b/tests/carservice_test/src/com/android/car/test/AppFocusTest.java
index b643f0f..b63383e 100644
--- a/tests/carservice_test/src/com/android/car/test/AppFocusTest.java
+++ b/tests/carservice_test/src/com/android/car/test/AppFocusTest.java
@@ -28,12 +28,6 @@
private static final String TAG = AppFocusTest.class.getSimpleName();
private static final long DEFAULT_WAIT_TIMEOUT_MS = 1000;
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- getVehicleHalEmulator().start();
- }
-
public void testFocusChange() throws Exception {
CarAppFocusManager manager = (CarAppFocusManager) getCar().getCarManager(
Car.APP_FOCUS_SERVICE);
diff --git a/tests/carservice_test/src/com/android/car/test/AudioRoutingPolicyTest.java b/tests/carservice_test/src/com/android/car/test/AudioRoutingPolicyTest.java
index 7831817..fa8c149 100644
--- a/tests/carservice_test/src/com/android/car/test/AudioRoutingPolicyTest.java
+++ b/tests/carservice_test/src/com/android/car/test/AudioRoutingPolicyTest.java
@@ -15,148 +15,126 @@
*/
package com.android.car.test;
-import android.car.test.VehicleHalEmulator.VehicleHalPropertyHandler;
+import android.hardware.vehicle.V2_0.VehicleAudioContextFlag;
+import android.hardware.vehicle.V2_0.VehicleAudioRoutingPolicyIndex;
+import android.hardware.vehicle.V2_0.VehiclePermissionModel;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.hardware.vehicle.V2_0.VehiclePropertyAccess;
import android.test.suitebuilder.annotation.SmallTest;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioContextFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioRoutingPolicyIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePermissionModel;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
+import com.google.android.collect.Lists;
+import com.android.car.vehiclehal.VehiclePropValueBuilder;
+import com.android.car.vehiclehal.test.MockedVehicleHal.FailingPropertyHandler;
+import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
+
+import java.util.ArrayList;
import java.util.LinkedList;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
@SmallTest
public class AudioRoutingPolicyTest extends MockedCarTestBase {
+ private static final String TAG = AudioRoutingPolicyTest.class.getSimpleName();
private static final long TIMEOUT_MS = 3000;
private final VehicleHalPropertyHandler mAudioRoutingPolicyHandler =
- new VehicleHalPropertyHandler() {
+ new FailingPropertyHandler() {
@Override
public void onPropertySet(VehiclePropValue value) {
handlePropertySetEvent(value);
}
-
- @Override
- public VehiclePropValue onPropertyGet(VehiclePropValue value) {
- fail("cannot get");
- return null;
- }
-
- @Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- fail("cannot subscribe");
- }
-
- @Override
- public void onPropertyUnsubscribe(int property) {
- fail("cannot unsubscribe");
- }
};
private final Semaphore mWaitSemaphore = new Semaphore(0);
- private final LinkedList<VehiclePropValue> mEvents = new LinkedList<VehiclePropValue>();
+ private final LinkedList<VehiclePropValue> mEvents = new LinkedList<>();
@Override
- protected void setUp() throws Exception {
+ protected synchronized void setUp() throws Exception {
super.setUp();
-
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2,
- VehiclePermissionModel.VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
- mAudioRoutingPolicyHandler);
}
- public void testNoHwVaraint() throws Exception {
- getVehicleHalEmulator().removeProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT);
- getVehicleHalEmulator().start();
+ @Override
+ protected synchronized void configureMockedHal() {
+ addProperty(VehicleProperty.AUDIO_ROUTING_POLICY, mAudioRoutingPolicyHandler)
+ .setAccess(VehiclePropertyAccess.WRITE)
+ .setPermissionModel(VehiclePermissionModel.SYSTEM_APP_ONLY);
+ }
+
+ public void testNoHwVariant() throws Exception {
checkPolicy0();
}
public void testHwVariant0() throws Exception {
- getVehicleHalEmulator().addStaticProperty(
- VehiclePropConfigUtil.createStaticStringProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT),
- VehiclePropValueUtil.createIntValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT, 0, 0));
- getVehicleHalEmulator().start();
+ addStaticProperty(VehicleProperty.AUDIO_HW_VARIANT,
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.AUDIO_HW_VARIANT)
+ .addIntValue(0)
+ .build())
+ .setConfigArray(Lists.newArrayList(0));
+
+ mEvents.clear();
+ reinitializeMockedHal();
+
checkPolicy0();
}
public void testHwVariantForTest() throws Exception {
- getVehicleHalEmulator().addStaticProperty(
- VehiclePropConfigUtil.createStaticStringProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT),
- VehiclePropValueUtil.createIntValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT, -1, 0));
- getVehicleHalEmulator().start();
+ addStaticProperty(VehicleProperty.AUDIO_HW_VARIANT,
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.AUDIO_HW_VARIANT)
+ .addIntValue(-1)
+ .build())
+ .setConfigArray(Lists.newArrayList(0));
+
+ mEvents.clear();
+ reinitializeMockedHal();
+
checkPolicyForTest();
}
private void checkPolicy0() throws Exception {
assertTrue(mWaitSemaphore.tryAcquire(TIMEOUT_MS, TimeUnit.MILLISECONDS));
- VehiclePropValue v = mEvents.get(0);
- assertEquals(0, v.getInt32Values(
- VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_STREAM));
- int contexts = v.getInt32Values(
- VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_CONTEXTS);
+ ArrayList<Integer> v = mEvents.get(0).value.int32Values;
+ assertEquals(0, v.get(VehicleAudioRoutingPolicyIndex.STREAM).intValue());
+ int contexts = v.get(VehicleAudioRoutingPolicyIndex.CONTEXTS);
// check if all contexts are allowed ones.
assertTrue((contexts & ~(
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG)) == 0);
+ VehicleAudioContextFlag.ALARM_FLAG |
+ VehicleAudioContextFlag.CALL_FLAG |
+ VehicleAudioContextFlag.MUSIC_FLAG |
+ VehicleAudioContextFlag.RADIO_FLAG |
+ VehicleAudioContextFlag.NAVIGATION_FLAG |
+ VehicleAudioContextFlag.NOTIFICATION_FLAG |
+ VehicleAudioContextFlag.UNKNOWN_FLAG |
+ VehicleAudioContextFlag.VOICE_COMMAND_FLAG |
+ VehicleAudioContextFlag.SYSTEM_SOUND_FLAG |
+ VehicleAudioContextFlag.SAFETY_ALERT_FLAG)) == 0);
}
private void checkPolicyForTest() throws Exception {
// write happens twice.
assertTrue(mWaitSemaphore.tryAcquire(TIMEOUT_MS, TimeUnit.MILLISECONDS));
assertTrue(mWaitSemaphore.tryAcquire(TIMEOUT_MS, TimeUnit.MILLISECONDS));
- VehiclePropValue v = mEvents.get(0);
- assertEquals(0, v.getInt32Values(
- VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_STREAM));
+ ArrayList<Integer> v = mEvents.get(0).value.int32Values;
+ assertEquals(0, v.get(VehicleAudioRoutingPolicyIndex.STREAM).intValue());
assertEquals(
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG,
- v.getInt32Values(
- VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_CONTEXTS)
- );
- v = mEvents.get(1);
- assertEquals(1, v.getInt32Values(
- VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_STREAM));
+ VehicleAudioContextFlag.CALL_FLAG |
+ VehicleAudioContextFlag.MUSIC_FLAG |
+ VehicleAudioContextFlag.RADIO_FLAG |
+ VehicleAudioContextFlag.UNKNOWN_FLAG,
+ v.get(VehicleAudioRoutingPolicyIndex.CONTEXTS).intValue());
+ v = mEvents.get(1).value.int32Values;
+ assertEquals(1, v.get(VehicleAudioRoutingPolicyIndex.STREAM).intValue());
assertEquals(
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG,
- v.getInt32Values(
- VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_CONTEXTS)
- );
+ VehicleAudioContextFlag.ALARM_FLAG |
+ VehicleAudioContextFlag.NAVIGATION_FLAG |
+ VehicleAudioContextFlag.NOTIFICATION_FLAG |
+ VehicleAudioContextFlag.VOICE_COMMAND_FLAG |
+ VehicleAudioContextFlag.SYSTEM_SOUND_FLAG |
+ VehicleAudioContextFlag.SAFETY_ALERT_FLAG,
+ v.get(VehicleAudioRoutingPolicyIndex.CONTEXTS).intValue());
}
private void handlePropertySetEvent(VehiclePropValue value) {
diff --git a/tests/carservice_test/src/com/android/car/test/CarAudioExtFocusTest.java b/tests/carservice_test/src/com/android/car/test/CarAudioExtFocusTest.java
index 2e8a5b5..fe0a646 100644
--- a/tests/carservice_test/src/com/android/car/test/CarAudioExtFocusTest.java
+++ b/tests/carservice_test/src/com/android/car/test/CarAudioExtFocusTest.java
@@ -15,31 +15,34 @@
*/
package com.android.car.test;
+import static android.hardware.vehicle.V2_0.VehicleProperty.AUDIO_FOCUS;
+import static java.lang.Integer.toHexString;
+
import android.car.Car;
import android.car.media.CarAudioManager;
-import android.car.test.VehicleHalEmulator.VehicleHalPropertyHandler;
import android.content.Context;
+import android.hardware.vehicle.V2_0.VehicleAudioContextFlag;
+import android.hardware.vehicle.V2_0.VehicleAudioExtFocusFlag;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusIndex;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusRequest;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusState;
+import android.hardware.vehicle.V2_0.VehicleAudioStream;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.hardware.vehicle.V2_0.VehiclePropertyAccess;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.os.SystemClock;
import android.test.suitebuilder.annotation.MediumTest;
import android.util.Log;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioContextFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioExtFocusFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusRequest;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusState;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioStream;
-import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePermissionModel;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
+import com.google.android.collect.Lists;
+import com.android.car.vehiclehal.VehiclePropValueBuilder;
+import com.android.car.vehiclehal.test.MockedVehicleHal.FailingPropertyHandler;
+import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
+
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.concurrent.Semaphore;
@@ -52,27 +55,11 @@
private static final long TIMEOUT_MS = 3000;
private final VehicleHalPropertyHandler mAudioRoutingPolicyPropertyHandler =
- new VehicleHalPropertyHandler() {
+ new FailingPropertyHandler() {
@Override
public void onPropertySet(VehiclePropValue value) {
//TODO
}
-
- @Override
- public VehiclePropValue onPropertyGet(VehiclePropValue value) {
- fail("cannot get");
- return null;
- }
-
- @Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- fail("cannot subscribe");
- }
-
- @Override
- public void onPropertyUnsubscribe(int property) {
- fail("cannot unsubscribe");
- }
};
private final FocusPropertyHandler mAudioFocusPropertyHandler =
@@ -93,6 +80,22 @@
private CarAudioManager mCarAudioManager;
@Override
+ protected synchronized void configureMockedHal() {
+ addProperty(VehicleProperty.AUDIO_ROUTING_POLICY, mAudioRoutingPolicyPropertyHandler);
+ addProperty(VehicleProperty.AUDIO_FOCUS, mAudioFocusPropertyHandler);
+
+ addStaticProperty(VehicleProperty.AUDIO_HW_VARIANT,
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.AUDIO_HW_VARIANT)
+ .addIntValue(-1)
+ .build())
+ .setConfigArray(Lists.newArrayList(0));
+
+ addProperty(VehicleProperty.AUDIO_EXT_ROUTING_HINT, mExtRoutingHintPropertyHandler)
+ .setAccess(VehiclePropertyAccess.WRITE)
+ .setConfigString(EXT_ROUTING_CONFIG);
+ }
+
+ @Override
protected void setUp() throws Exception {
super.setUp();
// AudioManager should be created in main thread to get focus event. :(
@@ -103,40 +106,6 @@
}
});
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2,
- VehiclePermissionModel.VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
- mAudioRoutingPolicyPropertyHandler);
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4,
- VehiclePermissionModel.VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
- mAudioFocusPropertyHandler);
- getVehicleHalEmulator().addStaticProperty(
- VehiclePropConfigUtil.createStaticStringProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT),
- VehiclePropValueUtil.createIntValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT, -1, 0));
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4,
- VehiclePermissionModel.VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).
- setConfigString(EXT_ROUTING_CONFIG).build(),
- mExtRoutingHintPropertyHandler);
- getVehicleHalEmulator().start();
mCarAudioManager = (CarAudioManager) getCar().getCarManager(Car.AUDIO_SERVICE);
assertNotNull(mCarAudioManager);
}
@@ -171,8 +140,7 @@
assertNotNull(attrb);
try {
- attrb = mCarAudioManager.getAudioAttributesForRadio(
- CarAudioManager.CAR_RADIO_TYPE_AM_FM_HD);
+ mCarAudioManager.getAudioAttributesForRadio(CarAudioManager.CAR_RADIO_TYPE_AM_FM_HD);
fail();
} catch (IllegalArgumentException e) {
// expected
@@ -193,7 +161,7 @@
assertNotNull(attrb);
try {
- attrb = mCarAudioManager.getAudioAttributesForExternalSource(
+ mCarAudioManager.getAudioAttributesForExternalSource(
CarAudioManager.CAR_RADIO_TYPE_AM_FM_HD);
fail();
} catch (IllegalArgumentException e) {
@@ -206,8 +174,8 @@
CarAudioManager.CAR_RADIO_TYPE_AM_FM);
assertNotNull(attrb);
checkSingleRequestRelease(attrb, AudioManager.AUDIOFOCUS_GAIN, new int[] {1, 0, 0, 0},
- 0, VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG);
+ 0, VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
+ VehicleAudioContextFlag.RADIO_FLAG);
}
public void testRadioSatelliteGainFocus() throws Exception {
@@ -215,8 +183,8 @@
CarAudioManager.CAR_RADIO_TYPE_SATELLITE);
assertNotNull(attrb);
checkSingleRequestRelease(attrb, AudioManager.AUDIOFOCUS_GAIN, new int[] {2, 0, 0, 0},
- 0, VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG);
+ 0, VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
+ VehicleAudioContextFlag.RADIO_FLAG);
}
public void testCdGainFocus() throws Exception {
@@ -224,8 +192,8 @@
CarAudioManager.CAR_EXTERNAL_SOURCE_TYPE_CD_DVD);
assertNotNull(attrb);
checkSingleRequestRelease(attrb, AudioManager.AUDIOFOCUS_GAIN, new int[] {0, 2, 0, 0},
- 0, VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CD_ROM_FLAG);
+ 0, VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
+ VehicleAudioContextFlag.CD_ROM_FLAG);
}
public void testAuxInFocus() throws Exception {
@@ -233,8 +201,8 @@
CarAudioManager.CAR_EXTERNAL_SOURCE_TYPE_AUX_IN0);
assertNotNull(attrb);
checkSingleRequestRelease(attrb, AudioManager.AUDIOFOCUS_GAIN, new int[] {0x1<<5, 0, 0, 0},
- 0, VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_AUX_AUDIO_FLAG);
+ 0, VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
+ VehicleAudioContextFlag.AUX_AUDIO_FLAG);
}
public void testExtNavInFocus() throws Exception {
@@ -242,8 +210,8 @@
CarAudioManager.CAR_EXTERNAL_SOURCE_TYPE_EXT_NAV_GUIDANCE);
assertNotNull(attrb);
checkSingleRequestRelease(attrb, AudioManager.AUDIOFOCUS_GAIN, new int[] {0x1<<4, 0, 0, 0},
- 0, VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_EXT_SOURCE_FLAG);
+ 0, VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
+ VehicleAudioContextFlag.EXT_SOURCE_FLAG);
}
public void testCustomInFocus() throws Exception {
@@ -251,8 +219,8 @@
"com.google.test.SOMETHING_SPECIAL");
assertNotNull(attrb);
checkSingleRequestRelease(attrb, AudioManager.AUDIOFOCUS_GAIN, new int[] {0, 0, 1, 0},
- 0, VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_EXT_SOURCE_FLAG);
+ 0, VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
+ VehicleAudioContextFlag.EXT_SOURCE_FLAG);
}
public void testMediaNavFocus() throws Exception {
@@ -263,16 +231,16 @@
AudioManager.AUDIOFOCUS_GAIN);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM0, request[1]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
+ assertEquals(0x1 << VehicleAudioStream.STREAM0, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
// nav guidance start
AudioFocusListener listenerNav = new AudioFocusListener();
@@ -280,45 +248,45 @@
setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION).
setUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE).
build();
- res = mAudioManager.requestAudioFocus(listenerNav, navAttrib,
+ mAudioManager.requestAudioFocus(listenerNav, navAttrib,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, 0);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
assertEquals(0x3, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG |
+ VehicleAudioContextFlag.NAVIGATION_FLAG, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN, request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioFocusState.STATE_GAIN, request[1],
+ VehicleAudioExtFocusFlag.NONE_FLAG);
// nav guidance done
mAudioManager.abandonAudioFocus(listenerNav);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM0, request[1]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
+ assertEquals(0x1 << VehicleAudioStream.STREAM0, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN, request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioFocusState.STATE_GAIN, request[1],
+ VehicleAudioExtFocusFlag.NONE_FLAG);
// music done
mAudioManager.abandonAudioFocus(listenerMusic);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_RELEASE, request[0]);
assertEquals(0, request[1]);
assertEquals(0, request[2]);
assertEquals(0, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS, request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioFocusState.STATE_LOSS, request[1],
+ VehicleAudioExtFocusFlag.NONE_FLAG);
}
public void testMediaExternalMediaNavFocus() throws Exception {
@@ -329,22 +297,22 @@
AudioManager.AUDIOFOCUS_GAIN);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM0, request[1]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
+ assertEquals(0x1 << VehicleAudioStream.STREAM0, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
// car plays external media (=outside Android)
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS,
+ VehicleAudioFocusState.STATE_LOSS,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT_FLAG);
+ VehicleAudioExtFocusFlag.PERMANENT_FLAG);
int focusChange = listenerMusic.waitAndGetFocusChange(TIMEOUT_MS);
assertEquals(AudioManager.AUDIOFOCUS_LOSS, focusChange);
@@ -354,38 +322,38 @@
setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION).
setUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE).
build();
- res = mAudioManager.requestAudioFocus(listenerNav, navAttrib,
+ mAudioManager.requestAudioFocus(listenerNav, navAttrib,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, 0);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT_MAY_DUCK,
request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM1, request[1]);
+ assertEquals(0x1 << VehicleAudioStream.STREAM1, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.NAVIGATION_FLAG, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT,
- 0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM1,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT_FLAG);
+ VehicleAudioFocusState.STATE_GAIN_TRANSIENT,
+ 0x1 << VehicleAudioStream.STREAM1,
+ VehicleAudioExtFocusFlag.PERMANENT_FLAG);
// nav guidance ends
mAudioManager.abandonAudioFocus(listenerNav);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_RELEASE, request[0]);
assertEquals(0, request[1]);
assertEquals(0, request[2]);
assertEquals(0, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS,
+ VehicleAudioFocusState.STATE_LOSS,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT_FLAG);
+ VehicleAudioExtFocusFlag.PERMANENT_FLAG);
// now ends external play
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS,
+ VehicleAudioFocusState.STATE_LOSS,
0,
0);
mAudioManager.abandonAudioFocus(listenerMusic);
@@ -404,17 +372,17 @@
radioAttributes, AudioManager.AUDIOFOCUS_GAIN, 0);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
assertEquals(0, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
+ assertEquals(VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.RADIO_FLAG, request[3]);
assertArrayEquals(new int[] {1, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG);
+ VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG);
//external nav
AudioFocusListener listenerNav = new AudioFocusListener();
@@ -424,44 +392,44 @@
extNavAttributes, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, 0);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN,
request[0]);
assertEquals(0, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
+ assertEquals(VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_EXT_SOURCE_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.RADIO_FLAG |
+ VehicleAudioContextFlag.EXT_SOURCE_FLAG, request[3]);
assertArrayEquals(new int[] {1 | 1<<4, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG);
+ VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG);
mAudioManager.abandonAudioFocus(listenerNav);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
assertEquals(0, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
+ assertEquals(VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.RADIO_FLAG, request[3]);
assertArrayEquals(new int[] {1, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG);
+ VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG);
mAudioManager.abandonAudioFocus(listenerRadio);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_RELEASE, request[0]);
assertEquals(0, request[1]);
assertEquals(0, request[2]);
assertEquals(0, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS,
+ VehicleAudioFocusState.STATE_LOSS,
0,
0);
}
@@ -474,16 +442,16 @@
AudioManager.AUDIOFOCUS_GAIN);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM0, request[1]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
+ assertEquals(0x1 << VehicleAudioStream.STREAM0, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
//external nav
AudioFocusListener listenerNav = new AudioFocusListener();
@@ -493,43 +461,43 @@
extNavAttributes, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, 0);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN,
request[0]);
assertEquals(0x1, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
+ assertEquals(VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_EXT_SOURCE_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG |
+ VehicleAudioContextFlag.EXT_SOURCE_FLAG, request[3]);
assertArrayEquals(new int[] {1<<4, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
0x1,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG);
+ VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG);
mAudioManager.abandonAudioFocus(listenerNav);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM0, request[1]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
+ assertEquals(0x1 << VehicleAudioStream.STREAM0, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
mAudioManager.abandonAudioFocus(listenerMusic);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_RELEASE, request[0]);
assertEquals(0, request[1]);
assertEquals(0, request[2]);
assertEquals(0, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS,
+ VehicleAudioFocusState.STATE_LOSS,
0,
0);
}
@@ -549,17 +517,17 @@
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, 0);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT_MAY_DUCK,
request[0]);
assertEquals(0x2, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.NAVIGATION_FLAG, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
//external nav
AudioFocusListener listenerExtNav = new AudioFocusListener();
@@ -569,43 +537,43 @@
extNavAttributes, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, 0);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN,
request[0]);
assertEquals(0, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
+ assertEquals(VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_EXT_SOURCE_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.EXT_SOURCE_FLAG, request[3]);
assertArrayEquals(new int[] {1<<4, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
0x1,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG);
+ VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG);
mAudioManager.abandonAudioFocus(listenerExtNav);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT_MAY_DUCK,
request[0]);
assertEquals(0x2, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.NAVIGATION_FLAG, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
mAudioManager.abandonAudioFocus(listenerIntNav);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_RELEASE, request[0]);
assertEquals(0, request[1]);
assertEquals(0, request[2]);
assertEquals(0, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS,
+ VehicleAudioFocusState.STATE_LOSS,
0,
0);
}
@@ -618,16 +586,16 @@
AudioManager.AUDIOFOCUS_GAIN);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM0, request[1]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
+ assertEquals(0x1 << VehicleAudioStream.STREAM0, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
// android radio
AudioFocusListener listenerRadio = new AudioFocusListener();
@@ -640,17 +608,17 @@
radioAttributes, AudioManager.AUDIOFOCUS_GAIN, 0);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
assertEquals(0, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
+ assertEquals(VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.RADIO_FLAG, request[3]);
assertArrayEquals(new int[] {1, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG);
+ VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG);
// nav guidance start
AudioFocusListener listenerNav = new AudioFocusListener();
@@ -661,35 +629,35 @@
res = mAudioManager.requestAudioFocus(listenerNav, navAttrib,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, 0);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN,
request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM1, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
+ assertEquals(0x1 << VehicleAudioStream.STREAM1, request[1]);
+ assertEquals(VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.NAVIGATION_FLAG |
+ VehicleAudioContextFlag.RADIO_FLAG, request[3]);
assertArrayEquals(new int[] {1, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
- 0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM1,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG);
+ VehicleAudioFocusState.STATE_GAIN,
+ 0x1 << VehicleAudioStream.STREAM1,
+ VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG);
// nav guidance ends
mAudioManager.abandonAudioFocus(listenerNav);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN,
request[0]);
assertEquals(0, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
+ assertEquals(VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.RADIO_FLAG, request[3]);
assertArrayEquals(new int[] {1, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG);
+ VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG);
// ends radio. music will get the focus GAIN.
// Music app is supposed to stop and release focus when it has lost focus, but here just
@@ -697,30 +665,30 @@
mAudioManager.abandonAudioFocus(listenerRadio);
listenerMusic.waitForFocus(TIMEOUT_MS, AudioManager.AUDIOFOCUS_GAIN);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM0, request[1]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
+ assertEquals(0x1 << VehicleAudioStream.STREAM0, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
- 0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM0,
+ VehicleAudioFocusState.STATE_GAIN,
+ 0x1 << VehicleAudioStream.STREAM0,
0);
// now music release focus.
mAudioManager.abandonAudioFocus(listenerMusic);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_RELEASE, request[0]);
assertEquals(0, request[1]);
assertEquals(0, request[2]);
assertEquals(0, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS,
+ VehicleAudioFocusState.STATE_LOSS,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
}
private void checkSingleRequestRelease(AudioAttributes attrb, int androidFocusToRequest,
@@ -730,22 +698,22 @@
int res = mCarAudioManager.requestAudioFocus(lister, attrb, androidFocusToRequest, 0);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- int expectedFocusRequest = VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE;
- int response = VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS;
+ int expectedFocusRequest = VehicleAudioFocusRequest.REQUEST_RELEASE;
+ int response = VehicleAudioFocusState.STATE_LOSS;
switch (androidFocusToRequest) {
case AudioManager.AUDIOFOCUS_GAIN:
- expectedFocusRequest = VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN;
- response = VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN;
+ expectedFocusRequest = VehicleAudioFocusRequest.REQUEST_GAIN;
+ response = VehicleAudioFocusState.STATE_GAIN;
break;
case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT:
expectedFocusRequest =
- VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT;
- response = VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT;
+ VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT;
+ response = VehicleAudioFocusState.STATE_GAIN_TRANSIENT;
break;
case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:
expectedFocusRequest =
- VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK;
- response = VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT;
+ VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT_MAY_DUCK;
+ response = VehicleAudioFocusState.STATE_GAIN_TRANSIENT;
break;
}
assertEquals(expectedFocusRequest, request[0]);
@@ -756,33 +724,33 @@
mAudioFocusPropertyHandler.sendAudioFocusState(
response,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
mAudioManager.abandonAudioFocus(lister);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_RELEASE, request[0]);
assertEquals(0, request[1]);
assertEquals(0, request[2]);
assertEquals(0, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS,
+ VehicleAudioFocusState.STATE_LOSS,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
}
public void testRadioMute() throws Exception {
testMediaMute(CarAudioManager.CAR_AUDIO_USAGE_RADIO,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG);
+ VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
+ VehicleAudioContextFlag.RADIO_FLAG);
}
public void testMusicMute() throws Exception {
testMediaMute(CarAudioManager.CAR_AUDIO_USAGE_MUSIC,
0x1,
0,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG);
+ VehicleAudioContextFlag.MUSIC_FLAG);
}
private void testMediaMute(int mediaUsage, int primaryStream, int extFocusFlag,
@@ -798,7 +766,7 @@
radioAttributes, AudioManager.AUDIOFOCUS_GAIN, 0);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
assertEquals(primaryStream, request[1]);
assertEquals(extFocusFlag, request[2]);
assertEquals(mediaContext, request[3]);
@@ -810,7 +778,7 @@
mExtRoutingHintPropertyHandler.getLastHint());
}
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
primaryStream,
extFocusFlag);
// now mute it.
@@ -818,18 +786,18 @@
Log.i(TAG, "mute media");
assertTrue(carAudioManager.setMediaMute(true));
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT,
request[0]);
assertEquals(0, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG,
+ assertEquals(VehicleAudioExtFocusFlag.MUTE_MEDIA_FLAG,
request[2]);
assertEquals(0, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG);
+ VehicleAudioExtFocusFlag.MUTE_MEDIA_FLAG);
assertTrue(carAudioManager.isMediaMuted());
// nav guidance on top of it
AudioFocusListener listenerNav = new AudioFocusListener();
@@ -841,42 +809,42 @@
res = mAudioManager.requestAudioFocus(listenerNav, navAttrib,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, 0);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT_MAY_DUCK,
request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM1, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG,
+ assertEquals(0x1 << VehicleAudioStream.STREAM1, request[1]);
+ assertEquals(VehicleAudioExtFocusFlag.MUTE_MEDIA_FLAG,
request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.NAVIGATION_FLAG, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
assertTrue(carAudioManager.isMediaMuted());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
- 0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM1,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG);
+ VehicleAudioFocusState.STATE_GAIN,
+ 0x1 << VehicleAudioStream.STREAM1,
+ VehicleAudioExtFocusFlag.MUTE_MEDIA_FLAG);
assertTrue(carAudioManager.isMediaMuted());
// nav guidance ends
mAudioManager.abandonAudioFocus(listenerNav);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT,
request[0]);
assertEquals(0, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG,
+ assertEquals(VehicleAudioExtFocusFlag.MUTE_MEDIA_FLAG,
request[2]);
assertEquals(0, request[3]);
assertArrayEquals(new int[] {0, 0, 0, 0},
mExtRoutingHintPropertyHandler.getLastHint());
assertTrue(carAudioManager.isMediaMuted());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG);
+ VehicleAudioExtFocusFlag.MUTE_MEDIA_FLAG);
// now unmute it. media should resume.
assertTrue(carAudioManager.isMediaMuted());
assertFalse(carAudioManager.setMediaMute(false));
assertFalse(carAudioManager.isMediaMuted());
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
assertEquals(primaryStream, request[1]);
assertEquals(extFocusFlag,
request[2]);
@@ -890,7 +858,7 @@
}
assertFalse(carAudioManager.isMediaMuted());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
primaryStream,
extFocusFlag);
assertFalse(carAudioManager.isMediaMuted());
@@ -926,7 +894,7 @@
protected static class FocusPropertyHandler implements VehicleHalPropertyHandler {
- private int mState = VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS;
+ private int mState = VehicleAudioFocusState.STATE_LOSS;
private int mStreams = 0;
private int mExtFocus = 0;
private int mRequest;
@@ -947,10 +915,11 @@
mStreams = streams;
mExtFocus = extFocus;
}
- int[] values = { state, streams, extFocus, 0 };
- mCarTest.getVehicleHalEmulator().injectEvent(VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, values,
- SystemClock.elapsedRealtimeNanos()));
+ mCarTest.getMockedVehicleHal().injectEvent(
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.AUDIO_FOCUS)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(state, streams, extFocus, 0)
+ .build());
}
public int[] waitForAudioFocusRequest(long timeoutMs) throws Exception {
@@ -965,47 +934,46 @@
@Override
public void onPropertySet(VehiclePropValue value) {
- assertEquals(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, value.getProp());
+ Log.i(TAG, "onPropertySet, prop: 0x" + toHexString(value.prop));
+ assertEquals(AUDIO_FOCUS, value.prop);
+ ArrayList<Integer> v = value.value.int32Values;
synchronized (this) {
- mRequest = value.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_FOCUS);
- mRequestedStreams = value.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_STREAMS);
- mRequestedExtFocus = value.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_EXTERNAL_FOCUS_STATE);
- mRequestedAudioContexts = value.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_AUDIO_CONTEXTS);
+ mRequest = v.get(VehicleAudioFocusIndex.FOCUS);
+ mRequestedStreams = v.get(VehicleAudioFocusIndex.STREAMS);
+ mRequestedExtFocus = v.get(VehicleAudioFocusIndex.EXTERNAL_FOCUS_STATE);
+ mRequestedAudioContexts = v.get(VehicleAudioFocusIndex.AUDIO_CONTEXTS);
}
+ Log.i(TAG, "onPropertySet, values: " + Arrays.toString(v.toArray()));
mSetWaitSemaphore.release();
}
@Override
public VehiclePropValue onPropertyGet(VehiclePropValue value) {
- assertEquals(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, value.getProp());
+ assertEquals(AUDIO_FOCUS, value.prop);
int state, streams, extFocus;
synchronized (this) {
state = mState;
streams = mStreams;
extFocus = mExtFocus;
}
- int[] values = { state, streams, extFocus, 0 };
- return VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, values,
- SystemClock.elapsedRealtimeNanos());
+ return VehiclePropValueBuilder.newBuilder(VehicleProperty.AUDIO_FOCUS)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(state, streams, extFocus, 0)
+ .build();
}
@Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- assertEquals(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, property);
+ public void onPropertySubscribe(int property, int zones, float sampleRate) {
+ assertEquals(AUDIO_FOCUS, property);
}
@Override
public void onPropertyUnsubscribe(int property) {
- assertEquals(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, property);
+ assertEquals(AUDIO_FOCUS, property);
}
}
- private static class ExtRoutingHintPropertyHandler implements VehicleHalPropertyHandler {
+ private static class ExtRoutingHintPropertyHandler extends FailingPropertyHandler {
private int[] mLastHint = {0, 0, 0, 0};
public int[] getLastHint() {
@@ -1018,30 +986,13 @@
@Override
public void onPropertySet(VehiclePropValue value) {
- assertEquals(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT,
- value.getProp());
- assertEquals(mLastHint.length, value.getInt32ValuesCount());
+ assertEquals(VehicleProperty.AUDIO_EXT_ROUTING_HINT, value.prop);
+ assertEquals(mLastHint.length, value.value.int32Values.size());
synchronized (this) {
for (int i = 0; i < mLastHint.length; i++) {
- mLastHint[i] = value.getInt32Values(i);
+ mLastHint[i] = value.value.int32Values.get(i);
}
}
}
-
- @Override
- public VehiclePropValue onPropertyGet(VehiclePropValue value) {
- fail("write only");
- return null;
- }
-
- @Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- fail("cannot subsctibe");
- }
-
- @Override
- public void onPropertyUnsubscribe(int property) {
- fail("cannot subsctibe");
- }
}
}
diff --git a/tests/carservice_test/src/com/android/car/test/CarAudioFocusSystemSoundTest.java b/tests/carservice_test/src/com/android/car/test/CarAudioFocusSystemSoundTest.java
index 72c585b..21f22b4 100644
--- a/tests/carservice_test/src/com/android/car/test/CarAudioFocusSystemSoundTest.java
+++ b/tests/carservice_test/src/com/android/car/test/CarAudioFocusSystemSoundTest.java
@@ -15,32 +15,32 @@
*/
package com.android.car.test;
+import static android.hardware.vehicle.V2_0.VehicleProperty.AUDIO_FOCUS;
+
import android.car.Car;
import android.car.media.CarAudioManager;
-import android.car.test.VehicleHalEmulator.VehicleHalPropertyHandler;
import android.content.Context;
+import android.hardware.vehicle.V2_0.VehicleAudioContextFlag;
+import android.hardware.vehicle.V2_0.VehicleAudioExtFocusFlag;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusIndex;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusRequest;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusState;
+import android.hardware.vehicle.V2_0.VehicleAudioStream;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.hardware.vehicle.V2_0.VehiclePropertyAccess;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.os.SystemClock;
import android.test.suitebuilder.annotation.MediumTest;
-import android.util.Log;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioContextFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioExtFocusFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusRequest;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusState;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioStream;
-import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePermissionModel;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
+import com.google.android.collect.Lists;
-import java.util.LinkedList;
+import com.android.car.vehiclehal.test.MockedVehicleHal.FailingPropertyHandler;
+import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
+import com.android.car.vehiclehal.VehiclePropValueBuilder;
+
+import java.util.ArrayList;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
@@ -54,37 +54,32 @@
private static final long TIMEOUT_MS = 3000;
private final VehicleHalPropertyHandler mAudioRoutingPolicyPropertyHandler =
- new VehicleHalPropertyHandler() {
+ new FailingPropertyHandler() {
@Override
public void onPropertySet(VehiclePropValue value) {
//TODO
}
-
- @Override
- public VehiclePropValue onPropertyGet(VehiclePropValue value) {
- fail("cannot get");
- return null;
- }
-
- @Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- fail("cannot subscribe");
- }
-
- @Override
- public void onPropertyUnsubscribe(int property) {
- fail("cannot unsubscribe");
- }
};
private final FocusPropertyHandler mAudioFocusPropertyHandler =
new FocusPropertyHandler(this);
- private final Semaphore mWaitSemaphore = new Semaphore(0);
- private final LinkedList<VehiclePropValue> mEvents = new LinkedList<VehiclePropValue>();
private AudioManager mAudioManager;
@Override
+ protected synchronized void configureMockedHal() {
+ addProperty(VehicleProperty.AUDIO_ROUTING_POLICY, mAudioRoutingPolicyPropertyHandler)
+ .setAccess(VehiclePropertyAccess.WRITE);
+ addProperty(VehicleProperty.AUDIO_FOCUS, mAudioFocusPropertyHandler);
+
+ addStaticProperty(VehicleProperty.AUDIO_HW_VARIANT,
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.AUDIO_HW_VARIANT)
+ .addIntValue(-1)
+ .build())
+ .setConfigArray(Lists.newArrayList(0));
+ }
+
+ @Override
protected void setUp() throws Exception {
super.setUp();
// AudioManager should be created in main thread to get focus event. :(
@@ -94,65 +89,41 @@
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
}
});
-
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2,
- VehiclePermissionModel.VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
- mAudioRoutingPolicyPropertyHandler);
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4,
- VehiclePermissionModel.VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
- mAudioFocusPropertyHandler);
- getVehicleHalEmulator().addStaticProperty(
- VehiclePropConfigUtil.createStaticStringProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT),
- VehiclePropValueUtil.createIntValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT, -1, 0));
- getVehicleHalEmulator().start();
}
private void notifyStreamState(int streamNumber, boolean active) {
int[] values = { active ? 1 : 0, streamNumber };
long now = SystemClock.elapsedRealtimeNanos();
- getVehicleHalEmulator().injectEvent(VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_INTERNAL_AUDIO_STREAM_STATE,values, now));
+ // TODO(pavelm): we don't have internal properties anymore.
+// getMockedVehicleHal().injectEvent(VehiclePropValueUtil.createIntVectorValue(
+// INTERNAL_AUDIO_STREAM_STATE, values, now));
}
public void testSystemSoundPlayStop() throws Exception {
//system sound start
notifyStreamState(1, true);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_NO_DUCK,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT_NO_DUCK,
request[0]);
assertEquals(0x2, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.SYSTEM_SOUND_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT,
+ VehicleAudioFocusState.STATE_GAIN_TRANSIENT,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
// system sound stop
notifyStreamState(1, false);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_RELEASE,
request[0]);
assertEquals(0, request[1]);
assertEquals(0, request[2]);
assertEquals(0, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS,
+ VehicleAudioFocusState.STATE_LOSS,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
}
public void testRadioSystemSound() throws Exception {
@@ -167,51 +138,51 @@
radioAttributes, AudioManager.AUDIOFOCUS_GAIN, 0);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
assertEquals(0, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
+ assertEquals(VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.RADIO_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG);
+ VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG);
// system sound start
notifyStreamState(1, true);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
assertEquals(0x2, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
+ assertEquals(VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.RADIO_FLAG |
+ VehicleAudioContextFlag.SYSTEM_SOUND_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG);
+ VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG);
// system sound stop
notifyStreamState(1, false);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
assertEquals(0, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
+ assertEquals(VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.RADIO_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG);
+ VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG);
// radio stop
mAudioManager.abandonAudioFocus(listenerRadio);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_RELEASE, request[0]);
assertEquals(0, request[1]);
assertEquals(0, request[2]);
assertEquals(0, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS,
+ VehicleAudioFocusState.STATE_LOSS,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
}
public void testMusicSystemSound() throws Exception {
@@ -222,48 +193,48 @@
AudioManager.AUDIOFOCUS_GAIN);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM0, request[1]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
+ assertEquals(0x1 << VehicleAudioStream.STREAM0, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
// system sound start
notifyStreamState(1, true);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
assertEquals(0x1 | 0x2, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG |
+ VehicleAudioContextFlag.SYSTEM_SOUND_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
// system sound stop
notifyStreamState(1, false);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM0, request[1]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
+ assertEquals(0x1 << VehicleAudioStream.STREAM0, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
// music stop
mAudioManager.abandonAudioFocus(listenerMusic);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_RELEASE, request[0]);
assertEquals(0, request[1]);
assertEquals(0, request[2]);
assertEquals(0, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS,
+ VehicleAudioFocusState.STATE_LOSS,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
}
public void testNavigationSystemSound() throws Exception {
@@ -277,15 +248,15 @@
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, 0);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT_MAY_DUCK,
request[0]);
assertEquals(0x2, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.NAVIGATION_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT,
+ VehicleAudioFocusState.STATE_GAIN_TRANSIENT,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
// system sound start
notifyStreamState(1, true);
// cannot distinguish this case from nav only. so no focus change.
@@ -296,20 +267,21 @@
// nav guidance stop
mAudioManager.abandonAudioFocus(listenerNav);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_RELEASE, request[0]);
assertEquals(0, request[1]);
assertEquals(0, request[2]);
assertEquals(0, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS,
+ VehicleAudioFocusState.STATE_LOSS,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
}
- protected static class AudioFocusListener implements AudioManager.OnAudioFocusChangeListener {
+ private static class AudioFocusListener implements AudioManager.OnAudioFocusChangeListener {
private final Semaphore mFocusChangeWait = new Semaphore(0);
private int mLastFocusChange;
+ // TODO: not used?
public int waitAndGetFocusChange(long timeoutMs) throws Exception {
if (!mFocusChangeWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
fail("timeout waiting for focus change");
@@ -332,9 +304,9 @@
}
}
- protected static class FocusPropertyHandler implements VehicleHalPropertyHandler {
+ private static class FocusPropertyHandler implements VehicleHalPropertyHandler {
- private int mState = VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS;
+ private int mState = VehicleAudioFocusState.STATE_LOSS;
private int mStreams = 0;
private int mExtFocus = 0;
private int mRequest;
@@ -345,23 +317,24 @@
private final Semaphore mSetWaitSemaphore = new Semaphore(0);
- public FocusPropertyHandler(MockedCarTestBase carTest) {
+ FocusPropertyHandler(MockedCarTestBase carTest) {
mCarTest = carTest;
}
- public void sendAudioFocusState(int state, int streams, int extFocus) {
+ void sendAudioFocusState(int state, int streams, int extFocus) {
synchronized (this) {
mState = state;
mStreams = streams;
mExtFocus = extFocus;
}
- int[] values = { state, streams, extFocus, 0 };
- mCarTest.getVehicleHalEmulator().injectEvent(VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, values,
- SystemClock.elapsedRealtimeNanos()));
+ mCarTest.getMockedVehicleHal().injectEvent(
+ VehiclePropValueBuilder.newBuilder(AUDIO_FOCUS)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(state, streams, extFocus, 0)
+ .build());
}
- public int[] waitForAudioFocusRequest(long timeoutMs) throws Exception {
+ int[] waitForAudioFocusRequest(long timeoutMs) throws Exception {
if (!mSetWaitSemaphore.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
fail("timeout");
}
@@ -371,7 +344,7 @@
}
}
- public void assertNoFocusRequest(long timeoutMs) throws Exception {
+ void assertNoFocusRequest(long timeoutMs) throws Exception {
if (mSetWaitSemaphore.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
fail("should not get focus request");
}
@@ -379,43 +352,40 @@
@Override
public void onPropertySet(VehiclePropValue value) {
- assertEquals(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, value.getProp());
+ assertEquals(AUDIO_FOCUS, value.prop);
+ ArrayList<Integer> v = value.value.int32Values;
synchronized (this) {
- mRequest = value.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_FOCUS);
- mRequestedStreams = value.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_STREAMS);
- mRequestedExtFocus = value.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_EXTERNAL_FOCUS_STATE);
- mRequestedAudioContexts = value.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_AUDIO_CONTEXTS);
+ mRequest = v.get(VehicleAudioFocusIndex.FOCUS);
+ mRequestedStreams = v.get(VehicleAudioFocusIndex.STREAMS);
+ mRequestedExtFocus = v.get(VehicleAudioFocusIndex.EXTERNAL_FOCUS_STATE);
+ mRequestedAudioContexts = v.get(VehicleAudioFocusIndex.AUDIO_CONTEXTS);
}
mSetWaitSemaphore.release();
}
@Override
public VehiclePropValue onPropertyGet(VehiclePropValue value) {
- assertEquals(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, value.getProp());
+ assertEquals(VehicleProperty.AUDIO_FOCUS, value.prop);
int state, streams, extFocus;
synchronized (this) {
state = mState;
streams = mStreams;
extFocus = mExtFocus;
}
- int[] values = { state, streams, extFocus, 0 };
- return VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, values,
- SystemClock.elapsedRealtimeNanos());
+ return VehiclePropValueBuilder.newBuilder(AUDIO_FOCUS)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(state, streams, extFocus, 0)
+ .build();
}
@Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- assertEquals(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, property);
+ public void onPropertySubscribe(int property, int zones, float sampleRate) {
+ assertEquals(VehicleProperty.AUDIO_FOCUS, property);
}
@Override
public void onPropertyUnsubscribe(int property) {
- assertEquals(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, property);
+ assertEquals(VehicleProperty.AUDIO_FOCUS, property);
}
}
}
diff --git a/tests/carservice_test/src/com/android/car/test/CarAudioFocusTest.java b/tests/carservice_test/src/com/android/car/test/CarAudioFocusTest.java
index da0b6ac..8cc2187 100644
--- a/tests/carservice_test/src/com/android/car/test/CarAudioFocusTest.java
+++ b/tests/carservice_test/src/com/android/car/test/CarAudioFocusTest.java
@@ -15,35 +15,37 @@
*/
package com.android.car.test;
+import static android.hardware.vehicle.V2_0.VehicleProperty.AUDIO_FOCUS;
+
import android.car.Car;
import android.car.media.CarAudioManager;
-import android.car.test.VehicleHalEmulator.VehicleHalPropertyHandler;
import android.content.Context;
+import android.hardware.vehicle.V2_0.VehicleAudioContextFlag;
+import android.hardware.vehicle.V2_0.VehicleAudioExtFocusFlag;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusIndex;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusRequest;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusState;
+import android.hardware.vehicle.V2_0.VehicleAudioStream;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.hardware.vehicle.V2_0.VehiclePropertyAccess;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.os.SystemClock;
import android.test.suitebuilder.annotation.MediumTest;
import android.util.Log;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioContextFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioExtFocusFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusRequest;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusState;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioStream;
-import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePermissionModel;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
+import com.google.android.collect.Lists;
-import java.util.LinkedList;
+import com.android.car.vehiclehal.VehiclePropValueBuilder;
+import com.android.car.vehiclehal.test.MockedVehicleHal.FailingPropertyHandler;
+import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
+
+import java.util.ArrayList;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
+// TODO: refactor all CarAudio*Test classes, they have a lot of common logic.
@MediumTest
public class CarAudioFocusTest extends MockedCarTestBase {
private static final String TAG = CarAudioFocusTest.class.getSimpleName();
@@ -51,37 +53,33 @@
private static final long TIMEOUT_MS = 3000;
private final VehicleHalPropertyHandler mAudioRoutingPolicyPropertyHandler =
- new VehicleHalPropertyHandler() {
+ new FailingPropertyHandler() {
@Override
public void onPropertySet(VehiclePropValue value) {
//TODO
}
-
- @Override
- public VehiclePropValue onPropertyGet(VehiclePropValue value) {
- fail("cannot get");
- return null;
- }
-
- @Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- fail("cannot subscribe");
- }
-
- @Override
- public void onPropertyUnsubscribe(int property) {
- fail("cannot unsubscribe");
- }
};
private final FocusPropertyHandler mAudioFocusPropertyHandler =
new FocusPropertyHandler(this);
- private final Semaphore mWaitSemaphore = new Semaphore(0);
- private final LinkedList<VehiclePropValue> mEvents = new LinkedList<VehiclePropValue>();
private AudioManager mAudioManager;
@Override
+ protected synchronized void configureMockedHal() {
+ addProperty(VehicleProperty.AUDIO_ROUTING_POLICY, mAudioRoutingPolicyPropertyHandler)
+ .setAccess(VehiclePropertyAccess.WRITE);
+
+ addProperty(VehicleProperty.AUDIO_FOCUS, mAudioFocusPropertyHandler);
+
+ addStaticProperty(VehicleProperty.AUDIO_HW_VARIANT,
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.AUDIO_HW_VARIANT)
+ .addIntValue(-1)
+ .build())
+ .setConfigArray(Lists.newArrayList(0));
+ }
+
+ @Override
protected void setUp() throws Exception {
super.setUp();
// AudioManager should be created in main thread to get focus event. :(
@@ -91,31 +89,6 @@
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
}
});
-
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2,
- VehiclePermissionModel.VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
- mAudioRoutingPolicyPropertyHandler);
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4,
- VehiclePermissionModel.VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
- mAudioFocusPropertyHandler);
- getVehicleHalEmulator().addStaticProperty(
- VehiclePropConfigUtil.createStaticStringProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT),
- VehiclePropValueUtil.createIntValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT, -1, 0));
- getVehicleHalEmulator().start();
}
public void testMediaGainFocus() throws Exception {
@@ -123,40 +96,40 @@
checkSingleRequestRelease(
AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN,
- VehicleAudioStream.VEHICLE_AUDIO_STREAM0,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG);
+ VehicleAudioStream.STREAM0,
+ VehicleAudioContextFlag.MUSIC_FLAG);
}
public void testMediaGainTransientFocus() throws Exception {
checkSingleRequestRelease(
AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT,
- VehicleAudioStream.VEHICLE_AUDIO_STREAM0,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG);
+ VehicleAudioStream.STREAM0,
+ VehicleAudioContextFlag.MUSIC_FLAG);
}
public void testMediaGainTransientMayDuckFocus() throws Exception {
checkSingleRequestRelease(
AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK,
- VehicleAudioStream.VEHICLE_AUDIO_STREAM0,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG);
+ VehicleAudioStream.STREAM0,
+ VehicleAudioContextFlag.MUSIC_FLAG);
}
public void testAlarmGainTransientFocus() throws Exception {
checkSingleRequestRelease(
AudioManager.STREAM_ALARM,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT,
- VehicleAudioStream.VEHICLE_AUDIO_STREAM1,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG);
+ VehicleAudioStream.STREAM1,
+ VehicleAudioContextFlag.ALARM_FLAG);
}
public void testAlarmGainTransientMayDuckFocus() throws Exception {
checkSingleRequestRelease(
AudioManager.STREAM_ALARM,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK,
- VehicleAudioStream.VEHICLE_AUDIO_STREAM1,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG);
+ VehicleAudioStream.STREAM1,
+ VehicleAudioContextFlag.ALARM_FLAG);
}
public void testMediaNavFocus() throws Exception {
@@ -167,14 +140,14 @@
AudioManager.AUDIOFOCUS_GAIN);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM0, request[1]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
+ assertEquals(0x1 << VehicleAudioStream.STREAM0, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
// nav guidance start
AudioFocusListener listenerNav = new AudioFocusListener();
@@ -182,39 +155,39 @@
setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION).
setUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE).
build();
- res = mAudioManager.requestAudioFocus(listenerNav, navAttrib,
+ mAudioManager.requestAudioFocus(listenerNav, navAttrib,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, 0);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
assertEquals(0x3, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG |
+ VehicleAudioContextFlag.NAVIGATION_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN, request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioFocusState.STATE_GAIN, request[1],
+ VehicleAudioExtFocusFlag.NONE_FLAG);
// nav guidance done
mAudioManager.abandonAudioFocus(listenerNav);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM0, request[1]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
+ assertEquals(0x1 << VehicleAudioStream.STREAM0, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN, request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioFocusState.STATE_GAIN, request[1],
+ VehicleAudioExtFocusFlag.NONE_FLAG);
// music done
mAudioManager.abandonAudioFocus(listenerMusic);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_RELEASE, request[0]);
assertEquals(0, request[1]);
assertEquals(0, request[2]);
assertEquals(0, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS, request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioFocusState.STATE_LOSS, request[1],
+ VehicleAudioExtFocusFlag.NONE_FLAG);
}
public void testMediaExternalMediaNavFocus() throws Exception {
@@ -225,20 +198,20 @@
AudioManager.AUDIOFOCUS_GAIN);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM0, request[1]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
+ assertEquals(0x1 << VehicleAudioStream.STREAM0, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
// car plays external media (=outside Android)
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS,
+ VehicleAudioFocusState.STATE_LOSS,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT_FLAG);
+ VehicleAudioExtFocusFlag.PERMANENT_FLAG);
int focusChange = listenerMusic.waitAndGetFocusChange(TIMEOUT_MS);
assertEquals(AudioManager.AUDIOFOCUS_LOSS, focusChange);
@@ -248,34 +221,34 @@
setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION).
setUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE).
build();
- res = mAudioManager.requestAudioFocus(listenerNav, navAttrib,
+ mAudioManager.requestAudioFocus(listenerNav, navAttrib,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, 0);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT_MAY_DUCK,
request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM1, request[1]);
+ assertEquals(0x1 << VehicleAudioStream.STREAM1, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.NAVIGATION_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT,
- 0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM1,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT_FLAG);
+ VehicleAudioFocusState.STATE_GAIN_TRANSIENT,
+ 0x1 << VehicleAudioStream.STREAM1,
+ VehicleAudioExtFocusFlag.PERMANENT_FLAG);
// nav guidance ends
mAudioManager.abandonAudioFocus(listenerNav);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_RELEASE, request[0]);
assertEquals(0, request[1]);
assertEquals(0, request[2]);
assertEquals(0, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS,
+ VehicleAudioFocusState.STATE_LOSS,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT_FLAG);
+ VehicleAudioExtFocusFlag.PERMANENT_FLAG);
// now ends external play
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS,
+ VehicleAudioFocusState.STATE_LOSS,
0,
0);
mAudioManager.abandonAudioFocus(listenerMusic);
@@ -290,14 +263,14 @@
AudioManager.AUDIOFOCUS_GAIN);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM0, request[1]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
+ assertEquals(0x1 << VehicleAudioStream.STREAM0, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
// android radio
AudioFocusListener listenerRadio = new AudioFocusListener();
@@ -310,15 +283,15 @@
radioAttributes, AudioManager.AUDIOFOCUS_GAIN, 0);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
assertEquals(0, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
+ assertEquals(VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.RADIO_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG);
+ VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG);
// nav guidance start
AudioFocusListener listenerNav = new AudioFocusListener();
@@ -329,31 +302,31 @@
res = mAudioManager.requestAudioFocus(listenerNav, navAttrib,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, 0);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN,
request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM1, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
+ assertEquals(0x1 << VehicleAudioStream.STREAM1, request[1]);
+ assertEquals(VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG |
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.NAVIGATION_FLAG |
+ VehicleAudioContextFlag.RADIO_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
- 0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM1,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG);
+ VehicleAudioFocusState.STATE_GAIN,
+ 0x1 << VehicleAudioStream.STREAM1,
+ VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG);
// nav guidance ends
mAudioManager.abandonAudioFocus(listenerNav);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN,
request[0]);
assertEquals(0, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
+ assertEquals(VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.RADIO_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG);
+ VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG);
// ends radio. music will get the focus GAIN.
// Music app is supposed to stop and release focus when it has lost focus, but here just
@@ -361,26 +334,26 @@
mAudioManager.abandonAudioFocus(listenerRadio);
listenerMusic.waitForFocus(TIMEOUT_MS, AudioManager.AUDIOFOCUS_GAIN);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM0, request[1]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
+ assertEquals(0x1 << VehicleAudioStream.STREAM0, request[1]);
assertEquals(0, request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.MUSIC_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
- 0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM0,
+ VehicleAudioFocusState.STATE_GAIN,
+ 0x1 << VehicleAudioStream.STREAM0,
0);
// now music release focus.
mAudioManager.abandonAudioFocus(listenerMusic);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_RELEASE, request[0]);
assertEquals(0, request[1]);
assertEquals(0, request[2]);
assertEquals(0, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS,
+ VehicleAudioFocusState.STATE_LOSS,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
}
private void checkSingleRequestRelease(int streamType, int androidFocus, int streamNumber,
@@ -392,22 +365,22 @@
androidFocus);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- int expectedRequest = VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE;
- int response = VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS;
+ int expectedRequest = VehicleAudioFocusRequest.REQUEST_RELEASE;
+ int response = VehicleAudioFocusState.STATE_LOSS;
switch (androidFocus) {
case AudioManager.AUDIOFOCUS_GAIN:
- expectedRequest = VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN;
- response = VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN;
+ expectedRequest = VehicleAudioFocusRequest.REQUEST_GAIN;
+ response = VehicleAudioFocusState.STATE_GAIN;
break;
case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT:
expectedRequest =
- VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT;
- response = VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT;
+ VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT;
+ response = VehicleAudioFocusState.STATE_GAIN_TRANSIENT;
break;
case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:
expectedRequest =
- VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK;
- response = VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT;
+ VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT_MAY_DUCK;
+ response = VehicleAudioFocusState.STATE_GAIN_TRANSIENT;
break;
}
assertEquals(expectedRequest, request[0]);
@@ -417,31 +390,31 @@
mAudioFocusPropertyHandler.sendAudioFocusState(
response,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
mAudioManager.abandonAudioFocus(lister);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_RELEASE, request[0]);
assertEquals(0, request[1]);
assertEquals(0, request[2]);
assertEquals(0, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS,
+ VehicleAudioFocusState.STATE_LOSS,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
}
public void testRadioMute() throws Exception {
doTestMediaMute(CarAudioManager.CAR_AUDIO_USAGE_RADIO,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG);
+ VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG,
+ VehicleAudioContextFlag.RADIO_FLAG);
}
public void testMusicMute() throws Exception {
doTestMediaMute(CarAudioManager.CAR_AUDIO_USAGE_MUSIC,
0x1,
0,
- VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG);
+ VehicleAudioContextFlag.MUSIC_FLAG);
}
private void doTestMediaMute(int mediaUsage, int primaryStream, int extFocusFlag,
@@ -457,12 +430,12 @@
radioAttributes, AudioManager.AUDIOFOCUS_GAIN, 0);
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
assertEquals(primaryStream, request[1]);
assertEquals(extFocusFlag, request[2]);
assertEquals(mediaContext, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
primaryStream,
extFocusFlag);
// now mute it.
@@ -470,16 +443,16 @@
Log.i(TAG, "mute media");
assertTrue(carAudioManager.setMediaMute(true));
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT,
request[0]);
assertEquals(0, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG,
+ assertEquals(VehicleAudioExtFocusFlag.MUTE_MEDIA_FLAG,
request[2]);
assertEquals(0, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG);
+ VehicleAudioExtFocusFlag.MUTE_MEDIA_FLAG);
assertTrue(carAudioManager.isMediaMuted());
// nav guidance on top of it
AudioFocusListener listenerNav = new AudioFocusListener();
@@ -491,45 +464,45 @@
res = mAudioManager.requestAudioFocus(listenerNav, navAttrib,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, 0);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT_MAY_DUCK,
request[0]);
- assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM1, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG,
+ assertEquals(0x1 << VehicleAudioStream.STREAM1, request[1]);
+ assertEquals(VehicleAudioExtFocusFlag.MUTE_MEDIA_FLAG,
request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.NAVIGATION_FLAG, request[3]);
assertTrue(carAudioManager.isMediaMuted());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
- 0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM1,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG);
+ VehicleAudioFocusState.STATE_GAIN,
+ 0x1 << VehicleAudioStream.STREAM1,
+ VehicleAudioExtFocusFlag.MUTE_MEDIA_FLAG);
assertTrue(carAudioManager.isMediaMuted());
// nav guidance ends
mAudioManager.abandonAudioFocus(listenerNav);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT,
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT,
request[0]);
assertEquals(0, request[1]);
- assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG,
+ assertEquals(VehicleAudioExtFocusFlag.MUTE_MEDIA_FLAG,
request[2]);
assertEquals(0, request[3]);
assertTrue(carAudioManager.isMediaMuted());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
0,
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG);
+ VehicleAudioExtFocusFlag.MUTE_MEDIA_FLAG);
// now unmute it. radio should resume.
assertTrue(carAudioManager.isMediaMuted());
assertFalse(carAudioManager.setMediaMute(false));
assertFalse(carAudioManager.isMediaMuted());
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
- assertEquals(VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN, request[0]);
+ assertEquals(VehicleAudioFocusRequest.REQUEST_GAIN, request[0]);
assertEquals(primaryStream, request[1]);
assertEquals(extFocusFlag,
request[2]);
assertEquals(mediaContext, request[3]);
assertFalse(carAudioManager.isMediaMuted());
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
primaryStream,
extFocusFlag);
assertFalse(carAudioManager.isMediaMuted());
@@ -537,18 +510,18 @@
mAudioManager.abandonAudioFocus(listenerMedia);
}
- protected static class AudioFocusListener implements AudioManager.OnAudioFocusChangeListener {
+ static class AudioFocusListener implements AudioManager.OnAudioFocusChangeListener {
private final Semaphore mFocusChangeWait = new Semaphore(0);
private int mLastFocusChange;
- public int waitAndGetFocusChange(long timeoutMs) throws Exception {
+ int waitAndGetFocusChange(long timeoutMs) throws Exception {
if (!mFocusChangeWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
fail("timeout waiting for focus change");
}
return mLastFocusChange;
}
- public void waitForFocus(long timeoutMs, int expectedFocus) throws Exception {
+ void waitForFocus(long timeoutMs, int expectedFocus) throws Exception {
while (mLastFocusChange != expectedFocus) {
if (!mFocusChangeWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
fail("timeout waiting for focus change");
@@ -563,9 +536,9 @@
}
}
- protected static class FocusPropertyHandler implements VehicleHalPropertyHandler {
+ static class FocusPropertyHandler implements VehicleHalPropertyHandler {
- private int mState = VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS;
+ private int mState = VehicleAudioFocusState.STATE_LOSS;
private int mStreams = 0;
private int mExtFocus = 0;
private int mRequest;
@@ -576,23 +549,24 @@
private final Semaphore mSetWaitSemaphore = new Semaphore(0);
- public FocusPropertyHandler(MockedCarTestBase carTest) {
+ FocusPropertyHandler(MockedCarTestBase carTest) {
mCarTest = carTest;
}
- public void sendAudioFocusState(int state, int streams, int extFocus) {
+ void sendAudioFocusState(int state, int streams, int extFocus) {
synchronized (this) {
mState = state;
mStreams = streams;
mExtFocus = extFocus;
}
- int[] values = { state, streams, extFocus, 0 };
- mCarTest.getVehicleHalEmulator().injectEvent(VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, values,
- SystemClock.elapsedRealtimeNanos()));
+ mCarTest.getMockedVehicleHal().injectEvent(
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.AUDIO_FOCUS)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(state, streams, extFocus, 0)
+ .build());
}
- public int[] waitForAudioFocusRequest(long timeoutMs) throws Exception {
+ int[] waitForAudioFocusRequest(long timeoutMs) throws Exception {
if (!mSetWaitSemaphore.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
fail("timeout");
}
@@ -604,43 +578,40 @@
@Override
public void onPropertySet(VehiclePropValue value) {
- assertEquals(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, value.getProp());
+ assertEquals(VehicleProperty.AUDIO_FOCUS, value.prop);
+ ArrayList<Integer> v = value.value.int32Values;
synchronized (this) {
- mRequest = value.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_FOCUS);
- mRequestedStreams = value.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_STREAMS);
- mRequestedExtFocus = value.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_EXTERNAL_FOCUS_STATE);
- mRequestedAudioContexts = value.getInt32Values(
- VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_AUDIO_CONTEXTS);
+ mRequest = v.get(VehicleAudioFocusIndex.FOCUS);
+ mRequestedStreams = v.get(VehicleAudioFocusIndex.STREAMS);
+ mRequestedExtFocus = v.get(VehicleAudioFocusIndex.EXTERNAL_FOCUS_STATE);
+ mRequestedAudioContexts = v.get(VehicleAudioFocusIndex.AUDIO_CONTEXTS);
}
mSetWaitSemaphore.release();
}
@Override
public VehiclePropValue onPropertyGet(VehiclePropValue value) {
- assertEquals(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, value.getProp());
+ assertEquals(VehicleProperty.AUDIO_FOCUS, value.prop);
int state, streams, extFocus;
synchronized (this) {
state = mState;
streams = mStreams;
extFocus = mExtFocus;
}
- int[] values = { state, streams, extFocus, 0 };
- return VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, values,
- SystemClock.elapsedRealtimeNanos());
+ return VehiclePropValueBuilder.newBuilder(VehicleProperty.AUDIO_FOCUS)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(state, streams, extFocus, 0)
+ .build();
}
@Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- assertEquals(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, property);
+ public void onPropertySubscribe(int property, int zones, float sampleRate) {
+ assertEquals(AUDIO_FOCUS, property);
}
@Override
public void onPropertyUnsubscribe(int property) {
- assertEquals(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, property);
+ assertEquals(AUDIO_FOCUS, property);
}
}
}
diff --git a/tests/carservice_test/src/com/android/car/test/CarCabinManagerTest.java b/tests/carservice_test/src/com/android/car/test/CarCabinManagerTest.java
index bf13bda..7024250 100644
--- a/tests/carservice_test/src/com/android/car/test/CarCabinManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/test/CarCabinManagerTest.java
@@ -17,22 +17,19 @@
package com.android.car.test;
import android.car.Car;
+import android.car.hardware.CarPropertyValue;
import android.car.hardware.cabin.CarCabinManager;
import android.car.hardware.cabin.CarCabinManager.CarCabinEventCallback;
-import android.car.hardware.CarPropertyValue;
-import android.car.test.VehicleHalEmulator;
+import android.hardware.vehicle.V2_0.VehicleAreaDoor;
+import android.hardware.vehicle.V2_0.VehicleAreaWindow;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.os.SystemClock;
import android.test.suitebuilder.annotation.MediumTest;
import android.util.Log;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleDoor;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleWindow;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
+import com.android.car.vehiclehal.VehiclePropValueBuilder;
+import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
import java.util.HashMap;
import java.util.concurrent.Semaphore;
@@ -47,63 +44,52 @@
private CarCabinManager mCarCabinManager;
private boolean mEventBoolVal;
- private float mEventFloatVal;
private int mEventIntVal;
private int mEventZoneVal;
@Override
+ protected synchronized void configureMockedHal() {
+ CabinPropertyHandler handler = new CabinPropertyHandler();
+ addProperty(VehicleProperty.DOOR_LOCK, handler)
+ .setSupportedAreas(VehicleAreaDoor.ROW_1_LEFT);
+ addProperty(VehicleProperty.WINDOW_POS, handler)
+ .setSupportedAreas(VehicleAreaWindow.ROW_1_LEFT);
+ }
+
+ @Override
protected void setUp() throws Exception {
super.setUp();
mAvailable = new Semaphore(0);
- CabinPropertyHandler handler = new CabinPropertyHandler();
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.createZonedProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_DOOR_LOCK,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN,
- VehicleNetworkConsts.VehicleDoor.VEHICLE_DOOR_ROW_1_LEFT,
- 0), handler);
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.createZonedProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_WINDOW_POS,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32,
- VehicleWindow.VEHICLE_WINDOW_ROW_1_LEFT,
- 0), handler);
-
- getVehicleHalEmulator().start();
mCarCabinManager = (CarCabinManager) getCar().getCarManager(Car.CABIN_SERVICE);
}
// Test a boolean property
public void testCabinDoorLockOn() throws Exception {
mCarCabinManager.setBooleanProperty(CarCabinManager.ID_DOOR_LOCK,
- VehicleDoor.VEHICLE_DOOR_ROW_1_LEFT, true);
+ VehicleAreaDoor.ROW_1_LEFT, true);
boolean lock = mCarCabinManager.getBooleanProperty(CarCabinManager.ID_DOOR_LOCK,
- VehicleDoor.VEHICLE_DOOR_ROW_1_LEFT);
+ VehicleAreaDoor.ROW_1_LEFT);
assertTrue(lock);
mCarCabinManager.setBooleanProperty(CarCabinManager.ID_DOOR_LOCK,
- VehicleDoor.VEHICLE_DOOR_ROW_1_LEFT, false);
+ VehicleAreaDoor.ROW_1_LEFT, false);
lock = mCarCabinManager.getBooleanProperty(CarCabinManager.ID_DOOR_LOCK,
- VehicleDoor.VEHICLE_DOOR_ROW_1_LEFT);
+ VehicleAreaDoor.ROW_1_LEFT);
assertFalse(lock);
}
// Test an integer property
public void testCabinWindowPos() throws Exception {
mCarCabinManager.setIntProperty(CarCabinManager.ID_WINDOW_POS,
- VehicleWindow.VEHICLE_WINDOW_ROW_1_LEFT, 50);
+ VehicleAreaWindow.ROW_1_LEFT, 50);
int windowPos = mCarCabinManager.getIntProperty(CarCabinManager.ID_WINDOW_POS,
- VehicleWindow.VEHICLE_WINDOW_ROW_1_LEFT);
+ VehicleAreaWindow.ROW_1_LEFT);
assertEquals(50, windowPos);
mCarCabinManager.setIntProperty(CarCabinManager.ID_WINDOW_POS,
- VehicleWindow.VEHICLE_WINDOW_ROW_1_LEFT, 25);
+ VehicleAreaWindow.ROW_1_LEFT, 25);
windowPos = mCarCabinManager.getIntProperty(CarCabinManager.ID_WINDOW_POS,
- VehicleWindow.VEHICLE_WINDOW_ROW_1_LEFT);
+ VehicleAreaWindow.ROW_1_LEFT);
assertEquals(25, windowPos);
}
@@ -112,47 +98,52 @@
mCarCabinManager.registerCallback(new EventListener());
// Inject a boolean event and wait for its callback in onPropertySet.
- VehiclePropValue v = VehiclePropValueUtil.createZonedBooleanValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_DOOR_LOCK,
- VehicleDoor.VEHICLE_DOOR_ROW_1_LEFT, true, 0);
+ VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.DOOR_LOCK)
+ .setAreaId(VehicleAreaDoor.ROW_1_LEFT)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(1)
+ .build();
+
assertEquals(0, mAvailable.availablePermits());
- getVehicleHalEmulator().injectEvent(v);
+ getMockedVehicleHal().injectEvent(v);
assertTrue(mAvailable.tryAcquire(2L, TimeUnit.SECONDS));
assertTrue(mEventBoolVal);
- assertEquals(mEventZoneVal, VehicleDoor.VEHICLE_DOOR_ROW_1_LEFT);
+ assertEquals(VehicleAreaDoor.ROW_1_LEFT, mEventZoneVal);
// Inject an integer event and wait for its callback in onPropertySet.
- v = VehiclePropValueUtil.createZonedIntValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_WINDOW_POS,
- VehicleWindow.VEHICLE_WINDOW_ROW_1_LEFT, 75, 0);
+ v = VehiclePropValueBuilder.newBuilder(VehicleProperty.WINDOW_POS)
+ .setAreaId(VehicleAreaWindow.ROW_1_LEFT)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(75)
+ .build();
+
assertEquals(0, mAvailable.availablePermits());
- getVehicleHalEmulator().injectEvent(v);
+ getMockedVehicleHal().injectEvent(v);
assertTrue(mAvailable.tryAcquire(2L, TimeUnit.SECONDS));
assertEquals(mEventIntVal, 75);
- assertEquals(mEventZoneVal, VehicleWindow.VEHICLE_WINDOW_ROW_1_LEFT);
+ assertEquals(VehicleAreaWindow.ROW_1_LEFT, mEventZoneVal);
}
- private class CabinPropertyHandler
- implements VehicleHalEmulator.VehicleHalPropertyHandler {
+ private class CabinPropertyHandler implements VehicleHalPropertyHandler {
HashMap<Integer, VehiclePropValue> mMap = new HashMap<>();
@Override
public synchronized void onPropertySet(VehiclePropValue value) {
- mMap.put(value.getProp(), value);
+ mMap.put(value.prop, value);
}
@Override
public synchronized VehiclePropValue onPropertyGet(VehiclePropValue value) {
- VehiclePropValue currentValue = mMap.get(value.getProp());
- // VNS will call getProperty method when subscribe is called, just return empty value.
+ VehiclePropValue currentValue = mMap.get(value.prop);
+ // VNS will call get method when subscribe is called, just return empty value.
return currentValue != null ? currentValue : value;
}
@Override
- public synchronized void onPropertySubscribe(int property, float sampleRate, int zones) {
+ public synchronized void onPropertySubscribe(int property, int zones, float sampleRate) {
Log.d(TAG, "onPropertySubscribe property " + property + " sampleRate " + sampleRate);
}
@@ -163,7 +154,7 @@
}
private class EventListener implements CarCabinEventCallback {
- public EventListener() { }
+ EventListener() { }
@Override
public void onChangeEvent(final CarPropertyValue value) {
diff --git a/tests/carservice_test/src/com/android/car/test/CarHvacManagerTest.java b/tests/carservice_test/src/com/android/car/test/CarHvacManagerTest.java
index c422173..8510e4c 100644
--- a/tests/carservice_test/src/com/android/car/test/CarHvacManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/test/CarHvacManagerTest.java
@@ -17,22 +17,21 @@
package com.android.car.test;
import android.car.Car;
+import android.car.hardware.CarPropertyValue;
import android.car.hardware.hvac.CarHvacManager;
import android.car.hardware.hvac.CarHvacManager.CarHvacEventCallback;
-import android.car.hardware.CarPropertyValue;
-import android.car.test.VehicleHalEmulator;
+import android.hardware.vehicle.V2_0.VehicleAreaWindow;
+import android.hardware.vehicle.V2_0.VehicleAreaZone;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.hardware.vehicle.V2_0.VehiclePropertyAccess;
+import android.hardware.vehicle.V2_0.VehiclePropertyChangeMode;
+import android.os.SystemClock;
import android.test.suitebuilder.annotation.MediumTest;
import android.util.Log;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleWindow;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZone;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
+import com.android.car.vehiclehal.VehiclePropValueBuilder;
+import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
import java.util.HashMap;
import java.util.concurrent.Semaphore;
@@ -52,89 +51,69 @@
private int mEventZoneVal;
@Override
+ protected synchronized void configureMockedHal() {
+ HvacPropertyHandler handler = new HvacPropertyHandler();
+ addProperty(VehicleProperty.HVAC_DEFROSTER, handler)
+ .setSupportedAreas(VehicleAreaWindow.FRONT_WINDSHIELD);
+ addProperty(VehicleProperty.HVAC_FAN_SPEED, handler)
+ .setSupportedAreas(VehicleAreaZone.ROW_1_LEFT);
+ addProperty(VehicleProperty.HVAC_TEMPERATURE_SET, handler)
+ .setSupportedAreas(VehicleAreaZone.ROW_1_LEFT);
+ addProperty(VehicleProperty.HVAC_TEMPERATURE_CURRENT, handler)
+ .setChangeMode(VehiclePropertyChangeMode.CONTINUOUS)
+ .setAccess(VehiclePropertyAccess.READ)
+ .setSupportedAreas(VehicleAreaZone.ROW_1);
+ }
+
+ @Override
protected void setUp() throws Exception {
super.setUp();
mAvailable = new Semaphore(0);
- HvacPropertyHandler handler = new HvacPropertyHandler();
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.createZonedProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_DEFROSTER,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN,
- VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD,
- 0), handler);
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.createZonedProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_SPEED,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
- 0), handler);
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.createZonedProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
- 0), handler);
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.createZonedProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_CONTINUOUS,
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT,
- VehicleZone.VEHICLE_ZONE_ROW_1_ALL,
- 0), handler);
-
- getVehicleHalEmulator().start();
mCarHvacManager = (CarHvacManager) getCar().getCarManager(Car.HVAC_SERVICE);
}
// Test a boolean property
public void testHvacRearDefrosterOn() throws Exception {
mCarHvacManager.setBooleanProperty(CarHvacManager.ID_WINDOW_DEFROSTER_ON,
- VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD, true);
+ VehicleAreaWindow.FRONT_WINDSHIELD, true);
boolean defrost = mCarHvacManager.getBooleanProperty(CarHvacManager.ID_WINDOW_DEFROSTER_ON,
- VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD);
+ VehicleAreaWindow.FRONT_WINDSHIELD);
assertTrue(defrost);
mCarHvacManager.setBooleanProperty(CarHvacManager.ID_WINDOW_DEFROSTER_ON,
- VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD, false);
+ VehicleAreaWindow.FRONT_WINDSHIELD, false);
defrost = mCarHvacManager.getBooleanProperty(CarHvacManager.ID_WINDOW_DEFROSTER_ON,
- VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD);
+ VehicleAreaWindow.FRONT_WINDSHIELD);
assertFalse(defrost);
}
// Test an integer property
public void testHvacFanSpeed() throws Exception {
mCarHvacManager.setIntProperty(CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT, 15);
+ VehicleAreaZone.ROW_1_LEFT, 15);
int speed = mCarHvacManager.getIntProperty(CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
+ VehicleAreaZone.ROW_1_LEFT);
assertEquals(15, speed);
mCarHvacManager.setIntProperty(CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT, 23);
+ VehicleAreaZone.ROW_1_LEFT, 23);
speed = mCarHvacManager.getIntProperty(CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
+ VehicleAreaZone.ROW_1_LEFT);
assertEquals(23, speed);
}
// Test an float property
public void testHvacTempSetpoint() throws Exception {
mCarHvacManager.setFloatProperty(CarHvacManager.ID_ZONED_TEMP_SETPOINT,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT, 70);
+ VehicleAreaZone.ROW_1_LEFT, 70);
float temp = mCarHvacManager.getFloatProperty(CarHvacManager.ID_ZONED_TEMP_SETPOINT,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
+ VehicleAreaZone.ROW_1_LEFT);
assertEquals(70.0, temp, 0);
mCarHvacManager.setFloatProperty(CarHvacManager.ID_ZONED_TEMP_SETPOINT,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT, (float) 65.5);
+ VehicleAreaZone.ROW_1_LEFT, (float) 65.5);
temp = mCarHvacManager.getFloatProperty(CarHvacManager.ID_ZONED_TEMP_SETPOINT,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
+ VehicleAreaZone.ROW_1_LEFT);
assertEquals(65.5, temp, 0);
}
@@ -143,58 +122,62 @@
mCarHvacManager.registerCallback(new EventListener());
// Inject a boolean event and wait for its callback in onPropertySet.
- VehiclePropValue v = VehiclePropValueUtil.createZonedBooleanValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_DEFROSTER,
- VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD, true, 0);
+ VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.HVAC_DEFROSTER)
+ .setAreaId(VehicleAreaWindow.FRONT_WINDSHIELD)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(1)
+ .build();
assertEquals(0, mAvailable.availablePermits());
- getVehicleHalEmulator().injectEvent(v);
+ getMockedVehicleHal().injectEvent(v);
assertTrue(mAvailable.tryAcquire(2L, TimeUnit.SECONDS));
assertTrue(mEventBoolVal);
- assertEquals(mEventZoneVal, VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD);
+ assertEquals(mEventZoneVal, VehicleAreaWindow.FRONT_WINDSHIELD);
// Inject a float event and wait for its callback in onPropertySet.
- v = VehiclePropValueUtil.createZonedFloatValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT,
- VehicleZone.VEHICLE_ZONE_ROW_1_ALL, 67, 0);
+ v = VehiclePropValueBuilder.newBuilder(VehicleProperty.HVAC_TEMPERATURE_CURRENT)
+ .setAreaId(VehicleAreaZone.ROW_1)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addFloatValue(67f)
+ .build();
assertEquals(0, mAvailable.availablePermits());
- getVehicleHalEmulator().injectEvent(v);
+ getMockedVehicleHal().injectEvent(v);
assertTrue(mAvailable.tryAcquire(2L, TimeUnit.SECONDS));
- assertEquals(mEventFloatVal, 67, 0);
- assertEquals(mEventZoneVal, VehicleZone.VEHICLE_ZONE_ROW_1_ALL);
+ assertEquals(67, mEventFloatVal, 0);
+ assertEquals(VehicleAreaZone.ROW_1, mEventZoneVal);
// Inject an integer event and wait for its callback in onPropertySet.
- v = VehiclePropValueUtil.createZonedIntValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_SPEED,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT, 4, 0);
+ v = VehiclePropValueBuilder.newBuilder(VehicleProperty.HVAC_FAN_SPEED)
+ .setAreaId(VehicleAreaZone.ROW_1_LEFT)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(4)
+ .build();
assertEquals(0, mAvailable.availablePermits());
- getVehicleHalEmulator().injectEvent(v);
+ getMockedVehicleHal().injectEvent(v);
assertTrue(mAvailable.tryAcquire(2L, TimeUnit.SECONDS));
- assertEquals(mEventIntVal, 4);
- assertEquals(mEventZoneVal, VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
+ assertEquals(4, mEventIntVal);
+ assertEquals(VehicleAreaZone.ROW_1_LEFT, mEventZoneVal);
}
-
- private class HvacPropertyHandler
- implements VehicleHalEmulator.VehicleHalPropertyHandler {
+ private class HvacPropertyHandler implements VehicleHalPropertyHandler {
HashMap<Integer, VehiclePropValue> mMap = new HashMap<>();
@Override
public synchronized void onPropertySet(VehiclePropValue value) {
- mMap.put(value.getProp(), value);
+ mMap.put(value.prop, value);
}
@Override
public synchronized VehiclePropValue onPropertyGet(VehiclePropValue value) {
- VehiclePropValue currentValue = mMap.get(value.getProp());
- // VNS will call getProperty method when subscribe is called, just return empty value.
+ VehiclePropValue currentValue = mMap.get(value.prop);
+ // VNS will call get method when subscribe is called, just return empty value.
return currentValue != null ? currentValue : value;
}
@Override
- public synchronized void onPropertySubscribe(int property, float sampleRate, int zones) {
+ public synchronized void onPropertySubscribe(int property, int zones, float sampleRate) {
Log.d(TAG, "onPropertySubscribe property " + property + " sampleRate " + sampleRate);
}
@@ -205,7 +188,7 @@
}
private class EventListener implements CarHvacEventCallback {
- public EventListener() { }
+ EventListener() { }
@Override
public void onChangeEvent(final CarPropertyValue value) {
diff --git a/tests/carservice_test/src/com/android/car/test/CarInfoManagerTest.java b/tests/carservice_test/src/com/android/car/test/CarInfoManagerTest.java
index 5221970..151a24d 100644
--- a/tests/carservice_test/src/com/android/car/test/CarInfoManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/test/CarInfoManagerTest.java
@@ -17,43 +17,35 @@
import android.car.Car;
import android.car.CarInfoManager;
-import android.os.Bundle;
-import android.util.Log;
+import android.hardware.vehicle.V2_0.VehicleProperty;
-import com.android.car.test.MockedCarTestBase;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
+import com.android.car.vehiclehal.VehiclePropValueBuilder;
public class CarInfoManagerTest extends MockedCarTestBase {
-
- private static final String TAG = CarInfoManagerTest.class.getSimpleName();
-
private static final String MAKE_NAME = "ANDROID";
private CarInfoManager mCarInfoManager;
@Override
+ protected synchronized void configureMockedHal() {
+ addStaticProperty(VehicleProperty.INFO_MAKE,
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.INFO_MAKE)
+ .setStringValue(MAKE_NAME)
+ .build());
+
+ }
+
+ @Override
protected void setUp() throws Exception {
super.setUp();
- getVehicleHalEmulator().addStaticProperty(
- VehiclePropConfigUtil.createStaticStringProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_INFO_MAKE),
- VehiclePropValueUtil.createStringValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_INFO_MAKE, MAKE_NAME, 0));
- getVehicleHalEmulator().removeProperty(VehicleNetworkConsts.VEHICLE_PROPERTY_INFO_MODEL);
- getVehicleHalEmulator().removeProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_INFO_MODEL_YEAR);
- getVehicleHalEmulator().start();
- mCarInfoManager =
- (CarInfoManager) getCar().getCarManager(Car.INFO_SERVICE);
+ mCarInfoManager = (CarInfoManager) getCar().getCarManager(Car.INFO_SERVICE);
}
public void testVehicleId() throws Exception {
assertNotNull(mCarInfoManager.getVehicleId());
}
- public void testManufactuter() throws Exception {
+ public void testManufacturer() throws Exception {
assertEquals(MAKE_NAME, mCarInfoManager.getManufacturer());
}
diff --git a/tests/carservice_test/src/com/android/car/test/CarPackageManagerTest.java b/tests/carservice_test/src/com/android/car/test/CarPackageManagerTest.java
index e17e3cb..c455bc4 100644
--- a/tests/carservice_test/src/com/android/car/test/CarPackageManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/test/CarPackageManagerTest.java
@@ -20,13 +20,9 @@
import android.car.content.pm.AppBlockingPackageInfo;
import android.car.content.pm.CarAppBlockingPolicy;
import android.car.content.pm.CarPackageManager;
-import android.content.pm.PackageManager;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;
-import com.android.car.test.MockedCarTestBase;
-import com.android.car.test.TestAppBlockingPolicyService;
-
@SmallTest
public class CarPackageManagerTest extends MockedCarTestBase {
private static final String TAG = CarPackageManagerTest.class.getSimpleName();
@@ -35,19 +31,14 @@
private static final long POLLING_SLEEP = 100;
private CarPackageManager mCarPm;
- private PackageManager mPm;
-
@Override
protected void setUp() throws Exception {
super.setUp();
- mPm = getContext().getPackageManager();
-
}
private void init(boolean policyFromService) throws Exception {
TestAppBlockingPolicyService.controlPolicySettingFromService(policyFromService);
- getVehicleHalEmulator().start();
mCarPm = (CarPackageManager) getCar().getCarManager(Car.PACKAGE_SERVICE);
assertNotNull(mCarPm);
}
@@ -136,11 +127,11 @@
activityNotAllowed));
}
- public interface PollingChecker {
+ interface PollingChecker {
boolean check();
}
- public static boolean pollingCheck(PollingChecker checker, int maxRetry, long sleepMs)
+ static boolean pollingCheck(PollingChecker checker, int maxRetry, long sleepMs)
throws Exception {
int retry = 0;
boolean checked = checker.check();
diff --git a/tests/carservice_test/src/com/android/car/test/CarPowerManagementTest.java b/tests/carservice_test/src/com/android/car/test/CarPowerManagementTest.java
index 364d0a6..d89ada3 100644
--- a/tests/carservice_test/src/com/android/car/test/CarPowerManagementTest.java
+++ b/tests/carservice_test/src/com/android/car/test/CarPowerManagementTest.java
@@ -15,31 +15,23 @@
*/
package com.android.car.test;
-import android.car.test.VehicleHalEmulator.VehicleHalPropertyHandler;
-import android.content.Context;
-import android.hardware.display.DisplayManager;
-import android.os.Handler;
-import android.os.Looper;
+import android.hardware.vehicle.V2_0.VehicleApPowerBootupReason;
+import android.hardware.vehicle.V2_0.VehicleApPowerSetState;
+import android.hardware.vehicle.V2_0.VehicleApPowerState;
+import android.hardware.vehicle.V2_0.VehicleApPowerStateConfigFlag;
+import android.hardware.vehicle.V2_0.VehicleApPowerStateIndex;
+import android.hardware.vehicle.V2_0.VehicleApPowerStateShutdownParam;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
import android.os.SystemClock;
import android.test.suitebuilder.annotation.MediumTest;
-import android.util.Log;
-import android.view.Display;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleApPowerBootupReason;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleApPowerSetState;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleApPowerState;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleApPowerStateConfigFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleApPowerStateIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleApPowerStateShutdownParam;
-import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePermissionModel;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
+import com.google.android.collect.Lists;
+import com.android.car.vehiclehal.VehiclePropValueBuilder;
+import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
+
+import java.util.ArrayList;
import java.util.LinkedList;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
@@ -47,81 +39,40 @@
@MediumTest
public class CarPowerManagementTest extends MockedCarTestBase {
- private static final long TIMEOUT_MS = 3000;
- private static final String TAG = CarPowerManagementTest.class.getSimpleName();
-
private final PowerStatePropertyHandler mPowerStateHandler = new PowerStatePropertyHandler();
- private final Handler mMainHandler = new Handler(Looper.getMainLooper());
- private final DisplayStateListener mDisplayListener = new DisplayStateListener();
- private DisplayManager mDisplayManager;
-
- @Override
- protected synchronized void setUp() throws Exception {
- super.setUp();
- mDisplayManager = (DisplayManager) getContext().getSystemService(Context.DISPLAY_SERVICE);
- mDisplayManager.registerDisplayListener(mDisplayListener, mMainHandler);
- }
-
- @Override
- protected synchronized void tearDown() throws Exception {
- super.tearDown();
- mDisplayManager.unregisterDisplayListener(mDisplayListener);
- }
private void setupPowerPropertyAndStart(boolean allowSleep) {
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2,
- VehiclePermissionModel.VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- allowSleep ?
- VehicleApPowerStateConfigFlag.VEHICLE_AP_POWER_STATE_CONFIG_ENABLE_DEEP_SLEEP_FLAG
- : 0
- /*configFlags*/,
- 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
- mPowerStateHandler);
- getVehicleHalEmulator().addStaticProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_BOOTUP_REASON,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_STATIC,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32,
- VehiclePermissionModel.VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
- VehiclePropValueUtil.createIntValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_BOOTUP_REASON,
- VehicleApPowerBootupReason.VEHICLE_AP_POWER_BOOTUP_REASON_USER_POWER_ON,
- 0));
- getVehicleHalEmulator().start();
+ addProperty(VehicleProperty.AP_POWER_STATE, mPowerStateHandler)
+ .setConfigArray(Lists.newArrayList(
+ allowSleep ? VehicleApPowerStateConfigFlag.ENABLE_DEEP_SLEEP_FLAG : 0));
+
+ addStaticProperty(VehicleProperty.AP_POWER_BOOTUP_REASON,
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.AP_POWER_BOOTUP_REASON)
+ .addIntValue(VehicleApPowerBootupReason.USER_POWER_ON)
+ .build());
+
+ reinitializeMockedHal();
}
public void testImmediateShutdown() throws Exception {
setupPowerPropertyAndStart(true);
assertBootComplete();
mPowerStateHandler.sendPowerState(
- VehicleApPowerState.VEHICLE_AP_POWER_STATE_SHUTDOWN_PREPARE,
- VehicleApPowerStateShutdownParam.VEHICLE_AP_POWER_SHUTDOWN_PARAM_SHUTDOWN_IMMEDIATELY);
- mPowerStateHandler.waitForStateSetAndGetAll(TIMEOUT_MS,
- VehicleApPowerSetState.VEHICLE_AP_POWER_SET_SHUTDOWN_START);
- mPowerStateHandler.sendPowerState(
- VehicleApPowerState.VEHICLE_AP_POWER_STATE_ON_FULL,
- 0);
+ VehicleApPowerState.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.SHUTDOWN_IMMEDIATELY);
+ mPowerStateHandler.waitForStateSetAndGetAll(DEFAULT_WAIT_TIMEOUT_MS,
+ VehicleApPowerSetState.SHUTDOWN_START);
+ mPowerStateHandler.sendPowerState(VehicleApPowerState.ON_FULL, 0);
}
public void testDisplayOnOff() throws Exception {
setupPowerPropertyAndStart(true);
assertBootComplete();
for (int i = 0; i < 2; i++) {
- mPowerStateHandler.sendPowerState(
- VehicleApPowerState.VEHICLE_AP_POWER_STATE_ON_DISP_OFF,
- 0);
- mDisplayListener.waitForDisplayState(false, TIMEOUT_MS);
- mPowerStateHandler.sendPowerState(
- VehicleApPowerState.VEHICLE_AP_POWER_STATE_ON_FULL,
- 0);
- mDisplayListener.waitForDisplayState(true, TIMEOUT_MS);
+ mPowerStateHandler.sendPowerState(VehicleApPowerState.ON_DISP_OFF, 0);
+ waitForFakeDisplayState(false);
+ mPowerStateHandler.sendPowerState(VehicleApPowerState.ON_FULL, 0);
+ waitForFakeDisplayState(true);
}
}
@@ -129,41 +80,36 @@
public void testSleepEntry() throws Exception {
assertBootComplete();
mPowerStateHandler.sendPowerState(
- VehicleApPowerState.VEHICLE_AP_POWER_STATE_SHUTDOWN_PREPARE,
- VehicleApPowerStateShutdownParam.VEHICLE_AP_POWER_SHUTDOWN_PARAM_CAN_SLEEP);
- assertResponse(VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DEEP_SLEEP_ENTRY, 0);
- assertResponse(VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DEEP_SLEEP_EXIT, 0);
+ VehicleApPowerState.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.CAN_SLEEP);
+ assertResponse(VehicleApPowerSetState.DEEP_SLEEP_ENTRY, 0);
+ assertResponse(VehicleApPowerSetState.DEEP_SLEEP_EXIT, 0);
mPowerStateHandler.sendPowerState(
- VehicleApPowerState.VEHICLE_AP_POWER_STATE_ON_FULL,
+ VehicleApPowerState.ON_FULL,
0);
}*/
private void assertResponse(int expectedResponseState, int expectedResponseParam)
throws Exception {
- LinkedList<int[]> setEvents = mPowerStateHandler.waitForStateSetAndGetAll(TIMEOUT_MS,
- expectedResponseState);
+ LinkedList<int[]> setEvents = mPowerStateHandler.waitForStateSetAndGetAll(
+ DEFAULT_WAIT_TIMEOUT_MS, expectedResponseState);
int[] last = setEvents.getLast();
assertEquals(expectedResponseState, last[0]);
assertEquals(expectedResponseParam, last[1]);
}
private void assertBootComplete() throws Exception {
- mPowerStateHandler.waitForSubscription(TIMEOUT_MS);
- LinkedList<int[]> setEvents = mPowerStateHandler.waitForStateSetAndGetAll(TIMEOUT_MS,
- VehicleApPowerSetState.VEHICLE_AP_POWER_SET_BOOT_COMPLETE);
+ mPowerStateHandler.waitForSubscription(DEFAULT_WAIT_TIMEOUT_MS);
+ LinkedList<int[]> setEvents = mPowerStateHandler.waitForStateSetAndGetAll(
+ DEFAULT_WAIT_TIMEOUT_MS, VehicleApPowerSetState.BOOT_COMPLETE);
int[] first = setEvents.getFirst();
- assertEquals(VehicleApPowerSetState.VEHICLE_AP_POWER_SET_BOOT_COMPLETE, first[0]);
+ assertEquals(VehicleApPowerSetState.BOOT_COMPLETE, first[0]);
assertEquals(0, first[1]);
}
- private synchronized boolean isMainDisplayOn() {
- Display disp = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
- return disp.getState() == Display.STATE_ON;
- }
-
private class PowerStatePropertyHandler implements VehicleHalPropertyHandler {
- private int mPowerState = VehicleApPowerState.VEHICLE_AP_POWER_STATE_ON_FULL;
+ private int mPowerState = VehicleApPowerState.ON_FULL;
private int mPowerParam = 0;
private final Semaphore mSubscriptionWaitSemaphore = new Semaphore(0);
@@ -172,27 +118,26 @@
@Override
public void onPropertySet(VehiclePropValue value) {
+ ArrayList<Integer> v = value.value.int32Values;
synchronized (this) {
mSetStates.add(new int[] {
- value.getInt32Values(
- VehicleApPowerStateIndex.VEHICLE_AP_POWER_STATE_INDEX_STATE),
- value.getInt32Values(
- VehicleApPowerStateIndex.VEHICLE_AP_POWER_STATE_INDEX_ADDITIONAL)
- });
+ v.get(VehicleApPowerStateIndex.STATE),
+ v.get(VehicleApPowerStateIndex.ADDITIONAL)
+ });
}
mSetWaitSemaphore.release();
}
@Override
public synchronized VehiclePropValue onPropertyGet(VehiclePropValue value) {
- int[] values = { mPowerState, mPowerParam };
- return VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE, values,
- SystemClock.elapsedRealtimeNanos());
+ return VehiclePropValueBuilder.newBuilder(VehicleProperty.AP_POWER_STATE)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(mPowerState, mPowerParam)
+ .build();
}
@Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
+ public void onPropertySubscribe(int property, int zones, float sampleRate) {
mSubscriptionWaitSemaphore.release();
}
@@ -235,43 +180,11 @@
}
private void sendPowerState(int state, int param) {
- int[] values = { state, param };
- getVehicleHalEmulator().injectEvent(
- VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE, values,
- SystemClock.elapsedRealtimeNanos()));
- }
- }
-
- private class DisplayStateListener implements DisplayManager.DisplayListener {
-
- private final Semaphore mDisplayWait = new Semaphore(0);
-
- private void waitForDisplayState(boolean expectedState, long timeoutMs) throws Exception {
- while (isMainDisplayOn() != expectedState) {
- if (!mDisplayWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
- fail("waitForDisplayState timeout, expected:" + expectedState);
- }
- }
- }
-
- @Override
- public void onDisplayAdded(int displayId) {
- // not used
- }
-
- @Override
- public void onDisplayChanged(int displayId) {
- Log.i(TAG, "onDisplayChanged, id:" + displayId + " main display on:" +
- isMainDisplayOn());
- if (displayId == Display.DEFAULT_DISPLAY) {
- mDisplayWait.release();
- }
- }
-
- @Override
- public void onDisplayRemoved(int displayId) {
- // not used
+ getMockedVehicleHal().injectEvent(
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.AP_POWER_STATE)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(state, param)
+ .build());
}
}
}
diff --git a/tests/carservice_test/src/com/android/car/test/CarProjectionManagerTest.java b/tests/carservice_test/src/com/android/car/test/CarProjectionManagerTest.java
index 8c2f83e..b4bedd6 100644
--- a/tests/carservice_test/src/com/android/car/test/CarProjectionManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/test/CarProjectionManagerTest.java
@@ -18,16 +18,17 @@
import android.car.Car;
import android.car.CarProjectionManager;
-import android.car.test.VehicleHalEmulator;
+import android.hardware.vehicle.V2_0.VehicleHwKeyInputAction;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.hardware.vehicle.V2_0.VehiclePropertyAccess;
import android.os.SystemClock;
import android.test.suitebuilder.annotation.MediumTest;
import android.util.Log;
import android.view.KeyEvent;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
+import com.android.car.vehiclehal.VehiclePropValueBuilder;
+import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
import java.util.HashMap;
import java.util.concurrent.Semaphore;
@@ -55,21 +56,14 @@
private CarProjectionManager mManager;
@Override
+ protected synchronized void configureMockedHal() {
+ addProperty(VehicleProperty.HW_KEY_INPUT, new PropertyHandler())
+ .setAccess(VehiclePropertyAccess.READ);
+ }
+
+ @Override
protected void setUp() throws Exception {
super.setUp();
- PropertyHandler handler = new PropertyHandler();
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT,
- VehicleNetworkConsts.VehiclePropAccess.VEHICLE_PROP_ACCESS_READ,
- VehicleNetworkConsts.VehiclePropChangeMode
- .VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4,
- VehicleNetworkConsts.VehiclePermissionModel
- .VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
- handler);
- getVehicleHalEmulator().start();
mManager = (CarProjectionManager) getCar().getCarManager(Car.PROJECTION_SERVICE);
}
@@ -114,52 +108,50 @@
}
public void sendVoiceKey(boolean isLong) throws InterruptedException {
- int[] values = {
- VehicleNetworkConsts.VehicleHwKeyInputAction.VEHICLE_HW_KEY_INPUT_ACTION_DOWN,
- KeyEvent.KEYCODE_VOICE_ASSIST, 0, 0 };
+ int[] values = {VehicleHwKeyInputAction.ACTION_DOWN, KeyEvent.KEYCODE_VOICE_ASSIST, 0, 0};
- VehiclePropValue injectValue = VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT, values,
- SystemClock.elapsedRealtimeNanos());
+ VehiclePropValue injectValue =
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.HW_KEY_INPUT)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(values)
+ .build();
- getVehicleHalEmulator().injectEvent(injectValue);
+ getMockedVehicleHal().injectEvent(injectValue);
if (isLong) {
Thread.sleep(1200); // Long press is > 1s.
}
- int[] upValues = {
- VehicleNetworkConsts.VehicleHwKeyInputAction.VEHICLE_HW_KEY_INPUT_ACTION_UP,
- KeyEvent.KEYCODE_VOICE_ASSIST, 0, 0 };
+ int[] upValues = {VehicleHwKeyInputAction.ACTION_UP, KeyEvent.KEYCODE_VOICE_ASSIST, 0, 0 };
- injectValue = VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT, upValues,
- SystemClock.elapsedRealtimeNanos());
+ injectValue = VehiclePropValueBuilder.newBuilder(VehicleProperty.HW_KEY_INPUT)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(upValues)
+ .build();
- getVehicleHalEmulator().injectEvent(injectValue);
+ getMockedVehicleHal().injectEvent(injectValue);
}
- private class PropertyHandler
- implements VehicleHalEmulator.VehicleHalPropertyHandler {
+ private class PropertyHandler implements VehicleHalPropertyHandler {
HashMap<Integer, VehiclePropValue> mMap = new HashMap<>();
@Override
public synchronized void onPropertySet(VehiclePropValue value) {
Log.d(TAG, "onPropertySet:" + value);
- mMap.put(value.getProp(), value);
+ mMap.put(value.prop, value);
}
@Override
public synchronized VehiclePropValue onPropertyGet(VehiclePropValue value) {
Log.d(TAG, "onPropertyGet:" + value);
- VehiclePropValue currentValue = mMap.get(value.getProp());
- // VNS will call getProperty method when subscribe is called, just return empty value.
+ VehiclePropValue currentValue = mMap.get(value.prop);
+ // VNS will call get method when subscribe is called, just return empty value.
return currentValue != null ? currentValue : value;
}
@Override
- public synchronized void onPropertySubscribe(int property, float sampleRate, int zones) {
+ public synchronized void onPropertySubscribe(int property, int zones, float sampleRate) {
Log.d(TAG, "onPropertySubscribe property " + property + " sampleRate " + sampleRate);
}
diff --git a/tests/carservice_test/src/com/android/car/test/CarRadioManagerTest.java b/tests/carservice_test/src/com/android/car/test/CarRadioManagerTest.java
index 4975dfc..97170b6 100644
--- a/tests/carservice_test/src/com/android/car/test/CarRadioManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/test/CarRadioManagerTest.java
@@ -16,26 +16,25 @@
package com.android.car.test;
import android.car.Car;
-import android.car.test.VehicleHalEmulator;
import android.car.hardware.radio.CarRadioEvent;
import android.car.hardware.radio.CarRadioManager;
import android.car.hardware.radio.CarRadioManager.CarRadioEventListener;
import android.car.hardware.radio.CarRadioPreset;
import android.hardware.radio.RadioManager;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.os.SystemClock;
import android.test.suitebuilder.annotation.MediumTest;
import android.util.Log;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
+import com.google.android.collect.Lists;
+import com.android.car.vehiclehal.VehiclePropValueBuilder;
+import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
+
+import java.util.HashMap;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
-import java.util.HashMap;
@MediumTest
public class CarRadioManagerTest extends MockedCarTestBase {
@@ -46,22 +45,19 @@
private Semaphore mAvailable;
private static final int NUM_PRESETS = 2;
- private final HashMap<Integer, CarRadioPreset> mRadioPresets =
- new HashMap<Integer, CarRadioPreset>();
+ private final HashMap<Integer, CarRadioPreset> mRadioPresets = new HashMap<>();
private CarRadioManager mCarRadioManager;
- private class RadioPresetPropertyHandler
- implements VehicleHalEmulator.VehicleHalPropertyHandler {
+ private class RadioPresetPropertyHandler implements VehicleHalPropertyHandler {
public RadioPresetPropertyHandler() { }
@Override
public synchronized void onPropertySet(VehiclePropValue value) {
- assertEquals(value.getProp(), VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET);
- assertEquals(value.getValueType(), VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4);
+ assertEquals(value.prop, VehicleProperty.RADIO_PRESET);
Integer[] valueList = new Integer[4];
- value.getInt32ValuesList().toArray(valueList);
+ value.value.int32Values.toArray(valueList);
assertFalse(
"Index out of range: " + valueList[0] + " (0, " + NUM_PRESETS + ")",
valueList[0] < 1);
@@ -82,32 +78,30 @@
@Override
public synchronized VehiclePropValue onPropertyGet(VehiclePropValue value) {
- assertEquals(value.getProp(), VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET);
- assertEquals(value.getValueType(), VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4);
+ assertEquals(value.prop, VehicleProperty.RADIO_PRESET);
Integer[] valueList = new Integer[4];
- value.getInt32ValuesList().toArray(valueList);
+ value.value.int32Values.toArray(valueList);
// Get the actual preset.
if (valueList[0] < 1 || valueList[0] > NUM_PRESETS) {
- // VNS will call getProperty method when subscribe is called, just return an empty
+ // VNS will call get method when subscribe is called, just return an empty
// value.
return value;
}
CarRadioPreset preset = mRadioPresets.get(valueList[0]);
- VehiclePropValue v =
- VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET,
- new int[] {
- preset.getPresetNumber(),
- preset.getBand(),
- preset.getChannel(),
- preset.getSubChannel()}, 0);
- return v;
+ return VehiclePropValueBuilder.newBuilder(VehicleProperty.RADIO_PRESET)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(
+ preset.getPresetNumber(),
+ preset.getBand(),
+ preset.getChannel(),
+ preset.getSubChannel())
+ .build();
}
@Override
- public synchronized void onPropertySubscribe(int property, float sampleRate, int zones) {
+ public synchronized void onPropertySubscribe(int property, int zones, float sampleRate) {
Log.d(TAG, "onPropertySubscribe property: " + property + " rate: " + sampleRate);
if (mAvailable.availablePermits() != 0) {
Log.d(TAG, "Lock was free, should have been locked.");
@@ -138,20 +132,16 @@
}
@Override
+ protected synchronized void configureMockedHal() {
+ addProperty(VehicleProperty.RADIO_PRESET, new RadioPresetPropertyHandler())
+ .setConfigArray(Lists.newArrayList(NUM_PRESETS));
+ }
+
+ @Override
protected void setUp() throws Exception {
super.setUp();
mAvailable = new Semaphore(0);
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.createProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4,
- NUM_PRESETS),
- new RadioPresetPropertyHandler());
- getVehicleHalEmulator().start();
- mCarRadioManager =
- (CarRadioManager) getCar().getCarManager(Car.RADIO_SERVICE);
+ mCarRadioManager = (CarRadioManager) getCar().getCarManager(Car.RADIO_SERVICE);
}
public void testPresetCount() throws Exception {
@@ -185,14 +175,16 @@
// Inject an event and wait for its callback in onPropertySet.
CarRadioPreset preset = new CarRadioPreset(2, RadioManager.BAND_AM, 4321, -1);
- VehiclePropValue v = VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET,
- new int[] {
+
+ VehiclePropValue v = VehiclePropValueBuilder.newBuilder(VehicleProperty.RADIO_PRESET)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(
preset.getPresetNumber(),
preset.getBand(),
preset.getChannel(),
- preset.getSubChannel()}, 0);
- getVehicleHalEmulator().injectEvent(v);
+ preset.getSubChannel())
+ .build();
+ getMockedVehicleHal().injectEvent(v);
success = mAvailable.tryAcquire(5L, TimeUnit.SECONDS);
assertEquals("injectEvent, onEvent timeout!", true, success);
diff --git a/tests/carservice_test/src/com/android/car/test/CarSensorManagerTest.java b/tests/carservice_test/src/com/android/car/test/CarSensorManagerTest.java
index b5c3eeb..c81ce34 100644
--- a/tests/carservice_test/src/com/android/car/test/CarSensorManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/test/CarSensorManagerTest.java
@@ -19,15 +19,13 @@
import android.car.Car;
import android.car.hardware.CarSensorEvent;
import android.car.hardware.CarSensorManager;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.os.SystemClock;
import android.test.suitebuilder.annotation.MediumTest;
import android.util.Log;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
-
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
+import com.android.car.vehiclehal.VehiclePropValueBuilder;
/**
* Test the public entry points for the CarSensorManager
@@ -39,14 +37,41 @@
private CarSensorManager mCarSensorManager;
@Override
+ protected synchronized void configureMockedHal() {
+ addProperty(VehicleProperty.NIGHT_MODE,
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.NIGHT_MODE)
+ .addIntValue(0)
+ .build());
+ addProperty(VehicleProperty.PERF_VEHICLE_SPEED,
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.PERF_VEHICLE_SPEED)
+ .addFloatValue(0f)
+ .build());
+ addProperty(VehicleProperty.FUEL_LEVEL_LOW,
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.FUEL_LEVEL_LOW)
+ .setBooleanValue(false)
+ .build());
+ addProperty(VehicleProperty.PARKING_BRAKE_ON,
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.PARKING_BRAKE_ON)
+ .setBooleanValue(true)
+ .build());
+ addProperty(VehicleProperty.CURRENT_GEAR,
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.CURRENT_GEAR)
+ .addIntValue(0)
+ .build());
+ addProperty(VehicleProperty.GEAR_SELECTION,
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.GEAR_SELECTION)
+ .addIntValue(0)
+ .build());
+ addProperty(VehicleProperty.DRIVING_STATUS,
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.DRIVING_STATUS)
+ .addIntValue(0)
+ .build());
+ }
+
+ @Override
protected void setUp() throws Exception {
super.setUp();
-
- // Our tests simply rely on the properties already added by default in the
- // VehilceHalEmulator. We don't actually need to add any of our own.
-
// Start the HAL layer and set up the sensor manager service
- getVehicleHalEmulator().start();
mCarSensorManager = (CarSensorManager) getCar().getCarManager(Car.SENSOR_SERVICE);
}
@@ -122,25 +147,19 @@
CarSensorManager.SENSOR_TYPE_NIGHT,
CarSensorManager.SENSOR_RATE_NORMAL);
- VehiclePropValue value = null;
+ VehiclePropValue value;
+ CarSensorEvent event;
CarSensorEvent.NightData data = null;
- CarSensorEvent event = null;
- // Consume any sensor events queued up on startup
- while (listener.waitForSensorChange()) {};
-
- // Validate that no events are now pending
- listener.checkNoSensorChangePosted();
-
+ listener.reset();
// Set the value TRUE and wait for the event to arrive
- value = VehiclePropValueUtil.createBooleanValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_NIGHT_MODE, true, 1);
- getVehicleHalEmulator().injectEvent(value);
- assertTrue(listener.waitForSensorChange());
-
- // Validate that no events remain pending
- listener.checkNoSensorChangePosted();
+ getMockedVehicleHal().injectEvent(
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.NIGHT_MODE)
+ .setBooleanValue(true)
+ .setTimestamp(1L)
+ .build());
+ assertTrue(listener.waitForSensorChange(1L));
// Ensure we got the expected event
assertEquals(listener.getLastEvent().sensorType, CarSensorManager.SENSOR_TYPE_NIGHT);
@@ -152,46 +171,52 @@
// Ensure we have the expected value in the sensor manager's cache
event = mCarSensorManager.getLatestSensorEvent(CarSensorManager.SENSOR_TYPE_NIGHT);
+ assertNotNull(event);
data = event.getNightData(data);
assertEquals("Unexpected event timestamp", data.timestamp, 1);
assertTrue("Unexpected value", data.isNightMode);
-
+ listener.reset();
// Set the value FALSE
- value = VehiclePropValueUtil.createBooleanValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_NIGHT_MODE, false, 1001);
- getVehicleHalEmulator().injectEvent(value);
- assertTrue(listener.waitForSensorChange());
+ getMockedVehicleHal().injectEvent(
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.NIGHT_MODE)
+ .setTimestamp(1001)
+ .setBooleanValue(false)
+ .build());
+ assertTrue(listener.waitForSensorChange(1001));
// Ensure we got the expected event
assertEquals(listener.getLastEvent().sensorType, CarSensorManager.SENSOR_TYPE_NIGHT);
// Ensure we got the expected value in our callback
data = listener.getLastEvent().getNightData(data);
- assertEquals("Unexpected event timestamp", data.timestamp, 1001);
+ assertEquals("Unexpected event timestamp", 1001, data.timestamp);
assertFalse("Unexpected value", data.isNightMode);
// Ensure we have the expected value in the sensor manager's cache
event = mCarSensorManager.getLatestSensorEvent(CarSensorManager.SENSOR_TYPE_NIGHT);
+ assertNotNull(event);
data = event.getNightData(data);
assertFalse(data.isNightMode);
// Unregister our handler (from all sensor types)
mCarSensorManager.unregisterListener(listener);
+ listener.reset();
// Set the value TRUE again
- value = VehiclePropValueUtil.createBooleanValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_NIGHT_MODE, true, 2001);
- listener.checkNoSensorChangePosted();
- getVehicleHalEmulator().injectEvent(value);
+ value = VehiclePropValueBuilder.newBuilder(VehicleProperty.NIGHT_MODE)
+ .setTimestamp(2001)
+ .setBooleanValue(true)
+ .build();
+ getMockedVehicleHal().injectEvent(value);
// Ensure we did not get a callback (should timeout)
Log.i(TAG, "waiting for unexpected callback -- should timeout.");
- assertFalse(listener.waitForSensorChange());
- listener.checkNoSensorChangePosted();
+ assertFalse(listener.waitForSensorChange(2001));
// Despite us not having a callback registered, the Sensor Manager should see the update
event = mCarSensorManager.getLatestSensorEvent(CarSensorManager.SENSOR_TYPE_NIGHT);
+ assertNotNull(event);
data = event.getNightData(data);
assertEquals("Unexpected event timestamp", data.timestamp, 2001);
assertTrue("Unexpected value", data.isNightMode);
@@ -204,9 +229,9 @@
*/
public void testEventsWithMultipleListeners() throws Exception {
// Set up our listeners callback
- SensorListener listener1 = new SensorListener("1");
- SensorListener listener2 = new SensorListener("2");
- SensorListener listener3 = new SensorListener("3");
+ SensorListener listener1 = new SensorListener();
+ SensorListener listener2 = new SensorListener();
+ SensorListener listener3 = new SensorListener();
mCarSensorManager.registerListener(listener1,
CarSensorManager.SENSOR_TYPE_NIGHT,
@@ -220,44 +245,25 @@
CarSensorManager.SENSOR_TYPE_NIGHT,
CarSensorManager.SENSOR_RATE_FASTEST);
- VehiclePropValue value = null;
CarSensorEvent.NightData data = null;
- CarSensorEvent event = null;
+ VehiclePropValue value;
+ CarSensorEvent event;
- // Consume any sensor events queued up on startup
- while (listener1.waitForSensorChange()) {};
-
- // Consume any sensor events queued up on startup
- while (listener2.waitForSensorChange()) {};
-
- // Consume any sensor events queued up on startup
- while (listener3.waitForSensorChange()) {};
-
- // Validate that no events are now pending
- listener1.checkNoSensorChangePosted();
-
- // Validate that no events are now pending
- listener2.checkNoSensorChangePosted();
-
- // Validate that no events are now pending
- listener3.checkNoSensorChangePosted();
+ listener1.reset();
+ listener2.reset();
+ listener3.reset();
// Set the value TRUE and wait for the event to arrive
- value = VehiclePropValueUtil.createBooleanValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_NIGHT_MODE, true, 1);
- getVehicleHalEmulator().injectEvent(value);
- assertTrue(listener1.waitForSensorChange());
- assertTrue(listener2.waitForSensorChange());
- assertTrue(listener3.waitForSensorChange());
+ value = VehiclePropValueBuilder.newBuilder(VehicleProperty.NIGHT_MODE)
+ .setTimestamp(42L)
+ .setBooleanValue(true)
+ .build();
- // Validate that no events remain pending
- listener1.checkNoSensorChangePosted();
+ getMockedVehicleHal().injectEvent(value);
- // Validate that no events remain pending
- listener2.checkNoSensorChangePosted();
-
- // Validate that no events remain pending
- listener3.checkNoSensorChangePosted();
+ assertTrue(listener1.waitForSensorChange(42L));
+ assertTrue(listener2.waitForSensorChange(42L));
+ assertTrue(listener3.waitForSensorChange(42L));
// Ensure we got the expected event
assertEquals(listener1.getLastEvent().sensorType, CarSensorManager.SENSOR_TYPE_NIGHT);
@@ -280,25 +286,21 @@
// Ensure we have the expected value in the sensor manager's cache
event = mCarSensorManager.getLatestSensorEvent(CarSensorManager.SENSOR_TYPE_NIGHT);
data = event.getNightData(data);
- assertEquals("Unexpected event timestamp", data.timestamp, 1);
+ assertEquals("Unexpected event timestamp", 42, data.timestamp);
assertTrue("Unexpected value", data.isNightMode);
+ listener1.reset();
+ listener2.reset();
+ listener3.reset();
// Set the value FALSE
- value = VehiclePropValueUtil.createBooleanValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_NIGHT_MODE, false, 1001);
- getVehicleHalEmulator().injectEvent(value);
- assertTrue(listener1.waitForSensorChange());
- assertTrue(listener2.waitForSensorChange());
- assertTrue(listener3.waitForSensorChange());
-
- // Validate that no events remain pending
- listener1.checkNoSensorChangePosted();
-
- // Validate that no events remain pending
- listener2.checkNoSensorChangePosted();
-
- // Validate that no events remain pending
- listener3.checkNoSensorChangePosted();
+ value = VehiclePropValueBuilder.newBuilder(VehicleProperty.NIGHT_MODE)
+ .setTimestamp(1001)
+ .setBooleanValue(false)
+ .build();
+ getMockedVehicleHal().injectEvent(value);
+ assertTrue(listener1.waitForSensorChange(1001));
+ assertTrue(listener2.waitForSensorChange(1001));
+ assertTrue(listener3.waitForSensorChange(1001));
// Ensure we got the expected event
assertEquals(listener1.getLastEvent().sensorType, CarSensorManager.SENSOR_TYPE_NIGHT);
@@ -307,15 +309,16 @@
// Ensure we got the expected value in our callback
data = listener1.getLastEvent().getNightData(data);
- assertEquals("Unexpected event timestamp", data.timestamp, 1001);
+ assertEquals("Unexpected event timestamp", 1001, data.timestamp);
assertFalse("Unexpected value", data.isNightMode);
data = listener2.getLastEvent().getNightData(data);
- assertEquals("Unexpected event timestamp", data.timestamp, 1001);
+ assertEquals("Unexpected event timestamp", 1001, data.timestamp);
assertFalse("Unexpected value", data.isNightMode);
data = listener3.getLastEvent().getNightData(data);
- assertEquals("Unexpected event timestamp", data.timestamp, 1001);
+ listener3.reset();
+ assertEquals("Unexpected event timestamp", 1001, data.timestamp);
assertFalse("Unexpected value", data.isNightMode);
// Ensure we have the expected value in the sensor manager's cache
@@ -329,34 +332,35 @@
Log.d(TAG, "Rate changed - expect sensor restart and change event sent.");
assertTrue(listener1.waitForSensorChange());
assertTrue(listener2.waitForSensorChange());
- assertFalse(listener2.waitForSensorChange());
+ assertFalse(listener3.waitForSensorChange());
+ listener1.reset();
+ listener2.reset();
+ listener3.reset();
// Set the value TRUE again
- value = VehiclePropValueUtil.createBooleanValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_NIGHT_MODE, true, 2001);
- listener1.checkNoSensorChangePosted();
- listener2.checkNoSensorChangePosted();
- listener3.checkNoSensorChangePosted();
- getVehicleHalEmulator().injectEvent(value);
+ value = VehiclePropValueBuilder.newBuilder(VehicleProperty.NIGHT_MODE)
+ .setTimestamp()
+ .setBooleanValue(true)
+ .build();
+ getMockedVehicleHal().injectEvent(value);
assertTrue(listener1.waitForSensorChange());
assertTrue(listener2.waitForSensorChange());
+ listener1.reset();
+ listener2.reset();
+
// Ensure we did not get a callback (should timeout)
Log.i(TAG, "waiting for unexpected callback -- should timeout.");
assertFalse(listener3.waitForSensorChange());
- listener1.checkNoSensorChangePosted();
- listener2.checkNoSensorChangePosted();
- listener3.checkNoSensorChangePosted();
-
Log.d(TAG, "Unregistering listener2");
mCarSensorManager.unregisterListener(listener3);
Log.d(TAG, "Rate did nor change - dont expect sensor restart and change event sent.");
assertFalse(listener1.waitForSensorChange());
assertFalse(listener2.waitForSensorChange());
- assertFalse(listener2.waitForSensorChange());
+ assertFalse(listener3.waitForSensorChange());
}
@@ -366,53 +370,48 @@
* and keeps a reference to the most recent event delivered.
*/
class SensorListener implements CarSensorManager.OnSensorChangedListener {
- private final String mTag;
-
- SensorListener(String tag) {
- mTag = tag;
- }
-
- SensorListener() {
- this("");
- }
-
- // Initialize the semaphore with ZERO callback events indicated
- private Semaphore mAvailable = new Semaphore(0);
+ private final Object mSync = new Object();
private CarSensorEvent mLastEvent = null;
- public CarSensorEvent getLastEvent() {
+ CarSensorEvent getLastEvent() {
return mLastEvent;
}
- public void checkNoSensorChangePosted() {
- // Verify that no permits are available (ie: the callback has not fired)
- assertEquals("No events expected at this point for " + mTag + ".",
- 0, mAvailable.availablePermits());
+ void reset() {
+ synchronized (mSync) {
+ mLastEvent = null;
+ }
+ }
+
+ boolean waitForSensorChange() throws InterruptedException {
+ return waitForSensorChange(0);
}
// Returns True to indicate receipt of a sensor event. False indicates a timeout.
- public boolean waitForSensorChange() throws InterruptedException {
- Log.i(TAG, mTag + ":Waiting to for sensor update...");
-
- long startTime = System.currentTimeMillis();
- boolean result = mAvailable.tryAcquire(2L, TimeUnit.SECONDS);
- long duration = System.currentTimeMillis() - startTime;
-
- Log.d(TAG, mTag + ": tryAcquire returned " + result + " in " + duration + "ms");
-
- return result;
+ boolean waitForSensorChange(long eventTimeStamp) throws InterruptedException {
+ long start = SystemClock.elapsedRealtime();
+ boolean matchTimeStamp = eventTimeStamp != 0;
+ synchronized (mSync) {
+ Log.d(TAG, "waitForSensorChange, mLastEvent: " + mLastEvent);
+ while ((mLastEvent == null
+ || (matchTimeStamp && mLastEvent.timestamp != eventTimeStamp))
+ && (start + SHORT_WAIT_TIMEOUT_MS > SystemClock.elapsedRealtime())) {
+ mSync.wait(10L);
+ }
+ return mLastEvent != null &&
+ (!matchTimeStamp || mLastEvent.timestamp == eventTimeStamp);
+ }
}
@Override
public void onSensorChanged(CarSensorEvent event) {
- Log.d(TAG, mTag + ": onSensorChanged: " + event);
-
- // We're going to hold a reference to this object
- mLastEvent = event;
-
- // Add one to the semaphore, indicating that we have run
- mAvailable.release();
+ Log.d(TAG, "onSensorChanged, event: " + event);
+ synchronized (mSync) {
+ // We're going to hold a reference to this object
+ mLastEvent = event;
+ mSync.notify();
+ }
}
}
diff --git a/tests/carservice_test/src/com/android/car/test/CarVendorExtensionManagerTest.java b/tests/carservice_test/src/com/android/car/test/CarVendorExtensionManagerTest.java
index 08d4941..e56d8f2 100644
--- a/tests/carservice_test/src/com/android/car/test/CarVendorExtensionManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/test/CarVendorExtensionManagerTest.java
@@ -16,36 +16,24 @@
package com.android.car.test;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePermissionModel.VEHICLE_PERMISSION_NO_RESTRICTION;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_BYTES;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_INT32;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_STRING;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_1_LEFT;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT;
-import static com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue.newBuilder;
-import static java.util.Collections.singletonList;
+import static com.android.car.CarServiceUtils.toByteArray;
import android.car.Car;
import android.car.hardware.CarPropertyConfig;
import android.car.hardware.CarVendorExtensionManager;
-import android.car.test.CarTestManager;
-import android.car.test.CarTestManagerBinderWrapper;
+import android.hardware.vehicle.V2_0.StatusCode;
+import android.hardware.vehicle.V2_0.VehicleArea;
+import android.hardware.vehicle.V2_0.VehicleAreaZone;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehiclePropertyGroup;
+import android.hardware.vehicle.V2_0.VehiclePropertyType;
import android.os.SystemClock;
import android.util.Log;
import android.util.SparseArray;
-import com.google.android.collect.Lists;
-import com.google.protobuf.ByteString;
-
-import com.android.car.vehiclenetwork.VehicleNetwork.VehicleNetworkHalMock;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
+import com.android.car.vehiclehal.test.MockedVehicleHal;
+import com.android.car.vehiclehal.test.VehiclePropConfigBuilder;
import org.junit.Assert;
@@ -61,15 +49,19 @@
private static final String TAG = CarVendorExtensionManager.class.getSimpleName();
private static final int CUSTOM_GLOBAL_INT_PROP_ID =
- VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START;
+ 0x1 | VehiclePropertyGroup.VENDOR | VehiclePropertyType.INT32 | VehicleArea.GLOBAL;
+
private static final int CUSTOM_ZONED_FLOAT_PROP_ID =
- VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 1;
+ 0x2 | VehiclePropertyGroup.VENDOR | VehiclePropertyType.FLOAT | VehicleArea.ZONE;
+
private static final int CUSTOM_BYTES_PROP_ID_1 =
- VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 2;
+ 0x3 | VehiclePropertyGroup.VENDOR | VehiclePropertyType.BYTES | VehicleArea.ZONE;
+
private static final int CUSTOM_BYTES_PROP_ID_2 =
- VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 3;
+ 0x4 | VehiclePropertyGroup.VENDOR | VehiclePropertyType.BYTES | VehicleArea.GLOBAL;
+
private static final int CUSTOM_STRING_PROP_ID =
- VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 4;
+ 0x5 | VehiclePropertyGroup.VENDOR | VehiclePropertyType.STRING | VehicleArea.GLOBAL;
private static final float EPS = 1e-9f;
private static final int MILLION = 1000 * 1000;
@@ -80,80 +72,30 @@
private static final float MIN_PROP_FLOAT = 10.42f;
private static final float MAX_PROP_FLOAT = 42.10f;
- private static final MockedVehicleHal mVehicleHal = new MockedVehicleHal();
+// private static final MockedVehicleHal mVehicleHal = new MockedVehicleHal();
- private static final VehiclePropConfigs VEHICLE_HAL_CONFIGS = VehiclePropConfigs.newBuilder()
- .addConfigs(VehiclePropConfig.newBuilder()
- .setProp(CUSTOM_GLOBAL_INT_PROP_ID)
- .setAccess(VEHICLE_PROP_ACCESS_READ_WRITE)
- .setChangeMode(VEHICLE_PROP_CHANGE_MODE_ON_CHANGE)
- .setValueType(VEHICLE_VALUE_TYPE_INT32)
- .setPermissionModel(VEHICLE_PERMISSION_NO_RESTRICTION)
- .addConfigArray(0)
- .setSampleRateMin(0f)
- .setSampleRateMax(0f)
- .addAllInt32Mins(singletonList(MIN_PROP_INT32))
- .addAllInt32Maxs(singletonList(MAX_PROP_INT32))
- .build())
- .addConfigs(VehiclePropConfig.newBuilder()
- .setProp(CUSTOM_ZONED_FLOAT_PROP_ID)
- .setAccess(VEHICLE_PROP_ACCESS_READ_WRITE)
- .setChangeMode(VEHICLE_PROP_CHANGE_MODE_ON_CHANGE)
- .setValueType(VEHICLE_VALUE_TYPE_ZONED_FLOAT)
- .setPermissionModel(VEHICLE_PERMISSION_NO_RESTRICTION)
- .setZones(VEHICLE_ZONE_ROW_1_LEFT | VEHICLE_ZONE_ROW_1_RIGHT)
- .addConfigArray(0)
- .setSampleRateMin(0f)
- .setSampleRateMax(0f)
- .addAllFloatMins(Lists.newArrayList(MIN_PROP_FLOAT, MIN_PROP_FLOAT))
- .addAllFloatMaxs(Lists.newArrayList(MAX_PROP_FLOAT, MAX_PROP_FLOAT))
- .build())
- .addConfigs(VehiclePropConfig.newBuilder()
- .setProp(CUSTOM_BYTES_PROP_ID_1)
- .setAccess(VEHICLE_PROP_ACCESS_READ_WRITE)
- .setChangeMode(VEHICLE_PROP_CHANGE_MODE_ON_CHANGE)
- .setValueType(VEHICLE_VALUE_TYPE_BYTES)
- .setPermissionModel(VEHICLE_PERMISSION_NO_RESTRICTION)
- .setZones(VEHICLE_ZONE_ROW_1_LEFT | VEHICLE_ZONE_ROW_1_RIGHT)
- .addConfigArray(0)
- .setSampleRateMin(0f)
- .setSampleRateMax(0f)
- .build())
- .addConfigs(VehiclePropConfig.newBuilder()
- .setProp(CUSTOM_BYTES_PROP_ID_2)
- .setAccess(VEHICLE_PROP_ACCESS_READ_WRITE)
- .setChangeMode(VEHICLE_PROP_CHANGE_MODE_ON_CHANGE)
- .setValueType(VEHICLE_VALUE_TYPE_BYTES)
- .setPermissionModel(VEHICLE_PERMISSION_NO_RESTRICTION)
- .addConfigArray(0)
- .setSampleRateMin(0f)
- .setSampleRateMax(0f)
- .build())
- .addConfigs(VehiclePropConfig.newBuilder()
- .setProp(CUSTOM_STRING_PROP_ID)
- .setAccess(VEHICLE_PROP_ACCESS_READ_WRITE)
- .setChangeMode(VEHICLE_PROP_CHANGE_MODE_ON_CHANGE)
- .setValueType(VEHICLE_VALUE_TYPE_STRING)
- .setPermissionModel(VEHICLE_PERMISSION_NO_RESTRICTION)
- .addConfigArray(0)
- .setSampleRateMin(0f)
- .setSampleRateMax(0f)
- .build())
- .build();
+ private static final VehiclePropConfig mConfigs[] = new VehiclePropConfig[] {
+ VehiclePropConfigBuilder.newBuilder(CUSTOM_GLOBAL_INT_PROP_ID)
+ .addAreaConfig(0, MIN_PROP_INT32, MAX_PROP_INT32)
+ .build(),
+ VehiclePropConfigBuilder.newBuilder(CUSTOM_ZONED_FLOAT_PROP_ID)
+ .setSupportedAreas(VehicleAreaZone.ROW_1_LEFT | VehicleAreaZone.ROW_1_RIGHT)
+ .addAreaConfig(VehicleAreaZone.ROW_1_LEFT, MIN_PROP_FLOAT, MAX_PROP_FLOAT)
+ .addAreaConfig(VehicleAreaZone.ROW_2_RIGHT, MIN_PROP_FLOAT, MAX_PROP_FLOAT)
+ .build(),
+ VehiclePropConfigBuilder.newBuilder(CUSTOM_BYTES_PROP_ID_1)
+ .setSupportedAreas(VehicleAreaZone.ROW_1_LEFT | VehicleAreaZone.ROW_1_RIGHT)
+ .build(),
+ VehiclePropConfigBuilder.newBuilder(CUSTOM_BYTES_PROP_ID_2).build(),
+ VehiclePropConfigBuilder.newBuilder(CUSTOM_STRING_PROP_ID).build(),
+ };
private CarVendorExtensionManager mManager;
- private CarTestManager mCarTestManager;
@Override
protected void setUp() throws Exception {
super.setUp();
- CarTestManagerBinderWrapper testManagerWrapper =
- (CarTestManagerBinderWrapper) getCar().getCarManager(Car.TEST_SERVICE);
-
- mCarTestManager = new CarTestManager(testManagerWrapper);
- mCarTestManager.startMocking(mVehicleHal, 0);
-
mManager = (CarVendorExtensionManager) getCar().getCarManager(Car.VENDOR_EXTENSION_SERVICE);
assertNotNull(mManager);
}
@@ -161,12 +103,11 @@
@Override
protected void tearDown() throws Exception {
super.tearDown();
- mCarTestManager.stopMocking();
}
public void testPropertyList() throws Exception {
List<CarPropertyConfig> configs = mManager.getProperties();
- assertEquals(VEHICLE_HAL_CONFIGS.getConfigsCount(), configs.size());
+ assertEquals(mConfigs.length, configs.size());
SparseArray<CarPropertyConfig> configById = new SparseArray<>(configs.size());
for (CarPropertyConfig config : configs) {
@@ -192,11 +133,11 @@
mManager.setProperty(
Float.class,
CUSTOM_ZONED_FLOAT_PROP_ID,
- VEHICLE_ZONE_ROW_1_RIGHT,
+ VehicleAreaZone.ROW_1_RIGHT,
value);
float actualValue = mManager.getProperty(
- Float.class, CUSTOM_ZONED_FLOAT_PROP_ID, VEHICLE_ZONE_ROW_1_RIGHT);
+ Float.class, CUSTOM_ZONED_FLOAT_PROP_ID, VehicleAreaZone.ROW_1_RIGHT);
assertEquals(value, actualValue, EPS);
}
@@ -278,59 +219,56 @@
return sb.toString();
}
- private static class MockedVehicleHal implements VehicleNetworkHalMock {
+ @Override
+ protected synchronized MockedVehicleHal createMockedVehicleHal() {
+ MockedVehicleHal hal = new VendorExtMockedVehicleHal();
+ hal.addProperties(mConfigs);
+ return hal;
+ }
+
+ private static class VendorExtMockedVehicleHal extends MockedVehicleHal {
private final SparseArray<VehiclePropValue> mValues = new SparseArray<>();
private byte[] mBytes = null;
@Override
- public VehiclePropConfigs onListProperties() {
- return VEHICLE_HAL_CONFIGS;
- }
-
- @Override
- public void onPropertySet(VehiclePropValue value) {
- if (value.getProp() == CUSTOM_BYTES_PROP_ID_1) {
- mBytes = value.getBytesValue().toByteArray();
+ public synchronized int set(VehiclePropValue propValue) {
+ if (propValue.prop == CUSTOM_BYTES_PROP_ID_1) {
+ mBytes = toByteArray(propValue.value.bytes);
}
- mValues.put(value.getProp(), newBuilder(value).build());
+ mValues.put(propValue.prop, propValue);
+ return StatusCode.OK;
}
@Override
- public VehiclePropValue onPropertyGet(VehiclePropValue value) {
- Log.d(TAG, "onPropertyGet: 0x" + Integer.toHexString(value.getProp()) + ", "
- + VehiclePropValueUtil.toString(value));
+ public synchronized void get(VehiclePropValue requestedPropValue, getCallback cb) {
+ if (!isVendorProperty(requestedPropValue.prop)) {
+ cb.onValues(StatusCode.INVALID_ARG, null);
+ return;
+ }
+ VehiclePropValue result = new VehiclePropValue();
+ result.prop = requestedPropValue.prop;
+ result.areaId = requestedPropValue.areaId;
- if (value.getProp() == CUSTOM_BYTES_PROP_ID_2 && mBytes != null) {
+ if (requestedPropValue.prop == CUSTOM_BYTES_PROP_ID_2 && mBytes != null) {
Log.d(TAG, "Returning byte array property, value: " + Arrays.toString(mBytes));
- return VehiclePropValue
- .newBuilder(value)
- .setBytesValue(ByteString.copyFrom(mBytes))
- .build();
- }
-
- VehiclePropValue existingValue = mValues.get(value.getProp());
- if (existingValue != null) {
- return existingValue;
- }
-
- int type = value.getValueType();
-
- // VehicleNetwork will fail if we do not set empty data for these properties.
- if (type == VEHICLE_VALUE_TYPE_BYTES && !value.hasBytesValue()) {
- return VehiclePropValue.newBuilder(value).setBytesValue(ByteString.EMPTY).build();
- } else if (type == VEHICLE_VALUE_TYPE_STRING && !value.hasStringValue()) {
- return VehiclePropValue.newBuilder(value).setStringValue("").build();
+ for (byte b : mBytes) {
+ result.value.bytes.add(b);
+ }
} else {
- return value;
+ VehiclePropValue existingValue = mValues.get(requestedPropValue.prop);
+ if (existingValue != null) {
+ result = existingValue;
+ } else {
+ result = requestedPropValue;
+ }
}
+ cb.onValues(StatusCode.OK, result);
}
- @Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) { }
-
- @Override
- public void onPropertyUnsubscribe(int property) { }
+ private boolean isVendorProperty(int prop) {
+ return VehiclePropertyGroup.VENDOR == (prop & VehiclePropertyGroup.VENDOR);
+ }
}
}
diff --git a/tests/carservice_test/src/com/android/car/test/CarVolumeServiceTest.java b/tests/carservice_test/src/com/android/car/test/CarVolumeServiceTest.java
index 54bbb29..bd53c02 100644
--- a/tests/carservice_test/src/com/android/car/test/CarVolumeServiceTest.java
+++ b/tests/carservice_test/src/com/android/car/test/CarVolumeServiceTest.java
@@ -18,8 +18,15 @@
import android.car.Car;
import android.car.CarNotConnectedException;
import android.car.media.CarAudioManager;
-import android.car.test.VehicleHalEmulator;
import android.content.Context;
+import android.hardware.vehicle.V2_0.VehicleAudioExtFocusFlag;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusState;
+import android.hardware.vehicle.V2_0.VehicleAudioVolumeIndex;
+import android.hardware.vehicle.V2_0.VehicleHwKeyInputAction;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.hardware.vehicle.V2_0.VehiclePropertyAccess;
+import android.hardware.vehicle.V2_0.VehiclePropertyChangeMode;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.IVolumeController;
@@ -29,12 +36,11 @@
import android.util.SparseIntArray;
import android.view.KeyEvent;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioExtFocusFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusState;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
+import com.google.android.collect.Lists;
+
+import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
+import com.android.car.vehiclehal.test.VehiclePropConfigBuilder;
+import com.android.car.vehiclehal.VehiclePropValueBuilder;
import com.android.internal.annotations.GuardedBy;
import java.util.ArrayList;
@@ -124,9 +130,9 @@
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
// focus gives to Alarm, there should be a audio context change.
CarAudioFocusTest.AudioFocusListener listenerAlarm = new
@@ -138,8 +144,8 @@
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, 0);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN, request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioFocusState.STATE_GAIN, request[1],
+ VehicleAudioExtFocusFlag.NONE_FLAG);
// should not show UI
volumeChangeVerificationPoll(AudioManager.STREAM_ALARM, false, volumeController);
@@ -171,9 +177,9 @@
assertEquals(AudioManager.AUDIOFOCUS_REQUEST_GRANTED, res);
int[] request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
+ VehicleAudioFocusState.STATE_GAIN,
request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioExtFocusFlag.NONE_FLAG);
assertEquals(musicVol, mCarAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
@@ -191,8 +197,8 @@
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, 0);
request = mAudioFocusPropertyHandler.waitForAudioFocusRequest(TIMEOUT_MS);
mAudioFocusPropertyHandler.sendAudioFocusState(
- VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN, request[1],
- VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG);
+ VehicleAudioFocusState.STATE_GAIN, request[1],
+ VehicleAudioExtFocusFlag.NONE_FLAG);
sendVolumeKey(true /*vol up*/);
callVol++;
@@ -250,8 +256,7 @@
}
}
- private class SingleChannelVolumeHandler implements
- VehicleHalEmulator.VehicleHalPropertyHandler {
+ private class SingleChannelVolumeHandler implements VehicleHalPropertyHandler {
private final List<Integer> mMins;
private final List<Integer> mMaxs;
private final SparseIntArray mCurrent;
@@ -269,36 +274,31 @@
@Override
public void onPropertySet(VehiclePropValue value) {
- int stream = value.getInt32Values(
- VehicleNetworkConsts.VehicleAudioVolumeIndex.VEHICLE_AUDIO_VOLUME_INDEX_STREAM);
- int volume = value.getInt32Values(
- VehicleNetworkConsts.VehicleAudioVolumeIndex.VEHICLE_AUDIO_VOLUME_INDEX_VOLUME);
- int state = value.getInt32Values(
- VehicleNetworkConsts.VehicleAudioVolumeIndex.VEHICLE_AUDIO_VOLUME_INDEX_STATE);
+ ArrayList<Integer> v = value.value.int32Values;
+ int stream = v.get(VehicleAudioVolumeIndex.INDEX_STREAM);
+ int volume = v.get(VehicleAudioVolumeIndex.INDEX_VOLUME);
+ int state = v.get(VehicleAudioVolumeIndex.INDEX_STATE);
- int[] values = {stream, volume, state};
- VehiclePropValue injectValue = VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME, values,
- SystemClock.elapsedRealtimeNanos());
mCurrent.put(stream, volume);
- getVehicleHalEmulator().injectEvent(injectValue);
+ getMockedVehicleHal().injectEvent(
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.AUDIO_VOLUME)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(stream, volume, state)
+ .build());
}
@Override
public VehiclePropValue onPropertyGet(VehiclePropValue value) {
- int stream = value.getInt32Values(
- VehicleNetworkConsts.VehicleAudioVolumeIndex.VEHICLE_AUDIO_VOLUME_INDEX_STREAM);
-
+ int stream = value.value.int32Values.get(VehicleAudioVolumeIndex.INDEX_STREAM);
int volume = mCurrent.get(stream);
- int[] values = {stream, volume, 0};
- VehiclePropValue propValue = VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME, values,
- SystemClock.elapsedRealtimeNanos());
- return propValue;
+ return VehiclePropValueBuilder.newBuilder(VehicleProperty.AUDIO_VOLUME)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(stream, volume, 0)
+ .build();
}
@Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
+ public void onPropertySubscribe(int property, int zones, float sampleRate) {
}
@Override
@@ -309,8 +309,8 @@
private final CarAudioFocusTest.FocusPropertyHandler mAudioFocusPropertyHandler =
new CarAudioFocusTest.FocusPropertyHandler(this);
- private final VehicleHalEmulator.VehicleHalPropertyHandler mAudioRoutingPolicyPropertyHandler =
- new VehicleHalEmulator.VehicleHalPropertyHandler() {
+ private final VehicleHalPropertyHandler mAudioRoutingPolicyPropertyHandler =
+ new VehicleHalPropertyHandler() {
@Override
public void onPropertySet(VehiclePropValue value) {
//TODO
@@ -323,7 +323,7 @@
}
@Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
+ public void onPropertySubscribe(int property, int zones, float sampleRate) {
fail("cannot subscribe");
}
@@ -333,8 +333,7 @@
}
};
- private final VehicleHalEmulator.VehicleHalPropertyHandler mHWKeyHandler =
- new VehicleHalEmulator.VehicleHalPropertyHandler() {
+ private final VehicleHalPropertyHandler mHWKeyHandler = new VehicleHalPropertyHandler() {
@Override
public void onPropertySet(VehiclePropValue value) {
//TODO
@@ -342,14 +341,14 @@
@Override
public VehiclePropValue onPropertyGet(VehiclePropValue value) {
- int[] values = {0, 0, 0, 0 };
- return VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT, values,
- SystemClock.elapsedRealtimeNanos());
+ return VehiclePropValueBuilder.newBuilder(VehicleProperty.HW_KEY_INPUT)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(0, 0, 0, 0)
+ .build();
}
@Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
+ public void onPropertySubscribe(int property, int zones, float sampleRate) {
//
}
@@ -364,83 +363,60 @@
SingleChannelVolumeHandler singleChannelVolumeHandler =
new SingleChannelVolumeHandler(mins, maxs);
int zones = (1<<maxs.size()) - 1;
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.getBuilder(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME,
- VehicleNetworkConsts.VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehicleNetworkConsts.VehiclePropChangeMode
- .VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC3,
- VehicleNetworkConsts.VehiclePermissionModel
- .VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- supportedAudioVolumeContext /*configFlags*/,
- 0 /*sampleRateMax*/, 0 /*sampleRateMin*/,
- maxs, mins).setZones(zones).build(),
- singleChannelVolumeHandler);
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT,
- VehicleNetworkConsts.VehiclePropAccess.VEHICLE_PROP_ACCESS_READ,
- VehicleNetworkConsts.VehiclePropChangeMode
- .VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4,
- VehicleNetworkConsts.VehiclePermissionModel
- .VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
- mHWKeyHandler);
+ ArrayList<Integer> audioVolumeConfigArray =
+ Lists.newArrayList(
+ supportedAudioVolumeContext,
+ 0 /* capability flag*/,
+ 0, /* reserved */
+ 0 /* reserved */);
+ audioVolumeConfigArray.addAll(maxs);
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS,
- VehicleNetworkConsts.VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehicleNetworkConsts.VehiclePropChangeMode
- .VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4,
- VehicleNetworkConsts.VehiclePermissionModel
- .VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
- mAudioFocusPropertyHandler);
- getVehicleHalEmulator().addProperty(
- VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY,
- VehicleNetworkConsts.VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE,
- VehicleNetworkConsts.VehiclePropChangeMode
- .VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2,
- VehicleNetworkConsts.VehiclePermissionModel
- .VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
- mAudioRoutingPolicyPropertyHandler);
+ addProperty(VehicleProperty.AUDIO_VOLUME, singleChannelVolumeHandler)
+ .setConfigArray(audioVolumeConfigArray)
+ .setSupportedAreas(zones);
- getVehicleHalEmulator().addStaticProperty(
- VehiclePropConfigUtil.createStaticStringProperty(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT),
- VehiclePropValueUtil.createIntValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT, 1, 0));
+ addProperty(VehicleProperty.HW_KEY_INPUT, mHWKeyHandler)
+ .setAccess(VehiclePropertyAccess.READ);
- getVehicleHalEmulator().start();
+ addProperty(VehicleProperty.AUDIO_FOCUS, mAudioFocusPropertyHandler);
+
+ addProperty(VehicleProperty.AUDIO_ROUTING_POLICY, mAudioFocusPropertyHandler)
+ .setAccess(VehiclePropertyAccess.WRITE);
+
+ addStaticProperty(VehicleProperty.AUDIO_HW_VARIANT,
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.AUDIO_HW_VARIANT)
+ .addIntValue(-1)
+ .build())
+ .setConfigArray(Lists.newArrayList(0));
+
+ reinitializeMockedHal();
}
- public void sendVolumeKey(boolean volUp) {
- int[] values = {
- VehicleNetworkConsts.VehicleHwKeyInputAction.VEHICLE_HW_KEY_INPUT_ACTION_DOWN,
+ private void sendVolumeKey(boolean volUp) {
+ int[] actionDown = {
+ VehicleHwKeyInputAction.ACTION_DOWN,
+ volUp ? KeyEvent.KEYCODE_VOLUME_UP : KeyEvent.KEYCODE_VOLUME_DOWN, 0, 0};
+
+ VehiclePropValue injectValue =
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.HW_KEY_INPUT)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(actionDown)
+ .build();
+
+ getMockedVehicleHal().injectEvent(injectValue);
+
+ int[] actionUp = {
+ VehicleHwKeyInputAction.ACTION_UP,
volUp ? KeyEvent.KEYCODE_VOLUME_UP : KeyEvent.KEYCODE_VOLUME_DOWN, 0, 0 };
- VehiclePropValue injectValue = VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT, values,
- SystemClock.elapsedRealtimeNanos());
+ injectValue =
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.HW_KEY_INPUT)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(actionUp)
+ .build();
- getVehicleHalEmulator().injectEvent(injectValue);
-
- int[] upValues = {
- VehicleNetworkConsts.VehicleHwKeyInputAction.VEHICLE_HW_KEY_INPUT_ACTION_UP,
- volUp ? KeyEvent.KEYCODE_VOLUME_UP : KeyEvent.KEYCODE_VOLUME_DOWN, 0, 0 };
-
- injectValue = VehiclePropValueUtil.createIntVectorValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT, upValues,
- SystemClock.elapsedRealtimeNanos());
-
- getVehicleHalEmulator().injectEvent(injectValue);
+ getMockedVehicleHal().injectEvent(injectValue);
}
private static class VolumeController extends IVolumeController.Stub {
diff --git a/tests/carservice_test/src/com/android/car/test/MockedCarTestBase.java b/tests/carservice_test/src/com/android/car/test/MockedCarTestBase.java
index 799f577..0c3f84b 100644
--- a/tests/carservice_test/src/com/android/car/test/MockedCarTestBase.java
+++ b/tests/carservice_test/src/com/android/car/test/MockedCarTestBase.java
@@ -15,76 +15,148 @@
*/
package com.android.car.test;
-import android.car.test.VehicleHalEmulator;
+import android.car.test.CarTestManager;
+import android.car.test.CarTestManagerBinderWrapper;
import android.content.ComponentName;
+import android.content.Context;
import android.content.ServiceConnection;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehiclePropertyAccess;
+import android.hardware.vehicle.V2_0.VehiclePropertyChangeMode;
+import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.test.AndroidTestCase;
import android.util.Log;
+import com.android.car.CarPowerManagementService;
+import com.android.car.ICarImpl;
+import com.android.car.SystemInterface;
+import com.android.car.vehiclehal.test.MockedVehicleHal;
+import com.android.car.vehiclehal.test.MockedVehicleHal.DefaultPropertyHandler;
+import com.android.car.vehiclehal.test.MockedVehicleHal.StaticPropertyHandler;
+import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
+import com.android.car.vehiclehal.test.VehiclePropConfigBuilder;
+
import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/**
* Base class for testing with mocked vehicle HAL (=car).
- * It is up to each app to start emulation by getVehicleHalEmulator().start() as there will be
+ * It is up to each app to start emulation by getMockedVehicleHal().start() as there will be
* per test set up that should be done before starting.
*/
public class MockedCarTestBase extends AndroidTestCase {
private static final String TAG = MockedCarTestBase.class.getSimpleName();
- private static final long DEFAULT_WAIT_TIMEOUT_MS = 3000;
+ static final long DEFAULT_WAIT_TIMEOUT_MS = 3000;
+ static final long SHORT_WAIT_TIMEOUT_MS = 500;
private android.car.Car mCar;
- private VehicleHalEmulator mVehicleHalEmulator;
+ private ICarImpl mCarImpl;
+ private MockedVehicleHal mMockedVehicleHal;
+ private FakeSystemInterface mFakeSystemInterface;
- private final Semaphore mConnectionWaitForCar = new Semaphore(0);
private final Semaphore mWaitForMain = new Semaphore(0);
private final Handler mMainHandler = new Handler(Looper.getMainLooper());
- public static <T> void assertArrayEquals(T[] expected, T[] actual) {
- if (!Arrays.equals(expected, actual)) {
- fail("expected:<" + Arrays.toString(expected) +
- "> but was:<" + Arrays.toString(actual) + ">");
- }
+ private static final IBinder mCarServiceToken = new Binder();
+ private static boolean mRealCarServiceReleased = false;
+
+ protected synchronized MockedVehicleHal createMockedVehicleHal() {
+ return new MockedVehicleHal();
}
- public static void assertArrayEquals(int[] expected, int[] actual) {
- if (!Arrays.equals(expected, actual)) {
- fail("expected:<" + Arrays.toString(expected) +
- "> but was:<" + Arrays.toString(actual) + ">");
- }
+ protected synchronized MockedVehicleHal getMockedVehicleHal() {
+ return mMockedVehicleHal;
+ }
+
+ protected synchronized void configureMockedHal() {
}
@Override
protected synchronized void setUp() throws Exception {
super.setUp();
- mCar = android.car.Car.createCar(getContext(), new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- mConnectionWaitForCar.release();
- }
+ releaseRealCarService(getContext());
- @Override
- public void onServiceDisconnected(ComponentName name) {
- }
- });
- mCar.connect();
- assertTrue(mConnectionWaitForCar.tryAcquire(DEFAULT_WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS)
- );
- mVehicleHalEmulator = new VehicleHalEmulator(mCar);
+ mMockedVehicleHal = createMockedVehicleHal();
+ configureMockedHal();
+
+ mFakeSystemInterface = new FakeSystemInterface();
+ Context context = getCarServiceContext();
+ mCarImpl = new ICarImpl(context, mMockedVehicleHal, mFakeSystemInterface);
+
+ initMockedHal(false /* no need to release */);
+
+ mCar = new android.car.Car(context, mCarImpl, null /* handler */);
}
@Override
protected synchronized void tearDown() throws Exception {
super.tearDown();
- if (mVehicleHalEmulator.isStarted()) {
- mVehicleHalEmulator.stop();
- }
+
mCar.disconnect();
+ mCarImpl.release();
+ }
+
+ private Context getCarServiceContext() throws NameNotFoundException {
+ return getContext()
+ .createPackageContext("com.android.car", Context.CONTEXT_IGNORE_SECURITY);
+ }
+
+ protected synchronized void reinitializeMockedHal() {
+ initMockedHal(true /* release */);
+ }
+
+ private synchronized void initMockedHal(boolean release) {
+ if (release) {
+ mCarImpl.release();
+ }
+
+ for (Map.Entry<VehiclePropConfigBuilder, VehicleHalPropertyHandler> entry
+ : mHalConfig.entrySet()) {
+ mMockedVehicleHal.addProperty(entry.getKey().build(), entry.getValue());
+ }
+ mHalConfig.clear();
+ mCarImpl.init();
+ }
+
+ private final Map<VehiclePropConfigBuilder, VehicleHalPropertyHandler> mHalConfig =
+ new HashMap<>();
+
+ protected synchronized VehiclePropConfigBuilder addProperty(int propertyId,
+ VehicleHalPropertyHandler propertyHandler) {
+ VehiclePropConfigBuilder builder = VehiclePropConfigBuilder.newBuilder(propertyId);
+ mHalConfig.put(builder, propertyHandler);
+ return builder;
+ }
+
+ protected synchronized VehiclePropConfigBuilder addProperty(int propertyId) {
+ VehiclePropConfigBuilder builder = VehiclePropConfigBuilder.newBuilder(propertyId);
+ mHalConfig.put(builder, new DefaultPropertyHandler(builder.build(), null));
+ return builder;
+ }
+
+ protected synchronized VehiclePropConfigBuilder addProperty(int propertyId,
+ VehiclePropValue value) {
+ VehiclePropConfigBuilder builder = VehiclePropConfigBuilder.newBuilder(propertyId);
+ mHalConfig.put(builder, new DefaultPropertyHandler(builder.build(), value));
+ return builder;
+ }
+
+ protected synchronized VehiclePropConfigBuilder addStaticProperty(int propertyId,
+ VehiclePropValue value) {
+ VehiclePropConfigBuilder builder = VehiclePropConfigBuilder.newBuilder(propertyId)
+ .setChangeMode(VehiclePropertyChangeMode.STATIC)
+ .setAccess(VehiclePropertyAccess.READ);
+
+ mHalConfig.put(builder, new StaticPropertyHandler(value));
+ return builder;
}
protected synchronized android.car.Car getCar() {
@@ -106,7 +178,118 @@
mWaitForMain.acquire();
}
- protected synchronized VehicleHalEmulator getVehicleHalEmulator() {
- return mVehicleHalEmulator;
+ protected boolean waitForFakeDisplayState(boolean expectedState) throws Exception {
+ return mFakeSystemInterface.waitForDisplayState(expectedState, SHORT_WAIT_TIMEOUT_MS);
+ }
+
+ public static <T> void assertArrayEquals(T[] expected, T[] actual) {
+ if (!Arrays.equals(expected, actual)) {
+ fail("expected:<" + Arrays.toString(expected) +
+ "> but was:<" + Arrays.toString(actual) + ">");
+ }
+ }
+
+ public static void assertArrayEquals(int[] expected, int[] actual) {
+ if (!Arrays.equals(expected, actual)) {
+ fail("expected:<" + Arrays.toString(expected) +
+ "> but was:<" + Arrays.toString(actual) + ">");
+ }
+ }
+
+ /*
+ * In order to eliminate interfering with real car service we will disable it. It will be
+ * enabled back in CarTestService when mCarServiceToken will go away (tests finish).
+ */
+ private synchronized static void releaseRealCarService(Context context) throws Exception {
+ if (mRealCarServiceReleased) {
+ return; // We just want to release it once.
+ }
+
+ mRealCarServiceReleased = true; // To make sure it was called once.
+
+ Object waitForConnection = new Object();
+ android.car.Car car = android.car.Car.createCar(context, new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ synchronized (waitForConnection) {
+ waitForConnection.notify();
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) { }
+ });
+
+ car.connect();
+ synchronized (waitForConnection) {
+ if (!car.isConnected()) {
+ waitForConnection.wait(DEFAULT_WAIT_TIMEOUT_MS);
+ }
+ }
+
+ if (car.isConnected()) {
+ Log.i(TAG, "Connected to real car service");
+ CarTestManagerBinderWrapper binderWrapper =
+ (CarTestManagerBinderWrapper) car.getCarManager(android.car.Car.TEST_SERVICE);
+ assertNotNull(binderWrapper);
+
+ CarTestManager mgr = new CarTestManager(binderWrapper.binder);
+ mgr.stopCarService(mCarServiceToken);
+ }
+ }
+
+ private static class FakeSystemInterface extends SystemInterface {
+
+ private boolean mDisplayOn = true;
+ private final Semaphore mDisplayStateWait = new Semaphore(0);
+
+ @Override
+ public synchronized void setDisplayState(boolean on) {
+ mDisplayOn = on;
+ mDisplayStateWait.release();
+ }
+
+ boolean waitForDisplayState(boolean expectedState, long timeoutMs)
+ throws Exception {
+ if (expectedState == mDisplayOn) {
+ return true;
+ }
+ mDisplayStateWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS);
+ return expectedState == mDisplayOn;
+ }
+
+ @Override
+ public void releaseAllWakeLocks() {
+ }
+
+ @Override
+ public void shutdown() { }
+
+ @Override
+ public void enterDeepSleep(int wakeupTimeSec) { }
+
+ @Override
+ public boolean isSystemSupportingDeepSleep() {
+ return false;
+ }
+
+ @Override
+ public void switchToPartialWakeLock() {
+ }
+
+ @Override
+ public void switchToFullWakeLock() {
+ }
+
+ @Override
+ public void startDisplayStateMonitoring(CarPowerManagementService service) {
+ }
+
+ @Override
+ public void stopDisplayStateMonitoring() {
+ }
+
+ @Override
+ public boolean isWakeupCausedByTimer() { return false; }
}
}
diff --git a/tests/carservice_test/src/com/android/car/test/SystemActivityMonitoringServiceTest.java b/tests/carservice_test/src/com/android/car/test/SystemActivityMonitoringServiceTest.java
index 3281865..44e1d99 100644
--- a/tests/carservice_test/src/com/android/car/test/SystemActivityMonitoringServiceTest.java
+++ b/tests/carservice_test/src/com/android/car/test/SystemActivityMonitoringServiceTest.java
@@ -16,18 +16,18 @@
package com.android.car.test;
import android.app.Activity;
-import android.car.test.VehicleHalEmulator;
import android.content.ComponentName;
import android.content.Intent;
+import android.hardware.vehicle.V2_0.VehicleDrivingStatus;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.hardware.vehicle.V2_0.VehiclePropertyAccess;
import android.os.SystemClock;
import com.android.car.SystemActivityMonitoringService;
import com.android.car.SystemActivityMonitoringService.TopTaskInfoContainer;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleDrivingStatus;
-import com.android.car.vehiclenetwork.VehicleNetworkProto;
-import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
+import com.android.car.vehiclehal.VehiclePropValueBuilder;
+import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
import java.util.ArrayList;
import java.util.List;
@@ -42,28 +42,22 @@
private final DrivingStatusHandler mDrivingStatusHandler = new DrivingStatusHandler();
@Override
- protected void setUp() throws Exception {
- super.setUp();
- getVehicleHalEmulator().addProperty(VehiclePropConfigUtil.getBuilder(
- VehicleNetworkConsts.VEHICLE_PROPERTY_DRIVING_STATUS,
- VehicleNetworkConsts.VehiclePropAccess.VEHICLE_PROP_ACCESS_READ,
- VehicleNetworkConsts.VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_INT32,
- VehicleNetworkConsts.VehiclePermissionModel.VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
- 0 /*configFlags*/,
- 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
- mDrivingStatusHandler);
+ protected synchronized void configureMockedHal() {
+ addProperty(VehicleProperty.DRIVING_STATUS, mDrivingStatusHandler)
+ .setAccess(VehiclePropertyAccess.READ);
}
private void init(boolean drivingStatusRestricted) {
// Set no restriction to driving status, to avoid CarPackageManagerService to launch a
// blocking activity.
mDrivingStatusHandler.setDrivingStatusRestricted(drivingStatusRestricted);
- getVehicleHalEmulator().start();
- VehicleNetworkProto.VehiclePropValue injectValue = VehiclePropValueUtil.createIntValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_DRIVING_STATUS, 0,
- SystemClock.elapsedRealtimeNanos());
- getVehicleHalEmulator().injectEvent(injectValue);
+
+ VehiclePropValue injectValue =
+ VehiclePropValueBuilder.newBuilder(VehicleProperty.DRIVING_STATUS)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(0)
+ .build();
+ getMockedVehicleHal().injectEvent(injectValue);
}
public void testActivityLaunch() {
@@ -195,30 +189,28 @@
public static class BlockingActivity extends Activity {
}
- private class DrivingStatusHandler implements VehicleHalEmulator.VehicleHalPropertyHandler {
- int mDrivingStatus =
- VehicleNetworkConsts.VehicleDrivingStatus.VEHICLE_DRIVING_STATUS_UNRESTRICTED;
+ private class DrivingStatusHandler implements VehicleHalPropertyHandler {
+ int mDrivingStatus = VehicleDrivingStatus.UNRESTRICTED;
public void setDrivingStatusRestricted(boolean restricted) {
- mDrivingStatus = restricted ? VehicleDrivingStatus.VEHICLE_DRIVING_STATUS_NO_VIDEO
- : VehicleDrivingStatus.VEHICLE_DRIVING_STATUS_UNRESTRICTED;
+ mDrivingStatus = restricted ? VehicleDrivingStatus.NO_VIDEO
+ : VehicleDrivingStatus.UNRESTRICTED;
}
@Override
- public void onPropertySet(VehicleNetworkProto.VehiclePropValue value) {
+ public void onPropertySet(VehiclePropValue value) {
}
@Override
- public VehicleNetworkProto.VehiclePropValue onPropertyGet(
- VehicleNetworkProto.VehiclePropValue value) {
- return VehiclePropValueUtil.createIntValue(
- VehicleNetworkConsts.VEHICLE_PROPERTY_DRIVING_STATUS,
- mDrivingStatus,
- SystemClock.elapsedRealtimeNanos());
+ public VehiclePropValue onPropertyGet(VehiclePropValue value) {
+ return VehiclePropValueBuilder.newBuilder(VehicleProperty.DRIVING_STATUS)
+ .setTimestamp(SystemClock.elapsedRealtimeNanos())
+ .addIntValue(mDrivingStatus)
+ .build();
}
@Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
+ public void onPropertySubscribe(int property, int zones, float sampleRate) {
}
@Override
diff --git a/tests/carservice_unit_test/src/com/android/car/test/CarPowerManagementServiceTest.java b/tests/carservice_unit_test/src/com/android/car/test/CarPowerManagementServiceTest.java
index ca0d18a..bb462ee 100644
--- a/tests/carservice_unit_test/src/com/android/car/test/CarPowerManagementServiceTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/test/CarPowerManagementServiceTest.java
@@ -24,6 +24,7 @@
import com.android.car.CarPowerManagementService.PowerServiceEventListener;
import com.android.car.hal.PowerHalService;
import com.android.car.hal.PowerHalService.PowerState;
+import com.android.car.SystemInterface;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
@@ -32,8 +33,9 @@
private static final String TAG = CarPowerManagementServiceTest.class.getSimpleName();
private static final long WAIT_TIMEOUT_MS = 2000;
private static final long WAIT_TIMEOUT_LONG_MS = 5000;
+
private MockedPowerHalService mPowerHal;
- private SystemIntefaceImpl mSystemInterface;
+ private SystemInterfaceImpl mSystemInterface;
private CarPowerManagementService mService;
private final PowerEventListener mPowerEventListener = new PowerEventListener();
private PowerEventProcessingHandlerImpl mPowerEventProcessingHandler;
@@ -43,7 +45,7 @@
super.setUp();
mPowerHal = new MockedPowerHalService(true /*isPowerStateSupported*/,
true /*isDeepSleepAllowed*/, true /*isTimedWakeupAllowed*/);
- mSystemInterface = new SystemIntefaceImpl();
+ mSystemInterface = new SystemInterfaceImpl();
}
@Override
@@ -55,7 +57,7 @@
}
public void testBootComplete() throws Exception {
- mService = new CarPowerManagementService(getContext(), mPowerHal, mSystemInterface);
+ mService = new CarPowerManagementService(mPowerHal, mSystemInterface);
mService.init();
mService.registerPowerEventListener(mPowerEventListener);
mPowerEventProcessingHandler = new PowerEventProcessingHandlerImpl(0, 0);
@@ -65,7 +67,7 @@
}
public void testDisplayOff() throws Exception {
- mService = new CarPowerManagementService(getContext(), mPowerHal, mSystemInterface);
+ mService = new CarPowerManagementService(mPowerHal, mSystemInterface);
mService.init();
mService.registerPowerEventListener(mPowerEventListener);
mPowerEventProcessingHandler = new PowerEventProcessingHandlerImpl(0, 0);
@@ -82,7 +84,7 @@
// start with display off
mSystemInterface.setDisplayState(false);
mSystemInterface.waitForDisplayStateChange(WAIT_TIMEOUT_MS);
- mService = new CarPowerManagementService(getContext(), mPowerHal, mSystemInterface);
+ mService = new CarPowerManagementService(mPowerHal, mSystemInterface);
mService.init();
mService.registerPowerEventListener(mPowerEventListener);
mPowerEventProcessingHandler = new PowerEventProcessingHandlerImpl(0, 0);
@@ -96,7 +98,7 @@
public void testShutdown() throws Exception {
final int wakeupTime = 100;
- mService = new CarPowerManagementService(getContext(), mPowerHal, mSystemInterface);
+ mService = new CarPowerManagementService(mPowerHal, mSystemInterface);
mService.init();
mService.registerPowerEventListener(mPowerEventListener);
mPowerEventProcessingHandler = new PowerEventProcessingHandlerImpl(0, wakeupTime);
@@ -116,7 +118,7 @@
public void testShutdownWithProcessing() throws Exception {
final long processingTimeMs = 3000;
final int wakeupTime = 100;
- mService = new CarPowerManagementService(getContext(), mPowerHal, mSystemInterface);
+ mService = new CarPowerManagementService(mPowerHal, mSystemInterface);
mService.init();
mService.registerPowerEventListener(mPowerEventListener);
mPowerEventProcessingHandler = new PowerEventProcessingHandlerImpl(processingTimeMs,
@@ -137,7 +139,7 @@
public void testSleepEntryAndWakeup() throws Exception {
final int wakeupTime = 100;
- mService = new CarPowerManagementService(getContext(), mPowerHal, mSystemInterface);
+ mService = new CarPowerManagementService(mPowerHal, mSystemInterface);
mService.init();
mService.registerPowerEventListener(mPowerEventListener);
mPowerEventProcessingHandler = new PowerEventProcessingHandlerImpl(0, wakeupTime);
@@ -161,7 +163,7 @@
public void testSleepEntryAndPowerOnWithProcessing() throws Exception {
final long processingTimeMs = 3000;
final int wakeupTime = 100;
- mService = new CarPowerManagementService(getContext(), mPowerHal, mSystemInterface);
+ mService = new CarPowerManagementService(mPowerHal, mSystemInterface);
mService.init();
mService.registerPowerEventListener(mPowerEventListener);
mPowerEventProcessingHandler = new PowerEventProcessingHandlerImpl(processingTimeMs,
@@ -191,7 +193,7 @@
public void testSleepEntryAndWakeUpForProcessing() throws Exception {
final long processingTimeMs = 3000;
final int wakeupTime = 100;
- mService = new CarPowerManagementService(getContext(), mPowerHal, mSystemInterface);
+ mService = new CarPowerManagementService(mPowerHal, mSystemInterface);
mService.init();
mService.registerPowerEventListener(mPowerEventListener);
mPowerEventProcessingHandler = new PowerEventProcessingHandlerImpl(processingTimeMs,
@@ -257,7 +259,7 @@
}
}
- private class SystemIntefaceImpl implements CarPowerManagementService.SystemInteface {
+ private static class SystemInterfaceImpl extends SystemInterface {
private boolean mDisplayOn = true;
private final Semaphore mDisplayStateWait = new Semaphore(0);
@@ -269,7 +271,6 @@
@Override
public synchronized void setDisplayState(boolean on) {
- Log.i(TAG, "SystemIntefaceImpl.setDisplayState " + on);
mDisplayOn = on;
mDisplayStateWait.release();
}
diff --git a/tests/libvehiclenetwork-java-test/Android.mk b/tests/libvehiclenetwork-java-test/Android.mk
deleted file mode 100644
index 6dae564..0000000
--- a/tests/libvehiclenetwork-java-test/Android.mk
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright (C) 2015 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.
-#
-#
-
-LOCAL_PATH:= $(call my-dir)
-##################################
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := LibVehicleNetworkJavaTest
-
-LOCAL_CERTIFICATE := platform
-
-LOCAL_MODULE_TAGS := tests
-
-# When built explicitly put it in the data partition
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_STATIC_JAVA_LIBRARIES += libvehiclenetwork-java
-
-LOCAL_JAVA_LIBRARIES := android.test.runner
-
-include $(BUILD_PACKAGE)
-
-##################################
-include $(CLEAR_VARS)
-#vendor_vns_policy for testing purpose
-LOCAL_MODULE := vendor_vns_policy.xml
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-LOCAL_MODULE_TAGS := tests
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/vns
-include $(BUILD_PREBUILT)
-
diff --git a/tests/libvehiclenetwork-java-test/AndroidManifest.xml b/tests/libvehiclenetwork-java-test/AndroidManifest.xml
deleted file mode 100644
index 99fe234..0000000
--- a/tests/libvehiclenetwork-java-test/AndroidManifest.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
- package="com.android.car.vehiclenetwork.libtest"
- android:sharedUserId="android.uid.system" >
-
- <instrumentation android:name="android.test.InstrumentationTestRunner"
- android:targetPackage="com.android.car.vehiclenetwork.libtest"
- android:label="Tests for Car APIs"/>
-
- <application android:label="LibVehicleNetworkJavaTest">
- <uses-library android:name="android.test.runner" />
- </application>
-</manifest>
diff --git a/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkMockedTest.java b/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkMockedTest.java
deleted file mode 100644
index 2d7cf1e..0000000
--- a/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkMockedTest.java
+++ /dev/null
@@ -1,596 +0,0 @@
-/*
- * Copyright (C) 2015 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 com.android.car.vehiclenetwork.libtest;
-
-import android.os.HandlerThread;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.util.Log;
-
-import com.android.car.vehiclenetwork.VehicleNetwork;
-import com.android.car.vehiclenetwork.VehicleNetwork.SubscribeFlags;
-import com.android.car.vehiclenetwork.VehicleNetwork.VehicleNetworkHalMock;
-import com.android.car.vehiclenetwork.VehicleNetwork.VehicleNetworkListener;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZone;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValues;
-import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-@MediumTest
-public class VehicleNetworkMockedTest extends AndroidTestCase {
- private static final String TAG = VehicleNetworkMockedTest.class.getSimpleName();
-
- private static final long TIMEOUT_MS = 1000;
-
- private static final int CUSTOM_PROPERTY_INT32 =
- VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START;
- private static final int CUSTOM_PROPERTY_ZONED_INT32 =
- VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 1;
- private static final int CUSTOM_PROPERTY_ZONED_INT32_VEC2 =
- VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 2;
- private static final int CUSTOM_PROPERTY_ZONED_INT32_VEC3 =
- VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 3;
- private static final int CUSTOM_PROPERTY_ZONED_FLOAT_VEC2 =
- VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 4;
- private static final int CUSTOM_PROPERTY_ZONED_FLOAT_VEC3 =
- VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 5;
- private static final int CUSTOM_PROPERTY_FLOAT_VEC2 =
- VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 6;
- private static final int CUSTOM_PROPERTY_INT32_VEC2 =
- VehicleNetworkConsts.VEHICLE_PROPERTY_CUSTOM_START + 7;
-
- private final HandlerThread mHandlerThread = new HandlerThread(
- VehicleNetworkTest.class.getSimpleName());
- private VehicleNetwork mVehicleNetwork;
- private EventListener mListener = new EventListener();
- private final VehicleHalMock mVehicleHalMock = new VehicleHalMock();
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mHandlerThread.start();
- mVehicleNetwork = VehicleNetwork.createVehicleNetwork(mListener,
- mHandlerThread.getLooper());
- mVehicleHalMock.registerProperty(
- VehiclePropConfigUtil.createProperty(
- CUSTOM_PROPERTY_INT32,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32, 0x0),
- new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createIntValue(
- CUSTOM_PROPERTY_INT32, 0, 0)));
- mVehicleHalMock.registerProperty(
- VehiclePropConfigUtil.createProperty(
- CUSTOM_PROPERTY_ZONED_INT32,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32, 0x0),
- new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedIntValue(
- CUSTOM_PROPERTY_ZONED_INT32, VehicleZone.VEHICLE_ZONE_ROW_2_LEFT, 0, 0)));
- mVehicleHalMock.registerProperty(
- VehiclePropConfigUtil.createProperty(
- CUSTOM_PROPERTY_ZONED_INT32_VEC2,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2, 0x0),
- new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedIntVectorValue(
- CUSTOM_PROPERTY_ZONED_INT32_VEC2,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
- new int[2], 0)));
- mVehicleHalMock.registerProperty(
- VehiclePropConfigUtil.createProperty(
- CUSTOM_PROPERTY_INT32_VEC2,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2, 0x0),
- new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createIntVectorValue(
- CUSTOM_PROPERTY_INT32_VEC2, new int[2], 0)));
- mVehicleHalMock.registerProperty(
- VehiclePropConfigUtil.createZonedProperty(
- CUSTOM_PROPERTY_ZONED_INT32_VEC3,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
- 0x0),
- new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedIntVectorValue(
- CUSTOM_PROPERTY_ZONED_INT32_VEC3,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
- new int[3], 0)));
- mVehicleHalMock.registerProperty(
- VehiclePropConfigUtil.createZonedProperty(
- CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
- 0x0),
- new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedFloatVectorValue(
- CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
- new float[2], 0)));
- mVehicleHalMock.registerProperty(
- VehiclePropConfigUtil.createProperty(
- CUSTOM_PROPERTY_FLOAT_VEC2,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC2, 0x0),
- new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createFloatVectorValue(
- CUSTOM_PROPERTY_FLOAT_VEC2, new float[2], 0)));
- mVehicleHalMock.registerProperty(
- VehiclePropConfigUtil.createZonedProperty(
- CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
- VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
- VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
- 0x0),
- new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedFloatVectorValue(
- CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
- new float[3], 0)));
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- mHandlerThread.quit();
- mVehicleNetwork.stopMocking();
- }
-
- public void testHalRestartListening() throws Exception {
- mVehicleNetwork.startHalRestartMonitoring();
- mVehicleNetwork.startMocking(mVehicleHalMock);
- assertTrue(mListener.waitForHalRestartAndAssert(TIMEOUT_MS, true /*expectedInMocking*/));
- mVehicleNetwork.stopMocking();
- assertTrue(mListener.waitForHalRestartAndAssert(TIMEOUT_MS, false /*expectedInMocking*/));
- mVehicleNetwork.stopHalRestartMonitoring();
- }
-
- public void testCustomZonedIntProperties() {
- final int INT_VALUE = 10;
- final int INT_VALUE2 = 20;
-
- mVehicleNetwork.startMocking(mVehicleHalMock);
-
- mVehicleNetwork.setIntProperty(CUSTOM_PROPERTY_INT32, INT_VALUE);
- assertEquals(INT_VALUE, mVehicleNetwork.getIntProperty(CUSTOM_PROPERTY_INT32));
-
- mVehicleNetwork.setZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
- VehicleZone.VEHICLE_ZONE_ROW_2_LEFT, INT_VALUE);
- mVehicleNetwork.setZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
- VehicleZone.VEHICLE_ZONE_ROW_2_RIGHT, INT_VALUE2);
-
- assertEquals(INT_VALUE,
- mVehicleNetwork.getZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
- VehicleZone.VEHICLE_ZONE_ROW_2_LEFT));
- assertEquals(INT_VALUE2,
- mVehicleNetwork.getZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
- VehicleZone.VEHICLE_ZONE_ROW_2_RIGHT));
- assertEquals(INT_VALUE,
- mVehicleNetwork.getZonedIntProperty(CUSTOM_PROPERTY_ZONED_INT32,
- VehicleZone.VEHICLE_ZONE_ROW_2_LEFT));
- }
-
- public void testCustomZonedIntVecProperties() {
- final int[] ZONED_INT_VALUE_LEFT = new int[] {30, 40};
- final int[] ZONED_INT_VALUE_RIGHT = new int[] {50, 60};
- final int[] ZONED_INT_VALUE_VEC3 = new int[] {30, 40, 50};
-
- mVehicleNetwork.startMocking(mVehicleHalMock);
-
- int[] actualValue = mVehicleNetwork.getZonedIntVectorProperty(
- CUSTOM_PROPERTY_ZONED_INT32_VEC2,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
- // Verify the default values before calling setProperty.
- assertArrayEquals(new int[2], actualValue);
- mVehicleNetwork.setZonedIntVectorProperty(CUSTOM_PROPERTY_ZONED_INT32_VEC2,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
- ZONED_INT_VALUE_LEFT);
- actualValue = mVehicleNetwork.getZonedIntVectorProperty(
- CUSTOM_PROPERTY_ZONED_INT32_VEC2,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
- assertArrayEquals(ZONED_INT_VALUE_LEFT, actualValue);
-
- // Verify different zone for the same property
- mVehicleNetwork.setZonedIntVectorProperty(CUSTOM_PROPERTY_ZONED_INT32_VEC2,
- VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT,
- ZONED_INT_VALUE_RIGHT);
- actualValue = mVehicleNetwork.getZonedIntVectorProperty(
- CUSTOM_PROPERTY_ZONED_INT32_VEC2,
- VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT);
- assertArrayEquals(ZONED_INT_VALUE_RIGHT, actualValue);
-
- mVehicleNetwork.setZonedIntVectorProperty(CUSTOM_PROPERTY_ZONED_INT32_VEC3,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
- ZONED_INT_VALUE_VEC3);
- actualValue = mVehicleNetwork.getZonedIntVectorProperty(
- CUSTOM_PROPERTY_ZONED_INT32_VEC3,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
- assertArrayEquals(ZONED_INT_VALUE_VEC3, actualValue);
- }
-
- public void testCustomZonedFloatVecProperties() {
- final float[] ZONED_FLOAT_VALUE_LEFT = new float[] {30.1f, 40.3f};
- final float[] ZONED_FLOAT_VALUE_RIGHT = new float[] {50.5f, 60};
- final float[] ZONED_FLOAT_VALUE_VEC3 = new float[] {30, 40.3f, 50};
-
- mVehicleNetwork.startMocking(mVehicleHalMock);
-
- float[] actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
- CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
- // Verify the default values before calling setProperty.
- assertArrayEquals(new float[2], actualValue);
- mVehicleNetwork.setZonedFloatVectorProperty(CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
- ZONED_FLOAT_VALUE_LEFT);
- actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
- CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
- assertArrayEquals(ZONED_FLOAT_VALUE_LEFT, actualValue);
-
- // Verify different zone for the same property
- mVehicleNetwork.setZonedFloatVectorProperty(CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
- VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT,
- ZONED_FLOAT_VALUE_RIGHT);
- actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
- CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
- VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT);
- assertArrayEquals(ZONED_FLOAT_VALUE_RIGHT, actualValue);
-
- mVehicleNetwork.setZonedFloatVectorProperty(CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
- ZONED_FLOAT_VALUE_VEC3);
- actualValue = mVehicleNetwork.getZonedFloatVectorProperty(
- CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
- assertArrayEquals(ZONED_FLOAT_VALUE_VEC3, actualValue);
- }
-
- public void testCustomFloatVecProperties() {
- final float[] FLOAT_VALUE = new float[] {30.1f, 40.3f};
-
- mVehicleNetwork.startMocking(mVehicleHalMock);
-
- float[] actualValue = mVehicleNetwork.getFloatVectorProperty(
- CUSTOM_PROPERTY_FLOAT_VEC2);
- // Verify the default values before calling setProperty.
- assertArrayEquals(new float[2], actualValue);
- mVehicleNetwork.setFloatVectorProperty(CUSTOM_PROPERTY_FLOAT_VEC2, FLOAT_VALUE);
- actualValue = mVehicleNetwork.getFloatVectorProperty(
- CUSTOM_PROPERTY_FLOAT_VEC2);
- assertArrayEquals(FLOAT_VALUE, actualValue);
- }
-
- public void testCustomIntVecProperties() {
- final int[] INT32_VALUE = new int[] {30, 40};
-
- mVehicleNetwork.startMocking(mVehicleHalMock);
-
- int[] actualValue = mVehicleNetwork.getIntVectorProperty(
- CUSTOM_PROPERTY_INT32_VEC2);
- // Verify the default values before calling setProperty.
- assertArrayEquals(new int[2], actualValue);
- mVehicleNetwork.setIntVectorProperty(CUSTOM_PROPERTY_INT32_VEC2, INT32_VALUE);
- actualValue = mVehicleNetwork.getIntVectorProperty(
- CUSTOM_PROPERTY_INT32_VEC2);
- assertArrayEquals(INT32_VALUE, actualValue);
- }
-
- public void testGlobalErrorListening() throws Exception {
- mVehicleNetwork.startErrorListening();
- mVehicleNetwork.startMocking(mVehicleHalMock);
- final int ERROR_CODE = 0x1;
- final int ERROR_OPERATION = 0x10;
- mVehicleNetwork.injectHalError(ERROR_CODE, 0, ERROR_OPERATION);
- assertTrue(mListener.waitForHalErrorAndAssert(TIMEOUT_MS, ERROR_CODE, 0, ERROR_OPERATION));
- mVehicleNetwork.injectHalError(ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION);
- assertTrue(mListener.waitForHalErrorAndAssert(TIMEOUT_MS,
- ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION));
- mVehicleNetwork.stopMocking();
- mVehicleNetwork.stopErrorListening();
- }
-
- public void testPropertyErrorListening() throws Exception {
- mVehicleNetwork.startMocking(mVehicleHalMock);
- mVehicleNetwork.subscribe(CUSTOM_PROPERTY_INT32, 0);
- final int ERROR_CODE = 0x1;
- final int ERROR_OPERATION = 0x10;
- mVehicleNetwork.injectHalError(ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION);
- assertTrue(mListener.waitForHalErrorAndAssert(TIMEOUT_MS,
- ERROR_CODE, CUSTOM_PROPERTY_INT32, ERROR_OPERATION));
- mVehicleNetwork.unsubscribe(CUSTOM_PROPERTY_INT32);
- mVehicleNetwork.stopMocking();
- }
-
- public void testSubscribe() throws Exception {
- final int PROPERTY = CUSTOM_PROPERTY_ZONED_INT32_VEC3;
- final int ZONE = VehicleZone.VEHICLE_ZONE_ROW_1_LEFT;
- final int[] VALUES = new int[] {10, 20, 30};
- mVehicleNetwork.startMocking(mVehicleHalMock);
- mVehicleNetwork.subscribe(PROPERTY, 0, ZONE);
- VehiclePropValue value = VehiclePropValueUtil.createZonedIntVectorValue(
- PROPERTY, ZONE, VALUES, 0);
- mVehicleNetwork.injectEvent(value);
- assertTrue(mListener.waitForEvent(TIMEOUT_MS, value));
- mVehicleNetwork.unsubscribe(PROPERTY);
- }
-
- public void testSubscribe_OnPropertySet() throws Exception {
- final int PROPERTY = CUSTOM_PROPERTY_ZONED_INT32_VEC3;
- final int ZONE = VehicleZone.VEHICLE_ZONE_ROW_1_LEFT;
- final int[] VALUES = new int[] {10, 20, 30};
- mVehicleNetwork.startMocking(mVehicleHalMock);
- mVehicleNetwork.subscribe(PROPERTY, 0, ZONE, SubscribeFlags.SET_CALL);
-
- mVehicleNetwork.setZonedIntVectorProperty(PROPERTY, ZONE, VALUES);
-
- VehiclePropValue expectedValue = VehiclePropValueUtil.createZonedIntVectorValue(
- PROPERTY, ZONE, VALUES, 0);
-
- assertTrue(mListener.waitForOnPropertySet(TIMEOUT_MS, expectedValue));
-
- mVehicleNetwork.injectEvent(expectedValue);
- // Not subscribed to HAL events. No notifications expected here.
- assertFalse(mListener.waitForEvent(TIMEOUT_MS, expectedValue));
-
- mVehicleNetwork.unsubscribe(PROPERTY);
- }
-
- public void testSubscribe_HalEventAndOnPropertySet() throws Exception {
- final int PROPERTY = CUSTOM_PROPERTY_ZONED_INT32_VEC3;
- final int ZONE = VehicleZone.VEHICLE_ZONE_ROW_1_LEFT;
- final int[] VALUES = new int[] {10, 20, 30};
- mVehicleNetwork.startMocking(mVehicleHalMock);
- mVehicleNetwork.subscribe(PROPERTY, 0, ZONE,
- SubscribeFlags.SET_CALL | SubscribeFlags.HAL_EVENT);
-
- mVehicleNetwork.setZonedIntVectorProperty(PROPERTY, ZONE, VALUES);
-
- VehiclePropValue expectedValue = VehiclePropValueUtil.createZonedIntVectorValue(
- PROPERTY, ZONE, VALUES, 0);
-
- assertTrue(mListener.waitForOnPropertySet(TIMEOUT_MS, expectedValue));
-
- mVehicleNetwork.injectEvent(expectedValue);
- assertTrue(mListener.waitForEvent(TIMEOUT_MS, expectedValue));
-
- mVehicleNetwork.unsubscribe(PROPERTY);
- }
-
- public void testGetPropertyFailsForCustom() {
- try {
- mVehicleNetwork.getProperty(CUSTOM_PROPERTY_INT32);
- fail();
- } catch (IllegalArgumentException expected) {
- // Expected.
- }
- }
-
- private void assertArrayEquals(int[] expected, int[] actual) {
- assertEquals(Arrays.toString(expected), Arrays.toString(actual));
- }
-
- private void assertArrayEquals(float[] expected, float[] actual) {
- assertEquals(Arrays.toString(expected), Arrays.toString(actual));
- }
-
- private class EventListener implements VehicleNetworkListener {
- boolean mInMocking;
- int mErrorCode;
- int mErrorProperty;
- int mErrorOperation;
- VehiclePropValues mValuesReceived;
- VehiclePropValue mPropertySetValue;
-
- private final Semaphore mRestartWait = new Semaphore(0);
- private final Semaphore mErrorWait = new Semaphore(0);
- private final Semaphore mEventWait = new Semaphore(0);
- private final Semaphore mOnPropertySetWait = new Semaphore(0);
-
- @Override
- public void onVehicleNetworkEvents(VehiclePropValues values) {
- Log.i(TAG, "onVehicleNetworkEvents");
- mValuesReceived = values;
- mEventWait.release();
- }
-
- @Override
- public void onHalError(int errorCode, int property, int operation) {
- mErrorCode = errorCode;
- mErrorProperty = property;
- mErrorOperation = operation;
- mErrorWait.release();
- }
-
- public boolean waitForHalErrorAndAssert(long timeoutMs, int expectedErrorCode,
- int expectedErrorProperty, int expectedErrorOperation) throws Exception {
- if (!mErrorWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
- return false;
- }
- assertEquals(expectedErrorCode, mErrorCode);
- assertEquals(expectedErrorProperty, mErrorProperty);
- assertEquals(expectedErrorOperation, mErrorOperation);
- return true;
- }
-
- @Override
- public void onHalRestart(boolean inMocking) {
- mInMocking = inMocking;
- mRestartWait.release();
- }
-
- @Override
- public void onPropertySet(VehiclePropValue value) {
- mPropertySetValue = value;
- mOnPropertySetWait.release();
- }
-
- public boolean waitForHalRestartAndAssert(long timeoutMs, boolean expectedInMocking)
- throws Exception {
- if (!mRestartWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
- return false;
- }
- assertEquals(expectedInMocking, mInMocking);
- return true;
- }
-
- public boolean waitForEvent(long timeoutMs, VehiclePropValue expected)
- throws InterruptedException {
- if (!mEventWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
- Log.w(TAG, "Timed out waiting for event.");
- return false;
- }
- assertEquals(1, mValuesReceived.getValuesCount());
- assertEquals(VehiclePropValueUtil.toString(expected),
- VehiclePropValueUtil.toString(mValuesReceived.getValues(0)));
- return true;
- }
-
- public boolean waitForOnPropertySet(long timeoutMs, VehiclePropValue expected)
- throws InterruptedException {
- if (!mOnPropertySetWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
- Log.w(TAG, "Timed out waiting for onPropertySet.");
- return false;
- }
- assertEquals(VehiclePropValueUtil.toString(expected),
- VehiclePropValueUtil.toString(mPropertySetValue));
- return true;
- }
- }
-
- private interface VehiclePropertyHandler {
- void onPropertySet(VehiclePropValue value);
- VehiclePropValue onPropertyGet(VehiclePropValue property);
- void onPropertySubscribe(int property, float sampleRate, int zones);
- void onPropertyUnsubscribe(int property);
- }
-
- private class VehicleHalMock implements VehicleNetworkHalMock {
- private LinkedList<VehiclePropConfig> mConfigs = new LinkedList<>();
- private HashMap<Integer, VehiclePropertyHandler> mHandlers = new HashMap<>();
-
- public synchronized void registerProperty(VehiclePropConfig config,
- VehiclePropertyHandler handler) {
- int property = config.getProp();
- mConfigs.add(config);
- mHandlers.put(property, handler);
- }
-
- @Override
- public synchronized VehiclePropConfigs onListProperties() {
- Log.i(TAG, "onListProperties, num properties:" + mConfigs.size());
- VehiclePropConfigs configs =
- VehiclePropConfigs.newBuilder().addAllConfigs(mConfigs).build();
- return configs;
- }
-
- @Override
- public void onPropertySet(VehiclePropValue value) {
- int property = value.getProp();
- VehiclePropertyHandler handler = getPropertyHandler(property);
- if (handler == null) {
- fail("onPropertySet for unknown property " + Integer.toHexString(property));
- }
- handler.onPropertySet(value);
- }
-
- @Override
- public VehiclePropValue onPropertyGet(VehiclePropValue value) {
- int property = value.getProp();
- VehiclePropertyHandler handler = getPropertyHandler(property);
- if (handler == null) {
- fail("onPropertyGet for unknown property " + Integer.toHexString(property));
- }
- VehiclePropValue propValue = handler.onPropertyGet(value);
- return propValue;
- }
-
- @Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- VehiclePropertyHandler handler = getPropertyHandler(property);
- if (handler == null) {
- fail("onPropertySubscribe for unknown property " + Integer.toHexString(property));
- }
- handler.onPropertySubscribe(property, sampleRate, zones);
- }
-
- @Override
- public void onPropertyUnsubscribe(int property) {
- VehiclePropertyHandler handler = getPropertyHandler(property);
- if (handler == null) {
- fail("onPropertyUnsubscribe for unknown property " + Integer.toHexString(property));
- }
- handler.onPropertyUnsubscribe(property);
- }
-
- public synchronized VehiclePropertyHandler getPropertyHandler(int property) {
- return mHandlers.get(property);
- }
- }
-
- private class DefaultVehiclePropertyHandler implements VehiclePropertyHandler {
- private Map<Integer, VehiclePropValue> mZoneValueMap = new HashMap<>();
-
- DefaultVehiclePropertyHandler(VehiclePropValue initialValue) {
- setValue(initialValue);
- }
-
- @Override
- public void onPropertySet(VehiclePropValue value) {
- setValue(value);
- }
-
- @Override
- public synchronized VehiclePropValue onPropertyGet(VehiclePropValue property) {
- int zone = property.getZone();
- VehiclePropValue value = mZoneValueMap.get(zone);
- if (value == null) {
- Log.w(TAG, "Property not found: " + property.getProp() + ", zone: " + zone);
- }
- return value;
- }
-
- @Override
- public void onPropertySubscribe(int property, float sampleRate, int zones) {
- Log.i(TAG, "Property subscribed:0x" + Integer.toHexString(property) +
- " zones:0x" + Integer.toHexString(zones));
- }
-
- @Override
- public void onPropertyUnsubscribe(int property) {
- }
-
- private void setValue(VehiclePropValue value) {
- mZoneValueMap.put(value.getZone(), VehiclePropValue.newBuilder(value).build());
- }
- }
-}
diff --git a/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTest.java b/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTest.java
deleted file mode 100644
index 6ec9e54..0000000
--- a/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTest.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright (C) 2015 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 com.android.car.vehiclenetwork.libtest;
-
-import android.os.HandlerThread;
-import android.os.SystemClock;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.util.ArraySet;
-import android.util.Log;
-
-import com.android.car.vehiclenetwork.VehicleNetwork;
-import com.android.car.vehiclenetwork.VehicleNetwork.VehicleNetworkListener;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValues;
-import com.android.car.vehiclenetwork.VehicleNetworkProtoUtil;
-
-import java.util.LinkedList;
-
-@MediumTest
-public class VehicleNetworkTest extends AndroidTestCase {
- private static final String TAG = VehicleNetworkTest.class.getSimpleName();
- private static final long TIMEOUT_MS = 2000;
-
- private final HandlerThread mHandlerThread = new HandlerThread(
- VehicleNetworkTest.class.getSimpleName());
- private VehicleNetwork mVehicleNetwork;
- private final TestListener mListener = new TestListener();
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mHandlerThread.start();
- mVehicleNetwork = VehicleNetwork.createVehicleNetwork(mListener,
- mHandlerThread.getLooper());
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- mHandlerThread.quit();
- }
-
- public void testListProperties() {
- VehiclePropConfigs configs = mVehicleNetwork.listProperties();
- assertNotNull(configs);
- assertTrue(configs.getConfigsCount() > 0);
- Log.i(TAG, "got configs:" + configs.getConfigsCount());
- for (VehiclePropConfig config : configs.getConfigsList()) {
- Log.i(TAG, VehicleNetworkProtoUtil.VehiclePropConfigToString(config));
- }
-
- int oneProperty = configs.getConfigs(0).getProp();
- VehiclePropConfigs configs2 = mVehicleNetwork.listProperties(oneProperty);
- assertEquals(1, configs2.getConfigsCount());
- assertTrue(VehicleNetworkProtoUtil.VehiclePropConfigEquals(
- configs.getConfigs(0), configs2.getConfigs(0)));
-
- VehiclePropConfigs configs3 = mVehicleNetwork.listProperties(-1);
- assertNull(configs3);
- }
-
- public void testGetProperty() {
- try {
- VehiclePropValue value = mVehicleNetwork.getProperty(-1);
- fail();
- } catch (IllegalArgumentException e) {
- // expected
- }
- VehiclePropConfigs configs = mVehicleNetwork.listProperties();
- assertNotNull(configs);
- assertTrue(configs.getConfigsCount() > 0);
- Log.i(TAG, "got configs:" + configs.getConfigsCount());
- for (VehiclePropConfig config : configs.getConfigsList()) {
- if ((config.getAccess() & VehiclePropAccess.VEHICLE_PROP_ACCESS_READ) != 0) {
- if (config.getProp() == VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET) {
- continue;
- }
- if (config.getProp() >= VehicleNetworkConsts.VEHICLE_PROPERTY_INTERNAL_START &&
- config.getProp() <= VehicleNetworkConsts.VEHICLE_PROPERTY_INTERNAL_END) {
- // internal property requires write to read
- VehiclePropValue v = VehicleNetworkTestUtil.createDummyValue(config.getProp(),
- config.getValueType());
- mVehicleNetwork.setProperty(v);
- }
- VehiclePropValue value = mVehicleNetwork.getProperty(config.getProp());
- assertEquals(config.getProp(), value.getProp());
- assertEquals(config.getValueType(), value.getValueType());
- Log.i(TAG, " got property:" +
- VehicleNetworkProtoUtil.VehiclePropValueToString(value));
- }
- }
- }
-
- public void testSetProperty() {
- try {
- VehiclePropValue value = VehiclePropValue.newBuilder().
- setProp(-1).
- setValueType(VehicleValueType.VEHICLE_VALUE_TYPE_INT32).
- addInt32Values(0).
- build();
- mVehicleNetwork.setProperty(value);
- fail();
- } catch (SecurityException e) {
- // expected
- }
- VehiclePropConfigs configs = mVehicleNetwork.listProperties();
- assertNotNull(configs);
- assertTrue(configs.getConfigsCount() > 0);
- Log.i(TAG, "got configs:" + configs.getConfigsCount());
- for (VehiclePropConfig config : configs.getConfigsList()) {
- if ((config.getAccess() & VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE) != 0) {
- if (config.getValueType() == VehicleValueType.VEHICLE_VALUE_TYPE_INT32) {
- VehiclePropValue value = VehiclePropValue.newBuilder().
- setProp(config.getProp()).
- setValueType(config.getValueType()).
- addInt32Values(0).
- build();
- mVehicleNetwork.setProperty(value);
- }
- } else {
- try {
- VehiclePropValue value = VehiclePropValue.newBuilder().
- setProp(config.getProp()).
- setValueType(config.getValueType()).
- build();
- mVehicleNetwork.setProperty(value);
- fail();
- } catch (IllegalArgumentException e) {
- // expected
- }
- }
- }
- }
-
- public void testSubscribe() throws Exception {
- try {
- mVehicleNetwork.subscribe(-1, 0);
- fail();
- } catch (SecurityException e) {
- //expected
- }
- VehiclePropConfigs configs = mVehicleNetwork.listProperties();
- assertNotNull(configs);
- assertTrue(configs.getConfigsCount() > 0);
- Log.i(TAG, "got configs:" + configs.getConfigsCount());
- LinkedList<Integer> subscribedProperties = new LinkedList<Integer>();
- for (VehiclePropConfig config : configs.getConfigsList()) {
- if (config.getChangeMode() == VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_STATIC) {
- // cannot subscribe
- try {
- mVehicleNetwork.subscribe(config.getProp(), config.getSampleRateMin());
- fail();
- } catch (IllegalArgumentException e) {
- //expected
- }
- } else if ((config.getAccess() & VehiclePropAccess.VEHICLE_PROP_ACCESS_READ) != 0){
- mVehicleNetwork.subscribe(config.getProp(), config.getSampleRateMin());
- subscribedProperties.add(config.getProp());
- if (config.getProp() >= VehicleNetworkConsts.VEHICLE_PROPERTY_INTERNAL_START &&
- config.getProp() <= VehicleNetworkConsts.VEHICLE_PROPERTY_INTERNAL_END) {
- // internal property requires write to get notification
- VehiclePropValue v = VehicleNetworkTestUtil.createDummyValue(config.getProp(),
- config.getValueType());
- mVehicleNetwork.setProperty(v);
- }
- }
- }
- // now confirm event
- for (Integer prop : subscribedProperties) {
- mListener.waitForEvent(prop, TIMEOUT_MS);
- mVehicleNetwork.unsubscribe(prop);
- }
- // wait for already patched events to go away.
- Thread.sleep(1000);
- mListener.resetEventRecord();
- Thread.sleep(2000);
- assertEquals(0, mListener.getActiveEventsCount());
- }
-
- private class TestListener implements VehicleNetworkListener {
- private final ArraySet<Integer> mEventRecord = new ArraySet<Integer>();
-
- @Override
- public void onVehicleNetworkEvents(VehiclePropValues values) {
- for (VehiclePropValue value : values.getValuesList()) {
- Log.i(TAG, "event " + VehicleNetworkProtoUtil.VehiclePropValueToString(value));
- synchronized (this) {
- mEventRecord.add(value.getProp());
- notifyAll();
- }
- }
- }
-
- @Override
- public void onHalError(int errorCode, int property, int operation) {
- }
-
- @Override
- public void onHalRestart(boolean inMocking) {
- }
-
- @Override
- public void onPropertySet(VehiclePropValue value) { }
-
- private synchronized boolean waitForEvent(Integer prop, long timeoutMs)
- throws InterruptedException {
- long now = SystemClock.elapsedRealtime();
- long end = now + timeoutMs;
- long timeToWait = end - now;
- while (timeToWait > 0 && !mEventRecord.contains(prop)) {
- wait(timeToWait);
- timeToWait = end - SystemClock.elapsedRealtime();
- }
- return mEventRecord.contains(prop);
- }
-
- private synchronized void resetEventRecord() {
- mEventRecord.clear();
- }
-
- private synchronized int getActiveEventsCount() {
- return mEventRecord.size();
- }
- }
-}
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
deleted file mode 100644
index 91c155b..0000000
--- a/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTestUtil.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2015 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 com.android.car.vehiclenetwork.libtest;
-
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.google.protobuf.ByteString;
-
-public class VehicleNetworkTestUtil {
-
- public static VehiclePropValue createDummyValue(int prop, int valueType) {
- VehiclePropValue.Builder builder = VehiclePropValue.newBuilder().
- setProp(prop).
- setValueType(valueType);
- switch (valueType) {
- case VehicleValueType.VEHICLE_VALUE_TYPE_STRING:
- builder.setStringValue("");
- break;
- case VehicleValueType.VEHICLE_VALUE_TYPE_BYTES:
- builder.setBytesValue(ByteString.copyFrom(new byte[1]));
- break;
- case VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN:
- builder.addInt32Values(0);
- break;
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN:
- builder.setZone(0).addInt32Values(0);
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT:
- builder.setZone(0).addFloatValues(0f);
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT64:
- builder.setInt64Value(0);
- break;
- case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT:
- case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC2:
- case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC3:
- case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC4: {
- int n = valueType - VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT + 1;
- for (int i = 0; i < n; i++) {
- builder.addFloatValues(0f);
- }
- } break;
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT32:
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2:
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC3:
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4: {
- int n = valueType - VehicleValueType.VEHICLE_VALUE_TYPE_INT32 + 1;
- for (int i = 0; i < n; i++) {
- builder.addInt32Values(0);
- }
- } break;
- }
- return builder.build();
- }
-}
diff --git a/tests/libvehiclenetwork-java-test/vendor_vns_policy.xml b/tests/libvehiclenetwork-java-test/vendor_vns_policy.xml
deleted file mode 100644
index 8d48fdb..0000000
--- a/tests/libvehiclenetwork-java-test/vendor_vns_policy.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<ALLOW>
- <PROPERTY name="CUSTOM_PROPERTY_INT32" value = "0x70000000">
- <UID name="AID_SYSTEM" access="rw" value="1000"/>
- </PROPERTY>
-
- <PROPERTY name="CUSTOM_PROPERTY_ZONED_INT32" value = "0x70000001">
- <UID name="AID_SYSTEM" access="rw" value="1000"/>
- </PROPERTY>
-
- <PROPERTY name="CUSTOM_PROPERTY_ZONED_INT32_VEC2" value = "0x70000002">
- <UID name="AID_SYSTEM" access="rw" value="1000"/>
- </PROPERTY>
-
- <PROPERTY name="CUSTOM_PROPERTY_ZONED_INT32_VEC3" value = "0x70000003">
- <UID name="AID_SYSTEM" access="rw" value="1000"/>
- </PROPERTY>
-
- <PROPERTY name="CUSTOM_PROPERTY_ZONED_FLOAT_VEC2" value = "0x70000004">
- <UID name="AID_SYSTEM" access="rw" value="1000"/>
- </PROPERTY>
-
- <PROPERTY name="CUSTOM_PROPERTY_ZONED_FLOAT_VEC3" value = "0x70000005">
- <UID name="AID_SYSTEM" access="rw" value="1000"/>
- </PROPERTY>
-
- <PROPERTY name="CUSTOM_PROPERTY_FLOAT_VEC2" value = "0x70000006">
- <UID name="AID_SYSTEM" access="rw" value="1000"/>
- </PROPERTY>
-
- <PROPERTY name="CUSTOM_PROPERTY_INT32_VEC2" value = "0x70000007">
- <UID name="AID_SYSTEM" access="rw" value="1000"/>
- </PROPERTY>
-</ALLOW>
-
diff --git a/tests/vehicle_hal_test/Android.mk b/tests/vehicle_hal_test/Android.mk
deleted file mode 100644
index 77bc6f8..0000000
--- a/tests/vehicle_hal_test/Android.mk
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright (C) 2016 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.
-#
-#
-
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := AndroidVehicleHalTests
-
-# for system|priviledged permission.
-LOCAL_CERTIFICATE := platform
-
-LOCAL_MODULE_TAGS := tests
-
-# When built explicitly put it in the data partition
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_STATIC_JAVA_LIBRARIES := libvehiclenetwork-java
-
-LOCAL_JAVA_LIBRARIES := android.car android.test.runner
-
-include $(BUILD_PACKAGE)
diff --git a/tests/vehicle_hal_test/AndroidManifest.xml b/tests/vehicle_hal_test/AndroidManifest.xml
deleted file mode 100644
index 5fbb62d..0000000
--- a/tests/vehicle_hal_test/AndroidManifest.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
- package="com.android.car.vehiclenetwork.haltest"
- android:sharedUserId="android.uid.system" >
-
- <instrumentation android:name="android.test.InstrumentationTestRunner"
- android:targetPackage="com.android.car.vehiclenetwork.haltest"
- android:label="Tests for vehicle hal using vehicle network service"/>
-
- <application android:label="VehicleHalTest">
- <uses-library android:name="android.test.runner" />
- <activity android:name=".TestCarProxyActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
- </application>
-</manifest>
diff --git a/tests/vehicle_hal_test/src/com/android/car/vehiclenetwork/haltest/HvacVnsHalTest.java b/tests/vehicle_hal_test/src/com/android/car/vehiclenetwork/haltest/HvacVnsHalTest.java
deleted file mode 100644
index 6111746..0000000
--- a/tests/vehicle_hal_test/src/com/android/car/vehiclenetwork/haltest/HvacVnsHalTest.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2016 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 com.android.car.vehiclenetwork.haltest;
-
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_AC_ON;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_DEFROSTER;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_DIRECTION;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_SPEED;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_MAX_AC_ON;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_RECIRC_ON;
-
-import android.util.Log;
-
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleHvacFanDirection;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-
-/**
- * Test HVAC vehicle HAL using vehicle network service.
- */
-public class HvacVnsHalTest extends VnsHalBaseTestCase {
-
- public void testAcProperty() throws Exception {
- int propertyId = VEHICLE_PROPERTY_HVAC_AC_ON;
- if (!isPropertyAvailable(propertyId)) {
- return;
- }
-
- VehiclePropConfig config = mConfigsMap.get(propertyId);
- assertEquals(VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN, config.getValueType());
- assertEquals(VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE, config.getAccess());
-
- int zone = getFirstZoneForProperty(propertyId);
- setPropertyAndVerify(propertyId, zone, false);
-
- mVehicleNetwork.subscribe(propertyId, 0, 0);
- mListener.reset();
- mListener.addExpectedValues(propertyId, zone, true);
- setPropertyAndVerify(propertyId, zone, true);
- mListener.waitAndVerifyValues();
- }
-
- public void testRecirculateProperty() {
- int propertyId = VEHICLE_PROPERTY_HVAC_RECIRC_ON;
- if (!isPropertyAvailable(propertyId)) {
- return;
- }
- VehiclePropConfig config = mConfigsMap.get(propertyId);
- assertEquals(VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN, config.getValueType());
- assertEquals(VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE, config.getAccess());
-
- // Verify subsequent calls ends-up with right value.
- mVehicleNetwork.setBooleanProperty(propertyId, false);
- mVehicleNetwork.setBooleanProperty(propertyId, true);
- mVehicleNetwork.setBooleanProperty(propertyId, false);
- mVehicleNetwork.setBooleanProperty(propertyId, true);
- verifyValue(propertyId, true);
-
- // Verify subsequent calls ends-up with right value.
- mVehicleNetwork.setBooleanProperty(propertyId, false);
- mVehicleNetwork.setBooleanProperty(propertyId, true);
- mVehicleNetwork.setBooleanProperty(propertyId, false);
- verifyValue(propertyId, false);
-
- setPropertyAndVerify(propertyId, false);
- setPropertyAndVerify(propertyId, true);
- setPropertyAndVerify(propertyId, false);
- }
-
- public void testMaxAcProperty() throws Exception {
- if (!isPropertyAvailable(
- VEHICLE_PROPERTY_HVAC_MAX_AC_ON,
- VEHICLE_PROPERTY_HVAC_AC_ON,
- VEHICLE_PROPERTY_HVAC_RECIRC_ON)) {
- return;
- }
- VehiclePropConfig config = mConfigsMap.get(VEHICLE_PROPERTY_HVAC_MAX_AC_ON);
- assertEquals(VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN, config.getValueType());
- assertEquals(VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE, config.getAccess());
-
- int acZone = getFirstZoneForProperty(VEHICLE_PROPERTY_HVAC_AC_ON);
-
- // Turn off related properties.
- setPropertyAndVerify(VEHICLE_PROPERTY_HVAC_MAX_AC_ON, false);
- setPropertyAndVerify(VEHICLE_PROPERTY_HVAC_AC_ON, acZone, false);
- setPropertyAndVerify(VEHICLE_PROPERTY_HVAC_RECIRC_ON, false);
-
- // Now turning max A/C and verify that other related HVAC props turned on.
- mVehicleNetwork.subscribe(VEHICLE_PROPERTY_HVAC_AC_ON, 0f, acZone);
- mVehicleNetwork.subscribe(VEHICLE_PROPERTY_HVAC_RECIRC_ON, 0f);
- mListener.reset();
- mListener.addExpectedValues(VEHICLE_PROPERTY_HVAC_AC_ON, acZone, true);
- mListener.addExpectedValues(VEHICLE_PROPERTY_HVAC_RECIRC_ON, 0, true);
- setPropertyAndVerify(VEHICLE_PROPERTY_HVAC_MAX_AC_ON, true);
- verifyValue(VEHICLE_PROPERTY_HVAC_AC_ON, acZone, true);
- verifyValue(VEHICLE_PROPERTY_HVAC_RECIRC_ON, true);
- mListener.waitAndVerifyValues();
-
- // When max A/C turned off, A/C should remain to be turned on, but circulation should has
- // the value it had before turning max A/C on, which if OFF in this case.
- setPropertyAndVerify(VEHICLE_PROPERTY_HVAC_MAX_AC_ON, false);
- verifyValue(VEHICLE_PROPERTY_HVAC_AC_ON, acZone, true);
- verifyValue(VEHICLE_PROPERTY_HVAC_RECIRC_ON, false);
- }
-
- public void testDefroster() {
- final int propertyId = VEHICLE_PROPERTY_HVAC_DEFROSTER;
- if (!isPropertyAvailable(propertyId)) {
- return;
- }
-
- VehiclePropConfig config = mConfigsMap.get(propertyId);
- assertEquals(VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN, config.getValueType());
- assertEquals(VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE, config.getAccess());
-
- iterateOnZones(config, (message, zone, minValue, maxValue) -> {
- Log.i(TAG, "testDefroster, " + message);
- setPropertyAndVerify(propertyId, zone, false);
- setPropertyAndVerify(propertyId, zone, true);
- });
- }
-
- public void testFanSpeed() throws Exception {
- if (!isPropertyAvailable(VEHICLE_PROPERTY_HVAC_FAN_SPEED)) {
- return;
- }
-
- VehiclePropConfig config = mConfigsMap.get(VEHICLE_PROPERTY_HVAC_FAN_SPEED);
- assertEquals(VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32, config.getValueType());
- assertEquals(VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE, config.getAccess());
-
- verifyIntZonedProperty(VEHICLE_PROPERTY_HVAC_FAN_SPEED);
- }
-
- public void testFanDirection() throws Exception {
- final int propertyId = VEHICLE_PROPERTY_HVAC_FAN_DIRECTION;
-
- if (!isPropertyAvailable(propertyId)) {
- return;
- }
-
- VehiclePropConfig config = mConfigsMap.get(propertyId);
- assertEquals(VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32, config.getValueType());
- assertEquals(VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE, config.getAccess());
-
- // Assert setting edge-case values.
- iterateOnZones(config, (message, zone, minValue, maxValue) -> {
- setPropertyAndVerify(message, propertyId, zone, minValue);
- setPropertyAndVerify(message, propertyId, zone, maxValue);
- });
-
- iterateOnZones(config, ((message, zone, minValue, maxValue)
- -> setPropertyAndVerify(message, propertyId, zone,
- VehicleHvacFanDirection.VEHICLE_HVAC_FAN_DIRECTION_DEFROST_AND_FLOOR)));
- }
-}
diff --git a/tests/vehicle_hal_test/src/com/android/car/vehiclenetwork/haltest/RecordingVehicleNetworkListener.java b/tests/vehicle_hal_test/src/com/android/car/vehiclenetwork/haltest/RecordingVehicleNetworkListener.java
deleted file mode 100644
index 282d9e9..0000000
--- a/tests/vehicle_hal_test/src/com/android/car/vehiclenetwork/haltest/RecordingVehicleNetworkListener.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (C) 2016 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 com.android.car.vehiclenetwork.haltest;
-
-import static java.lang.Integer.toHexString;
-import static junit.framework.Assert.assertTrue;
-
-import android.util.Log;
-
-import com.android.car.vehiclenetwork.VehicleNetwork.VehicleNetworkListener;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValues;
-import com.android.car.vehiclenetwork.VehicleNetworkProtoUtil;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
-
-/**
- * This class must be used in testing environment only. Here's an example of usage:
- * <ul>
- * <li>listener.reset();
- * <li>listener.addExpectedValues(myPropertyId, myZone, 10, 20, 30)
- * <li>... set values through VehicleNetworkService ...
- * <li>listener.waitAndVerifyValues()
- *</ul>
- *
- */
-class RecordingVehicleNetworkListener implements VehicleNetworkListener {
-
- private final static String TAG = VnsHalBaseTestCase.TAG;
- private final static int EVENTS_WAIT_TIMEOUT_MS = 2000;
-
- private final Set<NormalizedValue> mExpectedValues = new HashSet<>();
- // Using Set here instead of List as we probably shouldn't assert the order event was received.
- private final Set<NormalizedValue> mRecordedEvents = new HashSet<>();
-
- synchronized void reset() {
- mExpectedValues.clear();
- mRecordedEvents.clear();
- }
-
- void addExpectedValues(int propertyId, int zone, Object... values) {
- for (Object value : values) {
- mExpectedValues.add(NormalizedValue.createFor(propertyId, zone, value));
- }
- }
-
- /**
- * Waits for events to come for #EVENTS_WAIT_TIMEOUT_MS milliseconds and asserts that recorded
- * values match with expected.
- * */
- synchronized void waitAndVerifyValues() throws InterruptedException {
- long currentTime = System.currentTimeMillis();
- long deadline = currentTime + EVENTS_WAIT_TIMEOUT_MS;
- while (currentTime < deadline && !isExpectedMatchedRecorded()) {
- wait(deadline - currentTime);
- currentTime = System.currentTimeMillis();
- }
- assertTrue("Expected values: " + Arrays.toString(mExpectedValues.toArray())
- + " doesn't match recorded: " + Arrays.toString(mRecordedEvents.toArray()),
- isExpectedMatchedRecorded());
- }
-
- private boolean isExpectedMatchedRecorded() {
- for (NormalizedValue expectedValue : mExpectedValues) {
- if (!mRecordedEvents.contains(expectedValue)) {
- return false;
- }
- }
- return true;
- }
-
- @Override
- public void onVehicleNetworkEvents(VehiclePropValues values) {
- for (VehiclePropValue value : values.getValuesList()) {
- Log.d(TAG, "onVehicleNetworkEvents, value: "
- + VehicleNetworkProtoUtil.VehiclePropValueToString(value));
-
- synchronized (this) {
- mRecordedEvents.add(NormalizedValue.createFor(value));
- notifyAll();
- }
- }
- }
-
- @Override
- public void onHalError(int errorCode, int property, int operation) {
- }
-
- @Override
- public void onHalRestart(boolean inMocking) {
- }
-
- @Override
- public void onPropertySet(VehiclePropValue value) {
- }
-
- // To be used to compare expected vs recorded values.
- private static class NormalizedValue {
- private final int propertyId;
- private final int zone;
- private final List<Object> value;
-
- static NormalizedValue createFor(VehiclePropValue value) {
- return new NormalizedValue(value.getProp(), value.getZone(), getObjectValue(value));
- }
-
- static NormalizedValue createFor(int propertyId, int zone, Object value) {
- return new NormalizedValue(propertyId, zone, wrapSingleObjectToList(value));
- }
-
- // Do not call this ctor directly, use appropriate factory methods to create an object.
- private NormalizedValue(int propertyId, int zone, List<Object> value) {
- this.propertyId = propertyId;
- this.zone = zone;
- this.value = value;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
- NormalizedValue propValue = (NormalizedValue) o;
- return propertyId == propValue.propertyId &&
- zone == propValue.zone &&
- Objects.equals(value, propValue.value);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(propertyId, zone, value);
- }
-
- @Override
- public String toString() {
- return getClass().getSimpleName() + " { "
- + "prop: 0x" + toHexString(propertyId)
- + ", zone: 0x" + toHexString(zone)
- + ", value: " + Arrays.toString(value.toArray())
- + " }";
- }
-
- private static List<Object> wrapSingleObjectToList(Object value) {
- if (value instanceof Integer
- || value instanceof Float) {
- List<Object> list = new ArrayList<>(1);
- list.add(value);
- return list;
- } else if (value instanceof Boolean) {
- List<Object> list = new ArrayList<>(1);
- list.add((Boolean)value ? 1 : 0);
- return list;
- } else if (value instanceof Collection<?>) {
- return new ArrayList<>((Collection<?>) value);
- } else {
- throw new IllegalArgumentException("Unexpected type: " + value);
- }
- }
-
- // Converts any VehiclePropValue to either ArrayList<Integer> or ArrayList<Float>
- private static List<Object> getObjectValue(VehiclePropValue val) {
- switch (val.getValueType()) {
- case VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN:
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT32:
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2:
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC3:
- case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4:
- return new ArrayList<>(val.getInt32ValuesList());
- case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT:
- case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC2:
- case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC3:
- case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC4:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4:
- return new ArrayList<>(val.getFloatValuesList());
- default:
- throw new IllegalArgumentException("Unexpected type: " + val.getValueType());
- }
- }
- }
-}
\ No newline at end of file
diff --git a/tests/vehicle_hal_test/src/com/android/car/vehiclenetwork/haltest/VnsHalBaseTestCase.java b/tests/vehicle_hal_test/src/com/android/car/vehiclenetwork/haltest/VnsHalBaseTestCase.java
deleted file mode 100644
index adcc336..0000000
--- a/tests/vehicle_hal_test/src/com/android/car/vehiclenetwork/haltest/VnsHalBaseTestCase.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (C) 2016 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 com.android.car.vehiclenetwork.haltest;
-
-import static java.lang.Integer.toHexString;
-
-import android.car.VehicleZoneUtil;
-import android.os.HandlerThread;
-import android.test.AndroidTestCase;
-import android.util.Log;
-
-import com.android.car.vehiclenetwork.VehicleNetwork;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Base class for testing vehicle HAL using vehicle network service (VNS).
- */
-public class VnsHalBaseTestCase extends AndroidTestCase {
-
- protected static final String TAG = "VnsHalTest";
-
- protected static final int PROP_TIMEOUT_MS = 5000;
- protected static final int NO_ZONE = -1;
-
- private final HandlerThread mHandlerThread =
- new HandlerThread(VnsHalBaseTestCase.class.getSimpleName());
- protected VehicleNetwork mVehicleNetwork;
- protected RecordingVehicleNetworkListener mListener;
-
- protected Map<Integer, VehiclePropConfig> mConfigsMap;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mHandlerThread.start();
- mListener = new RecordingVehicleNetworkListener();
- mVehicleNetwork = VehicleNetwork.createVehicleNetwork(mListener,
- mHandlerThread.getLooper());
- setupConfigsMap();
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- mHandlerThread.quit();
- }
-
- private void setupConfigsMap() {
- mConfigsMap = new HashMap<>();
- for (VehiclePropConfig config : mVehicleNetwork.listProperties().getConfigsList()) {
- mConfigsMap.put(config.getProp(), config);
- }
- assertTrue(mConfigsMap.size() > 0);
- }
-
- protected boolean isPropertyAvailable(int... properties) {
- assertTrue(properties.length > 0);
-
- for (int propertyId : properties) {
- if (!mConfigsMap.containsKey(propertyId)) {
- // Property is not supported by vehicle HAL, nothing to test.
- Log.w(TAG, "Property: 0x" + Integer.toHexString(propertyId)
- + " is not available, ignoring...");
- return false;
- }
- }
-
- return true;
- }
-
- protected void setPropertyAndVerify(int propertyId, boolean switchOn) {
- setPropertyAndVerify(propertyId, NO_ZONE, switchOn);
- }
-
- protected void setPropertyAndVerify(int propertyId, int zone, boolean switchOn) {
- int val = switchOn ? 1 : 0;
-
- if (zone == NO_ZONE) {
- mVehicleNetwork.setBooleanProperty(propertyId, switchOn);
- } else {
- mVehicleNetwork.setZonedBooleanProperty(propertyId, zone, switchOn);
- }
- verifyValue(propertyId, zone, val);
- }
-
- protected void setPropertyAndVerify(String message, int propertyId, int zone, int value) {
- if (zone == NO_ZONE) {
- mVehicleNetwork.setIntProperty(propertyId, value);
- } else {
- mVehicleNetwork.setZonedIntProperty(propertyId, zone, value);
- }
- verifyValue(message, propertyId, zone, value);
- }
-
- protected void verifyValue(int propertyId, boolean val) {
- verifyValue(propertyId, NO_ZONE, val);
- }
-
- protected void verifyValue(int propertyId, int zone, boolean val) {
- int intVal = val ? 1 : 0;
- assertEquals(intVal, waitForIntValue(propertyId, zone, intVal));
- }
-
- protected void verifyValue(int propertyId, int zone, int val) {
- assertEquals(val, waitForIntValue(propertyId, zone, val));
- }
-
- protected void verifyValue(String message, int propertyId, int zone, int val) {
- assertEquals(message, val, waitForIntValue(propertyId, zone, val));
- }
-
- protected int getFirstZoneForProperty(int propertyId) {
- return VehicleZoneUtil.getFirstZone(mConfigsMap.get(propertyId).getZones());
- }
-
- protected void verifyIntZonedProperty(int propertyId) throws InterruptedException {
- if (!isPropertyAvailable(propertyId)) {
- return;
- }
-
- VehiclePropConfig config = mConfigsMap.get(propertyId);
-
- // Assert setting edge-case values.
- iterateOnZones(config, (message, zone, minValue, maxValue) -> {
- setPropertyAndVerify(message, propertyId, zone, minValue);
- setPropertyAndVerify(message, propertyId, zone, maxValue);
- });
-
- // Setting out of the range values.
- iterateOnZones(config, ((message, zone, minValue, maxValue) -> {
- mVehicleNetwork.setZonedIntProperty(propertyId, zone, minValue - 1);
- verifyValue(message, propertyId, zone, minValue);
-
- mVehicleNetwork.setZonedIntProperty(propertyId, zone, maxValue + 20);
- verifyValue(message, propertyId, zone, maxValue);
- }));
-
- // Verify that subsequent SET calls will result in correct value at the end.
- mVehicleNetwork.subscribe(propertyId, 0f, config.getZones());
- int zone = VehicleZoneUtil.getFirstZone(config.getZones());
- int minValue = config.getInt32Mins(0);
- int maxValue = config.getInt32Maxs(0);
- int finalValue = (minValue + maxValue) / 2;
- mListener.reset();
- // We can only expect to see finalValue in the events as vehicle HAL may batch
- // set commands and use only last value.
- mListener.addExpectedValues(propertyId, zone, finalValue);
- mVehicleNetwork.setZonedIntProperty(propertyId, zone, minValue);
- mVehicleNetwork.setZonedIntProperty(propertyId, zone, maxValue);
- mVehicleNetwork.setZonedIntProperty(propertyId, zone, finalValue);
- verifyValue(propertyId, zone, finalValue);
- mListener.waitAndVerifyValues();
- mVehicleNetwork.unsubscribe(propertyId);
- }
-
- protected int waitForIntValue(int propertyId, int zone, int expectedValue) {
- int actualValue = mVehicleNetwork.getZonedIntProperty(propertyId, zone);
- long deadline = System.currentTimeMillis() + PROP_TIMEOUT_MS;
-
- while (System.currentTimeMillis() <= deadline && actualValue != expectedValue) {
- try {
- Thread.sleep(100);
- } catch (InterruptedException ex) {
- throw new RuntimeException(ex);
- }
- actualValue = mVehicleNetwork.getZonedIntProperty(propertyId, zone);
- }
-
- return actualValue;
- }
-
- protected void iterateOnZones(VehiclePropConfig config, IntZonesFunctor f) {
- int[] zones = VehicleZoneUtil.listAllZones(config.getZones());
- int zoneIndex = 0;
- boolean isBooleanType = config.getValueType() ==
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN;
-
- for (int zone : zones) {
- int minValue = isBooleanType ? 0 : config.getInt32Mins(zoneIndex);
- int maxValue = isBooleanType ? 1 : config.getInt32Maxs(zoneIndex);
- String message = "PropertyId: 0x" + toHexString(config.getProp())
- + ", zone[" + zoneIndex + "]: 0x" + toHexString(zone);
- f.func(message, zone, minValue, maxValue);
- zoneIndex++;
- }
-
- }
-
- protected interface IntZonesFunctor {
- void func(String message, int zone, int minValue, int maxValue);
- }
-
-
-}
diff --git a/libvehiclenetwork/java/Android.mk b/vehicle-hal-support-lib/Android.mk
similarity index 76%
rename from libvehiclenetwork/java/Android.mk
rename to vehicle-hal-support-lib/Android.mk
index 95e9089..154b4da 100644
--- a/libvehiclenetwork/java/Android.mk
+++ b/vehicle-hal-support-lib/Android.mk
@@ -12,20 +12,17 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-#
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_MODULE := libvehiclenetwork-java
+LOCAL_MODULE := vehicle-hal-support-lib
+
LOCAL_MODULE_TAGS := optional
-LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-Iaidl-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_STATIC_JAVA_LIBRARIES := \
- libvehiclenetworkproto-java \
- libprotobuf-java-lite
-
+LOCAL_STATIC_JAVA_LIBRARIES += android.hardware.vehicle@2.0-java-static
include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/vehicle-hal-support-lib/src/com/android/car/vehiclehal/VehiclePropValueBuilder.java b/vehicle-hal-support-lib/src/com/android/car/vehiclehal/VehiclePropValueBuilder.java
new file mode 100644
index 0000000..f68d7ee
--- /dev/null
+++ b/vehicle-hal-support-lib/src/com/android/car/vehiclehal/VehiclePropValueBuilder.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2016 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 com.android.car.vehiclehal;
+
+import android.annotation.CheckResult;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.os.SystemClock;
+
+/** A builder class for {@link android.hardware.vehicle.V2_0.VehiclePropValue} */
+public class VehiclePropValueBuilder {
+ private final VehiclePropValue mPropValue;
+
+ public static VehiclePropValueBuilder newBuilder(int propId) {
+ return new VehiclePropValueBuilder(propId);
+ }
+
+ public static VehiclePropValueBuilder newBuilder(VehiclePropValue propValue) {
+ return new VehiclePropValueBuilder(propValue);
+ }
+
+ private VehiclePropValueBuilder(int propId) {
+ mPropValue = new VehiclePropValue();
+ mPropValue.prop = propId;
+ }
+
+ private VehiclePropValueBuilder(VehiclePropValue propValue) {
+ mPropValue = clone(propValue);
+ }
+
+ private VehiclePropValue clone(VehiclePropValue propValue) {
+ VehiclePropValue newValue = new VehiclePropValue();
+
+ newValue.prop = propValue.prop;
+ newValue.areaId = propValue.areaId;
+ newValue.timestamp = propValue.timestamp;
+ newValue.value.stringValue = propValue.value.stringValue;
+ newValue.value.int32Values.addAll(propValue.value.int32Values);
+ newValue.value.floatValues.addAll(propValue.value.floatValues);
+ newValue.value.int64Values.addAll(propValue.value.int64Values);
+ newValue.value.bytes.addAll(propValue.value.bytes);
+
+ return newValue;
+ }
+
+ @CheckResult
+ public VehiclePropValueBuilder setAreaId(int areaId) {
+ mPropValue.areaId = areaId;
+ return this;
+ }
+
+ @CheckResult
+ public VehiclePropValueBuilder setTimestamp(long timestamp) {
+ mPropValue.timestamp = timestamp;
+ return this;
+ }
+
+ @CheckResult
+ public VehiclePropValueBuilder setTimestamp() {
+ mPropValue.timestamp = SystemClock.elapsedRealtimeNanos();
+ return this;
+ }
+
+ @CheckResult
+ public VehiclePropValueBuilder addIntValue(int... values) {
+ for (int val : values) {
+ mPropValue.value.int32Values.add(val);
+ }
+ return this;
+ }
+
+ @CheckResult
+ public VehiclePropValueBuilder addFloatValue(float... values) {
+ for (float val : values) {
+ mPropValue.value.floatValues.add(val);
+ }
+ return this;
+ }
+
+ @CheckResult
+ public VehiclePropValueBuilder addByteValue(byte... values) {
+ for (byte val : values) {
+ mPropValue.value.bytes.add(val);
+ }
+ return this;
+ }
+
+ @CheckResult
+ public VehiclePropValueBuilder setInt64Value(long... values) {
+ for (long val : values) {
+ mPropValue.value.int64Values.add(val);
+ }
+ return this;
+ }
+
+ @CheckResult
+ public VehiclePropValueBuilder setBooleanValue(boolean value) {
+ mPropValue.value.int32Values.clear();
+ mPropValue.value.int32Values.add(value ? 1 : 0);
+ return this;
+ }
+
+ @CheckResult
+ public VehiclePropValueBuilder setStringValue(String val) {
+ mPropValue.value.stringValue = val;
+ return this;
+ }
+
+ public VehiclePropValue build() {
+ return clone(mPropValue);
+ }
+}
diff --git a/vehicle-hal-support-lib/src/com/android/car/vehiclehal/test/MockedVehicleHal.java b/vehicle-hal-support-lib/src/com/android/car/vehiclehal/test/MockedVehicleHal.java
new file mode 100644
index 0000000..5713037
--- /dev/null
+++ b/vehicle-hal-support-lib/src/com/android/car/vehiclehal/test/MockedVehicleHal.java
@@ -0,0 +1,255 @@
+/*
+ * Copyright (C) 2016 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 com.android.car.vehiclehal.test;
+
+import static java.lang.Integer.toHexString;
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.fail;
+
+import android.hardware.vehicle.V2_0.IVehicle;
+import android.hardware.vehicle.V2_0.IVehicleCallback;
+import android.hardware.vehicle.V2_0.StatusCode;
+import android.hardware.vehicle.V2_0.SubscribeOptions;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehiclePropertyAccess;
+import android.os.IHwBinder;
+
+import com.google.android.collect.Lists;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Mocked implementation of {@link IVehicle}.
+ */
+public class MockedVehicleHal implements IVehicle {
+ /**
+ * Interface for handler of each property.
+ */
+ public interface VehicleHalPropertyHandler {
+ default void onPropertySet(VehiclePropValue value) {}
+ default VehiclePropValue onPropertyGet(VehiclePropValue value) { return null; }
+ default void onPropertySubscribe(int property, int zones, float sampleRate) {}
+ default void onPropertyUnsubscribe(int property) {}
+
+ VehicleHalPropertyHandler NOP = new VehicleHalPropertyHandler() {};
+ }
+
+ private final Map<Integer, VehicleHalPropertyHandler> mPropertyHandlerMap = new HashMap<>();
+ private final Map<Integer, VehiclePropConfig> mConfigs = new HashMap<>();
+ private final Map<Integer, List<IVehicleCallback>> mSubscribers = new HashMap<>();
+
+ public synchronized void addProperties(VehiclePropConfig... configs) {
+ for (VehiclePropConfig config : configs) {
+ addProperty(config, new DefaultPropertyHandler(config, null));
+ }
+ }
+
+ public synchronized void addProperty(VehiclePropConfig config,
+ VehicleHalPropertyHandler handler) {
+ mPropertyHandlerMap.put(config.prop, handler);
+ mConfigs.put(config.prop, config);
+ }
+
+ public synchronized void addStaticProperty(VehiclePropConfig config,
+ VehiclePropValue value) {
+ addProperty(config, new StaticPropertyHandler(value));
+ }
+
+ public synchronized void injectEvent(VehiclePropValue value) {
+ List<IVehicleCallback> callbacks = mSubscribers.get(value.prop);
+ assertNotNull("Injecting event failed for property: " + value.prop + ". No listeners found",
+ callbacks);
+ for (IVehicleCallback callback : callbacks) {
+ callback.onPropertyEvent(Lists.newArrayList(value));
+ }
+ }
+
+ @Override
+ public IHwBinder asBinder() {
+ return null;
+ }
+
+ @Override
+ public synchronized ArrayList<VehiclePropConfig> getAllPropConfigs() {
+ return new ArrayList<>(mConfigs.values());
+ }
+
+ @Override
+ public synchronized void getPropConfigs(ArrayList<Integer> props, getPropConfigsCallback cb) {
+ ArrayList<VehiclePropConfig> res = new ArrayList<>();
+ for (Integer prop : props) {
+ VehiclePropConfig config = mConfigs.get(prop);
+ if (config == null) {
+ cb.onValues(StatusCode.INVALID_ARG, new ArrayList<>());
+ return;
+ }
+ res.add(config);
+ }
+ cb.onValues(StatusCode.OK, res);
+ }
+
+ @Override
+ public synchronized void get(VehiclePropValue requestedPropValue, getCallback cb) {
+ VehicleHalPropertyHandler handler = mPropertyHandlerMap.get(requestedPropValue.prop);
+ if (handler == null) {
+ cb.onValues(StatusCode.INVALID_ARG, null);
+ } else {
+ cb.onValues(StatusCode.OK, handler.onPropertyGet(requestedPropValue));
+ }
+ }
+
+ @Override
+ public synchronized int set(VehiclePropValue propValue) {
+ VehicleHalPropertyHandler handler = mPropertyHandlerMap.get(propValue.prop);
+ if (handler == null) {
+ return StatusCode.INVALID_ARG;
+ } else {
+ handler.onPropertySet(propValue);
+ return StatusCode.OK;
+ }
+ }
+
+ @Override
+ public synchronized int subscribe(IVehicleCallback callback,
+ ArrayList<SubscribeOptions> options) {
+ for (SubscribeOptions opt : options) {
+ VehicleHalPropertyHandler handler = mPropertyHandlerMap.get(opt.propId);
+ if (handler == null) {
+ return StatusCode.INVALID_ARG;
+ }
+
+ handler.onPropertySubscribe(opt.propId, opt.vehicleAreas, opt.sampleRate);
+ List<IVehicleCallback> subscribers = mSubscribers.get(opt.propId);
+ if (subscribers == null) {
+ subscribers = new ArrayList<>();
+ mSubscribers.put(opt.propId, subscribers);
+ }
+ subscribers.add(callback);
+ }
+ return StatusCode.OK;
+ }
+
+ @Override
+ public synchronized int unsubscribe(IVehicleCallback callback, int propId) {
+ VehicleHalPropertyHandler handler = mPropertyHandlerMap.get(propId);
+ if (handler == null) {
+ return StatusCode.INVALID_ARG;
+ }
+
+ handler.onPropertyUnsubscribe(propId);
+ List<IVehicleCallback> subscribers = mSubscribers.get(propId);
+ if (subscribers != null) {
+ subscribers.remove(callback);
+ if (subscribers.size() == 0) {
+ mSubscribers.remove(propId);
+ }
+ }
+ return StatusCode.OK;
+ }
+
+ @Override
+ public String debugDump() {
+ return null;
+ }
+
+ @Override
+ public ArrayList<String> interfaceChain() {
+ return null;
+ }
+
+ public static class FailingPropertyHandler implements VehicleHalPropertyHandler {
+ @Override
+ public void onPropertySet(VehiclePropValue value) {
+ fail("Unexpected onPropertySet call");
+ }
+
+ @Override
+ public VehiclePropValue onPropertyGet(VehiclePropValue value) {
+ fail("Unexpected onPropertyGet call");
+ return null;
+ }
+
+ @Override
+ public void onPropertySubscribe(int property, int zones, float sampleRate) {
+ fail("Unexpected onPropertySubscribe call");
+ }
+
+ @Override
+ public void onPropertyUnsubscribe(int property) {
+ fail("Unexpected onPropertyUnsubscribe call");
+ }
+ }
+
+ public static class StaticPropertyHandler extends FailingPropertyHandler {
+ private final VehiclePropValue mValue;
+
+ public StaticPropertyHandler(VehiclePropValue value) {
+ mValue = value;
+ }
+
+ @Override
+ public synchronized VehiclePropValue onPropertyGet(VehiclePropValue value) {
+ return mValue;
+ }
+ }
+
+ public static class DefaultPropertyHandler implements VehicleHalPropertyHandler {
+ private final VehiclePropConfig mConfig;
+ private VehiclePropValue mValue;
+ private boolean mSubscribed = false;
+
+ public DefaultPropertyHandler(VehiclePropConfig config, VehiclePropValue initialValue) {
+ mConfig = config;
+ mValue = initialValue;
+ }
+
+ @Override
+ public synchronized void onPropertySet(VehiclePropValue value) {
+ assertEquals(mConfig.prop, value.prop);
+ assertEquals(VehiclePropertyAccess.WRITE, mConfig.access & VehiclePropertyAccess.WRITE);
+ mValue = value;
+ }
+
+ @Override
+ public synchronized VehiclePropValue onPropertyGet(VehiclePropValue value) {
+ assertEquals(mConfig.prop, value.prop);
+ assertEquals(VehiclePropertyAccess.READ, mConfig.access & VehiclePropertyAccess.READ);
+ return mValue;
+ }
+
+ @Override
+ public synchronized void onPropertySubscribe(int property, int zones, float sampleRate) {
+ assertEquals(mConfig.prop, property);
+ mSubscribed = true;
+ }
+
+ @Override
+ public synchronized void onPropertyUnsubscribe(int property) {
+ assertEquals(mConfig.prop, property);
+ if (!mSubscribed) {
+ throw new IllegalArgumentException("Property was not subscribed 0x"
+ + toHexString( property));
+ }
+ mSubscribed = false;
+ }
+ }
+}
diff --git a/vehicle-hal-support-lib/src/com/android/car/vehiclehal/test/VehiclePropConfigBuilder.java b/vehicle-hal-support-lib/src/com/android/car/vehiclehal/test/VehiclePropConfigBuilder.java
new file mode 100644
index 0000000..c801067
--- /dev/null
+++ b/vehicle-hal-support-lib/src/com/android/car/vehiclehal/test/VehiclePropConfigBuilder.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2016 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 com.android.car.vehiclehal.test;
+
+import android.annotation.CheckResult;
+import android.hardware.vehicle.V2_0.VehicleAreaConfig;
+import android.hardware.vehicle.V2_0.VehiclePermissionModel;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropertyAccess;
+import android.hardware.vehicle.V2_0.VehiclePropertyChangeMode;
+
+import java.util.Collection;
+
+/**
+ * A builder class for {@link android.hardware.vehicle.V2_0.VehiclePropConfig}
+ */
+public class VehiclePropConfigBuilder {
+
+ private final VehiclePropConfig mConfig;
+
+ @CheckResult
+ public static VehiclePropConfigBuilder newBuilder(int propId) {
+ return new VehiclePropConfigBuilder(propId);
+ }
+
+ private VehiclePropConfigBuilder(int propId) {
+ mConfig = new VehiclePropConfig();
+ mConfig.prop = propId;
+ mConfig.access = VehiclePropertyAccess.READ_WRITE;
+ mConfig.changeMode = VehiclePropertyChangeMode.ON_CHANGE;
+ mConfig.permissionModel = VehiclePermissionModel.NO_RESTRICTION;
+ }
+
+ private VehiclePropConfig clone(VehiclePropConfig propConfig) {
+ VehiclePropConfig newConfig = new VehiclePropConfig();
+
+ newConfig.prop = propConfig.prop;
+ newConfig.access = propConfig.access;
+ newConfig.changeMode = propConfig.changeMode;
+ newConfig.permissionModel = propConfig.permissionModel;
+ newConfig.supportedAreas = propConfig.supportedAreas;
+ newConfig.configFlags = propConfig.configFlags;
+ newConfig.configString = propConfig.configString;
+ newConfig.minSampleRate = propConfig.minSampleRate;
+ newConfig.maxSampleRate = propConfig.maxSampleRate;
+ newConfig.configArray.addAll(propConfig.configArray);
+ for (VehicleAreaConfig area : propConfig.areaConfigs) {
+ VehicleAreaConfig newArea = new VehicleAreaConfig();
+ newArea.areaId = area.areaId;
+ newArea.minInt32Value = area.minInt32Value;
+ newArea.maxInt32Value = area.maxInt32Value;
+ newArea.minInt64Value = area.minInt64Value;
+ newArea.maxInt64Value = area.maxInt64Value;
+ newArea.minFloatValue = area.minFloatValue;
+ newArea.maxFloatValue = area.maxFloatValue;
+ newConfig.areaConfigs.add(newArea);
+ }
+
+ return newConfig;
+ }
+
+ @CheckResult
+ public VehiclePropConfigBuilder setAccess(int access) {
+ mConfig.access = access;
+ return this;
+ }
+
+ @CheckResult
+ public VehiclePropConfigBuilder setChangeMode(int changeMode) {
+ mConfig.changeMode = changeMode;
+ return this;
+ }
+
+ @CheckResult
+ public VehiclePropConfigBuilder setPermissionModel(int permissionModel) {
+ mConfig.permissionModel = permissionModel;
+ return this;
+ }
+
+ @CheckResult
+ public VehiclePropConfigBuilder setSupportedAreas(int supportedAreas) {
+ mConfig.supportedAreas = supportedAreas;
+ return this;
+ }
+
+ @CheckResult
+ public VehiclePropConfigBuilder setConfigFlags(int configFlags) {
+ mConfig.configFlags = configFlags;
+ return this;
+ }
+
+ @CheckResult
+ public VehiclePropConfigBuilder setConfigString(String configString) {
+ mConfig.configString = configString;
+ return this;
+ }
+
+
+ @CheckResult
+ public VehiclePropConfigBuilder setConfigArray(Collection<Integer> configArray) {
+ mConfig.configArray.clear();
+ mConfig.configArray.addAll(configArray);
+ return this;
+ }
+
+ @CheckResult
+ public VehiclePropConfigBuilder addAreaConfig(int areaId, int minValue, int maxValue) {
+ VehicleAreaConfig area = new VehicleAreaConfig();
+ area.areaId = areaId;
+ area.minInt32Value = minValue;
+ area.maxInt32Value = maxValue;
+ mConfig.areaConfigs.add(area);
+ return this;
+ }
+
+ @CheckResult
+ public VehiclePropConfigBuilder addAreaConfig(int areaId, float minValue, float maxValue) {
+ VehicleAreaConfig area = new VehicleAreaConfig();
+ area.areaId = areaId;
+ area.minFloatValue = minValue;
+ area.maxFloatValue = maxValue;
+ mConfig.areaConfigs.add(area);
+ return this;
+ }
+
+ public VehiclePropConfig build() {
+ return clone(mConfig);
+ }
+}