Merge "Backup all backupable settings" into oc-mr1-dev

This commit is contained in:
TreeHugger Robot
2017-08-03 20:58:35 +00:00
committed by Android (Google) Code Review

View File

@@ -34,6 +34,7 @@ import android.net.wifi.WifiManager;
import android.os.ParcelFileDescriptor;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.ArrayMap;
import android.util.BackupUtils;
import android.util.Log;
@@ -62,6 +63,9 @@ public class SettingsBackupAgent extends BackupAgentHelper {
private static final boolean DEBUG = false;
private static final boolean DEBUG_BACKUP = DEBUG || false;
private static final byte[] NULL_VALUE = new byte[0];
private static final int NULL_SIZE = -1;
private static final String KEY_SYSTEM = "system";
private static final String KEY_SECURE = "secure";
private static final String KEY_GLOBAL = "global";
@@ -608,7 +612,7 @@ public class SettingsBackupAgent extends BackupAgentHelper {
// Restore only the white list data.
int pos = 0;
Map<String, String> cachedEntries = new HashMap<String, String>();
final ArrayMap<String, String> cachedEntries = new ArrayMap<>();
ContentValues contentValues = new ContentValues(2);
SettingsHelper settingsHelper = mSettingsHelper;
ContentResolver cr = getContentResolver();
@@ -616,28 +620,36 @@ public class SettingsBackupAgent extends BackupAgentHelper {
final int whiteListSize = whitelist.length;
for (int i = 0; i < whiteListSize; i++) {
String key = whitelist[i];
String value = cachedEntries.remove(key);
// If the value not cached, let us look it up.
if (value == null) {
String value = null;
boolean hasValueToRestore = false;
if (cachedEntries.indexOfKey(key) >= 0) {
value = cachedEntries.remove(key);
hasValueToRestore = true;
} else {
// If the value not cached, let us look it up.
while (pos < bytes) {
int length = readInt(settings, pos);
pos += INTEGER_BYTE_COUNT;
String dataKey = length > 0 ? new String(settings, pos, length) : null;
String dataKey = length >= 0 ? new String(settings, pos, length) : null;
pos += length;
length = readInt(settings, pos);
pos += INTEGER_BYTE_COUNT;
String dataValue = length > 0 ? new String(settings, pos, length) : null;
pos += length;
String dataValue = null;
if (length >= 0) {
dataValue = new String(settings, pos, length);
pos += length;
}
if (key.equals(dataKey)) {
value = dataValue;
hasValueToRestore = true;
break;
}
cachedEntries.put(dataKey, dataValue);
}
}
if (value == null) {
if (!hasValueToRestore) {
continue;
}
@@ -724,50 +736,56 @@ public class SettingsBackupAgent extends BackupAgentHelper {
* @return The byte array of extracted values.
*/
private byte[] extractRelevantValues(Cursor cursor, String[] settings) {
final int settingsCount = settings.length;
byte[][] values = new byte[settingsCount * 2][]; // keys and values
if (!cursor.moveToFirst()) {
Log.e(TAG, "Couldn't read from the cursor");
return new byte[0];
}
final int nameColumnIndex = cursor.getColumnIndex(Settings.NameValueTable.NAME);
final int valueColumnIndex = cursor.getColumnIndex(Settings.NameValueTable.VALUE);
// Obtain the relevant data in a temporary array.
int totalSize = 0;
int backedUpSettingIndex = 0;
Map<String, String> cachedEntries = new HashMap<String, String>();
final int settingsCount = settings.length;
final byte[][] values = new byte[settingsCount * 2][]; // keys and values
final ArrayMap<String, String> cachedEntries = new ArrayMap<>();
for (int i = 0; i < settingsCount; i++) {
String key = settings[i];
String value = cachedEntries.remove(key);
final int nameColumnIndex = cursor.getColumnIndex(Settings.NameValueTable.NAME);
final int valueColumnIndex = cursor.getColumnIndex(Settings.NameValueTable.VALUE);
final String key = settings[i];
// If the value not cached, let us look it up.
if (value == null) {
String value = null;
boolean hasValueToBackup = false;
if (cachedEntries.indexOfKey(key) >= 0) {
value = cachedEntries.remove(key);
hasValueToBackup = true;
} else {
while (!cursor.isAfterLast()) {
String cursorKey = cursor.getString(nameColumnIndex);
String cursorValue = cursor.getString(valueColumnIndex);
final String cursorKey = cursor.getString(nameColumnIndex);
final String cursorValue = cursor.getString(valueColumnIndex);
cursor.moveToNext();
if (key.equals(cursorKey)) {
value = cursorValue;
hasValueToBackup = true;
break;
}
cachedEntries.put(cursorKey, cursorValue);
}
}
if (!hasValueToBackup) {
continue;
}
// Intercept the keys and see if they need special handling
value = mSettingsHelper.onBackupValue(key, value);
if (value == null) {
continue;
}
// Write the key and value in the intermediary array.
byte[] keyBytes = key.getBytes();
final byte[] keyBytes = key.getBytes();
totalSize += INTEGER_BYTE_COUNT + keyBytes.length;
values[backedUpSettingIndex * 2] = keyBytes;
byte[] valueBytes = value.getBytes();
final byte[] valueBytes = (value != null) ? value.getBytes() : NULL_VALUE;
totalSize += INTEGER_BYTE_COUNT + valueBytes.length;
values[backedUpSettingIndex * 2 + 1] = valueBytes;
@@ -783,8 +801,13 @@ public class SettingsBackupAgent extends BackupAgentHelper {
int pos = 0;
final int keyValuePairCount = backedUpSettingIndex * 2;
for (int i = 0; i < keyValuePairCount; i++) {
pos = writeInt(result, pos, values[i].length);
pos = writeBytes(result, pos, values[i]);
final byte[] value = values[i];
if (value != NULL_VALUE) {
pos = writeInt(result, pos, value.length);
pos = writeBytes(result, pos, value);
} else {
pos = writeInt(result, pos, NULL_SIZE);
}
}
return result;
}