Fix boot loop when upgrading sensor privacy file
Also add new testcase for sensor privacy service boot.
Test: atest SensorPrivacyServiceMockingTest CtsSensorPrivacyTestCases
Manually test booting with old file version
Fixes: 195913883
Change-Id: I9d8791e5f27c881afd9e23f94fb5fb9dc891fda4
This commit is contained in:
@@ -1021,7 +1021,15 @@ public final class SensorPrivacyService extends SystemService {
|
||||
}
|
||||
}
|
||||
|
||||
return upgradeAndInit(version, map);
|
||||
try {
|
||||
return upgradeAndInit(version, map);
|
||||
} catch (Exception e) {
|
||||
Log.wtf(TAG, "Failed to upgrade and set sensor privacy state,"
|
||||
+ " resetting to default.", e);
|
||||
mEnabled = new SparseBooleanArray();
|
||||
mIndividualEnabled = new SparseArray<>();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean upgradeAndInit(int version, SparseArray map) {
|
||||
@@ -1037,22 +1045,22 @@ public final class SensorPrivacyService extends SystemService {
|
||||
final int[] users = getLocalService(UserManagerInternal.class).getUserIds();
|
||||
if (version == 0) {
|
||||
final boolean enabled = (boolean) map.get(VER0_ENABLED);
|
||||
final SparseBooleanArray individualEnabled =
|
||||
(SparseBooleanArray) map.get(VER0_INDIVIDUAL_ENABLED);
|
||||
final SparseArray<SensorState> individualEnabled =
|
||||
(SparseArray<SensorState>) map.get(VER0_INDIVIDUAL_ENABLED);
|
||||
|
||||
final SparseBooleanArray perUserEnabled = new SparseBooleanArray();
|
||||
final SparseArray<SparseBooleanArray> perUserIndividualEnabled =
|
||||
final SparseArray<SparseArray<SensorState>> perUserIndividualEnabled =
|
||||
new SparseArray<>();
|
||||
|
||||
// Copy global state to each user
|
||||
for (int i = 0; i < users.length; i++) {
|
||||
int user = users[i];
|
||||
perUserEnabled.put(user, enabled);
|
||||
SparseBooleanArray userIndividualSensorEnabled = new SparseBooleanArray();
|
||||
SparseArray<SensorState> userIndividualSensorEnabled = new SparseArray<>();
|
||||
perUserIndividualEnabled.put(user, userIndividualSensorEnabled);
|
||||
for (int j = 0; j < individualEnabled.size(); j++) {
|
||||
final int sensor = individualEnabled.keyAt(j);
|
||||
final boolean isSensorEnabled = individualEnabled.valueAt(j);
|
||||
final SensorState isSensorEnabled = individualEnabled.valueAt(j);
|
||||
userIndividualSensorEnabled.put(sensor, isSensorEnabled);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
|
||||
<sensor-privacy enabled="false">
|
||||
</sensor-privacy>
|
||||
@@ -60,6 +60,8 @@ public class SensorPrivacyServiceMockingTest {
|
||||
String.format(PERSISTENCE_FILE_PATHS_TEMPLATE, 4);
|
||||
public static final String PERSISTENCE_FILE5 =
|
||||
String.format(PERSISTENCE_FILE_PATHS_TEMPLATE, 5);
|
||||
public static final String PERSISTENCE_FILE6 =
|
||||
String.format(PERSISTENCE_FILE_PATHS_TEMPLATE, 6);
|
||||
|
||||
private Context mContext;
|
||||
@Mock
|
||||
@@ -111,6 +113,7 @@ public class SensorPrivacyServiceMockingTest {
|
||||
initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE3);
|
||||
initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE4);
|
||||
initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE5);
|
||||
initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE6);
|
||||
|
||||
// Try all files with two known users
|
||||
doReturn(new int[]{0, 10}).when(mMockedUserManagerInternal).getUserIds();
|
||||
@@ -124,6 +127,7 @@ public class SensorPrivacyServiceMockingTest {
|
||||
initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE3);
|
||||
initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE4);
|
||||
initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE5);
|
||||
initServiceWithPersistenceFile(onDeviceFile, PERSISTENCE_FILE6);
|
||||
|
||||
} finally {
|
||||
mockitoSession.finishMocking();
|
||||
|
||||
Reference in New Issue
Block a user