package ivl.android.moneybalance; import java.io.File; import java.io.FileWriter; import java.io.IOException; import android.annotation.TargetApi; import android.content.Context; import android.content.res.Resources; import android.media.MediaScannerConnection; import android.os.Build; import android.os.Environment; import android.util.Log; import android.widget.Toast; import ivl.android.moneybalance.data.Calculation; import ivl.android.moneybalance.filter.CsvOutput; class CsvExporter { static private final int MAX_FILENUM = 1000; static void export(Calculation calculation, Context context) { Resources res = context.getResources(); File root = Environment.getExternalStorageDirectory(); if (!root.canWrite()) { Toast.makeText(context, res.getString(R.string.export_error_no_permission), Toast.LENGTH_LONG).show(); return; } File dir = new File(root, res.getString(R.string.app_name)); if (!dir.exists() && !dir.mkdir()) { String message = String.format(res.getString(R.string.export_error_mkdir), dir.toString()); Toast.makeText(context, message , Toast.LENGTH_LONG).show(); return; } File csvFile = determineFileName(calculation, dir); if (csvFile == null) { Toast.makeText(context, res.getString(R.string.export_error_no_free_file), Toast.LENGTH_LONG).show(); return; } try { FileWriter writer = new FileWriter(csvFile); CsvOutput csv = new CsvOutput(calculation); writer.write(csv.toCsv()); writer.close(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) triggerMediaRescan(csvFile, context); String message = String.format(res.getString(R.string.export_success), csvFile.toString()); Toast.makeText(context, message, Toast.LENGTH_LONG).show(); } catch (IOException e) { String message = String.format(res.getString(R.string.export_error_write_failed), csvFile.toString()); Toast.makeText(context, message + ":" + e.toString(), Toast.LENGTH_LONG).show(); Log.e("moneybalance", message, e); } } private static File determineFileName(Calculation calculation, File dir) { String base = calculation.getTitle(); final char[] ILLEGAL_CHARS = { '\\', '/', '<', '>', '?', ':', '*', '|', '"', '\'' }; for (char illegal : ILLEGAL_CHARS) base = base.replace(illegal, '_'); File file = new File(dir, base + ".csv"); if (!file.exists()) return file; for (int i = 1; i < MAX_FILENUM; i++) { file = new File(dir, String.format("%s (%d).csv", base, i)); if (!file.exists()) return file; } return null; } @TargetApi(Build.VERSION_CODES.FROYO) private static void triggerMediaRescan(File file, Context context) { MediaScannerConnection.scanFile(context, new String[] { file.getAbsolutePath() }, null, null); } }