package com.xda.one.ui; import com.xda.one.R; import com.xda.one.util.UIUtils; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.ActionBar; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.SearchView; public class SearchFragment extends Fragment { private WebView mWebView; private MenuItem mSearchMenuItem; private Callback mCallback; private String mCurrentUrl; public static Fragment createInstance() { return new SearchFragment(); } @Override public void onAttach(final Activity activity) { super.onAttach(activity); mCallback = (Callback) activity; } @Override public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable final Bundle savedInstanceState) { mWebView = new WebView(getActivity()); return mWebView; } @Override public void onViewCreated(final View view, @Nullable final Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); setHasOptionsMenu(true); final ActionBar actionBar = UIUtils.getSupportActionBar(getActivity()); actionBar.setTitle(R.string.search); actionBar.setSubtitle(null); final WebSettings settings = mWebView.getSettings(); settings.setJavaScriptEnabled(true); settings.setLoadWithOverviewMode(true); settings.setUseWideViewPort(true); mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(final WebView view, final String url) { final Uri uri = Uri.parse(url); if ("forum.xda-developers.com".equals(uri.getAuthority())) { mCallback.parseAndDisplayForumUrl(url, false); } else { // Update the url so that if we come back, we come back to this page mCurrentUrl = url; view.loadUrl(url); } return true; } @Override public void onPageFinished(WebView view, final String url) { } }); if (savedInstanceState != null) { mWebView.restoreState(savedInstanceState); } else if (mCurrentUrl != null) { mWebView.loadUrl(mCurrentUrl); } } @Override public void onSaveInstanceState(final Bundle outState) { super.onSaveInstanceState(outState); mWebView.saveState(outState); } @Override public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { inflater.inflate(R.menu.search_ab, menu); mSearchMenuItem = menu.findItem(R.id.search_ab_search); final SearchView searchView = (SearchView) MenuItemCompat.getActionView(mSearchMenuItem); final SearchQueryListener listener = new SearchQueryListener(); searchView.setOnQueryTextListener(listener); // TODO - stop this from constantly happening when you go to a item and then come back searchView.post(new Runnable() { @Override public void run() { MenuItemCompat.expandActionView(mSearchMenuItem); } }); } @Override public void onPrepareOptionsMenu(final Menu menu) { } @Override public boolean onOptionsItemSelected(final MenuItem item) { return false; } public boolean onBackPressed() { if (mWebView.canGoBack()) { mWebView.goBack(); return true; } return false; } public interface Callback { public void parseAndDisplayForumUrl(final String url, final boolean fromExternal); } private class SearchQueryListener implements SearchView.OnQueryTextListener { @Override public boolean onQueryTextSubmit(final String query) { if (TextUtils.isEmpty(query)) { return false; } MenuItemCompat.collapseActionView(mSearchMenuItem); final String queryFinal = String.format("%s site:forum.xda-developers.com/", query); final Uri uri = new Uri.Builder().scheme("https").authority("www.google.com") .appendPath("search") .appendQueryParameter("q", queryFinal).build(); mCurrentUrl = uri.toString(); mWebView.setVisibility(View.VISIBLE); mWebView.loadUrl(mCurrentUrl); return true; } @Override public boolean onQueryTextChange(final String query) { return false; } } }