Snap for 4829593 from 280eba505892cb722078f0526c10b632d1f994cf to pi-release

Change-Id: Ib96b59a1b301b3a85a024c85581518a223d59b8a
diff --git a/car-lib/src/android/car/VehiclePropertyType.java b/car-lib/src/android/car/VehiclePropertyType.java
new file mode 100644
index 0000000..b236d2d
--- /dev/null
+++ b/car-lib/src/android/car/VehiclePropertyType.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car;
+
+import android.annotation.IntDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+
+/**
+ * Value type of VehicleProperty
+ * @hide
+ */
+public class VehiclePropertyType {
+    public static final int STRING          = 0x00100000;
+    public static final int BOOLEAN         = 0x00200000;
+    public static final int INT32           = 0x00400000;
+    public static final int INT32_VEC       = 0x00410000;
+    public static final int INT64           = 0x00500000;
+    public static final int INT64_VEC       = 0x00510000;
+    public static final int FLOAT           = 0x00600000;
+    public static final int FLOAT_VEC       = 0x00610000;
+    public static final int BYTES           = 0x00700000;
+    public static final int MIXED           = 0x00e00000;
+    public static final int MASK            = 0x00ff0000;
+    /** @hide */
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({
+            STRING,
+            BOOLEAN,
+            INT32,
+            INT32_VEC,
+            INT64,
+            INT64_VEC,
+            FLOAT,
+            FLOAT_VEC,
+            BYTES,
+            /**
+             * Any combination of scalar or vector types. The exact format must be
+             * provided in the description of the property.
+            */
+            MIXED,
+            MASK
+    })
+    public @interface Enum {}
+    private VehiclePropertyType() {}
+}
diff --git a/car-lib/src/android/car/hardware/CarSensorManager.java b/car-lib/src/android/car/hardware/CarSensorManager.java
index f6cc8df..2536604 100644
--- a/car-lib/src/android/car/hardware/CarSensorManager.java
+++ b/car-lib/src/android/car/hardware/CarSensorManager.java
@@ -24,6 +24,7 @@
 import android.car.CarLibLog;
 import android.car.CarManagerBase;
 import android.car.CarNotConnectedException;
+import android.car.VehiclePropertyType;
 import android.car.hardware.property.CarPropertyManager;
 import android.content.Context;
 import android.os.Bundle;
@@ -468,26 +469,34 @@
 
     private CarSensorEvent createCarSensorEvent(CarPropertyValue propertyValue) {
         CarSensorEvent event = null;
-        Object o = propertyValue.getValue();
-        if (o instanceof Float) {
-            event = new CarSensorEvent(propertyValue.getPropertyId(),
-                    propertyValue.getTimestamp(), 1, 0, 0);
-            event.floatValues[0] = (float) o;
-        } else if (o instanceof Integer) {
-            event = new CarSensorEvent(propertyValue.getPropertyId(),
-                    propertyValue.getTimestamp(), 0, 1, 0);
-            event.intValues[0] = (int) o;
-        } else if (o instanceof Boolean) {
-            event = new CarSensorEvent(propertyValue.getPropertyId(),
-                    propertyValue.getTimestamp(), 0, 1, 0);
-            event.intValues[0] = (boolean) o ? 1 : 0;
-        } else if (o instanceof Long[]) {
-            Long[] value = (Long[]) o;
-            event = new CarSensorEvent(propertyValue.getPropertyId(),
-                    propertyValue.getTimestamp(), 0, 0, value.length);
-            for (int i = 0; i < value.length; i++) {
-                event.longValues[i] = value[i];
-            }
+        switch (propertyValue.getPropertyId() & VehiclePropertyType.MASK) {
+            case VehiclePropertyType.FLOAT:
+                event = new CarSensorEvent(propertyValue.getPropertyId(),
+                        propertyValue.getTimestamp(), 1, 0, 0);
+                event.floatValues[0] = (float) propertyValue.getValue();
+                break;
+            case VehiclePropertyType.INT32:
+                event = new CarSensorEvent(propertyValue.getPropertyId(),
+                        propertyValue.getTimestamp(), 0, 1, 0);
+                event.intValues[0] = (int) propertyValue.getValue();
+                break;
+            case VehiclePropertyType.BOOLEAN:
+                event = new CarSensorEvent(propertyValue.getPropertyId(),
+                        propertyValue.getTimestamp(), 0, 1, 0);
+                event.intValues[0] = (boolean) propertyValue.getValue() ? 1 : 0;
+                break;
+            case VehiclePropertyType.INT64_VEC:
+                Object[] value = (Object[]) propertyValue.getValue();
+                event = new CarSensorEvent(propertyValue.getPropertyId(),
+                        propertyValue.getTimestamp(), 0, 0, value.length);
+                for (int i = 0; i < value.length; i++) {
+                    event.longValues[i] = (Long) value[i];
+                }
+                break;
+            default:
+                Log.e(TAG, "unhandled VehiclePropertyType for propId="
+                        + propertyValue.getPropertyId());
+                break;
         }
         return event;
     }
diff --git a/car-lib/src/android/car/media/ICarVolumeCallback.aidl b/car-lib/src/android/car/media/ICarVolumeCallback.aidl
index 10a5ddc..8540680 100644
--- a/car-lib/src/android/car/media/ICarVolumeCallback.aidl
+++ b/car-lib/src/android/car/media/ICarVolumeCallback.aidl
@@ -27,12 +27,12 @@
      * The changed-to volume index is not included, the caller is encouraged to
      * get the current group volume index via CarAudioManager.
      */
-    void onGroupVolumeChanged(int groupId);
+    void onGroupVolumeChanged(int groupId, int flags);
 
     /**
      * This is called whenever the master mute state is changed.
      * The changed-to master mute state is not included, the caller is encouraged to
      * get the current master mute state via AudioManager.
      */
-    void onMasterMuteChanged();
+    void onMasterMuteChanged(int flags);
 }
