From fc0e389dfcf50ac0eed7b2e92f85c81f74e1b0a2 Mon Sep 17 00:00:00 2001 From: tobiaskaminsky Date: Tue, 13 Mar 2018 13:45:26 +0100 Subject: [PATCH] rebased onto latest branch Signed-off-by: tobiaskaminsky --- .../android/ui/adapter/OCFileListAdapter.java | 37 ++++++++---- .../ui/fragment/OCFileListFragment.java | 56 +++++++++---------- src/main/res/layout/grid_item.xml | 6 +- 3 files changed, 57 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java index 09fce8c53b28..7166e83a6c43 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java @@ -87,6 +87,8 @@ public class OCFileListAdapter extends RecyclerView.Adapter mFilesAll = new ArrayList<>(); private boolean mJustFolders; private boolean mHideItemOptions; + private long lastTimestamp; + private boolean gridView = false; private boolean multiSelect = false; private HashSet checkedFiles; @@ -512,18 +514,20 @@ private void searchForLocalFileInDefaultPath(OCFile file) { } public void setData(ArrayList objects, ExtendedListFragment.SearchType searchType, - FileDataStorageManager storageManager, OCFile folder) { + FileDataStorageManager storageManager, OCFile folder, boolean clear) { if (storageManager != null && mStorageManager == null) { mStorageManager = storageManager; } - mFiles.clear(); + if (clear) { + mFiles.clear(); + } // early exit if (objects.size() > 0 && mStorageManager != null) { if (searchType.equals(ExtendedListFragment.SearchType.SHARED_FILTER)) { parseShares(objects); } else { - parseVirtuals(objects, searchType); + parseVirtuals(objects, searchType, clear); } } @@ -586,7 +590,7 @@ private void parseShares(ArrayList objects) { mStorageManager.saveShares(shares); } - private void parseVirtuals(ArrayList objects, ExtendedListFragment.SearchType searchType) { + private void parseVirtuals(ArrayList objects, ExtendedListFragment.SearchType searchType, boolean clear) { VirtualFolderType type; boolean onlyImages = false; switch (searchType) { @@ -596,13 +600,16 @@ private void parseVirtuals(ArrayList objects, ExtendedListFragment.Searc case PHOTO_SEARCH: type = VirtualFolderType.PHOTOS; onlyImages = true; + lastTimestamp = ((RemoteFile) objects.get(objects.size() - 1)).getModifiedTimestamp() / 1000; break; default: type = VirtualFolderType.NONE; break; } - mStorageManager.deleteVirtuals(type); + if (clear) { + mStorageManager.deleteVirtuals(type); + } ArrayList contentValues = new ArrayList<>(); @@ -613,15 +620,15 @@ private void parseVirtuals(ArrayList objects, ExtendedListFragment.Searc try { ocFile = mStorageManager.saveFileWithParent(ocFile, mContext); - if (!onlyImages || MimeTypeUtil.isImage(ocFile)) { + if ((!onlyImages || MimeTypeUtil.isImage(ocFile)) && !mFiles.contains(ocFile)) { mFiles.add(ocFile); - } - ContentValues cv = new ContentValues(); - cv.put(ProviderMeta.ProviderTableMeta.VIRTUAL_TYPE, type.toString()); - cv.put(ProviderMeta.ProviderTableMeta.VIRTUAL_OCFILE_ID, ocFile.getFileId()); + ContentValues cv = new ContentValues(); + cv.put(ProviderMeta.ProviderTableMeta.VIRTUAL_TYPE, type.toString()); + cv.put(ProviderMeta.ProviderTableMeta.VIRTUAL_OCFILE_ID, ocFile.getFileId()); - contentValues.add(cv); + contentValues.add(cv); + } } catch (RemoteOperationFailedException e) { Log_OC.e(TAG, "Error saving file with parent" + e.getMessage(), e); } @@ -679,6 +686,14 @@ public Filter getFilter() { return mFilesFilter; } + public void resetLastTimestamp() { + lastTimestamp = -1; + } + + public long getLastTimestamp() { + return lastTimestamp; + } + private class FilesFilter extends Filter { @Override diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 4920db2eab7a..002ae64f5cf0 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -173,7 +173,7 @@ public class OCFileListFragment extends ExtendedListFragment implements OCFileLi private boolean searchFragment = false; private SearchEvent searchEvent; private AsyncTask remoteOperationAsyncTask; - private AbsListView.OnScrollListener onScrollChangeListener; + private RecyclerView.OnScrollListener onScrollChangeListener; private boolean photoSearchQueryRunning; private boolean photoSearchNoNew = false; private RemoteOperation remoteOperation; @@ -205,27 +205,6 @@ public void onCreate(Bundle savedInstanceState) { searchFragment = currentSearchType != null; - onScrollChangeListener = new AbsListView.OnScrollListener() { - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) { - Log_OC.d("SCROLL", getListView().getFirstVisiblePosition() + " / " + mAdapter.getCount()); - } - - @Override - public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - Log_OC.d("SCROLL", firstVisibleItem + " / " + totalItemCount); - - if ((totalItemCount - visibleItemCount) <= (firstVisibleItem + 5)) { - // Almost reached the end, continue to load new activities - Log_OC.d("SCROLL", "load next"); - - if ((totalItemCount - visibleItemCount) > 0) { - search(); - } - } - } - }; - if (isGridViewPreferred(getCurrentFile())) { switchToGridView(); } @@ -298,6 +277,29 @@ public void run() { setChoiceModeAsMultipleModal(savedInstanceState); } + onScrollChangeListener = new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + if (recyclerView.getLayoutManager() instanceof GridLayoutManager) { + GridLayoutManager gridLayoutManager = (GridLayoutManager) recyclerView.getLayoutManager(); + + // scroll down + if (dy > 0 && !photoSearchQueryRunning) { + int visibleItemCount = gridLayoutManager.getChildCount(); + int totalItemCount = gridLayoutManager.getItemCount(); + int firstVisibleItem = gridLayoutManager.findFirstCompletelyVisibleItemPosition(); + + if ((totalItemCount - visibleItemCount) <= (firstVisibleItem + 5)) { + // Almost reached the end, continue to load new photos + if ((totalItemCount - visibleItemCount) > 0) { + searchAndDisplay(); + } + } + } + } + } + }; + Log_OC.i(TAG, "onCreateView() end"); return v; } @@ -1433,6 +1435,7 @@ public void onMessageEvent(ChangeMenuEvent changeMenuEvent) { getActivity().getIntent().removeExtra(OCFileListFragment.SEARCH_EVENT); getArguments().putParcelable(OCFileListFragment.SEARCH_EVENT, null); + getRecyclerView().clearOnScrollListeners(); setFabEnabled(true); } @@ -1547,21 +1550,18 @@ public void run() { remoteOperation = new GetRemoteSharesOperation(); } - search(); + searchAndDisplay(); - getListView().setOnScrollListener(onScrollChangeListener); + getRecyclerView().setOnScrollListener(onScrollChangeListener); } - // TODO refactor, can only used for photo search atm - private void search() { + private void searchAndDisplay() { if (!photoSearchQueryRunning && !photoSearchNoNew) { remoteOperationAsyncTask = new AsyncTask() { @Override protected Object doInBackground(Object[] params) { if (getContext() != null && !isCancelled()) { photoSearchQueryRunning = true; - Log_OC.d("SCROLL", "re-run search"); - final Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext()); int limit = -1; diff --git a/src/main/res/layout/grid_item.xml b/src/main/res/layout/grid_item.xml index 1101caf5a66c..9f19556df112 100644 --- a/src/main/res/layout/grid_item.xml +++ b/src/main/res/layout/grid_item.xml @@ -26,13 +26,13 @@