package com.trevorhalvorson.devjobs.fragment; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.helper.ItemTouchHelper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.google.gson.Gson; import com.trevorhalvorson.devjobs.DividerItemDecoration; import com.trevorhalvorson.devjobs.R; import com.trevorhalvorson.devjobs.activity.MainActivity; import com.trevorhalvorson.devjobs.model.Search; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.TreeSet; /** * Created by Trevor Halvorson on 9/21/2015. */ public class SavedSearchesFragment extends Fragment { private static final String TAG = SavedSearchesFragment.class.getSimpleName(); private static final String SAVED_SEARCHES_KEY = "saved_searches_key"; public interface SavedSearchSelectedListener { void onSearchSelected(Search savedSearch); } public static void setListener(SavedSearchSelectedListener listener) { mListener = listener; } private static SavedSearchSelectedListener mListener; private RecyclerView mRecyclerView; private SwipeRefreshLayout mSwipeRefreshLayout; private SearchAdapter mSearchSearchAdapter; private List<Search> mSearchList = new ArrayList<>(); @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_saved_searches, container, false); mRecyclerView = (RecyclerView) rootView.findViewById(R.id.searchRecyclerView); mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST)); LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); mRecyclerView.setLayoutManager(layoutManager); mSwipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_refresh_layout); mSwipeRefreshLayout.setColorSchemeColors( getResources().getColor(R.color.primary_dark)); mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { setupAdapter(); } }); ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) { @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { return false; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { final int position = viewHolder.getAdapterPosition(); final Search searchRemoved = mSearchList.remove(position); mSearchSearchAdapter.notifyItemRemoved(position); removeSearch(searchRemoved); Snackbar.make( getActivity().findViewById(R.id.main_content), searchRemoved.toString() + " removed", Snackbar.LENGTH_LONG) .setAction(R.string.sb_action, new View.OnClickListener() { @Override public void onClick(View v) { mSearchList.add(searchRemoved); undoRemoveSearch(); setupAdapter(); } }) .show(); } }; ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback); itemTouchHelper.attachToRecyclerView(mRecyclerView); setupAdapter(); return rootView; } private void setupAdapter() { mSearchList.clear(); SharedPreferences preferences = getActivity().getPreferences(Context.MODE_PRIVATE); Gson gson = new Gson(); for (String json : preferences.getStringSet(SAVED_SEARCHES_KEY, new TreeSet<String>())) { Search search = gson.fromJson(json, Search.class); mSearchList.add(search); } mSearchSearchAdapter = new SearchAdapter(mSearchList); mRecyclerView.setAdapter(mSearchSearchAdapter); if (mSwipeRefreshLayout.isRefreshing()) { mSwipeRefreshLayout.setRefreshing(false); } } private void removeSearch(Search searchToRemove) { SharedPreferences preferences = getActivity().getPreferences(Context.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); Set<String> jsonSet = new TreeSet<>(); Gson gson = new Gson(); for (String search : preferences.getStringSet(SAVED_SEARCHES_KEY, new TreeSet<String>())) { if (!search.equals(gson.toJson(searchToRemove))) { jsonSet.add(search); } } editor.putStringSet(SAVED_SEARCHES_KEY, jsonSet); editor.apply(); } private void undoRemoveSearch() { SharedPreferences preferences = getActivity().getPreferences(Context.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); Set<String> jsonSet = new TreeSet<>(); Gson gson = new Gson(); for (Search search : mSearchList) { jsonSet.add(gson.toJson(search)); } editor.putStringSet(SAVED_SEARCHES_KEY, jsonSet); editor.apply(); } private class SearchHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private Search mSearch; private TextView mDescTextView; private TextView mLocTextView; public SearchHolder(View itemView) { super(itemView); itemView.setOnClickListener(this); mDescTextView = (TextView) itemView.findViewById(R.id.searchDescriptionTextView); mLocTextView = (TextView) itemView.findViewById(R.id.searchLocationTextView); } public void bindSearch(Search search) { mSearch = search; mDescTextView.setText(mSearch.getDescription()); if (mSearch.getLocation() != null) { mLocTextView.setText(mSearch.getLocation()); } } @Override public void onClick(View v) { MainActivity.setCurrentTab(0); mListener.onSearchSelected(mSearch); } } private class SearchAdapter extends RecyclerView.Adapter<SearchHolder> { private List<Search> mSearches = new ArrayList<>(); public SearchAdapter(List<Search> searches) { mSearches = searches; } @Override public SearchHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(getActivity()); View view = inflater.inflate(R.layout.list_item_search, parent, false); return new SearchHolder(view); } @Override public void onBindViewHolder(SearchHolder searchHolder, int position) { Search search = mSearches.get(position); searchHolder.bindSearch(search); } @Override public int getItemCount() { return mSearches.size(); } } }