From 293388ebc2790564d80daf5635ca9e31f8ea089c Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 6 Jun 2018 19:26:13 -0300 Subject: [PATCH] Android - Allow search among protocol compatible user stories and not only tagged ones --- .../provider/UserStoryDomainProvider.java | 85 +++++++++++-------- .../hifiinterface/view/DomainAdapter.java | 46 +++++----- 2 files changed, 77 insertions(+), 54 deletions(-) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/provider/UserStoryDomainProvider.java b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/UserStoryDomainProvider.java index ea03864695..ca5e0c17bd 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/provider/UserStoryDomainProvider.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/UserStoryDomainProvider.java @@ -1,10 +1,11 @@ package io.highfidelity.hifiinterface.provider; import android.util.Log; -import android.util.MutableInt; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import io.highfidelity.hifiinterface.HifiUtils; import io.highfidelity.hifiinterface.view.DomainAdapter; @@ -47,24 +48,42 @@ public class UserStoryDomainProvider implements DomainProvider { suggestions = new ArrayList<>(); } + @Override + public synchronized void retrieve(String filterText, DomainCallback domainCallback) { + if (!startedToGetFromAPI) { + startedToGetFromAPI = true; + fillDestinations(filterText, domainCallback); + } else { + filterChoicesByText(filterText, domainCallback); + } + } + private void fillDestinations(String filterText, DomainCallback domainCallback) { StoriesFilter filter = new StoriesFilter(filterText); - final MutableInt counter = new MutableInt(0); - allStories.clear(); - getUserStoryPage(1, + + List taggedStories = new ArrayList<>(); + Set taggedStoriesIds = new HashSet<>(); + getUserStoryPage(1, taggedStories, TAGS_TO_SEARCH, e -> { - allStories.subList(counter.value, allStories.size()).forEach(userStory -> { - filter.filterOrAdd(userStory); - }); - if (domainCallback != null) { - domainCallback.retrieveOk(suggestions); //ended - } - }, - a -> { - allStories.forEach(userStory -> { - counter.value++; - filter.filterOrAdd(userStory); + taggedStories.forEach(userStory -> { + taggedStoriesIds.add(userStory.id); }); + + allStories.clear(); + getUserStoryPage(1, allStories, null, + ex -> { + allStories.forEach(userStory -> { + if (taggedStoriesIds.contains(userStory.id)) { + userStory.tagFound = true; + } + filter.filterOrAdd(userStory); + }); + if (domainCallback != null) { + domainCallback.retrieveOk(suggestions); //ended + } + } + ); + } ); } @@ -73,25 +92,22 @@ public class UserStoryDomainProvider implements DomainProvider { restOfPagesCallback.callback(new Exception("Error accessing url [" + url + "]", t)); } - private void getUserStoryPage(int pageNumber, Callback restOfPagesCallback, Callback firstPageCallback) { + private void getUserStoryPage(int pageNumber, List userStoriesList, String tagsFilter, Callback restOfPagesCallback) { Call userStories = mUserStoryDomainProviderService.getUserStories( INCLUDE_ACTIONS_FOR_PLACES, "open", true, mProtocol, - TAGS_TO_SEARCH, + tagsFilter, pageNumber); Log.d("API-USER-STORY-DOMAINS", "Protocol [" + mProtocol + "] include_actions [" + INCLUDE_ACTIONS_FOR_PLACES + "]"); userStories.enqueue(new retrofit2.Callback() { @Override public void onResponse(Call call, Response response) { UserStories data = response.body(); - allStories.addAll(data.user_stories); + userStoriesList.addAll(data.user_stories); if (data.current_page < data.total_pages && data.current_page <= MAX_PAGES_TO_GET) { - if (pageNumber == 1 && firstPageCallback != null) { - firstPageCallback.callback(null); - } - getUserStoryPage(pageNumber + 1, restOfPagesCallback, null); + getUserStoryPage(pageNumber + 1, userStoriesList, tagsFilter, restOfPagesCallback); return; } restOfPagesCallback.callback(null); @@ -107,12 +123,16 @@ public class UserStoryDomainProvider implements DomainProvider { private class StoriesFilter { String[] mWords = new String[]{}; public StoriesFilter(String filterText) { - mWords = filterText.toUpperCase().split("\\s+"); + mWords = filterText.trim().toUpperCase().split("\\s+"); + if (mWords.length == 1 && (mWords[0] == null || mWords[0].length() <= 0 ) ) { + mWords = null; + } } private boolean matches(UserStory story) { - if (mWords.length <= 0) { - return true; + if (mWords == null || mWords.length <= 0) { + // No text filter? So filter by tag + return story.tagFound; } for (String word : mWords) { @@ -128,6 +148,9 @@ public class UserStoryDomainProvider implements DomainProvider { suggestions.add(story.toDomain()); } + /** + * if the story matches this filter criteria it's added into suggestions + * */ public void filterOrAdd(UserStory story) { if (matches(story)) { addToSuggestions(story); @@ -144,16 +167,6 @@ public class UserStoryDomainProvider implements DomainProvider { domainCallback.retrieveOk(suggestions); } - @Override - public synchronized void retrieve(String filterText, DomainCallback domainCallback) { - if (!startedToGetFromAPI) { - startedToGetFromAPI = true; - fillDestinations(filterText, domainCallback); - } else { - filterChoicesByText(filterText, domainCallback); - } - } - public interface UserStoryDomainProviderService { @GET("api/v1/user_stories") Call getUserStories(@Query("include_actions") String includeActions, @@ -166,12 +179,14 @@ public class UserStoryDomainProvider implements DomainProvider { class UserStory { public UserStory() {} + String id; String place_name; String path; String thumbnail_url; String place_id; String domain_id; private String searchText; + private boolean tagFound; // Locally used // New fields? tags, description diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/view/DomainAdapter.java b/android/app/src/main/java/io/highfidelity/hifiinterface/view/DomainAdapter.java index 97558d2681..4f8b33b481 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/view/DomainAdapter.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/view/DomainAdapter.java @@ -54,27 +54,10 @@ public class DomainAdapter extends RecyclerView.Adapter domain) { if (filterText.length() == 0) { - Domain lastVisitedDomain = new Domain(mContext.getString(R.string.your_last_location), mLastLocation, DEFAULT_THUMBNAIL_PLACE); - if (!mLastLocation.isEmpty() && mLastLocation.contains("://")) { - int startIndex = mLastLocation.indexOf("://"); - int endIndex = mLastLocation.indexOf("/", startIndex + 3); - String toSearch = mLastLocation.substring(0, endIndex + 1).toLowerCase(); - for (Domain d : domain) { - if (d.url.toLowerCase().startsWith(toSearch)) { - lastVisitedDomain.thumbnail = d.thumbnail; - } - } - } - domain.add(0, lastVisitedDomain); + addLastLocation(domain); } - for (Domain d : domain) { - // we override the default picture added in the server by an android specific version - if (d.thumbnail != null && - d.thumbnail.endsWith("assets/places/thumbnail-default-place-e5a3f33e773ab699495774990a562f9f7693dc48ef90d8be6985c645a0280f75.png")) { - d.thumbnail = DEFAULT_THUMBNAIL_PLACE; - } - } + overrideDefaultThumbnails(domain); mDomains = new Domain[domain.size()]; mDomains = domain.toArray(mDomains); @@ -96,6 +79,31 @@ public class DomainAdapter extends RecyclerView.Adapter domain) { + for (Domain d : domain) { + // we override the default picture added in the server by an android specific version + if (d.thumbnail != null && + d.thumbnail.endsWith("assets/places/thumbnail-default-place-e5a3f33e773ab699495774990a562f9f7693dc48ef90d8be6985c645a0280f75.png")) { + d.thumbnail = DEFAULT_THUMBNAIL_PLACE; + } + } + } + + private void addLastLocation(List domain) { + Domain lastVisitedDomain = new Domain(mContext.getString(R.string.your_last_location), mLastLocation, DEFAULT_THUMBNAIL_PLACE); + if (!mLastLocation.isEmpty() && mLastLocation.contains("://")) { + int startIndex = mLastLocation.indexOf("://"); + int endIndex = mLastLocation.indexOf("/", startIndex + 3); + String toSearch = mLastLocation.substring(0, endIndex + 1).toLowerCase(); + for (Domain d : domain) { + if (d.url.toLowerCase().startsWith(toSearch)) { + lastVisitedDomain.thumbnail = d.thumbnail; + } + } + } + domain.add(0, lastVisitedDomain); + } + @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.domain_view, parent, false);