summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Amith Yamasani <yamasani@google.com> 2017-07-19 16:49:52 -0700
committer Amith Yamasani <yamasani@google.com> 2017-07-20 13:50:23 -0700
commit74bf71b23c5deca47166d6627361f26ee5d62a7c (patch)
tree728e1d96b06251dbd0c7d8f9821ab3dcedce5e67
parent479b762f995c2cfc5938124681ab8f5a8e33b519 (diff)
Handle an edge case that can reset settings provider data
If the AtomicFile does the rename and fails when writing the original, make sure we can at least use the backup on reboot. Bug: 63753300 Test: Stop shell, move settings_global.xml to backup, start shell. Change-Id: I2049b48af05161bb2c68717a71c1700a95150a6c
-rw-r--r--core/java/android/util/AtomicFile.java9
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java4
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java20
3 files changed, 23 insertions, 10 deletions
diff --git a/core/java/android/util/AtomicFile.java b/core/java/android/util/AtomicFile.java
index 2f1abe9a4c8d..0122e49eb462 100644
--- a/core/java/android/util/AtomicFile.java
+++ b/core/java/android/util/AtomicFile.java
@@ -202,6 +202,15 @@ public class AtomicFile {
}
/**
+ * @hide
+ * Checks if the original or backup file exists.
+ * @return whether the original or backup file exists.
+ */
+ public boolean exists() {
+ return mBaseName.exists() || mBackupName.exists();
+ }
+
+ /**
* Gets the last modified time of the atomic file.
* {@hide}
*
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index f5d7dd8d9acd..ad2ec0b90135 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -2597,7 +2597,7 @@ public class SettingsProvider extends ContentProvider {
synchronized (mLock) {
final int key = makeKey(SETTINGS_TYPE_GLOBAL, UserHandle.USER_SYSTEM);
File globalFile = getSettingsFile(key);
- if (globalFile.exists()) {
+ if (SettingsState.stateFileExists(globalFile)) {
return;
}
@@ -2634,7 +2634,7 @@ public class SettingsProvider extends ContentProvider {
// Every user has secure settings and if no file we need to migrate.
final int secureKey = makeKey(SETTINGS_TYPE_SECURE, userId);
File secureFile = getSettingsFile(secureKey);
- if (secureFile.exists()) {
+ if (SettingsState.stateFileExists(secureFile)) {
return;
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
index 5f4b2391a763..d3ac11a7942e 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
@@ -689,17 +689,11 @@ final class SettingsState {
private void readStateSyncLocked() {
FileInputStream in;
- if (!mStatePersistFile.exists()) {
- Slog.i(LOG_TAG, "No settings state " + mStatePersistFile);
- addHistoricalOperationLocked(HISTORICAL_OPERATION_INITIALIZE, null);
- return;
- }
try {
in = new AtomicFile(mStatePersistFile).openRead();
} catch (FileNotFoundException fnfe) {
- String message = "No settings state " + mStatePersistFile;
- Slog.wtf(LOG_TAG, message);
- Slog.i(LOG_TAG, message);
+ Slog.i(LOG_TAG, "No settings state " + mStatePersistFile);
+ addHistoricalOperationLocked(HISTORICAL_OPERATION_INITIALIZE, null);
return;
}
try {
@@ -715,6 +709,16 @@ final class SettingsState {
}
}
+ /**
+ * Uses AtomicFile to check if the file or its backup exists.
+ * @param file The file to check for existence
+ * @return whether the original or backup exist
+ */
+ public static boolean stateFileExists(File file) {
+ AtomicFile stateFile = new AtomicFile(file);
+ return stateFile.exists();
+ }
+
private void parseStateLocked(XmlPullParser parser)
throws IOException, XmlPullParserException {
final int outerDepth = parser.getDepth();