diff --git a/car-support-lib/proguard-release.flags b/car-support-lib/proguard-release.flags
index 11d6d8d..91cab7e 100644
--- a/car-support-lib/proguard-release.flags
+++ b/car-support-lib/proguard-release.flags
@@ -7646,7 +7646,6 @@
     public abstract java.lang.String[] setPackagesSuspendedAsUser(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, java.lang.String, java.lang.String, int);
     public abstract void setPermissionEnforced(java.lang.String, boolean);
     public abstract boolean setRequiredForSystemUser(java.lang.String, boolean);
-    public abstract boolean setSystemAppInstallState(java.lang.String, boolean, int);
     public abstract void setUpdateAvailable(java.lang.String, boolean);
     public abstract boolean shouldShowRequestPermissionRationale(java.lang.String, java.lang.String, int);
     public abstract void systemReady();
@@ -8590,7 +8589,6 @@
     public static int MATCH_DISABLED_UNTIL_USED_COMPONENTS;
     public static int MATCH_EXPLICITLY_VISIBLE_ONLY;
     public static int MATCH_FACTORY_ONLY;
-    public static int MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS;
     public static int MATCH_INSTANT;
     public static int MATCH_KNOWN_PACKAGES;
     public static int MATCH_STATIC_SHARED_LIBRARIES;
@@ -14031,7 +14029,6 @@
     public void dump(java.io.FileDescriptor, java.lang.String[]);
     protected void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
     public void dumpAsync(java.io.FileDescriptor, java.lang.String[]);
-    public static void dumpProxyDebugInfo();
     public static void enableTracing();
     public static void flushPendingCommands();
     public static int getCallingPid();
diff --git a/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java b/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java
index 3a21b1e..cfd598a 100644
--- a/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java
+++ b/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java
@@ -22,7 +22,6 @@
 import android.os.Handler;
 import android.os.IBinder;
 import android.support.car.content.pm.CarPackageManagerEmbedded;
-import android.support.car.hardware.CarSensorManagerEmbedded;
 import android.support.car.media.CarAudioManagerEmbedded;
 import android.support.car.navigation.CarNavigationStatusManagerEmbedded;
 
