Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2831b140 authored by Raff Tsai's avatar Raff Tsai
Browse files

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
parent cc8212ed
Loading
Loading
Loading
Loading
+31 −23
Original line number Diff line number Diff line
@@ -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;
        }
    }

@@ -199,5 +208,4 @@ public class VideoPreference extends Preference {
    void updateAspectRatio() {
        mAspectRadio = mMediaPlayer.getVideoWidth() / (float) mMediaPlayer.getVideoHeight();
    }

}
+9 −0
Original line number Diff line number Diff line
@@ -92,4 +92,13 @@ public class VideoPreferenceTest {

        verify(mMediaPlayer, never()).start();
    }

    @Test
    public void onViewInvisible_shouldReleaseMediaplayer() {
        mVideoPreference.onViewVisible(false);

        mVideoPreference.onViewInvisible();

        verify(mMediaPlayer).release();
    }
}