Change AccountManager username for Exchange to the user's login credential

* This is not a backward-compatible change (sorry)
* Existing AccountManager EAS accounts and contacts are deleted
* Existing EmailProvider data is deleted
* Change works with new code (stadler) to avoid account duplication

Change-Id: Ife09c51fa714d91054d017b497bce603add5375a
This commit is contained in:
Marc Blank 2009-09-15 19:27:05 -07:00
parent c022839861
commit e7e1ca432e
5 changed files with 49 additions and 30 deletions

View File

@ -83,7 +83,7 @@ public class ExchangeStore extends Store {
AccountManagerCallback<Bundle> callback) {
// Create a description of the new account
Bundle options = new Bundle();
options.putString(EasAuthenticatorService.OPTIONS_USERNAME, acct.mEmailAddress);
options.putString(EasAuthenticatorService.OPTIONS_USERNAME, acct.mHostAuthRecv.mLogin);
options.putString(EasAuthenticatorService.OPTIONS_PASSWORD, acct.mHostAuthRecv.mPassword);
options.putBoolean(EasAuthenticatorService.OPTIONS_CONTACTS_SYNC_ENABLED, syncContacts);

View File

@ -30,7 +30,9 @@ import com.android.email.provider.EmailContent.MailboxColumns;
import com.android.email.provider.EmailContent.Message;
import com.android.email.provider.EmailContent.MessageColumns;
import com.android.email.provider.EmailContent.SyncColumns;
import com.android.exchange.Eas;
import android.accounts.AccountManager;
import android.content.ContentProvider;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
@ -57,12 +59,14 @@ public class EmailProvider extends ContentProvider {
// Any changes to the database format *must* include update-in-place code.
// Original version: 3
public static final int DATABASE_VERSION = 3;
// Version 4: Database wipe required; changing AccountManager interface w/Exchange
public static final int DATABASE_VERSION = 4;
// Any changes to the database format *must* include update-in-place code.
// Original version: 2
// Version 3: Add "sourceKey" column
public static final int BODY_DATABASE_VERSION = 3;
// Version 4: Database wipe required; changing AccountManager interface w/Exchange
public static final int BODY_DATABASE_VERSION = 4;
public static final String EMAIL_AUTHORITY = "com.android.email.provider";
@ -348,7 +352,7 @@ public class EmailProvider extends ContentProvider {
"; end");
}
static void upgradeMessageTable(SQLiteDatabase db, int oldVersion, int newVersion) {
static void resetMessageTable(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
db.execSQL("drop table " + Message.TABLE_NAME);
db.execSQL("drop table " + Message.UPDATED_TABLE_NAME);
@ -387,7 +391,7 @@ public class EmailProvider extends ContentProvider {
"; end");
}
static void upgradeAccountTable(SQLiteDatabase db, int oldVersion, int newVersion) {
static void resetAccountTable(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
db.execSQL("drop table " + Account.TABLE_NAME);
} catch (SQLException e) {
@ -409,7 +413,7 @@ public class EmailProvider extends ContentProvider {
db.execSQL("create table " + HostAuth.TABLE_NAME + s);
}
static void upgradeHostAuthTable(SQLiteDatabase db, int oldVersion, int newVersion) {
static void resetHostAuthTable(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
db.execSQL("drop table " + HostAuth.TABLE_NAME);
} catch (SQLException e) {
@ -447,7 +451,7 @@ public class EmailProvider extends ContentProvider {
"; end");
}
static void upgradeMailboxTable(SQLiteDatabase db, int oldVersion, int newVersion) {
static void resetMailboxTable(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
db.execSQL("drop table " + Mailbox.TABLE_NAME);
} catch (SQLException e) {
@ -470,7 +474,7 @@ public class EmailProvider extends ContentProvider {
db.execSQL(createIndex(Attachment.TABLE_NAME, AttachmentColumns.MESSAGE_KEY));
}
static void upgradeAttachmentTable(SQLiteDatabase db, int oldVersion, int newVersion) {
static void resetAttachmentTable(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
db.execSQL("drop table " + Attachment.TABLE_NAME);
} catch (SQLException e) {
@ -492,18 +496,13 @@ public class EmailProvider extends ContentProvider {
}
static void upgradeBodyTable(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 2) {
// Versions earlier than 2 require a wipe of the database
if (oldVersion < 4) {
try {
db.execSQL("drop table " + Body.TABLE_NAME);
createBodyTable(db);
} catch (SQLException e) {
}
} else if (oldVersion == 2) {
Log.d(TAG, "Upgrading Body from v2 to v3");
db.execSQL("alter table " + Body.TABLE_NAME +
" add " + Body.SOURCE_MESSAGE_KEY + " integer");
}
}
}
private final int mDatabaseVersion = DATABASE_VERSION;
@ -554,8 +553,11 @@ public class EmailProvider extends ContentProvider {
}
private class DatabaseHelper extends SQLiteOpenHelper {
Context mContext;
DatabaseHelper(Context context, String name) {
super(context, name, null, mDatabaseVersion);
mContext = context;
}
@Override
@ -570,11 +572,20 @@ public class EmailProvider extends ContentProvider {
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
upgradeMessageTable(db, oldVersion, newVersion);
upgradeAttachmentTable(db, oldVersion, newVersion);
upgradeMailboxTable(db, oldVersion, newVersion);
upgradeHostAuthTable(db, oldVersion, newVersion);
upgradeAccountTable(db, oldVersion, newVersion);
// For versions prior to 4, delete all data
// Versions >= 4 require that data be preserved!
if (oldVersion < 4) {
android.accounts.Account[] accounts =
AccountManager.get(mContext).getAccountsByType(Eas.ACCOUNT_MANAGER_TYPE);
for (android.accounts.Account account: accounts) {
AccountManager.get(mContext).removeAccount(account, null, null);
}
resetMessageTable(db, oldVersion, newVersion);
resetAttachmentTable(db, oldVersion, newVersion);
resetMailboxTable(db, oldVersion, newVersion);
resetHostAuthTable(db, oldVersion, newVersion);
resetAccountTable(db, oldVersion, newVersion);
}
}
@Override

View File

@ -133,6 +133,7 @@ public class EasSyncService extends AbstractSyncService {
private boolean mSsl = true;
private boolean mTrustSsl = false;
public ContentResolver mContentResolver;
public String mHostLogin;
private String[] mBindArguments = new String[2];
private ArrayList<String> mPingChangeList;
private HttpPost mPendingPost = null;
@ -147,6 +148,7 @@ public class EasSyncService extends AbstractSyncService {
super(_context, _mailbox);
mContentResolver = _context.getContentResolver();
HostAuth ha = HostAuth.restoreHostAuthWithId(_context, mAccount.mHostAuthKeyRecv);
mHostLogin = ha.mLogin;
mSsl = (ha.mFlags & HostAuth.FLAG_SSL) != 0;
mTrustSsl = (ha.mFlags & HostAuth.FLAG_TRUST_ALL_CERTIFICATES) != 0;
}
@ -1039,7 +1041,6 @@ public class EasSyncService extends AbstractSyncService {
runAccountMailbox();
} else {
AbstractSyncAdapter target;
mAccount = Account.restoreAccountWithId(mContext, mAccount.mId);
mProtocolVersion = mAccount.mProtocolVersion;
mProtocolVersionDouble = Double.parseDouble(mProtocolVersion);
if (mMailbox.mType == Mailbox.TYPE_CONTACTS) {

View File

@ -443,7 +443,7 @@ public class SyncManager extends Service implements Runnable {
stopAccountSyncs(account.mId, true);
// Delete this from AccountManager...
android.accounts.Account acct =
new android.accounts.Account(account.mEmailAddress,
new android.accounts.Account(account.mHostAuthRecv.mLogin,
Eas.ACCOUNT_MANAGER_TYPE);
AccountManager.get(SyncManager.this).removeAccount(acct, null, null);
mAccountKeyList = null;
@ -471,6 +471,10 @@ public class SyncManager extends Service implements Runnable {
if (!mAccounts.contains(account.mId)) {
// This is an addition; create our magic hidden mailbox...
addAccountMailbox(account.mId);
// Don't forget to cache the HostAuth
HostAuth ha =
HostAuth.restoreHostAuthWithId(getContext(), account.mHostAuthKeyRecv);
account.mHostAuthRecv = ha;
mAccounts.add(account);
mAccountKeyList = null;
}
@ -493,7 +497,10 @@ public class SyncManager extends Service implements Runnable {
if (hostAuthId > 0) {
HostAuth ha = HostAuth.restoreHostAuthWithId(context, hostAuthId);
if (ha != null && ha.mProtocol.equals("eas")) {
accounts.add(new Account().restore(c));
Account account = new Account().restore(c);
// Cache the HostAuth
account.mHostAuthRecv = ha;
accounts.add(account);
}
}
}
@ -1030,7 +1037,7 @@ public class SyncManager extends Service implements Runnable {
if (contactsId != Mailbox.NO_MAILBOX) {
// Create an AccountManager style Account
android.accounts.Account acct =
new android.accounts.Account(easAccount.mEmailAddress,
new android.accounts.Account(easAccount.mHostAuthRecv.mLogin,
Eas.ACCOUNT_MANAGER_TYPE);
// Get the Contacts mailbox; this happens rarely so it's ok to get it all
Mailbox contacts = Mailbox.restoreMailboxWithId(this, contactsId);
@ -1069,7 +1076,7 @@ public class SyncManager extends Service implements Runnable {
AccountManager.get(this).getAccountsByType(Eas.ACCOUNT_MANAGER_TYPE);
List<Account> easAccounts = getAccountList();
for (Account easAccount: easAccounts) {
String accountName = easAccount.mEmailAddress;
String accountName = easAccount.mHostAuthRecv.mLogin;
boolean found = false;
for (android.accounts.Account acct: accts) {
if (acct.name.equalsIgnoreCase(accountName)) {
@ -1400,7 +1407,7 @@ public class SyncManager extends Service implements Runnable {
getAccountById(c.getInt(Mailbox.CONTENT_ACCOUNT_KEY_COLUMN));
if (account != null) {
android.accounts.Account a =
new android.accounts.Account(account.mEmailAddress,
new android.accounts.Account(account.mHostAuthRecv.mLogin,
Eas.ACCOUNT_MANAGER_TYPE);
if (!ContentResolver.getSyncAutomatically(a,
ContactsContract.AUTHORITY)) {

View File

@ -151,7 +151,7 @@ public class ContactsSyncAdapter extends AbstractSyncAdapter {
setSyncKey("0", false);
// Make sure ungrouped contacts for Exchange are defaultly visible
ContentValues cv = new ContentValues();
cv.put(Groups.ACCOUNT_NAME, mAccount.mEmailAddress);
cv.put(Groups.ACCOUNT_NAME, mService.mHostLogin);
cv.put(Groups.ACCOUNT_TYPE, Eas.ACCOUNT_MANAGER_TYPE);
cv.put(Settings.UNGROUPED_VISIBLE, true);
client.insert(Settings.CONTENT_URI, cv);
@ -190,7 +190,7 @@ public class ContactsSyncAdapter extends AbstractSyncAdapter {
public android.accounts.Account getAccountManagerAccount() {
if (mAccountManagerAccount == null) {
mAccountManagerAccount =
new android.accounts.Account(mAccount.mEmailAddress, Eas.ACCOUNT_MANAGER_TYPE);
new android.accounts.Account(mService.mHostLogin, Eas.ACCOUNT_MANAGER_TYPE);
}
return mAccountManagerAccount;
}
@ -877,7 +877,7 @@ public class ContactsSyncAdapter extends AbstractSyncAdapter {
private Uri uriWithAccountAndIsSyncAdapter(Uri uri) {
return uri.buildUpon()
.appendQueryParameter(RawContacts.ACCOUNT_NAME, mAccount.mEmailAddress)
.appendQueryParameter(RawContacts.ACCOUNT_NAME, mService.mHostLogin)
.appendQueryParameter(RawContacts.ACCOUNT_TYPE, Eas.ACCOUNT_MANAGER_TYPE)
.appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true")
.build();
@ -1713,7 +1713,7 @@ public class ContactsSyncAdapter extends AbstractSyncAdapter {
// First, let's find Contacts that have changed.
ContentResolver cr = mService.mContentResolver;
Uri uri = RawContacts.CONTENT_URI.buildUpon()
.appendQueryParameter(RawContacts.ACCOUNT_NAME, mAccount.mEmailAddress)
.appendQueryParameter(RawContacts.ACCOUNT_NAME, mService.mHostLogin)
.appendQueryParameter(RawContacts.ACCOUNT_TYPE, Eas.ACCOUNT_MANAGER_TYPE)
.build();