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