From a689787b71ffba193a5d5dd0a82767447dd922a0 Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Tue, 11 Jul 2017 10:38:24 -0700 Subject: [PATCH] Automatically play the gesture video when the setting is launched. - and save the video pause state on config change so that the paused video will not auto start again on screen rotation. Change-Id: I3f41849ee3063942fb4141e4556e494bc8439226 Fix: 63145847 Test: make RunSettingsRoboTests --- .../gestures/GesturePreferenceController.java | 27 ++++++++++++- .../settings/widget/VideoPreference.java | 15 ++++++- .../GesturePreferenceControllerTest.java | 40 +++++++++++++++++-- 3 files changed, 76 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/gestures/GesturePreferenceController.java b/src/com/android/settings/gestures/GesturePreferenceController.java index df61234115d..a2bad8a3bc0 100644 --- a/src/com/android/settings/gestures/GesturePreferenceController.java +++ b/src/com/android/settings/gestures/GesturePreferenceController.java @@ -17,6 +17,8 @@ package com.android.settings.gestures; import android.content.Context; +import android.os.Bundle; +import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; import android.support.v7.preference.TwoStatePreference; @@ -27,14 +29,20 @@ import com.android.settings.widget.VideoPreference; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnCreate; +import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; public abstract class GesturePreferenceController extends AbstractPreferenceController implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener, - LifecycleObserver, OnStart, OnStop { + LifecycleObserver, OnStart, OnStop, OnCreate, OnSaveInstanceState { + + @VisibleForTesting + static final String KEY_VIDEO_PAUSED = "key_video_paused"; private VideoPreference mVideoPreference; + private boolean mVideoPaused; public GesturePreferenceController(Context context, Lifecycle lifecycle) { super(context); @@ -66,6 +74,21 @@ public abstract class GesturePreferenceController extends AbstractPreferenceCont } } + @Override + public void onCreate(Bundle savedInstanceState) { + if (savedInstanceState != null) { + mVideoPaused = savedInstanceState.getBoolean(KEY_VIDEO_PAUSED, false); + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + if (mVideoPreference != null) { + mVideoPaused = mVideoPreference.isVideoPaused(); + } + outState.putBoolean(KEY_VIDEO_PAUSED, mVideoPaused); + } + @Override public void onStop() { if (mVideoPreference != null) { @@ -76,7 +99,7 @@ public abstract class GesturePreferenceController extends AbstractPreferenceCont @Override public void onStart() { if (mVideoPreference != null) { - mVideoPreference.onViewVisible(); + mVideoPreference.onViewVisible(mVideoPaused); } } diff --git a/src/com/android/settings/widget/VideoPreference.java b/src/com/android/settings/widget/VideoPreference.java index e06ef56fe5e..7758c6e4162 100644 --- a/src/com/android/settings/widget/VideoPreference.java +++ b/src/com/android/settings/widget/VideoPreference.java @@ -45,6 +45,7 @@ public class VideoPreference extends Preference { private MediaPlayer mMediaPlayer; private boolean mAnimationAvailable; private boolean mVideoReady; + private boolean mVideoPaused; private int mPreviewResource; public VideoPreference(Context context, AttributeSet attrs) { @@ -100,9 +101,11 @@ public class VideoPreference extends Preference { if (mMediaPlayer.isPlaying()) { mMediaPlayer.pause(); playButton.setVisibility(View.VISIBLE); + mVideoPaused = true; } else { mMediaPlayer.start(); playButton.setVisibility(View.GONE); + mVideoPaused = false; } } }); @@ -133,6 +136,10 @@ public class VideoPreference extends Preference { public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { if (mVideoReady && imageView.getVisibility() == View.VISIBLE) { imageView.setVisibility(View.GONE); + if (!mVideoPaused && mMediaPlayer != null && !mMediaPlayer.isPlaying()) { + mMediaPlayer.start(); + playButton.setVisibility(View.GONE); + } } if (mMediaPlayer != null && !mMediaPlayer.isPlaying() && playButton.getVisibility() != View.VISIBLE) { @@ -152,7 +159,8 @@ public class VideoPreference extends Preference { super.onDetached(); } - public void onViewVisible() { + public void onViewVisible(boolean videoPaused) { + mVideoPaused = videoPaused; if (mVideoReady && mMediaPlayer != null && !mMediaPlayer.isPlaying()) { mMediaPlayer.seekTo(0); } @@ -163,4 +171,9 @@ public class VideoPreference extends Preference { mMediaPlayer.pause(); } } + + public boolean isVideoPaused() { + return mVideoPaused; + } + } diff --git a/tests/robotests/src/com/android/settings/gestures/GesturePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/GesturePreferenceControllerTest.java index 8b4ef61a910..f1f54b0a6af 100644 --- a/tests/robotests/src/com/android/settings/gestures/GesturePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/gestures/GesturePreferenceControllerTest.java @@ -17,6 +17,7 @@ package com.android.settings.gestures; import android.content.Context; +import android.os.Bundle; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; import android.support.v7.preference.TwoStatePreference; @@ -38,6 +39,7 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -84,15 +86,29 @@ public class GesturePreferenceControllerTest { } @Test - public void onStart_shouldStartVideoPreference() { + public void onStart_shouldStartVideoPreferenceWithVideoPauseState() { final VideoPreference videoPreference = mock(VideoPreference.class); when(mScreen.findPreference(mController.getVideoPrefKey())).thenReturn(videoPreference); mController.mIsPrefAvailable = true; mController.displayPreference(mScreen); - mController.onStart(); + final Bundle savedState = new Bundle(); - verify(videoPreference).onViewVisible(); + mController.onCreate(null); + mController.onStart(); + verify(videoPreference).onViewVisible(false); + + reset(videoPreference); + savedState.putBoolean(mController.KEY_VIDEO_PAUSED, true); + mController.onCreate(savedState); + mController.onStart(); + verify(videoPreference).onViewVisible(true); + + reset(videoPreference); + savedState.putBoolean(mController.KEY_VIDEO_PAUSED, false); + mController.onCreate(savedState); + mController.onStart(); + verify(videoPreference).onViewVisible(false); } @Test @@ -107,6 +123,24 @@ public class GesturePreferenceControllerTest { verify(videoPreference).onViewInvisible(); } + @Test + public void onSaveInstanceState_shouldSaveVideoPauseState() { + final VideoPreference videoPreference = mock(VideoPreference.class); + when(mScreen.findPreference(mController.getVideoPrefKey())).thenReturn(videoPreference); + mController.mIsPrefAvailable = true; + mController.displayPreference(mScreen); + final Bundle outState = mock(Bundle.class); + + when(videoPreference.isVideoPaused()).thenReturn(true); + mController.onSaveInstanceState(outState); + verify(outState).putBoolean(mController.KEY_VIDEO_PAUSED, true); + + reset(outState); + when(videoPreference.isVideoPaused()).thenReturn(false); + mController.onSaveInstanceState(outState); + verify(outState).putBoolean(mController.KEY_VIDEO_PAUSED, false); + } + @Test public void updateState_preferenceSetCheckedWhenSettingIsOn() { // Mock a TwoStatePreference