Merge "Import translations. DO NOT MERGE" into jb-ub-mail-ur10
diff --git a/res/menu-sw600dp-land/conversation_actions.xml b/res/menu-sw600dp-land/conversation_actions.xml
index 3a74345..a9ff1ef 100644
--- a/res/menu-sw600dp-land/conversation_actions.xml
+++ b/res/menu-sw600dp-land/conversation_actions.xml
@@ -78,7 +78,7 @@
 
     <!-- Always available -->
     <item
-        android:id="@+id/change_folder"
+        android:id="@+id/change_folders"
         android:title="@string/menu_change_folders"
         android:showAsAction="never"
         android:icon="@drawable/ic_menu_folders_holo_light" />
diff --git a/res/menu-sw600dp-land/conversation_list_search_results_actions.xml b/res/menu-sw600dp-land/conversation_list_search_results_actions.xml
index b57f539..42cbfd6 100644
--- a/res/menu-sw600dp-land/conversation_list_search_results_actions.xml
+++ b/res/menu-sw600dp-land/conversation_list_search_results_actions.xml
@@ -37,7 +37,7 @@
 
     <!-- Always available -->
     <item
-        android:id="@+id/change_folder"
+        android:id="@+id/change_folders"
         android:title="@string/menu_change_folders"
         android:showAsAction="never"
         android:icon="@drawable/ic_menu_folders_holo_light" />
diff --git a/res/menu/ad_actions.xml b/res/menu/ad_actions.xml
new file mode 100644
index 0000000..7f4c542
--- /dev/null
+++ b/res/menu/ad_actions.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+     Copyright (C) 2013 Google Inc.
+     Licensed to 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.
+  -->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:id="@+id/star"
+          android:showAsAction="always"
+          android:title="@string/add_star"
+          android:icon="@drawable/ic_star_off_convo_view_holo_light" />
+
+    <item android:id="@+id/remove_star"
+          android:showAsAction="always"
+          android:title="@string/remove_star"
+          android:icon="@drawable/ic_star_on_convo_view_holo_light" />
+
+    <item android:id="@+id/delete"
+          android:showAsAction="always"
+          android:title="@string/delete"
+          android:icon="@drawable/ic_menu_trash_holo_light"/>
+
+    <item android:id="@+id/forward"
+          android:showAsAction="always"
+          android:title="@string/forward"
+          android:icon="@drawable/ic_forward_holo_light" />
+
+    <!-- Always available -->
+    <item android:id="@+id/settings"
+          android:showAsAction="never"
+          android:title="@string/menu_settings" />
+
+    <!-- Always available -->
+    <item android:id="@+id/feedback_menu_item"
+          android:showAsAction="never"
+          android:title="@string/feedback" />
+
+    <!-- Always available -->
+    <item android:id="@+id/help_info_menu_item"
+          android:showAsAction="never"
+          android:title="@string/help_and_info" />
+</menu>
\ No newline at end of file
diff --git a/res/menu/conversation_actions.xml b/res/menu/conversation_actions.xml
index 9d63506..6f408f2 100644
--- a/res/menu/conversation_actions.xml
+++ b/res/menu/conversation_actions.xml
@@ -67,7 +67,7 @@
 
     <!-- Always available -->
     <item
-        android:id="@+id/change_folder"
+        android:id="@+id/change_folders"
         android:title="@string/menu_change_folders"
         android:showAsAction="never"
         android:icon="@drawable/ic_menu_folders_holo_light" />
diff --git a/res/menu/conversation_list_selection_actions_menu.xml b/res/menu/conversation_list_selection_actions_menu.xml
index b866497..8447068 100644
--- a/res/menu/conversation_list_selection_actions_menu.xml
+++ b/res/menu/conversation_list_selection_actions_menu.xml
@@ -73,7 +73,7 @@
         android:icon="@drawable/ic_menu_move_to_holo_light" />
 
     <item
