diff --git a/api/src/com/todoroo/andlib/utility/TodorooPreferenceActivity.java b/api/src/com/todoroo/andlib/utility/TodorooPreferenceActivity.java
index 87e30590d..5f9dd8921 100644
--- a/api/src/com/todoroo/andlib/utility/TodorooPreferenceActivity.java
+++ b/api/src/com/todoroo/andlib/utility/TodorooPreferenceActivity.java
@@ -65,6 +65,7 @@ abstract public class TodorooPreferenceActivity extends PreferenceActivity {
for(int i = 0; i < group.getPreferenceCount(); i++) {
initializePreference(group.getPreference(i));
}
+ updatePreferences(group, null);
} else {
Object value = null;
if(preference instanceof ListPreference)
diff --git a/astrid/plugin-src/com/todoroo/astrid/files/FileExplore.java b/astrid/plugin-src/com/todoroo/astrid/files/FileExplore.java
index f628c9ead..74e84bbad 100644
--- a/astrid/plugin-src/com/todoroo/astrid/files/FileExplore.java
+++ b/astrid/plugin-src/com/todoroo/astrid/files/FileExplore.java
@@ -43,7 +43,11 @@ public class FileExplore extends Activity {
private static final String TAG = "F_PATH"; //$NON-NLS-1$
- public static final String EXTRA_FILE_SELECTED = "fileSelected"; //$NON-NLS-1$
+ public static final String RESULT_FILE_SELECTED = "fileSelected"; //$NON-NLS-1$
+
+ public static final String RESULT_DIR_SELECTED = "dirSelected"; //$NON-NLS-1$
+
+ public static final String EXTRA_DIRECTORIES_SELECTABLE = "directoriesSelectable"; //$NON-NLS-1$
private Item[] fileList;
private File path = new File(Environment.getExternalStorageDirectory().toString());
@@ -51,7 +55,9 @@ public class FileExplore extends Activity {
private static final int DIALOG_LOAD_FILE = 1000;
private String upString;
- ListAdapter adapter;
+ private boolean directoryMode;
+
+ private ListAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -60,6 +66,8 @@ public class FileExplore extends Activity {
loadFileList();
+ directoryMode = getIntent().getBooleanExtra(EXTRA_DIRECTORIES_SELECTABLE, false);
+
showDialog(DIALOG_LOAD_FILE);
upString = getString(R.string.file_browser_up);
Log.d(TAG, path.getAbsolutePath());
@@ -169,7 +177,7 @@ public class FileExplore extends Activity {
switch (id) {
case DIALOG_LOAD_FILE:
- builder.setTitle(getString(R.string.file_browser_title));
+ builder.setTitle(getString(directoryMode ? R.string.dir_browser_title : R.string.file_browser_title));
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int which) {
@@ -207,7 +215,11 @@ public class FileExplore extends Activity {
showDialog(DIALOG_LOAD_FILE);
} else {
Intent result = new Intent();
- result.putExtra(EXTRA_FILE_SELECTED, sel.getAbsolutePath());
+ if (directoryMode) {
+ result.putExtra(RESULT_DIR_SELECTED, path.getAbsolutePath());
+ } else {
+ result.putExtra(RESULT_FILE_SELECTED, sel.getAbsolutePath());
+ }
setResult(RESULT_OK, result);
removeDialog(DIALOG_LOAD_FILE);
finish();
@@ -217,6 +229,29 @@ public class FileExplore extends Activity {
});
break;
}
+ if (directoryMode) {
+ builder.setPositiveButton(R.string.file_dir_dialog_ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface d, int which) {
+ Intent result = new Intent();
+ result.putExtra(RESULT_DIR_SELECTED, path.getAbsolutePath());
+ setResult(RESULT_OK, result);
+ removeDialog(DIALOG_LOAD_FILE);
+ finish();
+ }
+ });
+ builder.setNegativeButton(R.string.file_dir_dialog_default, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface d, int which) {
+ Intent result = new Intent();
+ result.putExtra(RESULT_DIR_SELECTED, ""); //$NON-NLS-1$
+ setResult(RESULT_OK, result);
+ removeDialog(DIALOG_LOAD_FILE);
+ finish();
+ }
+ });
+ }
+
dialog = builder.show();
dialog.setCancelable(true);
dialog.setOnCancelListener(new OnCancelListener() {
diff --git a/astrid/plugin-src/com/todoroo/astrid/files/FileMetadata.java b/astrid/plugin-src/com/todoroo/astrid/files/FileMetadata.java
index d96d9e3f7..735924b08 100644
--- a/astrid/plugin-src/com/todoroo/astrid/files/FileMetadata.java
+++ b/astrid/plugin-src/com/todoroo/astrid/files/FileMetadata.java
@@ -19,7 +19,11 @@ public class FileMetadata {
/** metadata key */
public static final String METADATA_KEY = "file"; //$NON-NLS-1$
- public static final String FILES_DIRECTORY = "attachments"; //$NON-NLS-1$
+ /** default directory for files on external storage */
+ public static final String FILES_DIRECTORY_DEFAULT = "attachments"; //$NON-NLS-1$
+
+ /** preference key for some other download directory */
+ public static final String FILES_DIRECTORY_PREF = "custom_files_dir"; //$NON-NLS-1$
/** Constants for file types */
public static final String FILE_TYPE_AUDIO = "audio/"; //$NON-NLS-1$
diff --git a/astrid/plugin-src/com/todoroo/astrid/files/FileUtilities.java b/astrid/plugin-src/com/todoroo/astrid/files/FileUtilities.java
index e9980b1e7..0516a04b8 100644
--- a/astrid/plugin-src/com/todoroo/astrid/files/FileUtilities.java
+++ b/astrid/plugin-src/com/todoroo/astrid/files/FileUtilities.java
@@ -11,9 +11,11 @@ import java.util.Date;
import java.util.concurrent.atomic.AtomicReference;
import android.content.Context;
+import android.text.TextUtils;
import com.timsu.astrid.R;
import com.todoroo.andlib.utility.DateUtilities;
+import com.todoroo.andlib.utility.Preferences;
public class FileUtilities {
@@ -50,7 +52,7 @@ public class FileUtilities {
.append(" ") //$NON-NLS-1$
.append(getDateStringForFilename(context, new Date()));
- String dir = context.getExternalFilesDir(FileMetadata.FILES_DIRECTORY).toString();
+ String dir = getAttachmentsDirectory(context).getAbsolutePath();
String name = getNonCollidingFileName(dir, fileNameBuilder.toString(), extension);
@@ -64,6 +66,18 @@ public class FileUtilities {
return filePathBuilder.toString();
}
+ public static File getAttachmentsDirectory(Context context) {
+ File directory = null;
+ String customDir = Preferences.getStringValue(FileMetadata.FILES_DIRECTORY_PREF);
+ if (!TextUtils.isEmpty(customDir))
+ directory = new File(customDir);
+
+ if (directory == null || !directory.exists())
+ directory = context.getExternalFilesDir(FileMetadata.FILES_DIRECTORY_DEFAULT);
+
+ return directory;
+ }
+
private static String getNonCollidingFileName(String dir, String baseName, String extension) {
int tries = 1;
File f = new File(dir + File.separator + baseName + extension);
diff --git a/astrid/plugin-src/com/todoroo/astrid/files/FilesControlSet.java b/astrid/plugin-src/com/todoroo/astrid/files/FilesControlSet.java
index c77d6eb02..80690127d 100644
--- a/astrid/plugin-src/com/todoroo/astrid/files/FilesControlSet.java
+++ b/astrid/plugin-src/com/todoroo/astrid/files/FilesControlSet.java
@@ -322,7 +322,15 @@ public class FilesControlSet extends PopupControlSet {
urlString = urlString.replace(" ", "%20");
String name = m.getValue(FileMetadata.NAME);
StringBuilder filePathBuilder = new StringBuilder();
- filePathBuilder.append(activity.getExternalFilesDir(FileMetadata.FILES_DIRECTORY).toString())
+
+ File directory = FileUtilities.getAttachmentsDirectory(activity);
+
+ if (directory == null) {
+ Toast.makeText(activity, R.string.file_err_no_directory, Toast.LENGTH_LONG).show();
+ return;
+ }
+
+ filePathBuilder.append(directory.toString())
.append(File.separator)
.append(name);
diff --git a/astrid/res/values/strings-premium.xml b/astrid/res/values/strings-premium.xml
index c5b8f1792..c4a18c952 100644
--- a/astrid/res/values/strings-premium.xml
+++ b/astrid/res/values/strings-premium.xml
@@ -38,6 +38,7 @@
Voice
Up
Choose a file
+ Choose a directory
Permissions error! Please make sure you have not blocked Astrid from accessing the SD card.
Attach a picture
Attach a file from your SD card
@@ -47,5 +48,14 @@
Image is too large to fit in memory
Error copying file for attachment
Error downloading file
+ Whoops! Looks like the files directory doesn\'t exist. Please choose a directory to save files to in the Astrid Preferences.
Sorry, the system does not yet support this type of file
+ Use this directory
+ Reset to default
+
+ Premium Downloads Directory
+
+ Task attachments saved to: %s
+ Default directory
+
diff --git a/astrid/res/xml/preferences.xml b/astrid/res/xml/preferences.xml
index 91ee7d200..385001063 100644
--- a/astrid/res/xml/preferences.xml
+++ b/astrid/res/xml/preferences.xml
@@ -79,6 +79,8 @@
+
+
diff --git a/astrid/src/com/todoroo/astrid/activity/EditPreferences.java b/astrid/src/com/todoroo/astrid/activity/EditPreferences.java
index 11b0c3f56..75fd2e6f5 100644
--- a/astrid/src/com/todoroo/astrid/activity/EditPreferences.java
+++ b/astrid/src/com/todoroo/astrid/activity/EditPreferences.java
@@ -49,6 +49,8 @@ import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.core.LabsPreferences;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.data.Task;
+import com.todoroo.astrid.files.FileExplore;
+import com.todoroo.astrid.files.FileMetadata;
import com.todoroo.astrid.gtasks.GtasksPreferences;
import com.todoroo.astrid.helper.MetadataHelper;
import com.todoroo.astrid.producteev.ProducteevPreferences;
@@ -84,6 +86,7 @@ public class EditPreferences extends TodorooPreferenceActivity {
private static final int REQUEST_CODE_SYNC = 0;
private static final int REQUEST_CODE_PERFORMANCE = 1;
+ private static final int REQUEST_CODE_FILES_DIR = 2;
public static final int RESULT_CODE_THEME_CHANGED = 1;
public static final int RESULT_CODE_PERFORMANCE_PREF_CHANGED = 3;
@@ -172,6 +175,17 @@ public class EditPreferences extends TodorooPreferenceActivity {
}
});
+ preference = screen.findPreference(getString(R.string.p_files_dir));
+ preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference p) {
+ Intent filesDir = new Intent(EditPreferences.this, FileExplore.class);
+ filesDir.putExtra(FileExplore.EXTRA_DIRECTORIES_SELECTABLE, true);
+ startActivityForResult(filesDir, REQUEST_CODE_FILES_DIR);
+ return true;
+ }
+ });
+
addDebugPreferences();
addPreferenceListeners();
@@ -424,12 +438,18 @@ public class EditPreferences extends TodorooPreferenceActivity {
}
// pp preferences
+ else if (r.getString(R.string.p_files_dir).equals(preference.getKey())) {
+ String dir = Preferences.getStringValue(FileMetadata.FILES_DIRECTORY_PREF);
+
+ if (TextUtils.isEmpty(dir)) {
+ dir = r.getString(R.string.p_files_dir_desc_default);
+ }
+ preference.setSummary(r.getString(R.string.p_files_dir_desc, dir));
+ }
else if (booleanPreference(preference, value, R.string.p_statistics,
- R.string.EPr_statistics_desc_disabled, R.string.EPr_statistics_desc_enabled))
- ;
+ R.string.EPr_statistics_desc_disabled, R.string.EPr_statistics_desc_enabled));
else if (booleanPreference(preference, value, R.string.p_autoIdea,
- R.string.EPr_ideaAuto_desc_disabled, R.string.EPr_ideaAuto_desc_enabled))
- ;
+ R.string.EPr_ideaAuto_desc_disabled, R.string.EPr_ideaAuto_desc_enabled));
// voice input and output
@@ -477,6 +497,12 @@ public class EditPreferences extends TodorooPreferenceActivity {
} else if (requestCode == REQUEST_CODE_PERFORMANCE && resultCode == LabsPreferences.PERFORMANCE_SETTING_CHANGED) {
setResult(RESULT_CODE_PERFORMANCE_PREF_CHANGED);
return;
+ } else if (requestCode == REQUEST_CODE_FILES_DIR && resultCode == RESULT_OK) {
+ if (data != null) {
+ String dir = data.getStringExtra(FileExplore.RESULT_DIR_SELECTED);
+ Preferences.setString(FileMetadata.FILES_DIRECTORY_PREF, dir);
+ }
+ return;
}
try {
VoiceOutputService.getVoiceOutputInstance().handleActivityResult(requestCode, resultCode, data);
diff --git a/astrid/src/com/todoroo/astrid/activity/TaskEditFragment.java b/astrid/src/com/todoroo/astrid/activity/TaskEditFragment.java
index 86199ba77..ab9fb63c0 100755
--- a/astrid/src/com/todoroo/astrid/activity/TaskEditFragment.java
+++ b/astrid/src/com/todoroo/astrid/activity/TaskEditFragment.java
@@ -1048,7 +1048,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
return;
}
- File dst = new File(getActivity().getExternalFilesDir(FileMetadata.FILES_DIRECTORY) + File.separator + src.getName());
+ File dst = new File(FileUtilities.getAttachmentsDirectory(getActivity()) + File.separator + src.getName());
try {
AndroidUtilities.copyFile(src, dst);
} catch (Exception e) {
@@ -1207,7 +1207,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
String recordedAudioName = data.getStringExtra(AACRecordingActivity.RESULT_FILENAME);
createNewFileAttachment(recordedAudioPath, recordedAudioName, FileMetadata.FILE_TYPE_AUDIO + "m4a"); //$NON-NLS-1$
} else if (requestCode == REQUEST_CODE_ATTACH_FILE && resultCode == Activity.RESULT_OK) {
- attachFile(data.getStringExtra(FileExplore.EXTRA_FILE_SELECTED));
+ attachFile(data.getStringExtra(FileExplore.RESULT_FILE_SELECTED));
}
ActFmCameraModule.activityResult(getActivity(), requestCode, resultCode, data, new CameraResultCallback() {