diff --git a/app/build.gradle b/app/build.gradle index 37e601e59..41ad3f094 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { targetSdkVersion 27 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - versionCode 35 - versionName "1.2.0beta2" + versionCode 36 + versionName "1.2.0beta3" flavorDimensions "default" diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java index 1c4c915d9..85a4ad80a 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java @@ -148,6 +148,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ private BottomSheet bottomSheet; private View view; private int currentPage; + private int currentSearchPage; private SmoothScrollLinearLayoutManager layoutManager; @@ -162,6 +163,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ private boolean alreadyFetching = false; private boolean canFetchFurther = true; + private boolean canFetchSearchFurther = true; public ContactsController() { super(); @@ -224,7 +226,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ if (currentUser != null) { fetchData(true); } - } setupAdapter(); @@ -237,6 +238,15 @@ public class ContactsController extends BaseController implements SearchView.OnQ adapter.setEndlessScrollListener(this, new ProgressItem()); + adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { + @Override + public void onChanged() { + super.onChanged(); + adapter.filterItems(); + adapter.onLoadMoreComplete(null); + } + }); + adapter.setStickyHeaderElevation(5) .setUnlinkAllItemsOnRemoveHeaders(true) .setDisplayHeadersAtStartUp(true) @@ -429,19 +439,26 @@ public class ContactsController extends BaseController implements SearchView.OnQ alreadyFetching = true; Set shareeHashSet = new HashSet<>(); - if (startFromScratch) { - contactItems = new ArrayList<>(); - } - userHeaderItems = new HashMap<>(); + String query = ""; + if (searchView != null && !TextUtils.isEmpty(searchView.getQuery())) { + query = searchView.getQuery().toString(); + } else if (startFromScratch) { + contactItems = new ArrayList<>(); + } + RetrofitBucket retrofitBucket = ApiUtils.getRetrofitBucketForContactsSearch(currentUser.getBaseUrl(), - ""); + query); int page = 1; if (!startFromScratch) { - page = currentPage + 1; + if (TextUtils.isEmpty(query)) { + page = currentPage + 1; + } else { + page = currentSearchPage + 1; + } } Map modifiedQueryMap = new HashMap<>(retrofitBucket.getQueryMap()); @@ -461,13 +478,9 @@ public class ContactsController extends BaseController implements SearchView.OnQ @Override public void onNext(Response response) { - canFetchFurther = response.headers().size() > 0 && - !TextUtils.isEmpty((response.headers().get("Link"))); if (response.body() != null) { ShareesOverall shareesOverall = (ShareesOverall) response.body(); - currentPage = (int) modifiedQueryMap.get("page"); - if (shareesOverall.getOcs().getData().getUsers() != null) { shareeHashSet.addAll(shareesOverall.getOcs().getData().getUsers()); } @@ -478,7 +491,19 @@ public class ContactsController extends BaseController implements SearchView.OnQ getExactUsers().getExactSharees()); } + if (TextUtils.isEmpty((CharSequence) modifiedQueryMap.get("search"))) { + canFetchFurther = !shareeHashSet.isEmpty(); + currentPage = (int) modifiedQueryMap.get("page"); + } else { + canFetchSearchFurther = !shareeHashSet.isEmpty(); + currentSearchPage = (int) modifiedQueryMap.get("page"); + } + + Participant participant; + + List newUserItemList = new ArrayList<>(); + newUserItemList.addAll(contactItems); for (Sharee sharee : shareeHashSet) { if (!sharee.getValue().getShareWith().equals(currentUser.getUsername())) { participant = new Participant(); @@ -499,7 +524,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ userHeaderItems.get(headerTitle)); if (!contactItems.contains(newContactItem)) { - contactItems.add(newContactItem); + newUserItemList.add(newContactItem); } } @@ -507,9 +532,15 @@ public class ContactsController extends BaseController implements SearchView.OnQ } + boolean shouldFilterManually = false; + if (newUserItemList.size() == contactItems.size()) { + shouldFilterManually = true; + } + + contactItems = newUserItemList; userHeaderItems = new HashMap<>(); - Collections.sort(contactItems, (o1, o2) -> { + Collections.sort(newUserItemList, (o1, o2) -> { String firstName; String secondName; @@ -528,16 +559,15 @@ public class ContactsController extends BaseController implements SearchView.OnQ return firstName.compareToIgnoreCase(secondName); }); - if (startFromScratch) { - adapter.updateDataSet(contactItems, true); + + if (!shouldFilterManually) { + adapter.updateDataSet(newUserItemList, false); } else { + adapter.filterItems(); adapter.onLoadMoreComplete(null); - adapter = new FlexibleAdapter<>(contactItems, getActivity(), false); - recyclerView.setAdapter(adapter); - setupAdapter(); - adapter.notifyDataSetChanged(); } - searchItem.setVisible(contactItems.size() > 0); + + searchItem.setVisible(newUserItemList.size() > 0); swipeRefreshLayout.setRefreshing(false); @@ -661,11 +691,15 @@ public class ContactsController extends BaseController implements SearchView.OnQ if (!TextUtils.isEmpty(searchQuery)) { adapter.setFilter(searchQuery); - searchQuery = ""; adapter.filterItems(); + searchQuery = ""; } else { adapter.setFilter(newText); - adapter.filterItems(300); + if (TextUtils.isEmpty(newText)) { + adapter.filterItems(); + } else { + fetchData(true); + } } } @@ -852,15 +886,17 @@ public class ContactsController extends BaseController implements SearchView.OnQ @Override public void onLoadMore(int lastPosition, int currentPage) { - if (adapter.hasFilter()) { - adapter.onLoadMoreComplete(null); - return; + String query = ""; + + if (searchView != null && !TextUtils.isEmpty(searchView.getQuery())) { + query = searchView.getQuery().toString(); } - if (!alreadyFetching && canFetchFurther) { + if (!alreadyFetching && ((searchView != null && searchView.isIconified() && canFetchFurther) + || (!TextUtils.isEmpty(query) && canFetchSearchFurther))) { fetchData(false); } else { - return; + adapter.onLoadMoreComplete(null); } } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java index befe90154..a04502ef7 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java @@ -42,12 +42,15 @@ public class ApiUtils { return userAgent + BuildConfig.VERSION_NAME; } - public static RetrofitBucket getRetrofitBucketForContactsSearch(String baseUrl, String searchQuery) { + public static RetrofitBucket getRetrofitBucketForContactsSearch(String baseUrl, @Nullable String searchQuery) { RetrofitBucket retrofitBucket = new RetrofitBucket(); retrofitBucket.setUrl(baseUrl + ocsApiVersion + "/apps/files_sharing/api/v1/sharees"); Map queryMap = new HashMap<>(); + if (searchQuery == null) { + searchQuery = ""; + } queryMap.put("format", "json"); queryMap.put("search", searchQuery); queryMap.put("itemType", "call");