Integrate database with history.
Bug: 31623549
Note: This CL operates under the assumption that there is something
in the current expression field (handling for various states of
CalculatorDisplay in ag/1613446)
Change-Id: I70992067ddc9c5eec079f00604549727787e26fe
diff --git a/src/com/android/calculator2/HistoryAdapter.java b/src/com/android/calculator2/HistoryAdapter.java
index 25c7044..19aa05b 100644
--- a/src/com/android/calculator2/HistoryAdapter.java
+++ b/src/com/android/calculator2/HistoryAdapter.java
@@ -23,7 +23,6 @@
import android.widget.TextView;
import java.util.ArrayList;
-import java.util.Calendar;
import java.util.List;
/**
@@ -34,20 +33,17 @@
private static final int EMPTY_VIEW_TYPE = 0;
private static final int HISTORY_VIEW_TYPE = 1;
- private final List<HistoryItem> mDataSet = new ArrayList<>();
- private String mCurrentExpression;
+ private final Evaluator mEvaluator;
+ /* Text/accessibility descriptor for the current expression item. */
+ private final String mCurrentExpressionDescription;
- public HistoryAdapter(int[] dataset, String currentExpression) {
- mCurrentExpression = currentExpression;
- // Temporary dataset
- final Calendar calendar = Calendar.getInstance();
- for (int i: dataset) {
- calendar.set(2016, 10, i);
- mDataSet.add(new HistoryItem(calendar.getTimeInMillis(), Integer.toString(i) + "+1",
- Integer.toString(i+1)));
- }
- // Temporary: just testing the empty view placeholder
- mDataSet.add(new HistoryItem());
+ private List<HistoryItem> mDataSet;
+
+ public HistoryAdapter(Calculator calculator, ArrayList<HistoryItem> dataSet,
+ String currentExpressionDescription) {
+ mEvaluator = Evaluator.getInstance(calculator);
+ mDataSet = dataSet;
+ mCurrentExpressionDescription = currentExpressionDescription;
}
@Override
@@ -64,21 +60,23 @@
}
@Override
- public void onBindViewHolder(HistoryAdapter.ViewHolder holder, int position) {
+ public void onBindViewHolder(final HistoryAdapter.ViewHolder holder, int position) {
final HistoryItem item = mDataSet.get(position);
if (item.isEmptyView()) {
return;
}
- if (!isCurrentExpressionItem(position)) {
+
+ holder.mFormula.setText(item.getFormula());
+ // Note: HistoryItems that are not the current expression will always have interesting ops.
+ holder.mResult.setEvaluator(mEvaluator, item.getId());
+ if (isCurrentExpressionItem(position)) {
+ holder.mDate.setText(mCurrentExpressionDescription);
+ holder.mDate.setContentDescription(mCurrentExpressionDescription);
+ } else {
holder.mDate.setText(item.getDateString());
holder.mDate.setContentDescription(item.getDateDescription());
- } else {
- holder.mDate.setText(mCurrentExpression);
- holder.mDate.setContentDescription(mCurrentExpression);
}
- holder.mFormula.setText(item.getFormula());
- holder.mResult.setText(item.getResult());
}
@Override
@@ -88,12 +86,23 @@
holder.mFormula.setText(null);
holder.mResult.setText(null);
+ // TODO: Only cancel the calculation for the recycled view
+ mEvaluator.cancelAll(true);
+
super.onViewRecycled(holder);
}
@Override
public int getItemViewType(int position) {
- return mDataSet.get(position).isEmptyView() ? EMPTY_VIEW_TYPE : HISTORY_VIEW_TYPE;
+ HistoryItem item = mDataSet.get(position);
+
+ // lazy-fill the data set
+ if (item == null) {
+ item = new HistoryItem(position, mEvaluator.getTimeStamp(position),
+ mEvaluator.getExprAsSpannable(position));
+ mDataSet.add(position, item);
+ }
+ return item.isEmptyView() ? EMPTY_VIEW_TYPE : HISTORY_VIEW_TYPE;
}
@Override
@@ -102,7 +111,11 @@
}
private boolean isCurrentExpressionItem(int position) {
- return position == mDataSet.size() - 1;
+ return position == 0;
+ }
+
+ public void setDataSet(ArrayList<HistoryItem> dataSet) {
+ mDataSet = dataSet;
}
public static class ViewHolder extends RecyclerView.ViewHolder {