Parse Folder out of intent

If we had a full Folder object as an extra, but no URI, we opened
the account's default inbox, instead of the desired folder.

Bug: 8526579
Change-Id: I64d1bdecea11e39fde5657910a3b3b2e22cd411a
diff --git a/src/com/android/mail/ConversationListContext.java b/src/com/android/mail/ConversationListContext.java
index 8e8419c..f5885aa 100644
--- a/src/com/android/mail/ConversationListContext.java
+++ b/src/com/android/mail/ConversationListContext.java
@@ -24,6 +24,7 @@
 import com.android.mail.providers.Account;
 import com.android.mail.providers.Folder;
 import com.android.mail.providers.UIProvider;
+import com.android.mail.utils.Utils;
 import com.google.common.base.Preconditions;
 
 /**
@@ -37,8 +38,6 @@
  * list, etc.
  */
 public class ConversationListContext {
-    private static final String EXTRA_ACCOUNT = "account";
-    public static final String EXTRA_FOLDER = "folder";
     public static final String EXTRA_SEARCH_QUERY = "query";
 
     /**
@@ -68,8 +67,8 @@
     public static ConversationListContext forBundle(Bundle bundle) {
         // The account is created here as a new object. This is probably not the best thing to do.
         // We should probably be reading an account instance from our controller.
-        Account account = bundle.getParcelable(EXTRA_ACCOUNT);
-        Folder folder = bundle.getParcelable(EXTRA_FOLDER);
+        Account account = bundle.getParcelable(Utils.EXTRA_ACCOUNT);
+        Folder folder = bundle.getParcelable(Utils.EXTRA_FOLDER);
         return new ConversationListContext(account, bundle.getString(EXTRA_SEARCH_QUERY), folder);
     }
 
@@ -119,9 +118,9 @@
      */
     public Bundle toBundle() {
         Bundle result = new Bundle();
-        result.putParcelable(EXTRA_ACCOUNT, account);
+        result.putParcelable(Utils.EXTRA_ACCOUNT, account);
         result.putString(EXTRA_SEARCH_QUERY, searchQuery);
-        result.putParcelable(EXTRA_FOLDER, folder);
+        result.putParcelable(Utils.EXTRA_FOLDER, folder);
         return result;
     }
 }
diff --git a/src/com/android/mail/MailIntentService.java b/src/com/android/mail/MailIntentService.java
index bd74c32..3c2625f 100644
--- a/src/com/android/mail/MailIntentService.java
+++ b/src/com/android/mail/MailIntentService.java
@@ -26,6 +26,7 @@
 import com.android.mail.utils.LogTag;
 import com.android.mail.utils.LogUtils;
 import com.android.mail.utils.NotificationUtils;
