diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4f0cb89fc..f72968c2e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -27,10 +27,12 @@
+ android:name="android.permission.READ_EXTERNAL_STORAGE"
+ android:maxSdkVersion="18" />
+ android:name="android.permission.WRITE_EXTERNAL_STORAGE"
+ android:maxSdkVersion="18" />
selectedHabits)
- {
- new ExportCSVTask(activity, selectedHabits, progressBar).execute();
- }
}
diff --git a/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java b/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java
index c49665d67..22a0be019 100644
--- a/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java
+++ b/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java
@@ -25,7 +25,6 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
-import android.os.Environment;
import android.preference.PreferenceManager;
import android.view.ActionMode;
import android.view.ContextMenu;
@@ -49,14 +48,14 @@ import com.mobeta.android.dslv.DragSortController;
import com.mobeta.android.dslv.DragSortListView;
import com.mobeta.android.dslv.DragSortListView.DropListener;
+import org.isoron.uhabits.R;
+import org.isoron.uhabits.ReplayableActivity;
import org.isoron.uhabits.commands.Command;
+import org.isoron.uhabits.commands.ToggleRepetitionCommand;
+import org.isoron.uhabits.dialogs.FilePickerDialog;
import org.isoron.uhabits.helpers.DateHelper;
import org.isoron.uhabits.helpers.DialogHelper;
import org.isoron.uhabits.helpers.DialogHelper.OnSavedListener;
-import org.isoron.uhabits.ReplayableActivity;
-import org.isoron.uhabits.R;
-import org.isoron.uhabits.commands.ToggleRepetitionCommand;
-import org.isoron.uhabits.dialogs.FilePickerDialog;
import org.isoron.uhabits.helpers.HintManager;
import org.isoron.uhabits.helpers.ListHabitsHelper;
import org.isoron.uhabits.helpers.ReminderHelper;
@@ -434,7 +433,9 @@ public class ListHabitsFragment extends Fragment
public void showImportDialog()
{
- File dir = Environment.getExternalStorageDirectory();
+ File dir = activity.getExternalFilesDir(null);
+ if(dir == null) return;
+
FilePickerDialog picker = new FilePickerDialog(activity, dir);
picker.setFileListener(new FilePickerDialog.OnFileSelectedListener()
{
diff --git a/app/src/main/java/org/isoron/uhabits/helpers/DatabaseHelper.java b/app/src/main/java/org/isoron/uhabits/helpers/DatabaseHelper.java
index 804eeb2db..5d52679bf 100644
--- a/app/src/main/java/org/isoron/uhabits/helpers/DatabaseHelper.java
+++ b/app/src/main/java/org/isoron/uhabits/helpers/DatabaseHelper.java
@@ -2,6 +2,7 @@ package org.isoron.uhabits.helpers;
import android.content.Context;
import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
import com.activeandroid.ActiveAndroid;
@@ -51,9 +52,9 @@ public class DatabaseHelper
{
File db = getDatabaseFile(context, BuildConfig.databaseFilename);
- SimpleDateFormat dateFormat = DateHelper.getCSVDateFormat();
- String date = dateFormat.format(DateHelper.getStartOfToday());
- File dbCopy = new File(String.format("%s/Loop-Habits-Backup-%s.db", dir.getAbsolutePath(), date));
+ SimpleDateFormat dateFormat = DateHelper.getBackupDateFormat();
+ String date = dateFormat.format(DateHelper.getLocalTime());
+ File dbCopy = new File(String.format("%s/Loop Habits Backup %s.db", dir.getAbsolutePath(), date));
copy(db, dbCopy);
@@ -72,4 +73,16 @@ public class DatabaseHelper
return new File(String.format("%s/../databases/%s",
context.getApplicationContext().getFilesDir().getPath(), databaseFilename));
}
+
+ @Nullable
+ public static File getFilesDir(Context context, String prefix)
+ {
+ File baseDir = context.getExternalFilesDir(null);
+ if(baseDir == null) return null;
+ if(!baseDir.canWrite()) return null;
+
+ File dir = new File(String.format("%s/%s/", baseDir.getAbsolutePath(), prefix));
+ dir.mkdirs();
+ return dir;
+ }
}
diff --git a/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java b/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java
index 8a05c048b..85efd2630 100644
--- a/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java
+++ b/app/src/main/java/org/isoron/uhabits/helpers/DateHelper.java
@@ -105,6 +105,14 @@ public class DateHelper
return dateFormat;
}
+ public static SimpleDateFormat getBackupDateFormat()
+ {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.US);
+ dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+
+ return dateFormat;
+ }
+
public static String formatHeaderDate(GregorianCalendar day)
{
String dayOfMonth = Integer.toString(day.get(GregorianCalendar.DAY_OF_MONTH));
diff --git a/app/src/main/java/org/isoron/uhabits/io/HabitsCSVExporter.java b/app/src/main/java/org/isoron/uhabits/io/HabitsCSVExporter.java
index ef23e997b..6370dc6bc 100644
--- a/app/src/main/java/org/isoron/uhabits/io/HabitsCSVExporter.java
+++ b/app/src/main/java/org/isoron/uhabits/io/HabitsCSVExporter.java
@@ -44,13 +44,10 @@ public class HabitsCSVExporter
private String exportDirName;
- public HabitsCSVExporter(List habits, String exportDirName)
+ public HabitsCSVExporter(List habits, File dir)
{
this.habits = habits;
- this.exportDirName = exportDirName;
-
- if(!this.exportDirName.endsWith("/"))
- this.exportDirName += "/";
+ this.exportDirName = dir.getAbsolutePath() + "/";
generateDirs = new LinkedList<>();
generateFilenames = new LinkedList<>();
@@ -98,7 +95,7 @@ public class HabitsCSVExporter
{
SimpleDateFormat dateFormat = DateHelper.getCSVDateFormat();
String date = dateFormat.format(DateHelper.getStartOfToday());
- String zipFilename = String.format("%s/Loop-Habits-CSV-%s.zip", exportDirName, date);
+ String zipFilename = String.format("%s/Loop Habits CSV %s.zip", exportDirName, date);
FileOutputStream fos = new FileOutputStream(zipFilename);
ZipOutputStream zos = new ZipOutputStream(fos);
@@ -127,21 +124,13 @@ public class HabitsCSVExporter
fis.close();
}
- public String writeArchive()
+ public String writeArchive() throws IOException
{
String zipFilename;
- try
- {
- writeHabits();
- zipFilename = writeZipFile();
- cleanup();
- }
- catch (IOException e)
- {
- e.printStackTrace();
- return null;
- }
+ writeHabits();
+ zipFilename = writeZipFile();
+ cleanup();
return zipFilename;
}
diff --git a/app/src/main/java/org/isoron/uhabits/tasks/ExportCSVTask.java b/app/src/main/java/org/isoron/uhabits/tasks/ExportCSVTask.java
index 526e3ff57..151abb242 100644
--- a/app/src/main/java/org/isoron/uhabits/tasks/ExportCSVTask.java
+++ b/app/src/main/java/org/isoron/uhabits/tasks/ExportCSVTask.java
@@ -25,12 +25,14 @@ import android.os.AsyncTask;
import android.view.View;
import android.widget.ProgressBar;
-import org.isoron.uhabits.ReplayableActivity;
import org.isoron.uhabits.R;
+import org.isoron.uhabits.ReplayableActivity;
+import org.isoron.uhabits.helpers.DatabaseHelper;
import org.isoron.uhabits.io.HabitsCSVExporter;
import org.isoron.uhabits.models.Habit;
import java.io.File;
+import java.io.IOException;
import java.util.List;
public class ExportCSVTask extends AsyncTask
@@ -82,9 +84,18 @@ public class ExportCSVTask extends AsyncTask
@Override
protected Void doInBackground(Void... params)
{
- String dirName = String.format("%s/export/", activity.getExternalCacheDir());
- HabitsCSVExporter exporter = new HabitsCSVExporter(selectedHabits, dirName);
- archiveFilename = exporter.writeArchive();
+ try
+ {
+ File dir = DatabaseHelper.getFilesDir(activity, "CSV");
+ if(dir == null) return null;
+
+ HabitsCSVExporter exporter = new HabitsCSVExporter(selectedHabits, dir);
+ archiveFilename = exporter.writeArchive();
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ }
return null;
}
diff --git a/app/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java b/app/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java
index c8ae50681..02b8e5720 100644
--- a/app/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java
+++ b/app/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java
@@ -82,7 +82,10 @@ public class ExportDBTask extends AsyncTask
try
{
- filename = DatabaseHelper.saveDatabaseCopy(activity, activity.getExternalCacheDir());
+ File dir = DatabaseHelper.getFilesDir(activity, "Backups");
+ if(dir == null) return null;
+
+ filename = DatabaseHelper.saveDatabaseCopy(activity, dir);
}
catch(IOException e)
{
diff --git a/app/src/main/res/menu/list_habits_context.xml b/app/src/main/res/menu/list_habits_context.xml
index 23c76426f..b48ffc38c 100644
--- a/app/src/main/res/menu/list_habits_context.xml
+++ b/app/src/main/res/menu/list_habits_context.xml
@@ -40,10 +40,6 @@
android:title="@string/unarchive"
android:icon="@drawable/ic_action_unarchive_light"/>
-
-