Fix null pointer exception in preference screens

pull/795/head
Alex Baker 6 years ago
parent 51d55de723
commit 3669c175ef

@ -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();
}
}

@ -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)) {

@ -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) {

@ -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() {

@ -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(

Loading…
Cancel
Save