Merge "Store UUIDs in account shortcuts, rather than IDs."

This commit is contained in:
Makoto Onuki 2011-04-05 10:41:25 -07:00 committed by Android (Google) Code Review
commit e553c6ec0b
6 changed files with 155 additions and 21 deletions

View File

@ -1077,7 +1077,7 @@ public abstract class EmailContent {
public static final String UNREAD_COUNT_SELECTION =
MessageColumns.MAILBOX_KEY + " =? and " + MessageColumns.FLAG_READ + "= 0";
public static final String UUID_SELECTION = AccountColumns.COMPATIBILITY_UUID + " =?";
private static final String UUID_SELECTION = AccountColumns.COMPATIBILITY_UUID + " =?";
public static final String SECURITY_NONZERO_SELECTION =
Account.SECURITY_FLAGS + " IS NOT NULL AND " + Account.SECURITY_FLAGS + "!=0";
@ -1479,9 +1479,16 @@ public abstract class EmailContent {
}
// Now id is a UUId.
return getAccountIdFromUuid(context, id);
}
/**
* @return ID of the account with the given UUID.
*/
public static long getAccountIdFromUuid(Context context, String uuid) {
return Utility.getFirstRowLong(context,
CONTENT_URI, ID_PROJECTION,
UUID_SELECTION, new String[] {id}, null, 0, Long.valueOf(-1));
UUID_SELECTION, new String[] {uuid}, null, 0, -1L);
}
/**

View File

@ -177,7 +177,7 @@ public class AccountShortcutPicker extends ListActivity
*/
private void setupShortcut(Account account) {
// First, set up the shortcut intent.
Intent shortcutIntent = Welcome.createOpenAccountInboxIntent(this, account.mId);
Intent shortcutIntent = Welcome.createAccountShortcutIntent(this, account);
// Then, set up the container intent (the response to the caller)
Intent intent = new Intent();

View File

@ -16,6 +16,8 @@
package com.android.email.activity;
import com.android.emailcommon.provider.EmailContent.Account;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
@ -30,6 +32,7 @@ public final class IntentUtilities {
private static final String ACCOUNT_ID_PARAM = "ACCOUNT_ID";
private static final String MAILBOX_ID_PARAM = "MAILBOX_ID";
private static final String MESSAGE_ID_PARAM = "MESSAGE_ID";
private static final String ACCOUNT_UUID_PARAM = "ACCOUNT_UUID";
private IntentUtilities() {
}
@ -72,6 +75,16 @@ public final class IntentUtilities {
}
}
/**
* Add the account UUID parameter.
*/
public static void setAccountUuid(Uri.Builder b, String mUuid) {
if (TextUtils.isEmpty(mUuid)) {
throw new IllegalArgumentException();
}
b.appendQueryParameter(ACCOUNT_UUID_PARAM, mUuid);
}
/**
* Retrieve the account ID.
*/
@ -93,6 +106,18 @@ public final class IntentUtilities {
return getLongFromIntent(intent, MESSAGE_ID_PARAM);
}
/**
* Retrieve the account UUID, or null if the UUID param is not found.
*/
public static String getAccountUuidFromIntent(Intent intent) {
final Uri uri = intent.getData();
if (uri == null) {
return null;
}
String uuid = uri.getQueryParameter(ACCOUNT_UUID_PARAM);
return TextUtils.isEmpty(uuid) ? null : uuid;
}
private static long getLongFromIntent(Intent intent, String paramName) {
long value = -1;
if (intent.getData() != null) {

View File

@ -32,6 +32,7 @@ import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
/**
* The Welcome activity initializes the application and decides what Activity
@ -124,6 +125,17 @@ public class Welcome extends Activity {
fromActivity.startActivity(createOpenAccountInboxIntent(fromActivity, accountId));
}
/**
* Create an {@link Intent} for account shortcuts. The returned intent stores the account's
* UUID rather than the account ID, which will be changed after account restore.
*/
public static Intent createAccountShortcutIntent(Context context, Account account) {
final Uri.Builder b = IntentUtilities.createActivityIntentUrlBuilder(
VIEW_MAILBOX_INTENT_URL_PATH);
IntentUtilities.setAccountUuid(b, account.mCompatibilityUuid);
return IntentUtilities.createRestartAppIntent(b.build());
}
/**
* Parse the {@link #EXTRA_DEBUG_PANE_MODE} extra and return 1 or 2, if it's set to "1" or "2".
* Return 0 otherwise.
@ -163,13 +175,7 @@ public class Welcome extends Activity {
// TODO More completely separate ExchangeService from Email app
ExchangeUtils.startExchangeService(this);
final Intent intent = getIntent();
final long accountId = IntentUtilities.getAccountIdFromIntent(intent);
final long mailboxId = IntentUtilities.getMailboxIdFromIntent(intent);
final long messageId = IntentUtilities.getMessageIdFromIntent(intent);
final int debugPaneMode = getDebugPaneMode(getIntent());
new MainActivityLauncher(this, accountId, mailboxId, messageId, debugPaneMode)
.executeParallel();
new MainActivityLauncher(this, getIntent()).executeParallel();
}
@Override
@ -184,21 +190,23 @@ public class Welcome extends Activity {
*
* if {@code account} is -1, open the default account.
*/
private static class MainActivityLauncher extends EmailAsyncTask<Void, Void, Void> {
/* package */ static class MainActivityLauncher extends EmailAsyncTask<Void, Void, Void> {
private final Welcome mFromActivity;
private final int mDebugPaneMode;
private final long mAccountId;
private final long mMailboxId;
private final long mMessageId;
private final String mAccountUuid;
public MainActivityLauncher(Welcome fromActivity, long accountId, long mailboxId,
long messageId, int debugPaneMode) {
public MainActivityLauncher(Welcome fromActivity, Intent intent) {
super(fromActivity.mTaskTracker);
mFromActivity = fromActivity;
mAccountId = accountId;
mMailboxId = mailboxId;
mMessageId = messageId;
mDebugPaneMode = debugPaneMode;
mAccountId = IntentUtilities.getAccountIdFromIntent(intent);
mMailboxId = IntentUtilities.getMailboxIdFromIntent(intent);
mMessageId = IntentUtilities.getMessageIdFromIntent(intent);
mAccountUuid = IntentUtilities.getAccountUuidFromIntent(intent);
mDebugPaneMode = getDebugPaneMode(intent);
}
private boolean isMailboxSelected() {
@ -209,6 +217,16 @@ public class Welcome extends Activity {
return mMessageId != -1;
}
/* package */ static long resolveAccountId(Context context, long accountId, String uuid) {
if (!TextUtils.isEmpty(uuid)) {
accountId = Account.getAccountIdFromUuid(context, uuid);
}
if (accountId == -1 || !Account.isValidId(context, accountId)) {
accountId = EmailContent.Account.getDefaultAccountId(context);
}
return accountId;
}
@Override
protected Void doInBackground(Void... params) {
// Reconcile POP/IMAP accounts. EAS accounts are taken care of by ExchangeService.
@ -219,10 +237,7 @@ public class Welcome extends Activity {
if (numAccount == 0) {
AccountSetupBasics.actionNewAccount(mFromActivity);
} else {
long accountId = mAccountId;
if (accountId == -1 || !Account.isValidId(mFromActivity, accountId)) {
accountId = EmailContent.Account.getDefaultAccountId(mFromActivity);
}
final long accountId = resolveAccountId(mFromActivity, mAccountId, mAccountUuid);
final boolean useTwoPane = (mDebugPaneMode == 2)
|| (useTwoPane(mFromActivity) && mDebugPaneMode == 0);

View File

@ -28,6 +28,7 @@ public class IntentUtilitiesTests extends AndroidTestCase {
IntentUtilities.setAccountId(b, 10);
IntentUtilities.setMailboxId(b, 20);
IntentUtilities.setMessageId(b, 30);
IntentUtilities.setAccountUuid(b, "*uuid*");
final Uri u = b.build();
assertEquals("content", u.getScheme());
@ -38,6 +39,7 @@ public class IntentUtilitiesTests extends AndroidTestCase {
assertEquals(10, IntentUtilities.getAccountIdFromIntent(i));
assertEquals(20, IntentUtilities.getMailboxIdFromIntent(i));
assertEquals(30, IntentUtilities.getMessageIdFromIntent(i));
assertEquals("*uuid*", IntentUtilities.getAccountUuidFromIntent(i));
}
public void testGetIdFromIntent() {
@ -82,4 +84,24 @@ public class IntentUtilitiesTests extends AndroidTestCase {
i = new Intent(Intent.ACTION_VIEW, Uri.parse(uri.replace("ID", "MESSAGE_ID")));
assertEquals(expected, IntentUtilities.getMessageIdFromIntent(i));
}
public void testGetAccountUuidFromIntent() {
Intent i;
// No URL in intent
i = new Intent(getContext(), getClass());
assertEquals(null, IntentUtilities.getAccountUuidFromIntent(i));
// No param
i = new Intent(Intent.ACTION_VIEW, Uri.parse("content://s/"));
assertEquals(null, IntentUtilities.getAccountUuidFromIntent(i));
// No value
i = new Intent(Intent.ACTION_VIEW, Uri.parse("content://s/?ACCOUNT_UUID="));
assertEquals(null, IntentUtilities.getAccountUuidFromIntent(i));
// With valid UUID
i = new Intent(Intent.ACTION_VIEW, Uri.parse("content://s/?ACCOUNT_UUID=xyz"));
assertEquals("xyz", IntentUtilities.getAccountUuidFromIntent(i));
}
}

View File

@ -0,0 +1,65 @@
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.email.activity;
import com.android.email.DBTestHelper;
import com.android.email.provider.ProviderTestUtils;
import com.android.emailcommon.provider.EmailContent.Account;
import android.content.Context;
import android.test.AndroidTestCase;
public class WelcomeTests extends AndroidTestCase {
private Context mProviderContext;
@Override
protected void setUp() throws Exception {
super.setUp();
mProviderContext = DBTestHelper.ProviderContextSetupHelper.getProviderContext(
getContext());
}
public void testResolveAccountId() {
final Context c = mProviderContext;
final Account account1 = ProviderTestUtils.setupAccount("account-1", true, c);
final long id1 = account1.mId;
final Account account2 = ProviderTestUtils.setupAccount("account-2", true, c);
final long id2 = account2.mId;
final Account account3 = ProviderTestUtils.setupAccount("account-3", true, c);
final long id3 = account3.mId;
// Make sure the last one created (account 3) is the default.
assertTrue(Account.getDefaultAccountId(c) == id3);
// No account specified -- should return the default account.
assertEquals(id3, Welcome.MainActivityLauncher.resolveAccountId(c, -1, null));
// Invalid account id -- should return the default account.
assertEquals(id3, Welcome.MainActivityLauncher.resolveAccountId(c, 12345, null));
// Valid ID
assertEquals(id1, Welcome.MainActivityLauncher.resolveAccountId(c, id1, null));
// Invalid UUID -- should return the default account.
assertEquals(id3, Welcome.MainActivityLauncher.resolveAccountId(c, -1, "xxx"));
// Valid UUID
assertEquals(id1, Welcome.MainActivityLauncher.resolveAccountId(c, -1,
account1.mCompatibilityUuid));
}
}