mirror of
https://github.com/nextcloud/talk-android
synced 2025-03-12 10:32:36 +00:00
Implement proper search
Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
parent
3806f35a53
commit
c30660068f
@ -15,8 +15,8 @@ android {
|
|||||||
targetSdkVersion 27
|
targetSdkVersion 27
|
||||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
versionCode 35
|
versionCode 36
|
||||||
versionName "1.2.0beta2"
|
versionName "1.2.0beta3"
|
||||||
|
|
||||||
flavorDimensions "default"
|
flavorDimensions "default"
|
||||||
|
|
||||||
|
@ -148,6 +148,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
private BottomSheet bottomSheet;
|
private BottomSheet bottomSheet;
|
||||||
private View view;
|
private View view;
|
||||||
private int currentPage;
|
private int currentPage;
|
||||||
|
private int currentSearchPage;
|
||||||
|
|
||||||
private SmoothScrollLinearLayoutManager layoutManager;
|
private SmoothScrollLinearLayoutManager layoutManager;
|
||||||
|
|
||||||
@ -162,6 +163,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
|
|
||||||
private boolean alreadyFetching = false;
|
private boolean alreadyFetching = false;
|
||||||
private boolean canFetchFurther = true;
|
private boolean canFetchFurther = true;
|
||||||
|
private boolean canFetchSearchFurther = true;
|
||||||
|
|
||||||
public ContactsController() {
|
public ContactsController() {
|
||||||
super();
|
super();
|
||||||
@ -224,7 +226,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
if (currentUser != null) {
|
if (currentUser != null) {
|
||||||
fetchData(true);
|
fetchData(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setupAdapter();
|
setupAdapter();
|
||||||
@ -237,6 +238,15 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
|
|
||||||
adapter.setEndlessScrollListener(this, new ProgressItem());
|
adapter.setEndlessScrollListener(this, new ProgressItem());
|
||||||
|
|
||||||
|
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
|
||||||
|
@Override
|
||||||
|
public void onChanged() {
|
||||||
|
super.onChanged();
|
||||||
|
adapter.filterItems();
|
||||||
|
adapter.onLoadMoreComplete(null);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
adapter.setStickyHeaderElevation(5)
|
adapter.setStickyHeaderElevation(5)
|
||||||
.setUnlinkAllItemsOnRemoveHeaders(true)
|
.setUnlinkAllItemsOnRemoveHeaders(true)
|
||||||
.setDisplayHeadersAtStartUp(true)
|
.setDisplayHeadersAtStartUp(true)
|
||||||
@ -429,19 +439,26 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
alreadyFetching = true;
|
alreadyFetching = true;
|
||||||
Set<Sharee> shareeHashSet = new HashSet<>();
|
Set<Sharee> shareeHashSet = new HashSet<>();
|
||||||
|
|
||||||
if (startFromScratch) {
|
|
||||||
contactItems = new ArrayList<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
userHeaderItems = new HashMap<>();
|
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(),
|
RetrofitBucket retrofitBucket = ApiUtils.getRetrofitBucketForContactsSearch(currentUser.getBaseUrl(),
|
||||||
"");
|
query);
|
||||||
|
|
||||||
int page = 1;
|
int page = 1;
|
||||||
if (!startFromScratch) {
|
if (!startFromScratch) {
|
||||||
page = currentPage + 1;
|
if (TextUtils.isEmpty(query)) {
|
||||||
|
page = currentPage + 1;
|
||||||
|
} else {
|
||||||
|
page = currentSearchPage + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, Object> modifiedQueryMap = new HashMap<>(retrofitBucket.getQueryMap());
|
Map<String, Object> modifiedQueryMap = new HashMap<>(retrofitBucket.getQueryMap());
|
||||||
@ -461,13 +478,9 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onNext(Response response) {
|
public void onNext(Response response) {
|
||||||
canFetchFurther = response.headers().size() > 0 &&
|
|
||||||
!TextUtils.isEmpty((response.headers().get("Link")));
|
|
||||||
if (response.body() != null) {
|
if (response.body() != null) {
|
||||||
ShareesOverall shareesOverall = (ShareesOverall) response.body();
|
ShareesOverall shareesOverall = (ShareesOverall) response.body();
|
||||||
|
|
||||||
currentPage = (int) modifiedQueryMap.get("page");
|
|
||||||
|
|
||||||
if (shareesOverall.getOcs().getData().getUsers() != null) {
|
if (shareesOverall.getOcs().getData().getUsers() != null) {
|
||||||
shareeHashSet.addAll(shareesOverall.getOcs().getData().getUsers());
|
shareeHashSet.addAll(shareesOverall.getOcs().getData().getUsers());
|
||||||
}
|
}
|
||||||
@ -478,7 +491,19 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
getExactUsers().getExactSharees());
|
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;
|
Participant participant;
|
||||||
|
|
||||||
|
List<AbstractFlexibleItem> newUserItemList = new ArrayList<>();
|
||||||
|
newUserItemList.addAll(contactItems);
|
||||||
for (Sharee sharee : shareeHashSet) {
|
for (Sharee sharee : shareeHashSet) {
|
||||||
if (!sharee.getValue().getShareWith().equals(currentUser.getUsername())) {
|
if (!sharee.getValue().getShareWith().equals(currentUser.getUsername())) {
|
||||||
participant = new Participant();
|
participant = new Participant();
|
||||||
@ -499,7 +524,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
userHeaderItems.get(headerTitle));
|
userHeaderItems.get(headerTitle));
|
||||||
|
|
||||||
if (!contactItems.contains(newContactItem)) {
|
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<>();
|
userHeaderItems = new HashMap<>();
|
||||||
|
|
||||||
Collections.sort(contactItems, (o1, o2) -> {
|
Collections.sort(newUserItemList, (o1, o2) -> {
|
||||||
String firstName;
|
String firstName;
|
||||||
String secondName;
|
String secondName;
|
||||||
|
|
||||||
@ -528,16 +559,15 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
return firstName.compareToIgnoreCase(secondName);
|
return firstName.compareToIgnoreCase(secondName);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (startFromScratch) {
|
|
||||||
adapter.updateDataSet(contactItems, true);
|
if (!shouldFilterManually) {
|
||||||
|
adapter.updateDataSet(newUserItemList, false);
|
||||||
} else {
|
} else {
|
||||||
|
adapter.filterItems();
|
||||||
adapter.onLoadMoreComplete(null);
|
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);
|
swipeRefreshLayout.setRefreshing(false);
|
||||||
|
|
||||||
|
|
||||||
@ -661,11 +691,15 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
|
|
||||||
if (!TextUtils.isEmpty(searchQuery)) {
|
if (!TextUtils.isEmpty(searchQuery)) {
|
||||||
adapter.setFilter(searchQuery);
|
adapter.setFilter(searchQuery);
|
||||||
searchQuery = "";
|
|
||||||
adapter.filterItems();
|
adapter.filterItems();
|
||||||
|
searchQuery = "";
|
||||||
} else {
|
} else {
|
||||||
adapter.setFilter(newText);
|
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
|
@Override
|
||||||
public void onLoadMore(int lastPosition, int currentPage) {
|
public void onLoadMore(int lastPosition, int currentPage) {
|
||||||
if (adapter.hasFilter()) {
|
String query = "";
|
||||||
adapter.onLoadMoreComplete(null);
|
|
||||||
return;
|
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);
|
fetchData(false);
|
||||||
} else {
|
} else {
|
||||||
return;
|
adapter.onLoadMoreComplete(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,12 +42,15 @@ public class ApiUtils {
|
|||||||
return userAgent + BuildConfig.VERSION_NAME;
|
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 retrofitBucket = new RetrofitBucket();
|
||||||
retrofitBucket.setUrl(baseUrl + ocsApiVersion + "/apps/files_sharing/api/v1/sharees");
|
retrofitBucket.setUrl(baseUrl + ocsApiVersion + "/apps/files_sharing/api/v1/sharees");
|
||||||
|
|
||||||
Map<String, String> queryMap = new HashMap<>();
|
Map<String, String> queryMap = new HashMap<>();
|
||||||
|
|
||||||
|
if (searchQuery == null) {
|
||||||
|
searchQuery = "";
|
||||||
|
}
|
||||||
queryMap.put("format", "json");
|
queryMap.put("format", "json");
|
||||||
queryMap.put("search", searchQuery);
|
queryMap.put("search", searchQuery);
|
||||||
queryMap.put("itemType", "call");
|
queryMap.put("itemType", "call");
|
||||||
|
Loading…
Reference in New Issue
Block a user