diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java
index 3fd44c4d5..ab6ff7414 100644
--- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java
@@ -26,6 +26,7 @@ import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.localization.ContentCountry;
import org.schabi.newpipe.extractor.localization.Localization;
import org.schabi.newpipe.util.FilePickerActivityHelper;
+import org.schabi.newpipe.util.FilePathUtils;
import org.schabi.newpipe.util.ZipHelper;
import java.io.File;
@@ -41,6 +42,8 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
private ContentSettingsManager manager;
+ private String importExportDataPathKey;
+
private String thumbnailLoadToggleKey;
private String youtubeRestrictedModeEnabledKey;
@@ -56,6 +59,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
addPreferencesFromResource(R.xml.content_settings);
+ importExportDataPathKey = getString(R.string.import_export_data_path);
final Preference importDataPreference = findPreference(getString(R.string.import_data));
importDataPreference.setOnPreferenceClickListener(p -> {
final Intent i = new Intent(getActivity(), FilePickerActivityHelper.class)
@@ -63,6 +67,10 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
.putExtra(FilePickerActivityHelper.EXTRA_ALLOW_CREATE_DIR, false)
.putExtra(FilePickerActivityHelper.EXTRA_MODE,
FilePickerActivityHelper.MODE_FILE);
+ final String path = defaultPreferences.getString(importExportDataPathKey, "");
+ if (FilePathUtils.isValidDirectoryPath(path)) {
+ i.putExtra(FilePickerActivityHelper.EXTRA_START_PATH, path);
+ }
startActivityForResult(i, REQUEST_IMPORT_PATH);
return true;
});
@@ -74,6 +82,10 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
.putExtra(FilePickerActivityHelper.EXTRA_ALLOW_CREATE_DIR, true)
.putExtra(FilePickerActivityHelper.EXTRA_MODE,
FilePickerActivityHelper.MODE_DIR);
+ final String path = defaultPreferences.getString(importExportDataPathKey, "");
+ if (FilePathUtils.isValidDirectoryPath(path)) {
+ i.putExtra(FilePickerActivityHelper.EXTRA_START_PATH, path);
+ }
startActivityForResult(i, REQUEST_EXPORT_PATH);
return true;
});
@@ -164,7 +176,10 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
if ((requestCode == REQUEST_IMPORT_PATH || requestCode == REQUEST_EXPORT_PATH)
&& resultCode == Activity.RESULT_OK && data.getData() != null) {
- final String path = Utils.getFileForUri(data.getData()).getAbsolutePath();
+ final File file = Utils.getFileForUri(data.getData());
+ final String path = file.getAbsolutePath();
+ setImportExportDataPath(file);
+
if (requestCode == REQUEST_EXPORT_PATH) {
final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US);
exportDatabase(path + "/NewPipeData-" + sdf.format(new Date()) + ".zip");
@@ -239,4 +254,19 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
ErrorActivity.reportUiErrorInSnackbar(this, "Importing database", e);
}
}
+
+ private void setImportExportDataPath(final File file) {
+ final String directoryPath;
+ if (file.isDirectory()) {
+ directoryPath = file.getAbsolutePath();
+ } else {
+ final File parentFile = file.getParentFile();
+ if (parentFile != null) {
+ directoryPath = parentFile.getAbsolutePath();
+ } else {
+ directoryPath = "";
+ }
+ }
+ defaultPreferences.edit().putString(importExportDataPathKey, directoryPath).apply();
+ }
}
diff --git a/app/src/main/java/org/schabi/newpipe/util/FilePathUtils.java b/app/src/main/java/org/schabi/newpipe/util/FilePathUtils.java
new file mode 100644
index 000000000..4162e563a
--- /dev/null
+++ b/app/src/main/java/org/schabi/newpipe/util/FilePathUtils.java
@@ -0,0 +1,22 @@
+package org.schabi.newpipe.util;
+
+import java.io.File;
+
+public final class FilePathUtils {
+ private FilePathUtils() { }
+
+
+ /**
+ * Check that the path is a valid directory path and it exists.
+ *
+ * @param path full path of directory,
+ * @return is path valid or not
+ */
+ public static boolean isValidDirectoryPath(final String path) {
+ if (path == null || path.isEmpty()) {
+ return false;
+ }
+ final File file = new File(path);
+ return file.exists() && file.isDirectory();
+ }
+}
diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml
index fd6cc7251..c23e81fbe 100644
--- a/app/src/main/res/values/settings_keys.xml
+++ b/app/src/main/res/values/settings_keys.xml
@@ -265,6 +265,7 @@
feed_use_dedicated_fetch_method
+ import_export_data_path
import_data
export_data
diff --git a/app/src/test/java/org/schabi/newpipe/util/FilePathHelperTest.java b/app/src/test/java/org/schabi/newpipe/util/FilePathHelperTest.java
new file mode 100644
index 000000000..3c9f12720
--- /dev/null
+++ b/app/src/test/java/org/schabi/newpipe/util/FilePathHelperTest.java
@@ -0,0 +1,56 @@
+package org.schabi.newpipe.util;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class FilePathHelperTest {
+
+ private Path dir;
+
+ @Before
+ public void setUp() throws IOException {
+ dir = Files.createTempDirectory("dir1");
+ }
+
+ @Test
+ public void testIsValidDirectoryPathWithEmptyString() {
+ assertFalse(FilePathUtils.isValidDirectoryPath(""));
+ }
+
+ @Test
+ public void testIsValidDirectoryPathWithNullString() {
+ assertFalse(FilePathUtils.isValidDirectoryPath(null));
+ }
+
+ @Test
+ public void testIsValidDirectoryPathWithValidPath() {
+ assertTrue(FilePathUtils.isValidDirectoryPath(dir.toAbsolutePath().toString()));
+ }
+
+ @Test
+ public void testIsValidDirectoryPathWithDeepValidDirectory() throws IOException {
+ final File subDir = Files.createDirectory(dir.resolve("subdir")).toFile();
+ assertTrue(FilePathUtils.isValidDirectoryPath(subDir.getAbsolutePath()));
+ }
+
+ @Test
+ public void testIsValidDirectoryPathWithNotExistDirectory() {
+ assertFalse(FilePathUtils.isValidDirectoryPath(dir.resolve("not-exists-subdir").
+ toFile().getAbsolutePath()));
+ }
+
+ @Test
+ public void testIsValidDirectoryPathWithFile() throws IOException {
+ final File tempFile = Files.createFile(dir.resolve("simple_file")).toFile();
+ assertFalse(FilePathUtils.isValidDirectoryPath(tempFile.getAbsolutePath()));
+ }
+
+}