/*
* Copyright (C) 2012-2016 The Android Money Manager Ex Project Team
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.money.manager.ex.core;
import android.app.ProgressDialog;
import android.content.Context;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Environment;
import android.text.TextUtils;
import android.widget.Toast;
import com.money.manager.ex.R;
import com.money.manager.ex.adapter.AllDataAdapter;
import com.money.manager.ex.database.QueryAllData;
import com.money.manager.ex.log.ExceptionHandler;
import com.opencsv.CSVWriter;
import java.io.File;
import java.io.FileWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import timber.log.Timber;
public class ExportToCsvFile
extends AsyncTask<Void, Void, Boolean> {
private Context mContext;
private AllDataAdapter mAdapter;
private ProgressDialog dialog;
private String mFileName = null;
private String mPrefix = "";
public ExportToCsvFile(Context context, AllDataAdapter adapter) {
mContext = context;
mAdapter = adapter;
// create progress binaryDialog
dialog = new ProgressDialog(mContext);
}
@Override
protected Boolean doInBackground(Void... params) {
try {
return runTask();
} catch (Exception e) {
throw new RuntimeException("Error in Export to CSV", e);
}
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
// prompt
Toast.makeText(mContext,
mContext.getString(result ? R.string.export_file_complete
: R.string.export_file_failed, mFileName),
Toast.LENGTH_LONG).show();
}
@Override
protected void onPreExecute() {
super.onPreExecute();
// file
File externalStorage = Environment.getExternalStorageDirectory();
if (!(externalStorage != null && externalStorage.exists() && externalStorage.isDirectory()))
return;
// create folder to copy database
File folderOutput = new File(externalStorage + "/" + mContext.getPackageName());
// make a directory
if (!folderOutput.exists()) {
if (!folderOutput.mkdirs())
return;
}
String prefix = getPrefixName();
if (!TextUtils.isEmpty(prefix))
prefix = prefix + "_";
// compose file name
mFileName = folderOutput + "/" + prefix
+ new SimpleDateFormat("yyyyMMddhhmmss").format(Calendar.getInstance().getTime()) + ".csv";
// binaryDialog
dialog.setIndeterminate(true);
dialog.setMessage(mContext.getString(R.string.export_data_in_progress));
dialog.show();
}
private boolean runTask() {
if (mAdapter == null || mAdapter.getCursor() == null)
return false;
// take cursor
Cursor data = mAdapter.getCursor();
// create object to write csv file
try {
CSVWriter csvWriter = new CSVWriter(new FileWriter(mFileName), CSVWriter.DEFAULT_SEPARATOR,
CSVWriter.NO_QUOTE_CHARACTER);
while (data.moveToNext()) {
String[] record = new String[7];
// compose a records
record[0] = data.getString(data.getColumnIndex(QueryAllData.UserDate));
if (!TextUtils.isEmpty(data.getString(data.getColumnIndex(QueryAllData.Payee)))) {
record[1] = data.getString(data.getColumnIndex(QueryAllData.Payee));
} else {
record[1] = data.getString(data.getColumnIndex(QueryAllData.AccountName));
}
record[2] = Double.toString(data.getDouble(data.getColumnIndex(QueryAllData.Amount)));
record[3] = data.getString(data.getColumnIndex(QueryAllData.Category));
record[4] = data.getString(data.getColumnIndex(QueryAllData.Subcategory));
record[5] = Integer.toString(data.getInt(data.getColumnIndex(QueryAllData.TransactionNumber)));
record[6] = data.getString(data.getColumnIndex(QueryAllData.Notes));
// writer record
csvWriter.writeNext(record);
// move to next row
data.moveToNext();
}
csvWriter.close();
} catch (Exception e) {
Timber.e(e, "exporting to CSV");
return false;
}
return true;
}
/**
* @return the mPrefix
*/
public String getPrefixName() {
if (TextUtils.isEmpty(mPrefix)) {
return "";
} else {
return mPrefix;
}
}
/**
* @param mPrefix
* the mPrefix to set
*/
public void setPrefixName(String mPrefix) {
this.mPrefix = mPrefix;
}
}