Bug 988437 - Part 1: Allow unpickling across Android Account types; bump pickle version. r=rnewman

This commit is contained in:
Nick Alexander 2014-04-01 21:32:54 -07:00
parent 559fd46950
commit 9622fd22b3

View File

@ -54,7 +54,7 @@ import android.content.Context;
public class AccountPickler { public class AccountPickler {
public static final String LOG_TAG = AccountPickler.class.getSimpleName(); public static final String LOG_TAG = AccountPickler.class.getSimpleName();
public static final long PICKLE_VERSION = 1; public static final long PICKLE_VERSION = 2;
private static final String KEY_PICKLE_VERSION = "pickle_version"; private static final String KEY_PICKLE_VERSION = "pickle_version";
private static final String KEY_PICKLE_TIMESTAMP = "pickle_timestamp"; private static final String KEY_PICKLE_TIMESTAMP = "pickle_timestamp";
@ -216,10 +216,34 @@ public class AccountPickler {
throw new IllegalStateException("Pickle version not found."); throw new IllegalStateException("Pickle version not found.");
} }
/*
* Version 1 and version 2 are identical, except version 2 throws if the
* internal Android Account type has changed. Version 1 used to throw in
* this case, but we intentionally used the pickle file to migrate across
* Account types, bumping the version simultaneously.
*/
switch (params.pickleVersion.intValue()) { switch (params.pickleVersion.intValue()) {
case 1: case 2: {
// Sanity check.
final String accountType = json.getString(KEY_ACCOUNT_TYPE);
if (!FxAccountConstants.ACCOUNT_TYPE.equals(accountType)) {
throw new IllegalStateException("Account type has changed from " + accountType + " to " + FxAccountConstants.ACCOUNT_TYPE + ".");
}
params.unpickleV1(json); params.unpickleV1(json);
break; }
break;
case 1: {
// Warn about account type changing, but don't throw over it.
final String accountType = json.getString(KEY_ACCOUNT_TYPE);
if (!FxAccountConstants.ACCOUNT_TYPE.equals(accountType)) {
Logger.warn(LOG_TAG, "Account type has changed from " + accountType + " to " + FxAccountConstants.ACCOUNT_TYPE + "; ignoring.");
}
params.unpickleV1(json);
}
break;
default: default:
throw new IllegalStateException("Unknown pickle version, " + params.pickleVersion + "."); throw new IllegalStateException("Unknown pickle version, " + params.pickleVersion + ".");
@ -230,12 +254,6 @@ public class AccountPickler {
private void unpickleV1(final ExtendedJSONObject json) private void unpickleV1(final ExtendedJSONObject json)
throws NonObjectJSONException, NoSuchAlgorithmException, InvalidKeySpecException { throws NonObjectJSONException, NoSuchAlgorithmException, InvalidKeySpecException {
// Sanity check.
final String accountType = json.getString(KEY_ACCOUNT_TYPE);
if (!FxAccountConstants.ACCOUNT_TYPE.equals(accountType)) {
throw new IllegalStateException("Account type has changed from, " + accountType +
", to, " + FxAccountConstants.ACCOUNT_TYPE + ".");
}
this.accountVersion = json.getIntegerSafely(KEY_ACCOUNT_VERSION); this.accountVersion = json.getIntegerSafely(KEY_ACCOUNT_VERSION);
this.email = json.getString(KEY_EMAIL); this.email = json.getString(KEY_EMAIL);