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

Commit 87007778 authored by Doris Ling's avatar Doris Ling
Browse files

Fix continous playing of gesture animation video.

In the gesture settings, we listen to surface texture updates to
determine when both the view and video is ready, and we auto play the
animation video. However, sometimes, the video listener will receive
the surface texture updates after the settings activity is being paused,
in which case, the video will continue to play until the user navigate
back to that gesture settings page.

In onSurfaceTextureUpdated(), check for view visibility before we try to
update anything to avoid unnecessary operation.

Change-Id: I46474c9f461d5705f599deb8b2535d8505f2fe75
Bug: 110923173
Test: make RunSettingsRoboTests
parent 4baf5322
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -48,10 +48,12 @@ public class VideoPreference extends Preference {
    MediaPlayer mMediaPlayer;
    @VisibleForTesting
    boolean mAnimationAvailable;
    private boolean mVideoReady;
    @VisibleForTesting
    boolean mVideoReady;
    private boolean mVideoPaused;
    private float mAspectRadio = 1.0f;
    private int mPreviewResource;
    private boolean mViewVisible;

    public VideoPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
@@ -144,6 +146,9 @@ public class VideoPreference extends Preference {

            @Override
            public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
                if (!mViewVisible) {
                    return;
                }
                if (mVideoReady) {
                    if (imageView.getVisibility() == View.VISIBLE) {
                        imageView.setVisibility(View.GONE);
@@ -172,6 +177,7 @@ public class VideoPreference extends Preference {
    }

    public void onViewVisible(boolean videoPaused) {
        mViewVisible = true;
        mVideoPaused = videoPaused;
        if (mVideoReady && mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
            mMediaPlayer.seekTo(0);
@@ -179,6 +185,7 @@ public class VideoPreference extends Preference {
    }

    public void onViewInvisible() {
        mViewVisible = false;
        if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
            mMediaPlayer.pause();
        }
+22 −0
Original line number Diff line number Diff line
@@ -17,11 +17,17 @@
package com.android.settings.widget;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.Context;
import android.graphics.SurfaceTexture;
import android.media.MediaPlayer;
import android.view.LayoutInflater;
import android.view.TextureView;

import com.android.settings.R;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -70,4 +76,20 @@ public class VideoPreferenceTest {
                (AspectRatioFrameLayout) mPreferenceViewHolder.findViewById(R.id.video_container);
        assertThat(layout.mAspectRatio).isWithin(0.01f).of(VIDEO_WIDTH / (float) VIDEO_HEIGHT);
    }

    @Test
    public void onSurfaceTextureUpdated_viewInvisible_shouldNotStartPlayingVideo() {
        final TextureView video =
            (TextureView) mPreferenceViewHolder.findViewById(R.id.video_texture_view);
        mVideoPreference.mAnimationAvailable = true;
        mVideoPreference.mVideoReady = true;
        mVideoPreference.onBindViewHolder(mPreferenceViewHolder);
        mVideoPreference.onViewInvisible();
        when(mMediaPlayer.isPlaying()).thenReturn(false);
        final TextureView.SurfaceTextureListener listener = video.getSurfaceTextureListener();

        listener.onSurfaceTextureUpdated(mock(SurfaceTexture.class));

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