package com.evancharlton.mileage; import com.evancharlton.mileage.dao.CachedValue; import com.evancharlton.mileage.dao.Dao; import com.evancharlton.mileage.dao.Fillup; import com.evancharlton.mileage.dao.Vehicle; import com.evancharlton.mileage.exceptions.InvalidFieldException; import com.evancharlton.mileage.math.Calculator; import com.evancharlton.mileage.provider.tables.CacheTable; import com.evancharlton.mileage.provider.tables.FillupsTable; import com.evancharlton.mileage.provider.tables.VehiclesTable; import com.evancharlton.mileage.views.CursorSpinner; import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.text.TextUtils; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Spinner; public class VehicleActivity extends BaseFormActivity { private EditText mTitle; private EditText mDescription; private EditText mMake; private EditText mModel; private EditText mYear; private EditText mCurrency; private CheckBox mSetDefault; private CursorSpinner mVehicleTypes; private Spinner mDistances; private Spinner mVolumes; private Spinner mEconomies; private Vehicle mVehicle = new Vehicle(new ContentValues()); private int mDistanceUnits = Calculator.MI; private int mVolumeUnits = Calculator.GALLONS; private int mEconomyUnits = Calculator.MI_PER_GALLON; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState, R.layout.vehicle); } @Override protected Dao getDao() { return mVehicle; } @Override protected String[] getProjectionArray() { return VehiclesTable.PROJECTION; } @Override protected Uri getUri(long id) { return ContentUris.withAppendedId(VehiclesTable.BASE_URI, id); } @Override protected void initUI() { mTitle = (EditText) findViewById(R.id.title); mDescription = (EditText) findViewById(R.id.description); mMake = (EditText) findViewById(R.id.make); mModel = (EditText) findViewById(R.id.model); mYear = (EditText) findViewById(R.id.year); mCurrency = (EditText) findViewById(R.id.currency); mVehicleTypes = (CursorSpinner) findViewById(R.id.type); mSetDefault = (CheckBox) findViewById(R.id.make_default); mDistances = (Spinner) findViewById(R.id.distance); mVolumes = (Spinner) findViewById(R.id.volume); mEconomies = (Spinner) findViewById(R.id.economy); mCurrency.setText(Calculator.getCurrencySymbol()); } @Override protected void populateUI() { mTitle.setText(mVehicle.getTitle()); mDescription.setText(mVehicle.getDescription()); mMake.setText(mVehicle.getMake()); mModel.setText(mVehicle.getModel()); mYear.setText(mVehicle.getYear()); Uri uri = VehiclesTable.BASE_URI; String[] projection = new String[] { Vehicle._ID }; Cursor c = managedQuery(uri, projection, null, null, Vehicle.DEFAULT_TIME + " desc"); if (c.getCount() > 0) { c.moveToFirst(); mSetDefault.setChecked(c.getLong(0) == mVehicle.getId()); } mDistances.setSelection(getDistanceUnits()); mVolumes.setSelection(getVolumeUnits()); mEconomies.setSelection(getEconomyUnits()); if (mVehicle.isExistingObject()) { setTitle(mVehicle.getTitle()); } mCurrency.setText(Calculator.getCurrencySymbol(mVehicle)); } @Override protected void setFields() throws InvalidFieldException { String title = mTitle.getText().toString().trim(); if (TextUtils.isEmpty(title)) { throw new InvalidFieldException(mTitle, R.string.error_invalid_vehicle_title); } mVehicle.setTitle(title); String year = mYear.getText().toString().trim(); if (TextUtils.isEmpty(year)) { throw new InvalidFieldException(mYear, R.string.error_invalid_vehicle_year); } mVehicle.setYear(year); String make = mMake.getText().toString().trim(); if (TextUtils.isEmpty(make)) { throw new InvalidFieldException(mMake, R.string.error_invalid_vehicle_make); } mVehicle.setMake(make); String model = mModel.getText().toString().trim(); if (TextUtils.isEmpty(model)) { throw new InvalidFieldException(mModel, R.string.error_invalid_vehicle_model); } mVehicle.setModel(model); String description = mDescription.getText().toString().trim(); mVehicle.setDescription(description); mVehicle.setVehicleType(mVehicleTypes.getSelectedItemId()); if (mSetDefault.isChecked()) { mVehicle.setDefaultTime(System.currentTimeMillis()); } mVehicle.setVolumeUnits(getVolume()); mVehicle.setDistanceUnits(getDistance()); mVehicle.setEconomyUnits(getEconomy()); String currency = mCurrency.getText().toString(); if (TextUtils.isEmpty(currency)) { currency = Calculator.getCurrencySymbol(); } mVehicle.setCurrency(mCurrency.getText().toString()); } @Override protected void saved() { // invalidate the fields if the economy units changed if (mVehicle.getVolumeUnits() != mVolumeUnits || mVehicle.getDistanceUnits() != mDistanceUnits || mVehicle.getEconomyUnits() != mEconomyUnits) { ContentValues values = new ContentValues(); values.put(Fillup.ECONOMY, 0D); String where = Fillup.VEHICLE_ID + " = ?"; String[] selectionArgs = new String[] { String.valueOf(mVehicle.getId()) }; Uri uri = FillupsTable.BASE_URI; getContentResolver().update(uri, values, where, selectionArgs); // Also blow away the statistics cache getContentResolver().delete(CacheTable.BASE_URI, CachedValue.ITEM + " = ?", selectionArgs); } super.saved(); } private int getVolume() { switch (mVolumes.getSelectedItemPosition()) { case 0: return Calculator.GALLONS; case 1: return Calculator.LITRES; case 2: return Calculator.IMPERIAL_GALLONS; } return Calculator.GALLONS; } private int getVolumeUnits() { switch (mVehicle.getVolumeUnits()) { case Calculator.GALLONS: return 0; case Calculator.LITRES: return 1; case Calculator.IMPERIAL_GALLONS: return 2; } return 0; } private int getDistance() { switch (mDistances.getSelectedItemPosition()) { case 0: return Calculator.MI; case 1: return Calculator.KM; } return Calculator.MI; } private int getDistanceUnits() { switch (mVehicle.getDistanceUnits()) { case Calculator.MI: return 0; case Calculator.KM: return 1; } return 0; } private int getEconomy() { switch (mEconomies.getSelectedItemPosition()) { case 0: return Calculator.MI_PER_GALLON; case 1: return Calculator.KM_PER_GALLON; case 2: return Calculator.MI_PER_IMP_GALLON; case 3: return Calculator.KM_PER_IMP_GALLON; case 4: return Calculator.MI_PER_LITRE; case 5: return Calculator.KM_PER_LITRE; case 6: return Calculator.GALLONS_PER_100KM; case 7: return Calculator.LITRES_PER_100KM; case 8: return Calculator.IMP_GAL_PER_100KM; } return Calculator.MI_PER_GALLON; } private int getEconomyUnits() { switch (mVehicle.getEconomyUnits()) { case Calculator.MI_PER_GALLON: return 0; case Calculator.KM_PER_GALLON: return 1; case Calculator.MI_PER_IMP_GALLON: return 2; case Calculator.KM_PER_IMP_GALLON: return 3; case Calculator.MI_PER_LITRE: return 4; case Calculator.KM_PER_LITRE: return 5; case Calculator.GALLONS_PER_100KM: return 6; case Calculator.LITRES_PER_100KM: return 7; case Calculator.IMP_GAL_PER_100KM: return 8; } return 0; } @Override protected int getCreateString() { return R.string.add_vehicle; } @Override public boolean canDelete() { Cursor count = managedQuery(VehiclesTable.BASE_URI, null, null, null, null); return count != null && count.getCount() > 1; } }