package com.evancharlton.mileage;
import com.evancharlton.mileage.dao.Dao;
import com.evancharlton.mileage.dao.Fillup;
import com.evancharlton.mileage.dao.ServiceInterval;
import com.evancharlton.mileage.dao.ServiceIntervalTemplate;
import com.evancharlton.mileage.dao.Vehicle;
import com.evancharlton.mileage.exceptions.InvalidFieldException;
import com.evancharlton.mileage.provider.FillUpsProvider;
import com.evancharlton.mileage.provider.tables.FillupsTable;
import com.evancharlton.mileage.provider.tables.ServiceIntervalTemplatesTable;
import com.evancharlton.mileage.provider.tables.ServiceIntervalsTable;
import com.evancharlton.mileage.views.CursorSpinner;
import com.evancharlton.mileage.views.DateButton;
import com.evancharlton.mileage.views.DateDelta;
import com.evancharlton.mileage.views.DistanceDelta;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
public class ServiceIntervalActivity extends BaseFormActivity {
private final ServiceInterval mInterval = new ServiceInterval(new ContentValues());
private CursorSpinner mVehicles;
private CursorSpinner mIntervalTemplates;
private EditText mTitle;
private EditText mDescription;
private DistanceDelta mDistance;
private DateDelta mDuration;
private EditText mOdometer;
private DateButton mDate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState, R.layout.service_interval);
}
@Override
protected Dao getDao() {
return mInterval;
}
@Override
protected String[] getProjectionArray() {
return ServiceIntervalsTable.PROJECTION;
}
@Override
protected Uri getUri(long id) {
return ContentUris.withAppendedId(
Uri.withAppendedPath(FillUpsProvider.BASE_URI, ServiceIntervalsTable.URI), id);
}
@Override
protected void initUI() {
mVehicles = (CursorSpinner) findViewById(R.id.vehicles);
mIntervalTemplates = (CursorSpinner) findViewById(R.id.types);
mTitle = (EditText) findViewById(R.id.title);
mDescription = (EditText) findViewById(R.id.description);
mDistance = (DistanceDelta) findViewById(R.id.distance);
mDuration = (DateDelta) findViewById(R.id.duration);
mOdometer = (EditText) findViewById(R.id.odometer);
mDate = (DateButton) findViewById(R.id.date);
mVehicles.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> list, View row, int position, long id) {
filterTemplates(id);
// update the odometer field
if (!mInterval.isExistingObject()) {
String[] projection = new String[] {
Fillup.ODOMETER
};
String selection = Fillup.VEHICLE_ID + " = ?";
String[] args = new String[] {
String.valueOf(id)
};
Cursor fillupsCursor =
getContentResolver().query(FillupsTable.BASE_URI, projection,
selection, args, Fillup.ODOMETER + " desc");
if (fillupsCursor.getCount() > 0) {
fillupsCursor.moveToFirst();
mOdometer.setText(fillupsCursor.getString(0));
}
fillupsCursor.close();
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
mIntervalTemplates.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> list, View row, int position, long id) {
Uri uri =
Uri.withAppendedPath(FillUpsProvider.BASE_URI,
ServiceIntervalTemplatesTable.URI);
uri = ContentUris.withAppendedId(uri, id);
Cursor intervalCursor =
getContentResolver().query(uri, ServiceIntervalTemplatesTable.PROJECTION,
null, null, null);
ServiceIntervalTemplate template = new ServiceIntervalTemplate(intervalCursor);
intervalCursor.close();
// Overwrite everything that's on the form.
mTitle.setText(template.getTitle());
mDescription.setText(template.getDescription());
mDistance.setDelta(template.getDistance());
mDuration.setDelta(template.getDuration());
}
@Override
public void onNothingSelected(AdapterView<?> list) {
}
});
}
private void filterTemplates(long id) {
StringBuilder selection = new StringBuilder();
selection.append(ServiceIntervalTemplate.VEHICLE_TYPE).append(" = ( select ")
.append(Vehicle.VEHICLE_TYPE).append(" from vehicles where ").append(Vehicle._ID)
.append(" = ?)");
String[] selectionArgs = new String[] {
String.valueOf(id)
};
mIntervalTemplates.filter(selection.toString(), selectionArgs);
}
@Override
protected void populateUI() {
mTitle.setText(mInterval.getTitle());
mDescription.setText(mInterval.getDescription());
mDistance.setDelta(mInterval.getDistance());
mDuration.setDelta(mInterval.getDuration());
mOdometer.setText(String.valueOf(mInterval.getStartOdometer()));
mDate.setDate(mInterval.getStartDate());
}
@Override
protected void setFields() throws InvalidFieldException {
String title = mTitle.getText().toString();
if (title.length() == 0) {
throw new InvalidFieldException(mTitle, R.string.error_invalid_interval_title);
}
mInterval.setTitle(title);
mInterval.setDescription(mDescription.getText().toString());
long duration = mDuration.getDelta();
if (duration == 0) {
throw new InvalidFieldException(mDescription, R.string.error_invalid_interval_duration);
}
mInterval.setDuration(duration);
try {
mInterval.setStartOdometer(Double.parseDouble(mOdometer.getText().toString()));
} catch (NumberFormatException e) {
throw new InvalidFieldException(mOdometer, R.string.error_invalid_interval_odometer);
}
long timestamp = mDate.getTimestamp();
if (timestamp == 0) {
throw new InvalidFieldException(R.string.error_invalid_interval_timestamp);
}
mInterval.setStartDate(timestamp);
long distance = mDistance.getDelta();
if (distance == 0) {
throw new InvalidFieldException(mDistance.getEditField(),
R.string.error_invalid_interval_distance);
}
mInterval.setDistance(mDistance.getDelta());
mInterval.setVehicleId(mVehicles.getSelectedItemId());
}
@Override
protected void saved() {
mInterval.deleteAlarm(this);
mInterval.scheduleAlarm(this, mInterval.getStartDate() + mInterval.getDuration());
super.saved();
}
@Override
protected int getCreateString() {
return R.string.add_service_interval;
}
@Override
public boolean canDelete() {
Cursor count = managedQuery(ServiceIntervalTemplatesTable.BASE_URI, null, null, null, null);
return count != null && count.getCount() > 1;
}
}