From 391a7fc0e99457308b6f6bd9444c8aba94b0b7b1 Mon Sep 17 00:00:00 2001 From: Paul Westbrook Date: Thu, 4 Apr 2013 02:42:48 -0700 Subject: [PATCH] Support legacy shortcuts We need to support shortcuts that were created with previous versions of Email Bug: 8530220 Change-Id: I9e2a44b561f5617ffa954af37a9e78a95400f7dc --- AndroidManifest.xml | 11 +++ .../android/email/provider/EmailProvider.java | 3 +- .../android/email2/ui/MailActivityEmail.java | 97 +++++++++++++++++++ 3 files changed, 110 insertions(+), 1 deletion(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index f04d6e036..3417ad373 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -209,6 +209,17 @@ + + + + + + + diff --git a/src/com/android/email/provider/EmailProvider.java b/src/com/android/email/provider/EmailProvider.java index e8cc1ec46..8573ca9a6 100644 --- a/src/com/android/email/provider/EmailProvider.java +++ b/src/com/android/email/provider/EmailProvider.java @@ -2720,7 +2720,8 @@ outer: return sb.toString(); } - private static final Uri BASE_EXTERNAL_URI = Uri.parse("content://ui.email.android.com"); + public static final String LEGACY_AUTHORITY = "ui.email.android.com"; + private static final Uri BASE_EXTERNAL_URI = Uri.parse("content://" + LEGACY_AUTHORITY); private static final Uri BASE_EXTERAL_URI2 = Uri.parse("content://ui.email2.android.com"); diff --git a/src/com/android/email2/ui/MailActivityEmail.java b/src/com/android/email2/ui/MailActivityEmail.java index c9c7612a7..36aaefdfd 100644 --- a/src/com/android/email2/ui/MailActivityEmail.java +++ b/src/com/android/email2/ui/MailActivityEmail.java @@ -17,16 +17,20 @@ package com.android.email2.ui; import android.content.ComponentName; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.content.UriMatcher; import android.database.Cursor; +import android.net.Uri; import android.os.Bundle; import android.util.Log; import com.android.email.NotificationController; import com.android.email.Preferences; import com.android.email.R; +import com.android.email.provider.EmailProvider; import com.android.email.service.AttachmentDownloadService; import com.android.email.service.EmailServiceUtils; import com.android.email.service.MailService; @@ -34,9 +38,18 @@ import com.android.emailcommon.Logging; import com.android.emailcommon.TempDirectory; import com.android.emailcommon.provider.Account; import com.android.emailcommon.provider.EmailContent; +import com.android.emailcommon.provider.Mailbox; import com.android.emailcommon.service.EmailServiceProxy; import com.android.emailcommon.utility.EmailAsyncTask; +import com.android.emailcommon.utility.IntentUtilities; import com.android.emailcommon.utility.Utility; +import com.android.mail.providers.Folder; +import com.android.mail.providers.UIProvider; +import com.android.mail.utils.LogTag; +import com.android.mail.utils.LogUtils; +import com.android.mail.utils.Utils; + +import java.util.List; public class MailActivityEmail extends com.android.mail.ui.MailActivity { /** @@ -53,6 +66,8 @@ public class MailActivityEmail extends com.android.mail.ui.MailActivity { */ public static boolean DEBUG; + public static final String LOG_TAG = LogTag.getLogTag(); + // Exchange debugging flags (passed to Exchange, when available, via EmailServiceProxy) public static boolean DEBUG_EXCHANGE; public static boolean DEBUG_VERBOSE; @@ -85,6 +100,17 @@ public class MailActivityEmail extends com.android.mail.ui.MailActivity { private static Thread sUiThread; + private static final int MATCH_LEGACY_SHORTCUT_INTENT = 1; + /** + * A matcher for data URI's that specify conversation list info. + */ + private static final UriMatcher sUrlMatcher = new UriMatcher(UriMatcher.NO_MATCH); + static { + sUrlMatcher.addURI( + EmailProvider.LEGACY_AUTHORITY, "view/mailbox", MATCH_LEGACY_SHORTCUT_INTENT); + } + + /** * Asynchronous version of {@link #setServicesEnabledSync(Context)}. Use when calling from * UI thread (or lifecycle entry points.) @@ -163,6 +189,28 @@ public class MailActivityEmail extends com.android.mail.ui.MailActivity { @Override public void onCreate(Bundle bundle) { + final Intent intent = getIntent(); + final Uri data = intent != null ? intent.getData() : null; + if (data != null) { + final int match = sUrlMatcher.match(data); + switch (match) { + case MATCH_LEGACY_SHORTCUT_INTENT: { + final long mailboxId = IntentUtilities.getMailboxIdFromIntent(intent); + final Mailbox mailbox = Mailbox.restoreMailboxWithId(this, mailboxId); + if (mailbox == null) { + LogUtils.e(LOG_TAG, "unable to restore mailbox"); + break; + } + + final Intent viewIntent = getViewIntent(mailbox.mAccountKey, mailboxId); + if (viewIntent != null) { + setIntent(viewIntent); + } + break; + } + } + } + super.onCreate(bundle); sUiThread = Thread.currentThread(); Preferences prefs = Preferences.getPreferences(this); @@ -240,4 +288,53 @@ public class MailActivityEmail extends com.android.mail.ui.MailActivity { public static void enableStrictMode(boolean enabled) { Utility.enableStrictMode(enabled); } + + private Intent getViewIntent(long accountId, long mailboxId) { + final ContentResolver contentResolver = getContentResolver(); + + final Cursor accountCursor = contentResolver.query( + EmailProvider.uiUri("uiaccount", accountId), + UIProvider.ACCOUNTS_PROJECTION_NO_CAPABILITIES, + null, null, null); + + if (accountCursor == null) { + LogUtils.e(LOG_TAG, "Null account cursor for mAccountId %d", accountId); + return null; + } + + com.android.mail.providers.Account account = null; + try { + if (accountCursor.moveToFirst()) { + account = new com.android.mail.providers.Account(accountCursor); + } + } finally { + accountCursor.close(); + } + + + final Cursor folderCursor = contentResolver.query( + EmailProvider.uiUri("uifolder", mailboxId), + UIProvider.FOLDERS_PROJECTION, null, null, null); + + if (folderCursor == null) { + LogUtils.e(LOG_TAG, "Null folder cursor for account %d, mailbox %d", + accountId, mailboxId); + return null; + } + + Folder folder = null; + try { + if (folderCursor.moveToFirst()) { + folder = new Folder(folderCursor); + } else { + LogUtils.e(LOG_TAG, "Empty folder cursor for account %d, mailbox %d", + accountId, mailboxId); + return null; + } + } finally { + folderCursor.close(); + } + + return Utils.createViewFolderIntent(this, folder.uri, account); + } }