Merge "Revert "NPE in TwoPaneController"" into jb-ub-mail-ur10
diff --git a/res/layout/conversation_message_details_header_expanded.xml b/res/layout/conversation_message_details_header_expanded.xml
index af2bcbf..f63cac6 100644
--- a/res/layout/conversation_message_details_header_expanded.xml
+++ b/res/layout/conversation_message_details_header_expanded.xml
@@ -26,7 +26,7 @@
     android:paddingLeft="@dimen/message_details_header_padding_start_collapsed"
     android:paddingRight="@dimen/message_details_header_padding_end"
     app:columnCount="3"
-    app:rowCount="5" >
+    app:rowCount="6" >
 
     <TextView
         android:id="@+id/from_heading"
@@ -143,5 +143,26 @@
         app:layout_row="4"
         android:visibility="gone"
         style="@style/MessageDetailsValueStyle" />
+    <TextView
+        android:id="@+id/date_heading"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="@dimen/message_header_inner_side_padding"
+        android:layout_marginRight="@dimen/message_header_inner_side_padding"
+        app:layout_column="0"
+        app:layout_row="5"
+        android:text="@string/date_heading"
+        android:visibility="gone"
+        style="@style/MessageHeaderSmallStyle" />
+    <TextView
+        android:id="@+id/date_details"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        app:layout_gravity="fill_horizontal"
+        android:layout_marginBottom="4dp"
+        app:layout_column="1"
+        app:layout_row="5"
+        android:visibility="gone"
+        style="@style/MessageDetailsValueStyle" />
 
 </android.support.v7.widget.GridLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 67ebd10..d4106d6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -440,9 +440,9 @@
           viewing it. [CHAR LIMIT=40] -->
     <string name="add_label">Add folder</string>
 
-    <!-- New Message notification text that appears over conversation view on incoming message. [CHAR LIMIT=30] -->
+    <!-- New Message notification text that appears over conversation view on incoming message. [CHAR LIMIT=40] -->
     <string name="new_incoming_messages_one">New message from <xliff:g id="sender">%s</xliff:g>. Show.</string>
-    <!-- New Message notification text that appears over conversation view on incoming messages. Will only be used if there is more than one new message. [CHAR LIMIT=30] -->
+    <!-- New Message notification text that appears over conversation view on incoming messages. Will only be used if there is more than one new message. [CHAR LIMIT=40] -->
     <plurals name="new_incoming_messages_many">
         <item quantity="other"><xliff:g id="count">%1$d</xliff:g> new messages. Show.</item>
     </plurals>
@@ -461,18 +461,18 @@
     <plurals name="show_messages_read">
         <item quantity="other"><xliff:g id="count" example="4">%1$d</xliff:g> older messages</item>
     </plurals>
-
+    <!-- Shown to display the from address of the message [CHAR LIMIT=10] -->
     <string name="from_heading">From:\u0020</string>
     <!-- Shown to display the reply to address of the message [CHAR LIMIT=20] -->
     <string name="replyto_heading">Reply-to:\u0020</string>
-    <!-- Shown to display the recipient(s) of the message [CHAR LIMIT=10] -->
-    <!-- Shown in HTML to display the recipient(s) of the message [CHAR LIMIT=10] -->
+    <!-- Shown to display the to recipient(s) of the message [CHAR LIMIT=10] -->
     <string name="to_heading">To:\u0020</string>
-    <!-- Shown in HTML to display the recipient(s) of the message [CHAR LIMIT=10] -->
+    <!-- Shown to display the cc recipient(s) of the message [CHAR LIMIT=10] -->
     <string name="cc_heading">Cc:\u0020</string>
-    <!-- Shown in HTML to display the recipient(s) of the message [CHAR LIMIT=10] -->
+    <!-- Shown to display the bcc recipient(s) of the message [CHAR LIMIT=10] -->
     <string name="bcc_heading">Bcc:\u0020</string>
-    <!-- Shown to display the from address of the message [CHAR LIMIT=10] -->
+    <!-- Shown to display the recipient(s) of the message [CHAR LIMIT=10] -->
+    <string name="date_heading">Date:\u0020</string>
     <!-- Displayed above an HTML message to show the images in that message [CHAR LIMIT=40] -->
     <string name="show_images">Show pictures</string>
     <!-- Displayed above an HTML message to always show images in messages from that sender [CHAR LIMIT=40] -->
