Merge pull request #13319 from Cristo86/android_search_untagged

Android - Allow search among protocol compatible user stories and not only tagged ones
This commit is contained in:
Sam Gondelman 2018-06-08 10:59:33 -07:00 committed by GitHub
commit 87e6df3cba
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 77 additions and 54 deletions

View file

@ -1,10 +1,11 @@
package io.highfidelity.hifiinterface.provider; package io.highfidelity.hifiinterface.provider;
import android.util.Log; import android.util.Log;
import android.util.MutableInt;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import io.highfidelity.hifiinterface.HifiUtils; import io.highfidelity.hifiinterface.HifiUtils;
import io.highfidelity.hifiinterface.view.DomainAdapter; import io.highfidelity.hifiinterface.view.DomainAdapter;
@ -47,24 +48,42 @@ public class UserStoryDomainProvider implements DomainProvider {
suggestions = new ArrayList<>(); 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) { private void fillDestinations(String filterText, DomainCallback domainCallback) {
StoriesFilter filter = new StoriesFilter(filterText); StoriesFilter filter = new StoriesFilter(filterText);
final MutableInt counter = new MutableInt(0);
allStories.clear(); List<UserStory> taggedStories = new ArrayList<>();
getUserStoryPage(1, Set<String> taggedStoriesIds = new HashSet<>();
getUserStoryPage(1, taggedStories, TAGS_TO_SEARCH,
e -> { e -> {
allStories.subList(counter.value, allStories.size()).forEach(userStory -> { taggedStories.forEach(userStory -> {
filter.filterOrAdd(userStory); taggedStoriesIds.add(userStory.id);
});
if (domainCallback != null) {
domainCallback.retrieveOk(suggestions); //ended
}
},
a -> {
allStories.forEach(userStory -> {
counter.value++;
filter.filterOrAdd(userStory);
}); });
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)); restOfPagesCallback.callback(new Exception("Error accessing url [" + url + "]", t));
} }
private void getUserStoryPage(int pageNumber, Callback<Exception> restOfPagesCallback, Callback<Void> firstPageCallback) { private void getUserStoryPage(int pageNumber, List<UserStory> userStoriesList, String tagsFilter, Callback<Exception> restOfPagesCallback) {
Call<UserStories> userStories = mUserStoryDomainProviderService.getUserStories( Call<UserStories> userStories = mUserStoryDomainProviderService.getUserStories(
INCLUDE_ACTIONS_FOR_PLACES, INCLUDE_ACTIONS_FOR_PLACES,
"open", "open",
true, true,
mProtocol, mProtocol,
TAGS_TO_SEARCH, tagsFilter,
pageNumber); pageNumber);
Log.d("API-USER-STORY-DOMAINS", "Protocol [" + mProtocol + "] include_actions [" + INCLUDE_ACTIONS_FOR_PLACES + "]"); Log.d("API-USER-STORY-DOMAINS", "Protocol [" + mProtocol + "] include_actions [" + INCLUDE_ACTIONS_FOR_PLACES + "]");
userStories.enqueue(new retrofit2.Callback<UserStories>() { userStories.enqueue(new retrofit2.Callback<UserStories>() {
@Override @Override
public void onResponse(Call<UserStories> call, Response<UserStories> response) { public void onResponse(Call<UserStories> call, Response<UserStories> response) {
UserStories data = response.body(); 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 (data.current_page < data.total_pages && data.current_page <= MAX_PAGES_TO_GET) {
if (pageNumber == 1 && firstPageCallback != null) { getUserStoryPage(pageNumber + 1, userStoriesList, tagsFilter, restOfPagesCallback);
firstPageCallback.callback(null);
}
getUserStoryPage(pageNumber + 1, restOfPagesCallback, null);
return; return;
} }
restOfPagesCallback.callback(null); restOfPagesCallback.callback(null);
@ -107,12 +123,16 @@ public class UserStoryDomainProvider implements DomainProvider {
private class StoriesFilter { private class StoriesFilter {
String[] mWords = new String[]{}; String[] mWords = new String[]{};
public StoriesFilter(String filterText) { 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) { private boolean matches(UserStory story) {
if (mWords.length <= 0) { if (mWords == null || mWords.length <= 0) {
return true; // No text filter? So filter by tag
return story.tagFound;
} }
for (String word : mWords) { for (String word : mWords) {
@ -128,6 +148,9 @@ public class UserStoryDomainProvider implements DomainProvider {
suggestions.add(story.toDomain()); suggestions.add(story.toDomain());
} }
/**
* if the story matches this filter criteria it's added into suggestions
* */
public void filterOrAdd(UserStory story) { public void filterOrAdd(UserStory story) {
if (matches(story)) { if (matches(story)) {
addToSuggestions(story); addToSuggestions(story);
@ -144,16 +167,6 @@ public class UserStoryDomainProvider implements DomainProvider {
domainCallback.retrieveOk(suggestions); 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 { public interface UserStoryDomainProviderService {
@GET("api/v1/user_stories") @GET("api/v1/user_stories")
Call<UserStories> getUserStories(@Query("include_actions") String includeActions, Call<UserStories> getUserStories(@Query("include_actions") String includeActions,
@ -166,12 +179,14 @@ public class UserStoryDomainProvider implements DomainProvider {
class UserStory { class UserStory {
public UserStory() {} public UserStory() {}
String id;
String place_name; String place_name;
String path; String path;
String thumbnail_url; String thumbnail_url;
String place_id; String place_id;
String domain_id; String domain_id;
private String searchText; private String searchText;
private boolean tagFound; // Locally used
// New fields? tags, description // New fields? tags, description

View file

@ -54,27 +54,10 @@ public class DomainAdapter extends RecyclerView.Adapter<DomainAdapter.ViewHolder
@Override @Override
public void retrieveOk(List<Domain> domain) { public void retrieveOk(List<Domain> domain) {
if (filterText.length() == 0) { if (filterText.length() == 0) {
Domain lastVisitedDomain = new Domain(mContext.getString(R.string.your_last_location), mLastLocation, DEFAULT_THUMBNAIL_PLACE); addLastLocation(domain);
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);
} }
for (Domain d : domain) { overrideDefaultThumbnails(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;
}
}
mDomains = new Domain[domain.size()]; mDomains = new Domain[domain.size()];
mDomains = domain.toArray(mDomains); mDomains = domain.toArray(mDomains);
@ -96,6 +79,31 @@ public class DomainAdapter extends RecyclerView.Adapter<DomainAdapter.ViewHolder
}); });
} }
private void overrideDefaultThumbnails(List<Domain> 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) {
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 @Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.domain_view, parent, false); View view = mInflater.inflate(R.layout.domain_view, parent, false);