diff --git a/app/src/main/java/org/schabi/newpipe/ActivityCommunicator.java b/app/src/main/java/org/schabi/newpipe/ActivityCommunicator.java index fa843106d..2ddc2d127 100644 --- a/app/src/main/java/org/schabi/newpipe/ActivityCommunicator.java +++ b/app/src/main/java/org/schabi/newpipe/ActivityCommunicator.java @@ -20,10 +20,6 @@ package org.schabi.newpipe; * along with NewPipe. If not, see . */ -import android.graphics.Bitmap; - -import java.util.List; - /** * Singleton: * Used to send data between certain Activity/Services within the same process. @@ -39,8 +35,5 @@ public class ActivityCommunicator { return activityCommunicator; } - // Thumbnail send from VideoItemDetailFragment to BackgroundPlayer - public volatile Bitmap backgroundPlayerThumbnail; - public volatile Class returnActivity; } diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index b3be7ba6a..681711d22 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -45,7 +45,7 @@ import org.schabi.newpipe.util.PermissionHelper; import org.schabi.newpipe.util.ThemeHelper; public class MainActivity extends AppCompatActivity implements OnItemSelectedListener { - private static final String TAG = MainActivity.class.toString(); + //private static final String TAG = "MainActivity"; /*////////////////////////////////////////////////////////////////////////// // Activity's LifeCycle @@ -57,12 +57,23 @@ public class MainActivity extends AppCompatActivity implements OnItemSelectedLis super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setVolumeControlStream(AudioManager.STREAM_MUSIC); - if (savedInstanceState == null) initFragments(); + + if (getSupportFragmentManager() != null && getSupportFragmentManager().getBackStackEntryCount() == 0) { + initFragments(); + } } @Override protected void onNewIntent(Intent intent) { + if (intent != null) { + // Return if launched from a launcher (e.g. Nova Launcher, Pixel Launcher ...) + // to not destroy the already created backstack + String action = intent.getAction(); + if ((action != null && action.equals(Intent.ACTION_MAIN)) && intent.hasCategory(Intent.CATEGORY_LAUNCHER)) return; + } + super.onNewIntent(intent); + setIntent(intent); handleIntent(intent); } diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index 72a104eee..52a4eca1d 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -8,33 +8,57 @@ import org.schabi.newpipe.MainActivity; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.stream_info.AudioStream; import org.schabi.newpipe.extractor.stream_info.StreamInfo; import org.schabi.newpipe.fragments.OnItemSelectedListener; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; -import org.schabi.newpipe.player.AbstractPlayer; +import org.schabi.newpipe.player.BackgroundPlayer; +import org.schabi.newpipe.player.BasePlayer; +import org.schabi.newpipe.player.VideoPlayer; @SuppressWarnings({"unused", "WeakerAccess"}) public class NavigationHelper { - public static Intent getOpenPlayerIntent(Context context, Class targetClazz, StreamInfo info, int selectedStreamIndex) { - return new Intent(context, targetClazz) - .putExtra(AbstractPlayer.VIDEO_TITLE, info.title) - .putExtra(AbstractPlayer.VIDEO_URL, info.webpage_url) - .putExtra(AbstractPlayer.CHANNEL_NAME, info.uploader) - .putExtra(AbstractPlayer.INDEX_SEL_VIDEO_STREAM, selectedStreamIndex) - .putExtra(AbstractPlayer.VIDEO_STREAMS_LIST, Utils.getSortedStreamVideosList(context, info.video_streams, info.video_only_streams, false)) - .putExtra(AbstractPlayer.VIDEO_ONLY_AUDIO_STREAM, Utils.getHighestQualityAudio(info.audio_streams)); + public static Intent getOpenVideoPlayerIntent(Context context, Class targetClazz, StreamInfo info, int selectedStreamIndex) { + Intent mIntent = new Intent(context, targetClazz) + .putExtra(BasePlayer.VIDEO_TITLE, info.title) + .putExtra(BasePlayer.VIDEO_URL, info.webpage_url) + .putExtra(BasePlayer.VIDEO_THUMBNAIL_URL, info.thumbnail_url) + .putExtra(BasePlayer.CHANNEL_NAME, info.uploader) + .putExtra(VideoPlayer.INDEX_SEL_VIDEO_STREAM, selectedStreamIndex) + .putExtra(VideoPlayer.VIDEO_STREAMS_LIST, Utils.getSortedStreamVideosList(context, info.video_streams, info.video_only_streams, false)) + .putExtra(VideoPlayer.VIDEO_ONLY_AUDIO_STREAM, Utils.getHighestQualityAudio(info.audio_streams)); + if (info.start_position > 0) mIntent.putExtra(BasePlayer.START_POSITION, info.start_position * 1000); + return mIntent; } - public static Intent getOpenPlayerIntent(Context context, Class targetClazz, AbstractPlayer instance) { + + public static Intent getOpenVideoPlayerIntent(Context context, Class targetClazz, VideoPlayer instance) { return new Intent(context, targetClazz) - .putExtra(AbstractPlayer.VIDEO_TITLE, instance.getVideoTitle()) - .putExtra(AbstractPlayer.VIDEO_URL, instance.getVideoUrl()) - .putExtra(AbstractPlayer.CHANNEL_NAME, instance.getChannelName()) - .putExtra(AbstractPlayer.INDEX_SEL_VIDEO_STREAM, instance.getSelectedStreamIndex()) - .putExtra(AbstractPlayer.VIDEO_STREAMS_LIST, instance.getVideoStreamsList()) - .putExtra(AbstractPlayer.VIDEO_ONLY_AUDIO_STREAM, instance.getAudioStream()) - .putExtra(AbstractPlayer.START_POSITION, ((int) instance.getPlayer().getCurrentPosition())); + .putExtra(BasePlayer.VIDEO_TITLE, instance.getVideoTitle()) + .putExtra(BasePlayer.VIDEO_URL, instance.getVideoUrl()) + .putExtra(BasePlayer.VIDEO_THUMBNAIL_URL, instance.getVideoThumbnailUrl()) + .putExtra(BasePlayer.CHANNEL_NAME, instance.getChannelName()) + .putExtra(VideoPlayer.INDEX_SEL_VIDEO_STREAM, instance.getSelectedStreamIndex()) + .putExtra(VideoPlayer.VIDEO_STREAMS_LIST, instance.getVideoStreamsList()) + .putExtra(VideoPlayer.VIDEO_ONLY_AUDIO_STREAM, instance.getAudioStream()) + .putExtra(BasePlayer.START_POSITION, ((int) instance.getPlayer().getCurrentPosition())); + } + + public static Intent getOpenBackgroundPlayerIntent(Context context, StreamInfo info) { + return getOpenBackgroundPlayerIntent(context, info, info.audio_streams.get(Utils.getPreferredAudioFormat(context, info.audio_streams))); + } + + public static Intent getOpenBackgroundPlayerIntent(Context context, StreamInfo info, AudioStream audioStream) { + Intent mIntent = new Intent(context, BackgroundPlayer.class) + .putExtra(BasePlayer.VIDEO_TITLE, info.title) + .putExtra(BasePlayer.VIDEO_URL, info.webpage_url) + .putExtra(BasePlayer.VIDEO_THUMBNAIL_URL, info.thumbnail_url) + .putExtra(BasePlayer.CHANNEL_NAME, info.uploader) + .putExtra(BasePlayer.CHANNEL_NAME, info.uploader) + .putExtra(BackgroundPlayer.AUDIO_STREAM, audioStream); + if (info.start_position > 0) mIntent.putExtra(BasePlayer.START_POSITION, info.start_position * 1000); + return mIntent; } diff --git a/app/src/main/java/org/schabi/newpipe/util/Utils.java b/app/src/main/java/org/schabi/newpipe/util/Utils.java index a1cb5fefa..9581f379c 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Utils.java +++ b/app/src/main/java/org/schabi/newpipe/util/Utils.java @@ -136,13 +136,19 @@ public class Utils { break; } + int highestQualityIndex = 0; + + // Try to find a audio stream with the preferred format + for (int i = 0; i < audioStreams.size(); i++) if (audioStreams.get(i).format == preferredFormat) highestQualityIndex = i; + + // Try to find a audio stream with the highest bitrate and preferred format for (int i = 0; i < audioStreams.size(); i++) { - if (audioStreams.get(i).format == preferredFormat) { - return i; - } + AudioStream audioStream = audioStreams.get(i); + if (audioStream.avgBitrate > audioStreams.get(highestQualityIndex).avgBitrate + && audioStream.format == preferredFormat) highestQualityIndex = i; } - return 0; + return highestQualityIndex; } /** @@ -191,14 +197,13 @@ public class Utils { } return getSortedStreamVideosList(preferredFormat, showHigherResolutions, videoStreams, videoOnlyStreams, ascendingOrder); } - //show_higher_resolutions_key /** * Join the two lists of video streams (video_only and normal videos), and sort them according with preferred format * chosen by the user * * @param preferredFormat format to give preference - * @param showHigherResolutions + * @param showHigherResolutions show >1080p resolutions * @param videoStreams normal videos list * @param videoOnlyStreams video only stream list * @param ascendingOrder true -> smallest to greatest | false -> greatest to smallest @return the sorted list