package com.ambergleam.android.photogallery.controller; import android.app.SearchManager; import android.content.Intent; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; 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.widget.TextView; import com.ambergleam.android.photogallery.BaseFragment; import com.ambergleam.android.photogallery.R; import com.ambergleam.android.photogallery.callbacks.ClearSearchesCallback; import com.ambergleam.android.photogallery.manager.DataManager; import com.ambergleam.android.photogallery.callbacks.LoadSearchesCallback; import com.ambergleam.android.photogallery.model.Search; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.inject.Inject; import butterknife.ButterKnife; import butterknife.Bind; public class HistoryFragment extends BaseFragment implements LoadSearchesCallback, ClearSearchesCallback { @Inject DataManager mDataManager; @Bind(R.id.fragment_history_empty) TextView mEmptyView; @Bind(R.id.fragment_history_recycler) RecyclerView mRecyclerView; private SearchAdapter mAdapter; public static HistoryFragment newInstance() { return new HistoryFragment(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_history, parent, false); ButterKnife.bind(this, view); setupUI(); return view; } @Override public void onResume() { super.onResume(); mDataManager.loadSearches(this); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.menu_history, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_item_history_clear: mDataManager.clearSearches(this); return true; default: return super.onOptionsItemSelected(item); } } @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); MenuItem menuItemClear = menu.findItem(R.id.menu_item_history_clear); menuItemClear.setVisible(!mAdapter.isEmpty()); } private void setupUI() { mAdapter = new SearchAdapter(new ArrayList<>()); mRecyclerView.setAdapter(mAdapter); mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); mRecyclerView.setHasFixedSize(true); } private void updateUI() { if (mAdapter.isEmpty()) { mRecyclerView.setVisibility(View.GONE); mEmptyView.setVisibility(View.VISIBLE); } else { mRecyclerView.setVisibility(View.VISIBLE); mEmptyView.setVisibility(View.GONE); } getActivity().invalidateOptionsMenu(); } private void search(Search search) { Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.setClass(getActivity(), GalleryActivity.class); intent.setAction(Intent.ACTION_SEARCH); intent.putExtra(SearchManager.QUERY, search.getText()); startActivity(intent); } @Override public void onSearchesLoaded(List<Search> searchList) { Collections.reverse(searchList); mAdapter.setList(searchList); mAdapter.notifyDataSetChanged(); updateUI(); } @Override public void onSearchesCleared() { mAdapter.setList(new ArrayList<>()); mAdapter.notifyDataSetChanged(); updateUI(); } public class SearchHolder extends RecyclerView.ViewHolder { @Bind(R.id.list_item_search_text) TextView mTextView; private Search mSearch; public SearchHolder(View view) { super(view); ButterKnife.bind(this, view); setupListeners(view); } public void bindSearch(Search search) { mSearch = search; mTextView.setText(mSearch.getText()); } private void setupListeners(View view) { view.setOnClickListener(v -> search(mSearch)); } } public class SearchAdapter extends RecyclerView.Adapter<SearchHolder> { private List<Search> mSearchList; public SearchAdapter(List<Search> searchList) { mSearchList = searchList; } @Override public SearchHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(getActivity()).inflate(R.layout.list_item_search, parent, false); return new SearchHolder(view); } @Override public void onBindViewHolder(SearchHolder holder, int position) { Search search = mSearchList.get(position); holder.bindSearch(search); } @Override public int getItemCount() { return mSearchList.size(); } public boolean isEmpty() { return getItemCount() == 0; } public void setList(List<Search> searchList) { mSearchList = searchList; } } }