-        android:id="@+id/change_folder"
+        android:id="@+id/change_folders"
         android:showAsAction="never"
         android:title="@string/menu_change_folders"
         android:icon="@drawable/ic_menu_folders_holo_light" />
diff --git a/src/com/android/mail/browse/ConversationItemView.java b/src/com/android/mail/browse/ConversationItemView.java
index af91d60..11997bd 100644
--- a/src/com/android/mail/browse/ConversationItemView.java
+++ b/src/com/android/mail/browse/ConversationItemView.java
@@ -1638,17 +1638,17 @@
      * drag, if drag is enabled.
      */
     @Override
-    public void toggleSelectedStateOrBeginDrag() {
+    public boolean toggleSelectedStateOrBeginDrag() {
         ViewMode mode = mActivity.getViewMode();
         if (mIsExpansiveTablet && mode.isListMode()) {
-            beginDragMode();
+            return beginDragMode();
         } else {
-            toggleSelectedState();
+            return toggleSelectedState();
         }
     }
 
     @Override
-    public void toggleSelectedState() {
+    public boolean toggleSelectedState() {
         if (mHeader != null && mHeader.conversation != null && mSelectedConversationSet != null) {
             mSelected = !mSelected;
             setSelected(mSelected);
@@ -1673,7 +1673,11 @@
             // usually waits for a layout pass, but we don't need a full layout,
             // just an update to the background.
             requestLayout();
+
+            return true;
         }
+
+        return false;
     }
 
     /**
@@ -2027,9 +2031,9 @@
     /**
      * Begin drag mode. Keep the conversation selected (NOT toggle selection) and start drag.
      */
-    private void beginDragMode() {
-        if (mLastTouchX < 0 || mLastTouchY < 0) {
-            return;
+    private boolean beginDragMode() {
+        if (mLastTouchX < 0 || mLastTouchY < 0 ||  mSelectedConversationSet == null) {
+            return false;
         }
         // If this is already checked, don't bother unchecking it!
         if (!mSelected) {
@@ -2053,11 +2057,13 @@
         if (isDimensionNegative) {
             LogUtils.e(LOG_TAG, "ConversationItemView: dimension is negative: "
                         + "width=%d, height=%d", width, height);
-            return;
+            return false;
         }
         mActivity.startDragMode();
         // Start drag mode
         startDrag(data, new ShadowBuilder(this, count, mLastTouchX, mLastTouchY), null, 0);
+
+        return true;
     }
 
     /**
diff --git a/src/com/android/mail/browse/SelectedConversationsActionMenu.java b/src/com/android/mail/browse/SelectedConversationsActionMenu.java
index 8c4c7b4..bd3f570 100644
--- a/src/com/android/mail/browse/SelectedConversationsActionMenu.java
+++ b/src/com/android/mail/browse/SelectedConversationsActionMenu.java
@@ -157,7 +157,7 @@
                 LogUtils.d(LOG_TAG, "Not in a starred folder.");
                 starConversations(false);
             }
-        } else if (itemId == R.id.move_to || itemId == R.id.change_folder) {
+        } else if (itemId == R.id.move_to || itemId == R.id.change_folders) {
             boolean cantMove = false;
             Account acct = mAccount;
             // Special handling for virtual folders
diff --git a/src/com/android/mail/browse/SendersView.java b/src/com/android/mail/browse/SendersView.java
index f69a20c..48646ec 100644
--- a/src/com/android/mail/browse/SendersView.java
+++ b/src/com/android/mail/browse/SendersView.java
@@ -396,19 +396,16 @@
             getSenderResources(context, resourceCachingRequired);
             // Clear any existing sender fragments; we must re-make all of them.
             header.senderFragments.clear();
-            String[] senders = TextUtils.split(sendersString, Address.ADDRESS_DELIMETER);
-            String[] namesOnly = new String[senders.length];
-            Rfc822Token[] senderTokens;
+            // TODO: unify this with ConversationItemView.calculateTextsAndBitmaps's tokenization
+            final Rfc822Token[] senders = Rfc822Tokenizer.tokenize(sendersString);
+            final String[] namesOnly = new String[senders.length];
             String display;
             for (int i = 0; i < senders.length; i++) {
-                senderTokens = Rfc822Tokenizer.tokenize(senders[i]);
-                if (senderTokens != null && senderTokens.length > 0) {
-                    display = Address.decodeAddressName(senderTokens[0].getName());
-                    if (TextUtils.isEmpty(display)) {
-                        display = senderTokens[0].getAddress();
-                    }
-                    namesOnly[i] = display;
+                display = Address.decodeAddressName(senders[i].getName());
+                if (TextUtils.isEmpty(display)) {
+                    display = senders[i].getAddress();
                 }
+                namesOnly[i] = display;
             }
             generateSenderFragments(header, namesOnly, readStyleSpan);
         } finally {
diff --git a/src/com/android/mail/browse/SwipeableConversationItemView.java b/src/com/android/mail/browse/SwipeableConversationItemView.java
index 7396e7b..96bf59d 100644
--- a/src/com/android/mail/browse/SwipeableConversationItemView.java
+++ b/src/com/android/mail/browse/SwipeableConversationItemView.java
@@ -78,17 +78,21 @@
     }
 
     @Override
-    public void toggleSelectedStateOrBeginDrag() {
+    public boolean toggleSelectedStateOrBeginDrag() {
         if (mConversationItemView != null) {
-            mConversationItemView.toggleSelectedStateOrBeginDrag();
+            return mConversationItemView.toggleSelectedStateOrBeginDrag();
         }
+
+        return false;
     }
 
     @Override
-    public void toggleSelectedState() {
+    public boolean toggleSelectedState() {
         if (mConversationItemView != null) {
-            mConversationItemView.toggleSelectedState();
+            return mConversationItemView.toggleSelectedState();
         }
+
+        return false;
     }
 
     @Override
diff --git a/src/com/android/mail/browse/ToggleableItem.java b/src/com/android/mail/browse/ToggleableItem.java
index 2b7e739..b2cfa94 100644
--- a/src/com/android/mail/browse/ToggleableItem.java
+++ b/src/com/android/mail/browse/ToggleableItem.java
@@ -18,6 +18,6 @@
 package com.android.mail.browse;
 
 public interface ToggleableItem {
-    void toggleSelectedStateOrBeginDrag();
-    void toggleSelectedState();
+    boolean toggleSelectedStateOrBeginDrag();
+    boolean toggleSelectedState();
 }
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index 01024a8..c25d1d2 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -1313,6 +1313,10 @@
             return true;
         }
 
+        if (mActivity.getViewMode().isAdMode()) {
+            return onAdOptionsItemSelected(item);
+        }
+
         final int id = item.getItemId();
         LogUtils.d(LOG_TAG, "AbstractController.onOptionsItemSelected(%d) called.", id);
         boolean handled = true;
@@ -1377,7 +1381,7 @@
             Utils.sendFeedback(mActivity, mAccount, false);
         } else if (id == R.id.manage_folders_item) {
             Utils.showManageFolder(mActivity.getActivityContext(), mAccount);
-        } else if (id == R.id.move_to || id == R.id.change_folder) {
+        } else if (id == R.id.move_to || id == R.id.change_folders) {
             final FolderSelectionDialog dialog = FolderSelectionDialog.getInstance(
                     mActivity.getActivityContext(), mAccount, this,
                     Conversation.listOf(mCurrentConversation), isBatch, mFolder,
@@ -1413,6 +1417,31 @@
         return handled;
     }
 
+    private boolean onAdOptionsItemSelected(MenuItem item) {
+        final int id = item.getItemId();
+        if (id == android.R.id.home) {
+            onUpPressed();
+        } else if (id == R.id.star) {
+
+        } else if (id == R.id.remove_star) {
+
+        } else if (id == R.id.forward) {
+
+        } else if (id == R.id.delete) {
+
+        } else if (id == R.id.settings) {
+            Utils.showSettings(mActivity.getActivityContext(), mAccount);
+        } else if (id == R.id.help_info_menu_item) {
+            Utils.showHelp(mActivity.getActivityContext(), mAccount, getHelpContext());
+        } else if (id == R.id.feedback_menu_item) {
+            Utils.sendFeedback(mActivity, mAccount, false);
+        } else {
+            return false;
+        }
+
+        return true;
+    }
+
     /**
      * Opens an {@link EmptyFolderDialogFragment} for the current folder.
      */
@@ -2065,6 +2094,11 @@
         if (!ViewMode.isConversationMode(newMode)) {
             setCurrentConversation(null);
         }
+
+        if (!ViewMode.isAdMode(newMode)) {
+            setCurrentStarrable(null);
+        }
+
         // If the viewmode is not set, preserve existing icon.
         if (newMode != ViewMode.UNKNOWN) {
             resetActionBarIcon();
@@ -2459,6 +2493,11 @@
         }
     }
 
+    @Override
+    public void setCurrentStarrable(Starrable starrable) {
+        mActionBarView.setCurrentStarrable(starrable);
+    }
+
     /**
      * {@link LoaderManager} currently has a bug in
      * {@link LoaderManager#restartLoader(int, Bundle, android.app.LoaderManager.LoaderCallbacks)}
@@ -3182,7 +3221,7 @@
         // dragged/ dropped conversations.
         if (convListFragment != null) {
             LogUtils.d(LOG_TAG, "AAC.requestDelete: ListFragment is handling delete.");
-            convListFragment.requestDelete(R.id.change_folder, conversations,
+            convListFragment.requestDelete(R.id.change_folders, conversations,
                     new DroppedInStarredAction(conversations, mFolder, folder));
         }
     }
@@ -3204,7 +3243,7 @@
         @Override
         public void performAction() {
             ToastBarOperation undoOp = new ToastBarOperation(mConversations.size(),
-                    R.id.change_folder, ToastBarOperation.UNDO, true /* batch */, mInitialFolder);
+                    R.id.change_folders, ToastBarOperation.UNDO, true /* batch */, mInitialFolder);
             onUndoAvailable(undoOp);
             ArrayList<ConversationOperation> ops = new ArrayList<ConversationOperation>();
             ContentValues values = new ContentValues();
@@ -3770,7 +3809,7 @@
             Collection<FolderOperation> folders, boolean isDestructive, boolean isBatch,
             boolean showUndo, final boolean isMoveTo, final Folder actionFolder) {
         return new FolderDestruction(target, folders, isDestructive, isBatch, showUndo,
-                isMoveTo ? R.id.move_folder : R.id.change_folder, actionFolder);
+                isMoveTo ? R.id.move_folder : R.id.change_folders, actionFolder);
     }
 
     @Override
