implement view pager bottom position bar

Use a PagerTitleStrip.
pro: titles are now animated in the standard fashion as you
     swipe, non-primary titles are darker in the standard
     fashion
con: had to work around somewhat unsuitable API to support
     dynamic newer/older titles

Bug: 6498423
Change-Id: I8102dc328626951b08d3986eace5a1caa7db1acb
diff --git a/res/layout/conversation_pager.xml b/res/layout/conversation_pager.xml
index 9d876af..623d35d 100644
--- a/res/layout/conversation_pager.xml
+++ b/res/layout/conversation_pager.xml
@@ -19,8 +19,17 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/conversation_pane"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    android:visibility="gone">
 
-    <!-- TODO: put a bottom-anchored PagerTitleStrip in here -->
+    <android.support.v4.view.PagerTitleStrip
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_gravity="bottom"
+        android:paddingLeft="16dp"
+        android:paddingRight="16dp"
+        android:textAppearance="?android:attr/textAppearanceSmallInverse"
+        android:includeFontPadding="false"
+        android:background="@color/position_bar_background" />
 
 </com.android.mail.browse.ConversationPager>
\ No newline at end of file
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 63211f6..4bac510 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -52,6 +52,8 @@
     <color name="conv_subject_border">#c0c0c0</color>
     <color name="conv_header_text_light">#777777</color>
 
+    <color name="position_bar_background">#777777</color>
+
     <!-- Folder colors -->
     <color name="folder_disabled_drop_target_text_color">#999999</color>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index c32e4c2..1671718 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -448,6 +448,12 @@
     <!--  Text anchor for control to add / change labels on a conversation when
           viewing it. [CHAR LIMIT=40] -->
     <string name="add_label">Add label</string>
+    <!-- position bar label in conversation view: number out of total [CHAR LIMIT=50]-->
+    <string name="conversation_count"><xliff:g id="count">%1$s</xliff:g> of <xliff:g id="total">%2$s</xliff:g></string>
+    <!-- position bar label in conversation view: label for a newer conversation [CHAR LIMIT=20]-->
+    <string name="conversation_newer">Newer</string>
+    <!-- position bar label in conversation view: label for an older conversation [CHAR LIMIT=20]-->
+    <string name="conversation_older">Older</string>
 
     <!-- Conversation message header strings -->
     <!--  Icon name for expanding recipient details in a message when viewing it. [CHAR LIMIT=40] -->
diff --git a/src/com/android/mail/browse/ConversationPagerAdapter.java b/src/com/android/mail/browse/ConversationPagerAdapter.java
index 500f0b2..6ee24a1 100644
--- a/src/com/android/mail/browse/ConversationPagerAdapter.java
+++ b/src/com/android/mail/browse/ConversationPagerAdapter.java
@@ -19,12 +19,15 @@
 
 import android.app.Fragment;
 import android.app.FragmentManager;
+import android.content.res.Resources;
 import android.database.Cursor;
 import android.database.DataSetObserver;
 import android.os.Bundle;
 import android.os.Parcelable;
+import android.support.v4.view.ViewPager;
 import android.view.ViewGroup;
 
+import com.android.mail.R;
 import com.android.mail.providers.Account;
 import com.android.mail.providers.Conversation;
 import com.android.mail.providers.Folder;
@@ -57,12 +60,27 @@
      * setPrimary somehow adds or removes items from the conversation cursor. Crazy!
      */
     private boolean mSafeToNotify;
+    /**
+     * Need to keep this around to look up pager title strings.
+     */
+    private Resources mResources;
+    /**
+     * This isn't great to create a circular dependency, but our usage of {@link #getPageTitle(int)}
+     * requires knowing which page is the currently visible to dynamically name offscreen pages
+     * "newer" and "older". And {@link #setPrimaryItem(ViewGroup, int, Object)} does not work well
+     * because it isn't updated as often as {@link ViewPager#getCurrentItem()} is.
+     * <p>
+     * We must be careful to null out this reference when the pager and adapter are decoupled to
+     * minimize dangling references.
+     */
+    private ViewPager mPager;
 
     private static final String LOG_TAG = new LogUtils().getLogTag();
 