diff --git a/src/com/android/mail/browse/MessageHeaderDetailsDialogFragment.java b/src/com/android/mail/browse/MessageHeaderDetailsDialogFragment.java
index b6e6603..92a4f3c 100644
--- a/src/com/android/mail/browse/MessageHeaderDetailsDialogFragment.java
+++ b/src/com/android/mail/browse/MessageHeaderDetailsDialogFragment.java
@@ -45,6 +45,7 @@
     private static final String ARG_TO = "to";
     private static final String ARG_CC = "cc";
     private static final String ARG_BCC = "bcc";
+    private static final String ARG_RECEIVED_TIME = "received-timestamp";
 
     // Public no-args constructor needed for fragment re-instantiation
     public MessageHeaderDetailsDialogFragment() {}
@@ -63,7 +64,7 @@
      */
     public static MessageHeaderDetailsDialogFragment newInstance(
             Map<String, Address> addressCache, Account account, String[] from, String[] replyTo,
-            String[] to, String[] cc, String[] bcc) {
+            String[] to, String[] cc, String[] bcc, CharSequence receivedTimestamp) {
         final MessageHeaderDetailsDialogFragment f = new MessageHeaderDetailsDialogFragment();
 
         // Supply needed items as arguments
@@ -83,6 +84,7 @@
         args.putStringArray(ARG_TO, to);
         args.putStringArray(ARG_CC, cc);
         args.putStringArray(ARG_BCC, bcc);
+        args.putCharSequence(ARG_RECEIVED_TIME, receivedTimestamp);
         f.setArguments(args);
 
         return f;
@@ -115,7 +117,7 @@
                 addressCache, (Account) args.getParcelable(ARG_ACCOUNT), null,
                 args.getStringArray(ARG_FROM), args.getStringArray(ARG_REPLY_TO),
                 args.getStringArray(ARG_TO), args.getStringArray(ARG_CC),
-                args.getStringArray(ARG_BCC));
+                args.getStringArray(ARG_BCC), args.getCharSequence(ARG_RECEIVED_TIME));
 
         expandedDetails.findViewById(R.id.details_expander)
                 .setVisibility(View.GONE);
diff --git a/src/com/android/mail/browse/MessageHeaderView.java b/src/com/android/mail/browse/MessageHeaderView.java
index 9f736d5..ed47bf5 100644
--- a/src/com/android/mail/browse/MessageHeaderView.java
+++ b/src/com/android/mail/browse/MessageHeaderView.java
@@ -1279,7 +1279,8 @@
         }
         if (!mExpandedDetailsValid) {
             renderExpandedDetails(getResources(), mExpandedDetailsView, mMessage.viaDomain,
-                    mAddressCache, getAccount(), mVeiledMatcher, mFrom, mReplyTo, mTo, mCc, mBcc);
+                    mAddressCache, getAccount(), mVeiledMatcher, mFrom, mReplyTo, mTo, mCc, mBcc,
+                    mMessageHeaderItem.getTimestampLong());
 
             mExpandedDetailsValid = true;
         }
