package com.evancharlton.mileage.tasks;
import com.evancharlton.mileage.ImportActivity;
import com.evancharlton.mileage.R;
import com.evancharlton.mileage.dao.Fillup;
import com.evancharlton.mileage.exceptions.InvalidFieldException;
import com.evancharlton.mileage.io.CsvDateFormatActivity;
import com.evancharlton.mileage.io.CsvImportActivity;
import com.evancharlton.mileage.provider.Settings;
import com.evancharlton.mileage.provider.tables.CacheTable;
import com.evancharlton.mileage.provider.tables.FillupsTable;
import android.content.ContentValues;
import android.os.Bundle;
import android.util.Log;
import au.com.bytecode.opencsv.CSVReader;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CsvImportTask extends AttachableAsyncTask<CsvImportActivity, Bundle, Integer, Integer> {
private static final String TAG = "CsvImportTask";
@Override
protected Integer doInBackground(Bundle... params) {
Bundle args = params[0];
boolean erase = args.getBoolean(ImportActivity.WIPE_DATA);
if (erase) {
getParent().getContentResolver().delete(FillupsTable.BASE_URI, null, null);
publishProgress(0, R.string.update_erased_database);
}
SimpleDateFormat formatter = new SimpleDateFormat(
args.getString(CsvDateFormatActivity.DATE_FORMAT));
getParent().getContentResolver().delete(CacheTable.BASE_URI, null, null);
publishProgress(0, R.string.update_erased_cache);
String base = args.getString(ImportActivity.FILENAME);
String filename = Settings.EXTERNAL_DIR + base;
CSVReader csvReader = null;
int i = 0;
try {
BufferedReader reader = new BufferedReader(new FileReader(filename));
csvReader = new CSVReader(reader);
// skip the row of headers
csvReader.readNext();
String[] data;
while ((data = csvReader.readNext()) != null) {
try {
ContentValues values = new ContentValues();
setDouble(values, Fillup.TOTAL_COST, args, data);
setDouble(values, Fillup.UNIT_PRICE, args, data);
setDouble(values, Fillup.VOLUME, args, data);
setDouble(values, Fillup.ODOMETER, args, data);
setDouble(values, Fillup.ECONOMY, args, data);
setDouble(values, Fillup.LATITUDE, args, data);
setDouble(values, Fillup.LONGITUDE, args, data);
setBoolean(values, Fillup.PARTIAL, args, data);
setBoolean(values, Fillup.RESTART, args, data);
int vehicleIndex = args.getInt(Fillup.VEHICLE_ID);
String vehicle = data[vehicleIndex];
long vehicleId = args.getLong("vehicle_" + vehicle);
values.put(Fillup.VEHICLE_ID, vehicleId);
int dateIndex = args.getInt(Fillup.DATE);
String date = data[dateIndex];
Date d = formatter.parse(date);
values.put(Fillup.DATE, d.getTime());
Fillup f = new Fillup(values);
f.save(getParent());
publishProgress(++i);
} catch (InvalidFieldException e) {
publishProgress(++i, e.getErrorMessage());
}
}
} catch (IOException e) {
} catch (ParseException e) {
Log.e(TAG, "Couldn't parse a field!", e);
} finally {
try {
if (csvReader != null) {
csvReader.close();
}
} catch (IOException e2) {
}
}
return i;
}
@Override
protected void onProgressUpdate(Integer... updates) {
if (updates.length == 2) {
getParent().error(updates[1]);
}
getParent().update(updates[0]);
}
@Override
protected void onPostExecute(Integer result) {
getParent().completed(result);
}
private String getData(Bundle args, String column, String[] data) {
return data[args.getInt(column)];
}
private void setDouble(ContentValues values, String column, Bundle args, String[] data)
throws InvalidFieldException {
try {
String value = getData(args, column, data);
Log.d(TAG, "Parsing '" + value + "' for " + column);
double parsed = Double.parseDouble(value);
values.put(column, parsed);
} catch (NumberFormatException e) {
e.printStackTrace();
values.put(column, 0D);
}
}
private void setBoolean(ContentValues values, String column, Bundle args, String[] data)
throws InvalidFieldException {
boolean parsed = Boolean.parseBoolean(getData(args, column, data));
values.put(column, parsed);
}
}