@@ -92,8 +91,6 @@
         switch (serviceName) {
             case Car.AUDIO_SERVICE:
                 return new CarAudioManagerEmbedded(manager);
-            case Car.SENSOR_SERVICE:
-                return new CarSensorManagerEmbedded(manager, getContext());
             case Car.INFO_SERVICE:
                 return new CarInfoManagerEmbedded(manager);
             case Car.APP_FOCUS_SERVICE:
diff --git a/service/AndroidManifest.xml b/service/AndroidManifest.xml
index 5477f1e..5212448 100644
--- a/service/AndroidManifest.xml
+++ b/service/AndroidManifest.xml
@@ -39,8 +39,7 @@
         android:description="@string/car_permission_desc_energy" />
     <permission
         android:name="android.car.permission.CAR_IDENTIFICATION"
-        android:permissionGroup="android.car.permission-group.CAR_MONITORING"
-        android:protectionLevel="dangerous"
+        android:protectionLevel="system|signature"
         android:label="@string/car_permission_label_car_identification"
         android:description="@string/car_permission_desc_car_identification" />
     <permission
diff --git a/service/src/com/android/car/CarAudioService.java b/service/src/com/android/car/CarAudioService.java
index 77f0f09..1b7ee67 100644
--- a/service/src/com/android/car/CarAudioService.java
+++ b/service/src/com/android/car/CarAudioService.java
@@ -138,7 +138,7 @@
                             + " suggested usage: " + AudioAttributes.usageToString(usage));
             final int groupId = getVolumeGroupIdForUsage(usage);
             final int currentVolume = getGroupVolume(groupId);
-            final int flags = AudioManager.FLAG_FROM_KEY;
+            final int flags = AudioManager.FLAG_FROM_KEY | AudioManager.FLAG_SHOW_UI;
             switch (adjustment) {
                 case AudioManager.ADJUST_LOWER:
                     if (currentVolume > getGroupMinVolume(groupId)) {
@@ -152,15 +152,15 @@
                     break;
                 case AudioManager.ADJUST_MUTE:
                     mAudioManager.setMasterMute(true, flags);
-                    callbackMasterMuteChange();
+                    callbackMasterMuteChange(flags);
                     break;
                 case AudioManager.ADJUST_UNMUTE:
                     mAudioManager.setMasterMute(false, flags);
-                    callbackMasterMuteChange();
+                    callbackMasterMuteChange(flags);
                     break;
                 case AudioManager.ADJUST_TOGGLE_MUTE:
                     mAudioManager.setMasterMute(!mAudioManager.isMasterMute(), flags);
-                    callbackMasterMuteChange();
+                    callbackMasterMuteChange(flags);
                     break;
                 case AudioManager.ADJUST_SAME:
                 default:
@@ -185,11 +185,11 @@
                     if (groupId == -1) {
                         Log.w(CarLog.TAG_AUDIO, "Unknown stream type: " + streamType);
                     } else {
-                        callbackGroupVolumeChange(groupId);
+                        callbackGroupVolumeChange(groupId, 0);
                     }
                     break;
                 case AudioManager.MASTER_MUTE_CHANGED_ACTION:
-                    callbackMasterMuteChange();
+                    callbackMasterMuteChange(0);
                     break;
             }
         }
@@ -260,7 +260,7 @@
         synchronized (mImplLock) {
             enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
 
-            callbackGroupVolumeChange(groupId);
+            callbackGroupVolumeChange(groupId, flags);
             // For legacy stream type based volume control
             if (!mUseDynamicRouting) {
                 mAudioManager.setStreamVolume(STREAM_TYPES[groupId], index, flags);
@@ -272,22 +272,22 @@
         }
     }
 
