package com.evancharlton.mileage.io.input;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Dialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.Spinner;
import android.widget.TextView;
import au.com.bytecode.opencsv.CSVReader;
import com.evancharlton.mileage.R;
import com.evancharlton.mileage.models.FillUp;
public class CSVView extends ImportView {
private List<Map<String, String>> m_data = new ArrayList<Map<String, String>>();
private Spinner m_dateFormats;
private List<String[]> m_csvData;
private Map<String, Integer> m_vehicleMapping = new HashMap<String, Integer>();
public static final String INTENT_EXTRA = "intent_extra";
private static final int DIALOG_CSV_IMPORT = 3;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState, "csv");
setContentView(R.layout.import_csv);
m_title = (TextView) findViewById(R.id.title);
m_title.setText(getString(R.string.csv_file));
m_dateFormats = (Spinner) findViewById(R.id.date_format);
m_importer = new Runnable() {
@SuppressWarnings("unchecked")
public void run() {
final String filename = getInput();
CSVReader csv;
try {
csv = new CSVReader(new FileReader(filename));
m_csvData = csv.readAll();
csv.close();
String[] columns = m_csvData.get(0);
m_csvData.remove(0);
int date_column = 0;
int vehicle_id_column = 0;
int amount_column = 0;
for (int i = 0; i < columns.length; i++) {
columns[i] = columns[i].trim();
// translate them back into SQL columns
for (String key : FillUp.PLAINTEXT.keySet()) {
String val = FillUp.PLAINTEXT.get(key).trim();
if (val.equalsIgnoreCase(columns[i])) {
columns[i] = key;
}
}
if (columns[i].equalsIgnoreCase(FillUp.DATE)) {
date_column = i;
} else if (columns[i].equalsIgnoreCase(FillUp.VEHICLE_ID)) {
vehicle_id_column = i;
} else if (columns[i].equalsIgnoreCase(FillUp.AMOUNT)) {
amount_column = i;
}
}
int id = m_dateFormats.getSelectedItemPosition();
CharSequence[] patterns = getResources().getTextArray(R.array.date_patterns);
String pattern = (patterns[id]).toString();
SimpleDateFormat date_formatter = new SimpleDateFormat(pattern);
for (String[] row : m_csvData) {
HashMap<String, String> rowData = new HashMap<String, String>();
for (int i = 0; i < row.length; i++) {
String info = row[i];
if (i == date_column) {
Date d;
try {
d = date_formatter.parse(info);
info = String.valueOf(d.getTime());
} catch (ParseException e) {
}
} else if (i == vehicle_id_column) {
m_vehicleMapping.put(info, 1);
} else if (i == amount_column) {
if (info.length() == 0) {
// we have a dummy row, most likely a bad
// export. Just ignore it and move on.
rowData = new HashMap<String, String>();
break;
}
}
rowData.put(columns[i], info);
}
if (rowData.keySet().size() > 0) {
m_data.add(rowData);
}
}
m_handler.post(new Runnable() {
public void run() {
Bundle data = new Bundle();
data.putString(MESSAGE, getString(R.string.data_parsed));
data.putBoolean(SUCCESS, true);
Message msg = new Message();
msg.setData(data);
m_handler.handleMessage(msg);
}
});
} catch (final FileNotFoundException e) {
m_handler.post(new Runnable() {
public void run() {
Bundle data = new Bundle();
data.putString(MESSAGE, e.getMessage());
data.putBoolean(SUCCESS, false);
Message msg = new Message();
msg.setData(data);
m_handler.handleMessage(msg);
}
});
} catch (final IOException e) {
m_handler.post(new Runnable() {
public void run() {
Bundle data = new Bundle();
data.putString(MESSAGE, e.getMessage());
data.putBoolean(SUCCESS, false);
Message msg = new Message();
msg.setData(data);
m_handler.handleMessage(msg);
}
});
}
}
};
m_handler = new Handler() {
public void handleMessage(Message msg) {
Bundle data = msg.getData();
if (data.getBoolean(SUCCESS, false)) {
dismissDialog(DIALOG_IMPORTING);
showDialog(DIALOG_CSV_IMPORT);
}
}
};
}
@Override
protected Dialog onCreateDialog(int which) {
switch (which) {
case DIALOG_CSV_IMPORT:
return new CSVViewConfirm(this);
}
return super.onCreateDialog(which);
}
public List<Map<String, String>> getData() {
return m_data;
}
public Map<String, Integer> getVehicleMapping() {
return m_vehicleMapping;
}
@Override
protected String getHelp() {
return getString(R.string.help_import_csv);
}
@Override
protected String getHelpTitle() {
return getString(R.string.help_import_csv_title);
}
}