Loading packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +49 −26 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"; Loading Loading @@ -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(); Loading @@ -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); 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. if (value == null) { 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; 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; } Loading Loading @@ -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; Loading @@ -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; } Loading Loading
packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +49 −26 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"; Loading Loading @@ -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(); Loading @@ -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); 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. if (value == null) { 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; 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; } Loading Loading @@ -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; Loading @@ -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; } Loading