package com.evancharlton.mileage.services;
import com.evancharlton.mileage.dao.Fillup;
import com.evancharlton.mileage.dao.FillupSeries;
import com.evancharlton.mileage.dao.Vehicle;
import com.evancharlton.mileage.exceptions.InvalidFieldException;
import com.evancharlton.mileage.math.Calculator;
import com.evancharlton.mileage.provider.tables.FillupsTable;
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.util.Log;
public class RecalculateEconomyService extends IntentService {
private static final String TAG = "Mileage";
public static final String CALCULATION_FINISHED =
"com.evancharlton.mileage.services.RecalculateEconomyService.CALCULATION_FINISHED";
public static final String EXTRA_AVERAGE_ECONOMY = "average_economy";
public static void run(Context context, Vehicle vehicle) {
context.startService(new Intent(context, RecalculateEconomyService.class).putExtra(
Vehicle._ID, vehicle.getId()));
}
public RecalculateEconomyService() {
super(RecalculateEconomyService.class.getSimpleName());
}
@Override
protected void onHandleIntent(Intent intent) {
long vehicleId = intent.getLongExtra(Vehicle._ID, -1);
if (vehicleId == -1) {
Log.d(TAG, "No vehicle ID");
return;
}
Vehicle vehicle = Vehicle.loadById(this, vehicleId);
String[] args = new String[] {
String.valueOf(vehicle.getId())
};
String selection = Fillup.VEHICLE_ID + " = ?";
Cursor cursor =
getContentResolver().query(FillupsTable.BASE_URI, FillupsTable.PROJECTION,
selection, args, Fillup.ODOMETER + " asc");
if (cursor.getCount() <= 1) {
Log.d(TAG, "Not enough fillups to calculate economy");
return;
}
Log.d(TAG, "Recalculating");
// recalculate a whole bunch of shit
FillupSeries series = new FillupSeries();
while (cursor.moveToNext()) {
Fillup fillup = new Fillup(cursor);
series.add(fillup);
if (fillup.hasPrevious()) {
double economy = Calculator.fillupEconomy(vehicle, series);
if (economy != fillup.getEconomy()) {
fillup.setEconomy(economy);
}
} else {
fillup.setEconomy(0D);
}
try {
fillup.saveIfChanged(this);
} catch (InvalidFieldException e) {
return;
}
}
double avgEconomy = Calculator.averageEconomy(vehicle, series);
cursor.close();
sendBroadcast(new Intent(CALCULATION_FINISHED).setPackage(getPackageName()).putExtra(
EXTRA_AVERAGE_ECONOMY, avgEconomy));
}
}