aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2018-06-08 07:21:08 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2018-06-08 07:21:08 +0000
commitf02b56678700a4035d0ad8882f7d20371bb96ee2 (patch)
tree59d7dd8b4d27bee6f90ffae1f1bbba0804f5a4ae
parent577cf630e511be2bb4d9c262c238587a4300af02 (diff)
parent280eba505892cb722078f0526c10b632d1f994cf (diff)
downloadCar-pie-release-2.tar.gz
Snap for 4829593 from 280eba505892cb722078f0526c10b632d1f994cf to pi-releaseandroid-wear-9.0.0_r9android-wear-9.0.0_r8android-wear-9.0.0_r7android-wear-9.0.0_r6android-wear-9.0.0_r5android-wear-9.0.0_r4android-wear-9.0.0_r34android-wear-9.0.0_r33android-wear-9.0.0_r32android-wear-9.0.0_r31android-wear-9.0.0_r30android-wear-9.0.0_r3android-wear-9.0.0_r29android-wear-9.0.0_r28android-wear-9.0.0_r27android-wear-9.0.0_r26android-wear-9.0.0_r25android-wear-9.0.0_r24android-wear-9.0.0_r23android-wear-9.0.0_r22android-wear-9.0.0_r21android-wear-9.0.0_r20android-wear-9.0.0_r2android-wear-9.0.0_r19android-wear-9.0.0_r18android-wear-9.0.0_r17android-wear-9.0.0_r16android-wear-9.0.0_r15android-wear-9.0.0_r14android-wear-9.0.0_r13android-wear-9.0.0_r12android-wear-9.0.0_r11android-wear-9.0.0_r10android-wear-9.0.0_r1android-vts-9.0_r9android-vts-9.0_r8android-vts-9.0_r7android-vts-9.0_r6android-vts-9.0_r5android-vts-9.0_r4android-vts-9.0_r19android-vts-9.0_r18android-vts-9.0_r17android-vts-9.0_r16android-vts-9.0_r15android-vts-9.0_r14android-vts-9.0_r13android-vts-9.0_r12android-vts-9.0_r11android-vts-9.0_r10android-security-9.0.0_r76android-security-9.0.0_r75android-security-9.0.0_r74android-security-9.0.0_r73android-security-9.0.0_r72android-security-9.0.0_r71android-security-9.0.0_r70android-security-9.0.0_r69android-security-9.0.0_r68android-security-9.0.0_r67android-security-9.0.0_r66android-security-9.0.0_r65android-security-9.0.0_r64android-security-9.0.0_r63android-security-9.0.0_r62android-cts-9.0_r9android-cts-9.0_r8android-cts-9.0_r7android-cts-9.0_r6android-cts-9.0_r5android-cts-9.0_r4android-cts-9.0_r3android-cts-9.0_r20android-cts-9.0_r2android-cts-9.0_r19android-cts-9.0_r18android-cts-9.0_r17android-cts-9.0_r16android-cts-9.0_r15android-cts-9.0_r14android-cts-9.0_r13android-cts-9.0_r12android-cts-9.0_r11android-cts-9.0_r10android-cts-9.0_r1android-9.0.0_r9android-9.0.0_r8android-9.0.0_r7android-9.0.0_r61android-9.0.0_r60android-9.0.0_r6android-9.0.0_r59android-9.0.0_r58android-9.0.0_r57android-9.0.0_r56android-9.0.0_r55android-9.0.0_r54android-9.0.0_r53android-9.0.0_r52android-9.0.0_r51android-9.0.0_r50android-9.0.0_r5android-9.0.0_r49android-9.0.0_r48android-9.0.0_r3android-9.0.0_r2android-9.0.0_r18android-9.0.0_r17android-9.0.0_r10android-9.0.0_r1security-pi-releasepie-vts-releasepie-security-releasepie-s2-releasepie-release-2pie-releasepie-r2-s2-releasepie-r2-s1-releasepie-r2-releasepie-cts-release
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 0000000000..b236d2d643
--- /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 f6cc8dfdbf..253660462f 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;
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 @@ public final class CarSensorManager implements CarManagerBase {
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 10a5ddc42b..8540680d0e 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 {
* 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 11d6d8d9ec..91cab7ea24 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 3a21b1e8c5..cfd598a7ef 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;
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 @@ public class CarServiceLoaderEmbedded extends CarServiceLoader {
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 5477f1e04c..5212448ceb 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 77f0f09606..1b7ee67dcd 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 {
+ " 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 @@ public class CarAudioService extends ICarAudio.Stub implements CarServiceBase {
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 @@ public class CarAudioService extends ICarAudio.Stub implements CarServiceBase {
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 @@ public class CarAudioService extends ICarAudio.Stub implements CarServiceBase {
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 @@ public class CarAudioService extends ICarAudio.Stub implements CarServiceBase {
}
}
- 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 cbca08b335..d9151e202a 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;
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 @@ import java.util.List;
} 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 0a00c66015..7837f2e775 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.Car;
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 @@ public class KitchenSinkActivity extends CarDrawerActivity {
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 @@ public class KitchenSinkActivity extends CarDrawerActivity {
return new DrawerAdapter();
}
+ public CarSensorManager getSensorManager() {
+ return mSensorManager;
+ }
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -255,9 +251,6 @@ public class KitchenSinkActivity extends CarDrawerActivity {
@Override
protected void onDestroy() {
super.onDestroy();
- if (mCarSensorManager != null) {
- mCarSensorManager.removeListener(mListener);
- }
if (mCarApi != null) {
mCarApi.disconnect();
}
@@ -281,10 +274,8 @@ public class KitchenSinkActivity extends CarDrawerActivity {
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 9c84f6eb6b..abc2c10b49 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 @@ import java.util.concurrent.ConcurrentHashMap;
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 @@ public class SensorsTestFragment extends Fragment {
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 class SensorsTestFragment extends Fragment {
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 @@ public class SensorsTestFragment extends Fragment {
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 @@ public class SensorsTestFragment extends Fragment {
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 @@ public class SensorsTestFragment extends Fragment {
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 @@ public class SensorsTestFragment extends Fragment {
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 @@ public class SensorsTestFragment extends Fragment {
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 @@ public class SensorsTestFragment extends Fragment {
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 @@ public class SensorsTestFragment extends Fragment {
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 @@ public class SensorsTestFragment extends Fragment {
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 @@ public class SensorsTestFragment extends Fragment {
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 @@ public class SensorsTestFragment extends Fragment {
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 @@ public class SensorsTestFragment extends Fragment {
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);