diff --git a/app/src/main/java/org/tasks/files/FileHelper.java b/app/src/main/java/org/tasks/files/FileHelper.java index 9147febff..de22cbd2c 100644 --- a/app/src/main/java/org/tasks/files/FileHelper.java +++ b/app/src/main/java/org/tasks/files/FileHelper.java @@ -265,4 +265,14 @@ public class FileHelper { } return tempName + extension; } + + public static String uri2String(@Nullable Uri uri) { + if (uri == null) { + return ""; + } + if (uri.getScheme().equals(ContentResolver.SCHEME_FILE)) { + return new File(uri.getPath()).getAbsolutePath(); + } + return uri.toString(); + } } diff --git a/app/src/main/java/org/tasks/jobs/BackupWork.java b/app/src/main/java/org/tasks/jobs/BackupWork.java index 912d3cbd6..a484ace2e 100644 --- a/app/src/main/java/org/tasks/jobs/BackupWork.java +++ b/app/src/main/java/org/tasks/jobs/BackupWork.java @@ -6,6 +6,7 @@ import static com.google.common.collect.Lists.newArrayList; import static com.todoroo.andlib.utility.DateUtilities.now; import static java.util.Collections.emptyList; +import android.content.ContentResolver; import android.content.Context; import android.net.Uri; import androidx.annotation.NonNull; @@ -102,8 +103,11 @@ public class BackupWork extends RepeatingWorker { private void deleteOldLocalBackups() { Uri uri = preferences.getBackupDirectory(); + if (uri == null) { + return; + } switch (uri.getScheme()) { - case "content": + case ContentResolver.SCHEME_CONTENT: DocumentFile dir = DocumentFile.fromTreeUri(context, uri); for (DocumentFile file : getDeleteList(dir.listFiles())) { if (!file.delete()) { @@ -111,7 +115,7 @@ public class BackupWork extends RepeatingWorker { } } break; - case "file": + case ContentResolver.SCHEME_FILE: File astridDir = new File(uri.getPath()); File[] fileArray = astridDir.listFiles(FILE_FILTER); for (File file : getDeleteList(fileArray, DAYS_TO_KEEP_BACKUP)) { diff --git a/app/src/main/java/org/tasks/preferences/BasicPreferences.java b/app/src/main/java/org/tasks/preferences/BasicPreferences.java index 2b16e7cc8..0c1550580 100644 --- a/app/src/main/java/org/tasks/preferences/BasicPreferences.java +++ b/app/src/main/java/org/tasks/preferences/BasicPreferences.java @@ -5,6 +5,7 @@ import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop; import static org.tasks.dialogs.ExportTasksDialog.newExportTasksDialog; import static org.tasks.dialogs.ImportTasksDialog.newImportTasksDialog; import static org.tasks.files.FileHelper.newFilePickerIntent; +import static org.tasks.files.FileHelper.uri2String; import static org.tasks.locale.LocalePickerDialog.newLocalePickerDialog; import static org.tasks.themes.ThemeColor.LAUNCHERS; @@ -19,7 +20,6 @@ import android.preference.Preference; import com.google.common.base.Strings; import com.todoroo.astrid.core.OldTaskPreferences; import com.todoroo.astrid.reminders.ReminderPreferences; -import java.io.File; import javax.inject.Inject; import org.tasks.BuildConfig; import org.tasks.R; @@ -328,14 +328,8 @@ public class BasicPreferences extends InjectingPreferenceActivity } private void updateBackupDirectory() { - findPreference(getString(R.string.p_backup_dir)).setSummary(getBackupDirectory()); - } - - private String getBackupDirectory() { - Uri uri = preferences.getBackupDirectory(); - return uri.getScheme().equals("file") - ? new File(uri.getPath()).getAbsolutePath() - : uri.toString(); + findPreference(getString(R.string.p_backup_dir)) + .setSummary(uri2String(preferences.getBackupDirectory())); } private void setLauncherIcon(int index) { diff --git a/app/src/main/java/org/tasks/preferences/MiscellaneousPreferences.java b/app/src/main/java/org/tasks/preferences/MiscellaneousPreferences.java index f6bde929f..008bd9ae4 100644 --- a/app/src/main/java/org/tasks/preferences/MiscellaneousPreferences.java +++ b/app/src/main/java/org/tasks/preferences/MiscellaneousPreferences.java @@ -2,6 +2,7 @@ package org.tasks.preferences; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop; import static org.tasks.PermissionUtil.verifyPermissions; +import static org.tasks.files.FileHelper.uri2String; import android.content.Intent; import android.net.Uri; @@ -10,7 +11,6 @@ import android.preference.CheckBoxPreference; import android.speech.tts.TextToSpeech; import androidx.annotation.NonNull; import com.todoroo.astrid.voice.VoiceOutputAssistant; -import java.io.File; import javax.inject.Inject; import org.tasks.R; import org.tasks.files.FileHelper; @@ -99,14 +99,8 @@ public class MiscellaneousPreferences extends InjectingPreferenceActivity { } private void updateAttachmentDirectory() { - findPreference(getString(R.string.p_attachment_dir)).setSummary(getAttachmentDirectory()); - } - - private String getAttachmentDirectory() { - Uri uri = preferences.getAttachmentsDirectory(); - return uri.getScheme().equals("file") - ? new File(uri.getPath()).getAbsolutePath() - : uri.toString(); + findPreference(getString(R.string.p_attachment_dir)) + .setSummary(uri2String(preferences.getAttachmentsDirectory())); } private void initializeCalendarReminderPreference() { diff --git a/app/src/main/java/org/tasks/preferences/Preferences.java b/app/src/main/java/org/tasks/preferences/Preferences.java index ef78d2ab0..e94df74a1 100644 --- a/app/src/main/java/org/tasks/preferences/Preferences.java +++ b/app/src/main/java/org/tasks/preferences/Preferences.java @@ -6,6 +6,7 @@ import static com.google.common.collect.Sets.newHashSet; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastKitKat; import static java.util.Collections.emptySet; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -29,6 +30,7 @@ import java.io.File; import java.util.Collection; import java.util.concurrent.TimeUnit; import javax.inject.Inject; +import org.jetbrains.annotations.Nullable; import org.tasks.BuildConfig; import org.tasks.R; import org.tasks.data.TaskAttachment; @@ -369,11 +371,19 @@ public class Preferences { } } - public Uri getAttachmentsDirectory() { - Uri uri = getUri(R.string.p_attachment_dir); + public @Nullable Uri getBackupDirectory() { + return getDirectory(R.string.p_backup_dir, "backups"); + } + + public @Nullable Uri getAttachmentsDirectory() { + return getDirectory(R.string.p_attachment_dir, TaskAttachment.FILES_DIRECTORY_DEFAULT); + } + + private @Nullable Uri getDirectory(int pref, String name) { + Uri uri = getUri(pref); if (uri != null) { switch (uri.getScheme()) { - case "file": + case ContentResolver.SCHEME_FILE: File file = new File(uri.getPath()); try { if (file.canWrite()) { @@ -382,7 +392,7 @@ public class Preferences { } catch (SecurityException ignored) { } break; - case "content": + case ContentResolver.SCHEME_CONTENT: if (hasWritePermission(context, uri)) { return uri; } @@ -391,15 +401,21 @@ public class Preferences { } if (atLeastKitKat()) { - return DocumentFile.fromFile(context.getExternalFilesDir(null)) - .createDirectory(TaskAttachment.FILES_DIRECTORY_DEFAULT) - .getUri(); - } else { - return Uri.fromFile(getDefaultFileLocation(TaskAttachment.FILES_DIRECTORY_DEFAULT)); + DocumentFile file = + DocumentFile.fromFile(context.getExternalFilesDir(null)).createDirectory(name); + if (file != null) { + return file.getUri(); + } + } + + File file = getDefaultFileLocation(name); + if (file != null) { + return Uri.fromFile(file); } + return null; } - private File getDefaultFileLocation(String type) { + private @Nullable File getDefaultFileLocation(String type) { File externalFilesDir = context.getExternalFilesDir(null); if (externalFilesDir == null) { return null; @@ -417,36 +433,6 @@ public class Preferences { } } - public Uri getBackupDirectory() { - Uri uri = getUri(R.string.p_backup_dir); - if (uri != null) { - switch (uri.getScheme()) { - case "file": - File file = new File(uri.getPath()); - try { - if (file.canWrite()) { - return uri; - } - } catch (SecurityException ignored) { - } - break; - case "content": - if (hasWritePermission(context, uri)) { - return uri; - } - break; - } - } - - if (atLeastKitKat()) { - return DocumentFile.fromFile(context.getExternalFilesDir(null)) - .createDirectory("backups") - .getUri(); - } else { - return Uri.fromFile(getDefaultFileLocation("backups")); - } - } - private boolean hasWritePermission(Context context, Uri uri) { return PackageManager.PERMISSION_GRANTED == context.checkUriPermission(