diff --git a/src/com/android/mail/ui/AbstractConversationViewFragment.java b/src/com/android/mail/ui/AbstractConversationViewFragment.java
index 0356ed5..52e5b5f 100644
--- a/src/com/android/mail/ui/AbstractConversationViewFragment.java
+++ b/src/com/android/mail/ui/AbstractConversationViewFragment.java
@@ -296,7 +296,7 @@
     @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         super.onCreateOptionsMenu(menu, inflater);
-        mChangeFoldersMenuItem = menu.findItem(R.id.change_folder);
+        mChangeFoldersMenuItem = menu.findItem(R.id.change_folders);
     }
 
     @Override
diff --git a/src/com/android/mail/ui/ControllableActivity.java b/src/com/android/mail/ui/ControllableActivity.java
index 03cee93..266416b 100644
--- a/src/com/android/mail/ui/ControllableActivity.java
+++ b/src/com/android/mail/ui/ControllableActivity.java
@@ -19,7 +19,6 @@
 
 import com.android.mail.browse.ConversationListFooterView;
 import com.android.mail.providers.Folder;
-import com.android.mail.ui.ViewMode.ModeChangeListener;
 
 /**
  * A controllable activity is an Activity that has a Controller attached. This activity must be
@@ -36,18 +35,6 @@
     ViewMode getViewMode();
 
     /**
-     * Sets the listener for receiving ViewMode changes.
-     * @param listener
-     */
-    void setViewModeListener(ModeChangeListener listener);
-
-    /**
-     * Removes the given listener from receiving ViewMode changes.
-     * @param listener
-     */
-    void unsetViewModeListener(ModeChangeListener listener);
-
-    /**
      * Returns the object that handles {@link ConversationListCallbacks} that is associated with
      * this activity.
      * @return
diff --git a/src/com/android/mail/ui/ConversationListCallbacks.java b/src/com/android/mail/ui/ConversationListCallbacks.java
index 370a265..09a354b 100644
--- a/src/com/android/mail/ui/ConversationListCallbacks.java
+++ b/src/com/android/mail/ui/ConversationListCallbacks.java
@@ -47,6 +47,7 @@
 
     Conversation getCurrentConversation();
     void setCurrentConversation(Conversation c);
+    void setCurrentStarrable(Starrable starrable);
 
     /**
      * Returns whether the initial conversation has begun but not finished loading. If this returns
diff --git a/src/com/android/mail/ui/ConversationListFragment.java b/src/com/android/mail/ui/ConversationListFragment.java
index 8e6fa24..d8b3d74 100644
--- a/src/com/android/mail/ui/ConversationListFragment.java
+++ b/src/com/android/mail/ui/ConversationListFragment.java
@@ -17,8 +17,6 @@
 
 package com.android.mail.ui;
 
-import com.google.common.collect.ImmutableList;
-
 import android.app.Activity;
 import android.app.ListFragment;
 import android.app.LoaderManager;
@@ -67,6 +65,7 @@
 import com.android.mail.utils.LogTag;
 import com.android.mail.utils.LogUtils;
 import com.android.mail.utils.Utils;
+import com.google.common.collect.ImmutableList;
 
 import java.util.Collection;
 import java.util.List;
@@ -529,7 +528,7 @@
         mListAdapter.destroy();
         mListView.setAdapter(null);
 
-        mActivity.unsetViewModeListener(this);
+        mActivity.getViewMode().removeListener(this);
         if (mFolderObserver != null) {
             mFolderObserver.unregisterAndDestroy();
             mFolderObserver = null;
@@ -571,8 +570,7 @@
         if (!(view instanceof ConversationItemView)) {
             return false;
         }
-        ((ConversationItemView) view).toggleSelectedStateOrBeginDrag();
-        return true;
+        return ((ConversationItemView) view).toggleSelectedStateOrBeginDrag();
     }
 
     /**
diff --git a/src/com/android/mail/ui/FolderSelectionActivity.java b/src/com/android/mail/ui/FolderSelectionActivity.java
index 90101cf..14a1089 100644
--- a/src/com/android/mail/ui/FolderSelectionActivity.java
+++ b/src/com/android/mail/ui/FolderSelectionActivity.java
@@ -37,7 +37,6 @@
 import com.android.mail.providers.Account;
 import com.android.mail.providers.Folder;
 import com.android.mail.providers.FolderWatcher;
-import com.android.mail.ui.ViewMode.ModeChangeListener;
 import com.android.mail.utils.LogTag;
 import com.android.mail.utils.LogUtils;
 import com.android.mail.utils.Observable;
@@ -328,14 +327,6 @@
     }
 
     @Override
-    public void setViewModeListener(ModeChangeListener listener) {
-    }
-
-    @Override
-    public void unsetViewModeListener(ModeChangeListener listener) {
-    }
-
-    @Override
     public ConversationListCallbacks getListHandler() {
         return null;
     }
diff --git a/src/com/android/mail/ui/MailActionBarView.java b/src/com/android/mail/ui/MailActionBarView.java
index 8dfe699..73ef8dc 100644
--- a/src/com/android/mail/ui/MailActionBarView.java
+++ b/src/com/android/mail/ui/MailActionBarView.java
@@ -106,6 +106,8 @@
 
     private FolderObserver mFolderObserver;
 
+    private Starrable mCurrentStarrable;
+
     /** A handler that changes the subtitle when it receives a message. */
     private final class SubtitleHandler extends Handler {
         /** Message sent to display the account email address in the subtitle. */
@@ -259,6 +261,8 @@
                 return R.menu.conversation_actions;
             case ViewMode.WAITING_FOR_ACCOUNT_INITIALIZATION:
                 return R.menu.wait_mode_actions;
+            case ViewMode.AD:
+                return R.menu.ad_actions;
         }
         LogUtils.wtf(LOG_TAG, "Menu requested for unknown view mode");
         return R.menu.conversation_list_menu;
