mirror of
https://github.com/iSoron/uhabits.git
synced 2025-12-06 09:08:52 -06:00
Remove extra permissions; better organize files dir
This commit is contained in:
@@ -27,10 +27,12 @@
|
|||||||
<uses-permission android:name="android.permission.VIBRATE"/>
|
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||||
|
|
||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
android:name="android.permission.READ_EXTERNAL_STORAGE"
|
||||||
|
android:maxSdkVersion="18" />
|
||||||
|
|
||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||||
|
android:maxSdkVersion="18" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name="HabitsApplication"
|
android:name="HabitsApplication"
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ public class MainActivity extends ReplayableActivity
|
|||||||
switch (resultCode)
|
switch (resultCode)
|
||||||
{
|
{
|
||||||
case RESULT_IMPORT_DATA:
|
case RESULT_IMPORT_DATA:
|
||||||
onActionImportClicked();
|
listHabitsFragment.showImportDialog();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RESULT_EXPORT_CSV:
|
case RESULT_EXPORT_CSV:
|
||||||
@@ -166,22 +166,6 @@ public class MainActivity extends ReplayableActivity
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onActionImportClicked()
|
|
||||||
{
|
|
||||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
|
|
||||||
PackageManager.PERMISSION_GRANTED)
|
|
||||||
{
|
|
||||||
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN)
|
|
||||||
return;
|
|
||||||
|
|
||||||
String[] permissions = new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE };
|
|
||||||
ActivityCompat.requestPermissions(this, permissions, 0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
listHabitsFragment.showImportDialog();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onHabitClicked(Habit habit)
|
public void onHabitClicked(Habit habit)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -29,15 +29,14 @@ import android.widget.ProgressBar;
|
|||||||
import com.android.colorpicker.ColorPickerDialog;
|
import com.android.colorpicker.ColorPickerDialog;
|
||||||
import com.android.colorpicker.ColorPickerSwatch;
|
import com.android.colorpicker.ColorPickerSwatch;
|
||||||
|
|
||||||
import org.isoron.uhabits.helpers.ColorHelper;
|
|
||||||
import org.isoron.uhabits.helpers.DialogHelper;
|
|
||||||
import org.isoron.uhabits.ReplayableActivity;
|
|
||||||
import org.isoron.uhabits.R;
|
import org.isoron.uhabits.R;
|
||||||
|
import org.isoron.uhabits.ReplayableActivity;
|
||||||
import org.isoron.uhabits.commands.ArchiveHabitsCommand;
|
import org.isoron.uhabits.commands.ArchiveHabitsCommand;
|
||||||
import org.isoron.uhabits.commands.ChangeHabitColorCommand;
|
import org.isoron.uhabits.commands.ChangeHabitColorCommand;
|
||||||
import org.isoron.uhabits.commands.DeleteHabitsCommand;
|
import org.isoron.uhabits.commands.DeleteHabitsCommand;
|
||||||
import org.isoron.uhabits.commands.UnarchiveHabitsCommand;
|
import org.isoron.uhabits.commands.UnarchiveHabitsCommand;
|
||||||
import org.isoron.uhabits.tasks.ExportCSVTask;
|
import org.isoron.uhabits.helpers.ColorHelper;
|
||||||
|
import org.isoron.uhabits.helpers.DialogHelper;
|
||||||
import org.isoron.uhabits.loaders.HabitListLoader;
|
import org.isoron.uhabits.loaders.HabitListLoader;
|
||||||
import org.isoron.uhabits.models.Habit;
|
import org.isoron.uhabits.models.Habit;
|
||||||
|
|
||||||
@@ -199,12 +198,6 @@ public class HabitSelectionCallback implements ActionMode.Callback
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
case R.id.action_export_csv:
|
|
||||||
{
|
|
||||||
onExportHabitsClick(selectedHabits);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -215,9 +208,4 @@ public class HabitSelectionCallback implements ActionMode.Callback
|
|||||||
{
|
{
|
||||||
if(listener != null) listener.onActionModeDestroyed(mode);
|
if(listener != null) listener.onActionModeDestroyed(mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onExportHabitsClick(final LinkedList<Habit> selectedHabits)
|
|
||||||
{
|
|
||||||
new ExportCSVTask(activity, selectedHabits, progressBar).execute();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ import android.content.Intent;
|
|||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Environment;
|
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.view.ActionMode;
|
import android.view.ActionMode;
|
||||||
import android.view.ContextMenu;
|
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;
|
||||||
import com.mobeta.android.dslv.DragSortListView.DropListener;
|
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.Command;
|
||||||
|
import org.isoron.uhabits.commands.ToggleRepetitionCommand;
|
||||||
|
import org.isoron.uhabits.dialogs.FilePickerDialog;
|
||||||
import org.isoron.uhabits.helpers.DateHelper;
|
import org.isoron.uhabits.helpers.DateHelper;
|
||||||
import org.isoron.uhabits.helpers.DialogHelper;
|
import org.isoron.uhabits.helpers.DialogHelper;
|
||||||
import org.isoron.uhabits.helpers.DialogHelper.OnSavedListener;
|
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.HintManager;
|
||||||
import org.isoron.uhabits.helpers.ListHabitsHelper;
|
import org.isoron.uhabits.helpers.ListHabitsHelper;
|
||||||
import org.isoron.uhabits.helpers.ReminderHelper;
|
import org.isoron.uhabits.helpers.ReminderHelper;
|
||||||
@@ -434,7 +433,9 @@ public class ListHabitsFragment extends Fragment
|
|||||||
|
|
||||||
public void showImportDialog()
|
public void showImportDialog()
|
||||||
{
|
{
|
||||||
File dir = Environment.getExternalStorageDirectory();
|
File dir = activity.getExternalFilesDir(null);
|
||||||
|
if(dir == null) return;
|
||||||
|
|
||||||
FilePickerDialog picker = new FilePickerDialog(activity, dir);
|
FilePickerDialog picker = new FilePickerDialog(activity, dir);
|
||||||
picker.setFileListener(new FilePickerDialog.OnFileSelectedListener()
|
picker.setFileListener(new FilePickerDialog.OnFileSelectedListener()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package org.isoron.uhabits.helpers;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
|
||||||
import com.activeandroid.ActiveAndroid;
|
import com.activeandroid.ActiveAndroid;
|
||||||
|
|
||||||
@@ -51,9 +52,9 @@ public class DatabaseHelper
|
|||||||
{
|
{
|
||||||
File db = getDatabaseFile(context, BuildConfig.databaseFilename);
|
File db = getDatabaseFile(context, BuildConfig.databaseFilename);
|
||||||
|
|
||||||
SimpleDateFormat dateFormat = DateHelper.getCSVDateFormat();
|
SimpleDateFormat dateFormat = DateHelper.getBackupDateFormat();
|
||||||
String date = dateFormat.format(DateHelper.getStartOfToday());
|
String date = dateFormat.format(DateHelper.getLocalTime());
|
||||||
File dbCopy = new File(String.format("%s/Loop-Habits-Backup-%s.db", dir.getAbsolutePath(), date));
|
File dbCopy = new File(String.format("%s/Loop Habits Backup %s.db", dir.getAbsolutePath(), date));
|
||||||
|
|
||||||
copy(db, dbCopy);
|
copy(db, dbCopy);
|
||||||
|
|
||||||
@@ -72,4 +73,16 @@ public class DatabaseHelper
|
|||||||
return new File(String.format("%s/../databases/%s",
|
return new File(String.format("%s/../databases/%s",
|
||||||
context.getApplicationContext().getFilesDir().getPath(), databaseFilename));
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,6 +105,14 @@ public class DateHelper
|
|||||||
return dateFormat;
|
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)
|
public static String formatHeaderDate(GregorianCalendar day)
|
||||||
{
|
{
|
||||||
String dayOfMonth = Integer.toString(day.get(GregorianCalendar.DAY_OF_MONTH));
|
String dayOfMonth = Integer.toString(day.get(GregorianCalendar.DAY_OF_MONTH));
|
||||||
|
|||||||
@@ -44,13 +44,10 @@ public class HabitsCSVExporter
|
|||||||
|
|
||||||
private String exportDirName;
|
private String exportDirName;
|
||||||
|
|
||||||
public HabitsCSVExporter(List<Habit> habits, String exportDirName)
|
public HabitsCSVExporter(List<Habit> habits, File dir)
|
||||||
{
|
{
|
||||||
this.habits = habits;
|
this.habits = habits;
|
||||||
this.exportDirName = exportDirName;
|
this.exportDirName = dir.getAbsolutePath() + "/";
|
||||||
|
|
||||||
if(!this.exportDirName.endsWith("/"))
|
|
||||||
this.exportDirName += "/";
|
|
||||||
|
|
||||||
generateDirs = new LinkedList<>();
|
generateDirs = new LinkedList<>();
|
||||||
generateFilenames = new LinkedList<>();
|
generateFilenames = new LinkedList<>();
|
||||||
@@ -98,7 +95,7 @@ public class HabitsCSVExporter
|
|||||||
{
|
{
|
||||||
SimpleDateFormat dateFormat = DateHelper.getCSVDateFormat();
|
SimpleDateFormat dateFormat = DateHelper.getCSVDateFormat();
|
||||||
String date = dateFormat.format(DateHelper.getStartOfToday());
|
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);
|
FileOutputStream fos = new FileOutputStream(zipFilename);
|
||||||
ZipOutputStream zos = new ZipOutputStream(fos);
|
ZipOutputStream zos = new ZipOutputStream(fos);
|
||||||
@@ -127,21 +124,13 @@ public class HabitsCSVExporter
|
|||||||
fis.close();
|
fis.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String writeArchive()
|
public String writeArchive() throws IOException
|
||||||
{
|
{
|
||||||
String zipFilename;
|
String zipFilename;
|
||||||
|
|
||||||
try
|
writeHabits();
|
||||||
{
|
zipFilename = writeZipFile();
|
||||||
writeHabits();
|
cleanup();
|
||||||
zipFilename = writeZipFile();
|
|
||||||
cleanup();
|
|
||||||
}
|
|
||||||
catch (IOException e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return zipFilename;
|
return zipFilename;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,12 +25,14 @@ import android.os.AsyncTask;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
|
|
||||||
import org.isoron.uhabits.ReplayableActivity;
|
|
||||||
import org.isoron.uhabits.R;
|
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.io.HabitsCSVExporter;
|
||||||
import org.isoron.uhabits.models.Habit;
|
import org.isoron.uhabits.models.Habit;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class ExportCSVTask extends AsyncTask<Void, Void, Void>
|
public class ExportCSVTask extends AsyncTask<Void, Void, Void>
|
||||||
@@ -82,9 +84,18 @@ public class ExportCSVTask extends AsyncTask<Void, Void, Void>
|
|||||||
@Override
|
@Override
|
||||||
protected Void doInBackground(Void... params)
|
protected Void doInBackground(Void... params)
|
||||||
{
|
{
|
||||||
String dirName = String.format("%s/export/", activity.getExternalCacheDir());
|
try
|
||||||
HabitsCSVExporter exporter = new HabitsCSVExporter(selectedHabits, dirName);
|
{
|
||||||
archiveFilename = exporter.writeArchive();
|
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;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,7 +82,10 @@ public class ExportDBTask extends AsyncTask<Void, Void, Void>
|
|||||||
|
|
||||||
try
|
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)
|
catch(IOException e)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -40,10 +40,6 @@
|
|||||||
android:title="@string/unarchive"
|
android:title="@string/unarchive"
|
||||||
android:icon="@drawable/ic_action_unarchive_light"/>
|
android:icon="@drawable/ic_action_unarchive_light"/>
|
||||||
|
|
||||||
<item
|
|
||||||
android:id="@+id/action_export_csv"
|
|
||||||
android:title="@string/export_to_csv" />
|
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_delete"
|
android:id="@+id/action_delete"
|
||||||
android:title="@string/delete" />
|
android:title="@string/delete" />
|
||||||
|
|||||||
Reference in New Issue
Block a user