+import com.android.mail.utils.Utils;
 
 /**
  * A service to handle various intents asynchronously.
@@ -41,8 +42,6 @@
     public static final String ACTION_BACKUP_DATA_CHANGED =
             "com.android.mail.action.BACKUP_DATA_CHANGED";
 
-    public static final String ACCOUNT_EXTRA = "account";
-    public static final String FOLDER_EXTRA = "folder";
     public static final String CONVERSATION_EXTRA = "conversation";
 
     public MailIntentService() {
@@ -64,14 +63,14 @@
         if (Intent.ACTION_LOCALE_CHANGED.equals(action)) {
             handleLocaleChanged();
         } else if (ACTION_CLEAR_NEW_MAIL_NOTIFICATIONS.equals(action)) {
-            final Account account = intent.getParcelableExtra(ACCOUNT_EXTRA);
-            final Folder folder = intent.getParcelableExtra(FOLDER_EXTRA);
+            final Account account = intent.getParcelableExtra(Utils.EXTRA_ACCOUNT);
+            final Folder folder = intent.getParcelableExtra(Utils.EXTRA_FOLDER);
 
             NotificationUtils.clearFolderNotification(this, account, folder);
         } else if (ACTION_RESEND_NOTIFICATIONS.equals(action)) {
             NotificationUtils.resendNotifications(this, false);
         } else if (ACTION_MARK_SEEN.equals(action)) {
-            final Folder folder = intent.getParcelableExtra(FOLDER_EXTRA);
+            final Folder folder = intent.getParcelableExtra(Utils.EXTRA_FOLDER);
 
             NotificationUtils.markSeen(this, folder);
         } else if (Intent.ACTION_DEVICE_STORAGE_LOW.equals(action)) {
diff --git a/src/com/android/mail/compose/ComposeActivity.java b/src/com/android/mail/compose/ComposeActivity.java
index 5d5b44f..b4b32a9 100644
--- a/src/com/android/mail/compose/ComposeActivity.java
+++ b/src/com/android/mail/compose/ComposeActivity.java
@@ -414,8 +414,8 @@
             final Intent clearNotifIntent =
                     new Intent(MailIntentService.ACTION_CLEAR_NEW_MAIL_NOTIFICATIONS);
             clearNotifIntent.setPackage(getPackageName());
-            clearNotifIntent.putExtra(MailIntentService.ACCOUNT_EXTRA, account);
-            clearNotifIntent.putExtra(MailIntentService.FOLDER_EXTRA, notificationFolder);
+            clearNotifIntent.putExtra(Utils.EXTRA_ACCOUNT, account);
+            clearNotifIntent.putExtra(Utils.EXTRA_FOLDER, notificationFolder);
 
             startService(clearNotifIntent);
         }
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index 1902670..5145d32 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -1774,9 +1774,18 @@
             }
             // Put the folder and conversation, and ask the loader to create this folder.
             final Bundle args = new Bundle();
-            final Uri folderUri = intent.hasExtra(Utils.EXTRA_FOLDER_URI)
-                    ? (Uri) intent.getParcelableExtra(Utils.EXTRA_FOLDER_URI)
-                    : mAccount.settings.defaultInbox;
+
+            final Uri folderUri;
+            if (intent.hasExtra(Utils.EXTRA_FOLDER_URI)) {
+                folderUri = (Uri) intent.getParcelableExtra(Utils.EXTRA_FOLDER_URI);
+            } else if (intent.hasExtra(Utils.EXTRA_FOLDER)) {
+                final Folder folder =
+                        Folder.fromString(intent.getStringExtra(Utils.EXTRA_FOLDER));
+                folderUri = folder.uri;
+            } else {
+                folderUri = mAccount.settings.defaultInbox;
+            }
+
             args.putParcelable(Utils.EXTRA_FOLDER_URI, folderUri);
             args.putParcelable(Utils.EXTRA_CONVERSATION,
                     intent.getParcelableExtra(Utils.EXTRA_CONVERSATION));
diff --git a/src/com/android/mail/utils/NotificationActionUtils.java b/src/com/android/mail/utils/NotificationActionUtils.java
index c033a8b..89e96ad 100644
--- a/src/com/android/mail/utils/NotificationActionUtils.java
+++ b/src/com/android/mail/utils/NotificationActionUtils.java
@@ -704,7 +704,7 @@
             final Context context, final Folder folder, final Conversation conversation) {
         final Intent intent = new Intent(MailIntentService.ACTION_MARK_SEEN);
         intent.setPackage(context.getPackageName());
-        intent.putExtra(MailIntentService.FOLDER_EXTRA, folder);
+        intent.putExtra(Utils.EXTRA_FOLDER, folder);
         intent.putExtra(MailIntentService.CONVERSATION_EXTRA, conversation);
 
         context.startService(intent);
diff --git a/src/com/android/mail/utils/NotificationUtils.java b/src/com/android/mail/utils/NotificationUtils.java
index 75073d9..764bbe4 100644
--- a/src/com/android/mail/utils/NotificationUtils.java
+++ b/src/com/android/mail/utils/NotificationUtils.java
@@ -489,8 +489,8 @@
             cancelNotificationIntent.setPackage(context.getPackageName());
             cancelNotificationIntent.setData(Utils.appendVersionQueryParameter(context,
                     folder.uri));
-            cancelNotificationIntent.putExtra(MailIntentService.ACCOUNT_EXTRA, account);
-            cancelNotificationIntent.putExtra(MailIntentService.FOLDER_EXTRA, folder);
+            cancelNotificationIntent.putExtra(Utils.EXTRA_ACCOUNT, account);
+            cancelNotificationIntent.putExtra(Utils.EXTRA_FOLDER, folder);
 
             notification.setDeleteIntent(PendingIntent.getService(
                     context, notificationId, cancelNotificationIntent, 0));
diff --git a/src/com/android/mail/utils/Utils.java b/src/com/android/mail/utils/Utils.java
index f8dca3f..3204258 100644
--- a/src/com/android/mail/utils/Utils.java
+++ b/src/com/android/mail/utils/Utils.java
@@ -95,6 +95,7 @@
     public static final String EXTRA_ACCOUNT = "account";
     public static final String EXTRA_ACCOUNT_URI = "accountUri";
     public static final String EXTRA_FOLDER_URI = "folderUri";
+    public static final String EXTRA_FOLDER = "folder";
     public static final String EXTRA_COMPOSE_URI = "composeUri";
     public static final String EXTRA_CONVERSATION = "conversationUri";
 
diff --git a/src/com/android/mail/widget/BaseWidgetProvider.java b/src/com/android/mail/widget/BaseWidgetProvider.java
index fe8c8e8..eb36181 100644
--- a/src/com/android/mail/widget/BaseWidgetProvider.java
+++ b/src/com/android/mail/widget/BaseWidgetProvider.java
@@ -48,7 +48,6 @@
 import java.util.Set;
 
 public abstract class BaseWidgetProvider extends AppWidgetProvider {
-    public static final String EXTRA_ACCOUNT = "account";
     public static final String EXTRA_FOLDER_TYPE = "folder-type";
     public static final String EXTRA_FOLDER_URI = "folder-uri";
     public static final String EXTRA_FOLDER_CONVERSATION_LIST_URI = "folder-conversation-list-uri";
@@ -122,7 +121,7 @@
         final String action = intent.getAction();
         if (ACTION_UPDATE_WIDGET.equals(action)) {
             final int widgetId = intent.getIntExtra(EXTRA_WIDGET_ID, -1);
-            final Account account = Account.newinstance(intent.getStringExtra(EXTRA_ACCOUNT));
+            final Account account = Account.newinstance(intent.getStringExtra(Utils.EXTRA_ACCOUNT));
             final int folderType = intent.getIntExtra(EXTRA_FOLDER_TYPE, FolderType.DEFAULT);
             final Uri folderUri = intent.getParcelableExtra(EXTRA_FOLDER_URI);
             final Uri folderConversationListUri =
@@ -291,7 +290,7 @@
 
         updateWidgetIntent.setType(account.mimeType);
         updateWidgetIntent.putExtra(EXTRA_WIDGET_ID, appWidgetId);
-        updateWidgetIntent.putExtra(EXTRA_ACCOUNT, account.serialize());
+        updateWidgetIntent.putExtra(Utils.EXTRA_ACCOUNT, account.serialize());
         updateWidgetIntent.putExtra(EXTRA_FOLDER_TYPE, folderType);
         updateWidgetIntent.putExtra(EXTRA_FOLDER_URI, folderUri);
         updateWidgetIntent.putExtra(EXTRA_FOLDER_CONVERSATION_LIST_URI, folderConversationListUri);
diff --git a/src/com/android/mail/widget/WidgetService.java b/src/com/android/mail/widget/WidgetService.java
index 84dc6c0..25c09a4 100644
--- a/src/com/android/mail/widget/WidgetService.java
+++ b/src/com/android/mail/widget/WidgetService.java
@@ -120,7 +120,7 @@
         // Launch an intent to avoid ANRs
         final Intent intent = new Intent(context, serviceClass);
         intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
-        intent.putExtra(BaseWidgetProvider.EXTRA_ACCOUNT, account.serialize());
+        intent.putExtra(Utils.EXTRA_ACCOUNT, account.serialize());
         intent.putExtra(BaseWidgetProvider.EXTRA_FOLDER_TYPE, folderType);
         intent.putExtra(BaseWidgetProvider.EXTRA_FOLDER_URI, folderUri);
         intent.putExtra(BaseWidgetProvider.EXTRA_FOLDER_CONVERSATION_LIST_URI,
@@ -224,7 +224,7 @@
             mContext = context;
             mAppWidgetId = intent.getIntExtra(
                     AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
-            mAccount = Account.newinstance(intent.getStringExtra(WidgetProvider.EXTRA_ACCOUNT));
+            mAccount = Account.newinstance(intent.getStringExtra(Utils.EXTRA_ACCOUNT));
             mFolderType = intent.getIntExtra(WidgetProvider.EXTRA_FOLDER_TYPE, FolderType.DEFAULT);
             mFolderDisplayName = intent.getStringExtra(WidgetProvider.EXTRA_FOLDER_DISPLAY_NAME);
 
@@ -236,7 +236,7 @@
                 mFolderConversationListUri = folderConversationListUri;
             } else {
                 // This is a old intent created in version UR8 (or earlier).
-                String folderString = intent.getStringExtra("folder");
+                String folderString = intent.getStringExtra(Utils.EXTRA_FOLDER);
                 Folder folder = Folder.fromString(folderString);
                 mFolderUri = folder.uri;
                 mFolderConversationListUri = folder.conversationListUri;