package com.evancharlton.mileage.adapters; import com.evancharlton.mileage.R; import com.evancharlton.mileage.dao.Fillup; import com.evancharlton.mileage.dao.Vehicle; import com.evancharlton.mileage.math.Calculator; import com.evancharlton.mileage.provider.tables.FillupsTable; import com.evancharlton.mileage.views.FormattedCurrencyView; import com.evancharlton.mileage.views.FormattedDateView; import com.evancharlton.mileage.views.FormattedNumberView; import android.content.Context; import android.database.ContentObserver; import android.database.Cursor; import android.os.Handler; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.text.DecimalFormat; public class FillupAdapter extends BaseAdapter { private static final String TAG = "FillupAdapter"; private static final DecimalFormat ECONOMY_FORMAT = new DecimalFormat("0.00"); private static final DecimalFormat VOLUME_FORMAT = new DecimalFormat("0.00"); private static final String[] PROJECTION = FillupsTable.PROJECTION; private final Context mContext; private Cursor mCursor; private Vehicle mVehicle; private String mVolumeUnits; private String mEconomyUnits; private double mAvgEconomy; private final ContentObserver mObserver = new ContentObserver(new Handler()) { @Override public void onChange(boolean selfChange) { super.onChange(selfChange); requery(); } }; public FillupAdapter(Context context, Vehicle vehicle) { mContext = context; mContext.getContentResolver().registerContentObserver(FillupsTable.BASE_URI, true, mObserver); setVehicle(vehicle); } public void setVehicle(Vehicle vehicle) { mVehicle = vehicle; if (mCursor != null && !mCursor.isClosed()) { mCursor.close(); } mCursor = mContext.getContentResolver().query(FillupsTable.BASE_URI, PROJECTION, Fillup.VEHICLE_ID + " = ?", new String[] { String.valueOf(mVehicle.getId()) }, Fillup.ODOMETER + " DESC"); mVolumeUnits = " " + Calculator.getVolumeUnitsAbbr(mContext, vehicle); mEconomyUnits = " " + Calculator.getEconomyUnitsAbbr(mContext, vehicle); } public void requery() { mCursor.requery(); notifyDataSetChanged(); } @Override public int getCount() { return mCursor.getCount(); } @Override public Object getItem(int position) { if (mCursor != null && mCursor.moveToPosition(position)) { return new Fillup(mCursor); } return null; } @Override public long getItemId(int position) { if (mCursor != null && mCursor.moveToPosition(position)) { return mCursor.getLong(mCursor.getColumnIndex(Fillup._ID)); } return -1; } @Override public View getView(int position, View convertView, ViewGroup parent) { mCursor.moveToPosition(position); if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.fillup_list_item, parent, false); } Holder holder = (Holder) convertView.getTag(); if (holder == null) { holder = new Holder(convertView); } String value; holder.dateView.setText(mCursor.getString(mCursor.getColumnIndex(Fillup.DATE))); value = VOLUME_FORMAT.format(mCursor.getDouble(mCursor.getColumnIndex(Fillup.VOLUME))) + mVolumeUnits; holder.volume.setText(value); String currency = mVehicle.getCurrency(); holder.price.setCurrencySymbol(currency); holder.price.setText(mCursor.getString(mCursor.getColumnIndex(Fillup.UNIT_PRICE))); // holder.metaField.setText(mCursor.getString(mCursor.getColumnIndex(FillupField.VALUE))); // Set the economy double economy = mCursor.getDouble(mCursor.getColumnIndex(Fillup.ECONOMY)); holder.economy.setTextColor(holder.metaField.getTextColors().getDefaultColor()); if (mCursor.getInt(mCursor.getColumnIndex(Fillup.PARTIAL)) == 1) { value = mContext.getString(R.string.status_partial); } else if (economy == 0) { value = ""; } else { value = ECONOMY_FORMAT.format(economy) + mEconomyUnits; if (mAvgEconomy > 0) { if (Calculator.isBetterEconomy(mVehicle, economy, mAvgEconomy)) { holder.economy.setTextColor(0xFF0AB807); } else { holder.economy.setTextColor(0xFFD90000); } } } holder.economy.setText(value); return convertView; } private static class Holder { public final FormattedDateView dateView; public final TextView metaField; public final FormattedNumberView volume; public final FormattedCurrencyView price; public final FormattedNumberView economy; public Holder(View convertView) { dateView = (FormattedDateView) convertView.findViewById(android.R.id.text1); metaField = (TextView) convertView.findViewById(android.R.id.text2); volume = (FormattedNumberView) convertView.findViewById(R.id.volume); price = (FormattedCurrencyView) convertView.findViewById(R.id.price); economy = (FormattedNumberView) convertView.findViewById(R.id.economy); convertView.setTag(this); } } public void calculationFinished(double avgEconomy) { Log.d(TAG, "Average economy: " + avgEconomy); mAvgEconomy = avgEconomy; notifyDataSetChanged(); } public Context getContext() { return mContext; } }