Forget the download save path if the storage API is changed
This commit is contained in:
parent
1089de6321
commit
4b3eb2ece5
|
@ -2,6 +2,7 @@ package org.schabi.newpipe.settings;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
|
import android.content.ContentResolver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
@ -22,6 +23,7 @@ import org.schabi.newpipe.util.FilePickerActivityHelper;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URI;
|
||||||
import java.net.URLDecoder;
|
import java.net.URLDecoder;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
@ -30,7 +32,7 @@ import us.shandian.giga.io.StoredDirectoryHelper;
|
||||||
public class DownloadSettingsFragment extends BasePreferenceFragment {
|
public class DownloadSettingsFragment extends BasePreferenceFragment {
|
||||||
private static final int REQUEST_DOWNLOAD_VIDEO_PATH = 0x1235;
|
private static final int REQUEST_DOWNLOAD_VIDEO_PATH = 0x1235;
|
||||||
private static final int REQUEST_DOWNLOAD_AUDIO_PATH = 0x1236;
|
private static final int REQUEST_DOWNLOAD_AUDIO_PATH = 0x1236;
|
||||||
public static final boolean IGNORE_RELEASE_OLD_PATH = true;
|
public static final boolean IGNORE_RELEASE_ON_OLD_PATH = true;
|
||||||
|
|
||||||
private String DOWNLOAD_PATH_VIDEO_PREFERENCE;
|
private String DOWNLOAD_PATH_VIDEO_PREFERENCE;
|
||||||
private String DOWNLOAD_PATH_AUDIO_PREFERENCE;
|
private String DOWNLOAD_PATH_AUDIO_PREFERENCE;
|
||||||
|
@ -68,19 +70,14 @@ public class DownloadSettingsFragment extends BasePreferenceFragment {
|
||||||
if (javaIO == lastAPIJavaIO) return true;
|
if (javaIO == lastAPIJavaIO) return true;
|
||||||
lastAPIJavaIO = javaIO;
|
lastAPIJavaIO = javaIO;
|
||||||
|
|
||||||
boolean res;
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
boolean res = forgetPath(DOWNLOAD_PATH_VIDEO_PREFERENCE);
|
||||||
if (javaIO && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
|
||||||
// forget save paths (if necessary)
|
|
||||||
res = forgetPath(DOWNLOAD_PATH_VIDEO_PREFERENCE);
|
|
||||||
res |= forgetPath(DOWNLOAD_PATH_AUDIO_PREFERENCE);
|
res |= forgetPath(DOWNLOAD_PATH_AUDIO_PREFERENCE);
|
||||||
} else {
|
|
||||||
res = hasInvalidPath(DOWNLOAD_PATH_VIDEO_PREFERENCE) || hasInvalidPath(DOWNLOAD_PATH_AUDIO_PREFERENCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (res) {
|
if (res) {
|
||||||
Toast.makeText(ctx, R.string.download_pick_path, Toast.LENGTH_LONG).show();
|
Toast.makeText(ctx, R.string.download_pick_path, Toast.LENGTH_SHORT).show();
|
||||||
updatePreferencesSummary();
|
updatePreferencesSummary();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
updatePathPickers(javaIO);
|
updatePathPickers(javaIO);
|
||||||
|
@ -88,25 +85,6 @@ public class DownloadSettingsFragment extends BasePreferenceFragment {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
private boolean forgetPath(String prefKey) {
|
|
||||||
String path = defaultPreferences.getString(prefKey, "");
|
|
||||||
if (path == null || path.isEmpty()) return true;
|
|
||||||
|
|
||||||
if (path.startsWith("file://")) return false;
|
|
||||||
|
|
||||||
// forget SAF path (file:// is compatible with the SAF wrapper)
|
|
||||||
forgetSAFTree(getContext(), prefKey);
|
|
||||||
defaultPreferences.edit().putString(prefKey, "").apply();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasInvalidPath(String prefKey) {
|
|
||||||
String value = defaultPreferences.getString(prefKey, null);
|
|
||||||
return value == null || value.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
|
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
|
||||||
addPreferencesFromResource(R.xml.download_settings);
|
addPreferencesFromResource(R.xml.download_settings);
|
||||||
|
@ -137,6 +115,15 @@ public class DownloadSettingsFragment extends BasePreferenceFragment {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rawUri.charAt(0) == File.separatorChar) {
|
||||||
|
target.setSummary(rawUri);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (rawUri.startsWith(ContentResolver.SCHEME_FILE)) {
|
||||||
|
target.setSummary(new File(URI.create(rawUri)).getPath());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
rawUri = URLDecoder.decode(rawUri, StandardCharsets.UTF_8.name());
|
rawUri = URLDecoder.decode(rawUri, StandardCharsets.UTF_8.name());
|
||||||
} catch (UnsupportedEncodingException e) {
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
@ -146,6 +133,24 @@ public class DownloadSettingsFragment extends BasePreferenceFragment {
|
||||||
target.setSummary(rawUri);
|
target.setSummary(rawUri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
|
||||||
|
private boolean forgetPath(String prefKey) {
|
||||||
|
String path = defaultPreferences.getString(prefKey, "");
|
||||||
|
if (path == null || path.isEmpty()) return true;
|
||||||
|
|
||||||
|
// forget SAF path if necessary
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
|
||||||
|
forgetSAFTree(getContext(), path);
|
||||||
|
|
||||||
|
defaultPreferences.edit().putString(prefKey, "").apply();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isFileUri(String path) {
|
||||||
|
return path.charAt(0) == File.separatorChar || path.startsWith(ContentResolver.SCHEME_FILE);
|
||||||
|
}
|
||||||
|
|
||||||
private void updatePathPickers(boolean useJavaIO) {
|
private void updatePathPickers(boolean useJavaIO) {
|
||||||
boolean enabled = useJavaIO || Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
|
boolean enabled = useJavaIO || Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
|
||||||
prefPathVideo.setEnabled(enabled);
|
prefPathVideo.setEnabled(enabled);
|
||||||
|
@ -159,25 +164,22 @@ public class DownloadSettingsFragment extends BasePreferenceFragment {
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: after releasing the old path, all downloads created on the folder becomes inaccessible
|
// FIXME: after releasing the old path, all downloads created on the folder becomes inaccessible
|
||||||
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
|
private void forgetSAFTree(Context ctx, String oldPath) {
|
||||||
private void forgetSAFTree(Context ctx, String prefKey) {
|
if (IGNORE_RELEASE_ON_OLD_PATH) {
|
||||||
if (IGNORE_RELEASE_OLD_PATH) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String oldPath = defaultPreferences.getString(prefKey, "");
|
if (oldPath == null || oldPath.isEmpty() || isFileUri(oldPath)) return;
|
||||||
|
|
||||||
if (oldPath != null && !oldPath.isEmpty() && oldPath.charAt(0) != File.separatorChar && !oldPath.startsWith("file://")) {
|
try {
|
||||||
try {
|
Uri uri = Uri.parse(oldPath);
|
||||||
Uri uri = Uri.parse(oldPath);
|
|
||||||
|
|
||||||
ctx.getContentResolver().releasePersistableUriPermission(uri, StoredDirectoryHelper.PERMISSION_FLAGS);
|
ctx.getContentResolver().releasePersistableUriPermission(uri, StoredDirectoryHelper.PERMISSION_FLAGS);
|
||||||
ctx.revokeUriPermission(uri, StoredDirectoryHelper.PERMISSION_FLAGS);
|
ctx.revokeUriPermission(uri, StoredDirectoryHelper.PERMISSION_FLAGS);
|
||||||
|
|
||||||
Log.i(TAG, "Revoke old path permissions success on " + oldPath);
|
Log.i(TAG, "Revoke old path permissions success on " + oldPath);
|
||||||
} catch (Exception err) {
|
} catch (Exception err) {
|
||||||
Log.e(TAG, "Error revoking old path permissions on " + oldPath, err);
|
Log.e(TAG, "Error revoking old path permissions on " + oldPath, err);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -258,7 +260,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment {
|
||||||
final Context ctx = getContext();
|
final Context ctx = getContext();
|
||||||
if (ctx == null) throw new NullPointerException("getContext()");
|
if (ctx == null) throw new NullPointerException("getContext()");
|
||||||
|
|
||||||
forgetSAFTree(ctx, key);
|
forgetSAFTree(ctx, defaultPreferences.getString(key, ""));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ctx.grantUriPermission(ctx.getPackageName(), uri, StoredDirectoryHelper.PERMISSION_FLAGS);
|
ctx.grantUriPermission(ctx.getPackageName(), uri, StoredDirectoryHelper.PERMISSION_FLAGS);
|
||||||
|
|
|
@ -566,7 +566,10 @@ public class DownloadManagerService extends Service {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (path == null || path.isEmpty()) {
|
if (path == null || path.isEmpty()) {
|
||||||
return useJavaIO ? new StoredDirectoryHelper(new File(defaultPath).toURI(), tag) : null;
|
if (useJavaIO)
|
||||||
|
return new StoredDirectoryHelper(new File(defaultPath).toURI(), tag);
|
||||||
|
else
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (path.charAt(0) == File.separatorChar) {
|
if (path.charAt(0) == File.separatorChar) {
|
||||||
|
|
Loading…
Reference in New Issue