add manual switch in download setting fragment

switch for:
* Java I/O Api
* Storage Access Framework
This commit is contained in:
kapodamy 2019-08-17 13:38:33 -03:00
parent 1ba7710af8
commit 10dfcbf0b9
10 changed files with 73 additions and 69 deletions

View file

@ -329,7 +329,7 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck
return; return;
} }
if (data.getData().getAuthority() != null && data.getData().getAuthority().startsWith(context.getPackageName())) { if (FilePickerActivityHelper.isOwnFileUri(context, data.getData())) {
File file = Utils.getFileForUri(data.getData()); File file = Utils.getFileForUri(data.getData());
checkSelectedDownload(null, Uri.fromFile(file), file.getName(), StoredFileHelper.DEFAULT_MIME); checkSelectedDownload(null, Uri.fromFile(file), file.getName(), StoredFileHelper.DEFAULT_MIME);
return; return;
@ -592,7 +592,7 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck
if (!askForSavePath) if (!askForSavePath)
Toast.makeText(context, getString(R.string.no_available_dir), Toast.LENGTH_LONG).show(); Toast.makeText(context, getString(R.string.no_available_dir), Toast.LENGTH_LONG).show();
if (NewPipeSettings.hasCreateDocumentSupport) { if (NewPipeSettings.useStorageAccessFramework(context)) {
StoredFileHelper.requestSafWithFileCreation(this, REQUEST_DOWNLOAD_SAVE_AS, filename, mime); StoredFileHelper.requestSafWithFileCreation(this, REQUEST_DOWNLOAD_SAVE_AS, filename, mime);
} else { } else {
File initialSavePath; File initialSavePath;

View file

@ -178,7 +178,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment {
} }
Intent i; Intent i;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && NewPipeSettings.hasOpenDocumentTreeSupport) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && NewPipeSettings.useStorageAccessFramework(ctx)) {
i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
.putExtra("android.content.extra.SHOW_ADVANCED", true) .putExtra("android.content.extra.SHOW_ADVANCED", true)
.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | StoredDirectoryHelper.PERMISSION_FLAGS); .addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | StoredDirectoryHelper.PERMISSION_FLAGS);
@ -226,7 +226,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment {
forgetSAFTree(ctx, defaultPreferences.getString(key, "")); forgetSAFTree(ctx, defaultPreferences.getString(key, ""));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && NewPipeSettings.hasOpenDocumentTreeSupport) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && !FilePickerActivityHelper.isOwnFileUri(ctx, uri)) {
// steps to acquire the selected path: // steps to acquire the selected path:
// 1. acquire permissions on the new save path // 1. acquire permissions on the new save path
// 2. save the new path, if step(2) was successful // 2. save the new path, if step(2) was successful
@ -244,7 +244,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment {
return; return;
} }
} else { } else {
File target = Utils.getFileForUri(data.getData()); File target = Utils.getFileForUri(uri);
if (!target.canWrite()) { if (!target.canWrite()) {
showMessageDialog(R.string.download_to_sdcard_error_title, R.string.download_to_sdcard_error_message); showMessageDialog(R.string.download_to_sdcard_error_title, R.string.download_to_sdcard_error_message);
return; return;

View file

@ -21,11 +21,7 @@
package org.schabi.newpipe.settings; package org.schabi.newpipe.settings;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Build;
import android.os.Environment; import android.os.Environment;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
@ -33,7 +29,6 @@ import android.support.annotation.NonNull;
import org.schabi.newpipe.R; import org.schabi.newpipe.R;
import java.io.File; import java.io.File;
import java.util.List;
/** /**
* Helper for global settings * Helper for global settings
@ -62,20 +57,6 @@ public class NewPipeSettings {
private NewPipeSettings() { private NewPipeSettings() {
} }
/**
* Indicates if is possible pick a directory though the Storage Access Framework.
* {@code true} if at least one provider can handle {@link Intent#ACTION_OPEN_DOCUMENT_TREE}
* otherwise {@code false}
*/
public static boolean hasOpenDocumentTreeSupport = false;
/**
* Indicates if is possible create a file though the Storage Access Framework.
* {@code true} if at least one provider can handle {@link Intent#ACTION_CREATE_DOCUMENT}
* otherwise {@code false}
*/
public static boolean hasCreateDocumentSupport = false;
public static void initSettings(Context context) { public static void initSettings(Context context) {
PreferenceManager.setDefaultValues(context, R.xml.appearance_settings, true); PreferenceManager.setDefaultValues(context, R.xml.appearance_settings, true);
PreferenceManager.setDefaultValues(context, R.xml.content_settings, true); PreferenceManager.setDefaultValues(context, R.xml.content_settings, true);
@ -85,18 +66,9 @@ public class NewPipeSettings {
PreferenceManager.setDefaultValues(context, R.xml.video_audio_settings, true); PreferenceManager.setDefaultValues(context, R.xml.video_audio_settings, true);
PreferenceManager.setDefaultValues(context, R.xml.debug_settings, true); PreferenceManager.setDefaultValues(context, R.xml.debug_settings, true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
hasOpenDocumentTreeSupport = testFor(context, Intent.ACTION_OPEN_DOCUMENT_TREE, false);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
hasCreateDocumentSupport = testFor(context, Intent.ACTION_CREATE_DOCUMENT, true);
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP || !hasOpenDocumentTreeSupport) {
getVideoDownloadFolder(context); getVideoDownloadFolder(context);
getAudioDownloadFolder(context); getAudioDownloadFolder(context);
} }
}
private static void getVideoDownloadFolder(Context context) { private static void getVideoDownloadFolder(Context context) {
getDir(context, R.string.download_path_video_key, Environment.DIRECTORY_MOVIES); getDir(context, R.string.download_path_video_key, Environment.DIRECTORY_MOVIES);
@ -126,25 +98,11 @@ public class NewPipeSettings {
return new File(dir, "NewPipe").toURI().toString(); return new File(dir, "NewPipe").toURI().toString();
} }
private static boolean testFor(@NonNull Context ctx, @NonNull String intentAction, boolean isFile) { public static boolean useStorageAccessFramework(Context context) {
Intent queryIntent = new Intent(intentAction) final String key = context.getString(R.string.storage_use_saf);
.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if (isFile) { return prefs.getBoolean(key, false);
queryIntent.setType("*/*");
queryIntent.addCategory(Intent.CATEGORY_OPENABLE);
} }
List<ResolveInfo> infoList = ctx.getPackageManager()
.queryIntentActivities(queryIntent, PackageManager.MATCH_DEFAULT_ONLY);
int availableProviders = 0;
for (ResolveInfo info : infoList) {
if (info.activityInfo != null && info.activityInfo.enabled && info.activityInfo.exported) {
availableProviders++;
}
}
return availableProviders > 0;
}
} }

View file

@ -2,6 +2,7 @@ package org.schabi.newpipe.util;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment; import android.os.Environment;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
@ -73,6 +74,11 @@ public class FilePickerActivityHelper extends com.nononsenseapps.filepicker.File
.putExtra(FilePickerActivityHelper.EXTRA_MODE, FilePickerActivityHelper.MODE_NEW_FILE); .putExtra(FilePickerActivityHelper.EXTRA_MODE, FilePickerActivityHelper.MODE_NEW_FILE);
} }
public static boolean isOwnFileUri(@NonNull Context context, @NonNull Uri uri) {
if (uri.getAuthority() == null) return false;
return uri.getAuthority().startsWith(context.getPackageName());
}
/*////////////////////////////////////////////////////////////////////////// /*//////////////////////////////////////////////////////////////////////////
// Internal // Internal
//////////////////////////////////////////////////////////////////////////*/ //////////////////////////////////////////////////////////////////////////*/

View file

@ -35,8 +35,8 @@ public class DownloadManager {
public final static int SPECIAL_PENDING = 1; public final static int SPECIAL_PENDING = 1;
public final static int SPECIAL_FINISHED = 2; public final static int SPECIAL_FINISHED = 2;
static final String TAG_AUDIO = "audio"; public static final String TAG_AUDIO = "audio";
static final String TAG_VIDEO = "video"; public static final String TAG_VIDEO = "video";
private final FinishedMissionStore mFinishedMissionStore; private final FinishedMissionStore mFinishedMissionStore;

View file

@ -7,7 +7,9 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.ServiceConnection; import android.content.ServiceConnection;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment;
import android.os.IBinder; import android.os.IBinder;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
@ -22,9 +24,14 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Toast; import android.widget.Toast;
import com.nononsenseapps.filepicker.Utils;
import org.schabi.newpipe.R; import org.schabi.newpipe.R;
import org.schabi.newpipe.settings.NewPipeSettings;
import org.schabi.newpipe.util.FilePickerActivityHelper;
import org.schabi.newpipe.util.ThemeHelper; import org.schabi.newpipe.util.ThemeHelper;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import us.shandian.giga.get.DownloadMission; import us.shandian.giga.get.DownloadMission;
@ -37,7 +44,7 @@ import us.shandian.giga.ui.adapter.MissionAdapter;
public class MissionsFragment extends Fragment { public class MissionsFragment extends Fragment {
private static final int SPAN_SIZE = 2; private static final int SPAN_SIZE = 2;
private static final int REQUEST_DOWNLOAD_PATH_SAF = 0x1230; private static final int REQUEST_DOWNLOAD_SAVE_AS = 0x1230;
private SharedPreferences mPrefs; private SharedPreferences mPrefs;
private boolean mLinear; private boolean mLinear;
@ -242,12 +249,28 @@ public class MissionsFragment extends Fragment {
private void recoverMission(@NonNull DownloadMission mission) { private void recoverMission(@NonNull DownloadMission mission) {
unsafeMissionTarget = mission; unsafeMissionTarget = mission;
if (NewPipeSettings.useStorageAccessFramework(mContext)) {
StoredFileHelper.requestSafWithFileCreation( StoredFileHelper.requestSafWithFileCreation(
MissionsFragment.this, MissionsFragment.this,
REQUEST_DOWNLOAD_PATH_SAF, REQUEST_DOWNLOAD_SAVE_AS,
mission.storage.getName(), mission.storage.getName(),
mission.storage.getType() mission.storage.getType()
); );
} else {
File initialSavePath;
if (DownloadManager.TAG_VIDEO.equals(mission.storage.getType()))
initialSavePath = NewPipeSettings.getDir(Environment.DIRECTORY_MOVIES);
else
initialSavePath = NewPipeSettings.getDir(Environment.DIRECTORY_MUSIC);
initialSavePath = new File(initialSavePath, mission.storage.getName());
startActivityForResult(
FilePickerActivityHelper.chooseFileToSave(mContext, initialSavePath.getAbsolutePath()),
REQUEST_DOWNLOAD_SAVE_AS
);
}
} }
@Override @Override
@ -290,15 +313,20 @@ public class MissionsFragment extends Fragment {
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
if (requestCode != REQUEST_DOWNLOAD_PATH_SAF || resultCode != Activity.RESULT_OK) return; if (requestCode != REQUEST_DOWNLOAD_SAVE_AS || resultCode != Activity.RESULT_OK) return;
if (unsafeMissionTarget == null || data.getData() == null) { if (unsafeMissionTarget == null || data.getData() == null) {
return;// unsafeMissionTarget cannot be null return;
} }
try { try {
Uri fileUri = data.getData();
if (fileUri.getAuthority() != null && FilePickerActivityHelper.isOwnFileUri(mContext, fileUri)) {
fileUri = Uri.fromFile(Utils.getFileForUri(fileUri));
}
String tag = unsafeMissionTarget.storage.getTag(); String tag = unsafeMissionTarget.storage.getTag();
unsafeMissionTarget.storage = new StoredFileHelper(mContext, null, data.getData(), tag); unsafeMissionTarget.storage = new StoredFileHelper(mContext, null, fileUri, tag);
mAdapter.recoverMission(unsafeMissionTarget); mAdapter.recoverMission(unsafeMissionTarget);
} catch (IOException e) { } catch (IOException e) {
Toast.makeText(mContext, R.string.general_error, Toast.LENGTH_LONG).show(); Toast.makeText(mContext, R.string.general_error, Toast.LENGTH_LONG).show();

View file

@ -458,7 +458,9 @@ abrir en modo popup</string>
<string name="downloads_storage_ask_title">Preguntar dónde descargar</string> <string name="downloads_storage_ask_title">Preguntar dónde descargar</string>
<string name="downloads_storage_ask_summary">Se preguntará dónde guardar cada descarga</string> <string name="downloads_storage_ask_summary">Se preguntará dónde guardar cada descarga</string>
<string name="downloads_storage_ask_summary_kitkat">Se preguntará dónde guardar cada descarga.\nHabilita esta opción si quieres descargar en la tarjeta SD externa</string> <string name="downloads_storage_ask_summary_kitkat">Se preguntará dónde guardar cada descarga.\nHabilita esta opción junto con SAF si quieres descargar en la tarjeta SD externa</string>
<string name="downloads_storage_use_saf_title">Usar SAF</string>
<string name="downloads_storage_use_saf_summary">El Framework de Acceso al Almacenamiento permite descargar en la tarjeta SD externa.\nNota: Algunos los dispositivos no son compatibles</string>
<string name="unsubscribe">Desuscribirse</string> <string name="unsubscribe">Desuscribirse</string>
<string name="tab_new">Nueva pestaña</string> <string name="tab_new">Nueva pestaña</string>

View file

@ -163,6 +163,7 @@
<string name="clear_search_history_key" translatable="false">clear_search_history</string> <string name="clear_search_history_key" translatable="false">clear_search_history</string>
<string name="downloads_storage_ask" translatable="false">downloads_storage_ask</string> <string name="downloads_storage_ask" translatable="false">downloads_storage_ask</string>
<string name="storage_use_saf" translatable="false">storage_use_saf</string>
<!-- FileName Downloads --> <!-- FileName Downloads -->
<string name="settings_file_charset_key" translatable="false">file_rename_charset</string> <string name="settings_file_charset_key" translatable="false">file_rename_charset</string>

View file

@ -556,6 +556,8 @@
<string name="downloads_storage_ask_title">Ask where to download</string> <string name="downloads_storage_ask_title">Ask where to download</string>
<string name="downloads_storage_ask_summary">You will be asked where to save each download</string> <string name="downloads_storage_ask_summary">You will be asked where to save each download</string>
<string name="downloads_storage_ask_summary_kitkat">You will be asked where to save each download.\nEnable this option if you want download to the external SD Card</string> <string name="downloads_storage_ask_summary_kitkat">You will be asked where to save each download.\nEnable this option with SAF if you want download to the external SD Card</string>
<string name="downloads_storage_use_saf_title">Use SAF</string>
<string name="downloads_storage_use_saf_summary">The Storage Access Framework allow download to the external SD Card.\nNote: some devices are not compatible</string>
</resources> </resources>

View file

@ -12,6 +12,13 @@
android:summary="@string/downloads_storage_ask_summary_kitkat" android:summary="@string/downloads_storage_ask_summary_kitkat"
android:title="@string/downloads_storage_ask_title" /> android:title="@string/downloads_storage_ask_title" />
<SwitchPreference
app:iconSpaceReserved="false"
android:defaultValue="false"
android:key="@string/storage_use_saf"
android:summary="@string/downloads_storage_use_saf_summary"
android:title="@string/downloads_storage_use_saf_title" />
<Preference <Preference
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
android:dialogTitle="@string/download_path_dialog_title" android:dialogTitle="@string/download_path_dialog_title"