diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java index 12fdf8c78..03f232c13 100644 --- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java +++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java @@ -39,6 +39,7 @@ import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.extractor.stream.VideoStream; +import org.schabi.newpipe.player.helper.PlayerHelper; import org.schabi.newpipe.player.playqueue.ChannelPlayQueue; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlaylistPlayQueue; @@ -278,6 +279,7 @@ public class RouterActivity extends AppCompatActivity { handleChoice(choice.key); + // open future streams always like this one, because "always" button was used by user if (which == DialogInterface.BUTTON_POSITIVE) { preferences.edit() .putString(getString(R.string.preferred_open_action_key), choice.key) @@ -377,23 +379,50 @@ public class RouterActivity extends AppCompatActivity { final boolean isExtAudioEnabled = preferences.getBoolean( getString(R.string.use_external_audio_player_key), false); - returnList.add(new AdapterChoiceItem(getString(R.string.show_info_key), - getString(R.string.show_info), - resolveResourceIdFromAttr(context, R.attr.ic_info_outline))); + final AdapterChoiceItem videoPlayer = new AdapterChoiceItem( + getString(R.string.video_player_key), getString(R.string.video_player), + resolveResourceIdFromAttr(context, R.attr.ic_play_arrow)); + final AdapterChoiceItem showInfo = new AdapterChoiceItem( + getString(R.string.show_info_key), getString(R.string.show_info), + resolveResourceIdFromAttr(context, R.attr.ic_info_outline)); + final AdapterChoiceItem popupPlayer = new AdapterChoiceItem( + getString(R.string.popup_player_key), getString(R.string.popup_player), + resolveResourceIdFromAttr(context, R.attr.ic_popup)); + final AdapterChoiceItem backgroundPlayer = new AdapterChoiceItem( + getString(R.string.background_player_key), getString(R.string.background_player), + resolveResourceIdFromAttr(context, R.attr.ic_headset)); - if (capabilities.contains(VIDEO) && !(isExtVideoEnabled && linkType != LinkType.STREAM)) { - returnList.add(new AdapterChoiceItem(getString(R.string.video_player_key), - getString(R.string.video_player), - resolveResourceIdFromAttr(context, R.attr.ic_play_arrow))); - returnList.add(new AdapterChoiceItem(getString(R.string.popup_player_key), - getString(R.string.popup_player), - resolveResourceIdFromAttr(context, R.attr.ic_popup))); - } + if (linkType == LinkType.STREAM) { + if (isExtVideoEnabled) { + // show both "show info" and "video player", they are two different activities + returnList.add(showInfo); + returnList.add(videoPlayer); + } else if (capabilities.contains(VIDEO) + && PlayerHelper.isAutoplayAllowedByUser(context)) { + // show only "video player" since the details activity will be opened and the video + // will be autoplayed there and "show info" would do the exact same thing + returnList.add(videoPlayer); + } else { + // show only "show info" if video player is not applicable or autoplay is disabled + returnList.add(showInfo); + } - if (capabilities.contains(AUDIO) && !(isExtAudioEnabled && linkType != LinkType.STREAM)) { - returnList.add(new AdapterChoiceItem(getString(R.string.background_player_key), - getString(R.string.background_player), - resolveResourceIdFromAttr(context, R.attr.ic_headset))); + if (capabilities.contains(VIDEO)) { + returnList.add(popupPlayer); + } + if (capabilities.contains(AUDIO)) { + returnList.add(backgroundPlayer); + } + + } else { + returnList.add(showInfo); + if (capabilities.contains(VIDEO) && !isExtVideoEnabled) { + returnList.add(videoPlayer); + returnList.add(popupPlayer); + } + if (capabilities.contains(AUDIO) && !isExtAudioEnabled) { + returnList.add(backgroundPlayer); + } } returnList.add(new AdapterChoiceItem(getString(R.string.download_key), 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 506e8f815..eb889cb00 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 @@ -1236,7 +1236,7 @@ public class VideoDetailFragment } private boolean isExternalPlayerEnabled() { - return PreferenceManager.getDefaultSharedPreferences(getContext()) + return PreferenceManager.getDefaultSharedPreferences(requireContext()) .getBoolean(getString(R.string.use_external_video_player_key), false); } @@ -1247,23 +1247,7 @@ public class VideoDetailFragment && !isExternalPlayerEnabled() && (player == null || player.videoPlayerSelected()) && bottomSheetState != BottomSheetBehavior.STATE_HIDDEN - && isAutoplayAllowedByUser(); - } - - private boolean isAutoplayAllowedByUser() { - if (activity == null) { - return false; - } - - switch (PlayerHelper.getAutoplayType(activity)) { - case PlayerHelper.AutoplayType.AUTOPLAY_TYPE_NEVER: - return false; - case PlayerHelper.AutoplayType.AUTOPLAY_TYPE_WIFI: - return !ListHelper.isMeteredNetwork(activity); - case PlayerHelper.AutoplayType.AUTOPLAY_TYPE_ALWAYS: - default: - return true; - } + && PlayerHelper.isAutoplayAllowedByUser(requireContext()); } private void addVideoPlayerView() { diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index 6667d0ecb..fd59e1d99 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -28,6 +28,7 @@ import org.schabi.newpipe.extractor.stream.VideoStream; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.PlayQueueItem; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; +import org.schabi.newpipe.util.ListHelper; import java.lang.annotation.Retention; import java.text.DecimalFormat; @@ -248,6 +249,18 @@ public final class PlayerHelper { } } + public static boolean isAutoplayAllowedByUser(@NonNull final Context context) { + switch (PlayerHelper.getAutoplayType(context)) { + case PlayerHelper.AutoplayType.AUTOPLAY_TYPE_NEVER: + return false; + case PlayerHelper.AutoplayType.AUTOPLAY_TYPE_WIFI: + return !ListHelper.isMeteredNetwork(context); + case PlayerHelper.AutoplayType.AUTOPLAY_TYPE_ALWAYS: + default: + return true; + } + } + @NonNull public static SeekParameters getSeekParameters(@NonNull final Context context) { return isUsingInexactSeek(context) ? SeekParameters.CLOSEST_SYNC : SeekParameters.EXACT; 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 5ef92fc25..f2896f078 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingMigrations.java @@ -18,9 +18,23 @@ public final class SettingMigrations { /** * Version number for preferences. Must be incremented every time a migration is necessary. */ - public static final int VERSION = 0; + public static final int VERSION = 1; private static SharedPreferences sp; + public static final Migration MIGRATION_0_1 = new Migration(0, 1) { + @Override + public void migrate(final Context context) { + // We changed the content of the dialog which opens when sharing a link to NewPipe + // by removing the "open detail page" option. + // Therefore, show the dialog once again to ensure users need to choose again and are + // aware of the changed dialog. + final SharedPreferences.Editor editor = sp.edit(); + editor.putString(context.getString(R.string.preferred_open_action_key), + context.getString(R.string.always_ask_open_action_key)); + editor.apply(); + } + }; + /** * List of all implemented migrations. *

@@ -28,7 +42,7 @@ public final class SettingMigrations { * If not sorted correctly, migrations which depend on each other, may fail. */ private static final Migration[] SETTING_MIGRATIONS = { - + MIGRATION_0_1 };