Add load more to the conversation status bar.

If a folder has a load more uri and sync is done, show this bar.
When the user clicks it, query on the loadMore uri.

Change-Id: Ie6dc1671be6f04b9af0b37b65ad7f9941a339ac6
diff --git a/res/layout/conversation_list_footer_view.xml b/res/layout/conversation_list_footer_view.xml
index 1b236c3..a9f7f97 100644
--- a/res/layout/conversation_list_footer_view.xml
+++ b/res/layout/conversation_list_footer_view.xml
@@ -80,5 +80,22 @@
             android:text="@string/loading"/>
 
     </LinearLayout>
+    <LinearLayout android:id="@+id/load_more"
+        android:layout_width="match_parent"
+        android:layout_height="?android:attr/listPreferredItemHeight"
+        android:gravity="center"
+        android:visibility="gone"
+        android:clickable="true"
+        android:background="?android:attr/selectableItemBackground">
 
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textAppearance="?android:attr/textAppearanceLargeInverse"
+            android:layout_marginBottom="1dip"
+            android:paddingLeft="5dip"
+            android:textColor="@android:color/black"
+            android:text="@string/load_more"/>
+
+    </LinearLayout>
 </com.android.mail.browse.ConversationListFooterView>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 037ac08..e9e296c 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -566,4 +566,6 @@
     <string name="loading">Loading conversations\u2026</string>
     <!-- Button at bottom of conversation list screen if last attempt to load conversations failed [CHAR LIMIT=20]-->
     <string name="retry">Retry</string>
+    <!-- Button at bottom of conversation list screen if the folder for which contents are being shown supports loading more on demand [CHAR LIMIT=20]-->
+    <string name="load_more">Load more</string>
 </resources>
diff --git a/src/com/android/mail/browse/ConversationListFooterView.java b/src/com/android/mail/browse/ConversationListFooterView.java
index ac89152..2e3d38c 100644
--- a/src/com/android/mail/browse/ConversationListFooterView.java
+++ b/src/com/android/mail/browse/ConversationListFooterView.java
@@ -19,12 +19,14 @@
 
 import android.content.Context;
 import android.net.Uri;
+import android.os.AsyncTask;
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import com.android.mail.ConversationListContext;
 import com.android.mail.R;
 import com.android.mail.providers.Folder;
 import com.android.mail.providers.UIProvider;
