Remove extra permissions; better organize files dir

pull/77/merge
Alinson S. Xavier 10 years ago
parent e8bbae8ef9
commit ad391fa791

@ -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" />

Loading…
Cancel
Save