summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java71
1 files changed, 30 insertions, 41 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java
index 74f89a039..f29b13688 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java
@@ -9,6 +9,7 @@ import android.util.Log;
import android.view.KeyEvent;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.core.app.NotificationCompat;
import androidx.preference.PreferenceManager;
@@ -888,51 +889,39 @@ public class UserPreferences {
*
* @param type The name of the folder inside the data folder. May be null
* when accessing the root of the data folder.
- * @return The data folder that has been requested or null if the folder
- * could not be created.
+ * @return The data folder that has been requested or null if the folder could not be created.
*/
- public static File getDataFolder(String type) {
- String strDir = prefs.getString(PREF_DATA_FOLDER, null);
- if (strDir == null) {
- Log.d(TAG, "Using default data folder");
- return context.getExternalFilesDir(type);
- } else {
- File dataDir = new File(strDir);
- if (!dataDir.exists()) {
- if (!dataDir.mkdir()) {
- Log.w(TAG, "Could not create data folder");
- return null;
- }
- }
+ public static File getDataFolder(@Nullable String type) {
+ File dataFolder = getTypeDir(prefs.getString(PREF_DATA_FOLDER, null), type);
+ if (dataFolder == null || !dataFolder.canWrite()) {
+ Log.d(TAG, "User data folder not writable or not set. Trying default.");
+ dataFolder = context.getExternalFilesDir(type);
+ }
+ if (dataFolder == null || !dataFolder.canWrite()) {
+ Log.d(TAG, "Default data folder not available or not writable. Falling back to internal memory.");
+ dataFolder = getTypeDir(context.getFilesDir().getAbsolutePath(), type);
+ }
+ return dataFolder;
+ }
- if (type == null) {
- return dataDir;
- } else {
- // handle path separators
- String[] dirs = type.split("/");
- for (int i = 0; i < dirs.length; i++) {
- if (dirs.length > 0) {
- if (i < dirs.length - 1) {
- dataDir = getDataFolder(dirs[i]);
- if (dataDir == null) {
- return null;
- }
- }
- type = dirs[i];
- }
- }
- File typeDir = new File(dataDir, type);
- if (!typeDir.exists()) {
- if (dataDir.canWrite()) {
- if (!typeDir.mkdir()) {
- Log.e(TAG, "Could not create data folder named " + type);
- return null;
- }
- }
- }
- return typeDir;
+ @Nullable
+ private static File getTypeDir(@Nullable String baseDirPath, @Nullable String type) {
+ if (baseDirPath == null) {
+ return null;
+ }
+ File baseDir = new File(baseDirPath);
+ File typeDir = type == null ? baseDir : new File(baseDir, type);
+ if (!typeDir.exists()) {
+ if (!baseDir.canWrite()) {
+ Log.e(TAG, "Base dir is not writable " + baseDir.getAbsolutePath());
+ return null;
+ }
+ if (!typeDir.mkdirs()) {
+ Log.e(TAG, "Could not create type dir " + typeDir.getAbsolutePath());
+ return null;
}
}
+ return typeDir;
}
public static void setDataFolder(String dir) {