summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandroid-build-team Robot2018-06-08 02:21:08 -0500
committerandroid-build-team Robot2018-06-08 02:21:08 -0500
commitf02b56678700a4035d0ad8882f7d20371bb96ee2 (patch)
tree59d7dd8b4d27bee6f90ffae1f1bbba0804f5a4ae
parent577cf630e511be2bb4d9c262c238587a4300af02 (diff)
parent280eba505892cb722078f0526c10b632d1f994cf (diff)
downloadplatform-packages-services-car-f02b56678700a4035d0ad8882f7d20371bb96ee2.tar.gz
platform-packages-services-car-f02b56678700a4035d0ad8882f7d20371bb96ee2.tar.xz
platform-packages-services-car-f02b56678700a4035d0ad8882f7d20371bb96ee2.zip
Change-Id: Ib96b59a1b301b3a85a024c85581518a223d59b8a
-rw-r--r--car-lib/src/android/car/VehiclePropertyType.java62
-rw-r--r--car-lib/src/android/car/hardware/CarSensorManager.java49
-rw-r--r--car-lib/src/android/car/media/ICarVolumeCallback.aidl4
-rw-r--r--car-support-lib/proguard-release.flags3
-rw-r--r--car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java3
-rw-r--r--service/AndroidManifest.xml3
-rw-r--r--service/src/com/android/car/CarAudioService.java22
-rw-r--r--service/src/com/android/car/hal/CarPropertyUtils.java11
-rw-r--r--tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java25
-rw-r--r--tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/sensor/SensorsTestFragment.java175
10 files changed, 153 insertions, 204 deletions
diff --git a/car-lib/src/android/car/VehiclePropertyType.java b/car-lib/src/android/car/VehiclePropertyType.java
new file mode 100644
index 00000000..b236d2d6
--- /dev/null
+++ b/car-lib/src/android/car/VehiclePropertyType.java
@@ -0,0 +1,62 @@
1/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.car;
18
19import android.annotation.IntDef;
20
21import java.lang.annotation.Retention;
22import java.lang.annotation.RetentionPolicy;
23
24
25/**
26 * Value type of VehicleProperty
27 * @hide
28 */
29public class VehiclePropertyType {
30 public static final int STRING = 0x00100000;
31 public static final int BOOLEAN = 0x00200000;
32 public static final int INT32 = 0x00400000;
33 public static final int INT32_VEC = 0x00410000;
34 public static final int INT64 = 0x00500000;
35 public static final int INT64_VEC = 0x00510000;
36 public static final int FLOAT = 0x00600000;
37 public static final int FLOAT_VEC = 0x00610000;
38 public static final int BYTES = 0x00700000;
39 public static final int MIXED = 0x00e00000;
40 public static final int MASK = 0x00ff0000;
41 /** @hide */
42 @Retention(RetentionPolicy.SOURCE)
43 @IntDef({
44 STRING,
45 BOOLEAN,
46 INT32,
47 INT32_VEC,
48 INT64,
49 INT64_VEC,
50 FLOAT,
51 FLOAT_VEC,
52 BYTES,
53 /**
54 * Any combination of scalar or vector types. The exact format must be
55 * provided in the description of the property.
56 */
57 MIXED,
58 MASK
59 })
60 public @interface Enum {}
61 private VehiclePropertyType() {}
62}
diff --git a/car-lib/src/android/car/hardware/CarSensorManager.java b/car-lib/src/android/car/hardware/CarSensorManager.java
index f6cc8dfd..25366046 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.CarApiUtil;
24import android.car.CarLibLog; 24import android.car.CarLibLog;
25import android.car.CarManagerBase; 25import android.car.CarManagerBase;
26import android.car.CarNotConnectedException; 26import android.car.CarNotConnectedException;
27import android.car.VehiclePropertyType;
27import android.car.hardware.property.CarPropertyManager; 28import android.car.hardware.property.CarPropertyManager;
28import android.content.Context; 29import android.content.Context;
29import android.os.Bundle; 30import android.os.Bundle;
@@ -468,26 +469,34 @@ public final class CarSensorManager implements CarManagerBase {
468 469
469 private CarSensorEvent createCarSensorEvent(CarPropertyValue propertyValue) { 470 private CarSensorEvent createCarSensorEvent(CarPropertyValue propertyValue) {
470 CarSensorEvent event = null; 471 CarSensorEvent event = null;
471 Object o = propertyValue.getValue(); 472 switch (propertyValue.getPropertyId() & VehiclePropertyType.MASK) {
472 if (o instanceof Float) { 473 case VehiclePropertyType.FLOAT:
473 event = new CarSensorEvent(propertyValue.getPropertyId(), 474 event = new CarSensorEvent(propertyValue.getPropertyId(),
474 propertyValue.getTimestamp(), 1, 0, 0); 475 propertyValue.getTimestamp(), 1, 0, 0);
475 event.floatValues[0] = (float) o; 476 event.floatValues[0] = (float) propertyValue.getValue();
476 } else if (o instanceof Integer) { 477 break;
477 event = new CarSensorEvent(propertyValue.getPropertyId(), 478 case VehiclePropertyType.INT32:
478 propertyValue.getTimestamp(), 0, 1, 0); 479 event = new CarSensorEvent(propertyValue.getPropertyId(),
479 event.intValues[0] = (int) o; 480 propertyValue.getTimestamp(), 0, 1, 0);
480 } else if (o instanceof Boolean) { 481 event.intValues[0] = (int) propertyValue.getValue();
481 event = new CarSensorEvent(propertyValue.getPropertyId(), 482 break;
482 propertyValue.getTimestamp(), 0, 1, 0); 483 case VehiclePropertyType.BOOLEAN:
483 event.intValues[0] = (boolean) o ? 1 : 0; 484 event = new CarSensorEvent(propertyValue.getPropertyId(),
484 } else if (o instanceof Long[]) { 485 propertyValue.getTimestamp(), 0, 1, 0);
485 Long[] value = (Long[]) o; 486 event.intValues[0] = (boolean) propertyValue.getValue() ? 1 : 0;
486 event = new CarSensorEvent(propertyValue.getPropertyId(), 487 break;
487 propertyValue.getTimestamp(), 0, 0, value.length); 488 case VehiclePropertyType.INT64_VEC:
488 for (int i = 0; i < value.length; i++) { 489 Object[] value = (Object[]) propertyValue.getValue();
489 event.longValues[i] = value[i]; 490 event = new CarSensorEvent(propertyValue.getPropertyId(),
490 } 491 propertyValue.getTimestamp(), 0, 0, value.length);
492 for (int i = 0; i < value.length; i++) {
493 event.longValues[i] = (Long) value[i];
494 }
495 break;
496 default:
497 Log.e(TAG, "unhandled VehiclePropertyType for propId="
498 + propertyValue.getPropertyId());
499 break;
491 } 500 }
492 return event; 501 return event;
493 } 502 }
diff --git a/car-lib/src/android/car/media/ICarVolumeCallback.aidl b/car-lib/src/android/car/media/ICarVolumeCallback.aidl
index 10a5ddc4..8540680d 100644
--- a/car-lib/src/android/car/media/ICarVolumeCallback.aidl
+++ b/car-lib/src/android/car/media/ICarVolumeCallback.aidl
@@ -27,12 +27,12 @@ oneway interface ICarVolumeCallback {
27 * The changed-to volume index is not included, the caller is encouraged to 27 * The changed-to volume index is not included, the caller is encouraged to
28 * get the current group volume index via CarAudioManager. 28 * get the current group volume index via CarAudioManager.
29 */ 29 */
30 void onGroupVolumeChanged(int groupId); 30 void onGroupVolumeChanged(int groupId, int flags);
31 31
32 /** 32 /**
33 * This is called whenever the master mute state is changed. 33 * This is called whenever the master mute state is changed.
34 * The changed-to master mute state is not included, the caller is encouraged to 34 * The changed-to master mute state is not included, the caller is encouraged to
35 * get the current master mute state via AudioManager. 35 * get the current master mute state via AudioManager.
36 */ 36 */
37 void onMasterMuteChanged(); 37 void onMasterMuteChanged(int flags);
38} 38}
diff --git a/car-support-lib/proguard-release.flags b/car-support-lib/proguard-release.flags
index 11d6d8d9..91cab7ea 100644
--- a/car-support-lib/proguard-release.flags
+++ b/car-support-lib/proguard-release.flags
@@ -7646,7 +7646,6 @@
7646 public abstract java.lang.String[] setPackagesSuspendedAsUser(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, java.lang.String, java.lang.String, int); 7646 public abstract java.lang.String[] setPackagesSuspendedAsUser(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, java.lang.String, java.lang.String, int);
7647 public abstract void setPermissionEnforced(java.lang.String, boolean); 7647 public abstract void setPermissionEnforced(java.lang.String, boolean);
7648 public abstract boolean setRequiredForSystemUser(java.lang.String, boolean); 7648 public abstract boolean setRequiredForSystemUser(java.lang.String, boolean);
7649 public abstract boolean setSystemAppInstallState(java.lang.String, boolean, int);
7650 public abstract void setUpdateAvailable(java.lang.String, boolean); 7649 public abstract void setUpdateAvailable(java.lang.String, boolean);
7651 public abstract boolean shouldShowRequestPermissionRationale(java.lang.String, java.lang.String, int); 7650 public abstract boolean shouldShowRequestPermissionRationale(java.lang.String, java.lang.String, int);
7652 public abstract void systemReady(); 7651 public abstract void systemReady();
@@ -8590,7 +8589,6 @@
8590 public static int MATCH_DISABLED_UNTIL_USED_COMPONENTS; 8589 public static int MATCH_DISABLED_UNTIL_USED_COMPONENTS;
8591 public static int MATCH_EXPLICITLY_VISIBLE_ONLY; 8590 public static int MATCH_EXPLICITLY_VISIBLE_ONLY;
8592 public static int MATCH_FACTORY_ONLY; 8591 public static int MATCH_FACTORY_ONLY;
8593 public static int MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS;
8594 public static int MATCH_INSTANT; 8592 public static int MATCH_INSTANT;
8595 public static int MATCH_KNOWN_PACKAGES; 8593 public static int MATCH_KNOWN_PACKAGES;
8596 public static int MATCH_STATIC_SHARED_LIBRARIES; 8594 public static int MATCH_STATIC_SHARED_LIBRARIES;
@@ -14031,7 +14029,6 @@
14031 public void dump(java.io.FileDescriptor, java.lang.String[]); 14029 public void dump(java.io.FileDescriptor, java.lang.String[]);
14032 protected void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); 14030 protected void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
14033 public void dumpAsync(java.io.FileDescriptor, java.lang.String[]); 14031 public void dumpAsync(java.io.FileDescriptor, java.lang.String[]);
14034 public static void dumpProxyDebugInfo();
14035 public static void enableTracing(); 14032 public static void enableTracing();
14036 public static void flushPendingCommands(); 14033 public static void flushPendingCommands();
14037 public static int getCallingPid(); 14034 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 3a21b1e8..cfd598a7 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.content.ServiceConnection;
22import android.os.Handler; 22import android.os.Handler;
23import android.os.IBinder; 23import android.os.IBinder;
24import android.support.car.content.pm.CarPackageManagerEmbedded; 24import android.support.car.content.pm.CarPackageManagerEmbedded;
25import android.support.car.hardware.CarSensorManagerEmbedded;
26import android.support.car.media.CarAudioManagerEmbedded; 25import android.support.car.media.CarAudioManagerEmbedded;
27import android.support.car.navigation.CarNavigationStatusManagerEmbedded; 26import android.support.car.navigation.CarNavigationStatusManagerEmbedded;
28 27
@@ -92,8 +91,6 @@ public class CarServiceLoaderEmbedded extends CarServiceLoader {
92 switch (serviceName) { 91 switch (serviceName) {
93 case Car.AUDIO_SERVICE: 92 case Car.AUDIO_SERVICE:
94 return new CarAudioManagerEmbedded(manager); 93 return new CarAudioManagerEmbedded(manager);
95 case Car.SENSOR_SERVICE:
96 return new CarSensorManagerEmbedded(manager, getContext());
97 case Car.INFO_SERVICE: 94 case Car.INFO_SERVICE:
98 return new CarInfoManagerEmbedded(manager); 95 return new CarInfoManagerEmbedded(manager);
99 case Car.APP_FOCUS_SERVICE: 96 case Car.APP_FOCUS_SERVICE:
diff --git a/service/AndroidManifest.xml b/service/AndroidManifest.xml
index 5477f1e0..5212448c 100644
--- a/service/AndroidManifest.xml
+++ b/service/AndroidManifest.xml
@@ -39,8 +39,7 @@
39 android:description="@string/car_permission_desc_energy" /> 39 android:description="@string/car_permission_desc_energy" />
40 <permission 40 <permission
41 android:name="android.car.permission.CAR_IDENTIFICATION" 41 android:name="android.car.permission.CAR_IDENTIFICATION"
42 android:permissionGroup="android.car.permission-group.CAR_MONITORING" 42 android:protectionLevel="system|signature"
43 android:protectionLevel="dangerous"
44 android:label="@string/car_permission_label_car_identification" 43 android:label="@string/car_permission_label_car_identification"
45 android:description="@string/car_permission_desc_car_identification" /> 44 android:description="@string/car_permission_desc_car_identification" />
46 <permission 45 <permission
diff --git a/service/src/com/android/car/CarAudioService.java b/service/src/com/android/car/CarAudioService.java
index 77f0f096..1b7ee67d 100644
--- a/service/src/com/android/car/CarAudioService.java
+++ b/service/src/com/android/car/CarAudioService.java
@@ -138,7 +138,7 @@ public class CarAudioService extends ICarAudio.Stub implements CarServiceBase {
138 + " suggested usage: " + AudioAttributes.usageToString(usage)); 138 + " suggested usage: " + AudioAttributes.usageToString(usage));
139 final int groupId = getVolumeGroupIdForUsage(usage); 139 final int groupId = getVolumeGroupIdForUsage(usage);
140 final int currentVolume = getGroupVolume(groupId); 140 final int currentVolume = getGroupVolume(groupId);
141 final int flags = AudioManager.FLAG_FROM_KEY; 141 final int flags = AudioManager.FLAG_FROM_KEY | AudioManager.FLAG_SHOW_UI;
142 switch (adjustment) { 142 switch (adjustment) {
143 case AudioManager.ADJUST_LOWER: 143 case AudioManager.ADJUST_LOWER:
144 if (currentVolume > getGroupMinVolume(groupId)) { 144 if (currentVolume > getGroupMinVolume(groupId)) {
@@ -152,15 +152,15 @@ public class CarAudioService extends ICarAudio.Stub implements CarServiceBase {
152 break; 152 break;
153 case AudioManager.ADJUST_MUTE: 153 case AudioManager.ADJUST_MUTE:
154 mAudioManager.setMasterMute(true, flags); 154 mAudioManager.setMasterMute(true, flags);
155 callbackMasterMuteChange(); 155 callbackMasterMuteChange(flags);
156 break; 156 break;
157 case AudioManager.ADJUST_UNMUTE: 157 case AudioManager.ADJUST_UNMUTE:
158 mAudioManager.setMasterMute(false, flags); 158 mAudioManager.setMasterMute(false, flags);
159 callbackMasterMuteChange(); 159 callbackMasterMuteChange(flags);
160 break; 160 break;
161 case AudioManager.ADJUST_TOGGLE_MUTE: 161 case AudioManager.ADJUST_TOGGLE_MUTE:
162 mAudioManager.setMasterMute(!mAudioManager.isMasterMute(), flags); 162 mAudioManager.setMasterMute(!mAudioManager.isMasterMute(), flags);
163 callbackMasterMuteChange(); 163 callbackMasterMuteChange(flags);
164 break; 164 break;
165 case AudioManager.ADJUST_SAME: 165 case AudioManager.ADJUST_SAME:
166 default: 166 default:
@@ -185,11 +185,11 @@ public class CarAudioService extends ICarAudio.Stub implements CarServiceBase {
185 if (groupId == -1) { 185 if (groupId == -1) {
186 Log.w(CarLog.TAG_AUDIO, "Unknown stream type: " + streamType); 186 Log.w(CarLog.TAG_AUDIO, "Unknown stream type: " + streamType);
187 } else { 187 } else {
188 callbackGroupVolumeChange(groupId); 188 callbackGroupVolumeChange(groupId, 0);
189 } 189 }
190 break; 190 break;
191 case AudioManager.MASTER_MUTE_CHANGED_ACTION: 191 case AudioManager.MASTER_MUTE_CHANGED_ACTION:
192 callbackMasterMuteChange(); 192 callbackMasterMuteChange(0);
193 break; 193 break;
194 } 194 }
195 } 195 }
@@ -260,7 +260,7 @@ public class CarAudioService extends ICarAudio.Stub implements CarServiceBase {
260 synchronized (mImplLock) { 260 synchronized (mImplLock) {
261 enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME); 261 enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
262 262
263 callbackGroupVolumeChange(groupId); 263 callbackGroupVolumeChange(groupId, flags);
264 // For legacy stream type based volume control 264 // For legacy stream type based volume control
265 if (!mUseDynamicRouting) { 265 if (!mUseDynamicRouting) {
266 mAudioManager.setStreamVolume(STREAM_TYPES[groupId], index, flags); 266 mAudioManager.setStreamVolume(STREAM_TYPES[groupId], index, flags);
@@ -272,22 +272,22 @@ public class CarAudioService extends ICarAudio.Stub implements CarServiceBase {
272 } 272 }
273 } 273 }
274 274
275 private void callbackGroupVolumeChange(int groupId) { 275 private void callbackGroupVolumeChange(int groupId, int flags) {
276 for (BinderInterfaceContainer.BinderInterface<ICarVolumeCallback> callback : 276 for (BinderInterfaceContainer.BinderInterface<ICarVolumeCallback> callback :
277 mVolumeCallbackContainer.getInterfaces()) { 277 mVolumeCallbackContainer.getInterfaces()) {
278 try { 278 try {
279 callback.binderInterface.onGroupVolumeChanged(groupId); 279 callback.binderInterface.onGroupVolumeChanged(groupId, flags);
280 } catch (RemoteException e) { 280 } catch (RemoteException e) {
281 Log.e(CarLog.TAG_AUDIO, "Failed to callback onGroupVolumeChanged", e); 281 Log.e(CarLog.TAG_AUDIO, "Failed to callback onGroupVolumeChanged", e);
282 } 282 }
283 } 283 }
284 } 284 }
285 285
286 private void callbackMasterMuteChange() { 286 private void callbackMasterMuteChange(int flags) {
287 for (BinderInterfaceContainer.BinderInterface<ICarVolumeCallback> callback : 287 for (BinderInterfaceContainer.BinderInterface<ICarVolumeCallback> callback :
288 mVolumeCallbackContainer.getInterfaces()) { 288 mVolumeCallbackContainer.getInterfaces()) {
289 try { 289 try {
290 callback.binderInterface.onMasterMuteChanged(); 290 callback.binderInterface.onMasterMuteChanged(flags);
291 } catch (RemoteException e) { 291 } catch (RemoteException e) {
292 Log.e(CarLog.TAG_AUDIO, "Failed to callback onMasterMuteChanged", e); 292 Log.e(CarLog.TAG_AUDIO, "Failed to callback onMasterMuteChanged", e);
293 } 293 }
diff --git a/service/src/com/android/car/hal/CarPropertyUtils.java b/service/src/com/android/car/hal/CarPropertyUtils.java
index cbca08b3..d9151e20 100644
--- a/service/src/com/android/car/hal/CarPropertyUtils.java
+++ b/service/src/com/android/car/hal/CarPropertyUtils.java
@@ -53,9 +53,8 @@ import java.util.List;
53 v.int32Values.get(0) == 1); 53 v.int32Values.get(0) == 1);
54 } else if (Boolean[].class == clazz) { 54 } else if (Boolean[].class == clazz) {
55 Boolean[] values = new Boolean[v.int32Values.size()]; 55 Boolean[] values = new Boolean[v.int32Values.size()];
56 int i = 0; 56 for (int i = 0; i < values.length; i++) {
57 for (int val : v.int32Values) { 57 values[i] = v.int32Values.get(i) == 1;
58 values[i] = val == 1;
59 } 58 }
60 return new CarPropertyValue<>(propertyId, areaId, status, timestamp, values); 59 return new CarPropertyValue<>(propertyId, areaId, status, timestamp, values);
61 } else if (String.class == clazz) { 60 } else if (String.class == clazz) {
@@ -63,6 +62,12 @@ import java.util.List;
63 } else if (byte[].class == clazz) { 62 } else if (byte[].class == clazz) {
64 byte[] halData = toByteArray(v.bytes); 63 byte[] halData = toByteArray(v.bytes);
65 return new CarPropertyValue<>(propertyId, areaId, status, timestamp, halData); 64 return new CarPropertyValue<>(propertyId, areaId, status, timestamp, halData);
65 } else if (Long[].class == clazz) {
66 Long[] values = new Long[v.int64Values.size()];
67 for (int i = 0; i < values.length; i++) {
68 values[i] = v.int64Values.get(i);
69 }
70 return new CarPropertyValue<>(propertyId, areaId, status, timestamp, values);
66 } else /* All list properties */ { 71 } else /* All list properties */ {
67 Object[] values = getRawValueList(clazz, v).toArray(); 72 Object[] values = getRawValueList(clazz, v).toArray();
68 return new CarPropertyValue<>(propertyId, areaId, status, timestamp, 73 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 0a00c660..7837f2e7 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 @@
17package com.google.android.car.kitchensink; 17package com.google.android.car.kitchensink;
18 18
19 19
20import android.car.hardware.CarSensorManager;
20import android.car.hardware.hvac.CarHvacManager; 21import android.car.hardware.hvac.CarHvacManager;
21import android.car.hardware.power.CarPowerManager; 22import android.car.hardware.power.CarPowerManager;
22import android.car.hardware.property.CarPropertyManager; 23import android.car.hardware.property.CarPropertyManager;
@@ -27,7 +28,6 @@ import android.support.car.Car;
27import android.support.car.CarAppFocusManager; 28import android.support.car.CarAppFocusManager;
28import android.support.car.CarConnectionCallback; 29import android.support.car.CarConnectionCallback;
29import android.support.car.CarNotConnectedException; 30import android.support.car.CarNotConnectedException;
30import android.support.car.hardware.CarSensorManager;
31import android.support.v4.app.Fragment; 31import android.support.v4.app.Fragment;
32import android.util.Log; 32import android.util.Log;
33 33
@@ -181,17 +181,9 @@ public class KitchenSinkActivity extends CarDrawerActivity {
181 private CarHvacManager mHvacManager; 181 private CarHvacManager mHvacManager;
182 private CarPowerManager mPowerManager; 182 private CarPowerManager mPowerManager;
183 private CarPropertyManager mPropertyManager; 183 private CarPropertyManager mPropertyManager;
184 private CarSensorManager mCarSensorManager; 184 private CarSensorManager mSensorManager;
185 private CarAppFocusManager mCarAppFocusManager; 185 private CarAppFocusManager mCarAppFocusManager;
186 186
187 private final CarSensorManager.OnSensorChangedListener mListener = (manager, event) -> {
188 switch (event.sensorType) {
189 case CarSensorManager.SENSOR_TYPE_DRIVING_STATUS:
190 Log.d(TAG, "driving status:" + event.intValues[0]);
191 break;
192 }
193 };
194
195 public CarHvacManager getHvacManager() { 187 public CarHvacManager getHvacManager() {
196 return mHvacManager; 188 return mHvacManager;
197 } 189 }
@@ -209,6 +201,10 @@ public class KitchenSinkActivity extends CarDrawerActivity {
209 return new DrawerAdapter(); 201 return new DrawerAdapter();
210 } 202 }
211 203
204 public CarSensorManager getSensorManager() {
205 return mSensorManager;
206 }
207
212 @Override 208 @Override
213 protected void onCreate(Bundle savedInstanceState) { 209 protected void onCreate(Bundle savedInstanceState) {
214 super.onCreate(savedInstanceState); 210 super.onCreate(savedInstanceState);
@@ -255,9 +251,6 @@ public class KitchenSinkActivity extends CarDrawerActivity {
255 @Override 251 @Override
256 protected void onDestroy() { 252 protected void onDestroy() {
257 super.onDestroy(); 253 super.onDestroy();
258 if (mCarSensorManager != null) {
259 mCarSensorManager.removeListener(mListener);
260 }
261 if (mCarApi != null) { 254 if (mCarApi != null) {
262 mCarApi.disconnect(); 255 mCarApi.disconnect();
263 } 256 }
@@ -281,10 +274,8 @@ public class KitchenSinkActivity extends CarDrawerActivity {
281 android.car.Car.POWER_SERVICE); 274 android.car.Car.POWER_SERVICE);
282 mPropertyManager = (CarPropertyManager) mCarApi.getCarManager( 275 mPropertyManager = (CarPropertyManager) mCarApi.getCarManager(
283 android.car.Car.PROPERTY_SERVICE); 276 android.car.Car.PROPERTY_SERVICE);
284 mCarSensorManager = (CarSensorManager) mCarApi.getCarManager(Car.SENSOR_SERVICE); 277 mSensorManager = (CarSensorManager) mCarApi.getCarManager(
285 mCarSensorManager.addListener(mListener, 278 android.car.Car.SENSOR_SERVICE);
286 CarSensorManager.SENSOR_TYPE_DRIVING_STATUS,
287 CarSensorManager.SENSOR_RATE_NORMAL);
288 mCarAppFocusManager = 279 mCarAppFocusManager =
289 (CarAppFocusManager) mCarApi.getCarManager(Car.APP_FOCUS_SERVICE); 280 (CarAppFocusManager) mCarApi.getCarManager(Car.APP_FOCUS_SERVICE);
290 } catch (CarNotConnectedException e) { 281 } 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 9c84f6eb..abc2c10b 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 @@
16 16
17package com.google.android.car.kitchensink.sensor; 17package com.google.android.car.kitchensink.sensor;
18 18
19import static java.lang.Integer.toHexString;
20
19import android.Manifest; 21import android.Manifest;
20import android.annotation.Nullable; 22import android.annotation.Nullable;
21import android.car.Car; 23import android.car.Car;
24import android.car.CarNotConnectedException;
25import android.car.hardware.CarSensorConfig;
26import android.car.hardware.CarSensorEvent;
27import android.car.hardware.CarSensorManager;
22import android.content.pm.PackageManager; 28import android.content.pm.PackageManager;
23import android.location.Location;
24import android.os.Bundle; 29import android.os.Bundle;
25import android.os.Handler; 30import android.os.Handler;
26import android.support.car.CarNotConnectedException;
27import android.support.car.hardware.CarSensorConfig;
28import android.support.car.hardware.CarSensorEvent;
29import android.support.car.hardware.CarSensorManager;
30import android.support.v4.app.Fragment; 31import android.support.v4.app.Fragment;
31import android.text.TextUtils; 32import android.text.TextUtils;
32import android.util.Log; 33import android.util.Log;
@@ -51,7 +52,7 @@ import java.util.concurrent.ConcurrentHashMap;
51public class SensorsTestFragment extends Fragment { 52public class SensorsTestFragment extends Fragment {
52 private static final String TAG = "CAR.SENSOR.KS"; 53 private static final String TAG = "CAR.SENSOR.KS";
53 private static final boolean DBG = true; 54 private static final boolean DBG = true;
54 private static final boolean DBG_VERBOSE = false; 55 private static final boolean DBG_VERBOSE = true;
55 private static final int KS_PERMISSIONS_REQUEST = 1; 56 private static final int KS_PERMISSIONS_REQUEST = 1;
56 57
57 private final static String[] REQUIRED_PERMISSIONS = new String[]{ 58 private final static String[] REQUIRED_PERMISSIONS = new String[]{
@@ -66,7 +67,7 @@ public class SensorsTestFragment extends Fragment {
66 private final CarSensorManager.OnSensorChangedListener mOnSensorChangedListener = 67 private final CarSensorManager.OnSensorChangedListener mOnSensorChangedListener =
67 new CarSensorManager.OnSensorChangedListener() { 68 new CarSensorManager.OnSensorChangedListener() {
68 @Override 69 @Override
69 public void onSensorChanged(CarSensorManager manager, CarSensorEvent event) { 70 public void onSensorChanged(CarSensorEvent event) {
70 if (DBG_VERBOSE) { 71 if (DBG_VERBOSE) {
71 Log.v(TAG, "New car sensor event: " + event); 72 Log.v(TAG, "New car sensor event: " + event);
72 } 73 }
@@ -115,26 +116,23 @@ public class SensorsTestFragment extends Fragment {
115 public void onPause() { 116 public void onPause() {
116 super.onPause(); 117 super.onPause();
117 if (mSensorManager != null) { 118 if (mSensorManager != null) {
118 mSensorManager.removeListener(mOnSensorChangedListener); 119 mSensorManager.unregisterListener(mOnSensorChangedListener);
119 } 120 }
120 } 121 }
121 122
122 private void initSensors() { 123 private void initSensors() {
123 try { 124 try {
124 mSensorManager = (CarSensorManager) 125 mSensorManager =
125 mActivity.getCar().getCarManager(Car.SENSOR_SERVICE); 126 (CarSensorManager) ((KitchenSinkActivity) getActivity()).getSensorManager();
126 supportedSensors = mSensorManager.getSupportedSensors(); 127 supportedSensors = mSensorManager.getSupportedSensors();
127 for (Integer sensor : supportedSensors) { 128 for (Integer sensor : supportedSensors) {
128 if ((sensor == CarSensorManager.SENSOR_TYPE_LOCATION 129 mSensorManager.registerListener(mOnSensorChangedListener, sensor,
129 || sensor == CarSensorManager.SENSOR_TYPE_GPS_SATELLITE)
130 && !mActivePermissions.contains(Manifest.permission.ACCESS_FINE_LOCATION)) {
131 continue;
132 }
133 mSensorManager.addListener(mOnSensorChangedListener, sensor,
134 CarSensorManager.SENSOR_RATE_NORMAL); 130 CarSensorManager.SENSOR_RATE_NORMAL);
135 } 131 }
136 } catch (CarNotConnectedException e) { 132 } catch (CarNotConnectedException e) {
137 Log.e(TAG, "Car not connected or not supported", e); 133 Log.e(TAG, "Car not connected or not supported", e);
134 } catch (Exception e) {
135 Log.e(TAG, "initSensors() exception caught: ", e);
138 } 136 }
139 } 137 }
140 138
@@ -188,23 +186,20 @@ public class SensorsTestFragment extends Fragment {
188 for (Integer i : supportedSensors) { 186 for (Integer i : supportedSensors) {
189 CarSensorEvent event = mEventMap.get(i); 187 CarSensorEvent event = mEventMap.get(i);
190 switch (i) { 188 switch (i) {
191 case CarSensorManager.SENSOR_TYPE_COMPASS:
192 summary.add(getCompassString(event));
193 break;
194 case CarSensorManager.SENSOR_TYPE_CAR_SPEED: 189 case CarSensorManager.SENSOR_TYPE_CAR_SPEED:
195 summary.add(getContext().getString(R.string.sensor_speed, 190 summary.add(getContext().getString(R.string.sensor_speed,
196 getTimestamp(event), 191 getTimestamp(event),
197 event == null ? mNaString : event.getCarSpeedData().carSpeed)); 192 event == null ? mNaString : event.getCarSpeedData(null).carSpeed));
198 break; 193 break;
199 case CarSensorManager.SENSOR_TYPE_RPM: 194 case CarSensorManager.SENSOR_TYPE_RPM:
200 summary.add(getContext().getString(R.string.sensor_rpm, 195 summary.add(getContext().getString(R.string.sensor_rpm,
201 getTimestamp(event), 196 getTimestamp(event),
202 event == null ? mNaString : event.getRpmData().rpm)); 197 event == null ? mNaString : event.getRpmData(null).rpm));
203 break; 198 break;
204 case CarSensorManager.SENSOR_TYPE_ODOMETER: 199 case CarSensorManager.SENSOR_TYPE_ODOMETER:
205 summary.add(getContext().getString(R.string.sensor_odometer, 200 summary.add(getContext().getString(R.string.sensor_odometer,
206 getTimestamp(event), 201 getTimestamp(event),
207 event == null ? mNaString : event.getOdometerData().kms)); 202 event == null ? mNaString : event.getOdometerData(null).kms));
208 break; 203 break;
209 case CarSensorManager.SENSOR_TYPE_FUEL_LEVEL: 204 case CarSensorManager.SENSOR_TYPE_FUEL_LEVEL:
210 summary.add(getFuelLevel(event)); 205 summary.add(getFuelLevel(event));
@@ -216,38 +211,23 @@ public class SensorsTestFragment extends Fragment {
216 summary.add(getContext().getString(R.string.sensor_parking_brake, 211 summary.add(getContext().getString(R.string.sensor_parking_brake,
217 getTimestamp(event), 212 getTimestamp(event),
218 event == null ? mNaString : 213 event == null ? mNaString :
219 event.getParkingBrakeData().isEngaged)); 214 event.getParkingBrakeData(null).isEngaged));
220 break; 215 break;
221 case CarSensorManager.SENSOR_TYPE_GEAR: 216 case CarSensorManager.SENSOR_TYPE_GEAR:
222 summary.add(getContext().getString(R.string.sensor_gear, 217 summary.add(getContext().getString(R.string.sensor_gear,
223 getTimestamp(event), 218 getTimestamp(event),
224 event == null ? mNaString : event.getGearData().gear)); 219 event == null ? mNaString : event.getGearData(null).gear));
225 break; 220 break;
226 case CarSensorManager.SENSOR_TYPE_NIGHT: 221 case CarSensorManager.SENSOR_TYPE_NIGHT:
227 summary.add(getContext().getString(R.string.sensor_night, 222 summary.add(getContext().getString(R.string.sensor_night,
228 getTimestamp(event), 223 getTimestamp(event),
229 event == null ? mNaString : event.getNightData().isNightMode)); 224 event == null ? mNaString : event.getNightData(null).isNightMode));
230 break;
231 case CarSensorManager.SENSOR_TYPE_LOCATION:
232 summary.add(getLocationString(event));
233 break;
234 case CarSensorManager.SENSOR_TYPE_DRIVING_STATUS:
235 String drivingStatus = mNaString;
236 String binDrivingStatus = mNaString;
237 if (event != null) {
238 CarSensorEvent.DrivingStatusData drivingStatusData =
239 event.getDrivingStatusData();
240 drivingStatus = String.valueOf(drivingStatusData.status);
241 binDrivingStatus = Integer.toBinaryString(drivingStatusData.status);
242 }
243 summary.add(getContext().getString(R.string.sensor_driving_status,
244 getTimestamp(event), drivingStatus, binDrivingStatus));
245 break; 225 break;
246 case CarSensorManager.SENSOR_TYPE_ENVIRONMENT: 226 case CarSensorManager.SENSOR_TYPE_ENVIRONMENT:
247 String temperature = mNaString; 227 String temperature = mNaString;
248 String pressure = mNaString; 228 String pressure = mNaString;
249 if (event != null) { 229 if (event != null) {
250 CarSensorEvent.EnvironmentData env = event.getEnvironmentData(); 230 CarSensorEvent.EnvironmentData env = event.getEnvironmentData(null);
251 temperature = Float.isNaN(env.temperature) ? temperature : 231 temperature = Float.isNaN(env.temperature) ? temperature :
252 String.valueOf(env.temperature); 232 String.valueOf(env.temperature);
253 pressure = Float.isNaN(env.pressure) ? pressure : 233 pressure = Float.isNaN(env.pressure) ? pressure :
@@ -256,19 +236,10 @@ public class SensorsTestFragment extends Fragment {
256 summary.add(getContext().getString(R.string.sensor_environment, 236 summary.add(getContext().getString(R.string.sensor_environment,
257 getTimestamp(event), temperature, pressure)); 237 getTimestamp(event), temperature, pressure));
258 break; 238 break;
259 case CarSensorManager.SENSOR_TYPE_ACCELEROMETER:
260 summary.add(getAccelerometerString(event));
261 break;
262 case CarSensorManager.SENSOR_TYPE_GPS_SATELLITE:
263 summary.add(getGpsSatelliteString(event));
264 break;
265 case CarSensorManager.SENSOR_TYPE_GYROSCOPE:
266 summary.add(getGyroscopeString(event));
267 break;
268 case CarSensorManager.SENSOR_TYPE_WHEEL_TICK_DISTANCE: 239 case CarSensorManager.SENSOR_TYPE_WHEEL_TICK_DISTANCE:
269 if(event != null) { 240 if(event != null) {
270 CarSensorEvent.CarWheelTickDistanceData d = 241 CarSensorEvent.CarWheelTickDistanceData d =
271 event.getCarWheelTickDistanceData(); 242 event.getCarWheelTickDistanceData(null);
272 summary.add(getContext().getString(R.string.sensor_wheel_ticks, 243 summary.add(getContext().getString(R.string.sensor_wheel_ticks,
273 getTimestamp(event), d.sensorResetCount, d.frontLeftWheelDistanceMm, 244 getTimestamp(event), d.sensorResetCount, d.frontLeftWheelDistanceMm,
274 d.frontRightWheelDistanceMm, d.rearLeftWheelDistanceMm, 245 d.frontRightWheelDistanceMm, d.rearLeftWheelDistanceMm,
@@ -295,14 +266,15 @@ public class SensorsTestFragment extends Fragment {
295 case CarSensorManager.SENSOR_TYPE_ABS_ACTIVE: 266 case CarSensorManager.SENSOR_TYPE_ABS_ACTIVE:
296 summary.add(getContext().getString(R.string.sensor_abs_is_active, 267 summary.add(getContext().getString(R.string.sensor_abs_is_active,
297 getTimestamp(event), event == null ? mNaString : 268 getTimestamp(event), event == null ? mNaString :
298 event.getCarAbsActiveData().absIsActive)); 269 event.getCarAbsActiveData(null).absIsActive));
299 break; 270 break;
300 271
301 case CarSensorManager.SENSOR_TYPE_TRACTION_CONTROL_ACTIVE: 272 case CarSensorManager.SENSOR_TYPE_TRACTION_CONTROL_ACTIVE:
302 summary.add( 273 summary.add(
303 getContext().getString(R.string.sensor_traction_control_is_active, 274 getContext().getString(R.string.sensor_traction_control_is_active,
304 getTimestamp(event), event == null ? mNaString : 275 getTimestamp(event), event == null ? mNaString :
305 event.getCarTractionControlActiveData().tractionControlIsActive)); 276 event.getCarTractionControlActiveData(null)
277 .tractionControlIsActive));
306 break; 278 break;
307 case CarSensorManager.SENSOR_TYPE_EV_BATTERY_LEVEL: 279 case CarSensorManager.SENSOR_TYPE_EV_BATTERY_LEVEL:
308 summary.add(getEvBatteryLevel(event)); 280 summary.add(getEvBatteryLevel(event));
@@ -318,7 +290,7 @@ public class SensorsTestFragment extends Fragment {
318 break; 290 break;
319 default: 291 default:
320 // Should never happen. 292 // Should never happen.
321 Log.w(TAG, "Unrecognized event type: " + i); 293 Log.w(TAG, "Unrecognized event type: " + toHexString(i));
322 } 294 }
323 } 295 }
324 summaryString = TextUtils.join("\n", summary); 296 summaryString = TextUtils.join("\n", summary);
@@ -338,93 +310,10 @@ public class SensorsTestFragment extends Fragment {
338 return mDateFormat.format(new Date(event.timestamp / (1000L * 1000L))); 310 return mDateFormat.format(new Date(event.timestamp / (1000L * 1000L)));
339 } 311 }
340 312
341 private String getCompassString(CarSensorEvent event) {
342 String bear = mNaString;
343 String pitch = mNaString;
344 String roll = mNaString;
345 if (event != null) {
346 CarSensorEvent.CompassData compass = event.getCompassData();
347 bear = Float.isNaN(compass.bearing) ? bear : String.valueOf(compass.bearing);
348 pitch = Float.isNaN(compass.pitch) ? pitch : String.valueOf(compass.pitch);
349 roll = Float.isNaN(compass.roll) ? roll : String.valueOf(compass.roll);
350 }
351 return getContext().getString(R.string.sensor_compass,
352 getTimestamp(event), bear, pitch, roll);
353 }
354
355 private String getGyroscopeString(CarSensorEvent event) {
356 String x = mNaString;
357 String y = mNaString;
358 String z = mNaString;
359 if (event != null) {
360 CarSensorEvent.GyroscopeData gyro = event.getGyroscopeData();
361 x = Float.isNaN(gyro.x) ? x : String.valueOf(gyro.x);
362 y = Float.isNaN(gyro.y) ? y : String.valueOf(gyro.y);
363 z = Float.isNaN(gyro.z) ? z : String.valueOf(gyro.z);
364 }
365 return getContext().getString(R.string.sensor_gyroscope,
366 getTimestamp(event), x, y, z);
367 }
368
369 private String getAccelerometerString(CarSensorEvent event) {
370 String x = mNaString;
371 String y = mNaString;
372 String z = mNaString;
373 if (event != null) {
374 CarSensorEvent.AccelerometerData gyro = event.getAccelerometerData();
375 x = Float.isNaN(gyro.x) ? x : String.valueOf(gyro.x);
376 y = Float.isNaN(gyro.y) ? y : String.valueOf(gyro.y);
377 z = Float.isNaN(gyro.z) ? z : String.valueOf(gyro.z);
378 }
379 return getContext().getString(R.string.sensor_accelerometer,
380 getTimestamp(event), x, y, z);
381 }
382
383 private String getLocationString(CarSensorEvent event) {
384 String lat = mNaString;
385 String lon = mNaString;
386 String accuracy = mNaString;
387 String alt = mNaString;
388 String speed = mNaString;
389 String bearing = mNaString;
390 if (event != null) {
391 Location location = event.getLocation(null);
392 lat = String.valueOf(location.getLatitude());
393 lon = String.valueOf(location.getLongitude());
394 accuracy = location.hasAccuracy() ? String.valueOf(location.getAccuracy()) : accuracy;
395 alt = location.hasAltitude() ? String.valueOf(location.getAltitude()) : alt;
396 speed = location.hasSpeed() ? String.valueOf(location.getSpeed()) : speed;
397 bearing = location.hasBearing() ? String.valueOf(location.getBearing()) : bearing;
398 }
399 return getContext().getString(R.string.sensor_location,
400 getTimestamp(event), lat, lon, accuracy, alt, speed, bearing);
401 }
402
403 private String getGpsSatelliteString(CarSensorEvent event) {
404 String inUse = mNaString;
405 String inView = mNaString;
406 String perSattelite = "";
407 if (event != null) {
408 CarSensorEvent.GpsSatelliteData gpsData = event.getGpsSatelliteData(true);
409 inUse = gpsData.numberInUse != -1 ? String.valueOf(gpsData.numberInUse) : inUse;
410 inView = gpsData.numberInView != -1 ? String.valueOf(gpsData.numberInView) : inView;
411 List<String> perSatteliteList = new ArrayList<>();
412 int num = gpsData.usedInFix.length;
413 for (int i=0; i<num; i++) {
414 perSatteliteList.add(getContext().getString(R.string.sensor_single_gps_satellite,
415 i+1, gpsData.usedInFix[i], gpsData.prn[i], gpsData.snr[i],
416 gpsData.azimuth[i], gpsData.elevation[i]));
417 }
418 perSattelite = TextUtils.join(", ", perSatteliteList);
419 }
420 return getContext().getString(R.string.sensor_gps,
421 getTimestamp(event), inView, inUse, perSattelite);
422 }
423
424 private String getFuelLevel(CarSensorEvent event) { 313 private String getFuelLevel(CarSensorEvent event) {
425 String fuelLevel = mNaString; 314 String fuelLevel = mNaString;
426 if(event != null) { 315 if(event != null) {
427 fuelLevel = String.valueOf(event.getFuelLevelData().level); 316 fuelLevel = String.valueOf(event.getFuelLevelData(null).level);
428 } 317 }
429 return getContext().getString(R.string.sensor_fuel_level, getTimestamp(event), fuelLevel); 318 return getContext().getString(R.string.sensor_fuel_level, getTimestamp(event), fuelLevel);
430 } 319 }
@@ -432,7 +321,7 @@ public class SensorsTestFragment extends Fragment {
432 private String getFuelDoorOpen(CarSensorEvent event) { 321 private String getFuelDoorOpen(CarSensorEvent event) {
433 String fuelDoorOpen = mNaString; 322 String fuelDoorOpen = mNaString;
434 if(event != null) { 323 if(event != null) {
435 fuelDoorOpen = String.valueOf(event.getCarFuelDoorOpenData().fuelDoorIsOpen); 324 fuelDoorOpen = String.valueOf(event.getCarFuelDoorOpenData(null).fuelDoorIsOpen);
436 } 325 }
437 return getContext().getString(R.string.sensor_fuel_door_open, getTimestamp(event), 326 return getContext().getString(R.string.sensor_fuel_door_open, getTimestamp(event),
438 fuelDoorOpen); 327 fuelDoorOpen);
@@ -441,7 +330,7 @@ public class SensorsTestFragment extends Fragment {
441 private String getEvBatteryLevel(CarSensorEvent event) { 330 private String getEvBatteryLevel(CarSensorEvent event) {
442 String evBatteryLevel = mNaString; 331 String evBatteryLevel = mNaString;
443 if(event != null) { 332 if(event != null) {
444 evBatteryLevel = String.valueOf(event.getCarEvBatteryLevelData().evBatteryLevel); 333 evBatteryLevel = String.valueOf(event.getCarEvBatteryLevelData(null).evBatteryLevel);
445 } 334 }
446 return getContext().getString(R.string.sensor_ev_battery_level, getTimestamp(event), 335 return getContext().getString(R.string.sensor_ev_battery_level, getTimestamp(event),
447 evBatteryLevel); 336 evBatteryLevel);
@@ -451,7 +340,7 @@ public class SensorsTestFragment extends Fragment {
451 String evChargePortOpen = mNaString; 340 String evChargePortOpen = mNaString;
452 if(event != null) { 341 if(event != null) {
453 evChargePortOpen = String.valueOf( 342 evChargePortOpen = String.valueOf(
454 event.getCarEvChargePortOpenData().evChargePortIsOpen); 343 event.getCarEvChargePortOpenData(null).evChargePortIsOpen);
455 } 344 }
456 return getContext().getString(R.string.sensor_ev_charge_port_is_open, getTimestamp(event), 345 return getContext().getString(R.string.sensor_ev_charge_port_is_open, getTimestamp(event),
457 evChargePortOpen); 346 evChargePortOpen);
@@ -461,7 +350,7 @@ public class SensorsTestFragment extends Fragment {
461 String evChargePortConnected = mNaString; 350 String evChargePortConnected = mNaString;
462 if(event != null) { 351 if(event != null) {
463 evChargePortConnected = String.valueOf( 352 evChargePortConnected = String.valueOf(
464 event.getCarEvChargePortConnectedData().evChargePortIsConnected); 353 event.getCarEvChargePortConnectedData(null).evChargePortIsConnected);
465 } 354 }
466 return getContext().getString(R.string.sensor_ev_charge_port_is_connected, 355 return getContext().getString(R.string.sensor_ev_charge_port_is_connected,
467 getTimestamp(event), evChargePortConnected); 356 getTimestamp(event), evChargePortConnected);
@@ -470,7 +359,7 @@ public class SensorsTestFragment extends Fragment {
470 private String getEvChargeRate(CarSensorEvent event) { 359 private String getEvChargeRate(CarSensorEvent event) {
471 String evChargeRate = mNaString; 360 String evChargeRate = mNaString;
472 if(event != null) { 361 if(event != null) {
473 evChargeRate = String.valueOf(event.getCarEvBatteryChargeRateData().evChargeRate); 362 evChargeRate = String.valueOf(event.getCarEvBatteryChargeRateData(null).evChargeRate);
474 } 363 }
475 return getContext().getString(R.string.sensor_ev_charge_rate, getTimestamp(event), 364 return getContext().getString(R.string.sensor_ev_charge_rate, getTimestamp(event),
476 evChargeRate); 365 evChargeRate);