-    private void callbackGroupVolumeChange(int groupId) {
+    private void callbackGroupVolumeChange(int groupId, int flags) {
         for (BinderInterfaceContainer.BinderInterface<ICarVolumeCallback> callback :
                 mVolumeCallbackContainer.getInterfaces()) {
             try {
-                callback.binderInterface.onGroupVolumeChanged(groupId);
+                callback.binderInterface.onGroupVolumeChanged(groupId, flags);
             } catch (RemoteException e) {
                 Log.e(CarLog.TAG_AUDIO, "Failed to callback onGroupVolumeChanged", e);
             }
         }
     }
 
-    private void callbackMasterMuteChange() {
+    private void callbackMasterMuteChange(int flags) {
         for (BinderInterfaceContainer.BinderInterface<ICarVolumeCallback> callback :
                 mVolumeCallbackContainer.getInterfaces()) {
             try {
-                callback.binderInterface.onMasterMuteChanged();
+                callback.binderInterface.onMasterMuteChanged(flags);
             } catch (RemoteException e) {
                 Log.e(CarLog.TAG_AUDIO, "Failed to callback onMasterMuteChanged", e);
             }
diff --git a/service/src/com/android/car/hal/CarPropertyUtils.java b/service/src/com/android/car/hal/CarPropertyUtils.java
index cbca08b..d9151e2 100644
--- a/service/src/com/android/car/hal/CarPropertyUtils.java
+++ b/service/src/com/android/car/hal/CarPropertyUtils.java
@@ -53,9 +53,8 @@
                                           v.int32Values.get(0) == 1);
         } else if (Boolean[].class == clazz) {
             Boolean[] values = new Boolean[v.int32Values.size()];
-            int i = 0;
-            for (int val : v.int32Values) {
-                values[i] = val == 1;
+            for (int i = 0; i < values.length; i++) {
+                values[i] = v.int32Values.get(i) == 1;
             }
             return new CarPropertyValue<>(propertyId, areaId, status, timestamp, values);
         } else if (String.class == clazz) {
@@ -63,6 +62,12 @@
         } else if (byte[].class == clazz) {
             byte[] halData = toByteArray(v.bytes);
             return new CarPropertyValue<>(propertyId, areaId, status, timestamp, halData);
+        } else if (Long[].class == clazz) {
+            Long[] values = new Long[v.int64Values.size()];
+            for (int i = 0; i < values.length; i++) {
+                values[i] = v.int64Values.get(i);
+            }
+            return new CarPropertyValue<>(propertyId, areaId, status, timestamp, values);
         } else /* All list properties */ {
             Object[] values = getRawValueList(clazz, v).toArray();
             return new CarPropertyValue<>(propertyId, areaId, status, timestamp,
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java
index 0a00c66..7837f2e 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java
@@ -17,6 +17,7 @@
 package com.google.android.car.kitchensink;
 
 
+import android.car.hardware.CarSensorManager;
 import android.car.hardware.hvac.CarHvacManager;
 import android.car.hardware.power.CarPowerManager;
 import android.car.hardware.property.CarPropertyManager;
@@ -27,7 +28,6 @@
 import android.support.car.CarAppFocusManager;
 import android.support.car.CarConnectionCallback;
 import android.support.car.CarNotConnectedException;
-import android.support.car.hardware.CarSensorManager;
 import android.support.v4.app.Fragment;
 import android.util.Log;
 
@@ -181,17 +181,9 @@
     private CarHvacManager mHvacManager;
     private CarPowerManager mPowerManager;
     private CarPropertyManager mPropertyManager;
-    private CarSensorManager mCarSensorManager;
+    private CarSensorManager mSensorManager;
     private CarAppFocusManager mCarAppFocusManager;
 
-    private final CarSensorManager.OnSensorChangedListener mListener = (manager, event) -> {
-        switch (event.sensorType) {
-            case CarSensorManager.SENSOR_TYPE_DRIVING_STATUS:
-                Log.d(TAG, "driving status:" + event.intValues[0]);
-                break;
-        }
-    };
-
     public CarHvacManager getHvacManager() {
         return mHvacManager;
     }
@@ -209,6 +201,10 @@
         return new DrawerAdapter();
     }
 
+    public CarSensorManager getSensorManager() {
+        return mSensorManager;
+    }
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -255,9 +251,6 @@
     @Override
     protected void onDestroy() {
         super.onDestroy();
-        if (mCarSensorManager != null) {
-            mCarSensorManager.removeListener(mListener);
-        }
         if (mCarApi != null) {
             mCarApi.disconnect();
         }
@@ -281,10 +274,8 @@
                     android.car.Car.POWER_SERVICE);
                 mPropertyManager = (CarPropertyManager) mCarApi.getCarManager(
                     android.car.Car.PROPERTY_SERVICE);
-                mCarSensorManager = (CarSensorManager) mCarApi.getCarManager(Car.SENSOR_SERVICE);
-                mCarSensorManager.addListener(mListener,
-                        CarSensorManager.SENSOR_TYPE_DRIVING_STATUS,
-                        CarSensorManager.SENSOR_RATE_NORMAL);
+                mSensorManager = (CarSensorManager) mCarApi.getCarManager(
+                    android.car.Car.SENSOR_SERVICE);
                 mCarAppFocusManager =
                         (CarAppFocusManager) mCarApi.getCarManager(Car.APP_FOCUS_SERVICE);
             } catch (CarNotConnectedException e) {
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/sensor/SensorsTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/sensor/SensorsTestFragment.java
index 9c84f6e..abc2c10 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/sensor/SensorsTestFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/sensor/SensorsTestFragment.java
@@ -16,17 +16,18 @@
 
 package com.google.android.car.kitchensink.sensor;
 
+import static java.lang.Integer.toHexString;
+
 import android.Manifest;
 import android.annotation.Nullable;
 import android.car.Car;
+import android.car.CarNotConnectedException;
+import android.car.hardware.CarSensorConfig;
+import android.car.hardware.CarSensorEvent;
+import android.car.hardware.CarSensorManager;
 import android.content.pm.PackageManager;
-import android.location.Location;
 import android.os.Bundle;
 import android.os.Handler;
-import android.support.car.CarNotConnectedException;
-import android.support.car.hardware.CarSensorConfig;
-import android.support.car.hardware.CarSensorEvent;
-import android.support.car.hardware.CarSensorManager;
 import android.support.v4.app.Fragment;
 import android.text.TextUtils;
 import android.util.Log;
@@ -51,7 +52,7 @@
 public class SensorsTestFragment extends Fragment {
     private static final String TAG = "CAR.SENSOR.KS";
     private static final boolean DBG = true;
-    private static final boolean DBG_VERBOSE = false;
+    private static final boolean DBG_VERBOSE = true;
     private static final int KS_PERMISSIONS_REQUEST = 1;
 
     private final static String[] REQUIRED_PERMISSIONS = new String[]{
@@ -66,7 +67,7 @@
     private final CarSensorManager.OnSensorChangedListener mOnSensorChangedListener =
             new CarSensorManager.OnSensorChangedListener() {
                 @Override
-                public void onSensorChanged(CarSensorManager manager, CarSensorEvent event) {
+                public void onSensorChanged(CarSensorEvent event) {
                     if (DBG_VERBOSE) {
                         Log.v(TAG, "New car sensor event: " + event);
                     }
@@ -115,26 +116,23 @@
     public void onPause() {
         super.onPause();
         if (mSensorManager != null) {
-            mSensorManager.removeListener(mOnSensorChangedListener);
+            mSensorManager.unregisterListener(mOnSensorChangedListener);
         }
     }
 
     private void initSensors() {
         try {
-            mSensorManager = (CarSensorManager)
-                    mActivity.getCar().getCarManager(Car.SENSOR_SERVICE);
+            mSensorManager =
+                (CarSensorManager) ((KitchenSinkActivity) getActivity()).getSensorManager();
             supportedSensors = mSensorManager.getSupportedSensors();
             for (Integer sensor : supportedSensors) {
-                if ((sensor == CarSensorManager.SENSOR_TYPE_LOCATION
-                     || sensor == CarSensorManager.SENSOR_TYPE_GPS_SATELLITE)
-                    && !mActivePermissions.contains(Manifest.permission.ACCESS_FINE_LOCATION)) {
-                    continue;
-                }
-                mSensorManager.addListener(mOnSensorChangedListener, sensor,
+                mSensorManager.registerListener(mOnSensorChangedListener, sensor,
                         CarSensorManager.SENSOR_RATE_NORMAL);
             }
         } catch (CarNotConnectedException e) {
             Log.e(TAG, "Car not connected or not supported", e);
+        } catch (Exception e) {
+            Log.e(TAG, "initSensors() exception caught: ", e);
         }
     }
 
@@ -188,23 +186,20 @@
             for (Integer i : supportedSensors) {
                 CarSensorEvent event = mEventMap.get(i);
                 switch (i) {
-                    case CarSensorManager.SENSOR_TYPE_COMPASS:
-                        summary.add(getCompassString(event));
-                        break;
                     case CarSensorManager.SENSOR_TYPE_CAR_SPEED:
                         summary.add(getContext().getString(R.string.sensor_speed,
                                 getTimestamp(event),
-                                event == null ? mNaString : event.getCarSpeedData().carSpeed));
+                                event == null ? mNaString : event.getCarSpeedData(null).carSpeed));
                         break;
                     case CarSensorManager.SENSOR_TYPE_RPM:
                         summary.add(getContext().getString(R.string.sensor_rpm,
                                 getTimestamp(event),
-                                event == null ? mNaString : event.getRpmData().rpm));
+                                event == null ? mNaString : event.getRpmData(null).rpm));
                         break;
                     case CarSensorManager.SENSOR_TYPE_ODOMETER:
                         summary.add(getContext().getString(R.string.sensor_odometer,
                                 getTimestamp(event),
-                                event == null ? mNaString : event.getOdometerData().kms));
+                                event == null ? mNaString : event.getOdometerData(null).kms));
                         break;
                     case CarSensorManager.SENSOR_TYPE_FUEL_LEVEL:
                         summary.add(getFuelLevel(event));
@@ -216,38 +211,23 @@
                         summary.add(getContext().getString(R.string.sensor_parking_brake,
                                 getTimestamp(event),
                                 event == null ? mNaString :
-                                event.getParkingBrakeData().isEngaged));
+                                event.getParkingBrakeData(null).isEngaged));
                         break;
                     case CarSensorManager.SENSOR_TYPE_GEAR:
                         summary.add(getContext().getString(R.string.sensor_gear,
                                 getTimestamp(event),
-                                event == null ? mNaString : event.getGearData().gear));
+                                event == null ? mNaString : event.getGearData(null).gear));
                         break;
                     case CarSensorManager.SENSOR_TYPE_NIGHT:
                         summary.add(getContext().getString(R.string.sensor_night,
                                 getTimestamp(event),
-                                event == null ? mNaString : event.getNightData().isNightMode));
-                        break;
-                    case CarSensorManager.SENSOR_TYPE_LOCATION:
-                        summary.add(getLocationString(event));
-                        break;
-                    case CarSensorManager.SENSOR_TYPE_DRIVING_STATUS:
-                        String drivingStatus = mNaString;
-                        String binDrivingStatus = mNaString;
-                        if (event != null) {
-                            CarSensorEvent.DrivingStatusData drivingStatusData =
-                                    event.getDrivingStatusData();
-                            drivingStatus = String.valueOf(drivingStatusData.status);
-                            binDrivingStatus = Integer.toBinaryString(drivingStatusData.status);
-                        }
-                        summary.add(getContext().getString(R.string.sensor_driving_status,
-                                getTimestamp(event), drivingStatus, binDrivingStatus));
+                                event == null ? mNaString : event.getNightData(null).isNightMode));
                         break;
                     case CarSensorManager.SENSOR_TYPE_ENVIRONMENT:
                         String temperature = mNaString;
                         String pressure = mNaString;
                         if (event != null) {
-                            CarSensorEvent.EnvironmentData env = event.getEnvironmentData();
+                            CarSensorEvent.EnvironmentData env = event.getEnvironmentData(null);
                             temperature = Float.isNaN(env.temperature) ? temperature :
                                     String.valueOf(env.temperature);
                             pressure = Float.isNaN(env.pressure) ? pressure :
@@ -256,19 +236,10 @@
                         summary.add(getContext().getString(R.string.sensor_environment,
                                 getTimestamp(event), temperature, pressure));
                         break;
-                    case CarSensorManager.SENSOR_TYPE_ACCELEROMETER:
-                        summary.add(getAccelerometerString(event));
-                        break;
-                    case CarSensorManager.SENSOR_TYPE_GPS_SATELLITE:
-                        summary.add(getGpsSatelliteString(event));
-                        break;
-                    case CarSensorManager.SENSOR_TYPE_GYROSCOPE:
-                        summary.add(getGyroscopeString(event));
-                        break;
                     case CarSensorManager.SENSOR_TYPE_WHEEL_TICK_DISTANCE:
                         if(event != null) {
                             CarSensorEvent.CarWheelTickDistanceData d =
-                                event.getCarWheelTickDistanceData();
+                                    event.getCarWheelTickDistanceData(null);
                             summary.add(getContext().getString(R.string.sensor_wheel_ticks,
                                 getTimestamp(event), d.sensorResetCount, d.frontLeftWheelDistanceMm,
                                 d.frontRightWheelDistanceMm, d.rearLeftWheelDistanceMm,
@@ -295,14 +266,15 @@
                     case CarSensorManager.SENSOR_TYPE_ABS_ACTIVE:
                         summary.add(getContext().getString(R.string.sensor_abs_is_active,
                             getTimestamp(event), event == null ? mNaString :
-                            event.getCarAbsActiveData().absIsActive));
+                                    event.getCarAbsActiveData(null).absIsActive));
                         break;
 
                     case CarSensorManager.SENSOR_TYPE_TRACTION_CONTROL_ACTIVE:
                         summary.add(
                             getContext().getString(R.string.sensor_traction_control_is_active,
                             getTimestamp(event), event == null ? mNaString :
-                            event.getCarTractionControlActiveData().tractionControlIsActive));
+                                    event.getCarTractionControlActiveData(null)
+                                    .tractionControlIsActive));
                         break;
                     case CarSensorManager.SENSOR_TYPE_EV_BATTERY_LEVEL:
                         summary.add(getEvBatteryLevel(event));
