package com.pluscubed.plustimer.ui.currentsessiontimer; import android.content.Context; import android.os.Bundle; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.ViewGroup; import android.widget.TextView; import com.pluscubed.plustimer.R; import com.pluscubed.plustimer.base.RecyclerViewUpdate; import com.pluscubed.plustimer.model.Solve; import com.pluscubed.plustimer.utils.PrefUtils; import com.pluscubed.plustimer.utils.Utils; import java.util.ArrayList; import java.util.List; public class TimeBarRecyclerAdapter extends RecyclerView.Adapter<TimeBarRecyclerAdapter.ViewHolder> implements TimeBarRecyclerAdapterView { private static final String STATE_SOLVES = "state_solves"; private static final String STATE_BEST = "state_best"; private static final String STATE_WORST = "state_worst"; private static final String STATE_INITIALIZED = "state_initialized"; private Solve mBest; private Solve mWorst; private Context mContext; private List<Solve> mSolves; private boolean mMillisecondsEnabled; private CurrentSessionTimerPresenter mPresenter; private boolean mInitialized; public TimeBarRecyclerAdapter(Context view, Bundle savedInstanceState) { mContext = view; if (savedInstanceState != null) { mBest = savedInstanceState.getParcelable(STATE_BEST); mWorst = savedInstanceState.getParcelable(STATE_WORST); mSolves = savedInstanceState.getParcelableArrayList(STATE_SOLVES); mInitialized = savedInstanceState.getBoolean(STATE_INITIALIZED); } else { mSolves = new ArrayList<>(); mInitialized = false; } updateMillisecondsMode(); setHasStableIds(true); } @Override public boolean isInitialized() { return mInitialized; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { TextView v = (TextView) LayoutInflater.from(parent.getContext()) .inflate(R.layout.recycler_item_solve, parent, false); return new ViewHolder(v); } @Override public void onBindViewHolder(ViewHolder holder, int position) { Solve s = mSolves.get(position); String timeString = s.getTimeString(mMillisecondsEnabled); if (s == mBest || s == mWorst) { holder.textView.setText(String.format("(%s)", timeString)); } else { holder.textView.setText(timeString); } } @Override public int getItemCount() { return mSolves.size(); } @Override public long getItemId(int position) { return mSolves.get(position).getId().hashCode(); } public void notifyChange(RecyclerViewUpdate mode, Solve solve) { switch (mode) { case DATA_RESET: notifyDataSetChanged(); break; case INSERT: mSolves.add(solve); notifyDataSetChanged(); break; case REMOVE: mSolves.remove(solve); notifyDataSetChanged(); break; case SINGLE_CHANGE: for (int i = 0; i < mSolves.size(); i++) { Solve foundSolve = mSolves.get(i); if (foundSolve.getId().equals(solve.getId())) { mSolves.set(i, solve); notifyItemChanged(i); break; } } break; case REMOVE_ALL: mSolves.clear(); notifyDataSetChanged(); break; } if (mode != RecyclerViewUpdate.REMOVE_ALL) { Solve oldBest = mBest; Solve oldWorst = mWorst; mBest = Utils.getBestSolveOfList(mSolves); mWorst = Utils.getWorstSolveOfList(mSolves); if (oldBest != null && !oldBest.equals(mBest)) { notifyItemChanged(mSolves.indexOf(oldBest)); notifyItemChanged(mSolves.indexOf(mBest)); } if (oldWorst != null && !oldWorst.equals(mWorst)) { notifyItemChanged(mSolves.indexOf(oldWorst)); notifyItemChanged(mSolves.indexOf(mWorst)); } } } @Override public void scrollRecyclerViewToLast(CurrentSessionTimerView view) { if (mSolves.size() >= 1) view.scrollRecyclerView(mSolves.size() - 1); } @Override public void updateMillisecondsMode() { boolean millisecondsWasEnabled = mMillisecondsEnabled; mMillisecondsEnabled = PrefUtils.isDisplayMillisecondsEnabled(mContext); if (mMillisecondsEnabled != millisecondsWasEnabled) { notifyItemRangeChanged(0, mSolves.size()); } } @Override public void onSaveInstanceState(Bundle outState) { outState.putParcelable(STATE_BEST, mBest); outState.putParcelable(STATE_WORST, mWorst); outState.putParcelableArrayList(STATE_SOLVES, (ArrayList<Solve>) mSolves); outState.putBoolean(STATE_INITIALIZED, mInitialized); } public void onPresenterPrepared(CurrentSessionTimerPresenter presenter) { mPresenter = presenter; } public void onPresenterDestroyed() { mPresenter = null; } @Override public void setSolves(List<Solve> solves) { mSolves = solves; mInitialized = true; } class ViewHolder extends RecyclerView.ViewHolder { public TextView textView; public ViewHolder(TextView v) { super(v); textView = v; textView.setOnClickListener(v1 -> mPresenter.onSolveClicked(mSolves.get(getAdapterPosition())) ); } } }