package com.pluscubed.plustimer.ui.historysessions; import android.content.Context; import android.os.Bundle; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.github.mikephil.charting.charts.LineChart; import com.github.mikephil.charting.components.XAxis; import com.github.mikephil.charting.data.LineData; import com.pluscubed.plustimer.R; import com.pluscubed.plustimer.model.Session; import com.pluscubed.plustimer.utils.Utils; import java.util.ArrayList; import java.util.List; public class HistorySessionsAdapter extends RecyclerView.Adapter<HistorySessionsAdapter.ViewHolder> implements HistorySessionsAdapterView { private static final int HEADER_VIEWTYPE = 2; private static final int HEADER_ID = -1; private static final String STATE_SESSIONS = "state_sessions"; private static final String STATE_STATS = "state_stats"; private static final String TAG_GRAPH_INITIALIZED = "graph_initialized"; private final Context mContext; private boolean mMillisecondsEnabled; private String mStats; private LineData mLineChartData; //private boolean mAnimatingChart; private HistorySessionsPresenter mPresenter; private List<Session> mSessions; public HistorySessionsAdapter(Context context, Bundle savedInstanceState) { mContext = context; if (savedInstanceState == null) { mSessions = new ArrayList<>(); } else { mSessions = savedInstanceState.getParcelableArrayList(STATE_SESSIONS); mStats = savedInstanceState.getString(STATE_STATS); } mLineChartData = null; setHasStableIds(true); } @Override public void setSessions(List<Session> sessions) { mSessions = sessions; } @Override public void setStats(String string) { mStats = string; } @Override public void setLineData(LineData data) { mLineChartData = data; } @Override public void notifyHeaderChanged() { notifyItemChanged(0); } @Override public void setMillisecondsEnabled(boolean millisecondsEnabled) { mMillisecondsEnabled = millisecondsEnabled; } @Override public void onPresenterPrepared(HistorySessionsPresenter presenter) { mPresenter = presenter; } @Override public void onPresenterDestroyed() { mPresenter = null; } public void onSaveInstanceState(Bundle outState) { //TODO: TransactionTooLargeException is possible, but this is linked to the more serious problem of how much data is stored in memory in general outState.putParcelableArrayList(STATE_SESSIONS, (ArrayList<Session>) mSessions); outState.putString(STATE_STATS, mStats); } @Override public int getItemViewType(int position) { return position == 0 ? HEADER_VIEWTYPE : 0; } @Override public long getItemId(int position) { return position == 0 ? HEADER_ID : mSessions.get(position - 1).getId().hashCode(); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate( viewType == HEADER_VIEWTYPE ? R.layout.list_item_sessions_header : R.layout.list_item_single_line, parent, false); return new ViewHolder(view, viewType); } @Override public void onBindViewHolder(ViewHolder holder, int position) { if (position == 0) { holder.textView.setText(mStats); if (holder.graph.getTag() == null || !holder.graph.getTag().equals(TAG_GRAPH_INITIALIZED)) { holder.graph.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM); holder.graph.getXAxis().setAvoidFirstLastClipping(true); holder.graph.getAxisLeft().setAxisMinValue(0); holder.graph.setDescription(""); holder.graph.getAxisLeft().setValueFormatter( (value, yAxis) -> Utils.timeStringFromNs((long) value, mMillisecondsEnabled)); holder.graph.getAxisRight().setEnabled(false); holder.graph.setNoDataText("Not enough solves to generate graph"); holder.graph.invalidate(); holder.graph.setTag(TAG_GRAPH_INITIALIZED); } if (mLineChartData != null) { holder.graph.setData(mLineChartData); holder.graph.getXAxis().setLabelsToSkip(mLineChartData.getXValCount() - 2); holder.graph.invalidate(); /*if(!mAnimatingChart) { mAnimatingChart = true; FastOutSlowInInterpolator fastOutSlowInInterpolator = new FastOutSlowInInterpolator(); holder.graph.animateY(300, fastOutSlowInInterpolator::getInterpolation); holder.graph.postDelayed(() -> mAnimatingChart = false, 300); }*/ } else { holder.graph.clear(); } } else { String timestamp = mSessions.get(position - 1).getTimestampString(mContext).toBlocking().value(); holder.textView.setText(timestamp); } } @Override public int getItemCount() { return 1 + mSessions.size(); } public class ViewHolder extends RecyclerView.ViewHolder { public TextView textView; public LineChart graph; public ViewHolder(View v, int viewType) { super(v); if (viewType == HEADER_VIEWTYPE) { graph = (LineChart) v.findViewById(R.id.history_sessions_linechart); textView = (TextView) v.findViewById(R.id.history_sessions_stats); } else { textView = (TextView) v.findViewById(android.R.id.text1); v.setOnClickListener(v1 -> mPresenter.onSessionClicked(mSessions.get(getAdapterPosition() - 1))); } } } }