package org.wikipedia.page; import android.graphics.Color; import android.os.Build; import android.support.annotation.NonNull; import android.support.v4.view.ActionProvider; import android.support.v7.widget.SearchView; import android.view.View; import android.view.inputmethod.EditorInfo; import android.webkit.WebView.FindListener; import android.widget.TextView; import org.wikipedia.R; import org.wikipedia.analytics.FindInPageFunnel; import org.wikipedia.util.DeviceUtil; public class FindInPageActionProvider extends ActionProvider { @NonNull private final PageFragment fragment; @NonNull private final FindInPageFunnel funnel; private View findInPageNext; private View findInPagePrev; private TextView findInPageMatch; public FindInPageActionProvider(@NonNull PageFragment fragment, @NonNull FindInPageFunnel funnel) { super(fragment.getContext()); this.fragment = fragment; this.funnel = funnel; } @Override public boolean overridesItemVisibility() { return true; } @Override public View onCreateActionView() { View view = View.inflate(fragment.getContext(), R.layout.group_find_in_page, null); findInPageNext = view.findViewById(R.id.find_in_page_next); findInPageNext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { DeviceUtil.hideSoftKeyboard(view); if (!pageFragmentValid()) { return; } funnel.addFindNext(); fragment.getWebView().findNext(true); } }); findInPagePrev = view.findViewById(R.id.find_in_page_prev); findInPagePrev.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { fragment.hideSoftKeyboard(); if (!pageFragmentValid()) { return; } funnel.addFindPrev(); fragment.getWebView().findNext(false); } }); findInPageMatch = (TextView) view.findViewById(R.id.find_in_page_match); SearchView searchView = (SearchView) view.findViewById(R.id.find_in_page_input); searchView.setQueryHint(fragment.getContext().getString(R.string.menu_page_find_in_page)); searchView.setFocusable(true); searchView.requestFocusFromTouch(); searchView.setOnQueryTextListener(searchQueryListener); searchView.setOnCloseListener(searchCloseListener); searchView.setIconified(false); searchView.setMaxWidth(Integer.MAX_VALUE); searchView.setInputType(EditorInfo.TYPE_CLASS_TEXT); searchView.setSubmitButtonEnabled(false); // remove focus line from search plate View searchEditPlate = searchView .findViewById(android.support.v7.appcompat.R.id.search_plate); searchEditPlate.setBackgroundColor(Color.TRANSPARENT); return view; } private final SearchView.OnQueryTextListener searchQueryListener = new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String s) { return false; } @Override public boolean onQueryTextChange(String s) { findInPageNext.setEnabled(s.length() > 0); findInPagePrev.setEnabled(s.length() > 0); if (!pageFragmentValid()) { return false; } funnel.setFindText(s); if (s.length() > 0) { findInPage(s); } else { fragment.getWebView().clearMatches(); findInPageMatch.setVisibility(View.GONE); } return true; } }; private final SearchView.OnCloseListener searchCloseListener = new SearchView.OnCloseListener() { @Override public boolean onClose() { fragment.closeFindInPage(); return false; } }; private boolean pageFragmentValid() { return fragment.getWebView() != null; } public void findInPage(String s) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { fragment.getWebView().setFindListener(new FindListener() { @Override public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches, boolean isDoneCounting) { if (!isDoneCounting) { return; } if (numberOfMatches > 0) { findInPageMatch.setText(getContext().getString(R.string.find_in_page_result, activeMatchOrdinal + 1, numberOfMatches)); findInPageNext.setEnabled(true); findInPagePrev.setEnabled(true); } else { findInPageMatch.setText("0/0"); findInPageNext.setEnabled(false); findInPagePrev.setEnabled(false); } findInPageMatch.setVisibility(View.VISIBLE); } }); fragment.getWebView().findAllAsync(s); } else { //noinspection deprecation fragment.getWebView().findAll(s); } } }