@@ -331,6 +335,7 @@
                 setEmptyMode();
                 break;
             case ViewMode.CONVERSATION:
+            case ViewMode.AD:
                 closeSearchField();
                 mActionBar.setDisplayHomeAsUpEnabled(true);
                 setEmptyMode();
@@ -419,6 +424,11 @@
                 Utils.setMenuItemVisibility(menu, R.id.compose, false);
                 Utils.setMenuItemVisibility(menu, R.id.search, false);
                 break;
+            case ViewMode.AD:
+                final boolean isStarred = mCurrentStarrable.isStarred();
+                Utils.setMenuItemVisibility(menu, R.id.star, !isStarred);
+                Utils.setMenuItemVisibility(menu, R.id.remove_star, isStarred);
+                break;
         }
 
         return false;
@@ -495,7 +505,7 @@
                         menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
                         actionItems++;
                     }
-                } else if (itemId == R.id.change_folder) {
+                } else if (itemId == R.id.change_folders) {
                     final boolean showChangeFolder = account
                             .supportsCapability(AccountCapabilities.MULTIPLE_FOLDERS_PER_CONV);
                     menuItem.setVisible(showChangeFolder);
@@ -783,6 +793,10 @@
         mCurrentConversation = conversation;
     }
 
+    public void setCurrentStarrable(Starrable starrable) {
+        mCurrentStarrable = starrable;
+    }
+
     //We need to do this here instead of in the fragment
     public void setConversationModeOptions(Menu menu) {
         if (mCurrentConversation == null) {
diff --git a/src/com/android/mail/ui/MailActivity.java b/src/com/android/mail/ui/MailActivity.java
index bae406a..91ad082 100644
--- a/src/com/android/mail/ui/MailActivity.java
+++ b/src/com/android/mail/ui/MailActivity.java
@@ -36,7 +36,6 @@
 
 import com.android.mail.compose.ComposeActivity;
 import com.android.mail.providers.Folder;
-import com.android.mail.ui.ViewMode.ModeChangeListener;
 import com.android.mail.utils.StorageLowState;
 import com.android.mail.utils.Utils;
 
@@ -290,16 +289,6 @@
     }
 
     @Override
-    public void setViewModeListener(ModeChangeListener listener) {
-        mViewMode.addListener(listener);
-    }
-
-    @Override
-    public void unsetViewModeListener(ModeChangeListener listener) {
-        mViewMode.removeListener(listener);
-    }
-
-    @Override
     public ConversationListCallbacks getListHandler() {
         return mController;
     }
diff --git a/src/com/android/mail/ui/OnePaneController.java b/src/com/android/mail/ui/OnePaneController.java
index b4b6993..72680ad 100644
--- a/src/com/android/mail/ui/OnePaneController.java
+++ b/src/com/android/mail/ui/OnePaneController.java
@@ -286,7 +286,7 @@
                 || action == R.id.mark_not_spam
                 || action == R.id.report_phishing
                 || action == R.id.refresh
-                || action == R.id.change_folder) {
+                || action == R.id.change_folders) {
             return false;
         } else {
             return true;
@@ -348,7 +348,7 @@
             mActivity.finish();
         } else if (mViewMode.isListMode() && !inInbox(mAccount, mConvListContext)) {
             transitionToInbox();
-        } else if (mViewMode.isConversationMode()) {
+        } else if (mViewMode.isConversationMode() || mViewMode.isAdMode()) {
             transitionBackToConversationListMode(false /* inLoaderCallbacks */);
         } else {
             mActivity.finish();
@@ -436,7 +436,8 @@
             } else {
                 navigateUp();
             }
