package com.pennapps.labs.pennmobile; import android.app.Activity; import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.support.annotation.ArrayRes; import android.support.design.widget.FloatingActionButton; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.app.ListFragment; import android.support.v4.view.ViewPager; import android.support.v7.preference.PreferenceManager; import android.support.v7.widget.SearchView; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ListView; import com.pennapps.labs.pennmobile.adapters.SearchSuggestionAdapter; import com.pennapps.labs.pennmobile.api.Labs; import java.util.ArrayList; /** * Created by Jason on 1/25/2016. */ public abstract class SearchFavoriteFragment extends ListFragment { protected Labs mLabs; protected MainActivity mActivity; protected ListView mListView; protected ViewPager viewPager; protected SearchView searchView; protected ListTabAdapter tabAdapter; protected String lastQuery; private static int pagePosition; protected final static int MAX_SUGGESTION_SIZE = 5; private final static int ALPHA = 73; public abstract class ListTabAdapter extends FragmentStatePagerAdapter { public ListTabAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return 2; } /** * This function implements what the adapter will do given a query * @param query the query passed in from the search view * @return bol changed or not, the return value hasn't been used yet. */ public abstract boolean onReceiveQuery (String query); public void setIndex(int indexKey, int arrayKey, String query) { addSearchQuery(indexKey, arrayKey, query, getActivity(), false); mActivity.closeKeyboard(); } @Override public CharSequence getPageTitle(int position) { if (position == 0) { return getString(R.string.search_all); } return getString(R.string.search_favorite); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mActivity = (MainActivity) getActivity(); mLabs = MainActivity.getLabsInstance(); lastQuery = ""; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View v = inflater.inflate(R.layout.fragment_search_favorite, container, false); viewPager = (ViewPager) v.findViewById(R.id.pager); tabAdapter = getAdapter(); viewPager.setAdapter(tabAdapter); viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(final int position) { if (position == 1) { ((SearchFavoriteTab) getAdapter().getItem(1)).initList(); } else { ((SearchFavoriteTab) getAdapter().getItem(0)).processQuery(lastQuery); } pagePosition = position; } @Override public void onPageScrollStateChanged(int state) { } }); mActivity.addTabs(getAdapter(), viewPager, false); FloatingActionButton fab = (FloatingActionButton) v.findViewById(R.id.search_fav_fab); fabInit(fab); return v; } @Override public void onListItemClick(ListView l, View v, int position, long id) { lastQuery = mListView.getAdapter().getItem(position).toString(); hideSuggestion(); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mListView = getListView(); mListView.setVisibility(View.GONE); setHasOptionsMenu(true); } /** * This method is to prepare an adapter for the view pager. * @return adapter the view pager to be set onto the view pager */ protected abstract ListTabAdapter getAdapter(); @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle presses on the action bar items switch (item.getItemId()) { case R.id.registrar_search: return true; default: return super.onOptionsItemSelected(item); } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.registrar, menu); searchView = (SearchView) menu.findItem(R.id.registrar_search).getActionView(); final ImageView cross = (ImageView) searchView.findViewById(R.id.search_close_btn); cross.setImageResource(R.drawable.ic_clear_white_24dp); cross.setImageAlpha(ALPHA); final SearchView.OnQueryTextListener queryListener = new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextChange(String arg0) { cross.setImageAlpha(255); return true; } @Override public boolean onQueryTextSubmit(String arg0) { lastQuery = arg0; hideSuggestion(); tabAdapter.onReceiveQuery(arg0); return true; } }; searchView.setOnQueryTextListener(queryListener); final View.OnFocusChangeListener focusListener = new View.OnFocusChangeListener() { @Override public void onFocusChange (View v, boolean hasFocus) { if (hasFocus) { showSuggestion(); } } }; final SearchView.OnCloseListener closeListener = new SearchView.OnCloseListener() { @Override public boolean onClose() { hideSuggestion(); mActivity.setTitle(getTitle()); return false; } }; searchView.setOnQueryTextFocusChangeListener(focusListener); searchView.setOnCloseListener(closeListener); cross.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event != null && event.getActionMasked() == MotionEvent.ACTION_UP) { (new Handler()).postDelayed(new Runnable() { @Override public void run() { cross.setImageAlpha(ALPHA); } }, 100); } return false; } }); } protected void showSuggestion() { mActivity.setTitle(""); mActivity.removeTabs(); final ArrayList<String> list = new ArrayList<>(5); SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(mActivity); int index = searchCount(); if (index != -1) { String[] previousKey = getResources().getStringArray(previousArrayKey()); for (int i = 0; i < MAX_SUGGESTION_SIZE; i++){ int id = (index + MAX_SUGGESTION_SIZE - i) % MAX_SUGGESTION_SIZE; String previous = sharedPref.getString(previousKey[id], ""); if (!previous.isEmpty()) { list.add(previous); } } } if (!list.isEmpty()) { viewPager.setVisibility(View.GONE); mListView.setVisibility(View.VISIBLE); mListView.setAdapter(new SearchSuggestionAdapter(mActivity, list)); } } protected void hideSuggestion() { mActivity.addTabs(getAdapter(), viewPager, false); viewPager.setVisibility(View.VISIBLE); tabAdapter.onReceiveQuery(lastQuery); mListView.setVisibility(View.GONE); } /** * Returns the R.id for getStringArray call * @return id */ protected abstract @ArrayRes int previousArrayKey(); /** * Returns the index of saved entries. * @return index index of the most recent search entry, -1 if there is none. */ protected abstract int searchCount(); @Override public void onDestroy() { super.onDestroy(); mActivity.removeTabs(); } @Override public void onDestroyView() { mActivity.removeTabs(); super.onDestroyView(); } public static void addSearchQuery(int indexKey, int arrayKey, String query, Activity activity, boolean caseSensitive) { SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(activity); int index = sharedPref.getInt(activity.getString(indexKey), -1); String[] previousKey = activity.getResources().getStringArray(arrayKey); SharedPreferences.Editor editor = sharedPref.edit(); if (index != -1) { boolean changed = false; for (int i = MAX_SUGGESTION_SIZE - 1; i >= 0; i--) { int id = (index + MAX_SUGGESTION_SIZE - i) % MAX_SUGGESTION_SIZE; String s = sharedPref.getString(previousKey[id], ""); if (s.equals(query) || (caseSensitive && s.equalsIgnoreCase(query))) { changed = true; } if (changed && i > 0) { int prev = (index + MAX_SUGGESTION_SIZE - i + 1) % MAX_SUGGESTION_SIZE; editor.putString(previousKey[id], sharedPref.getString(previousKey[prev], "")); } } if (changed) { editor.putString(previousKey[index], query); editor.apply(); return; } } index = (index + 1) % MAX_SUGGESTION_SIZE; editor.putInt(activity.getString(indexKey), index); editor.putString(previousKey[index], query); editor.apply(); } public static int getPagePosition() { return pagePosition; } /** * Get the title of the page * @return the string to be set as title */ protected abstract String getTitle(); /** * Set up the floating action button if necessary. Default visibility gone * @param fab the floating action button */ protected void fabInit(FloatingActionButton fab) { //Default nothing (visibility gone) } }