@@ -318,7 +290,7 @@
                         break;
                     default:
                         // Should never happen.
-                        Log.w(TAG, "Unrecognized event type: " + i);
+                        Log.w(TAG, "Unrecognized event type: " + toHexString(i));
                 }
             }
             summaryString = TextUtils.join("\n", summary);
@@ -338,93 +310,10 @@
         return mDateFormat.format(new Date(event.timestamp / (1000L * 1000L)));
     }
 
-    private String getCompassString(CarSensorEvent event) {
-        String bear = mNaString;
-        String pitch = mNaString;
-        String roll = mNaString;
-        if (event != null) {
-            CarSensorEvent.CompassData compass = event.getCompassData();
-            bear = Float.isNaN(compass.bearing) ? bear : String.valueOf(compass.bearing);
-            pitch = Float.isNaN(compass.pitch) ? pitch : String.valueOf(compass.pitch);
-            roll = Float.isNaN(compass.roll) ? roll : String.valueOf(compass.roll);
-        }
-        return getContext().getString(R.string.sensor_compass,
-                getTimestamp(event), bear, pitch, roll);
-    }
-
-    private String getGyroscopeString(CarSensorEvent event) {
-        String x = mNaString;
-        String y = mNaString;
-        String z = mNaString;
-        if (event != null) {
-            CarSensorEvent.GyroscopeData gyro = event.getGyroscopeData();
-            x = Float.isNaN(gyro.x) ? x : String.valueOf(gyro.x);
-            y = Float.isNaN(gyro.y) ? y : String.valueOf(gyro.y);
-            z = Float.isNaN(gyro.z) ? z : String.valueOf(gyro.z);
-        }
-        return getContext().getString(R.string.sensor_gyroscope,
-                getTimestamp(event), x, y, z);
-    }
-
-    private String getAccelerometerString(CarSensorEvent event) {
-        String x = mNaString;
-        String y = mNaString;
-        String z = mNaString;
-        if (event != null) {
-            CarSensorEvent.AccelerometerData gyro = event.getAccelerometerData();
-            x = Float.isNaN(gyro.x) ? x : String.valueOf(gyro.x);
-            y = Float.isNaN(gyro.y) ? y : String.valueOf(gyro.y);
-            z = Float.isNaN(gyro.z) ? z : String.valueOf(gyro.z);
-        }
-        return getContext().getString(R.string.sensor_accelerometer,
-                getTimestamp(event), x, y, z);
-    }
-
-    private String getLocationString(CarSensorEvent event) {
-        String lat = mNaString;
-        String lon = mNaString;
-        String accuracy = mNaString;
-        String alt = mNaString;
-        String speed = mNaString;
-        String bearing = mNaString;
-        if (event != null) {
-            Location location = event.getLocation(null);
-            lat = String.valueOf(location.getLatitude());
-            lon = String.valueOf(location.getLongitude());
-            accuracy = location.hasAccuracy() ? String.valueOf(location.getAccuracy()) : accuracy;
-            alt = location.hasAltitude() ? String.valueOf(location.getAltitude()) : alt;
-            speed = location.hasSpeed() ? String.valueOf(location.getSpeed()) : speed;
-            bearing = location.hasBearing() ? String.valueOf(location.getBearing()) : bearing;
-        }
-        return getContext().getString(R.string.sensor_location,
-                getTimestamp(event), lat, lon, accuracy, alt, speed, bearing);
-    }
-
-    private String getGpsSatelliteString(CarSensorEvent event) {
-        String inUse = mNaString;
-        String inView = mNaString;
-        String perSattelite = "";
-        if (event != null) {
-            CarSensorEvent.GpsSatelliteData gpsData = event.getGpsSatelliteData(true);
-            inUse = gpsData.numberInUse != -1 ? String.valueOf(gpsData.numberInUse) : inUse;
-            inView = gpsData.numberInView != -1 ? String.valueOf(gpsData.numberInView) : inView;
-            List<String> perSatteliteList = new ArrayList<>();
-            int num = gpsData.usedInFix.length;
-            for (int i=0; i<num; i++) {
-                perSatteliteList.add(getContext().getString(R.string.sensor_single_gps_satellite,
-                        i+1, gpsData.usedInFix[i], gpsData.prn[i], gpsData.snr[i],
-                        gpsData.azimuth[i], gpsData.elevation[i]));
-            }
-            perSattelite = TextUtils.join(", ", perSatteliteList);
-        }
-        return getContext().getString(R.string.sensor_gps,
-                getTimestamp(event), inView, inUse, perSattelite);
-    }
-
     private String getFuelLevel(CarSensorEvent event) {
         String fuelLevel = mNaString;
         if(event != null) {
-            fuelLevel = String.valueOf(event.getFuelLevelData().level);
+            fuelLevel = String.valueOf(event.getFuelLevelData(null).level);
         }
         return getContext().getString(R.string.sensor_fuel_level, getTimestamp(event), fuelLevel);
     }
