From 4b3eb2ece58cf35a930293d6a1e60961337f28d9 Mon Sep 17 00:00:00 2001 From: kapodamy Date: Mon, 15 Apr 2019 21:31:33 -0300 Subject: [PATCH] Forget the download save path if the storage API is changed --- .../settings/DownloadSettingsFragment.java | 92 ++++++++++--------- .../giga/service/DownloadManagerService.java | 5 +- 2 files changed, 51 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java index 5d4ccf3f8..9fbf7dbea 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java @@ -2,6 +2,7 @@ package org.schabi.newpipe.settings; import android.app.Activity; import android.app.AlertDialog; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -22,6 +23,7 @@ import org.schabi.newpipe.util.FilePickerActivityHelper; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.net.URI; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; @@ -30,7 +32,7 @@ import us.shandian.giga.io.StoredDirectoryHelper; public class DownloadSettingsFragment extends BasePreferenceFragment { private static final int REQUEST_DOWNLOAD_VIDEO_PATH = 0x1235; 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_AUDIO_PREFERENCE; @@ -68,19 +70,14 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { if (javaIO == lastAPIJavaIO) return true; lastAPIJavaIO = javaIO; - boolean res; - - if (javaIO && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - // forget save paths (if necessary) - res = forgetPath(DOWNLOAD_PATH_VIDEO_PREFERENCE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + boolean res = forgetPath(DOWNLOAD_PATH_VIDEO_PREFERENCE); res |= forgetPath(DOWNLOAD_PATH_AUDIO_PREFERENCE); - } else { - res = hasInvalidPath(DOWNLOAD_PATH_VIDEO_PREFERENCE) || hasInvalidPath(DOWNLOAD_PATH_AUDIO_PREFERENCE); - } - if (res) { - Toast.makeText(ctx, R.string.download_pick_path, Toast.LENGTH_LONG).show(); - updatePreferencesSummary(); + if (res) { + Toast.makeText(ctx, R.string.download_pick_path, Toast.LENGTH_SHORT).show(); + updatePreferencesSummary(); + } } 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 public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.download_settings); @@ -137,6 +115,15 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { 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 { rawUri = URLDecoder.decode(rawUri, StandardCharsets.UTF_8.name()); } catch (UnsupportedEncodingException e) { @@ -146,6 +133,24 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { 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) { boolean enabled = useJavaIO || Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; 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 - @RequiresApi(Build.VERSION_CODES.LOLLIPOP) - private void forgetSAFTree(Context ctx, String prefKey) { - if (IGNORE_RELEASE_OLD_PATH) { + private void forgetSAFTree(Context ctx, String oldPath) { + if (IGNORE_RELEASE_ON_OLD_PATH) { 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 { - Uri uri = Uri.parse(oldPath); + try { + Uri uri = Uri.parse(oldPath); - ctx.getContentResolver().releasePersistableUriPermission(uri, StoredDirectoryHelper.PERMISSION_FLAGS); - ctx.revokeUriPermission(uri, StoredDirectoryHelper.PERMISSION_FLAGS); + ctx.getContentResolver().releasePersistableUriPermission(uri, StoredDirectoryHelper.PERMISSION_FLAGS); + ctx.revokeUriPermission(uri, StoredDirectoryHelper.PERMISSION_FLAGS); - Log.i(TAG, "Revoke old path permissions success on " + oldPath); - } catch (Exception err) { - Log.e(TAG, "Error revoking old path permissions on " + oldPath, err); - } + Log.i(TAG, "Revoke old path permissions success on " + oldPath); + } catch (Exception 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(); if (ctx == null) throw new NullPointerException("getContext()"); - forgetSAFTree(ctx, key); + forgetSAFTree(ctx, defaultPreferences.getString(key, "")); try { ctx.grantUriPermission(ctx.getPackageName(), uri, StoredDirectoryHelper.PERMISSION_FLAGS); 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 da63cb545..8d838ccc2 100755 --- a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java +++ b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java @@ -566,7 +566,10 @@ public class DownloadManagerService extends Service { } 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) {