Merge "Print driving status and keyboard status in the kitchenSink for testing." into nyc-car-dev
diff --git a/car-lib/Android.mk b/car-lib/Android.mk
index e413a90..e1f4105 100644
--- a/car-lib/Android.mk
+++ b/car-lib/Android.mk
@@ -28,6 +28,10 @@
include $(BUILD_JAVA_LIBRARY)
+ifeq ($(BOARD_IS_AUTOMOTIVE), true)
+$(call dist-for-goals,dist_files,$(LOCAL_BUILT_MODULE):$(LOCAL_MODULE).jar)
+endif
+
# API Check
# ---------------------------------------------
car_module := $(LOCAL_MODULE)
diff --git a/car-lib/api/system-current.txt b/car-lib/api/system-current.txt
index 5835530..28751cd 100644
--- a/car-lib/api/system-current.txt
+++ b/car-lib/api/system-current.txt
@@ -591,9 +591,9 @@
field public static final int HVAC_ZONED_FAN_SPEED_SETPOINT = 16388; // 0x4004
field public static final int HVAC_ZONED_SEAT_TEMP = 16392; // 0x4008
field public static final int HVAC_ZONED_TEMP_ACTUAL = 16386; // 0x4002
- field public static final int HVAC_ZONED_TEMP_IS_FARENHEIT = 16387; // 0x4003
+ field public static final int HVAC_ZONED_TEMP_IS_FAHRENHEIT = 16387; // 0x4003
field public static final int HVAC_ZONED_TEMP_SETPOINT = 16385; // 0x4001
- field public static final int MAX_GLOBAL_PROPETY_ID = 16383; // 0x3fff
+ field public static final int MAX_GLOBAL_PROPERTY_ID = 16383; // 0x3fff
field public static final int PROPERTY_TYPE_BOOLEAN = 0; // 0x0
field public static final int PROPERTY_TYPE_FLOAT = 1; // 0x1
field public static final int PROPERTY_TYPE_FLOAT_VECTOR = 4; // 0x4
@@ -705,7 +705,7 @@
method public int getPresetCount();
method public synchronized void registerListener(android.car.hardware.radio.CarRadioManager.CarRadioEventListener) throws android.car.CarNotConnectedException;
method public boolean setPreset(android.car.hardware.radio.CarRadioPreset) throws java.lang.IllegalArgumentException;
- method public synchronized void unregisterListner();
+ method public synchronized void unregisterListener();
field public static final boolean DBG = true;
field public static final java.lang.String TAG = "CarRadioManager";
}
diff --git a/car-lib/src/android/car/Car.java b/car-lib/src/android/car/Car.java
index fbe455b..4153765 100644
--- a/car-lib/src/android/car/Car.java
+++ b/car-lib/src/android/car/Car.java
@@ -155,8 +155,9 @@
@SystemApi
public static final String PERMISSION_CAR_RADIO = "android.car.permission.CAR_RADIO";
+
/**
- * Permission necesary to access Car PRJECTION system APIs.
+ * Permission necessary to access Car PROJECTION system APIs.
* @hide
*/
@SystemApi
diff --git a/car-lib/src/android/car/CarAppContextManager.java b/car-lib/src/android/car/CarAppContextManager.java
index acff12a..ba165dc 100644
--- a/car-lib/src/android/car/CarAppContextManager.java
+++ b/car-lib/src/android/car/CarAppContextManager.java
@@ -51,7 +51,7 @@
/**
* Lost ownership for the context, which happens when other app has set the context.
* The app losing context should stop the action associated with the context.
- * For example, navigaiton app currently running active navigation should stop navigation
+ * For example, navigation app currently running active navigation should stop navigation
* upon getting this for {@link CarAppContextManager#APP_CONTEXT_NAVIGATION}.
* @param context
*/
@@ -89,14 +89,14 @@
mService = IAppContext.Stub.asInterface(service);
mHandler = new Handler(looper);
mBinderListener = new IAppContextListenerImpl(this);
- mOwnershipListeners = new HashMap<Integer, AppContextOwnershipChangeListener>();
+ mOwnershipListeners = new HashMap<>();
}
/**
* Register listener to monitor app context change. Only one listener can be registered and
* registering multiple times will lead into only the last listener to be active.
* @param listener
- * @param contextFilter Flags of cotexts to get notification.
+ * @param contextFilter Flags of contexts to get notification.
*/
public void registerContextListener(AppContextChangeListener listener, int contextFilter) {
if (listener == null) {
@@ -117,7 +117,7 @@
/**
* Unregister listener and stop listening context change events. If app has owned a context
- * by {@link #setActiveContext(int)}, it will be reset to inactive state.
+ * by {@link #resetActiveContexts(int)}, it will be reset to inactive state.
*/
public void unregisterContextListener() {
synchronized(this) {
diff --git a/car-lib/src/android/car/hardware/hvac/CarHvacManager.java b/car-lib/src/android/car/hardware/hvac/CarHvacManager.java
index 6595289..bc36ffb 100644
--- a/car-lib/src/android/car/hardware/hvac/CarHvacManager.java
+++ b/car-lib/src/android/car/hardware/hvac/CarHvacManager.java
@@ -77,7 +77,7 @@
/**
* The maximum id that can be assigned to global (non-zoned) property.
*/
- public static final int MAX_GLOBAL_PROPETY_ID = 0x3fff;
+ public static final int MAX_GLOBAL_PROPERTY_ID = 0x3fff;
/**
* HVAC_ZONED_* represents properties available on a per-zone basis. All zones in a car are
@@ -93,9 +93,9 @@
*/
public static final int HVAC_ZONED_TEMP_ACTUAL = 0x4002;
/**
- * Temperature is in degrees farenheit if this is true, bool.
+ * Temperature is in degrees fahrenheit if this is true, bool.
*/
- public static final int HVAC_ZONED_TEMP_IS_FARENHEIT = 0x4003;
+ public static final int HVAC_ZONED_TEMP_IS_FAHRENHEIT = 0x4003;
/**
* Fan speed setpoint is an integer from 0-n, depending on the number of fan speeds available.
* Selection determines the fan position, int.
@@ -159,7 +159,7 @@
* Tells if the given property is zoned property or global property
*/
public boolean isZonedProperty() {
- return mPropertyId > MAX_GLOBAL_PROPETY_ID;
+ return mPropertyId > MAX_GLOBAL_PROPERTY_ID;
}
/**
@@ -371,7 +371,6 @@
}
private final ICarHvac mService;
- private final Object mLock = new Object();
private CarHvacEventListener mListener = null;
private CarHvacEventListenerToService mListenerToService = null;
@@ -380,7 +379,7 @@
EventCallbackHandler(CarHvacManager mgr, Looper looper) {
super(looper);
- mMgr = new WeakReference<CarHvacManager>(mgr);
+ mMgr = new WeakReference<>(mgr);
}
@Override
@@ -405,7 +404,7 @@
private final WeakReference<CarHvacManager> mManager;
public CarHvacEventListenerToService(CarHvacManager manager) {
- mManager = new WeakReference<CarHvacManager>(manager);
+ mManager = new WeakReference<>(manager);
}
@Override
@@ -429,7 +428,7 @@
}
public static boolean isZonedProperty(int propertyId) {
- return propertyId > MAX_GLOBAL_PROPETY_ID;
+ return propertyId > MAX_GLOBAL_PROPERTY_ID;
}
/**
@@ -441,7 +440,7 @@
public synchronized void registerListener(CarHvacEventListener listener)
throws CarNotConnectedException {
if (mListener != null) {
- throw new IllegalStateException("Listner already registered. Did you call " +
+ throw new IllegalStateException("Listener already registered. Did you call " +
"registerListener() twice?");
}
@@ -485,8 +484,8 @@
* (CarHvacBooleanProperty, CarHvacFloatProperty, CarrHvacIntProperty)
*/
public List<CarHvacBaseProperty> getPropertyList() {
- List<CarHvacBaseProperty> hvacProps = new ArrayList<CarHvacBaseProperty>();
- List<CarHvacProperty> carProps = null;
+ List<CarHvacBaseProperty> hvacProps = new ArrayList<>();
+ List<CarHvacProperty> carProps;
try {
carProps = mService.getHvacProperties();
} catch (RemoteException e) {
@@ -526,7 +525,7 @@
* @return
*/
public boolean getBooleanProperty(int prop, int zone) {
- CarHvacProperty carProp = null;
+ CarHvacProperty carProp;
if (DBG) {
Log.d(TAG, "getBooleanProperty: prop = " + prop + " zone = " + zone);
}
@@ -552,7 +551,7 @@
* @return
*/
public float getFloatProperty(int prop, int zone) {
- CarHvacProperty carProp = null;
+ CarHvacProperty carProp;
if (DBG) {
Log.d(TAG, "getFloatProperty: prop = " + prop + " zone = " + zone);
}
diff --git a/car-lib/src/android/car/hardware/radio/CarRadioManager.java b/car-lib/src/android/car/hardware/radio/CarRadioManager.java
index 246dc70..86effe2 100644
--- a/car-lib/src/android/car/hardware/radio/CarRadioManager.java
+++ b/car-lib/src/android/car/hardware/radio/CarRadioManager.java
@@ -56,7 +56,6 @@
private CarRadioEventListener mListener = null;
@GuardedBy("this")
private CarRadioEventListenerToService mListenerToService = null;
- private int mServiceVersion;
private static final class EventCallbackHandler extends Handler {
WeakReference<CarRadioManager> mMgr;
@@ -133,7 +132,7 @@
public synchronized void registerListener(CarRadioEventListener listener)
throws CarNotConnectedException {
if (mListener != null) {
- throw new IllegalStateException("Listner already registered. Did you call " +
+ throw new IllegalStateException("Listener already registered. Did you call " +
"registerListener() twice?");
}
@@ -153,9 +152,9 @@
/**
* Unregister {@link CarRadioEventListener}.
*/
- public synchronized void unregisterListner() {
+ public synchronized void unregisterListener() {
if (DBG) {
- Log.d(TAG, "unregisterListenr");
+ Log.d(TAG, "unregisterListener");
}
try {
mService.unregisterListener(mListenerToService);
@@ -196,8 +195,8 @@
/**
* Set the preset value to a specific radio preset.
*
- * In order to ensure that the preset value indeed get updated, wait for event on the listner
- * registered via registerListner().
+ * In order to ensure that the preset value indeed get updated, wait for event on the listener
+ * registered via registerListener().
*
* @return: {@link boolean} value which returns true if the request succeeded and false
* otherwise. Common reasons for the failure could be:
@@ -206,19 +205,16 @@
* request succeeded.
*/
public boolean setPreset(CarRadioPreset preset) throws IllegalArgumentException {
- boolean status = false;
try {
- status = mService.setPreset(preset);
-
+ return mService.setPreset(preset);
} catch (RemoteException ex) {
// do nothing.
return false;
}
- return status;
}
private void dispatchEventToClient(CarRadioEvent event) {
- CarRadioEventListener listener = null;
+ CarRadioEventListener listener;
synchronized (this) {
listener = mListener;
}
diff --git a/car-support-lib/Android.mk b/car-support-lib/Android.mk
index c5243ce..345c430 100644
--- a/car-support-lib/Android.mk
+++ b/car-support-lib/Android.mk
@@ -19,6 +19,39 @@
LOCAL_PATH:= $(call my-dir)
+#Build prebuilt android.support.car library
+include $(CLEAR_VARS)
+
+LOCAL_AAPT_FLAGS := --auto-add-overlay \
+ --extra-packages android.support.v7.appcompat \
+ --extra-packages android.support.v7.recyclerview \
+ --extra-packages android.support.v7.cardview
+
+LOCAL_MODULE := android.support.car-prebuilt
+
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_RESOURCE_DIR += frameworks/support/v7/appcompat/res
+LOCAL_RESOURCE_DIR += frameworks/support/v7/recyclerview/res
+LOCAL_RESOURCE_DIR += frameworks/support/v7/cardview/res
+LOCAL_SDK_VERSION := current
+
+LOCAL_MANIFEST_FILE := AndroidManifest.xml
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-Iaidl-files-under, src)
+
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4 \
+ android-support-v7-appcompat \
+ android-support-v7-recyclerview \
+ android-support-v7-cardview
+
+LOCAL_JAVA_LIBRARIES += android.car
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+ifeq ($(BOARD_IS_AUTOMOTIVE), true)
+$(call dist-for-goals,dist_files,$(built_aar):android.support.car.aar)
+endif
+
# Build the resources.
include $(CLEAR_VARS)
LOCAL_MODULE := android.support.car-res
@@ -51,8 +84,7 @@
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4 \
android-support-v7-appcompat \
android-support-v7-recyclerview \
- android-support-v7-cardview \
- jsr305
+ android-support-v7-cardview
LOCAL_JAVA_LIBRARIES += android.car \
android.support.car-res
@@ -65,7 +97,7 @@
car_module_src_files := $(LOCAL_SRC_FILES)
car_module_api_dir := $(LOCAL_PATH)/api
car_module_java_libraries := $(LOCAL_JAVA_LIBRARIES) $(LOCAL_STATIC_JAVA_LIBRARIES) framework
-car_module_java_packages := android.support.car.*
+car_module_java_packages := android.support.car*
include $(CAR_API_CHECK)
endif #TARGET_BUILD_PDK
diff --git a/car-support-lib/api/current.txt b/car-support-lib/api/current.txt
index 0e740a8..b6f07dd 100644
--- a/car-support-lib/api/current.txt
+++ b/car-support-lib/api/current.txt
@@ -1,3 +1,103 @@
+package android.support.car {
+
+ public class Car {
+ method public void connect() throws java.lang.IllegalStateException;
+ method public static android.support.car.Car createCar(android.content.Context, android.support.car.ServiceConnectionListener, android.os.Looper);
+ method public static android.support.car.Car createCar(android.content.Context, android.support.car.ServiceConnectionListener);
+ method public void disconnect();
+ method public int getCarConnectionType() throws android.support.car.CarNotConnectedException;
+ method public java.lang.Object getCarManager(java.lang.String) throws android.support.car.CarNotConnectedException, android.support.car.CarNotSupportedException;
+ method public boolean isConnected();
+ method public boolean isConnectedToCar();
+ method public boolean isConnecting();
+ method public void registerCarConnectionListener(android.support.car.CarConnectionListener) throws android.support.car.CarNotConnectedException, java.lang.IllegalStateException;
+ method public void unregisterCarConnectionListener(android.support.car.CarConnectionListener);
+ field public static final java.lang.String APP_CONTEXT_SERVICE = "app_context";
+ 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_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
+ field public static final int CONNECTION_TYPE_USB = 1; // 0x1
+ field public static final int CONNECTION_TYPE_WIFI = 2; // 0x2
+ field public static final java.lang.String INFO_SERVICE = "info";
+ field public static final java.lang.String PACKAGE_SERVICE = "package";
+ 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_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 SENSOR_SERVICE = "sensor";
+ }
+
+ public abstract class CarAppContextManager {
+ ctor public CarAppContextManager();
+ method public abstract int getActiveAppContexts();
+ method public abstract boolean isOwningContext(int);
+ method public abstract void registerContextListener(android.support.car.CarAppContextManager.AppContextChangeListener, int);
+ method public abstract void resetActiveContexts(int);
+ method public abstract void setActiveContexts(android.support.car.CarAppContextManager.AppContextOwnershipChangeListener, int) throws java.lang.IllegalStateException, java.lang.SecurityException;
+ method public abstract void unregisterContextListener();
+ field public static final int APP_CONTEXT_NAVIGATION = 1; // 0x1
+ field public static final int APP_CONTEXT_VOICE_COMMAND = 2; // 0x2
+ }
+
+ public static abstract interface CarAppContextManager.AppContextChangeListener {
+ method public abstract void onAppContextChange(int);
+ }
+
+ public static abstract interface CarAppContextManager.AppContextOwnershipChangeListener {
+ method public abstract void onAppContextOwnershipLoss(int);
+ }
+
+ public abstract interface CarConnectionListener {
+ method public abstract void onConnected(int);
+ method public abstract void onDisconnected();
+ }
+
+ public abstract class CarInfoManager {
+ ctor public CarInfoManager();
+ method public abstract java.lang.Float getFloat(java.lang.String) throws android.support.car.CarNotConnectedException, java.lang.IllegalArgumentException;
+ method public abstract java.lang.Integer getInt(java.lang.String) throws android.support.car.CarNotConnectedException, java.lang.IllegalArgumentException;
+ method public abstract java.lang.Long getLong(java.lang.String) throws android.support.car.CarNotConnectedException, java.lang.IllegalArgumentException;
+ method public abstract java.lang.String getString(java.lang.String) throws android.support.car.CarNotConnectedException, java.lang.IllegalArgumentException;
+ field public static final int DRIVER_SIDE_CENTER = 2; // 0x2
+ field public static final int DRIVER_SIDE_LEFT = 0; // 0x0
+ field public static final int DRIVER_SIDE_RIGHT = 1; // 0x1
+ field public static final java.lang.String KEY_DRIVER_POSITION = "driverPosition";
+ field public static final java.lang.String KEY_HEAD_UNIT_MAKE = "headUnitMake";
+ field public static final java.lang.String KEY_HEAD_UNIT_MODEL = "headUnitModel";
+ field public static final java.lang.String KEY_HEAD_UNIT_SOFTWARE_BUILD = "headUnitSoftwareBuild";
+ field public static final java.lang.String KEY_HEAD_UNIT_SOFTWARE_VERSION = "headUnitSoftwareVersion";
+ field public static final java.lang.String KEY_MANUFACTURER = "manufacturer";
+ field public static final java.lang.String KEY_MODEL = "model";
+ field public static final java.lang.String KEY_MODEL_YEAR = "model-year";
+ field public static final java.lang.String KEY_VEHICLE_ID = "vehicle-id";
+ }
+
+ public class CarNotConnectedException extends java.lang.Exception {
+ ctor public CarNotConnectedException();
+ ctor public CarNotConnectedException(java.lang.String);
+ ctor public CarNotConnectedException(java.lang.String, java.lang.Throwable);
+ ctor public CarNotConnectedException(java.lang.Exception);
+ }
+
+ public class CarNotSupportedException extends java.lang.Exception {
+ ctor public CarNotSupportedException();
+ ctor public CarNotSupportedException(java.lang.String);
+ ctor public CarNotSupportedException(java.lang.String, java.lang.Throwable);
+ ctor public CarNotSupportedException(java.lang.Exception);
+ }
+
+ public abstract interface ServiceConnectionListener {
+ method public abstract void onServiceConnected(android.content.ComponentName);
+ method public abstract void onServiceConnectionFailed(int);
+ method public abstract void onServiceDisconnected(android.content.ComponentName);
+ method public abstract void onServiceSuspended(int);
+ }
+
+}
+
package android.support.car.annotation {
public abstract class ValueTypeDef implements java.lang.annotation.Annotation {
diff --git a/car-support-lib/src/android/support/car/Car.java b/car-support-lib/src/android/support/car/Car.java
index fee3930..6218288 100644
--- a/car-support-lib/src/android/support/car/Car.java
+++ b/car-support-lib/src/android/support/car/Car.java
@@ -39,8 +39,6 @@
import java.util.HashSet;
import java.util.LinkedList;
-import javax.annotation.concurrent.GuardedBy;
-
/**
* Top level car API.
* This API works only for device with {@link PackageManager#FEATURE_AUTOMOTIVE} feature
@@ -82,6 +80,8 @@
public static final int CONNECTION_TYPE_ADB_EMULATOR = 4;
/** Type of car connection: platform runs directly in car. */
public static final int CONNECTION_TYPE_EMBEDDED = 5;
+ /** Unknown type. The support lib is likely out of date.*/
+ public static final int CONNECTION_TYPE_UNKNOWN = -1;
/**
* Type of car connection: platform runs directly in car but with mocked vehicle hal.
* This will only happen in testing environment.
@@ -91,7 +91,8 @@
/** @hide */
@IntDef({CONNECTION_TYPE_EMULATOR, CONNECTION_TYPE_USB, CONNECTION_TYPE_WIFI,
- CONNECTION_TYPE_ON_DEVICE_EMULATOR, CONNECTION_TYPE_ADB_EMULATOR, CONNECTION_TYPE_EMBEDDED})
+ CONNECTION_TYPE_ON_DEVICE_EMULATOR, CONNECTION_TYPE_ADB_EMULATOR,
+ CONNECTION_TYPE_EMBEDDED, CONNECTION_TYPE_UNKNOWN})
@Retention(RetentionPolicy.SOURCE)
public @interface ConnectionType {}
@@ -142,7 +143,7 @@
private static final int STATE_DISCONNECTED = 0;
private static final int STATE_CONNECTING = 1;
private static final int STATE_CONNECTED = 2;
- @GuardedBy("this")
+ // @GuardedBy("this")
private int mConnectionState;
private final ServiceConnectionListener mServiceConnectionListener =
@@ -176,7 +177,7 @@
private final ServiceConnectionListener mServiceConnectionListenerClient;
private final Object mCarManagerLock = new Object();
- @GuardedBy("mCarManagerLock")
+ //@GuardedBy("mCarManagerLock")
private final HashMap<String, CarManagerBase> mServiceMap = new HashMap<>();
private final CarServiceLoader mCarServiceLoader;
diff --git a/car-support-lib/src/android/support/car/CarAppContextManager.java b/car-support-lib/src/android/support/car/CarAppContextManager.java
index c9e7f2e..865150c 100644
--- a/car-support-lib/src/android/support/car/CarAppContextManager.java
+++ b/car-support-lib/src/android/support/car/CarAppContextManager.java
@@ -42,7 +42,7 @@
/**
* Lost ownership for the context, which happens when other app has set the context.
* The app losing context should stop the action associated with the context.
- * For example, navigaiton app currently running active navigation should stop navigation
+ * For example, navigation app currently running active navigation should stop navigation
* upon getting this for {@link CarAppContextManager#APP_CONTEXT_NAVIGATION}.
* @param context
*/
diff --git a/car-support-lib/src/android/support/car/CarAppContextManagerEmbedded.java b/car-support-lib/src/android/support/car/CarAppContextManagerEmbedded.java
index 6412119..ff289bc 100644
--- a/car-support-lib/src/android/support/car/CarAppContextManagerEmbedded.java
+++ b/car-support-lib/src/android/support/car/CarAppContextManagerEmbedded.java
@@ -16,8 +16,6 @@
package android.support.car;
-import android.os.Looper;
-
import java.util.HashMap;
import java.util.Map;
@@ -36,7 +34,7 @@
*/
CarAppContextManagerEmbedded(Object manager) {
mManager = (android.car.CarAppContextManager) manager;
- mOwnershipListeners = new HashMap<Integer, AppContextOwnershipChangeListenerProxy>();
+ mOwnershipListeners = new HashMap<>();
}
@Override
diff --git a/car-support-lib/src/android/support/car/CarInfoManager.java b/car-support-lib/src/android/support/car/CarInfoManager.java
index 78eacac..b40f7d3 100644
--- a/car-support-lib/src/android/support/car/CarInfoManager.java
+++ b/car-support-lib/src/android/support/car/CarInfoManager.java
@@ -54,22 +54,50 @@
@ValueTypeDef(type = String.class)
public static final String KEY_VEHICLE_ID = "vehicle-id";
+ /** Manufacturer of the head unit.*/
+ @ValueTypeDef(type = String.class)
+ public static final String KEY_HEAD_UNIT_MAKE = "headUnitMake";
+ /** Model of the head unit.*/
+ @ValueTypeDef(type = String.class)
+ public static final String KEY_HEAD_UNIT_MODEL = "headUnitModel";
+ /** Head Unit software build */
+ @ValueTypeDef(type = String.class)
+ public static final String KEY_HEAD_UNIT_SOFTWARE_BUILD = "headUnitSoftwareBuild";
+ /** Head Unit software version */
+ @ValueTypeDef(type = String.class)
+ public static final String KEY_HEAD_UNIT_SOFTWARE_VERSION = "headUnitSoftwareVersion";
+ /** Where is the driver's seat. One of the DRIVER_SIDE_* constants */
+ @ValueTypeDef(type = Integer.class)
+ public static final String KEY_DRIVER_POSITION = "driverPosition";
+
+ /** Location of the driver: left */
+ public static final int DRIVER_SIDE_LEFT = 0;
+ /** Location of the driver: right */
+ public static final int DRIVER_SIDE_RIGHT = 1;
+ /** Location of the driver: center */
+ public static final int DRIVER_SIDE_CENTER = 2;
+
/**
- * Retrieve floating point information for car.
- * @param key
- * @return null if the key is not supported.
- * @throws CarNotConnectedException
- * @throws IllegalArgumentException
+ * Returns the value for the given key or null if the key is not supported.
*/
public abstract Float getFloat(String key)
throws CarNotConnectedException, IllegalArgumentException;
+ /**
+ * Returns the value for the given key or null if the key is not supported.
+ */
public abstract Integer getInt(String key)
throws CarNotConnectedException, IllegalArgumentException;
+ /**
+ * Returns the value for the given key or null if the key is not supported.
+ */
public abstract Long getLong(String key)
throws CarNotConnectedException, IllegalArgumentException;
+ /**
+ * Returns the value for the given key or null if the key is not supported.
+ */
public abstract String getString(String key)
throws CarNotConnectedException, IllegalArgumentException;
@@ -78,9 +106,6 @@
* defined only for the car vendor. Vendor extension can be used for other APIs like
* getInt / getString, but this is for passing more complex data.
* @param key
- * @return
- * @throws CarNotConnectedException
- * @throws IllegalArgumentException
* @hide
*/
public abstract Bundle getBundle(String key)
diff --git a/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java b/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java
index 7b96ae9..7b5c788 100644
--- a/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java
+++ b/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java
@@ -79,7 +79,9 @@
@Override
public int getCarConnectionType() throws CarNotConnectedException {
- return mCar.getCarConnectionType();
+ @android.support.car.Car.ConnectionType
+ int carConnectionType = mCar.getCarConnectionType();
+ return carConnectionType;
}
@Override
diff --git a/car-support-lib/src/android/support/car/app/menu/compat/EmbeddedCarMenuCallbacksCompat.java b/car-support-lib/src/android/support/car/app/menu/compat/EmbeddedCarMenuCallbacksCompat.java
index bf51758..5275339 100644
--- a/car-support-lib/src/android/support/car/app/menu/compat/EmbeddedCarMenuCallbacksCompat.java
+++ b/car-support-lib/src/android/support/car/app/menu/compat/EmbeddedCarMenuCallbacksCompat.java
@@ -29,15 +29,13 @@
import java.util.List;
import java.util.Map;
-import javax.annotation.concurrent.GuardedBy;
-
public class EmbeddedCarMenuCallbacksCompat extends android.car.app.menu.CarMenuCallbacks {
private final CarMenuCallbacks mCallbacks;
private final CarDrawerActivity mActivity;
// Map of subscribed ids to their respective callbacks.
- @GuardedBy("this")
+ // @GuardedBy("this")
private final Map<String, List<SubscriptionCallbacks>> mSubscriptionMap =
new HashMap<String, List<SubscriptionCallbacks>>();
@@ -178,4 +176,4 @@
"before returning!");
}
}
-}
\ No newline at end of file
+}
diff --git a/car_product/bootanimations/square_280/bootanimation.zip b/car_product/bootanimations/square_280/bootanimation.zip
new file mode 100644
index 0000000..ab4d79f
--- /dev/null
+++ b/car_product/bootanimations/square_280/bootanimation.zip
Binary files differ
diff --git a/car_product/bootanimations/square_320/bootanimation.zip b/car_product/bootanimations/square_320/bootanimation.zip
new file mode 100644
index 0000000..f621ad8
--- /dev/null
+++ b/car_product/bootanimations/square_320/bootanimation.zip
Binary files differ
diff --git a/car_product/bootanimations/square_360/bootanimation.zip b/car_product/bootanimations/square_360/bootanimation.zip
new file mode 100644
index 0000000..3cb32f4
--- /dev/null
+++ b/car_product/bootanimations/square_360/bootanimation.zip
Binary files differ
diff --git a/car_product/build/car.mk b/car_product/build/car.mk
new file mode 100644
index 0000000..3a7cfb1
--- /dev/null
+++ b/car_product/build/car.mk
@@ -0,0 +1,104 @@
+#
+# 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.
+#
+
+# Common make file for all car builds
+
+PRODUCT_PACKAGES += \
+ Bluetooth \
+ BluetoothMidiService \
+ bt-map-service \
+ OneTimeInitializer \
+ Provision \
+ SystemUI \
+ SystemUpdater
+
+PRODUCT_PACKAGES += \
+ clatd \
+ clatd.conf \
+ pppd \
+ screenrecord
+
+# This is for testing
+PRODUCT_PACKAGES +=
+ EmbeddedKitchenSinkApp
+
+PRODUCT_COPY_FILES := \
+ frameworks/av/media/libeffects/data/audio_effects.conf:system/etc/audio_effects.conf \
+ packages/services/Car/car_product/preloaded-classes-car:system/etc/preloaded-classes \
+
+PRODUCT_PROPERTY_OVERRIDES += \
+ ro.carrier=unknown
+
+# Overlay for Google network and fused location providers
+$(call inherit-product, device/sample/products/location_overlay.mk)
+$(call inherit-product-if-exists, frameworks/base/data/fonts/fonts.mk)
+$(call inherit-product-if-exists, external/google-fonts/dancing-script/fonts.mk)
+$(call inherit-product-if-exists, external/google-fonts/carrois-gothic-sc/fonts.mk)
+$(call inherit-product-if-exists, external/google-fonts/coming-soon/fonts.mk)
+$(call inherit-product-if-exists, external/google-fonts/cutive-mono/fonts.mk)
+$(call inherit-product-if-exists, external/noto-fonts/fonts.mk)
+$(call inherit-product-if-exists, external/naver-fonts/fonts.mk)
+$(call inherit-product-if-exists, external/roboto-fonts/fonts.mk)
+$(call inherit-product-if-exists, external/hyphenation-patterns/patterns.mk)
+$(call inherit-product-if-exists, frameworks/base/data/keyboards/keyboards.mk)
+$(call inherit-product-if-exists, frameworks/webview/chromium/chromium.mk)
+$(call inherit-product, packages/services/Car/car_product/build/car_base.mk)
+
+# Overrides
+PRODUCT_BRAND := generic
+PRODUCT_DEVICE := generic
+PRODUCT_NAME := generic_car_no_telephony
+
+PRODUCT_PROPERTY_OVERRIDES := \
+ ro.config.ringtone=Girtab.ogg \
+ ro.config.notification_sound=Tethys.ogg \
+ ro.config.alarm_alert=Oxygen.ogg \
+ $(PRODUCT_PROPERTY_OVERRIDES) \
+
+# SetupWizard requires internet access before continuing
+# (hot sim or wifi not blocked by captive portal)
+PRODUCT_PROPERTY_OVERRIDES += \
+ ro.setupwizard.require_network=any
+
+
+PRODUCT_PROPERTY_OVERRIDES += \
+ keyguard.no_require_sim=true
+
+# Automotive specific packages
+PRODUCT_PACKAGES += \
+ vehicle_network_service \
+ CarService \
+ CarUiProvider \
+ android.car \
+ libvehiclenetwork-native \
+ vns_policy.xml
+
+# Boot animation
+PRODUCT_COPY_FILES += \
+ packages/services/Car/car_product/bootanimations/square_280/bootanimation.zip:system/media/bootanimation.zip
+
+PRODUCT_PROPERTY_OVERRIDES += \
+ fmas.spkr_6ch=35,20,110 \
+ fmas.spkr_2ch=35,25 \
+ fmas.spkr_angles=10 \
+ fmas.spkr_sgain=0 \
+ media.aac_51_output_enabled=true
+
+PRODUCT_LOCALES := en_US af_ZA am_ET ar_EG bg_BG bn_BD ca_ES cs_CZ da_DK de_DE el_GR en_AU en_GB en_IN es_ES es_US et_EE eu_ES fa_IR fi_FI fr_CA fr_FR gl_ES hi_IN hr_HR hu_HU hy_AM in_ID is_IS it_IT iw_IL ja_JP ka_GE km_KH ko_KR ky_KG lo_LA lt_LT lv_LV km_MH kn_IN mn_MN ml_IN mk_MK mr_IN ms_MY my_MM ne_NP nb_NO nl_NL pl_PL pt_BR pt_PT ro_RO ru_RU si_LK sk_SK sl_SI sr_RS sv_SE sw_TZ ta_IN te_IN th_TH tl_PH tr_TR uk_UA vi_VN zh_CN zh_HK zh_TW zu_ZA en_XA ar_XB
+
+PRODUCT_BOOT_JARS += \
+ android.car
+
diff --git a/car_product/build/car_base.mk b/car_product/build/car_base.mk
new file mode 100644
index 0000000..590a7e7
--- /dev/null
+++ b/car_product/build/car_base.mk
@@ -0,0 +1,87 @@
+#
+# 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.
+#
+
+# Base platform for car builds
+# car packages should be added to car.mk instead of here
+
+PRODUCT_PACKAGE_OVERLAYS := packages/services/Car/car_product/overlay
+
+PRODUCT_PACKAGES += \
+ ContactsProvider \
+ DefaultContainerService \
+ Home \
+ BasicDreams \
+ CaptivePortalLogin \
+ CertInstaller \
+ DeskClock \
+ DocumentsUI \
+ DownloadProviderUi \
+ FusedLocation \
+ InputDevices \
+ KeyChain \
+ Keyguard \
+ LatinIME \
+ Launcher2 \
+ ManagedProvisioning \
+ PicoTts \
+ PacProcessor \
+ libpac \
+ PrintSpooler \
+ ProxyHandler \
+ Settings \
+ SharedStorageBackup \
+ VpnDialogs \
+ MmsService \
+ ExternalStorageProvider \
+ atrace \
+ libandroidfw \
+ libaudiopreprocessing \
+ libaudioutils \
+ libfilterpack_imageproc \
+ libgabi++ \
+ libmdnssd \
+ libnfc_ndef \
+ libpowermanager \
+ libspeexresampler \
+ libstagefright_soft_aacdec \
+ libstagefright_soft_aacenc \
+ libstagefright_soft_amrdec \
+ libstagefright_soft_amrnbenc \
+ libstagefright_soft_amrwbenc \
+ libstagefright_soft_avcdec \
+ libstagefright_soft_avcenc \
+ libstagefright_soft_flacenc \
+ libstagefright_soft_g711dec \
+ libstagefright_soft_gsmdec \
+ libstagefright_soft_hevcdec \
+ libstagefright_soft_mp3dec \
+ libstagefright_soft_mpeg2dec \
+ libstagefright_soft_mpeg4dec \
+ libstagefright_soft_mpeg4enc \
+ libstagefright_soft_opusdec \
+ libstagefright_soft_rawdec \
+ libstagefright_soft_vorbisdec \
+ libstagefright_soft_vpxdec \
+ libstagefright_soft_vpxenc \
+ libvariablespeed \
+ libwebrtc_audio_preprocessing \
+ mdnsd \
+ requestsync \
+ wifi-service \
+ A2dpSinkService
+
+$(call inherit-product, $(SRC_TARGET_DIR)/product/core_minimal.mk)
+
diff --git a/car_product/init/init.car.rc b/car_product/init/init.car.rc
new file mode 100644
index 0000000..220ca48
--- /dev/null
+++ b/car_product/init/init.car.rc
@@ -0,0 +1,9 @@
+
+service vns /system/bin/vehicle_network_service
+ class core
+ user system
+ group system
+ critical
+
+on boot
+ start vns
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png b/car_product/overlay/frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png
new file mode 100644
index 0000000..22441ae
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png
Binary files differ
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.png b/car_product/overlay/frameworks/base/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.png
new file mode 100644
index 0000000..cc651de
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.png
Binary files differ
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png b/car_product/overlay/frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png
new file mode 100644
index 0000000..03b93aa
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png
Binary files differ
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/config.xml b/car_product/overlay/frameworks/base/core/res/res/values/config.xml
new file mode 100644
index 0000000..141550b
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values/config.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 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.
+*/
+-->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. Do not translate. -->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Enable multi-user. -->
+ <bool name="config_enableMultiUserUI">true</bool>
+ <!-- Arbitrary max 8 users. -->
+ <integer name="config_multiuserMaximumUsers">8</integer>
+ <!-- Car Mode -->
+ <integer name="config_defaultUiModeType">3</integer>
+ <!-- Can't leave car mode -->
+ <bool name="config_lockUiMode">true</bool>
+ <!-- Control whether to launch Car dock home app when user presses home button or when
+ car dock intent is fired.
+ In mobile device, usually separate home app is expected in car mode, and this should be
+ enabled. But in environments like real car, default home app may be enough, and in that
+ case, this can be disabled (set to false). -->
+ <bool name="config_enableCarDockHomeLaunch">false</bool>
+ <!-- Control whether to lock day/night mode change from normal application. When it is
+ true, day / night mode change is only allowed to apps with MODIFY_DAY_NIGHT_MODE
+ permission. -->
+ <bool name="config_lockDayNightMode">true</bool>
+ <!-- Allow smart unlock immediately after boot because the user shouldn't have to enter a pin
+ code to unlock their car head unit. -->
+ <bool name="config_strongAuthRequiredOnBoot">false</bool>
+
+ <integer name="config_jobSchedulerInactivityIdleThreshold">0</integer>
+ <integer name="config_jobSchedulerIdleWindowSlop">0</integer>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/dimens.xml b/car_product/overlay/frameworks/base/core/res/res/values/dimens.xml
new file mode 100644
index 0000000..1db7bae
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values/dimens.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <dimen name="status_bar_height">96dp</dimen>
+ <!-- Don't this we need this one since we're always in landscape-->
+ <dimen name="navigation_bar_height">80dp</dimen>
+ <dimen name="navigation_bar_height_landscape">80dp</dimen>
+ <dimen name="status_bar_icon_size">40dp</dimen>
+</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_car.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_car.xml
new file mode 100644
index 0000000..74f1691
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_car.xml
@@ -0,0 +1,34 @@
+<!--
+ 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="48"
+ android:viewportHeight="48">
+
+ <path
+ android:pathData="M-838-1336H562v3600H-838z" />
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M28.7 12.1c-1-.4-2.2 .1 -2.6 1.1L23.4 20c-1.9 .3 -3.4 2-3.4 4 0 2.2 1.8 4 4
+4s4-1.8 4-4c0-.9-.3-1.8-.9-2.5l2.7-6.8c.5-1 0-2.1-1.1-2.6zM14 18c-1.1 0-2 .9-2
+2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm8-4c0-1.1-.9-2-2-2s-2 .9-2 2 .9 2 2 2 2-.9 2-2zm12
+4c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zM24 4C13 4 4 13 4 24s9 20 20 20
+20-9 20-20S35 4 24 4zm10.5 32c-2.8-2.5-6.5-4-10.5-4s-7.7 1.5-10.5 4C10.1 33.1 8
+28.8 8 24c0-8.8 7.2-16 16-16s16 7.2 16 16c0 4.8-2.1 9.1-5.5 12z" />
+ <path
+ android:pathData="M0 0h48v48H0z" />
+</vector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_music.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_music.xml
new file mode 100644
index 0000000..e52ea9a
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_music.xml
@@ -0,0 +1,30 @@
+<!--
+ 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="48"
+ android:viewportHeight="48">
+
+ <path
+ android:fillAlpha=".1"
+ android:strokeAlpha=".1"
+ android:pathData="M0 0h48v48H0z" />
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M24 2C14.06 2 6 10.06 6 20v14c0 3.31 2.69 6 6 6h6V24h-8v-4c0-7.73 6.27-14
+14-14s14 6.27 14 14v4h-8v16h6c3.31 0 6-2.69 6-6V20c0-9.94-8.06-18-18-18z" />
+</vector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_navigation.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_navigation.xml
new file mode 100644
index 0000000..2638fdd
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_navigation.xml
@@ -0,0 +1,28 @@
+<!--
+ 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="48"
+ android:viewportHeight="48">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M43.41 22.59l-18-18c-.78-.78-2.05-.78-2.82 0l-18 18c-.78 .78 -.78 2.05 0 2.83l18
+17.99v.01c.78 .78 2.05 .78 2.83 0l18-18c.78-.79 .78 -2.05-.01-2.83zM28
+29v-5h-8v6h-4v-8c0-1.11 .89 -2 2-2h10v-5l7 7-7 7z" />
+ <path
+ android:pathData="M0 0h48v48H0z" />
+</vector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_overview.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_overview.xml
new file mode 100644
index 0000000..e7d5de4
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_overview.xml
@@ -0,0 +1,28 @@
+<!--
+ 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="48"
+ android:viewportHeight="48">
+
+ <path
+ android:pathData="M0 0h48v48H0z" />
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M24 4C12.95 4 4 12.95 4 24s8.95 20 20 20 20-8.95 20-20S35.05 4 24 4zm0 36c-8.82
+0-16-7.18-16-16S15.18 8 24 8s16 7.18 16 16-7.18 16-16 16z" />
+</vector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_phone.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_phone.xml
new file mode 100644
index 0000000..d063797
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_phone.xml
@@ -0,0 +1,30 @@
+<!--
+ 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="48"
+ android:viewportHeight="48">
+
+ <path
+ android:pathData="M0 0h48v48H0z" />
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.25 21.59c2.88 5.66 7.51 10.29 13.18 13.17l4.4-4.41c.55-.55 1.34-.71
+2.03-.49C35.1 30.6 37.51 31 40 31c1.11 0 2 .89 2 2v7c0 1.11-.89 2-2 2C21.22 42 6
+26.78 6 8c0-1.11 .9 -2 2-2h7c1.11 0 2 .89 2 2 0 2.49 .4 4.9 1.14 7.14 .22 .69
+.06 1.48-.49 2.03l-4.4 4.42z" />
+</vector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values-sw720dp/dimens.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values-sw720dp/dimens.xml
new file mode 100644
index 0000000..f82c8a9
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/values-sw720dp/dimens.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <!-- gap on either side of status bar notification icons -->
+ <dimen name="status_bar_icon_padding">8dp</dimen>
+</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/arrays_car.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/arrays_car.xml
new file mode 100644
index 0000000..5227844
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/arrays_car.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 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.
+*/
+-->
+
+<resources>
+ <!-- There needs to be correspondence per index between these arrays, which means that if there
+ isn't a longpress action associated with a shortcut item, put in an empty item to make
+ sure everything lines up.
+ -->
+ <array name="car_facet_icons">
+ <item>@drawable/car_ic_navigation</item>
+ <item>@drawable/car_ic_phone</item>
+ <item>@drawable/car_ic_overview</item>
+ <item>@drawable/car_ic_music</item>
+ <item>@drawable/car_ic_car</item>
+ </array>
+ <array name="car_facet_intent_uris">
+ <!-- Launch the lenspicker for all the facets. The lens picker will trampoline into the last run app or display a list of valid apps -->
+ <item>intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x14000000;package=com.android.support.car.lenspicker;end</item>
+ <item>intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x14000000;package=com.android.support.car.lenspicker;end</item>
+ <item>intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;package=com.google.android.car.launcher;end</item>
+ <item>intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x14000000;package=com.android.support.car.lenspicker;end</item>
+ <item>intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x14000000;package=com.android.support.car.lenspicker;end</item>
+ </array>
+ <array name="car_facet_longpress_intent_uris">
+ <item></item>
+ <item></item>
+ <item></item>
+ <item></item>
+ <!-- Long pressing the overflow triggers a bug report -->
+ <item>intent:#Intent;component=com.google.android.car.bugreport/.BugReportActivity;end</item>
+ </array>
+ <array name="car_facet_category_filters">
+ <item>android.intent.category.APP_MAPS</item>
+ <item>android.intent.category.APP_MESSAGING</item>
+ <item></item>
+ <item>android.intent.category.APP_MUSIC</item>
+ <item></item>
+ </array>
+ <array name="car_facet_package_filters">
+ <item>com.google.android.apps.maps</item>
+ <item>com.google.android.car.dialer</item>
+ <item></item>
+ <item></item>
+ <item>com.google.android.car.hvac;com.android.settings;com.android.vending;com.google.android.car.bugreport;com.google.android.car.kitchensink;com.google.android.car.systemupdater;org.chromium.webview_shell;com.android.contacts;org.codeaurora.bluetooth.bttestapp;com.google.android.projection.sink;com.google.android.auto.mapclient</item>
+ </array>
+</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/config.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/config.xml
new file mode 100644
index 0000000..ac534b2
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/config.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 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.
+*/
+-->
+
+<!-- Resource overrides for car system ui. -->
+<resources>
+ <string name="config_statusBarComponent" translatable="false">com.android.systemui.statusbar.car.CarStatusBar</string>
+ <bool name="config_enableFullscreenUserSwitcher">true</bool>
+</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
new file mode 100644
index 0000000..94deae9
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <!-- The amount by which to scale up the status bar icons. -->
+ <item name="status_bar_icon_scale_factor" format="float" type="dimen">2.3</item>
+
+ <!-- The font size for the clock in the status bar. -->
+ <dimen name="status_bar_clock_size">44sp</dimen>
+
+ <!-- The starting padding for the clock in the status bar. -->
+ <dimen name="status_bar_clock_starting_padding">24dp</dimen>
+
+ <!-- The end padding for the clock in the status bar. -->
+ <dimen name="status_bar_clock_end_padding">@dimen/status_bar_clock_starting_padding</dimen>
+
+ <!-- size at which Notification icons will be drawn in the status bar -->
+ <dimen name="status_bar_icon_drawing_size">32dp</dimen>
+
+ <!-- Starting margin before the signal cluster -->
+ <dimen name="signal_cluster_margin_start">8dp</dimen>
+
+ <!-- Padding between signal cluster and battery icon -->
+ <dimen name="signal_cluster_battery_padding">@dimen/status_bar_clock_starting_padding</dimen>
+
+ <!-- Spacing after the wifi signals that is present if there are any icons following it. -->
+ <dimen name="status_bar_wifi_signal_spacer_width">@dimen/status_bar_clock_starting_padding</dimen>
+
+ <!-- Spacing before the airplane mode icon if there are any icons preceding it. -->
+ <dimen name="status_bar_airplane_spacer_width">@dimen/status_bar_clock_starting_padding</dimen>
+
+ <!-- Padding at the end of the view that displays the mobile signal icons. This value should
+ be double the signal_cluster_margin_start. -->
+ <dimen name="mobile_signal_group_end_padding">16dp</dimen>
+
+ <!-- Padding between the mobile data type and the strength indicator. -->
+ <dimen name="mobile_data_icon_start_padding">@dimen/mobile_signal_group_end_padding</dimen>
+
+ <!-- gap on either side of status bar notification icons -->
+ <dimen name="status_bar_icon_padding">8dp</dimen>
+
+ <!-- Standard image button size for volume dialog buttons -->
+ <dimen name="volume_button_size">84dp</dimen>
+
+ <!-- The maximum width allowed for the volume dialog. For auto, we allow this to span a good
+ deal of the screen. This value accounts for the side margins. -->
+ <dimen name="volume_dialog_panel_width">1920dp</dimen>
+</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/styles.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/styles.xml
new file mode 100644
index 0000000..697e195
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/styles.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- The style for the volume icons in the volume dialog. This style makes the icon scale to
+ fit its container since auto wants the icon to be larger. The padding is added to make it
+ so the icon does not press along the edges of the dialog. -->
+ <style name="VolumeButtons" parent="@android:style/Widget.Material.Button.Borderless">
+ <item name="android:background">@drawable/btn_borderless_rect</item>
+ <item name="android:scaleType">fitCenter</item>
+ <item name="android:padding">22dp</item>
+ </style>
+
+</resources>
diff --git a/car_product/overlay/frameworks/packages/SettingsProvider/res/values/default.xml b/car_product/overlay/frameworks/packages/SettingsProvider/res/values/default.xml
new file mode 100644
index 0000000..0eaed7d
--- /dev/null
+++ b/car_product/overlay/frameworks/packages/SettingsProvider/res/values/default.xml
@@ -0,0 +1,23 @@
+<?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.
+ */
+-->
+<resources>
+ <!-- no setup wizard - we are already "provisioned" - This will go soon! -->
+ <bool name="def_device_provisioned">true</bool>
+ <integer name="add_users_when_locked">1</integer>
+</resources>
diff --git a/car_product/overlay/packages/services/Telecomm/res/values/config.xml b/car_product/overlay/packages/services/Telecomm/res/values/config.xml
new file mode 100644
index 0000000..58dc706
--- /dev/null
+++ b/car_product/overlay/packages/services/Telecomm/res/values/config.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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.
+-->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+ builds. -->
+<resources>
+ <!-- Determines if the current device should allow emergency numbers to be logged in the
+ call log. Some carriers require that emergency calls *not* be logged, presumably to
+ avoid the risk of accidental redialing from the call log UI.
+ The default is false. -->
+ <bool name="allow_emergency_numbers_in_call_log">false</bool>
+
+ <!-- Determine whether we want to play local DTMF tones in a call, or just let the radio/BP
+ handle playing of the tones. -->
+ <bool name="allow_local_dtmf_tones">true</bool>
+
+ <!-- Package name for the default in-call UI and dialer [DO NOT TRANSLATE] -->
+ <string name="ui_default_package" translatable="false">com.google.android.car.dialer</string>
+
+ <!-- Class name for the default in-call UI Service [DO NOT TRANSLATE] -->
+ <string name="incall_default_class" translatable="false">com.google.android.car.dialer.telecom.embedded.InCallServiceImpl</string>
+
+ <!-- Class name for the default main dialer activity [DO NOT TRANSLATE] -->
+ <string name="dialer_default_class" translatable="false">com.google.android.car.dialer.TelecomActivity</string>
+
+ <!-- Flag indicating if the tty is enabled -->
+ <bool name="tty_enabled">false</bool>
+</resources>
diff --git a/car_product/preloaded-classes-car b/car_product/preloaded-classes-car
new file mode 100644
index 0000000..962099f
--- /dev/null
+++ b/car_product/preloaded-classes-car
@@ -0,0 +1 @@
+# Classes which are preloaded by com.android.internal.os.ZygoteInit.
diff --git a/car_product/sepolicy/atfwd.te b/car_product/sepolicy/atfwd.te
new file mode 100644
index 0000000..f9c5eb1
--- /dev/null
+++ b/car_product/sepolicy/atfwd.te
@@ -0,0 +1,14 @@
+type atfwd, domain;
+type atfwd_exec, exec_type, file_type;
+
+init_daemon_domain(atfwd)
+
+# Creates/Talks to qmuxd via the qmux_radio socket.
+qmux_socket(atfwd)
+
+# Set radio.atfwd.* properties.
+set_prop(atfwd, radio_atfwd_prop)
+
+userdebug_or_eng(`
+ allow atfwd diag_device:chr_file rw_file_perms;
+')
diff --git a/car_product/sepolicy/bluetooth.te b/car_product/sepolicy/bluetooth.te
new file mode 100644
index 0000000..f93e040
--- /dev/null
+++ b/car_product/sepolicy/bluetooth.te
@@ -0,0 +1,18 @@
+# Allow access to wc_transport.* properties.
+set_prop(bluetooth, wc_transport_prop)
+
+# Allow access to /dev/ttyHS0
+allow bluetooth serial_device:chr_file rw_file_perms;
+
+# Connect to start_hci_filter service.
+allow bluetooth start_hci_filter:unix_stream_socket connectto;
+
+# Allow access to /persist/.bt_nv.bin.
+allow bluetooth persist_file:file rw_file_perms;
+
+# Allow access to /bt_firmware files.
+allow bluetooth bt_firmware_file:file r_file_perms;
+
+# Allow access to bt_power sysfs nodes.
+r_dir_file(bluetooth, sysfs_bt_power);
+allow bluetooth sysfs_bt_power:file w_file_perms;
diff --git a/car_product/sepolicy/can.te b/car_product/sepolicy/can.te
new file mode 100644
index 0000000..e18b839
--- /dev/null
+++ b/car_product/sepolicy/can.te
@@ -0,0 +1,18 @@
+# CAN service
+type can, domain;
+type can_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(can)
+
+allow can self:capability net_admin;
+
+allow can self:netlink_route_socket nlmsg_write;
+
+allow can shell_exec:file r_file_perms;
+
+# Allow execution of /system/bin/ip.
+allow can system_file:file rx_file_perms;
+
+# Allow can operations
+allow can self:capability { net_raw };
diff --git a/car_product/sepolicy/config_bluetooth.te b/car_product/sepolicy/config_bluetooth.te
new file mode 100644
index 0000000..f0c8789
--- /dev/null
+++ b/car_product/sepolicy/config_bluetooth.te
@@ -0,0 +1,22 @@
+# config_bluetooth service
+type config_bluetooth, domain;
+type config_bluetooth_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(config_bluetooth)
+
+# Set bluetooth.* and qualcomm.bluetooth.* properties.
+set_prop(config_bluetooth, bluetooth_prop);
+
+# Allow execution of /system/bin/btnvtool.
+allow config_bluetooth btnvtool_exec:file rx_file_perms;
+
+# Allow access to /persist/.bt_nv.bin.
+allow config_bluetooth persist_file:dir w_dir_perms;
+allow config_bluetooth persist_file:file create_file_perms;
+
+allow config_bluetooth shell_exec:file r_file_perms;
+
+allow config_bluetooth toolbox_exec:file rx_file_perms;
+
+allow config_bluetooth sysfs:file r_file_perms;
diff --git a/car_product/sepolicy/device.te b/car_product/sepolicy/device.te
new file mode 100644
index 0000000..38d2618
--- /dev/null
+++ b/car_product/sepolicy/device.te
@@ -0,0 +1,14 @@
+# Define the logging device type
+type diag_device, dev_type, mlstrustedobject;
+
+#device type for gss device nodes, ie /dev/gss
+type gss_device, dev_type;
+
+type hsic_device, dev_type;
+type latency_device, dev_type;
+type modem_block_device, dev_type;
+type persist_block_device, dev_type;
+type qmuxd_socket, dev_type;
+type smem_log_device, dev_type;
+type ssd_block_device, dev_type;
+type wcnss_device, dev_type;
diff --git a/car_product/sepolicy/domain.te b/car_product/sepolicy/domain.te
new file mode 100644
index 0000000..67cbce6
--- /dev/null
+++ b/car_product/sepolicy/domain.te
@@ -0,0 +1,48 @@
+# Ignore personality-8 denials.
+dontaudit adbd kernel:system module_request;
+dontaudit atfwd kernel:system module_request;
+dontaudit bootanim kernel:system module_request;
+dontaudit can kernel:system module_request;
+dontaudit config_bluetooth kernel:system module_request;
+dontaudit debuggerd kernel:system module_request;
+dontaudit drmserver kernel:system module_request;
+dontaudit fsck kernel:system module_request;
+dontaudit gatekeeperd kernel:system module_request;
+dontaudit healthd kernel:system module_request;
+dontaudit init kernel:system module_request;
+dontaudit installd kernel:system module_request;
+dontaudit irsc_util kernel:system module_request;
+dontaudit keystore kernel:system module_request;
+dontaudit lmkd kernel:system module_request;
+dontaudit logd kernel:system module_request;
+dontaudit mm-pp-daemon kernel:system module_request;
+dontaudit modem-sh kernel:system module_request;
+dontaudit mpdecision kernel:system module_request;
+dontaudit netd kernel:system module_request;
+dontaudit netmgrd kernel:system module_request;
+dontaudit qcom-c_core-sh kernel:system module_request;
+dontaudit qcom-c_main-sh kernel:system module_request;
+dontaudit qcom-post-boot kernel:system module_request;
+dontaudit qcom-sh kernel:system module_request;
+dontaudit qcom-usb-sh kernel:system module_request;
+dontaudit qmuxd kernel:system module_request;
+dontaudit rmt_storage kernel:system module_request;
+dontaudit sdcardd kernel:system module_request;
+dontaudit servicemanager kernel:system module_request;
+dontaudit shell kernel:system module_request;
+dontaudit start_hci_filter kernel:system module_request;
+dontaudit surfaceflinger kernel:system module_request;
+dontaudit thermal-engine kernel:system module_request;
+dontaudit time_daemon kernel:system module_request;
+dontaudit tzdatacheck kernel:system module_request;
+dontaudit ueventd kernel:system module_request;
+dontaudit untrusted_app kernel:system module_request;
+dontaudit usf-post-boot kernel:system module_request;
+dontaudit vns kernel:system module_request;
+dontaudit vold kernel:system module_request;
+dontaudit wcnss_service kernel:system module_request;
+dontaudit zygote kernel:system module_request;
+
+userdebug_or_eng(`
+ dontaudit perfprofd kernel:system module_request;
+')
diff --git a/car_product/sepolicy/file.te b/car_product/sepolicy/file.te
new file mode 100644
index 0000000..2aaa844
--- /dev/null
+++ b/car_product/sepolicy/file.te
@@ -0,0 +1,21 @@
+type btnvtool_exec, exec_type, file_type;
+
+# Bluetooth firmware file types
+type bt_firmware_file, contextmount_type, fs_type;
+
+# Default type for anything under /firmware.
+type firmware_file, contextmount_type, fs_type;
+
+type mpdecision_socket, file_type;
+type perfd_data_file, file_type, data_file_type;
+type persist_file, file_type;
+type pps_socket, file_type;
+type sysfs_bt_power, sysfs_type, fs_type;
+type sysfs_dcvs, sysfs_type, fs_type;
+type sysfs_hsic_modem_wait, sysfs_type, fs_type;
+type sysfs_mpdecision, sysfs_type, fs_type;
+type sysfs_rpm_resources, sysfs_type, fs_type;
+type sysfs_smd_open_timeout, sysfs_type, fs_type;
+type sysfs_usb, sysfs_type, fs_type;
+type thermal_socket, file_type;
+type time_data_file, file_type, data_file_type;
diff --git a/car_product/sepolicy/file_contexts b/car_product/sepolicy/file_contexts
new file mode 100644
index 0000000..55b3276
--- /dev/null
+++ b/car_product/sepolicy/file_contexts
@@ -0,0 +1,97 @@
+###################################
+# Data files
+#
+/data/misc/perfd(/.*)? u:object_r:perfd_data_file:s0
+/data/system/perfd(/.*)? u:object_r:perfd_data_file:s0
+/data/time(/.*)? u:object_r:time_data_file:s0
+
+###################################
+# Dev nodes
+#
+/dev/cpu_dma_latency u:object_r:latency_device:s0
+/dev/diag u:object_r:diag_device:s0
+/dev/kgsl-3d0 u:object_r:gpu_device:s0
+/dev/gss u:object_r:gss_device:s0
+/dev/hsicctl[0-3] u:object_r:hsic_device:s0
+/dev/mdp_arb u:object_r:graphics_device:s0
+/dev/media([0-9])+ u:object_r:video_device:s0
+/dev/msm_acdb u:object_r:audio_device:s0
+/dev/msm_camera(/.*)? u:object_r:video_device:s0
+/dev/msm_rotator u:object_r:video_device:s0
+/dev/msm_vidc_.* u:object_r:video_device:s0
+/dev/smem_log u:object_r:smem_log_device:s0
+/dev/socket/mpdecision u:object_r:mpdecision_socket:s0
+/dev/socket/pps u:object_r:pps_socket:s0
+/dev/socket/thermal-recv-client u:object_r:thermal_socket:s0
+/dev/socket/thermal-send-client u:object_r:thermal_socket:s0
+/dev/socket/qmux_radio(/.*)? u:object_r:qmuxd_socket:s0
+/dev/ttyHS[0-9]* u:object_r:serial_device:s0
+/dev/v4l-subdev.* u:object_r:video_device:s0
+/dev/wcnss_ctrl u:object_r:wcnss_device:s0
+/dev/wcnss_wlan u:object_r:wcnss_device:s0
+
+###################################
+# Dev block nodes
+#
+/dev/block/platform/msm_sdcc\.1/by-name/boot u:object_r:boot_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/cache u:object_r:cache_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/fsg u:object_r:modem_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/modemst1 u:object_r:modem_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/modemst2 u:object_r:modem_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/persist u:object_r:persist_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/recovery u:object_r:recovery_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/ssd u:object_r:ssd_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/system u:object_r:system_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/userdata u:object_r:userdata_block_device:s0
+/dev/block/mmcblk0 u:object_r:root_block_device:s0
+
+###################################
+# Persist files
+#
+/persist(/.*)? u:object_r:persist_file:s0
+
+###################################
+# System files
+#
+/system/bin/ATFWD-daemon u:object_r:atfwd_exec:s0
+/system/bin/btnvtool u:object_r:btnvtool_exec:s0
+/system/bin/init\.class_main\.sh u:object_r:qcom-c_main-sh_exec:s0
+/system/bin/init\.qcom\.sh u:object_r:qcom-sh_exec:s0
+/system/bin/init\.qcom\.bt\.sh u:object_r:config_bluetooth_exec:s0
+/system/bin/init\.qcom\.class_core\.sh u:object_r:qcom-c_core-sh_exec:s0
+/system/bin/init\.qcom\.modem_links\.sh u:object_r:modem-sh_exec:s0
+/system/bin/init\.qcom\.post_boot\.sh u:object_r:qcom-post-boot_exec:s0
+/system/bin/init\.qcom\.usb\.sh u:object_r:qcom-usb-sh_exec:s0
+/system/bin/init\.qti\.can\.sh u:object_r:can_exec:s0
+/system/bin/usf_post_boot\.sh u:object_r:usf-post-boot_exec:s0
+/system/bin/irsc_util u:object_r:irsc_util_exec:s0
+/system/bin/mm-pp-daemon u:object_r:mm-pp-daemon_exec:s0
+/system/bin/mpdecision u:object_r:mpdecision_exec:s0
+/system/bin/netmgrd u:object_r:netmgrd_exec:s0
+/system/bin/qmuxd u:object_r:qmuxd_exec:s0
+/system/bin/rmt_storage u:object_r:rmt_storage_exec:s0
+/system/bin/thermal-engine u:object_r:thermal-engine_exec:s0
+/system/bin/time_daemon u:object_r:time_daemon_exec:s0
+/system/bin/vehicle_network_service u:object_r:vns_exec:s0
+/system/bin/wcnss_filter u:object_r:start_hci_filter_exec:s0
+/system/bin/wcnss_service u:object_r:wcnss_service_exec:s0
+/system/bin/wpa_cli u:object_r:wcnss_service_exec:s0
+
+###################################
+# sysfs files
+#
+/sys/class/thermal(/.*)? u:object_r:sysfs_thermal:s0
+/sys/class/android_usb(/.*)? u:object_r:sysfs_usb:s0
+/sys/devices/virtual/thermal(/.*)? u:object_r:sysfs_thermal:s0
+/sys/module/msm_dcvs(/.*)? u:object_r:sysfs_dcvs:s0
+/sys/module/msm_mpdecision(/.*)? u:object_r:sysfs_mpdecision:s0
+/sys/module/msm_thermal(/.*)? u:object_r:sysfs_thermal:s0
+/sys/module/pm_8x60(/.*)? u:object_r:sysfs_devices_system_cpu:s0
+/sys/module/rmnet_usb(/.*)? u:object_r:sysfs_usb:s0
+/sys/module/rpm_resources(/.*)? u:object_r:sysfs_rpm_resources:s0
+/sys/module/spm_v2(/.*)? u:object_r:sysfs_thermal:s0
+/sys/devices/platform/bt_power(/.*)? u:object_r:sysfs_bt_power:s0
+/sys/devices/platform/msm_hsusb\.[1-4](/.*)? u:object_r:sysfs_usb:s0
+/sys/devices/virtual/android_usb(/.*)? u:object_r:sysfs_usb:s0
+/sys/devices/virtual/hsicctl/hsicctl[0-9]+/modem_wait u:object_r:sysfs_hsic_modem_wait:s0
+/sys/devices/virtual/smdpkt/smdcntl[0-9]+/open_timeout u:object_r:sysfs_smd_open_timeout:s0
diff --git a/car_product/sepolicy/init.te b/car_product/sepolicy/init.te
new file mode 100644
index 0000000..c909543
--- /dev/null
+++ b/car_product/sepolicy/init.te
@@ -0,0 +1,4 @@
+# Allow legacy sdcard for creating directory symlinks
+allow init tmpfs:lnk_file create_file_perms;
+
+r_dir_file(init, sysfs_usb);
diff --git a/car_product/sepolicy/irsc_util.te b/car_product/sepolicy/irsc_util.te
new file mode 100644
index 0000000..148134e
--- /dev/null
+++ b/car_product/sepolicy/irsc_util.te
@@ -0,0 +1,6 @@
+type irsc_util, domain;
+type irsc_util_exec, exec_type, file_type;
+
+init_daemon_domain(irsc_util)
+
+allow irsc_util self:socket create_socket_perms;
diff --git a/car_product/sepolicy/mm-pp-daemon.te b/car_product/sepolicy/mm-pp-daemon.te
new file mode 100644
index 0000000..c463509
--- /dev/null
+++ b/car_product/sepolicy/mm-pp-daemon.te
@@ -0,0 +1,13 @@
+type mm-pp-daemon, domain;
+type mm-pp-daemon_exec, exec_type, file_type;
+
+init_daemon_domain(mm-pp-daemon)
+
+# Need to use fb ioctls to communicate with kernel
+allow mm-pp-daemon graphics_device:chr_file rw_file_perms;
+
+# Allow socket calls in mm-pp-daemon
+allow mm-pp-daemon pps_socket:sock_file rw_file_perms;
+
+# Set hw.cabl.* properties.
+set_prop(mm-pp-daemon, hw_cabl_prop)
diff --git a/car_product/sepolicy/modem-sh.te b/car_product/sepolicy/modem-sh.te
new file mode 100644
index 0000000..0a06dc9
--- /dev/null
+++ b/car_product/sepolicy/modem-sh.te
@@ -0,0 +1,8 @@
+# modem-sh service
+type modem-sh, domain;
+type modem-sh_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(modem-sh)
+
+allow modem-sh shell_exec:file r_file_perms;
diff --git a/car_product/sepolicy/mpdecision.te b/car_product/sepolicy/mpdecision.te
new file mode 100644
index 0000000..432f4ee
--- /dev/null
+++ b/car_product/sepolicy/mpdecision.te
@@ -0,0 +1,36 @@
+# MpDecision service
+type mpdecision, domain;
+type mpdecision_exec, exec_type, file_type;
+
+init_daemon_domain(mpdecision)
+
+allow mpdecision self:capability { net_admin fsetid };
+
+allow mpdecision self:netlink_kobject_uevent_socket create_socket_perms;
+
+# Access to /dev/cpu_dma_latency.
+allow mpdecision latency_device:chr_file w_file_perms;
+
+# Create and access to /dev/socket/mpdecision
+allow mpdecision mpdecision_socket:sock_file rw_file_perms;
+
+# Access to /sys/devices/system/cpu/*.
+allow mpdecision sysfs_devices_system_cpu:file rw_file_perms;
+
+# Access to sysfs_thermal nodes.
+allow mpdecision sysfs_thermal:dir r_dir_perms;
+allow mpdecision sysfs_thermal:file r_file_perms;
+
+# Access to mpctl data files and sockets.
+allow mpdecision perfd_data_file:dir w_dir_perms;
+allow mpdecision perfd_data_file:file create_file_perms;
+allow mpdecision perfd_data_file:sock_file create_file_perms;
+
+# Access to some dynamically generated files under /sys/devices/system/cpu/.
+allow mpdecision sysfs:file write;
+
+allow mpdecision self:capability dac_override;
+
+allow mpdecision sysfs:file r_file_perms;
+
+allow mpdecision proc:file rw_file_perms;
diff --git a/car_product/sepolicy/netd.te b/car_product/sepolicy/netd.te
new file mode 100644
index 0000000..2b002ec
--- /dev/null
+++ b/car_product/sepolicy/netd.te
@@ -0,0 +1 @@
+dontaudit netd self:capability sys_module;
diff --git a/car_product/sepolicy/netmgrd.te b/car_product/sepolicy/netmgrd.te
new file mode 100644
index 0000000..d87f690
--- /dev/null
+++ b/car_product/sepolicy/netmgrd.te
@@ -0,0 +1,28 @@
+type netmgrd, domain;
+type netmgrd_exec, exec_type, file_type;
+
+init_daemon_domain(netmgrd)
+net_domain(netmgrd)
+
+# Creates/Talks to qmuxd via the qmux_radio socket.
+qmux_socket(netmgrd)
+
+# Allow writing of ipv6 network properties
+allow netmgrd proc_net:file w_file_perms;
+
+# Allow netmgrd operations
+allow netmgrd self:capability { net_admin net_raw fsetid };
+
+# Allow execution of /system/bin/sh.
+allow netmgrd shell_exec:file rx_file_perms;
+
+# Allow execution of /system/bin/*.
+allow netmgrd system_file:file rx_file_perms;
+
+allow netmgrd toolbox_exec:file rx_file_perms;
+
+userdebug_or_eng(`
+ allow netmgrd diag_device:chr_file rw_file_perms;
+')
+
+dontaudit netmgrd self:capability sys_module;
diff --git a/car_product/sepolicy/property.te b/car_product/sepolicy/property.te
new file mode 100644
index 0000000..6282856
--- /dev/null
+++ b/car_product/sepolicy/property.te
@@ -0,0 +1,10 @@
+type ctl_mpdecision_prop, property_type;
+type ctl_netmgrd_prop, property_type;
+type ctl_qmuxd_prop, property_type;
+type ctl_quipc_igsn_prop, property_type;
+type ctl_quipc_main_prop, property_type;
+type ctl_thermal-engine_prop, property_type;
+type hw_cabl_prop, property_type;
+type wc_transport_prop, property_type;
+type wlan_driver_prop, property_type;
+type radio_atfwd_prop, property_type;
diff --git a/car_product/sepolicy/property_contexts b/car_product/sepolicy/property_contexts
new file mode 100644
index 0000000..4afc2ac
--- /dev/null
+++ b/car_product/sepolicy/property_contexts
@@ -0,0 +1,11 @@
+ctl.mpdecision u:object_r:ctl_mpdecision_prop:s0
+ctl.netmgrd u:object_r:ctl_netmgrd_prop:s0
+ctl.qmuxd u:object_r:ctl_qmuxd_prop:s0
+ctl.quipc_igsn u:object_r:ctl_quipc_igsn_prop:s0
+ctl.quipc_main u:object_r:ctl_quipc_main_prop:s0
+ctl.thermal-engine u:object_r:ctl_thermal-engine_prop:s0
+hw.cabl. u:object_r:hw_cabl_prop:s0
+qualcomm.bluetooth. u:object_r:bluetooth_prop:s0
+radio.atfwd. u:object_r:radio_atfwd_prop:s0
+wc_transport. u:object_r:wc_transport_prop:s0
+wlan.driver. u:object_r:wlan_driver_prop:s0
diff --git a/car_product/sepolicy/qcom-c_core-sh.te b/car_product/sepolicy/qcom-c_core-sh.te
new file mode 100644
index 0000000..6892820
--- /dev/null
+++ b/car_product/sepolicy/qcom-c_core-sh.te
@@ -0,0 +1,15 @@
+# qcom-c_core-sh service
+type qcom-c_core-sh, domain;
+type qcom-c_core-sh_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(qcom-c_core-sh)
+
+# Set ctl.console properties.
+set_prop(qcom-c_core-sh, ctl_console_prop)
+
+allow qcom-c_core-sh shell_exec:file r_file_perms;
+
+allow qcom-c_core-sh toolbox_exec:file rx_file_perms;
+
+allow qcom-c_core-sh sysfs:file r_file_perms;
diff --git a/car_product/sepolicy/qcom-c_main-sh.te b/car_product/sepolicy/qcom-c_main-sh.te
new file mode 100644
index 0000000..c8a1eed
--- /dev/null
+++ b/car_product/sepolicy/qcom-c_main-sh.te
@@ -0,0 +1,16 @@
+# qcom-c_main-sh service
+type qcom-c_main-sh, domain;
+type qcom-c_main-sh_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(qcom-c_main-sh)
+
+# Set ctl.qmuxd property.
+set_prop(qcom-c_main-sh, ctl_qmuxd_prop)
+
+# Set ctl.netmgrd property.
+set_prop(qcom-c_main-sh, ctl_netmgrd_prop)
+
+allow qcom-c_main-sh shell_exec:file r_file_perms;
+
+allow qcom-c_main-sh toolbox_exec:file rx_file_perms;
diff --git a/car_product/sepolicy/qcom-post-boot.te b/car_product/sepolicy/qcom-post-boot.te
new file mode 100644
index 0000000..3d54b84
--- /dev/null
+++ b/car_product/sepolicy/qcom-post-boot.te
@@ -0,0 +1,50 @@
+# qcom-post-boot service
+type qcom-post-boot, domain;
+type qcom-post-boot_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(qcom-post-boot)
+
+# Set ctl.thermal-engine property.
+set_prop(qcom-post-boot, ctl_thermal-engine_prop);
+
+# Set ctl.mpdecision property.
+set_prop(qcom-post-boot, ctl_mpdecision_prop);
+
+# Allow access to /dev/ttyHS0.
+allow qcom-post-boot serial_device:chr_file { getattr setattr };
+
+allow qcom-post-boot shell_exec:file r_file_perms;
+
+# Write access to thermal related sysfs nodes.
+allow qcom-post-boot sysfs_thermal:dir search;
+allow qcom-post-boot sysfs_thermal:file w_file_perms;
+
+# Access to /sys/module/rpm_resources/*.
+allow qcom-post-boot sysfs_rpm_resources:dir search;
+allow qcom-post-boot sysfs_rpm_resources:file w_file_perms;
+
+# Write access to mpdecision related sysfs nodes.
+allow qcom-post-boot sysfs_mpdecision:dir search;
+allow qcom-post-boot sysfs_mpdecision:file { rw_file_perms setattr };
+
+# Access to /sys/module/msm_dcvs/*.
+allow qcom-post-boot sysfs_dcvs:dir search;
+allow qcom-post-boot sysfs_dcvs:file { rw_file_perms setattr };
+
+# Chown /sys/devices/platform/bt_power/*.
+allow qcom-post-boot sysfs_bt_power:dir search;
+allow qcom-post-boot sysfs_bt_power:file { getattr setattr };
+
+# Write access to /sys/devices/system/cpu/*.
+allow qcom-post-boot sysfs_devices_system_cpu:file { w_file_perms setattr };
+
+# Write access to dynamically generated files under /sys/devices/system/cpufreq/ondemand/*.
+allow qcom-post-boot sysfs:file { w_file_perms setattr };
+
+# Allow changing the owner of the above sysfs nodes.
+allow qcom-post-boot self:capability { fowner chown fsetid };
+
+allow qcom-post-boot sysfs:file r_file_perms;
+
+allow qcom-post-boot toolbox_exec:file rx_file_perms;
diff --git a/car_product/sepolicy/qcom-sh.te b/car_product/sepolicy/qcom-sh.te
new file mode 100644
index 0000000..1ae6c4f
--- /dev/null
+++ b/car_product/sepolicy/qcom-sh.te
@@ -0,0 +1,21 @@
+# qcom-sh service
+type qcom-sh, domain;
+type qcom-sh_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(qcom-sh)
+
+# Set ctl.quipc_* property.
+set_prop(qcom-sh, ctl_quipc_igsn_prop)
+set_prop(qcom-sh, ctl_quipc_main_prop)
+
+allow qcom-sh self:capability net_admin;
+
+# Allow writing of ipv6 network properties
+allow qcom-sh proc_net:file w_file_perms;
+
+allow qcom-sh shell_exec:file r_file_perms;
+
+allow qcom-sh toolbox_exec:file rx_file_perms;
+
+allow qcom-sh sysfs:file r_file_perms;
diff --git a/car_product/sepolicy/qcom-usb-sh.te b/car_product/sepolicy/qcom-usb-sh.te
new file mode 100644
index 0000000..8d63782
--- /dev/null
+++ b/car_product/sepolicy/qcom-usb-sh.te
@@ -0,0 +1,29 @@
+# qcom-usb-sh service
+type qcom-usb-sh, domain;
+type qcom-usb-sh_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(qcom-usb-sh)
+
+# Allow changing the owner of /sys/devices/virtual/hsicctl/hsicctl0/modem_wait.
+allow qcom-usb-sh sysfs_hsic_modem_wait:file { getattr setattr };
+
+# qcom.usb.sh needs to restore the context of /sys/devices/virtual/hsicctl/hsicctl0/modem_wait
+# as it may not be properly labeled when accessed.
+allow qcom-usb-sh sysfs:file relabelfrom;
+allow qcom-usb-sh sysfs_hsic_modem_wait:file relabelto;
+
+# Follow links from /sys/class/android_usb/* to /sys/devices/virtual/android_usb/*.
+allow qcom-usb-sh sysfs_usb:lnk_file read;
+
+# Allow write access to USB related sysfs nodes.
+allow qcom-usb-sh sysfs_usb:dir search;
+allow qcom-usb-sh sysfs_usb:file w_file_perms;
+
+allow qcom-usb-sh self:capability chown;
+
+allow qcom-usb-sh shell_exec:file r_file_perms;
+
+allow qcom-usb-sh toolbox_exec:file rx_file_perms;
+
+allow qcom-usb-sh rootfs:file r_file_perms;
diff --git a/car_product/sepolicy/qmuxd.te b/car_product/sepolicy/qmuxd.te
new file mode 100644
index 0000000..e0b6dab
--- /dev/null
+++ b/car_product/sepolicy/qmuxd.te
@@ -0,0 +1,22 @@
+# qmuxd daemon
+type qmuxd, domain;
+type qmuxd_exec, exec_type, file_type;
+
+init_daemon_domain(qmuxd)
+net_domain(qmuxd)
+
+# Allow access to /dev/hsicctl*.
+allow qmuxd hsic_device:chr_file rw_file_perms;
+
+# Allow access to /sys/devices/virtual/smdpkt/smdcntl*/open_timeout.
+allow qmuxd sysfs_smd_open_timeout:file w_file_perms;
+
+# Allow access to /sys/devices/virtual/hsicctl/hsicctl*/modem_wait.
+allow qmuxd sysfs_hsic_modem_wait:file w_file_perms;
+
+userdebug_or_eng(`
+ allow qmuxd diag_device:chr_file rw_file_perms;
+')
+
+# Allow qmuxd to have the CAP_BLOCK_SUSPEND capability
+wakelock_use(qmuxd)
diff --git a/car_product/sepolicy/rild.te b/car_product/sepolicy/rild.te
new file mode 100644
index 0000000..ea450be
--- /dev/null
+++ b/car_product/sepolicy/rild.te
@@ -0,0 +1,6 @@
+# Creates/Talks to qmuxd via the qmux_radio socket.
+qmux_socket(rild);
+
+userdebug_or_eng(`
+ allow rild diag_device:chr_file rw_file_perms;
+')
diff --git a/car_product/sepolicy/rmt_storage.te b/car_product/sepolicy/rmt_storage.te
new file mode 100644
index 0000000..d67a2ce
--- /dev/null
+++ b/car_product/sepolicy/rmt_storage.te
@@ -0,0 +1,32 @@
+# rmt_storage daemon
+type rmt_storage, domain;
+type rmt_storage_exec, exec_type, file_type;
+
+init_daemon_domain(rmt_storage)
+
+# Drop (user, group) to (nobody, nobody)
+allow rmt_storage self:capability { setuid setgid };
+
+# Opens and reads /dev/block/mmcblk0.
+allow rmt_storage root_block_device:blk_file r_file_perms;
+
+# Allow access to /dev/uio0.
+allow rmt_storage uio_device:chr_file rw_file_perms;
+
+# Allow access to /dev/smem_log.
+allow rmt_storage smem_log_device:chr_file rw_file_perms;
+
+# Allow access to modem related block devices.
+allow rmt_storage modem_block_device:blk_file rw_file_perms;
+
+# Allow access to SSD related block devices.
+allow rmt_storage ssd_block_device:blk_file rw_file_perms;
+
+allow rmt_storage self:socket create_socket_perms;
+
+allow rmt_storage sysfs:file r_file_perms;
+
+allow rmt_storage sysfs:dir r_dir_perms;
+
+# Wake lock access.
+wakelock_use(rmt_storage)
diff --git a/car_product/sepolicy/start_hci_filter.te b/car_product/sepolicy/start_hci_filter.te
new file mode 100644
index 0000000..95ce9e4
--- /dev/null
+++ b/car_product/sepolicy/start_hci_filter.te
@@ -0,0 +1,10 @@
+type start_hci_filter, domain;
+type start_hci_filter_exec, exec_type, file_type;
+
+init_daemon_domain(start_hci_filter);
+
+# Allow access to /dev/ttyHS0
+allow start_hci_filter serial_device:chr_file rw_file_perms;
+
+# Allow access to wc_transport.* properties.
+set_prop(start_hci_filter, wc_transport_prop)
diff --git a/car_product/sepolicy/system_app.te b/car_product/sepolicy/system_app.te
new file mode 100644
index 0000000..aaa99c2
--- /dev/null
+++ b/car_product/sepolicy/system_app.te
@@ -0,0 +1 @@
+binder_call(system_app, vns);
diff --git a/car_product/sepolicy/system_server.te b/car_product/sepolicy/system_server.te
new file mode 100644
index 0000000..507f8ca
--- /dev/null
+++ b/car_product/sepolicy/system_server.te
@@ -0,0 +1,17 @@
+# Set wlan.driver.* properties.
+set_prop(system_server, wlan_driver_prop)
+
+# Creates/Talks to qmuxd via the qmux_radio socket.
+qmux_socket(system_server)
+
+# For gss
+allow system_server gss_device:chr_file rw_file_perms;
+
+userdebug_or_eng(`
+ allow system_server diag_device:chr_file rw_file_perms;
+')
+
+r_dir_file(system_server, sysfs_usb)
+allow system_server sysfs_usb:file w_file_perms;
+
+dontaudit system_server self:capability sys_module;
diff --git a/car_product/sepolicy/te_macros b/car_product/sepolicy/te_macros
new file mode 100644
index 0000000..485bfb7
--- /dev/null
+++ b/car_product/sepolicy/te_macros
@@ -0,0 +1,11 @@
+#####################################
+# qmux_socket(clientdomain)
+# Allow client domain to connecto and send
+# via a local socket to the qmux domain.
+# Also allow the client domain to remove
+# its own socket.
+define(`qmux_socket', `
+allow $1 qmuxd_socket:dir create_dir_perms;
+unix_socket_connect($1, qmuxd, qmuxd)
+allow $1 qmuxd_socket:sock_file { read getattr write setattr create unlink };
+')
diff --git a/car_product/sepolicy/thermal-engine.te b/car_product/sepolicy/thermal-engine.te
new file mode 100644
index 0000000..aa9224f
--- /dev/null
+++ b/car_product/sepolicy/thermal-engine.te
@@ -0,0 +1,38 @@
+# Thermal-engine daemon
+type thermal-engine, domain;
+type thermal-engine_exec, exec_type, file_type;
+
+init_daemon_domain(thermal-engine)
+
+userdebug_or_eng(`
+ allow thermal-engine diag_device:chr_file rw_file_perms;
+')
+
+allow thermal-engine self:capability { net_admin fsetid };
+
+allow thermal-engine self:netlink_kobject_uevent_socket create_socket_perms;
+
+# Allow access to /dev/smem_log.
+allow thermal-engine smem_log_device:chr_file rw_file_perms;
+
+# Access to /dev/socket/thermal-.*
+allow thermal-engine thermal_socket:sock_file rw_file_perms;
+
+# Access to /dev/socket/mpdecision.
+unix_socket_connect(thermal-engine, mpdecision, mpdecision);
+
+# Allow access to /dev/uio0.
+#allow rmt_storage uio_device:chr_file rw_file_perms;
+
+# Write access to thermal related sysfs nodes.
+r_dir_file(thermal-engine, sysfs_thermal)
+allow thermal-engine sysfs_thermal:file w_file_perms;
+
+# Creates/Talks to qmuxd via the qmux_radio socket.
+qmux_socket(thermal-engine);
+
+allow thermal-engine self:socket create_socket_perms;
+
+allow thermal-engine sysfs_thermal:file r_file_perms;
+
+allow thermal-engine sysfs_thermal:dir r_dir_perms;
diff --git a/car_product/sepolicy/time_daemon.te b/car_product/sepolicy/time_daemon.te
new file mode 100644
index 0000000..782da98
--- /dev/null
+++ b/car_product/sepolicy/time_daemon.te
@@ -0,0 +1,19 @@
+# Policies for time daemon
+type time_daemon, domain;
+type time_daemon_exec, exec_type, file_type;
+
+init_daemon_domain(time_daemon)
+
+# Allow access to /dev/smem_log.
+allow time_daemon smem_log_device:chr_file rw_file_perms;
+
+# Add rules for access permissions
+allow time_daemon rtc_device:chr_file r_file_perms;
+allow time_daemon alarm_device:chr_file rw_file_perms;
+
+# Allo access to /data/time/*.
+allow time_daemon time_data_file:file r_file_perms;
+
+allow time_daemon self:socket create_socket_perms;
+
+allow time_daemon self:capability { setuid setgid };
diff --git a/car_product/sepolicy/ueventd.te b/car_product/sepolicy/ueventd.te
new file mode 100644
index 0000000..f898e27
--- /dev/null
+++ b/car_product/sepolicy/ueventd.te
@@ -0,0 +1,11 @@
+# Allow read access to firmware related files.
+r_dir_file(ueventd, firmware_file);
+
+# Write access to thermal related sysfs nodes.
+allow ueventd sysfs_thermal:file w_file_perms;
+
+# Allow write access to usb related sysfs nodes.
+allow ueventd sysfs_usb:file w_file_perms;
+
+# Allow write access to bt_power sysfs nodes.
+allow ueventd sysfs_bt_power:file w_file_perms;
diff --git a/car_product/sepolicy/usf-post-boot.te b/car_product/sepolicy/usf-post-boot.te
new file mode 100644
index 0000000..e21f583
--- /dev/null
+++ b/car_product/sepolicy/usf-post-boot.te
@@ -0,0 +1,8 @@
+# usf-post-boot service
+type usf-post-boot, domain;
+type usf-post-boot_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(usf-post-boot)
+
+allow usf-post-boot shell_exec:file r_file_perms;
diff --git a/car_product/sepolicy/vns.te b/car_product/sepolicy/vns.te
new file mode 100644
index 0000000..ff5f1f8
--- /dev/null
+++ b/car_product/sepolicy/vns.te
@@ -0,0 +1,7 @@
+# Vehicle network service
+type vns, domain;
+type vns_exec, exec_type, file_type;
+
+init_daemon_domain(vns)
+
+binder_use(vns);
diff --git a/car_product/sepolicy/wcnss_service.te b/car_product/sepolicy/wcnss_service.te
new file mode 100644
index 0000000..fb97c43
--- /dev/null
+++ b/car_product/sepolicy/wcnss_service.te
@@ -0,0 +1,17 @@
+# WCNSS service
+type wcnss_service, domain;
+type wcnss_service_exec, exec_type, file_type;
+
+init_daemon_domain(wcnss_service)
+net_domain(wcnss_service)
+
+unix_socket_connect(wcnss_service, property, init)
+
+# Allow creation and modification of wifi data files.
+allow wcnss_service wifi_data_file:file create_file_perms;
+
+# Allow modifications of /dev/wcnss_* devices.
+allow wcnss_service wcnss_device:chr_file rw_file_perms;
+
+# Set wlan.driver.* properties.
+set_prop(wcnss_service, wlan_driver_prop)
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java
index 5e627a9..de792ed 100644
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java
+++ b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java
@@ -468,10 +468,10 @@
}
public static class VehicleAudioHwVariantConfigFlag {
-public static final int VEHICLE_AUDIO_HW_VARIANT_FLAG_PASS_RADIO_AUDIO_FOCUS_FLAG = 0x1;
+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_PASS_RADIO_AUDIO_FOCUS_FLAG: return "VEHICLE_AUDIO_HW_VARIANT_FLAG_PASS_RADIO_AUDIO_FOCUS_FLAG";
+case VEHICLE_AUDIO_HW_VARIANT_FLAG_INTERNAL_RADIO_FLAG: return "VEHICLE_AUDIO_HW_VARIANT_FLAG_INTERNAL_RADIO_FLAG";
default: return "UNKNOWN";
}
}
diff --git a/service/res/values/config.xml b/service/res/values/config.xml
index 24ef730..f45480f 100644
--- a/service/res/values/config.xml
+++ b/service/res/values/config.xml
@@ -38,10 +38,13 @@
vehicle HAL.-->
<string-array translatable="false" name="audioRoutingPolicy">
<!-- alll logical streams into single physical stream 0. -->
- <item>"0:call,media,nav_guidance,voice_command,alarm,notification,system,safety,unknown"</item>
+ <item>"0:call,media,radio,nav_guidance,voice_command,alarm,notification,system,safety,unknown"</item>
<!-- call and media to physical stream 0 while all others go to physical stream 1 -->
- <item>"0:call,media,unknown#1:nav_guidance,voice_command,alarm,notification,system,safety"</item>
+ <item>"0:call,media,radio,unknown#1:nav_guidance,voice_command,alarm,notification,system,safety"</item>
</string-array>
+ <!-- Timeout value in Ms for audio focus wait. Audio focus request not responsed within
+ this value will be treated as timeout and audio focus will be reset to LOSS state. -->
+ <integer name="audioFocusWaitTimeoutMs">1000</integer>
<!-- This is kernel device node to allow input event injection for key inputs coming
from vehicle hal -->
diff --git a/service/src/com/android/car/AudioRoutingPolicy.java b/service/src/com/android/car/AudioRoutingPolicy.java
index 39ad826..fdad5aa 100644
--- a/service/src/com/android/car/AudioRoutingPolicy.java
+++ b/service/src/com/android/car/AudioRoutingPolicy.java
@@ -44,13 +44,13 @@
}
private static int getStreamType(String str) {
- // no radio here as radio routing is outside android (for external module) or same as music
- // (for android internal module)
switch (str) {
case "call":
return CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL;
case "media":
return CarAudioManager.CAR_AUDIO_USAGE_MUSIC;
+ case "radio":
+ return CarAudioManager.CAR_AUDIO_USAGE_RADIO;
case "nav_guidance":
return CarAudioManager.CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE;
case "voice_command":
@@ -101,20 +101,8 @@
}
for (int i = 0; i < mPhysicalStreamForLogicalStream.length; i++) {
if (mPhysicalStreamForLogicalStream[i] == USAGE_TYPE_INVALID) {
- if (i == CarAudioManager.CAR_AUDIO_USAGE_RADIO) {
- // set radio routing to be the same as music. For external radio, this does not
- // matter. For internal one, it should be the same as music.
- int musicPhysicalStream =
- mPhysicalStreamForLogicalStream[CarAudioManager.CAR_AUDIO_USAGE_MUSIC];
- if (musicPhysicalStream == USAGE_TYPE_INVALID) {
- musicPhysicalStream = defaultStreamType;
- }
- mPhysicalStreamForLogicalStream[i] = musicPhysicalStream;
- } else {
- Log.w(CarLog.TAG_AUDIO, "Audio routing policy did not cover logical stream " +
- i);
- mPhysicalStreamForLogicalStream[i] = defaultStreamType;
- }
+ Log.w(CarLog.TAG_AUDIO, "Audio routing policy did not cover logical stream " + i);
+ mPhysicalStreamForLogicalStream[i] = defaultStreamType;
}
}
}
diff --git a/service/src/com/android/car/CarAudioService.java b/service/src/com/android/car/CarAudioService.java
index 82e5610..2632c02 100644
--- a/service/src/com/android/car/CarAudioService.java
+++ b/service/src/com/android/car/CarAudioService.java
@@ -18,6 +18,7 @@
import android.car.media.CarAudioManager;
import android.car.media.ICarAudio;
import android.content.Context;
+import android.content.res.Resources;
import android.media.AudioAttributes;
import android.media.AudioFocusInfo;
import android.media.AudioManager;
@@ -50,7 +51,7 @@
void onContextChange(int primaryFocusContext, int primaryFocusPhysicalStream);
}
- private static final long FOCUS_RESPONSE_WAIT_TIMEOUT_MS = 1000;
+ private final long mFocusResponseWaitTimeoutMs;
private static final String TAG_FOCUS = CarLog.TAG_AUDIO + ".FOCUS";
@@ -61,9 +62,11 @@
private final HandlerThread mFocusHandlerThread;
private final CarAudioFocusChangeHandler mFocusHandler;
private final SystemFocusListener mSystemFocusListener;
- private AudioPolicy mAudioPolicy;
+
private final Object mLock = new Object();
@GuardedBy("mLock")
+ private AudioPolicy mAudioPolicy;
+ @GuardedBy("mLock")
private FocusState mCurrentFocusState = FocusState.STATE_LOSS;
/** Focus state received, but not handled yet. Once handled, this will be set to null. */
@GuardedBy("mLock")
@@ -100,6 +103,8 @@
private AudioContextChangeListener mAudioContextChangeListener;
@GuardedBy("mLock")
private CarAudioContextChangeHandler mCarAudioContextChangeHandler;
+ @GuardedBy("mLock")
+ private boolean mIsRadioExternal;
private final AudioAttributes mAttributeBottom =
CarAudioAttributesUtil.getAudioAttributesForCarUsage(
@@ -116,6 +121,9 @@
mFocusHandlerThread.start();
mFocusHandler = new CarAudioFocusChangeHandler(mFocusHandlerThread.getLooper());
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+ Resources res = context.getResources();
+ mFocusResponseWaitTimeoutMs = (long) res.getInteger(R.integer.audioFocusWaitTimeoutMs);
+
}
@Override
@@ -131,7 +139,9 @@
if (isFocusSuported) {
builder.setAudioPolicyFocusListener(mSystemFocusListener);
}
- mAudioPolicy = builder.build();
+ synchronized (mLock) {
+ mAudioPolicy = builder.build();
+ }
if (isFocusSuported) {
FocusState currentState = FocusState.create(mAudioHal.getCurrentFocusState());
int r = mAudioManager.requestAudioFocus(mBottomAudioFocusHandler, mAttributeBottom,
@@ -152,7 +162,10 @@
}
mAudioHal.setFocusListener(this);
int audioHwVariant = mAudioHal.getHwVariant();
- mAudioRoutingPolicy = AudioRoutingPolicy.create(mContext, audioHwVariant);
+ synchronized (mLock) {
+ mAudioRoutingPolicy = AudioRoutingPolicy.create(mContext, audioHwVariant);
+ mIsRadioExternal = mAudioHal.isRadioExternal();
+ }
mAudioHal.setAudioRoutingPolicy(mAudioRoutingPolicy);
//TODO set routing policy with new AudioPolicy API. This will control which logical stream
// goes to which physical stream.
@@ -200,6 +213,7 @@
writer.println(" mCallActive:" + mCallActive + " mRadioActive:" + mRadioActive);
writer.println(" mCurrentPrimaryAudioContext:" + mCurrentPrimaryAudioContext +
" mCurrentPrimaryPhysicalStream:" + mCurrentPrimaryPhysicalStream);
+ writer.println(" mIsRadioExternal:" + mIsRadioExternal);
mAudioRoutingPolicy.dump(writer);
}
@@ -389,8 +403,8 @@
return false;
}
- private boolean isFocusFromRadio(AudioFocusInfo info) {
- if (!mAudioHal.isRadioExternal()) {
+ private boolean isFocusFromExternalRadio(AudioFocusInfo info) {
+ if (!mIsRadioExternal) {
// if radio is not external, no special handling of radio is necessary.
return false;
}
@@ -455,21 +469,14 @@
// update primary context and notify if necessary
int primaryContext = logicalStreamTypeForTop;
switch (logicalStreamTypeForTop) {
- case CarAudioAttributesUtil.CAR_AUDIO_TYPE_CARSERVICE_BOTTOM:
- case CarAudioAttributesUtil.CAR_AUDIO_TYPE_CARSERVICE_CAR_PROXY:
+ case CarAudioAttributesUtil.CAR_AUDIO_USAGE_CARSERVICE_BOTTOM:
+ case CarAudioAttributesUtil.CAR_AUDIO_USAGE_CARSERVICE_CAR_PROXY:
primaryContext = 0;
break;
}
if (mCurrentPrimaryAudioContext != primaryContext) {
mCurrentPrimaryAudioContext = primaryContext;
- if (primaryContext == CarAudioManager.CAR_AUDIO_USAGE_RADIO) {
- // policy does not know radio. treat it same as music.
- mCurrentPrimaryPhysicalStream =
- mAudioRoutingPolicy.getPhysicalStreamForLogicalStream(
- CarAudioManager.CAR_AUDIO_USAGE_MUSIC);
- } else {
- mCurrentPrimaryPhysicalStream = physicalStreamTypeForTop;
- }
+ mCurrentPrimaryPhysicalStream = physicalStreamTypeForTop;
if (mCarAudioContextChangeHandler != null) {
mCarAudioContextChangeHandler.requestContextChangeNotification(
mAudioContextChangeListener, primaryContext, physicalStreamTypeForTop);
@@ -495,10 +502,8 @@
int streamsToRequest = 0x1 << physicalStreamTypeForTop;
switch (mTopFocusInfo.getGainRequest()) {
case AudioManager.AUDIOFOCUS_GAIN:
- if (isFocusFromRadio(mTopFocusInfo)) {
+ if (isFocusFromExternalRadio(mTopFocusInfo)) {
mRadioActive = true;
- // audio context sending is only for audio from android.
- audioContexts = 0;
} else {
mRadioActive = false;
}
@@ -541,9 +546,9 @@
// Most cars do not allow that, but if mixing is possible, it can take media stream.
// For now, assume no mixing capability.
int radioPhysicalStream = mAudioRoutingPolicy.getPhysicalStreamForLogicalStream(
- CarAudioManager.CAR_AUDIO_USAGE_MUSIC);
- if (!isFocusFromRadio(mTopFocusInfo) &&
- (physicalStreamTypeForTop == radioPhysicalStream)) {
+ CarAudioManager.CAR_AUDIO_USAGE_RADIO);
+ if (!isFocusFromExternalRadio(mTopFocusInfo) &&
+ (physicalStreamTypeForTop == radioPhysicalStream) && mIsRadioExternal) {
Log.i(CarLog.TAG_AUDIO, "Top stream is taking the same stream:" +
physicalStreamTypeForTop + " as radio, stopping radio");
// stream conflict here. radio cannot be played
@@ -589,7 +594,7 @@
mAudioHal.requestAudioFocusChange(focusToRequest, streamsToRequest, extFocus,
audioContexts);
try {
- mLock.wait(FOCUS_RESPONSE_WAIT_TIMEOUT_MS);
+ mLock.wait(mFocusResponseWaitTimeoutMs);
} catch (InterruptedException e) {
//ignore
}
@@ -704,7 +709,7 @@
mAudioHal.requestAudioFocusChange(
AudioHalService.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE, 0, 0);
try {
- mLock.wait(FOCUS_RESPONSE_WAIT_TIMEOUT_MS);
+ mLock.wait(mFocusResponseWaitTimeoutMs);
} catch (InterruptedException e) {
//ignore
}
diff --git a/service/src/com/android/car/hal/AudioHalService.java b/service/src/com/android/car/hal/AudioHalService.java
index a8edeeb..d9906cd 100644
--- a/service/src/com/android/car/hal/AudioHalService.java
+++ b/service/src/com/android/car/hal/AudioHalService.java
@@ -260,7 +260,7 @@
return true;
}
return (config.getConfigArray(0) &
- VehicleAudioHwVariantConfigFlag.VEHICLE_AUDIO_HW_VARIANT_FLAG_PASS_RADIO_AUDIO_FOCUS_FLAG)
+ VehicleAudioHwVariantConfigFlag.VEHICLE_AUDIO_HW_VARIANT_FLAG_INTERNAL_RADIO_FLAG)
== 0;
}
diff --git a/tests/android_car_api_test/src/com/android/car/apitest/CarHvacManagerTest.java b/tests/android_car_api_test/src/com/android/car/apitest/CarHvacManagerTest.java
index 0d4e78d..82f52d5 100644
--- a/tests/android_car_api_test/src/com/android/car/apitest/CarHvacManagerTest.java
+++ b/tests/android_car_api_test/src/com/android/car/apitest/CarHvacManagerTest.java
@@ -76,7 +76,7 @@
assertTrue(property.isZonedProperty());
checkFloatMinMax((CarHvacFloatProperty) property);
break;
- case CarHvacManager.HVAC_ZONED_TEMP_IS_FARENHEIT: // zoned boolean
+ case CarHvacManager.HVAC_ZONED_TEMP_IS_FAHRENHEIT: // zoned boolean
case CarHvacManager.HVAC_ZONED_AC_ON:
case CarHvacManager.HVAC_WINDOW_DEFROSTER_ON:
assertEquals(CarHvacManager.PROPERTY_TYPE_BOOLEAN, property.getType());
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 72e97e0..371a9a5 100644
--- a/tests/carservice_test/src/com/android/car/test/AudioRoutingPolicyTest.java
+++ b/tests/carservice_test/src/com/android/car/test/AudioRoutingPolicyTest.java
@@ -117,6 +117,7 @@
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 |
@@ -138,6 +139,7 @@
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)
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 180b3ef..29a020e 100644
--- a/tests/carservice_test/src/com/android/car/test/CarAudioFocusTest.java
+++ b/tests/carservice_test/src/com/android/car/test/CarAudioFocusTest.java
@@ -361,8 +361,7 @@
assertEquals(0, request[1]);
assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
request[2]);
- // no android side context for radio
- assertEquals(0, request[3]);
+ assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
0,
@@ -382,7 +381,8 @@
assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM1, request[1]);
assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
request[2]);
- assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG, request[3]);
+ assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG |
+ VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM1,
@@ -396,7 +396,7 @@
assertEquals(0, request[1]);
assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
request[2]);
- assertEquals(0, request[3]);
+ assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG, request[3]);
mAudioFocusPropertyHandler.sendAudioFocusState(
VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
0,