package com.evancharlton.mileage; import com.evancharlton.mileage.dao.Fillup; import com.evancharlton.mileage.dao.Vehicle; import com.evancharlton.mileage.provider.Statistic; import com.evancharlton.mileage.provider.Statistics.CostStatistic; import com.evancharlton.mileage.provider.Statistics.DistanceStatistic; import com.evancharlton.mileage.provider.Statistics.EconomyStatistic; import com.evancharlton.mileage.provider.Statistics.FuelStatistic; import com.evancharlton.mileage.provider.Statistics.PriceStatistic; import com.evancharlton.mileage.provider.StatisticsGroup; import com.evancharlton.mileage.provider.tables.FillupsTable; import com.evancharlton.mileage.tasks.FillupInfoTask; import com.evancharlton.mileage.tasks.FillupInfoTask.DataHolder; import com.evancharlton.mileage.views.DividerView; import com.evancharlton.mileage.views.FormattedDateView; import android.app.Activity; import android.content.ContentUris; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; public class FillupInfoActivity extends Activity implements View.OnClickListener { private static final String TAG = "FillupInfoActivity"; private static final Statistic[] INFO = { new PartialStatistic(R.string.column_partial), new FuelStatistic(R.string.column_volume), new DistanceStatistic(R.string.column_odometer), new PriceStatistic(R.string.column_unit_price), new CostStatistic(R.string.column_total_cost) }; private static final Statistic[] STATS = { new DistanceStatistic(R.string.info_distance), new EconomyStatistic(R.string.info_economy) }; private static final StatisticsGroup[] GROUPS = { new StatisticsGroup(R.string.divider_fillup_info, INFO), new StatisticsGroup(R.string.divider_fillup_statistics, STATS) }; private final SparseArray<Holder> mLayouts = new SparseArray<Holder>(); private FillupInfoTask mInfoTask; private Fillup mFillup; private Vehicle mVehicle; private LayoutInflater mInflater; private LinearLayout mStatContainer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fillup_info); mInflater = LayoutInflater.from(this); Button previous = (Button) findViewById(R.id.previous); Button next = (Button) findViewById(R.id.next); next.setOnClickListener(this); previous.setOnClickListener(this); findViewById(R.id.edit).setOnClickListener(this); mStatContainer = (LinearLayout) findViewById(R.id.stat_container); long id = getIntent().getLongExtra(BaseFormActivity.EXTRA_ITEM_ID, -1); Uri uri = ContentUris.withAppendedId(FillupsTable.BASE_URI, id); Cursor cursor = getContentResolver().query(uri, null, null, null, null); mFillup = new Fillup(cursor); cursor.close(); mVehicle = Vehicle.loadById(this, mFillup.getVehicleId()); for (StatisticsGroup group : GROUPS) { DividerView divider = (DividerView) mInflater.inflate(R.layout.divider, mStatContainer, false); mStatContainer.addView(divider); divider.setText(group.getLabel()); for (Statistic stat : group.getStatistics()) { ViewGroup layout = (ViewGroup) mInflater.inflate(R.layout.statistic, mStatContainer, false); mStatContainer.addView(layout); mLayouts.append(stat.getLabel(), new Holder(layout, stat)); ((TextView) layout.findViewById(android.R.id.text1)).setText(stat.getLabel(this, mVehicle)); } } mFillup.setPrevious(mFillup.loadPrevious(this)); mFillup.setNext(mFillup.loadNext(this)); previous.setEnabled(mFillup.hasPrevious()); next.setEnabled(mFillup.hasNext()); FormattedDateView header = (FormattedDateView) findViewById(R.id.header); header.setText(mFillup.getTimestamp()); setTitle(getString(R.string.title_fillup, header.getText())); } @Override protected void onResume() { super.onResume(); mInfoTask = new FillupInfoTask(mFillup); mInfoTask.attach(this); mInfoTask.execute(); } @Override public void onClick(View v) { Intent intent; switch (v.getId()) { case R.id.edit: intent = new Intent(this, FillupActivity.class); intent.putExtra(BaseFormActivity.EXTRA_ITEM_ID, getIntent().getLongExtra(BaseFormActivity.EXTRA_ITEM_ID, -1)); startActivity(intent); break; case R.id.previous: intent = new Intent(this, FillupInfoActivity.class); intent.putExtra(BaseFormActivity.EXTRA_ITEM_ID, mFillup.getPrevious().getId()); startActivity(intent); finish(); Overrider.get(this).overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left); break; case R.id.next: intent = new Intent(this, FillupInfoActivity.class); intent.putExtra(BaseFormActivity.EXTRA_ITEM_ID, mFillup.getNext().getId()); startActivity(intent); finish(); Overrider.get(this).overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right); break; } } public void addInformation(DataHolder update) { Holder holder = mLayouts.get(update.key); if (holder == null) return; ViewGroup view = holder.view; TextView stat = (TextView) view.findViewById(android.R.id.text2); stat.setText(holder.statistic.format(this, mVehicle, update.data)); } private static final class Holder { public final ViewGroup view; public final Statistic statistic; public Holder(ViewGroup view, Statistic statistic) { this.view = view; this.statistic = statistic; } } private static final class PartialStatistic extends Statistic { public PartialStatistic(int label) { super(label); } @Override public String format(Context context, Vehicle vehicle, double value) { return String.format("%b", value > 0); } } private static class Overrider { public static Overrider get(Activity activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) { return new RealOverrider(activity); } return new Overrider(activity); } protected final Activity mActivity; public Overrider(Activity activity) { mActivity = activity; } public void overridePendingTransition(int in, int out) { } private static class RealOverrider extends Overrider { public RealOverrider(Activity activity) { super(activity); } @Override public void overridePendingTransition(int in, int out) { mActivity.overridePendingTransition(in, out); } } } }