Skip to content

Commit 0615cd9

Browse files
committed
player: mem leak fix (SegmentTimelineElement)
1 parent d72f6d7 commit 0615cd9

File tree

4 files changed

+62
-18
lines changed

4 files changed

+62
-18
lines changed

doubletapplayerview/src/main/java/com/github/vkay94/dtpv/youtube/views/YouTubeSecondsView.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,26 @@ class SecondsView(context: Context, attrs: AttributeSet?) :
108108
reset()
109109
}
110110

111+
// MOD: memory leak fix (animator keep ref to activity)
112+
override fun onDetachedFromWindow() {
113+
super.onDetachedFromWindow()
114+
115+
firstAnimator.removeAllUpdateListeners()
116+
firstAnimator.removeAllListeners()
117+
118+
secondAnimator.removeAllUpdateListeners()
119+
secondAnimator.removeAllListeners()
120+
121+
thirdAnimator.removeAllUpdateListeners()
122+
thirdAnimator.removeAllListeners()
123+
124+
fourthAnimator.removeAllUpdateListeners()
125+
fourthAnimator.removeAllListeners()
126+
127+
fifthAnimator.removeAllUpdateListeners()
128+
fifthAnimator.removeAllListeners()
129+
}
130+
111131
private fun reset() {
112132
icon1.alpha = 0f
113133
icon2.alpha = 0f

exoplayer-amzn-2.10.6/extensions/leanback/src/main/java/com/google/android/exoplayer2/ext/leanback/LeanbackPlayerAdapter.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,10 @@ public boolean isPrepared() {
207207

208208
@Override
209209
public void run() {
210+
if (!hasSurface) { // MOD: mem leak fix (SegmentTimelineElement)
211+
return;
212+
}
213+
210214
Callback callback = getCallback();
211215
callback.onCurrentPositionChanged(this);
212216
callback.onBufferedPositionChanged(this);

smarttubetv/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/playback/PlaybackActivity.java

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -181,21 +181,15 @@ public void finish() {
181181
getViewManager().blockTop(this);
182182
getViewManager().startParentView(this);
183183
} else {
184-
// NOTE: don't destroy player to prevent leaking (Activities num grow with every player start)!
185-
// The command to check: adb shell dumpsys meminfo org.smarttube.stable
186-
getViewManager().startParentView(this);
187-
// Player with TextureView keeps running in background because onStop() fired with huge delay (~5sec).
188-
mPlaybackFragment.maybeReleasePlayer();
189-
190-
//if (getPlayerTweaksData().isKeepFinishedActivityEnabled()) {
191-
// //moveTaskToBack(true); // Don't do this or you'll have problems when player overlaps other apps (e.g. casting)
192-
// getViewManager().startParentView(this);
193-
//
194-
// // Player with TextureView keeps running in background because onStop() fired with huge delay (~5sec).
195-
// mPlaybackFragment.maybeReleasePlayer();
196-
//} else {
197-
// super.finish();
198-
//}
184+
if (getPlayerTweaksData().isKeepFinishedActivityEnabled()) {
185+
//moveTaskToBack(true); // Don't do this or you'll have problems when player overlaps other apps (e.g. casting)
186+
getViewManager().startParentView(this);
187+
188+
// Player with TextureView keeps running in background because onStop() fired with huge delay (~5sec).
189+
mPlaybackFragment.maybeReleasePlayer();
190+
} else {
191+
super.finish();
192+
}
199193
}
200194
}
201195

smarttubetv/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/playback/PlaybackFragment.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import com.liskovsoft.smartyoutubetv2.tv.ui.common.LeanbackActivity;
7676
import com.liskovsoft.smartyoutubetv2.tv.ui.common.UriBackgroundManager;
7777
import com.liskovsoft.smartyoutubetv2.tv.ui.mod.leanback.misc.ProgressBarManager;
78+
import com.liskovsoft.smartyoutubetv2.tv.ui.mod.leanback.playerglue.tweaks.PlaybackTransportRowPresenter;
7879
import com.liskovsoft.smartyoutubetv2.tv.ui.playback.mod.SeekModePlaybackFragment;
7980
import com.liskovsoft.smartyoutubetv2.tv.ui.playback.mod.surface.SurfacePlaybackFragmentGlueHost;
8081
import com.liskovsoft.smartyoutubetv2.tv.ui.playback.other.BackboneQueueNavigator;
@@ -394,21 +395,46 @@ private void destroyPlayerObjects() {
394395
mRowsAdapter.clear();
395396
mRowsAdapter = null;
396397
}
398+
// pollution exo SegmentBase.SegmentTimelineElement 3 million allocation and grown after the player reinstantiation
399+
setPlaybackRow(null);
400+
setOnPlaybackItemViewClickedListener(null);
401+
setHostCallback(null);
402+
setPlaybackSeekUiClient(null);
403+
setPlaybackRowPresenter(null);
404+
setOnKeyInterceptListener(null);
405+
if (mRowsSupportFragment != null && mRowsSupportFragment.getVerticalGridView() != null) {
406+
mRowsSupportFragment.getVerticalGridView().setAdapter(null);
407+
mRowsSupportFragment.getBridgeAdapter().clear();
408+
mRowsSupportFragment.getBridgeAdapter().getPresenterMapper().clear();
409+
mRowsSupportFragment = null;
410+
}
397411
if (mMediaSessionConnector != null) {
398412
mMediaSessionConnector.setPlayer(null);
413+
mMediaSessionConnector.setControlDispatcher(null);
414+
mMediaSessionConnector.setMediaMetadataProvider(null);
415+
mMediaSessionConnector.setQueueNavigator(null);
399416
mMediaSessionConnector = null;
400417
}
401418
if (mMediaSession != null) {
402419
mMediaSession.setActive(false);
403420
mMediaSession.release();
404421
mMediaSession = null;
405422
}
406-
mPlayerGlue = null;
423+
if (mPlayerGlue != null) {
424+
((PlaybackTransportRowPresenter) mPlayerGlue.getPlaybackRowPresenter()).setOnActionLongClickedListener(null);
425+
((PlaybackTransportRowPresenter) mPlayerGlue.getPlaybackRowPresenter()).setOnActionClickedListener(null);
426+
mPlayerGlue.getPlayerAdapter().onDetachedFromHost();
427+
mPlayerGlue.setHost(null);
428+
mPlayerGlue = null;
429+
}
430+
if (mDebugInfoManager != null) {
431+
mDebugInfoManager.show(false);
432+
mDebugInfoManager = null;
433+
}
407434
// Fix access calls when player isn't initialized
408435
mExoPlayerController.release();
409436
mPlayer = null;
410437
mSubtitleManager = null;
411-
mDebugInfoManager = null;
412438
if (mYouTubeOverlay != null) {
413439
mYouTubeOverlay
414440
.player(null)
@@ -573,7 +599,7 @@ private void createMediaSession() {
573599

574600
// NOTE: No way to disable only a notifications. We need to disable the media session instead.
575601
boolean disableNotifications = getPlayerTweaksData().isPlaybackNotificationsDisabled();
576-
mMediaSession = new MediaSessionCompat(getContext(), getContext().getPackageName());
602+
mMediaSession = new MediaSessionCompat(getContext().getApplicationContext(), getContext().getPackageName()); // NOTE: mem leak fix (SegmentTimelineElement)
577603
mMediaSession.setActive(!disableNotifications);
578604
mMediaSessionConnector = new MediaSessionConnector(mMediaSession);
579605

0 commit comments

Comments
 (0)