Release the media player when the video preference is not visible.
Mediaplayer is not released when the device is paused, and hence it keep consuming battery. Fixes: 120945749 Test: adb root && watch -n 0.5 -d "adb shell cat /sys/kernel/debug/msm_vidc/core0/inst*/info\|egrep -i \"height\|width\|instance\|fps\|name\"" Use above command to check if any decoder instance exists. Change-Id: Ia0edbba0c2fd3c70753bc36d23d82c0770f95672
This commit is contained in:
@@ -54,6 +54,7 @@ public class VideoPreference extends Preference {
|
||||
private float mAspectRadio = 1.0f;
|
||||
private int mPreviewResource;
|
||||
private boolean mViewVisible;
|
||||
private Surface mSurface;
|
||||
|
||||
public VideoPreference(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
@@ -68,17 +69,12 @@ public class VideoPreference extends Preference {
|
||||
.authority(context.getPackageName())
|
||||
.appendPath(String.valueOf(animation))
|
||||
.build();
|
||||
mMediaPlayer = MediaPlayer.create(mContext, mVideoPath);
|
||||
mPreviewResource = attributes.getResourceId(
|
||||
R.styleable.VideoPreference_preview, 0);
|
||||
initMediaPlayer();
|
||||
if (mMediaPlayer != null && mMediaPlayer.getDuration() > 0) {
|
||||
setVisible(true);
|
||||
setLayoutResource(R.layout.video_preference);
|
||||
|
||||
mPreviewResource = attributes.getResourceId(
|
||||
R.styleable.VideoPreference_preview, 0);
|
||||
|
||||
mMediaPlayer.setOnSeekCompleteListener(mp -> mVideoReady = true);
|
||||
|
||||
mMediaPlayer.setOnPreparedListener(mediaPlayer -> mediaPlayer.setLooping(true));
|
||||
mAnimationAvailable = true;
|
||||
updateAspectRatio();
|
||||
} else {
|
||||
@@ -127,9 +123,8 @@ public class VideoPreference extends Preference {
|
||||
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width,
|
||||
int height) {
|
||||
if (mMediaPlayer != null) {
|
||||
mMediaPlayer.setSurface(new Surface(surfaceTexture));
|
||||
mVideoReady = false;
|
||||
mMediaPlayer.seekTo(0);
|
||||
mSurface = new Surface(surfaceTexture);
|
||||
mMediaPlayer.setSurface(mSurface);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -168,26 +163,40 @@ public class VideoPreference extends Preference {
|
||||
|
||||
@Override
|
||||
public void onDetached() {
|
||||
if (mMediaPlayer != null) {
|
||||
mMediaPlayer.stop();
|
||||
mMediaPlayer.reset();
|
||||
mMediaPlayer.release();
|
||||
}
|
||||
releaseMediaPlayer();
|
||||
super.onDetached();
|
||||
}
|
||||
|
||||
public void onViewVisible(boolean videoPaused) {
|
||||
mViewVisible = true;
|
||||
mVideoPaused = videoPaused;
|
||||
if (mVideoReady && mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
|
||||
mMediaPlayer.seekTo(0);
|
||||
}
|
||||
initMediaPlayer();
|
||||
}
|
||||
|
||||
public void onViewInvisible() {
|
||||
mViewVisible = false;
|
||||
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
|
||||
mMediaPlayer.pause();
|
||||
releaseMediaPlayer();
|
||||
}
|
||||
|
||||
private void initMediaPlayer() {
|
||||
if (mMediaPlayer == null) {
|
||||
mMediaPlayer = MediaPlayer.create(mContext, mVideoPath);
|
||||
mMediaPlayer.seekTo(0);
|
||||
mMediaPlayer.setOnSeekCompleteListener(mp -> mVideoReady = true);
|
||||
mMediaPlayer.setOnPreparedListener(mediaPlayer -> mediaPlayer.setLooping(true));
|
||||
if (mSurface != null) {
|
||||
mMediaPlayer.setSurface(mSurface);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void releaseMediaPlayer() {
|
||||
if (mMediaPlayer != null) {
|
||||
mMediaPlayer.stop();
|
||||
mMediaPlayer.reset();
|
||||
mMediaPlayer.release();
|
||||
mMediaPlayer = null;
|
||||
mVideoReady = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -197,7 +206,6 @@ public class VideoPreference extends Preference {
|
||||
|
||||
@VisibleForTesting
|
||||
void updateAspectRatio() {
|
||||
mAspectRadio = mMediaPlayer.getVideoWidth() / (float)mMediaPlayer.getVideoHeight();
|
||||
mAspectRadio = mMediaPlayer.getVideoWidth() / (float) mMediaPlayer.getVideoHeight();
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -92,4 +92,13 @@ public class VideoPreferenceTest {
|
||||
|
||||
verify(mMediaPlayer, never()).start();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onViewInvisible_shouldReleaseMediaplayer() {
|
||||
mVideoPreference.onViewVisible(false);
|
||||
|
||||
mVideoPreference.onViewInvisible();
|
||||
|
||||
verify(mMediaPlayer).release();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user