Dbrant has uploaded a new change for review. https://gerrit.wikimedia.org/r/302967
Change subject: Integrate Search fragment into overhaul. ...................................................................... Integrate Search fragment into overhaul. Remaining things to do: - Fill in all the callback functions to have the proper effect. - Implement correct Back behavior. Change-Id: I37aef4b3274d6b6ae019ac73d12d4db76ed9dd4a --- M app/src/main/java/org/wikipedia/overhaul/OverhaulFragment.java M app/src/main/java/org/wikipedia/search/RecentSearchesFragment.java M app/src/main/java/org/wikipedia/search/SearchArticlesFragment.java M app/src/main/java/org/wikipedia/search/SearchResultsFragment.java M app/src/main/java/org/wikipedia/views/ViewUtil.java M app/src/main/res/layout/fragment_overhaul.xml 6 files changed, 170 insertions(+), 61 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia refs/changes/67/302967/1 diff --git a/app/src/main/java/org/wikipedia/overhaul/OverhaulFragment.java b/app/src/main/java/org/wikipedia/overhaul/OverhaulFragment.java index f91c822..6edbb1c 100644 --- a/app/src/main/java/org/wikipedia/overhaul/OverhaulFragment.java +++ b/app/src/main/java/org/wikipedia/overhaul/OverhaulFragment.java @@ -2,6 +2,7 @@ import android.location.Location; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; @@ -20,17 +21,22 @@ import org.wikipedia.nearby.NearbyFragment; import org.wikipedia.overhaul.navtab.NavTabViewPagerAdapter; import org.wikipedia.page.PageTitle; +import org.wikipedia.readinglist.AddToReadingListDialog; import org.wikipedia.readinglist.ReadingListsFragment; +import org.wikipedia.search.OverhaulSearchFragment; +import org.wikipedia.search.SearchResultsFragment; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder; public class OverhaulFragment extends Fragment implements FeedFragment.Callback, - NearbyFragment.Callback, HistoryFragment.Callback, ReadingListsFragment.Callback { + NearbyFragment.Callback, HistoryFragment.Callback, ReadingListsFragment.Callback, + OverhaulSearchFragment.Callback, SearchResultsFragment.Callback { @BindView(R.id.fragment_overhaul_view_pager) ViewPager viewPager; @BindView(R.id.view_nav_view_pager_tab_layout) TabLayout tabLayout; private Unbinder unbinder; + private OverhaulSearchFragment searchFragment; public static OverhaulFragment newInstance() { OverhaulFragment fragment = new OverhaulFragment(); @@ -44,8 +50,10 @@ super.onCreateView(inflater, container, savedInstanceState); View view = inflater.inflate(R.layout.fragment_overhaul, container, false); unbinder = ButterKnife.bind(this, view); - viewPager.setAdapter(new NavTabViewPagerAdapter(getFragmentManager())); + viewPager.setAdapter(new NavTabViewPagerAdapter(getChildFragmentManager())); tabLayout.setupWithViewPager(viewPager); + + searchFragment = (OverhaulSearchFragment) getChildFragmentManager().findFragmentById(R.id.search_fragment); return view; } @@ -56,7 +64,8 @@ } @Override public void onFeedSearchRequested() { - // todo: [overhaul] search. + searchFragment.setInvokeSource(OverhaulSearchFragment.InvokeSource.FEED_BAR); + searchFragment.openSearch(); } @Override public void onFeedVoiceSearchRequested() { @@ -115,4 +124,39 @@ // todo: [overhaul] logic for menu state. return false; } + + @Override + public void onSearchResultCopyLink(@NonNull PageTitle title) { + + } + + @Override + public void onSearchResultAddToList(@NonNull PageTitle title, @NonNull AddToReadingListDialog.InvokeSource source) { + + } + + @Override + public void onSearchResultShareLink(@NonNull PageTitle title) { + + } + + @Override + public void onSearchProgressBar(boolean enabled) { + + } + + @Override + public void onSearchSelectPage(@NonNull HistoryEntry entry, boolean inNewTab) { + + } + + @Override + public void onSearchOpen() { + + } + + @Override + public void onSearchClose() { + + } } \ No newline at end of file diff --git a/app/src/main/java/org/wikipedia/search/RecentSearchesFragment.java b/app/src/main/java/org/wikipedia/search/RecentSearchesFragment.java index 57eddc2..23c3b77 100644 --- a/app/src/main/java/org/wikipedia/search/RecentSearchesFragment.java +++ b/app/src/main/java/org/wikipedia/search/RecentSearchesFragment.java @@ -1,14 +1,17 @@ package org.wikipedia.search; import android.content.Context; +import android.content.DialogInterface; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.CursorAdapter; +import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -18,13 +21,19 @@ import android.widget.TextView; import org.wikipedia.R; +import org.wikipedia.WikipediaApp; import org.wikipedia.database.contract.SearchHistoryContract; +import org.wikipedia.util.FeedbackUtil; import static org.wikipedia.Constants.RECENT_SEARCHES_FRAGMENT_LOADER_ID; /** Displays a list of recent searches */ public class RecentSearchesFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { - private SearchArticlesFragment searchFragment; + public interface Parent { + void switchToSearch(@NonNull String text); + } + + private Parent parentFragment; private View container; private ListView recentSearchesList; private RecentSearchesAdapter adapter; @@ -33,10 +42,30 @@ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_search_recent, container, false); - searchFragment = (SearchArticlesFragment) getParentFragment(); + parentFragment = (Parent) getParentFragment(); this.container = rootView.findViewById(R.id.recent_searches_container); recentSearchesList = (ListView) rootView.findViewById(R.id.recent_searches_list); + deleteButton = (ImageView) rootView.findViewById(R.id.recent_searches_delete_button); + deleteButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new AlertDialog.Builder(getContext()) + .setMessage(getString(R.string.clear_recent_searches_confirm)) + .setPositiveButton( + getString(R.string.yes), + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + new DeleteAllRecentSearchesTask(WikipediaApp.getInstance()).execute(); + } + }) + .setNegativeButton(getString(R.string.no), null) + .create().show(); + } + }); + FeedbackUtil.setToolbarButtonLongPressToast(deleteButton); + return rootView; } @@ -58,7 +87,7 @@ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { RecentSearch entry = (RecentSearch) view.getTag(); - searchFragment.switchToSearch(entry.getText()); + parentFragment.switchToSearch(entry.getText()); } }); diff --git a/app/src/main/java/org/wikipedia/search/SearchArticlesFragment.java b/app/src/main/java/org/wikipedia/search/SearchArticlesFragment.java index d7711a2..398166a 100644 --- a/app/src/main/java/org/wikipedia/search/SearchArticlesFragment.java +++ b/app/src/main/java/org/wikipedia/search/SearchArticlesFragment.java @@ -7,7 +7,6 @@ import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; -import android.support.v7.app.AlertDialog; import android.support.v7.widget.SearchView; import android.text.TextUtils; import android.util.Log; @@ -41,7 +40,8 @@ import static org.wikipedia.util.DimenUtil.getContentTopOffsetPx; -public class SearchArticlesFragment extends Fragment implements BackPressedHandler { +public class SearchArticlesFragment extends Fragment implements BackPressedHandler, + SearchResultsFragment.Parent, RecentSearchesFragment.Parent { public enum InvokeSource implements EnumCode { TOOLBAR(0), WIDGET(1), @@ -143,26 +143,6 @@ } }); - final View deleteButton = parentLayout.findViewById(R.id.recent_searches_delete_button); - deleteButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - new AlertDialog.Builder(getContext()) - .setMessage(getString(R.string.clear_recent_searches_confirm)) - .setPositiveButton( - getString(R.string.yes), - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - new DeleteAllRecentSearchesTask(app).execute(); - } - }) - .setNegativeButton(getString(R.string.no), null) - .create().show(); - } - }); - FeedbackUtil.setToolbarButtonLongPressToast(deleteButton); - FragmentManager childFragmentManager = getChildFragmentManager(); recentSearchesFragment = (RecentSearchesFragment)childFragmentManager.findFragmentById( R.id.search_panel_recent); @@ -194,6 +174,8 @@ outState.putInt(ARG_INVOKE_SOURCE, invokeSource.code()); } + @Override + @NonNull public SearchFunnel getFunnel() { return funnel; } @@ -206,7 +188,8 @@ return invokeSource.fromIntent(); } - public void switchToSearch(String queryText) { + @Override + public void switchToSearch(@NonNull String queryText) { startSearch(queryText, true); searchView.setQuery(queryText, false); } @@ -215,7 +198,8 @@ * Changes the search text box to contain a different string. * @param text The text you want to make the search box display. */ - public void setSearchText(CharSequence text) { + @Override + public void setSearchText(@NonNull CharSequence text) { searchView.setQuery(text, false); } @@ -333,6 +317,10 @@ return true; } return false; + } + + @Override + public void setProgressBarEnabled(boolean enabled) { } private void setSearchViewEnabled(boolean enabled) { @@ -460,7 +448,8 @@ } }; - public void navigateToTitle(PageTitle title, boolean inNewTab, int position) { + @Override + public void navigateToTitle(@NonNull PageTitle title, boolean inNewTab, int position) { if (!isAdded()) { return; } diff --git a/app/src/main/java/org/wikipedia/search/SearchResultsFragment.java b/app/src/main/java/org/wikipedia/search/SearchResultsFragment.java index 743a449..b2907e6 100644 --- a/app/src/main/java/org/wikipedia/search/SearchResultsFragment.java +++ b/app/src/main/java/org/wikipedia/search/SearchResultsFragment.java @@ -3,6 +3,7 @@ import org.wikipedia.LongPressHandler; import org.wikipedia.ParcelableLruCache; import org.wikipedia.activity.FragmentUtil; +import org.wikipedia.analytics.SearchFunnel; import org.wikipedia.history.HistoryEntry; import org.wikipedia.page.PageTitle; import org.wikipedia.R; @@ -44,6 +45,13 @@ void onSearchProgressBar(boolean enabled); } + public interface Parent { + void navigateToTitle(@NonNull PageTitle item, boolean inNewTab, int position); + void setSearchText(@NonNull CharSequence text); + @NonNull SearchFunnel getFunnel(); + void setProgressBarEnabled(boolean enabled); + } + private static final int BATCH_SIZE = 20; private static final int DELAY_MILLIS = 300; private static final int MESSAGE_SEARCH = 1; @@ -54,7 +62,7 @@ */ private static final int NANO_TO_MILLI = 1_000_000; - private SearchArticlesFragment searchFragment; + private Parent parentFragment; private View searchResultsDisplay; private View searchResultsContainer; private ListView searchResultsList; @@ -81,7 +89,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_search_results, container, false); searchResultsDisplay = rootView.findViewById(R.id.search_results_display); - searchFragment = (SearchArticlesFragment) getParentFragment(); + parentFragment = (Parent) getParentFragment(); searchResultsContainer = rootView.findViewById(R.id.search_results_container); searchResultsList = (ListView) rootView.findViewById(R.id.search_results_list); @@ -97,7 +105,7 @@ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { PageTitle item = ((SearchResult) getAdapter().getItem(position)).getPageTitle(); - searchFragment.navigateToTitle(item, false, position); + parentFragment.navigateToTitle(item, false, position); } }); @@ -110,8 +118,8 @@ public void onClick(View view) { String suggestion = (String) searchSuggestion.getTag(); if (suggestion != null) { - searchFragment.getFunnel().searchDidYouMean(); - searchFragment.setSearchText(suggestion); + parentFragment.getFunnel().searchDidYouMean(); + parentFragment.setSearchText(suggestion); startSearch(suggestion, true); } } @@ -230,7 +238,7 @@ if (!resultList.isEmpty()) { // Calculate total time taken to display results, in milliseconds final int timeToDisplay = (int) ((System.nanoTime() - startTime) / NANO_TO_MILLI); - searchFragment.getFunnel().searchResults(false, resultList.size(), timeToDisplay); + parentFragment.getFunnel().searchResults(false, resultList.size(), timeToDisplay); } updateProgressBar(false); @@ -277,7 +285,7 @@ } // Calculate total time taken to display results, in milliseconds final int timeToDisplay = (int) ((System.nanoTime() - startTime) / NANO_TO_MILLI); - searchFragment.getFunnel().searchError(false, timeToDisplay); + parentFragment.getFunnel().searchError(false, timeToDisplay); updateProgressBar(false); searchErrorView.setVisibility(View.VISIBLE); @@ -333,7 +341,7 @@ if (!resultList.isEmpty()) { // Calculate total time taken to display results, in milliseconds final int timeToDisplay = (int) ((System.nanoTime() - startTime) / NANO_TO_MILLI); - searchFragment.getFunnel().searchResults(true, resultList.size(), timeToDisplay); + parentFragment.getFunnel().searchResults(true, resultList.size(), timeToDisplay); } // append results to cache... @@ -358,7 +366,7 @@ } // Calculate total time taken to display results, in milliseconds final int timeToDisplay = (int) ((System.nanoTime() - startTime) / NANO_TO_MILLI); - searchFragment.getFunnel().searchError(true, timeToDisplay); + parentFragment.getFunnel().searchError(true, timeToDisplay); updateProgressBar(false); // since this is a follow-up search just show a message @@ -381,8 +389,10 @@ } private void updateProgressBar(boolean enabled) { + parentFragment.setProgressBarEnabled(enabled); Callback callback = callback(); if (callback != null) { + // TODO: remove this callback item after overhaul callback.onSearchProgressBar(enabled); } } @@ -446,12 +456,12 @@ @Override public void onOpenLink(PageTitle title, HistoryEntry entry) { - searchFragment.navigateToTitle(title, false, lastPositionRequested); + parentFragment.navigateToTitle(title, false, lastPositionRequested); } @Override public void onOpenInNewTab(PageTitle title, HistoryEntry entry) { - searchFragment.navigateToTitle(title, true, lastPositionRequested); + parentFragment.navigateToTitle(title, true, lastPositionRequested); } } diff --git a/app/src/main/java/org/wikipedia/views/ViewUtil.java b/app/src/main/java/org/wikipedia/views/ViewUtil.java index d0e65ea..e9fa710 100644 --- a/app/src/main/java/org/wikipedia/views/ViewUtil.java +++ b/app/src/main/java/org/wikipedia/views/ViewUtil.java @@ -1,5 +1,7 @@ package org.wikipedia.views; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.annotation.TargetApi; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -120,5 +122,24 @@ parent.addView(next, index); } + public static void fadeIn(@NonNull View view) { + view.setAlpha(0f); + view.setVisibility(View.VISIBLE); + view.animate().alpha(1f) + .setDuration(view.getResources().getInteger(android.R.integer.config_shortAnimTime)) + .setListener(null); + } + + public static void fadeOut(@NonNull final View view) { + view.animate().alpha(0f) + .setDuration(view.getResources().getInteger(android.R.integer.config_shortAnimTime)) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + view.setVisibility(View.GONE); + } + }); + } + private ViewUtil() { } } diff --git a/app/src/main/res/layout/fragment_overhaul.xml b/app/src/main/res/layout/fragment_overhaul.xml index 6bba102..9ceee6a 100644 --- a/app/src/main/res/layout/fragment_overhaul.xml +++ b/app/src/main/res/layout/fragment_overhaul.xml @@ -1,27 +1,43 @@ <?xml version="1.0" encoding="utf-8"?> -<RelativeLayout +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> - <org.wikipedia.overhaul.navtab.NavTabLayout - android:id="@+id/view_nav_view_pager_tab_layout" - android:layout_width="match_parent" - android:layout_height="@dimen/view_nav_view_pager_tab_layout_height" - android:layout_alignParentBottom="true" - app:tabGravity="fill" - android:elevation="12dp" - android:background="@android:color/white" - app:tabIndicatorColor="@color/blue_liberal" /> - <android.support.design.widget.CoordinatorLayout - android:id="@+id/fragment_overhaul_view_pager_container" + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="match_parent"> + <org.wikipedia.overhaul.navtab.NavTabLayout + android:id="@+id/view_nav_view_pager_tab_layout" + android:layout_width="match_parent" + android:layout_height="@dimen/view_nav_view_pager_tab_layout_height" + android:layout_alignParentBottom="true" + app:tabGravity="fill" + android:elevation="12dp" + android:background="@android:color/white" + app:tabIndicatorColor="@color/blue_liberal" /> + + <android.support.design.widget.CoordinatorLayout + android:id="@+id/fragment_overhaul_view_pager_container" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_above="@id/view_nav_view_pager_tab_layout"> + <org.wikipedia.readinglist.NoSwipeViewPager + android:id="@+id/fragment_overhaul_view_pager" + android:layout_width="match_parent" + android:layout_height="match_parent" /> + </android.support.design.widget.CoordinatorLayout> + + </RelativeLayout> + + <fragment android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_above="@id/view_nav_view_pager_tab_layout"> - <org.wikipedia.readinglist.NoSwipeViewPager - android:id="@+id/fragment_overhaul_view_pager" - android:layout_width="match_parent" - android:layout_height="match_parent" /> - </android.support.design.widget.CoordinatorLayout> -</RelativeLayout> + android:id="@+id/search_fragment" + android:name="org.wikipedia.search.OverhaulSearchFragment" + android:layout="@id/view_nav_view_pager_tab_layout" + tools:layout="@layout/fragment_search_overhaul" /> + +</FrameLayout> -- To view, visit https://gerrit.wikimedia.org/r/302967 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I37aef4b3274d6b6ae019ac73d12d4db76ed9dd4a 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