/*
* Copyright (C) 2016 Glucosio Foundation
*
* This file is part of Glucosio.
*
* Glucosio 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, version 3.
*
* Glucosio 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 Glucosio. If not, see <http://www.gnu.org/licenses/>.
*
*
*/
package org.glucosio.android.presenter;
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.FileProvider;
import android.util.Log;
import org.glucosio.android.db.DatabaseHandler;
import org.glucosio.android.db.GlucoseReading;
import org.glucosio.android.tools.ReadingToCSV;
import org.glucosio.android.view.ExportView;
import java.io.File;
import java.util.Calendar;
import java.util.List;
import io.realm.Realm;
public class ExportPresenter {
// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
private int fromDay;
private int fromMonth;
private int fromYear;
private int toDay;
private int toMonth;
private int toYear;
private Activity mActivity;
private ExportView mExportView;
private DatabaseHandler dB;
public ExportPresenter(Activity activity, DatabaseHandler databaseHandler) {
mActivity = activity;
if (activity instanceof ExportView) {
mExportView = (ExportView) activity;
} else {
throw new RuntimeException("ExportPresenter Activity must implement ExportView interface");
}
dB = databaseHandler;
}
public void onExportClicked(final boolean isExportAll) {
if (hasStoragePermissions(mActivity)) {
final String preferredUnit = dB.getUser(1).getPreferred_unit();
final boolean[] isEmpty = {false};
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
Realm realm = dB.getNewRealmInstance();
final List<GlucoseReading> readings;
if (isExportAll) {
readings = dB.getGlucoseReadings(realm);
} else {
Calendar fromDate = Calendar.getInstance();
fromDate.set(Calendar.YEAR, fromYear);
fromDate.set(Calendar.MONTH, fromMonth);
fromDate.set(Calendar.DAY_OF_MONTH, fromDay);
Calendar toDate = Calendar.getInstance();
toDate.set(Calendar.YEAR, toYear);
toDate.set(Calendar.MONTH, toMonth);
toDate.set(Calendar.DAY_OF_MONTH, toDay);
readings = dB.getGlucoseReadings(realm, fromDate.getTime(), toDate.getTime());
}
mExportView.onExportStarted(readings.size());
if (readings.isEmpty()) {
isEmpty[0] = true;
return null;
}
if (dirExists()) {
Log.i("glucosio", "Dir exists");
return new ReadingToCSV(mActivity, preferredUnit).createCSVFile(realm, readings);
} else {
Log.i("glucosio", "Dir NOT exists");
return null;
}
}
@Override
protected void onPostExecute(String filename) {
super.onPostExecute(filename);
if (filename != null) {
Uri uri = FileProvider.getUriForFile(mActivity.getApplicationContext(),
mActivity.getApplicationContext().getPackageName() + ".provider.fileprovider", new File(filename));
mExportView.onExportFinish(uri);
} else if (isEmpty[0]) {
mExportView.onNoItemsToExport();
} else {
mExportView.onExportError();
}
}
}.execute();
}
}
private boolean dirExists() {
final File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/glucosio");
return file.exists() || file.mkdirs();
}
private boolean hasStoragePermissions(Activity activity) {
// Check if we have write permission
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
Log.i("Glucosio", "Storage permissions granted.");
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
return false;
} else {
return true;
}
}
public int getFromDay() {
return fromDay;
}
public void setFromDay(int fromDay) {
this.fromDay = fromDay;
}
public int getFromMonth() {
return fromMonth;
}
public void setFromMonth(int fromMonth) {
this.fromMonth = fromMonth;
}
public int getFromYear() {
return fromYear;
}
public void setFromYear(int fromYear) {
this.fromYear = fromYear;
}
public int getToDay() {
return toDay;
}
public void setToDay(int toDay) {
this.toDay = toDay;
}
public int getToMonth() {
return toMonth;
}
public void setToMonth(int toMonth) {
this.toMonth = toMonth;
}
public int getToYear() {
return toYear;
}
public void setToYear(int toYear) {
this.toYear = toYear;
}
}