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

Reply via email to