/*
* 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.file;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.support.v4.content.FileProvider;
import android.util.Log;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import timber.log.Timber;
/**
* Base for exporting any type of text files.
*/
public class TextFileExport {
public TextFileExport(Context context) {
mContext = context;
}
protected static final String ExportDirectory = "export";
protected final String LOGCAT = this.getClass().getSimpleName();
protected Context mContext;
/**
* Export text contents as a file.
* @param fileName The name of the file only (i.e. name + extension).
* @param contents Text contents to update into the file.
* @param dialogTitle The title to use for the export binaryDialog.
* @return Indicator whether the operation was successful.
* @throws IOException
*/
public boolean export(String fileName, String contents, String dialogTitle) throws IOException {
// clear previously exported files.
this.clearCache();
// update into temp file.
File file = createExportFile(fileName);
if (file == null) {
Timber.e("Error creating qif file in cache.");
return false;
}
boolean saved = dumpContentIntoFile(contents, file);
if (!saved) {
Timber.e("Error saving data into qif file.");
return false;
}
return export(file, dialogTitle);
}
/**
* Export an existing file.
*/
public boolean export(File file, String dialogTitle) {
// share file
offerFile(file, dialogTitle);
return true;
}
/**
* Delete all existing files in export directory.
*/
public void clearCache() throws IOException {
// delete all cached files.
File path = getExportDirectory();
File[] files = path.listFiles();
for(File file : files) {
file.delete();
}
}
public File createExportFile(String fileName) throws IOException {
File path = getExportDirectory();
// tempFile = File.createTempFile(localPath, ".qif", path);
File file = new File(path, fileName);
boolean fileCreated = file.createNewFile();
if (!fileCreated) {
throw new IOException("Could not create export file!");
}
// this is never called in Android: file.deleteOnExit();
return file;
}
private boolean dumpContentIntoFile(String content, File file) {
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write(content);
writer.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
public Context getContext() {
return mContext;
}
/**
* Generates the name of the export directory. Creates the directory if it does not exist.
* @return A directory into which to temporarily export .qif file.
* @throws IOException
*/
private File getExportDirectory() throws IOException {
File path = new File(getContext().getFilesDir(), ExportDirectory);
// File path = new File(this.context.getExternalFilesDir(null), ExportDirectory);
// File path = this.context.getExternalFilesDir(null);
// File path = new File(this.context.getCacheDir(), ExportDirectory);
// Create output directory if it does not exist.
if (!path.exists()) {
boolean directoryCreated = path.mkdir();
if(!directoryCreated) {
throw new IOException("Could not create export directory!");
}
}
return path;
}
private void offerFile(File file, String title) {
//protected static final String ProviderAuthority = mContext.getApplicationContext().getPackageName() + "com.money.manager.ex.fileprovider";
String authority = getContext().getApplicationContext().getPackageName() + ".fileprovider";
Uri contentUri = FileProvider.getUriForFile(getContext(), authority, file);
offerFile(contentUri, title);
}
private void offerFile(Uri fileUri, String title) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TITLE, title);
intent.putExtra(Intent.EXTRA_STREAM, fileUri);
Intent chooser = Intent.createChooser(intent, title);
getContext().startActivity(chooser);
}
}