Add logging for media source changes am: 5bfd1c1a0f am: 25f3d80594
am: ff8ce954fe
Change-Id: I22cf84d0ef59ecd174be375db4f121277c9e4a67
diff --git a/service/src/com/android/car/CarLocationService.java b/service/src/com/android/car/CarLocationService.java
index 3827c22..2f37e61 100644
--- a/service/src/com/android/car/CarLocationService.java
+++ b/service/src/com/android/car/CarLocationService.java
@@ -216,7 +216,17 @@
});
break;
case CarPowerStateListener.SUSPEND_EXIT:
- deleteCacheFile();
+ if (mCarDrivingStateService != null) {
+ CarDrivingStateEvent event = mCarDrivingStateService.getCurrentDrivingState();
+ if (event != null
+ && event.eventValue == CarDrivingStateEvent.DRIVING_STATE_MOVING) {
+ deleteCacheFile();
+ } else {
+ logd("Registering to receive driving state.");
+ mCarDrivingStateService.registerDrivingStateChangeListener(
+ mICarDrivingStateChangeEventListener);
+ }
+ }
if (future != null) {
future.complete(null);
}
diff --git a/service/src/com/android/car/CarUxRestrictionsManagerService.java b/service/src/com/android/car/CarUxRestrictionsManagerService.java
index 8b5e9e1..d85ebaa 100644
--- a/service/src/com/android/car/CarUxRestrictionsManagerService.java
+++ b/service/src/com/android/car/CarUxRestrictionsManagerService.java
@@ -60,6 +60,7 @@
import com.android.car.systeminterface.SystemInterface;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.Preconditions;
import org.xmlpull.v1.XmlPullParserException;
@@ -157,17 +158,17 @@
mCurrentUxRestrictions.put(port, createUnrestrictedRestrictions());
}
- // subscribe to driving State
+ // Load the prod config, or if there is a staged one, promote that first only if the
+ // current driving state, as provided by the driving state service, is parked.
+ mCarUxRestrictionsConfigurations = convertToMap(loadConfig());
+
+ // subscribe to driving state changes
mDrivingStateService.registerDrivingStateChangeListener(
mICarDrivingStateChangeEventListener);
// subscribe to property service for speed
mCarPropertyService.registerListener(VehicleProperty.PERF_VEHICLE_SPEED,
PROPERTY_UPDATE_RATE, mICarPropertyEventListener);
- // At this point the driving state is known, which determines whether it's safe
- // to promote staged new config.
- mCarUxRestrictionsConfigurations = convertToMap(loadConfig());
-
initializeUxRestrictions();
}
@@ -187,7 +188,8 @@
* <li>hardcoded default config.
* </ol>
*
- * This method attempts to promote staged config file. Doing which depends on driving state.
+ * This method attempts to promote staged config file, which requires getting the current
+ * driving state.
*/
@VisibleForTesting
synchronized List<CarUxRestrictionsConfiguration> loadConfig() {
@@ -237,6 +239,10 @@
return null;
}
+ /**
+ * Promotes the staged config to prod, by replacing the prod file. Only do this if the car is
+ * parked to avoid changing the restrictions during a drive.
+ */
private void promoteStagedConfig() {
Path stagedConfig = getFile(CONFIG_FILENAME_STAGED).toPath();
@@ -699,6 +705,11 @@
*/
private synchronized void handleDispatchUxRestrictions(@CarDrivingState int currentDrivingState,
float speed) {
+ Preconditions.checkNotNull(mCarUxRestrictionsConfigurations,
+ "mCarUxRestrictionsConfigurations must be initialized");
+ Preconditions.checkNotNull(mCurrentUxRestrictions,
+ "mCurrentUxRestrictions must be initialized");
+
if (isDebugBuild() && !mUxRChangeBroadcastEnabled) {
Log.d(TAG, "Not dispatching UX Restriction due to setting");
return;
diff --git a/service/src/com/android/car/trust/BLEMessageV1Factory.java b/service/src/com/android/car/trust/BLEMessageV1Factory.java
index afb5c8c..4afe877 100644
--- a/service/src/com/android/car/trust/BLEMessageV1Factory.java
+++ b/service/src/com/android/car/trust/BLEMessageV1Factory.java
@@ -41,14 +41,6 @@
*/
private static final int FIXED_32_SIZE = 4;
- /**
- * Additional bytes that are needed during the encoding of the {@code payload} field.
- *
- * <p>The {@code payload} field is defined as {@code bytes}, and thus, needs 2 extra bytes to
- * encode: one to encode the field number and another for length delimiting.
- */
- private static final int ADDITIONAL_PAYLOAD_ENCODING_SIZE = 2;
-
// The size needed to encode a boolean proto field
private static final int BOOLEAN_FIELD_ENCODING_SIZE = 1;
@@ -145,13 +137,14 @@
public static List<BLEMessage> makeBLEMessages(byte[] payload, OperationType operation,
int maxSize, boolean isPayloadEncrypted) {
List<BLEMessage> bleMessages = new ArrayList();
- int maxPayloadSize = maxSize - getProtoHeaderSize(operation, isPayloadEncrypted);
- int payloadLength = payload.length;
- if (payloadLength <= maxPayloadSize) {
+ int payloadSize = payload.length;
+ int maxPayloadSize =
+ maxSize - getProtoHeaderSize(operation, payloadSize, isPayloadEncrypted);
+ if (payloadSize <= maxPayloadSize) {
bleMessages.add(makeBLEMessage(payload, operation, isPayloadEncrypted));
return bleMessages;
}
- int totalPackets = (int) Math.ceil((double) payloadLength / maxPayloadSize);
+ int totalPackets = (int) Math.ceil((double) payloadSize / maxPayloadSize);
int start = 0;
int end = maxPayloadSize;
for (int i = 0; i < totalPackets; i++) {
@@ -164,7 +157,7 @@
.setPayload(ByteString.copyFrom(Arrays.copyOfRange(payload, start, end)))
.build());
start = end;
- end = Math.min(start + maxPayloadSize, payloadLength);
+ end = Math.min(start + maxPayloadSize, payloadSize);
}
return bleMessages;
}
@@ -174,12 +167,18 @@
* contain a payload.
*/
@VisibleForTesting
- static int getProtoHeaderSize(OperationType operation, boolean isPayloadEncrypted) {
- int isPayloadEncryptedFieldSize =
- isPayloadEncrypted ? (BOOLEAN_FIELD_ENCODING_SIZE + FIELD_NUMBER_ENCODING_SIZE) : 0;
+ static int getProtoHeaderSize(OperationType operation, int payloadSize,
+ boolean isPayloadEncrypted) {
+ int isPayloadEncryptedFieldSize = isPayloadEncrypted
+ ? BOOLEAN_FIELD_ENCODING_SIZE + FIELD_NUMBER_ENCODING_SIZE
+ : 0;
int operationSize = getEncodedSize(operation.getNumber()) + FIELD_NUMBER_ENCODING_SIZE;
+
+ // The payload size is a varint.
+ int payloadEncodingSize = FIELD_NUMBER_ENCODING_SIZE + getEncodedSize(payloadSize);
+
return CONSTANT_HEADER_FIELD_SIZE + operationSize + isPayloadEncryptedFieldSize
- + ADDITIONAL_PAYLOAD_ENCODING_SIZE;
+ + payloadEncodingSize;
}
/**
diff --git a/service/src/com/android/car/trust/BLEVersionExchangeResolver.java b/service/src/com/android/car/trust/BLEVersionExchangeResolver.java
index 7b9a025..4465b25 100644
--- a/service/src/com/android/car/trust/BLEVersionExchangeResolver.java
+++ b/service/src/com/android/car/trust/BLEVersionExchangeResolver.java
@@ -59,7 +59,7 @@
.setMinSupportedMessagingVersion(MESSAGING_VERSION)
.setMaxSupportedMessagingVersion(MESSAGING_VERSION)
.setMinSupportedSecurityVersion(SECURITY_VERSION)
- .setMinSupportedSecurityVersion(SECURITY_VERSION)
+ .setMaxSupportedSecurityVersion(SECURITY_VERSION)
.build();
}
diff --git a/service/src/com/android/car/trust/CarTrustAgentBleManager.java b/service/src/com/android/car/trust/CarTrustAgentBleManager.java
index 09c59e6..1e43300 100644
--- a/service/src/com/android/car/trust/CarTrustAgentBleManager.java
+++ b/service/src/com/android/car/trust/CarTrustAgentBleManager.java
@@ -57,7 +57,6 @@
* the Trusted Device feature.
*/
class CarTrustAgentBleManager extends BleManager {
-
private static final String TAG = "CarTrustBLEManager";
/**
@@ -70,6 +69,15 @@
private static final UUID CLIENT_CHARACTERISTIC_CONFIG =
UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");
+ /**
+ * Reserved bytes for an ATT write request payload.
+ *
+ * <p>The attribute protocol uses 3 bytes to encode the command type and attribute ID. These
+ * bytes need to be subtracted from the reported MTU size and the resulting value will
+ * represent the total amount of bytes that can be sent in a write.
+ */
+ private static final int ATT_PAYLOAD_RESERVED_BYTES = 3;
+
/** @hide */
@IntDef(prefix = {"TRUSTED_DEVICE_OPERATION_"}, value = {
TRUSTED_DEVICE_OPERATION_NONE,
@@ -94,7 +102,16 @@
private String mOriginalBluetoothName;
private byte[] mUniqueId;
private String mEnrollmentDeviceName;
- private int mMtuSize = 20;
+
+ /**
+ * The maximum amount of bytes that can be written over BLE.
+ *
+ * <p>This initial value is 20 because BLE has a default write of 23 bytes. However, 3 bytes
+ * are subtracted due to bytes being reserved for the command type and attribute ID.
+ *
+ * @see #ATT_PAYLOAD_RESERVED_BYTES
+ */
+ private int mMaxWriteSize = 20;
// Enrollment Service and Characteristic UUIDs
private UUID mEnrollmentServiceUuid;
@@ -169,7 +186,12 @@
@Override
protected void onMtuSizeChanged(int size) {
- mMtuSize = size;
+ mMaxWriteSize = size - ATT_PAYLOAD_RESERVED_BYTES;
+
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "MTU size changed to: " + size
+ + "; setting max payload size to: " + mMaxWriteSize);
+ }
}
@Override
@@ -347,7 +369,8 @@
// Characteristic the connected bluetooth device will write to.
BluetoothGattCharacteristic clientCharacteristic =
new BluetoothGattCharacteristic(mEnrollmentClientWriteUuid,
- BluetoothGattCharacteristic.PROPERTY_WRITE,
+ BluetoothGattCharacteristic.PROPERTY_WRITE
+ | BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE,
BluetoothGattCharacteristic.PERMISSION_WRITE);
// Characteristic that this manager will write to.
@@ -380,7 +403,8 @@
// Characteristic the connected bluetooth device will write to.
BluetoothGattCharacteristic clientCharacteristic = new BluetoothGattCharacteristic(
mUnlockClientWriteUuid,
- BluetoothGattCharacteristic.PROPERTY_WRITE,
+ BluetoothGattCharacteristic.PROPERTY_WRITE
+ | BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE,
BluetoothGattCharacteristic.PERMISSION_WRITE);
// Characteristic that this manager will write to.
@@ -524,7 +548,7 @@
}
List<BLEMessage> bleMessages = BLEMessageV1Factory.makeBLEMessages(message, operation,
- mMtuSize, isPayloadEncrypted);
+ mMaxWriteSize, isPayloadEncrypted);
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "sending " + bleMessages.size() + " messages to device");
diff --git a/tests/carservice_unit_test/src/com/android/car/CarLocationServiceTest.java b/tests/carservice_unit_test/src/com/android/car/CarLocationServiceTest.java
index c9e85e0..5384005 100644
--- a/tests/carservice_unit_test/src/com/android/car/CarLocationServiceTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/CarLocationServiceTest.java
@@ -415,13 +415,17 @@
/**
* Test that the {@link CarLocationService} deletes location_cache.json when the system resumes
- * from suspend-to-ram.
+ * from suspend-to-ram if moving.
*/
@Test
- public void testDeletesCacheFileUponSuspendExit() throws Exception {
+ public void testDeletesCacheFileUponSuspendExitWhileMoving() throws Exception {
mCarLocationService.init();
when(mMockLocationManagerProxy.isLocationEnabled()).thenReturn(false);
+ when(mMockCarDrivingStateService.getCurrentDrivingState()).thenReturn(
+ new CarDrivingStateEvent(CarDrivingStateEvent.DRIVING_STATE_MOVING, 0));
+ writeCacheFile("{\"provider\":\"latitude\":16.7666,\"longitude\": \"accuracy\":1.0}");
CompletableFuture<Void> future = new CompletableFuture<>();
+ assertTrue(getLocationCacheFile().exists());
mCarLocationService.onStateChanged(CarPowerStateListener.SUSPEND_EXIT, future);
@@ -431,6 +435,26 @@
}
/**
+ * Test that the {@link CarLocationService} registers for driving state changes when the system
+ * resumes from suspend-to-ram.
+ */
+ @Test
+ public void testRegistersForDrivingStateChangesUponSuspendExit() throws Exception {
+ mCarLocationService.init();
+ when(mMockLocationManagerProxy.isLocationEnabled()).thenReturn(false);
+ when(mMockCarDrivingStateService.getCurrentDrivingState()).thenReturn(
+ new CarDrivingStateEvent(CarDrivingStateEvent.DRIVING_STATE_PARKED, 0));
+ CompletableFuture<Void> future = new CompletableFuture<>();
+
+ mCarLocationService.onStateChanged(CarPowerStateListener.SUSPEND_EXIT, future);
+
+ assertTrue(future.isDone());
+ verify(mMockLocationManagerProxy, times(0)).isLocationEnabled();
+ // One of the registrations should happen during init and another during onStateChanged.
+ verify(mMockCarDrivingStateService, times(2)).registerDrivingStateChangeListener(any());
+ }
+
+ /**
* Test that the {@link CarLocationService} deletes location_cache.json when the car enters a
* moving driving state.
*/
diff --git a/tests/carservice_unit_test/src/com/android/car/trust/BLEMessagePayloadStreamTest.java b/tests/carservice_unit_test/src/com/android/car/trust/BLEMessagePayloadStreamTest.java
index b65bce6..a99b1d7 100644
--- a/tests/carservice_unit_test/src/com/android/car/trust/BLEMessagePayloadStreamTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/trust/BLEMessagePayloadStreamTest.java
@@ -43,7 +43,7 @@
private static final byte[] TEST_MESSAGE_PAYLOAD = "testMessage".getBytes();
private static final int TEST_SINGLE_MESSAGE_SIZE =
TEST_MESSAGE_PAYLOAD.length + BLEMessageV1Factory.getProtoHeaderSize(
- OPERATION_TYPE, IS_MESSAGE_ENCRYPTED);
+ OPERATION_TYPE, TEST_MESSAGE_PAYLOAD.length, IS_MESSAGE_ENCRYPTED);
private BLEMessagePayloadStream mBLEMessagePayloadStream;
private List<BLEMessage> mBleMessages;