Merge "Support flags for volume change callback" into pi-dev
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-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/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);