-        } else if (mode == ViewMode.CONVERSATION || mode == ViewMode.SEARCH_RESULTS_CONVERSATION) {
+        } else if (mode == ViewMode.CONVERSATION || mode == ViewMode.SEARCH_RESULTS_CONVERSATION
+                || mode == ViewMode.AD) {
             // Same as go back.
             handleBackPress();
         }
diff --git a/src/com/android/mail/ui/Starrable.java b/src/com/android/mail/ui/Starrable.java
new file mode 100644
index 0000000..34fc569
--- /dev/null
+++ b/src/com/android/mail/ui/Starrable.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2013 Google Inc.
+ * Licensed to 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.mail.ui;
+
+/**
+ * Interface for data types that can be starred for use in {@link MailActionBarView}.
+ */
+public interface Starrable {
+    public boolean isStarred();
+}
diff --git a/src/com/android/mail/ui/ToastBarOperation.java b/src/com/android/mail/ui/ToastBarOperation.java
index dd62a47..a01d54d 100644
--- a/src/com/android/mail/ui/ToastBarOperation.java
+++ b/src/com/android/mail/ui/ToastBarOperation.java
@@ -125,7 +125,7 @@
             resId = R.plurals.conversation_deleted;
         } else if (mAction == R.id.remove_folder) {
             return context.getString(R.string.folder_removed, mFolder.name);
-        } else if (mAction == R.id.change_folder) {
+        } else if (mAction == R.id.change_folders) {
             resId = R.plurals.conversation_folder_changed;
         } else if (mAction == R.id.move_folder) {
             return context.getString(R.string.conversation_folder_moved, mFolder.name);
diff --git a/src/com/android/mail/ui/ViewMode.java b/src/com/android/mail/ui/ViewMode.java
index aee794d..5847327 100644
--- a/src/com/android/mail/ui/ViewMode.java
+++ b/src/com/android/mail/ui/ViewMode.java
@@ -17,10 +17,11 @@
 
 package com.android.mail.ui;
 
+import android.os.Bundle;
+
 import com.android.mail.utils.LogUtils;
 import com.google.common.collect.Lists;
 
-import android.os.Bundle;
 import java.util.ArrayList;
 
 /**
@@ -62,6 +63,10 @@
      */
     public static final int WAITING_FOR_ACCOUNT_INITIALIZATION = 5;
     /**
+     * Mode when showing ads.
+     */
+    public static final int AD = 6;
+    /**
      * Uncertain mode. The mode has not been initialized.
      */
     public static final int UNKNOWN = 0;
@@ -149,6 +154,13 @@
     }
 
     /**
+     * Requests a transition of the mode to show an ad.
+     */
+    public void enterAdMode() {
+        setModeInternal(AD);
+    }
+
+    /**
      * @return The current mode.
      */
     public int getMode() {
@@ -186,6 +198,14 @@
         return mode == WAITING_FOR_ACCOUNT_INITIALIZATION;
     }
 
+    public boolean isAdMode() {
+        return isAdMode(mMode);
+    }
+
+    public static boolean isAdMode(final int mode) {
+        return mode == AD;
+    }
+
     /**
      * Restoring from a saved state restores only the mode. It does not restore the listeners of
      * this object.