Dbrant has uploaded a new change for review. https://gerrit.wikimedia.org/r/295348
Change subject: Integrate search into Feed (with voice). ...................................................................... Integrate search into Feed (with voice). Change-Id: Iff74f9054f1f6913dc1e15d433cc78e6283d1e9e --- M app/src/main/java/org/wikipedia/feed/FeedFragment.java M app/src/main/java/org/wikipedia/feed/FeedViewCallback.java M app/src/main/java/org/wikipedia/feed/searchbar/SearchCardView.java M app/src/main/java/org/wikipedia/feed/view/FeedRecyclerAdapter.java M app/src/main/java/org/wikipedia/page/PageActivity.java M app/src/main/java/org/wikipedia/page/ToolbarProvider.java M app/src/main/java/org/wikipedia/search/SearchArticlesFragment.java 7 files changed, 97 insertions(+), 17 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia refs/changes/48/295348/1 diff --git a/app/src/main/java/org/wikipedia/feed/FeedFragment.java b/app/src/main/java/org/wikipedia/feed/FeedFragment.java index da8b7a1..11d7e8d 100644 --- a/app/src/main/java/org/wikipedia/feed/FeedFragment.java +++ b/app/src/main/java/org/wikipedia/feed/FeedFragment.java @@ -40,6 +40,7 @@ void onAddToolbar(Toolbar toolbar); void onRemoveToolbar(Toolbar toolbar); void onFeedSearchRequested(); + void onFeedVoiceSearchRequested(); void onFeedSelectPage(PageTitle title); void onFeedAddPageToList(PageTitle title); } @@ -133,5 +134,19 @@ getCallback().onFeedAddPageToList(title); } } + + @Override + public void onSearchRequested() { + if (getCallback() != null) { + getCallback().onFeedSearchRequested(); + } + } + + @Override + public void onVoiceSearchRequested() { + if (getCallback() != null) { + getCallback().onFeedVoiceSearchRequested(); + } + } } } diff --git a/app/src/main/java/org/wikipedia/feed/FeedViewCallback.java b/app/src/main/java/org/wikipedia/feed/FeedViewCallback.java index 7954be9..1816d9a 100644 --- a/app/src/main/java/org/wikipedia/feed/FeedViewCallback.java +++ b/app/src/main/java/org/wikipedia/feed/FeedViewCallback.java @@ -7,4 +7,6 @@ public interface FeedViewCallback { void onSelectPage(@NonNull PageTitle title); void onAddPageToList(@NonNull PageTitle title); + void onSearchRequested(); + void onVoiceSearchRequested(); } diff --git a/app/src/main/java/org/wikipedia/feed/searchbar/SearchCardView.java b/app/src/main/java/org/wikipedia/feed/searchbar/SearchCardView.java index 1b6d0f2..289776d 100644 --- a/app/src/main/java/org/wikipedia/feed/searchbar/SearchCardView.java +++ b/app/src/main/java/org/wikipedia/feed/searchbar/SearchCardView.java @@ -2,10 +2,12 @@ import android.content.Context; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v7.widget.CardView; import android.view.View; import org.wikipedia.R; +import org.wikipedia.feed.FeedViewCallback; import org.wikipedia.util.FeedbackUtil; import butterknife.BindView; @@ -14,6 +16,7 @@ public class SearchCardView extends CardView { @BindView(R.id.search_container) View searchContainer; @BindView(R.id.voice_search_button) View voiceSearchButton; + @Nullable private FeedViewCallback callback; public SearchCardView(Context context) { super(context); @@ -21,6 +24,29 @@ inflate(getContext(), R.layout.view_search_bar, this); ButterKnife.bind(this); FeedbackUtil.setToolbarButtonLongPressToast(voiceSearchButton); + + searchContainer.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (callback != null) { + callback.onSearchRequested(); + } + } + }); + + voiceSearchButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (callback != null) { + callback.onVoiceSearchRequested(); + } + } + }); + } + + @NonNull public SearchCardView setCallback(@Nullable FeedViewCallback callback) { + this.callback = callback; + return this; } public void set(@NonNull SearchCard card) { diff --git a/app/src/main/java/org/wikipedia/feed/view/FeedRecyclerAdapter.java b/app/src/main/java/org/wikipedia/feed/view/FeedRecyclerAdapter.java index e75a628..cf748e8 100644 --- a/app/src/main/java/org/wikipedia/feed/view/FeedRecyclerAdapter.java +++ b/app/src/main/java/org/wikipedia/feed/view/FeedRecyclerAdapter.java @@ -79,7 +79,7 @@ case VIEW_TYPE_BECAUSE_YOU_READ: return new BecauseYouReadCardView(context).setCallback(callback); case VIEW_TYPE_SEARCH_BAR: - return new SearchCardView(context); + return new SearchCardView(context).setCallback(callback); default: throw new IllegalArgumentException("viewType=" + viewType); } diff --git a/app/src/main/java/org/wikipedia/page/PageActivity.java b/app/src/main/java/org/wikipedia/page/PageActivity.java index c6c4aee..b0a726d 100644 --- a/app/src/main/java/org/wikipedia/page/PageActivity.java +++ b/app/src/main/java/org/wikipedia/page/PageActivity.java @@ -3,6 +3,7 @@ import android.annotation.TargetApi; import android.app.SearchManager; import android.appwidget.AppWidgetManager; +import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.DialogInterface; import android.content.Intent; @@ -13,6 +14,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; +import android.speech.RecognizerIntent; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.BottomSheetDialog; @@ -100,6 +102,7 @@ public static final int ACTIVITY_REQUEST_LANGLINKS = 0; public static final int ACTIVITY_REQUEST_EDIT_SECTION = 1; public static final int ACTIVITY_REQUEST_GALLERY = 2; + public static final int ACTIVITY_REQUEST_VOICE_SEARCH = 3; public static final int PROGRESS_BAR_MAX_VALUE = 10000; @@ -402,6 +405,15 @@ return true; } + public void setSearchMode(boolean enabled) { + // invalidate our ActionBar, so that all action items are removed, and + // we can fill up the whole width of the ActionBar with our SearchView. + supportInvalidateOptionsMenu(); + toolbarProvider.setSearchMode(enabled); + getSearchBarHideHandler().setForceNoFade(enabled); + getDrawerToggle().setDrawerIndicatorEnabled(!enabled); + } + public void showToolbar() { ViewAnimations.ensureTranslationY(toolbarContainer, 0); } @@ -447,7 +459,7 @@ handleProcessTextIntent(intent); } else if (intent.hasExtra(EXTRA_SEARCH_FROM_WIDGET)) { new IntentFunnel(app).logSearchWidgetTap(); - openSearch(); + openSearchFromIntent(); } else if (intent.hasExtra(EXTRA_FEATURED_ARTICLE_FROM_WIDGET)) { new IntentFunnel(app).logFeaturedArticleWidgetTap(); loadMainPageInForegroundTab(); @@ -458,7 +470,7 @@ private void handleShareIntent(Intent intent) { String text = intent.getStringExtra(Intent.EXTRA_TEXT); - openSearch(text == null ? null : text.trim()); + openSearchFromIntent(text == null ? null : text.trim(), true); } @TargetApi(Build.VERSION_CODES.M) @@ -467,18 +479,18 @@ return; } String text = intent.getStringExtra(Intent.EXTRA_PROCESS_TEXT); - openSearch(text == null ? null : text.trim()); + openSearchFromIntent(text == null ? null : text.trim(), true); } - private void openSearch() { - openSearch(null); + private void openSearchFromIntent() { + openSearchFromIntent(null, true); } - private void openSearch(@Nullable final CharSequence query) { + private void openSearchFromIntent(@Nullable final CharSequence query, final boolean fromWidget) { fragmentContainerView.post(new Runnable() { @Override public void run() { - searchFragment.setLaunchedFromWidget(true); + searchFragment.setLaunchedFromWidget(fromWidget); searchFragment.openSearch(); if (query != null) { searchFragment.setSearchText(query); @@ -783,6 +795,18 @@ } @Override + public void onFeedVoiceSearchRequested() { + Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); + intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en-US"); + + try { + startActivityForResult(intent, ACTIVITY_REQUEST_VOICE_SEARCH); + } catch (ActivityNotFoundException a) { + FeedbackUtil.showMessage(this, "Sorry, your device doesn't support Speech to Text."); + } + } + + @Override public void onFeedSelectPage(PageTitle title) { loadPage(title, new HistoryEntry(title, HistoryEntry.SOURCE_FEED)); } @@ -928,6 +952,8 @@ handleLoginActivityResult(resultCode); } else if (newArticleLanguageSelected(requestCode, resultCode) || galleryFilePageSelected(requestCode, resultCode)) { handleLangLinkOrFilePageResult(data); + } else if (voiceSearchRequested(requestCode)) { + handleVoiceSearchResult(resultCode, data); } else { super.onActivityResult(requestCode, resultCode, data); } @@ -1045,6 +1071,18 @@ return resultCode == SettingsActivity.ACTIVITY_RESULT_LANGUAGE_CHANGED; } + private boolean voiceSearchRequested(int requestCode) { + return requestCode == ACTIVITY_REQUEST_VOICE_SEARCH; + } + + private void handleVoiceSearchResult(int resultCode, Intent data) { + if (resultCode == RESULT_OK && data != null + && data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS) != null) { + String searchQuery = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS).get(0); + openSearchFromIntent(searchQuery, false); + } + } + /** * Reload the main page in the new language, after delaying for one second in order to: * (1) Make sure that onStart in PageActivity gets called, thus registering the activity for the bus. diff --git a/app/src/main/java/org/wikipedia/page/ToolbarProvider.java b/app/src/main/java/org/wikipedia/page/ToolbarProvider.java index c1c1386..d3bf0c8 100644 --- a/app/src/main/java/org/wikipedia/page/ToolbarProvider.java +++ b/app/src/main/java/org/wikipedia/page/ToolbarProvider.java @@ -31,6 +31,12 @@ setActivityToolbar(defaultToolbar); } + public void setSearchMode(boolean enabled) { + if (overrideToolbar != null) { + defaultToolbar.setVisibility(enabled ? View.VISIBLE : View.GONE); + } + } + private void setActivityToolbar(Toolbar toolbar) { activity.setSupportActionBar(toolbar); activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); diff --git a/app/src/main/java/org/wikipedia/search/SearchArticlesFragment.java b/app/src/main/java/org/wikipedia/search/SearchArticlesFragment.java index 8510a74..4317e45 100644 --- a/app/src/main/java/org/wikipedia/search/SearchArticlesFragment.java +++ b/app/src/main/java/org/wikipedia/search/SearchArticlesFragment.java @@ -248,12 +248,8 @@ funnel = new SearchFunnel(WikipediaApp.getInstance()); funnel.searchStart(); isSearchActive = true; - // invalidate our activity's ActionBar, so that all action items are removed, and - // we can fill up the whole width of the ActionBar with our SearchView. - getActivity().supportInvalidateOptionsMenu(); - ((PageActivity)getActivity()).getSearchBarHideHandler().setForceNoFade(true); setSearchViewEnabled(true); - ((PageActivity) getActivity()).getDrawerToggle().setDrawerIndicatorEnabled(false); + ((PageActivity) getActivity()).setSearchMode(true); // show ourselves searchContainerView.setVisibility(View.VISIBLE); @@ -267,11 +263,8 @@ public void closeSearch() { isSearchActive = false; - // invalidate our activity's ActionBar, so that the original action items are restored. - getActivity().supportInvalidateOptionsMenu(); - ((PageActivity)getActivity()).getSearchBarHideHandler().setForceNoFade(false); setSearchViewEnabled(false); - ((PageActivity) getActivity()).getDrawerToggle().setDrawerIndicatorEnabled(true); + ((PageActivity) getActivity()).setSearchMode(false); // hide ourselves searchContainerView.setVisibility(View.GONE); hideSoftKeyboard(getActivity()); -- To view, visit https://gerrit.wikimedia.org/r/295348 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iff74f9054f1f6913dc1e15d433cc78e6283d1e9e Gerrit-PatchSet: 1 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: Dbrant <dbr...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits