Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Video progress resets when switching to popup/background and viceversa #7427

Closed
4 tasks done
Dangelman opened this issue Nov 20, 2021 · 24 comments · Fixed by #7668 or #7852
Closed
4 tasks done

Video progress resets when switching to popup/background and viceversa #7427

Dangelman opened this issue Nov 20, 2021 · 24 comments · Fixed by #7668 or #7852
Labels
ASAP Issue needs to be fixed as soon as possible bug Issue is related to a bug player Issues related to any player (main, popup and background)

Comments

@Dangelman
Copy link

Dangelman commented Nov 20, 2021

Workaround: #7427 (comment)

Checklist

Steps to reproduce the bug

  1. Play a video
  2. Watch if for some minutes in portrait mode
  3. Switch to popup or background

Actual behavior

The video progress will reset to either the start or the video or the last timestamp you paused it. The opposite is also true (especially switching from background to main player). I have auto-rotate disabled, if it can help.

Expected behavior

The video should progress from the same point (or 1-2 seconds before).

Screenshots/Screen recordings

#7427 (comment)
(change resolution if video freezes)

Logs

Device info

  • Android version/Custom ROM version: 11
  • Device model: LM-V500EM (LG V50 ThinQ 5G)
@Dangelman Dangelman added the bug Issue is related to a bug label Nov 20, 2021
@triallax
Copy link
Contributor

Sounds like a duplicate of #7303 to me, but I'm not exactly sure what the reproduction steps in your issue are since you didn't fill out that section, so please do that. :)

@triallax triallax added player Issues related to any player (main, popup and background) waiting for author If the author doesn't respond, the issue will be auto-closed. Otherwise the label will be removed. labels Nov 20, 2021
@Dangelman
Copy link
Author

Dangelman commented Nov 20, 2021

Sounds like a duplicate of #7303 to me, but I'm not exactly sure what the reproduction steps in your issue are since you didn't fill out that section, so please do that. :)

mb, I forgot to delete the comment brackets.

It should be the same as #7303, tho the author there did not mention the problem happening to popup or the possibility for the video to resume from the last pause timestamp instead of restarting.

@github-actions github-actions bot removed the waiting for author If the author doesn't respond, the issue will be auto-closed. Otherwise the label will be removed. label Nov 20, 2021
@opusforlife2
Copy link
Collaborator

@Dangelman Could you provide the exact steps? As I've written in the issue, it takes 2 switches for the bug to happen for me. Your steps seem to contain only one switch. Something is missing here.

@opusforlife2 opusforlife2 added the waiting for author If the author doesn't respond, the issue will be auto-closed. Otherwise the label will be removed. label Nov 21, 2021
@Dangelman
Copy link
Author

@opusforlife2 It's as I described.

  1. Open NewPipe
  2. Select a new video
  3. Play the video in portrait mode for 30s
  4. Switch to either popup/background

The video restarts instead of continuing, or jump back to the last timestamp you paused previously.

@github-actions github-actions bot removed the waiting for author If the author doesn't respond, the issue will be auto-closed. Otherwise the label will be removed. label Nov 21, 2021
@Dangelman
Copy link
Author

Dangelman commented Nov 21, 2021

https://streamable.com/dsae9q (change resolution if video freezes. There's a 15s buffering at the beginning, see below)
Here's a video. As you can see, the progress is all over the place during switches.
Sorry for buffer and fullscreen, I guess the video works for issue #7404 and #7252 too.

@opusforlife2
Copy link
Collaborator

The video restarts instead of continuing

This doesn't happen for me after step 4. Could you try it from a different phone?

@litetex
Copy link
Member

litetex commented Nov 21, 2021

Code analysis:
I think there is a problem inside

public void handleIntent(@NonNull final Intent intent) {
which also causes #7303

When looking at this big if block

/*
* There are 3 situations when playback shouldn't be started from scratch (zero timestamp):
* 1. User pressed on a timestamp link and the same video should be rewound to the timestamp
* 2. User changed a player from, for example. main to popup, or from audio to main, etc
* 3. User chose to resume a video based on a saved timestamp from history of played videos
* In those cases time will be saved because re-init of the play queue is a not an instant
* task and requires network calls
* */
// seek to timestamp if stream is already playing
if (!exoPlayerIsNull()
&& newQueue.size() == 1 && newQueue.getItem() != null
&& playQueue != null && playQueue.size() == 1 && playQueue.getItem() != null
&& newQueue.getItem().getUrl().equals(playQueue.getItem().getUrl())
&& newQueue.getItem().getRecoveryPosition() != PlayQueueItem.RECOVERY_UNSET) {
// Player can have state = IDLE when playback is stopped or failed
// and we should retry in this case
if (simpleExoPlayer.getPlaybackState()
== com.google.android.exoplayer2.Player.STATE_IDLE) {
simpleExoPlayer.prepare();
}
simpleExoPlayer.seekTo(playQueue.getIndex(), newQueue.getItem().getRecoveryPosition());
simpleExoPlayer.setPlayWhenReady(playWhenReady);
} else if (!exoPlayerIsNull()
&& samePlayQueue
&& playQueue != null
&& !playQueue.isDisposed()) {
// Do not re-init the same PlayQueue. Save time
// Player can have state = IDLE when playback is stopped or failed
// and we should retry in this case
if (simpleExoPlayer.getPlaybackState()
== com.google.android.exoplayer2.Player.STATE_IDLE) {
simpleExoPlayer.prepare();
}
simpleExoPlayer.setPlayWhenReady(playWhenReady);
} else if (intent.getBooleanExtra(RESUME_PLAYBACK, false)
&& isPlaybackResumeEnabled(this)
&& !samePlayQueue
&& !newQueue.isEmpty()
&& newQueue.getItem() != null
&& newQueue.getItem().getRecoveryPosition() == PlayQueueItem.RECOVERY_UNSET) {
databaseUpdateDisposable.add(recordManager.loadStreamState(newQueue.getItem())
.observeOn(AndroidSchedulers.mainThread())
// Do not place initPlayback() in doFinally() because
// it restarts playback after destroy()
//.doFinally()
.subscribe(
state -> {
if (!state.isFinished(newQueue.getItem().getDuration())) {
// resume playback only if the stream was not played to the end
newQueue.setRecovery(newQueue.getIndex(),
state.getProgressMillis());
}
initPlayback(newQueue, repeatMode, playbackSpeed, playbackPitch,
playbackSkipSilence, playWhenReady, isMuted);
},
error -> {
if (DEBUG) {
error.printStackTrace();
}
// In case any error we can start playback without history
initPlayback(newQueue, repeatMode, playbackSpeed, playbackPitch,
playbackSkipSilence, playWhenReady, isMuted);
},
() -> {
// Completed but not found in history
initPlayback(newQueue, repeatMode, playbackSpeed, playbackPitch,
playbackSkipSilence, playWhenReady, isMuted);
}
));
} else {
// Good to go...
// In a case of equal PlayQueues we can re-init old one but only when it is disposed
initPlayback(samePlayQueue ? playQueue : newQueue, repeatMode, playbackSpeed,
playbackPitch, playbackSkipSilence, playWhenReady, isMuted);
}
it seems that 2. User changed a player from, for example. main to popup, or from audio to main, etc is not working. When I press "Play in background", 1. User pressed on a timestamp link and the same video should be rewound to the timestamp is executed instead.
The key code-line seems to be
&& newQueue.getItem().getRecoveryPosition() != PlayQueueItem.RECOVERY_UNSET) {
because the recovery position is set immediately afterwards in or maybe in some other method (there are a dozen potential places where it can be called) before.

Proposed solutions:

  • Quick/Dirty one: clear recovery/playback position when changing player-type
  • Better one: I think this if-block should be reworked with event-types or something similar. So that we can clearly disguise what should be done.

@rancidfrog

This comment has been minimized.

@litetex

This comment has been minimized.

@rancidfrog

This comment has been minimized.

@litetex
Copy link
Member

litetex commented Nov 27, 2021

@rancidfrog
I still don't get it. What has that to do with this issue or how is this additional information?
I don't know what you mean exactly but I did a deep code analysis a few comments above.
I'm hiding the above comments as they don't help fixing the issue.

@akberkhan-time
Copy link

after following the lead from litetex , I found the issue may caused by not properly updating the streamProgressState so i did update it before change stream to popup or background player and it worked .

switch (v.getId()) {
case R.id.detail_controls_background:
openBackgroundPlayer(false);
break;
case R.id.detail_controls_popup:
openPopupPlayer(false);
break;

to

   switch (v.getId()) {
            case R.id.detail_controls_background:
                player.saveStreamProgressState();
                openBackgroundPlayer(false);
                break;
            case R.id.detail_controls_popup:
                player.saveStreamProgressState();
                openPopupPlayer(false);
                break;

i'm new to this repo , would love to hear further from u guys .

@tsiflimagas
Copy link
Contributor

@akberkhan-time this seems to be working fine indeed, nice job! Note it should also be done for case R.id.overlay_thumbnail: to properly update stream progress when coming back from another player. This solution seems to be not working when there's an enqueued stream though. I'm happy this starts to be coming to a solution nevertheless, as it is a rather annoying bug.

@protodrew
Copy link

just popping in to say I have had this issue as well. Using a S20 Ultra on the latest version

@drewsat
Copy link

drewsat commented Dec 31, 2021

Downgraded to v0.21.10 worked for me

@AudricV AudricV added the ASAP Issue needs to be fixed as soon as possible label Jan 2, 2022
@AudricV AudricV pinned this issue Jan 2, 2022
@MD77MD
Copy link

MD77MD commented Jan 6, 2022

any news about a solution for this bug

@PacoBell
Copy link

Yeah, this change in v0.21.15 didn't fix the issue for me in Android 12:

"Removed MediaParser support to fix failing playback resume after buffering on Android 11+."

Please implement akberkhan-time's streamProgressState findings into a new release. I often switch between full screen, pop-up, and background modes and this bug has made the app nearly unusable for me. Until then, I'm reverting to v0.21.10 like drewsat suggested.

@opusforlife2
Copy link
Collaborator

Yeah, this change in v0.21.15 didn't fix the issue for me in Android 12:

There is no way it could have. It's an unrelated PR. If you open it, you'll see the linked issue which that PR addresses.

@phyxfire
Copy link

Just wanted to share I also have had this issue. It's the worst to be watching a really long video, and then randomly have it snap back to the beginning again because you turned off the screen.

@TheShanMan
Copy link

I have this issue. Workaround: pause the video before switching how it's being played. Always solves it for me.

@opusforlife2
Copy link
Collaborator

@TheShanMan Awesome. I'm linking this up top.

@opusforlife2 opusforlife2 changed the title Video progress resets when switching to popup/background and viceversa Video progress resets when switching to popup/background and viceversa (WORKAROUND IN OP) Jan 17, 2022
@opusforlife2 opusforlife2 changed the title Video progress resets when switching to popup/background and viceversa (WORKAROUND IN OP) (WORKAROUND IN OP) Video progress resets when switching to popup/background and viceversa Jan 17, 2022
@litetex litetex changed the title (WORKAROUND IN OP) Video progress resets when switching to popup/background and viceversa Video progress resets when switching to popup/background and viceversa Jan 17, 2022
@litetex
Copy link
Member

litetex commented Jan 17, 2022

I tried to quickly fix the underlying problem - where the code tries to discover what happens based on parameter that don't describe what actually happens - but the code is a spaghetti monster of doom

Occasions where the player is changed or started

Summarized call hierarchy:

grafik

or as plain text:

NavigationHelper.getPlayerIntent(Context, Class<T>, PlayQueue, boolean, boolean)  (org.schabi.newpipe.util)
    VideoDetailFragment.openMainPlayer()  (org.schabi.newpipe.fragments.detail)
        VideoDetailFragment.openVideoPlayer(boolean)  (org.schabi.newpipe.fragments.detail)
            VideoDetailFragment.openVideoPlayerAutoFullscreen()  (org.schabi.newpipe.fragments.detail)
                VideoDetailFragment.onServiceConnected(Player, MainPlayer, boolean)  (org.schabi.newpipe.fragments.detail)
                    PlayerHolder.setListener(PlayerServiceExtendedEventListener)  (org.schabi.newpipe.player.helper)
                    PlayerServiceConnection in PlayerHolder.onServiceConnected(ComponentName, IBinder)  (org.schabi.newpipe.player.helper)
                VideoDetailFragment.runWorker(boolean, boolean)  (org.schabi.newpipe.fragments.detail)
                    VideoDetailFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.detail)
                    VideoDetailFragment.startLoading(boolean, boolean)  (org.schabi.newpipe.fragments.detail)
                VideoDetailFragment.onClick(View)  (org.schabi.newpipe.fragments.detail)
                    Anonymous in ActionBarDrawerToggle() in ActionBarDrawerToggle.onClick(View)  (androidx.appcompat.app)
                    ClickInterceptSpinner.performClick()  (com.android.printspooler.widget)
                    SearchView.onSearchClicked()  (android.widget)
                    QSFooterImpl.performAccessibilityAction(int, Bundle)  (com.android.systemui.qs)
                    Anonymous in onCreateView() in MaterialDatePicker.onClick(View)  (com.google.android.material.datepicker)
                    SearchView.onSearchClicked()  (androidx.appcompat.widget)
                    Anonymous in onCreateView() in MaterialTimePicker.onClick(View)  (com.google.android.material.timepicker)
                    TextActionModeCallback in Editor.onAssistMenuItemClicked(MenuItem)  (android.widget)
                    AccessibilityTargetHelper.createEnableDialogContentView(Context, AccessibilityServiceTarget, OnClickListener, OnClickListener)(2 usages)  (com.android.internal.accessibility.dialog)
                    KeyButtonView.onTouchEvent(MotionEvent)  (com.android.systemui.statusbar.policy)
                    Anonymous in mOnClickListener in FragmentBreadCrumbs.onClick(View)  (android.app)
                    View.callOnClick()  (android.view)
                    Anonymous in setAction() in Snackbar.onClick(View)  (com.google.android.material.snackbar)
                    RequireScrollMixinTest.testCreateOnClickListener()(2 usages)  (com.android.setupwizardlib.template)
                    TunerZenModePanel.onClick(View)  (com.android.systemui.tuner)
                    Chip.performCloseIconClick()  (com.google.android.material.chip)
                    View.performClick()  (android.view)
                    Anonymous in createOnClickListener() in RequireScrollMixin.onClick(View)  (com.android.setupwizardlib.template)
                    PassThroughClickListener in AutoCompleteTextView.onClick(View)  (android.widget)
                    PhotoView.onSingleTapConfirmed(MotionEvent)  (com.android.ex.photo.views)
                    Anonymous in onCreateView() in MaterialTimePicker.onClick(View)  (com.google.android.material.timepicker)
                    DelayedOnClickListener in SmartReplyView.onClick(View)  (com.android.systemui.statusbar.policy)
            NavigationHelper.openVideoDetailFragment(Context, FragmentManager, int, String, String, PlayQueue, boolean)  (org.schabi.newpipe.util)
                NavigationHelper.playOnMainPlayer(AppCompatActivity, PlayQueue)  (org.schabi.newpipe.util)
                    LocalPlaylistFragment.handleResult(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
                    StatisticsPlaylistFragment.handleResult(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
                    ChannelFragment.handleResult(ChannelInfo)  (org.schabi.newpipe.fragments.list.channel)
                    PlaylistFragment.handleResult(PlaylistInfo)  (org.schabi.newpipe.fragments.list.playlist)
                MainActivity.handleIntent(Intent)  (org.schabi.newpipe)
                    MainActivity.initFragments()  (org.schabi.newpipe)
                    MainActivity.onNewIntent(Intent)  (org.schabi.newpipe)
                Anonymous in initListeners() in LocalPlaylistFragment.selected(LocalItem)  (org.schabi.newpipe.local.playlist)
                    BaseFragment.onViewCreated(View, Bundle)  (org.schabi.newpipe)
                    FeedFragment.initListeners()  (org.schabi.newpipe.local.feed)
                VideoDetailFragment.onActivityResult(int, int, Intent)  (org.schabi.newpipe.fragments.detail)
                    Anonymous in attachController() in FragmentManager.onActivityResult(ActivityResult)  (androidx.fragment.app)
                    Anonymous in attachController() in FragmentManager.onActivityResult(ActivityResult)  (androidx.fragment.app)
                Anonymous in initListeners() in StatisticsPlaylistFragment.selected(LocalItem)  (org.schabi.newpipe.local.history)
                    BaseFragment.onViewCreated(View, Bundle)  (org.schabi.newpipe)
                    FeedFragment.initListeners()  (org.schabi.newpipe.local.feed)
                Anonymous in FeedFragment.kt.onItemClick(Item, View)  (org.schabi.newpipe.local.feed)
                BaseListFragment.onStreamSelected(StreamInfoItem)  (org.schabi.newpipe.fragments.list)
                    Anonymous in initListeners() in BaseListFragment.selected(StreamInfoItem)  (org.schabi.newpipe.fragments.list)
            VideoDetailFragment.onClick(View)  (org.schabi.newpipe.fragments.detail)
                Anonymous in ActionBarDrawerToggle() in ActionBarDrawerToggle.onClick(View)  (androidx.appcompat.app)
                ClickInterceptSpinner.performClick()  (com.android.printspooler.widget)
                SearchView.onSearchClicked()  (android.widget)
                QSFooterImpl.performAccessibilityAction(int, Bundle)  (com.android.systemui.qs)
                Anonymous in onCreateView() in MaterialDatePicker.onClick(View)  (com.google.android.material.datepicker)
                SearchView.onSearchClicked()  (androidx.appcompat.widget)
                TextActionModeCallback in Editor.onAssistMenuItemClicked(MenuItem)  (android.widget)
                Anonymous in onCreateView() in MaterialTimePicker.onClick(View)  (com.google.android.material.timepicker)
                AccessibilityTargetHelper.createEnableDialogContentView(Context, AccessibilityServiceTarget, OnClickListener, OnClickListener)(2 usages)  (com.android.internal.accessibility.dialog)
                KeyButtonView.onTouchEvent(MotionEvent)  (com.android.systemui.statusbar.policy)
                Anonymous in mOnClickListener in FragmentBreadCrumbs.onClick(View)  (android.app)
                View.callOnClick()  (android.view)
                Anonymous in setAction() in Snackbar.onClick(View)  (com.google.android.material.snackbar)
                RequireScrollMixinTest.testCreateOnClickListener()(2 usages)  (com.android.setupwizardlib.template)
                TunerZenModePanel.onClick(View)  (com.android.systemui.tuner)
                Chip.performCloseIconClick()  (com.google.android.material.chip)
                PassThroughClickListener in AutoCompleteTextView.onClick(View)  (android.widget)
                View.performClick()  (android.view)
                Anonymous in createOnClickListener() in RequireScrollMixin.onClick(View)  (com.android.setupwizardlib.template)
                PhotoView.onSingleTapConfirmed(MotionEvent)  (com.android.ex.photo.views)
                Anonymous in onCreateView() in MaterialTimePicker.onClick(View)  (com.google.android.material.timepicker)
                DelayedOnClickListener in SmartReplyView.onClick(View)  (com.android.systemui.statusbar.policy)
NavigationHelper.getPlayerEnqueueIntent(Context, Class<T>, PlayQueue)  (org.schabi.newpipe.util)
    NavigationHelper.enqueueOnPlayer(Context, PlayQueue, PlayerType)  (org.schabi.newpipe.util)
        LocalPlaylistFragment.handleResult(List<PlaylistStreamEntry>)(2 usages)  (org.schabi.newpipe.local.playlist)
            SearchFragment.handleResult(SearchInfo)  (org.schabi.newpipe.fragments.list.search)
            BaseListInfoFragment.handleResult(I)  (org.schabi.newpipe.fragments.list)
            SubscriptionFragment.handleResult(SubscriptionState)  (org.schabi.newpipe.local.subscription)
            VideoDetailFragment.prepareAndHandleInfo(StreamInfo, boolean)  (org.schabi.newpipe.fragments.detail)
            Anonymous in getPlaylistsSubscriber() in BookmarkFragment.onNext(List<PlaylistLocalItem>)  (org.schabi.newpipe.local.bookmark)
            BaseListInfoFragment.doInitialLoadLogic()  (org.schabi.newpipe.fragments.list)
            KioskFragment.handleResult(KioskInfo)  (org.schabi.newpipe.fragments.list.kiosk)
            PlaylistFragment.handleResult(PlaylistInfo)  (org.schabi.newpipe.fragments.list.playlist)
            FeedFragment.onResume()  (org.schabi.newpipe.local.feed)
            Anonymous in getHistoryObserver() in StatisticsPlaylistFragment.onNext(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
            FeedFragment.onViewCreated(View, Bundle)  (org.schabi.newpipe.local.feed)
            BaseListInfoFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list)
            RelatedItemsFragment.handleResult(RelatedItemInfo)  (org.schabi.newpipe.fragments.list.videos)
            Anonymous in getPlaylistObserver() in LocalPlaylistFragment.onNext(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
            VideoDetailFragment.runWorker(boolean, boolean)  (org.schabi.newpipe.fragments.detail)
            ChannelFragment.handleResult(ChannelInfo)  (org.schabi.newpipe.fragments.list.channel)
            CommentsFragment.handleResult(CommentsInfo)  (org.schabi.newpipe.fragments.list.comments)
            SearchFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list.search)
            SubscriptionFragment.initViews(View, Bundle)  (org.schabi.newpipe.local.subscription)
        ChannelFragment.handleResult(ChannelInfo)(2 usages)  (org.schabi.newpipe.fragments.list.channel)
            SubscriptionFragment.handleResult(SubscriptionState)  (org.schabi.newpipe.local.subscription)
            VideoDetailFragment.prepareAndHandleInfo(StreamInfo, boolean)  (org.schabi.newpipe.fragments.detail)
            BookmarkFragment.handleResult(List<PlaylistLocalItem>)  (org.schabi.newpipe.local.bookmark)
            StatisticsPlaylistFragment.handleResult(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
            Anonymous in getPlaylistsSubscriber() in BookmarkFragment.onNext(List<PlaylistLocalItem>)  (org.schabi.newpipe.local.bookmark)
            BaseListInfoFragment.doInitialLoadLogic()  (org.schabi.newpipe.fragments.list)
            FeedFragment.onResume()  (org.schabi.newpipe.local.feed)
            Anonymous in getHistoryObserver() in StatisticsPlaylistFragment.onNext(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
            FeedFragment.onViewCreated(View, Bundle)  (org.schabi.newpipe.local.feed)
            BaseListInfoFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list)
            VideoDetailFragment.runWorker(boolean, boolean)  (org.schabi.newpipe.fragments.detail)
            Anonymous in getPlaylistObserver() in LocalPlaylistFragment.onNext(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
            LocalPlaylistFragment.handleResult(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
            SearchFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list.search)
            SubscriptionFragment.initViews(View, Bundle)  (org.schabi.newpipe.local.subscription)
        VideoDetailFragment.openNormalBackgroundPlayer(boolean)  (org.schabi.newpipe.fragments.detail)
            VideoDetailFragment.openBackgroundPlayer(boolean)  (org.schabi.newpipe.fragments.detail)
        NavigationHelper.enqueueOnPlayer(Context, PlayQueue)  (org.schabi.newpipe.util)
            StreamDialogEntry.enqueue  (org.schabi.newpipe.util)
        VideoDetailFragment.openPopupPlayer(boolean)  (org.schabi.newpipe.fragments.detail)
            VideoDetailFragment.onLongClick(View)  (org.schabi.newpipe.fragments.detail)
            VideoDetailFragment.onClick(View)  (org.schabi.newpipe.fragments.detail)
        PlaylistFragment.handleResult(PlaylistInfo)(2 usages)  (org.schabi.newpipe.fragments.list.playlist)
            SubscriptionFragment.handleResult(SubscriptionState)  (org.schabi.newpipe.local.subscription)
            VideoDetailFragment.prepareAndHandleInfo(StreamInfo, boolean)  (org.schabi.newpipe.fragments.detail)
            BookmarkFragment.handleResult(List<PlaylistLocalItem>)  (org.schabi.newpipe.local.bookmark)
            StatisticsPlaylistFragment.handleResult(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
            Anonymous in getPlaylistsSubscriber() in BookmarkFragment.onNext(List<PlaylistLocalItem>)  (org.schabi.newpipe.local.bookmark)
            BaseListInfoFragment.doInitialLoadLogic()  (org.schabi.newpipe.fragments.list)
            FeedFragment.onResume()  (org.schabi.newpipe.local.feed)
            FeedFragment.onViewCreated(View, Bundle)  (org.schabi.newpipe.local.feed)
            Anonymous in getHistoryObserver() in StatisticsPlaylistFragment.onNext(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
            BaseListInfoFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list)
            Anonymous in getPlaylistObserver() in LocalPlaylistFragment.onNext(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
            VideoDetailFragment.runWorker(boolean, boolean)  (org.schabi.newpipe.fragments.detail)
            LocalPlaylistFragment.handleResult(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
            SearchFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list.search)
            SubscriptionFragment.initViews(View, Bundle)  (org.schabi.newpipe.local.subscription)
NavigationHelper.playOnBackgroundPlayer(Context, PlayQueue, boolean)  (org.schabi.newpipe.util)
    PlaylistFragment.showStreamDialog(StreamInfoItem)  (org.schabi.newpipe.fragments.list.playlist)
        Anonymous in initListeners() in BaseListFragment.held(StreamInfoItem)  (org.schabi.newpipe.fragments.list)
    StatisticsPlaylistFragment.showStreamDialog(StreamStatisticsEntry)  (org.schabi.newpipe.local.history)
        Anonymous in initListeners() in StatisticsPlaylistFragment.held(LocalItem)  (org.schabi.newpipe.local.history)
    FetcherService in RouterActivity.getResultHandler(Choice)  (org.schabi.newpipe)
        FetcherService in RouterActivity.handleChoice(Choice)  (org.schabi.newpipe)
    LocalPlaylistFragment.handleResult(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
        SearchFragment.handleResult(SearchInfo)  (org.schabi.newpipe.fragments.list.search)
        BaseListInfoFragment.handleResult(I)  (org.schabi.newpipe.fragments.list)
        SubscriptionFragment.handleResult(SubscriptionState)  (org.schabi.newpipe.local.subscription)
        VideoDetailFragment.prepareAndHandleInfo(StreamInfo, boolean)  (org.schabi.newpipe.fragments.detail)
        Anonymous in getPlaylistsSubscriber() in BookmarkFragment.onNext(List<PlaylistLocalItem>)  (org.schabi.newpipe.local.bookmark)
        BaseListInfoFragment.doInitialLoadLogic()  (org.schabi.newpipe.fragments.list)
        PlaylistFragment.handleResult(PlaylistInfo)  (org.schabi.newpipe.fragments.list.playlist)
        KioskFragment.handleResult(KioskInfo)  (org.schabi.newpipe.fragments.list.kiosk)
        FeedFragment.onResume()  (org.schabi.newpipe.local.feed)
        FeedFragment.onViewCreated(View, Bundle)  (org.schabi.newpipe.local.feed)
        Anonymous in getHistoryObserver() in StatisticsPlaylistFragment.onNext(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
        BaseListInfoFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list)
        RelatedItemsFragment.handleResult(RelatedItemInfo)  (org.schabi.newpipe.fragments.list.videos)
        Anonymous in getPlaylistObserver() in LocalPlaylistFragment.onNext(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
        VideoDetailFragment.runWorker(boolean, boolean)  (org.schabi.newpipe.fragments.detail)
        CommentsFragment.handleResult(CommentsInfo)  (org.schabi.newpipe.fragments.list.comments)
        ChannelFragment.handleResult(ChannelInfo)  (org.schabi.newpipe.fragments.list.channel)
        SearchFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list.search)
        SubscriptionFragment.initViews(View, Bundle)  (org.schabi.newpipe.local.subscription)
    StreamDialogEntry.start_here_on_background  (org.schabi.newpipe.util)
        BaseListFragment.showStreamDialog(StreamInfoItem)  (org.schabi.newpipe.fragments.list)
        BaseListFragment.showStreamDialog(StreamInfoItem)  (org.schabi.newpipe.fragments.list)
        StatisticsPlaylistFragment.showStreamDialog(StreamStatisticsEntry)  (org.schabi.newpipe.local.history)
        LocalPlaylistFragment.showStreamItemDialog(PlaylistStreamEntry)  (org.schabi.newpipe.local.playlist)
        LocalPlaylistFragment.showStreamItemDialog(PlaylistStreamEntry)  (org.schabi.newpipe.local.playlist)
        StatisticsPlaylistFragment.showStreamDialog(StreamStatisticsEntry)  (org.schabi.newpipe.local.history)
        StatisticsPlaylistFragment.showStreamDialog(StreamStatisticsEntry)  (org.schabi.newpipe.local.history)
        LocalPlaylistFragment.showStreamItemDialog(PlaylistStreamEntry)  (org.schabi.newpipe.local.playlist)
        [Invalid]
        PlaylistFragment.showStreamDialog(StreamInfoItem)  (org.schabi.newpipe.fragments.list.playlist)
        PlaylistFragment.showStreamDialog(StreamInfoItem)  (org.schabi.newpipe.fragments.list.playlist)
        [Invalid]
        PlaylistFragment.showStreamDialog(StreamInfoItem)  (org.schabi.newpipe.fragments.list.playlist)
    StatisticsPlaylistFragment.handleResult(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
        SearchFragment.handleResult(SearchInfo)  (org.schabi.newpipe.fragments.list.search)
        BaseListInfoFragment.handleResult(I)  (org.schabi.newpipe.fragments.list)
        SubscriptionFragment.handleResult(SubscriptionState)  (org.schabi.newpipe.local.subscription)
        VideoDetailFragment.prepareAndHandleInfo(StreamInfo, boolean)  (org.schabi.newpipe.fragments.detail)
        Anonymous in getPlaylistsSubscriber() in BookmarkFragment.onNext(List<PlaylistLocalItem>)  (org.schabi.newpipe.local.bookmark)
        BaseListInfoFragment.doInitialLoadLogic()  (org.schabi.newpipe.fragments.list)
        PlaylistFragment.handleResult(PlaylistInfo)  (org.schabi.newpipe.fragments.list.playlist)
        KioskFragment.handleResult(KioskInfo)  (org.schabi.newpipe.fragments.list.kiosk)
        FeedFragment.onResume()  (org.schabi.newpipe.local.feed)
        Anonymous in getHistoryObserver() in StatisticsPlaylistFragment.onNext(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
        FeedFragment.onViewCreated(View, Bundle)  (org.schabi.newpipe.local.feed)
        BaseListInfoFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list)
        RelatedItemsFragment.handleResult(RelatedItemInfo)  (org.schabi.newpipe.fragments.list.videos)
        Anonymous in getPlaylistObserver() in LocalPlaylistFragment.onNext(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
        VideoDetailFragment.runWorker(boolean, boolean)  (org.schabi.newpipe.fragments.detail)
        ChannelFragment.handleResult(ChannelInfo)  (org.schabi.newpipe.fragments.list.channel)
        CommentsFragment.handleResult(CommentsInfo)  (org.schabi.newpipe.fragments.list.comments)
        SearchFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list.search)
        SubscriptionFragment.initViews(View, Bundle)  (org.schabi.newpipe.local.subscription)
    ChannelFragment.handleResult(ChannelInfo)  (org.schabi.newpipe.fragments.list.channel)
        SubscriptionFragment.handleResult(SubscriptionState)  (org.schabi.newpipe.local.subscription)
        BookmarkFragment.handleResult(List<PlaylistLocalItem>)  (org.schabi.newpipe.local.bookmark)
        VideoDetailFragment.prepareAndHandleInfo(StreamInfo, boolean)  (org.schabi.newpipe.fragments.detail)
        StatisticsPlaylistFragment.handleResult(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
        Anonymous in getPlaylistsSubscriber() in BookmarkFragment.onNext(List<PlaylistLocalItem>)  (org.schabi.newpipe.local.bookmark)
        BaseListInfoFragment.doInitialLoadLogic()  (org.schabi.newpipe.fragments.list)
        FeedFragment.onResume()  (org.schabi.newpipe.local.feed)
        Anonymous in getHistoryObserver() in StatisticsPlaylistFragment.onNext(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
        FeedFragment.onViewCreated(View, Bundle)  (org.schabi.newpipe.local.feed)
        BaseListInfoFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list)
        Anonymous in getPlaylistObserver() in LocalPlaylistFragment.onNext(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
        VideoDetailFragment.runWorker(boolean, boolean)  (org.schabi.newpipe.fragments.detail)
        LocalPlaylistFragment.handleResult(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
        SearchFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list.search)
        SubscriptionFragment.initViews(View, Bundle)  (org.schabi.newpipe.local.subscription)
    LocalPlaylistFragment.showStreamItemDialog(PlaylistStreamEntry)  (org.schabi.newpipe.local.playlist)
        Anonymous in initListeners() in LocalPlaylistFragment.held(LocalItem)  (org.schabi.newpipe.local.playlist)
    PlayQueueActivity.onOptionsItemSelected(MenuItem)  (org.schabi.newpipe.player)
        PreferenceActivity.onOptionsItemSelected(MenuItem)  (android.preference)
        Activity.onMenuItemSelected(int, MenuItem)  (android.app)
        Activity.onOptionsItemSelected(MenuItem)  (android.app)
        NavigatingActivity.onOptionsItemSelected(MenuItem)  (leakcanary.internal.navigation)
        AboutActivity.onOptionsItemSelected(MenuItem)  (org.schabi.newpipe.about)
    VideoDetailFragment.openNormalBackgroundPlayer(boolean)  (org.schabi.newpipe.fragments.detail)
        VideoDetailFragment.openBackgroundPlayer(boolean)  (org.schabi.newpipe.fragments.detail)
    PlaylistFragment.handleResult(PlaylistInfo)  (org.schabi.newpipe.fragments.list.playlist)
        SubscriptionFragment.handleResult(SubscriptionState)  (org.schabi.newpipe.local.subscription)
        BookmarkFragment.handleResult(List<PlaylistLocalItem>)  (org.schabi.newpipe.local.bookmark)
        VideoDetailFragment.prepareAndHandleInfo(StreamInfo, boolean)  (org.schabi.newpipe.fragments.detail)
        StatisticsPlaylistFragment.handleResult(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
        Anonymous in getPlaylistsSubscriber() in BookmarkFragment.onNext(List<PlaylistLocalItem>)  (org.schabi.newpipe.local.bookmark)
        BaseListInfoFragment.doInitialLoadLogic()  (org.schabi.newpipe.fragments.list)
        FeedFragment.onResume()  (org.schabi.newpipe.local.feed)
        Anonymous in getHistoryObserver() in StatisticsPlaylistFragment.onNext(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
        FeedFragment.onViewCreated(View, Bundle)  (org.schabi.newpipe.local.feed)
        BaseListInfoFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list)
        Anonymous in getPlaylistObserver() in LocalPlaylistFragment.onNext(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
        VideoDetailFragment.runWorker(boolean, boolean)  (org.schabi.newpipe.fragments.detail)
        LocalPlaylistFragment.handleResult(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
        SearchFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list.search)
        SubscriptionFragment.initViews(View, Bundle)  (org.schabi.newpipe.local.subscription)
NotificationUtil.getIntentForNotification(Player)  (org.schabi.newpipe.player)
    NotificationUtil.updateNotification(Player)  (org.schabi.newpipe.player)
        NotificationUtil.createNotificationIfNeededAndUpdate(Player, boolean)  (org.schabi.newpipe.player)
            Player.onPlayQueueEdited()  (org.schabi.newpipe.player)
            Player.onShuffleOrRepeatModeChanged()  (org.schabi.newpipe.player)
            Player.onMetadataChanged(MediaSourceTag)  (org.schabi.newpipe.player)
            Player.onPlaying()  (org.schabi.newpipe.player)
            Player.onBroadcastReceived(Intent)  (org.schabi.newpipe.player)
            Anonymous in initThumbnail() in Player.onBitmapFailed(Exception, Drawable)  (org.schabi.newpipe.player)
            Player.onBuffering()  (org.schabi.newpipe.player)
            Player.onTimelineChanged(Timeline, int)  (org.schabi.newpipe.player)
            Player.onBlocked()  (org.schabi.newpipe.player)
            Anonymous in initThumbnail() in Player.onBitmapLoaded(Bitmap, LoadedFrom)  (org.schabi.newpipe.player)
            Player.onPaused()  (org.schabi.newpipe.player)
            Player.onPausedSeek()  (org.schabi.newpipe.player)
            Player.onCompleted()  (org.schabi.newpipe.player)
        NotificationUtil.createNotificationAndStartForeground(Player, Service)  (org.schabi.newpipe.player)
            MainPlayer.createView()  (org.schabi.newpipe.player)
            MainPlayer.onStartCommand(Intent, int, int)  (org.schabi.newpipe.player)
NavigationHelper.getPlayerEnqueueNextIntent(Context, Class<T>, PlayQueue)  (org.schabi.newpipe.util)
    NavigationHelper.enqueueNextOnPlayer(Context, PlayQueue)  (org.schabi.newpipe.util)
        StreamDialogEntry.enqueue_next  (org.schabi.newpipe.util)
            PlaylistFragment.showStreamDialog(StreamInfoItem)  (org.schabi.newpipe.fragments.list.playlist)
                Anonymous in initListeners() in BaseListFragment.held(StreamInfoItem)  (org.schabi.newpipe.fragments.list)
            LocalPlaylistFragment.showStreamItemDialog(PlaylistStreamEntry)  (org.schabi.newpipe.local.playlist)
                Anonymous in initListeners() in LocalPlaylistFragment.held(LocalItem)  (org.schabi.newpipe.local.playlist)
            StatisticsPlaylistFragment.showStreamDialog(StreamStatisticsEntry)  (org.schabi.newpipe.local.history)
                Anonymous in initListeners() in StatisticsPlaylistFragment.held(LocalItem)  (org.schabi.newpipe.local.history)
            BaseListFragment.showStreamDialog(StreamInfoItem)  (org.schabi.newpipe.fragments.list)
                Anonymous in initListeners() in BaseListFragment.held(StreamInfoItem)  (org.schabi.newpipe.fragments.list)
            [Invalid]
NavigationHelper.playOnPopupPlayer(Context, PlayQueue, boolean)  (org.schabi.newpipe.util)
    Player.onFragmentStopped()  (org.schabi.newpipe.player)
        Player.onBroadcastReceived(Intent)(2 usages)  (org.schabi.newpipe.player)
    FetcherService in RouterActivity.getResultHandler(Choice)  (org.schabi.newpipe)
        FetcherService in RouterActivity.handleChoice(Choice)  (org.schabi.newpipe)
    LocalPlaylistFragment.handleResult(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
        SearchFragment.handleResult(SearchInfo)  (org.schabi.newpipe.fragments.list.search)
        BaseListInfoFragment.handleResult(I)  (org.schabi.newpipe.fragments.list)
        SubscriptionFragment.handleResult(SubscriptionState)  (org.schabi.newpipe.local.subscription)
        VideoDetailFragment.prepareAndHandleInfo(StreamInfo, boolean)  (org.schabi.newpipe.fragments.detail)
        Anonymous in getPlaylistsSubscriber() in BookmarkFragment.onNext(List<PlaylistLocalItem>)  (org.schabi.newpipe.local.bookmark)
        BaseListInfoFragment.doInitialLoadLogic()  (org.schabi.newpipe.fragments.list)
        KioskFragment.handleResult(KioskInfo)  (org.schabi.newpipe.fragments.list.kiosk)
        PlaylistFragment.handleResult(PlaylistInfo)  (org.schabi.newpipe.fragments.list.playlist)
        FeedFragment.onResume()  (org.schabi.newpipe.local.feed)
        FeedFragment.onViewCreated(View, Bundle)  (org.schabi.newpipe.local.feed)
        Anonymous in getHistoryObserver() in StatisticsPlaylistFragment.onNext(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
        BaseListInfoFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list)
        RelatedItemsFragment.handleResult(RelatedItemInfo)  (org.schabi.newpipe.fragments.list.videos)
        Anonymous in getPlaylistObserver() in LocalPlaylistFragment.onNext(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
        VideoDetailFragment.runWorker(boolean, boolean)  (org.schabi.newpipe.fragments.detail)
        ChannelFragment.handleResult(ChannelInfo)  (org.schabi.newpipe.fragments.list.channel)
        CommentsFragment.handleResult(CommentsInfo)  (org.schabi.newpipe.fragments.list.comments)
        SearchFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list.search)
        SubscriptionFragment.initViews(View, Bundle)  (org.schabi.newpipe.local.subscription)
    ChannelFragment.handleResult(ChannelInfo)  (org.schabi.newpipe.fragments.list.channel)
        SubscriptionFragment.handleResult(SubscriptionState)  (org.schabi.newpipe.local.subscription)
        VideoDetailFragment.prepareAndHandleInfo(StreamInfo, boolean)  (org.schabi.newpipe.fragments.detail)
        BookmarkFragment.handleResult(List<PlaylistLocalItem>)  (org.schabi.newpipe.local.bookmark)
        StatisticsPlaylistFragment.handleResult(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
        Anonymous in getPlaylistsSubscriber() in BookmarkFragment.onNext(List<PlaylistLocalItem>)  (org.schabi.newpipe.local.bookmark)
        BaseListInfoFragment.doInitialLoadLogic()  (org.schabi.newpipe.fragments.list)
        FeedFragment.onResume()  (org.schabi.newpipe.local.feed)
        Anonymous in getHistoryObserver() in StatisticsPlaylistFragment.onNext(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
        FeedFragment.onViewCreated(View, Bundle)  (org.schabi.newpipe.local.feed)
        BaseListInfoFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list)
        Anonymous in getPlaylistObserver() in LocalPlaylistFragment.onNext(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
        VideoDetailFragment.runWorker(boolean, boolean)  (org.schabi.newpipe.fragments.detail)
        LocalPlaylistFragment.handleResult(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
        SearchFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list.search)
        SubscriptionFragment.initViews(View, Bundle)  (org.schabi.newpipe.local.subscription)
    StatisticsPlaylistFragment.handleResult(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
        SearchFragment.handleResult(SearchInfo)  (org.schabi.newpipe.fragments.list.search)
        BaseListInfoFragment.handleResult(I)  (org.schabi.newpipe.fragments.list)
        SubscriptionFragment.handleResult(SubscriptionState)  (org.schabi.newpipe.local.subscription)
        VideoDetailFragment.prepareAndHandleInfo(StreamInfo, boolean)  (org.schabi.newpipe.fragments.detail)
        Anonymous in getPlaylistsSubscriber() in BookmarkFragment.onNext(List<PlaylistLocalItem>)  (org.schabi.newpipe.local.bookmark)
        BaseListInfoFragment.doInitialLoadLogic()  (org.schabi.newpipe.fragments.list)
        PlaylistFragment.handleResult(PlaylistInfo)  (org.schabi.newpipe.fragments.list.playlist)
        KioskFragment.handleResult(KioskInfo)  (org.schabi.newpipe.fragments.list.kiosk)
        FeedFragment.onResume()  (org.schabi.newpipe.local.feed)
        Anonymous in getHistoryObserver() in StatisticsPlaylistFragment.onNext(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
        FeedFragment.onViewCreated(View, Bundle)  (org.schabi.newpipe.local.feed)
        BaseListInfoFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list)
        RelatedItemsFragment.handleResult(RelatedItemInfo)  (org.schabi.newpipe.fragments.list.videos)
        Anonymous in getPlaylistObserver() in LocalPlaylistFragment.onNext(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
        VideoDetailFragment.runWorker(boolean, boolean)  (org.schabi.newpipe.fragments.detail)
        ChannelFragment.handleResult(ChannelInfo)  (org.schabi.newpipe.fragments.list.channel)
        CommentsFragment.handleResult(CommentsInfo)  (org.schabi.newpipe.fragments.list.comments)
        SearchFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list.search)
        SubscriptionFragment.initViews(View, Bundle)  (org.schabi.newpipe.local.subscription)
    StreamDialogEntry.start_here_on_popup  (org.schabi.newpipe.util)
        BaseListFragment.showStreamDialog(StreamInfoItem)  (org.schabi.newpipe.fragments.list)
        StatisticsPlaylistFragment.showStreamDialog(StreamStatisticsEntry)  (org.schabi.newpipe.local.history)
        LocalPlaylistFragment.showStreamItemDialog(PlaylistStreamEntry)  (org.schabi.newpipe.local.playlist)
        PlaylistFragment.showStreamDialog(StreamInfoItem)  (org.schabi.newpipe.fragments.list.playlist)
        [Invalid]
    PlayQueueActivity.onOptionsItemSelected(MenuItem)  (org.schabi.newpipe.player)
        PreferenceActivity.onOptionsItemSelected(MenuItem)  (android.preference)
        Activity.onMenuItemSelected(int, MenuItem)  (android.app)
        Activity.onOptionsItemSelected(MenuItem)  (android.app)
        NavigatingActivity.onOptionsItemSelected(MenuItem)  (leakcanary.internal.navigation)
        AboutActivity.onOptionsItemSelected(MenuItem)  (org.schabi.newpipe.about)
    VideoDetailFragment.openPopupPlayer(boolean)  (org.schabi.newpipe.fragments.detail)
        VideoDetailFragment.onLongClick(View)  (org.schabi.newpipe.fragments.detail)
        VideoDetailFragment.onClick(View)  (org.schabi.newpipe.fragments.detail)
    PlaylistFragment.handleResult(PlaylistInfo)  (org.schabi.newpipe.fragments.list.playlist)
        SubscriptionFragment.handleResult(SubscriptionState)  (org.schabi.newpipe.local.subscription)
        VideoDetailFragment.prepareAndHandleInfo(StreamInfo, boolean)  (org.schabi.newpipe.fragments.detail)
        BookmarkFragment.handleResult(List<PlaylistLocalItem>)  (org.schabi.newpipe.local.bookmark)
        StatisticsPlaylistFragment.handleResult(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
        Anonymous in getPlaylistsSubscriber() in BookmarkFragment.onNext(List<PlaylistLocalItem>)  (org.schabi.newpipe.local.bookmark)
        BaseListInfoFragment.doInitialLoadLogic()  (org.schabi.newpipe.fragments.list)
        FeedFragment.onResume()  (org.schabi.newpipe.local.feed)
        Anonymous in getHistoryObserver() in StatisticsPlaylistFragment.onNext(List<StreamStatisticsEntry>)  (org.schabi.newpipe.local.history)
        FeedFragment.onViewCreated(View, Bundle)  (org.schabi.newpipe.local.feed)
        BaseListInfoFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list)
        Anonymous in getPlaylistObserver() in LocalPlaylistFragment.onNext(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
        VideoDetailFragment.runWorker(boolean, boolean)  (org.schabi.newpipe.fragments.detail)
        LocalPlaylistFragment.handleResult(List<PlaylistStreamEntry>)  (org.schabi.newpipe.local.playlist)
        SearchFragment.startLoading(boolean)  (org.schabi.newpipe.fragments.list.search)
        SubscriptionFragment.initViews(View, Bundle)  (org.schabi.newpipe.local.subscription)
    InternalUrlsHandler.playOnPopup(Context, String, StreamingService, int, CompositeDisposable)  (org.schabi.newpipe.util.external_communication)
        Anonymous in addClickListenersOnTimestamps() in TextLinkifier.onClick(View)  (org.schabi.newpipe.util.external_communication)
        InternalUrlsHandler.handleUrl(Context, String, Pattern, CompositeDisposable)  (org.schabi.newpipe.util.external_communication)

Did a quick and dirty fix with #7668 instead. Someone should do a followup PR where the code is refactored.

@ildar
Copy link

ildar commented Jan 20, 2022

a spaghetti monster

No wonder I experience race condition crashes for years.

@werjany

This comment was marked as duplicate.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ASAP Issue needs to be fixed as soon as possible bug Issue is related to a bug player Issues related to any player (main, popup and background)
Projects
None yet