diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java
index 8fef9a995..56ea9366d 100644
--- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java
+++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java
@@ -217,6 +217,32 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck
okButton.setEnabled(true);
context.unbindService(this);
+
+ // check of download paths are defined
+ if (!askForSavePath) {
+ String msg = "";
+ if (mainStorageVideo == null) msg += getString(R.string.download_path_title);
+ if (mainStorageAudio == null)
+ msg += getString(R.string.download_path_audio_title);
+
+ if (!msg.isEmpty()) {
+ String title;
+ if (mainStorageVideo == null && mainStorageAudio == null) {
+ title = getString(R.string.general_error);
+ msg = getString(R.string.no_available_dir) + ":\n" + msg;
+ } else {
+ title = msg;
+ msg = getString(R.string.no_available_dir);
+ }
+
+ new AlertDialog.Builder(context)
+ .setPositiveButton(android.R.string.ok, null)
+ .setTitle(title)
+ .setMessage(msg)
+ .create()
+ .show();
+ }
+ }
}
@Override
@@ -520,6 +546,7 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck
private void showFailedDialog(@StringRes int msg) {
new AlertDialog.Builder(context)
+ .setTitle(R.string.general_error)
.setMessage(msg)
.setNegativeButton(android.R.string.ok, null)
.create()
@@ -631,6 +658,12 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck
// This part is called if:
// * the filename is not used in a pending/finished download
// * the file does not exists, create
+
+ if (!mainStorage.mkdirs()) {
+ showFailedDialog(R.string.error_path_creation);
+ return;
+ }
+
storage = mainStorage.createFile(filename, mime);
if (storage == null || !storage.canWrite()) {
showFailedDialog(R.string.error_file_creation);
diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java
index bbd1a315d..c89e773f4 100644
--- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java
@@ -1195,7 +1195,7 @@ public class VideoDetailFragment
downloadDialog.setSelectedVideoStream(selectedVideoStreamIndex);
downloadDialog.setSubtitleStreams(currentInfo.getSubtitles());
- downloadDialog.show(activity.getSupportFragmentManager(), "downloadDialog");
+ downloadDialog.show(getActivity().getSupportFragmentManager(), "downloadDialog");
} catch (Exception e) {
ErrorActivity.ErrorInfo info = ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR,
ServiceList.all()
diff --git a/app/src/main/java/us/shandian/giga/io/StoredDirectoryHelper.java b/app/src/main/java/us/shandian/giga/io/StoredDirectoryHelper.java
index a65c4dff3..aeb810479 100644
--- a/app/src/main/java/us/shandian/giga/io/StoredDirectoryHelper.java
+++ b/app/src/main/java/us/shandian/giga/io/StoredDirectoryHelper.java
@@ -144,6 +144,52 @@ public class StoredDirectoryHelper {
return docTree == null ? ioTree.exists() : docTree.exists();
}
+ /**
+ * Indicates whatever if is possible access using the {@code java.io} API
+ *
+ * @return {@code true} for Java I/O API, otherwise, {@code false} for Storage Access Framework
+ */
+ public boolean isDirect() {
+ return docTree == null;
+ }
+
+ /**
+ * Only using Java I/O. Creates the directory named by this abstract pathname, including any
+ * necessary but nonexistent parent directories. Note that if this
+ * operation fails it may have succeeded in creating some of the necessary
+ * parent directories.
+ *
+ * @return true
if and only if the directory was created,
+ * along with all necessary parent directories or already exists; false
+ * otherwise
+ */
+ public boolean mkdirs() {
+ if (docTree == null) {
+ return ioTree.exists() || ioTree.mkdirs();
+ }
+
+ if (docTree.exists()) return true;
+
+ try {
+ DocumentFile parent;
+ String child = docTree.getName();
+
+ while (true) {
+ parent = docTree.getParentFile();
+ if (parent == null || child == null) break;
+ if (parent.exists()) return true;
+
+ parent.createDirectory(child);
+
+ child = parent.getName();// for the next iteration
+ }
+ } catch (Exception e) {
+ // no more parent directories or unsupported by the storage provider
+ }
+
+ return false;
+ }
+
public String getTag() {
return tag;
}
diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java
index aab0257db..7f3a4bde1 100755
--- a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java
+++ b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java
@@ -270,33 +270,6 @@ public class DownloadManagerService extends Service {
Toast.makeText(this, "Permission denied (write)", Toast.LENGTH_SHORT).show();
}
- // Check download save paths
-
- String msg = "";
- if (mManager.mMainStorageVideo == null)
- msg += getString(R.string.download_path_title);
- else if (mManager.mMainStorageAudio == null)
- msg += getString(R.string.download_path_audio_title);
-
- if (!msg.isEmpty()) {
- String title;
- if (mManager.mMainStorageVideo == null && mManager.mMainStorageAudio == null) {
- title = getString(R.string.general_error);
- msg = getString(R.string.no_available_dir) + ":\n" + msg;
- } else {
- title = msg;
- msg = getString(R.string.no_available_dir);
- }
-
- new AlertDialog.Builder(this)
- .setPositiveButton(android.R.string.ok, null)
- .setTitle(title)
- .setMessage(msg)
- .create()
- .show();
- }
-
-
return mBinder;
}