@@ -1294,7 +1295,7 @@
     public static void renderExpandedDetails(Resources res, View detailsView,
             String viaDomain, Map<String, Address> addressCache, Account account,
             VeiledAddressMatcher veiledMatcher, String[] from, String[] replyTo,
-            String[] to, String[] cc, String[] bcc) {
+            String[] to, String[] cc, String[] bcc, CharSequence receivedTimestamp) {
         renderEmailList(res, R.id.from_heading, R.id.from_details, from, viaDomain,
                 detailsView, addressCache, account, veiledMatcher);
         renderEmailList(res, R.id.replyto_heading, R.id.replyto_details, replyTo, viaDomain,
@@ -1305,6 +1306,12 @@
                 detailsView, addressCache, account, veiledMatcher);
         renderEmailList(res, R.id.bcc_heading, R.id.bcc_details, bcc, viaDomain,
                 detailsView, addressCache, account, veiledMatcher);
+
+        // Render date
+        detailsView.findViewById(R.id.date_heading).setVisibility(VISIBLE);
+        final TextView date = (TextView) detailsView.findViewById(R.id.date_details);
+        date.setText(receivedTimestamp);
+        date.setVisibility(VISIBLE);
     }
 
     /**
@@ -1383,7 +1390,8 @@
         mDetailsPopup = (DialogFragment) manager.findFragmentByTag(DETAILS_DIALOG_TAG);
         if (mDetailsPopup == null) {
             mDetailsPopup = MessageHeaderDetailsDialogFragment.newInstance(
-                    mAddressCache, getAccount(), mFrom, mReplyTo, mTo, mCc, mBcc);
+                    mAddressCache, getAccount(), mFrom, mReplyTo, mTo, mCc, mBcc,
+                    mMessageHeaderItem.getTimestampLong());
             mDetailsPopup.show(manager, DETAILS_DIALOG_TAG);
         }
     }
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index 7bd5e79..ad59023 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -842,12 +842,6 @@
                 ? DrawerLayout.LOCK_MODE_UNLOCKED : DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
 
         mDrawerContainer.closeDrawers();
-
-        if (mFolder == null || !mFolder.equals(folder)) {
-            // We are actually changing the folder, so exit cab mode
-            exitCabMode();
-        }
-
         changeFolder(folder, null, force);
     }
 
@@ -4285,23 +4279,19 @@
                 // Now try to load our parent
                 final Folder folder;
 
-                if (mFolder != null) {
-                    final Cursor cursor = mContext.getContentResolver().query(mFolder.parent,
-                            UIProvider.FOLDERS_PROJECTION, null, null, null);
+                final Cursor cursor = mContext.getContentResolver().query(mFolder.parent,
+                        UIProvider.FOLDERS_PROJECTION, null, null, null);
 
-                    if (cursor == null) {
-                        // We couldn't load the parent, so use the inbox
-                        folder = mInbox;
-                    } else {
-                        try {
-                            cursor.moveToFirst();
-                            folder = new Folder(cursor);
-                        } finally {
-                            cursor.close();
-                        }
-                    }
-                } else {
+                if (cursor == null) {
+                    // We couldn't load the parent, so use the inbox
                     folder = mInbox;
+                } else {
+                    try {
+                        cursor.moveToFirst();
+                        folder = new Folder(cursor);
+                    } finally {
+                        cursor.close();
+                    }
                 }
 
                 return folder;
diff --git a/src/com/android/mail/ui/TwoPaneController.java b/src/com/android/mail/ui/TwoPaneController.java
index e3a88c6..0269b56 100644
--- a/src/com/android/mail/ui/TwoPaneController.java
+++ b/src/com/android/mail/ui/TwoPaneController.java
@@ -159,6 +159,12 @@
     }
 
     @Override
+    public void onFolderChanged(Folder folder, final boolean force) {
+        super.onFolderChanged(folder, force);
+        exitCabMode();
+    }
+
+    @Override
     public void onFolderSelected(Folder folder) {
         // It's possible that we are not in conversation list mode
         if (mViewMode.getMode() != ViewMode.CONVERSATION_LIST) {
@@ -574,11 +580,13 @@
         final int containerViewId = TwoPaneLayout.MISCELLANEOUS_VIEW_ID;
 
         final FragmentManager fragmentManager = mActivity.getFragmentManager();
-        final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
-        fragmentTransaction.addToBackStack(null);
-        fragmentTransaction.replace(containerViewId, fragment, TAG_CUSTOM_FRAGMENT);
-        mMiscellaneousViewTransactionId = fragmentTransaction.commitAllowingStateLoss();
-        fragmentManager.executePendingTransactions();
+        if (fragmentManager.findFragmentByTag(TAG_CUSTOM_FRAGMENT) == null) {
+            final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
+            fragmentTransaction.addToBackStack(null);
+            fragmentTransaction.replace(containerViewId, fragment, TAG_CUSTOM_FRAGMENT);
+            mMiscellaneousViewTransactionId = fragmentTransaction.commitAllowingStateLoss();
+            fragmentManager.executePendingTransactions();
+        }
 
         if (selectPosition >= 0) {
             getConversationListFragment().setRawSelected(selectPosition, true);
diff --git a/src/com/android/mail/ui/TwoPaneLayout.java b/src/com/android/mail/ui/TwoPaneLayout.java
index f4276a3..98687be 100644
--- a/src/com/android/mail/ui/TwoPaneLayout.java
+++ b/src/com/android/mail/ui/TwoPaneLayout.java
@@ -450,7 +450,7 @@
                 break;
             case ViewMode.AD:
                 dispatchConversationVisibilityChanged(false);
-                dispatchConversationListVisibilityChange(false);
+                dispatchConversationListVisibilityChange(!isConversationListCollapsed());
 
                 break;
             default: