From ad391fa79150a8c1ce3587337fd797301235401a Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Wed, 23 Mar 2016 18:47:04 -0400 Subject: [PATCH] Remove extra permissions; better organize files dir --- app/src/main/AndroidManifest.xml | 6 +++-- .../java/org/isoron/uhabits/MainActivity.java | 18 +------------ .../fragments/HabitSelectionCallback.java | 18 +++---------- .../uhabits/fragments/ListHabitsFragment.java | 13 +++++----- .../uhabits/helpers/DatabaseHelper.java | 19 +++++++++++--- .../isoron/uhabits/helpers/DateHelper.java | 8 ++++++ .../isoron/uhabits/io/HabitsCSVExporter.java | 25 ++++++------------- .../isoron/uhabits/tasks/ExportCSVTask.java | 19 +++++++++++--- .../isoron/uhabits/tasks/ExportDBTask.java | 5 +++- app/src/main/res/menu/list_habits_context.xml | 4 --- 10 files changed, 65 insertions(+), 70 deletions(-) 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"/> - -