Explorar o código

Load more activities when reaching the end of the stream

Signed-off-by: Joas Schilling <coding@schilljs.com>
Joas Schilling %!s(int64=7) %!d(string=hai) anos
pai
achega
e58042d6aa

+ 39 - 6
src/main/java/com/owncloud/android/ui/activity/ActivitiesListActivity.java

@@ -118,6 +118,8 @@ public class ActivitiesListActivity extends FileActivity implements ActivityList
     private OwnCloudClient ownCloudClient;
     private AsyncTask<String, Object, OCFile> updateTask;
 
+    private String nextPageUrl;
+    private boolean isLoadingActivities;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -144,7 +146,7 @@ public class ActivitiesListActivity extends FileActivity implements ActivityList
             @Override
             public void onRefresh() {
                 setLoadingMessage();
-                fetchAndSetData();
+                fetchAndSetData(null);
             }
         });
 
@@ -152,7 +154,7 @@ public class ActivitiesListActivity extends FileActivity implements ActivityList
             @Override
             public void onRefresh() {
                 setLoadingMessage();
-                fetchAndSetData();
+                fetchAndSetData(null);
             }
         });
     }
@@ -186,6 +188,23 @@ public class ActivitiesListActivity extends FileActivity implements ActivityList
         LinearLayoutManager layoutManager = new LinearLayoutManager(this);
 
         recyclerView.setLayoutManager(layoutManager);
+        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
+
+            @Override
+            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
+                super.onScrolled(recyclerView, dx, dy);
+
+                int visibleItemCount = recyclerView.getChildCount();
+                int totalItemCount = layoutManager.getItemCount();
+                int firstVisibleItemIndex = layoutManager.findFirstVisibleItemPosition();
+
+                // synchronize loading state when item count changes
+                if (!isLoadingActivities && (totalItemCount - visibleItemCount) <= (firstVisibleItemIndex + 5)) {
+                    // Almost reached the end, continue to load new activities
+                    fetchAndSetData(nextPageUrl);
+                }
+            }
+        });
 
         BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_view);
 
@@ -194,10 +213,13 @@ public class ActivitiesListActivity extends FileActivity implements ActivityList
             DisplayUtils.setupBottomBar(bottomNavigationView, getResources(), this, -1);
         }
 
-        fetchAndSetData();
+        fetchAndSetData(null);
     }
 
-    private void fetchAndSetData() {
+    /**
+     * @param pageUrl String
+     */
+    private void fetchAndSetData(String pageUrl) {
         final Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext());
         final Context context = MainApp.getAppContext();
 
@@ -211,13 +233,21 @@ public class ActivitiesListActivity extends FileActivity implements ActivityList
                     ownCloudClient = OwnCloudClientManagerFactory.getDefaultSingleton().
                             getClientFor(ocAccount, MainApp.getAppContext());
                     ownCloudClient.setOwnCloudVersion(AccountUtils.getServerVersion(currentAccount));
+                    isLoadingActivities = true;
+
+                    GetRemoteActivitiesOperation getRemoteNotificationOperation = new GetRemoteActivitiesOperation();
+                    if (pageUrl != null) {
+                        getRemoteNotificationOperation.setNextUrl(pageUrl);
+                    }
 
-                    RemoteOperation getRemoteNotificationOperation = new GetRemoteActivitiesOperation();
                     Log_OC.d(TAG, "BEFORE getRemoteActivitiesOperation.execute");
                     final RemoteOperationResult result = getRemoteNotificationOperation.execute(ownCloudClient);
+                    //result.get
 
                     if (result.isSuccess() && result.getData() != null) {
-                        final ArrayList<Object> activities = result.getData();
+                        final ArrayList<Object> data = result.getData();
+                        final ArrayList<Object> activities = (ArrayList) data.get(0);
+                        nextPageUrl = (String) data.get(1);
 
                         runOnUiThread(new Runnable() {
                             @Override
@@ -231,6 +261,7 @@ public class ActivitiesListActivity extends FileActivity implements ActivityList
                                     swipeListRefreshLayout.setVisibility(View.GONE);
                                     swipeEmptyListRefreshLayout.setVisibility(View.VISIBLE);
                                 }
+                                isLoadingActivities = false;
                             }
                         });
                     } else {
@@ -245,6 +276,7 @@ public class ActivitiesListActivity extends FileActivity implements ActivityList
                             @Override
                             public void run() {
                                 setEmptyContent(noResultsHeadline, finalLogMessage);
+                                isLoadingActivities = false;
                             }
                         });
                     }
@@ -271,6 +303,7 @@ public class ActivitiesListActivity extends FileActivity implements ActivityList
             public void run() {
                 swipeListRefreshLayout.setRefreshing(false);
                 swipeEmptyListRefreshLayout.setRefreshing(false);
+                isLoadingActivities = false;
             }
         });
     }