@@ -34,8 +36,10 @@
 public class ConversationListFooterView extends LinearLayout implements View.OnClickListener {
     private View mLoading;
     private View mNetworkError;
+    private View mLoadMore;
     private View mRetry;
     private TextView mErrorText;
+    private FolderSyncTask mFolderSyncTask;
 
     public ConversationListFooterView(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -47,27 +51,48 @@
 
         mLoading = findViewById(R.id.loading);
         mNetworkError = findViewById(R.id.network_error);
+        mLoadMore = findViewById(R.id.load_more);
+        mLoadMore.setOnClickListener(this);
         mRetry = findViewById(R.id.retry_button);
         mRetry.setOnClickListener(this);
         mErrorText = (TextView)findViewById(R.id.error_text);
     }
 
     public void onClick(View v) {
-        Folder f = (Folder)v.getTag();
-        if (f != null) {
-            // TODO(mindyp) Refresh.
+        int id = v.getId();
+        Folder f = (Folder) v.getTag();
+        Uri uri = null;
+        switch (id) {
+            case R.id.retry_button:
+                if (f != null) {
+                    uri = f.refreshUri;
+                }
+                break;
+            case R.id.load_more:
+                if (f != null && f.loadMoreUri != null) {
+                    uri = f.loadMoreUri;
+                }
+                break;
+        }
+        if (uri != null) {
+            if (mFolderSyncTask != null) {
+                mFolderSyncTask.cancel(true);
+            }
+            mFolderSyncTask = new FolderSyncTask(uri);
+            mFolderSyncTask.execute();
         }
     }
 
     /**
      * Update the view to reflect the new folder status.
      */
-    public void updateStatus(final Folder folder) {
+    public void updateStatus(final Folder folder, int count) {
         mRetry.setTag(folder);
-
+        mLoadMore.setTag(folder);
         if (folder.isSyncInProgress()) {
             mLoading.setVisibility(View.VISIBLE);
             mNetworkError.setVisibility(View.GONE);
+            mLoadMore.setVisibility(View.GONE);
         } else if (folder.lastSyncResult != UIProvider.LastSyncResult.SUCCESS) {
             mNetworkError.setVisibility(View.VISIBLE);
             CharSequence error = Utils.getSyncStatusText(getContext(), folder.lastSyncResult);
@@ -75,11 +100,29 @@
                 mErrorText.setText(error);
             }
             mLoading.setVisibility(View.GONE);
+            mLoadMore.setVisibility(View.GONE);
             // Only show the "Retry" button for I/O errors; it won't help for
             // internal errors.
             mRetry.setVisibility(
                     folder.lastSyncResult == UIProvider.LastSyncResult.CONNECTION_ERROR ?
                     View.VISIBLE : View.GONE);
+        } else if (folder.loadMoreUri != null && folder.totalCount > count) {
+            mLoading.setVisibility(View.GONE);
+            mNetworkError.setVisibility(View.GONE);
+            mLoadMore.setVisibility(View.VISIBLE);
+        }
+    }
+
+    private class FolderSyncTask extends AsyncTask<Void, Void, Void> {
+        Uri mUri;
+        public FolderSyncTask(Uri uri) {
+            mUri = uri;
+        }
+
+        @Override
+        public Void doInBackground(Void... params) {
+            getContext().getContentResolver().query(mUri, null, null, null, null);
+            return null;
         }
     }
 }
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index 358bb31..ff0e6f5 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -686,17 +686,14 @@
             if (data != null) {
                 data.moveToFirst();
                 Folder folder = new Folder(data);
-                if (mConvListContext.isSearchResult()) {
-                    if (mConversationListFragment != null) {
-                        mConversationListFragment.onSearchFolderUpdated(folder);
-                    }
+                if (folder.isSyncInProgress()) {
+                    mActionBarView.onRefreshStarted();
                 } else {
-                    if (folder.isSyncInProgress()) {
-                        mActionBarView.onRefreshStarted();
-                    } else {
-                        // Stop the spinner here.
-                        mActionBarView.onRefreshStopped(folder.lastSyncResult);
-                    }
+                    // Stop the spinner here.
+                    mActionBarView.onRefreshStopped(folder.lastSyncResult);
+                }
+                if (mConversationListFragment != null) {
+                    mConversationListFragment.onFolderUpdated(folder);
                 }
                 LogUtils.v(LOG_TAG, "FOLDER STATUS = " + folder.syncStatus);
             }
diff --git a/src/com/android/mail/ui/ConversationListFragment.java b/src/com/android/mail/ui/ConversationListFragment.java
index 61079cc..8d868b4 100644
--- a/src/com/android/mail/ui/ConversationListFragment.java
+++ b/src/com/android/mail/ui/ConversationListFragment.java
@@ -426,7 +426,7 @@
      */
     private void showList() {
         mListView.setEmptyView(null);
-        mFolder = mViewContext.folder;
+        onFolderUpdated(mViewContext.folder);
         getLoaderManager().initLoader(CONVERSATION_LOADER_ID, Bundle.EMPTY, this);
     }
 
@@ -547,9 +547,9 @@
         // Do nothing.
     }
 
-    public void onSearchFolderUpdated(Folder folder) {
+    public void onFolderUpdated(Folder folder) {
         mFolder = folder;
-        mFooterView.updateStatus(mFolder);
+        mFooterView.updateStatus(mFolder, mListAdapter != null ? mListAdapter.getCount() : 0);
         if (mFolder.isSyncInProgress()) {
             mListAdapter.showFooter();
         } else if (!mFolder.isSyncInProgress()
@@ -559,7 +559,9 @@
             if (mFolder.totalCount == 0) {
                 mListView.setEmptyView(mEmptyView);
             }
-            mListAdapter.hideFooter();
+            if (folder.loadMoreUri == null) {
+                mListAdapter.hideFooter();
+            }
         }
     }
 }