@@ -432,7 +321,7 @@
     private String getFuelDoorOpen(CarSensorEvent event) {
         String fuelDoorOpen = mNaString;
         if(event != null) {
-            fuelDoorOpen = String.valueOf(event.getCarFuelDoorOpenData().fuelDoorIsOpen);
+            fuelDoorOpen = String.valueOf(event.getCarFuelDoorOpenData(null).fuelDoorIsOpen);
         }
         return getContext().getString(R.string.sensor_fuel_door_open, getTimestamp(event),
             fuelDoorOpen);
@@ -441,7 +330,7 @@
     private String getEvBatteryLevel(CarSensorEvent event) {
         String evBatteryLevel = mNaString;
         if(event != null) {
-            evBatteryLevel = String.valueOf(event.getCarEvBatteryLevelData().evBatteryLevel);
+            evBatteryLevel = String.valueOf(event.getCarEvBatteryLevelData(null).evBatteryLevel);
         }
         return getContext().getString(R.string.sensor_ev_battery_level, getTimestamp(event),
             evBatteryLevel);
@@ -451,7 +340,7 @@
         String evChargePortOpen = mNaString;
         if(event != null) {
             evChargePortOpen = String.valueOf(
-                event.getCarEvChargePortOpenData().evChargePortIsOpen);
+                event.getCarEvChargePortOpenData(null).evChargePortIsOpen);
         }
         return getContext().getString(R.string.sensor_ev_charge_port_is_open, getTimestamp(event),
             evChargePortOpen);
@@ -461,7 +350,7 @@
         String evChargePortConnected = mNaString;
         if(event != null) {
             evChargePortConnected = String.valueOf(
-                event.getCarEvChargePortConnectedData().evChargePortIsConnected);
+                event.getCarEvChargePortConnectedData(null).evChargePortIsConnected);
         }
         return getContext().getString(R.string.sensor_ev_charge_port_is_connected,
             getTimestamp(event), evChargePortConnected);
@@ -470,7 +359,7 @@
     private String getEvChargeRate(CarSensorEvent event) {
         String evChargeRate = mNaString;
         if(event != null) {
-            evChargeRate = String.valueOf(event.getCarEvBatteryChargeRateData().evChargeRate);
+            evChargeRate = String.valueOf(event.getCarEvBatteryChargeRateData(null).evChargeRate);
         }
         return getContext().getString(R.string.sensor_ev_charge_rate, getTimestamp(event),
             evChargeRate);