-    public ConversationPagerAdapter(FragmentManager fm, Account account, Folder folder,
-            Conversation initialConversation) {
+    public ConversationPagerAdapter(Resources res, FragmentManager fm, Account account,
+            Folder folder, Conversation initialConversation) {
         super(fm, false /* enableSavedStates */);
+        mResources = res;
         mCommonFragmentArgs = ConversationViewFragment.makeBasicArgs(account, folder);
         mInitialConversation = initialConversation;
     }
@@ -143,12 +161,16 @@
 
     @Override
     public CharSequence getPageTitle(int position) {
+        final String title;
+        final int currentPosition = mPager.getCurrentItem();
 
-        // TODO: implement this to show "1 of 123" or whatever
-        // maybe when the position is not the pager's current position, this could
-        // return "newer" or "older"?
-
-        return null;
+        if (position == currentPosition) {
+            title = mResources.getString(R.string.conversation_count, position + 1, getCount());
+        } else {
+            title = mResources.getString(position > currentPosition ?
+                    R.string.conversation_newer : R.string.conversation_older);
+        }
+        return title;
     }
 
     @Override
@@ -230,6 +252,10 @@
         return result;
     }
 
+    public void setPager(ViewPager pager) {
+        mPager = pager;
+    }
+
     public void setListController(ConversationListCallbacks listController) {
         if (mListController != null) {
             mListController.unregisterConversationListObserver(mListObserver);
diff --git a/src/com/android/mail/browse/ConversationPagerController.java b/src/com/android/mail/browse/ConversationPagerController.java
index 0f7296f..9e3abdf 100644
--- a/src/com/android/mail/browse/ConversationPagerController.java
+++ b/src/com/android/mail/browse/ConversationPagerController.java
@@ -19,6 +19,7 @@
 
 import android.app.FragmentManager;
 import android.support.v4.view.ViewPager;
+import android.view.View;
 
 import com.android.mail.R;
 import com.android.mail.providers.Account;
@@ -49,7 +50,7 @@
  */
 public class ConversationPagerController {
 
-    private ConversationPager mPager;
+    private ViewPager mPager;
     private ConversationPagerAdapter mPagerAdapter;
     private FragmentManager mFragmentManager;
     private ConversationListCallbacks mListController;
@@ -74,7 +75,7 @@
     public ConversationPagerController(RestrictedActivity activity,
             ConversationListCallbacks listController) {
         mFragmentManager = activity.getFragmentManager();
-        mPager = (ConversationPager) activity.findViewById(R.id.conversation_pane);
+        mPager = (ViewPager) activity.findViewById(R.id.conversation_pane);
         mListController = listController;
     }
 
@@ -87,10 +88,13 @@
             // position if the account+folder combo are the same, but the conversation is different
         }
 
-        mPagerAdapter = new ConversationPagerAdapter(mFragmentManager, account, folder,
-                initialConversation);
+        mPager.setVisibility(View.VISIBLE);
+
+        mPagerAdapter = new ConversationPagerAdapter(mPager.getResources(), mFragmentManager,
+                account, folder, initialConversation);
         mPagerAdapter.setSingletonMode(ENABLE_SINGLETON_INITIAL_LOAD);
         mPagerAdapter.setListController(mListController);
+        mPagerAdapter.setPager(mPager);
         LogUtils.d(LOG_TAG, "IN CPC.show, adapter=%s", mPagerAdapter);
 
         LogUtils.d(LOG_TAG, "init pager adapter, count=%d initial=%s", mPagerAdapter.getCount(),
@@ -113,6 +117,7 @@
             return;
         }
         mShown = false;
+        mPager.setVisibility(View.GONE);
 
         LogUtils.d(LOG_TAG, "IN CPC.hide, clearing adapter and unregistering list observer");
         mPager.setAdapter(null);
@@ -128,6 +133,7 @@
         if (mPagerAdapter != null) {
             // stop observing the conversation list
             mPagerAdapter.setListController(null);
+            mPagerAdapter.setPager(null);
             mPagerAdapter = null;
         }
     }