From 62b4f333bbdaf8d7e8fd3833ea096d494fbf7a71 Mon Sep 17 00:00:00 2001 From: Mohammed Anas <32234660+mhmdanas@users.noreply.github.com> Date: Sun, 20 Jun 2021 19:01:06 +0000 Subject: [PATCH] Don't enable SAF on Fire TV (#6516) --- .../schabi/newpipe/settings/NewPipeSettings.java | 9 ++++++--- .../schabi/newpipe/settings/SettingMigrations.java | 7 +++++-- .../java/org/schabi/newpipe/util/DeviceUtils.java | 13 ++++++++++++- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java index 0203f9107..33f00ec1a 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java +++ b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java @@ -9,6 +9,7 @@ import androidx.annotation.NonNull; import androidx.preference.PreferenceManager; import org.schabi.newpipe.R; +import org.schabi.newpipe.util.DeviceUtils; import java.io.File; import java.util.Set; @@ -110,10 +111,12 @@ public final class NewPipeSettings { } public static boolean useStorageAccessFramework(final Context context) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - return true; - } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + // There's a FireOS bug which prevents SAF open/close dialogs from being confirmed with a + // remote (see #6455). + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP || DeviceUtils.isFireTv()) { return false; + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + return true; } final String key = context.getString(R.string.storage_use_saf); diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java index d6aade168..2d5fedec0 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java @@ -11,6 +11,7 @@ import org.schabi.newpipe.R; import org.schabi.newpipe.error.ErrorActivity; import org.schabi.newpipe.error.ErrorInfo; import org.schabi.newpipe.error.UserAction; +import org.schabi.newpipe.util.DeviceUtils; import static org.schabi.newpipe.MainActivity.DEBUG; @@ -63,9 +64,11 @@ public final class SettingMigrations { // We reset the setting to its default value, i.e. "use SAF", since now there are no // more issues with SAF and users should use that one instead of the old // NoNonsenseFilePicker. SAF does not work on KitKat and below, though, so the setting - // is set to false in that case. + // is set to false in that case. Also, there's a bug on FireOS in which SAF open/close + // dialogs cannot be confirmed with a remote (see #6455). sp.edit().putBoolean(context.getString(R.string.storage_use_saf), - Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP).apply(); + Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP + && !DeviceUtils.isFireTv()).apply(); } }; diff --git a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java index 6d3e2936e..8d918c162 100644 --- a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java @@ -21,6 +21,7 @@ public final class DeviceUtils { private static final String AMAZON_FEATURE_FIRE_TV = "amazon.hardware.fire_tv"; private static Boolean isTV = null; + private static Boolean isFireTV = null; /* * Devices that do not support media tunneling @@ -35,6 +36,16 @@ public final class DeviceUtils { private DeviceUtils() { } + public static boolean isFireTv() { + if (isFireTV != null) { + return isFireTV; + } + + isFireTV = + App.getApp().getPackageManager().hasSystemFeature(AMAZON_FEATURE_FIRE_TV); + return isFireTV; + } + public static boolean isTv(final Context context) { if (isTV != null) { return isTV; @@ -45,7 +56,7 @@ public final class DeviceUtils { // from doc: https://developer.android.com/training/tv/start/hardware.html#runtime-check boolean isTv = ContextCompat.getSystemService(context, UiModeManager.class) .getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION - || pm.hasSystemFeature(AMAZON_FEATURE_FIRE_TV) + || isFireTv() || pm.hasSystemFeature(PackageManager.FEATURE_TELEVISION); // from https://stackoverflow.com/a/58932366