From 9c3ab9718212d2bfb0189d1edeb7dd85a50317ed Mon Sep 17 00:00:00 2001 From: LuK1337 Date: Wed, 9 Oct 2019 16:08:12 +0200 Subject: [PATCH] Settings: Respect preference's visibility in VideoPreferenceController * Since AbstractPreferenceController's displayPreference() sets the visibility based on isAvailable() we need to set mVideoPreference early and make getAvailabilityStatus() return UNSUPPORTED_ON_DEVICE if needed. Test: manual, open battery manager Change-Id: Ibf72971b49fa1162fb99f9fc61cbb54ba39a2dfa --- .../settings/widget/VideoPreference.java | 6 +++++ .../widget/VideoPreferenceController.java | 5 ++-- .../widget/VideoPreferenceControllerTest.java | 23 ++++++++++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/widget/VideoPreference.java b/src/com/android/settings/widget/VideoPreference.java index 1af9065dbc6..11a6478f23d 100644 --- a/src/com/android/settings/widget/VideoPreference.java +++ b/src/com/android/settings/widget/VideoPreference.java @@ -80,6 +80,7 @@ public class VideoPreference extends Preference { try { // if these are already set that means they were set dynamically and don't need // to be loaded from xml + mAnimationAvailable = false; mAnimationId = mAnimationId == 0 ? attributes.getResourceId(R.styleable.VideoPreference_animation, 0) : mAnimationId; @@ -91,6 +92,7 @@ public class VideoPreference extends Preference { ? attributes.getResourceId(R.styleable.VideoPreference_preview, 0) : mPreviewResource; if (mPreviewResource == 0 && mAnimationId == 0) { + setVisible(false); return; } initMediaPlayer(); @@ -250,6 +252,10 @@ public class VideoPreference extends Preference { } } + public boolean isAnimationAvailable() { + return mAnimationAvailable; + } + public boolean isVideoPaused() { return mVideoPaused; } diff --git a/src/com/android/settings/widget/VideoPreferenceController.java b/src/com/android/settings/widget/VideoPreferenceController.java index 78a837c559c..488a554431e 100644 --- a/src/com/android/settings/widget/VideoPreferenceController.java +++ b/src/com/android/settings/widget/VideoPreferenceController.java @@ -37,13 +37,14 @@ public class VideoPreferenceController extends BasePreferenceController implemen @Override public int getAvailabilityStatus() { - return AVAILABLE_UNSEARCHABLE; + return mVideoPreference.isAnimationAvailable() ? + AVAILABLE_UNSEARCHABLE : UNSUPPORTED_ON_DEVICE; } @Override public void displayPreference(PreferenceScreen screen) { - super.displayPreference(screen); mVideoPreference = screen.findPreference(getPreferenceKey()); + super.displayPreference(screen); } @Override diff --git a/tests/robotests/src/com/android/settings/widget/VideoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/widget/VideoPreferenceControllerTest.java index 7fa2d282295..89d006aa8e8 100644 --- a/tests/robotests/src/com/android/settings/widget/VideoPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/widget/VideoPreferenceControllerTest.java @@ -17,10 +17,13 @@ package com.android.settings.widget; import static com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE; +import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.anyBoolean; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -33,6 +36,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.util.ReflectionHelpers; @RunWith(RobolectricTestRunner.class) public class VideoPreferenceControllerTest { @@ -52,10 +56,27 @@ public class VideoPreferenceControllerTest { } @Test - public void getAvailabilityStatus_isAlwaysAvailable() { + public void getAvailabilityStatus_isAvailableUnsearchable() { + final VideoPreference videoPreference = mock(VideoPreference.class); + + // Assign mock object to mVideoPreference in controller + ReflectionHelpers.setField(mController, "mVideoPreference", videoPreference); + doReturn(true).when(videoPreference).isAnimationAvailable(); + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_UNSEARCHABLE); } + @Test + public void getAvailabilityStatus_isUnsupportedOnDevice() { + final VideoPreference videoPreference = mock(VideoPreference.class); + + // Assign mock object to mVideoPreference in controller + ReflectionHelpers.setField(mController, "mVideoPreference", videoPreference); + doReturn(false).when(videoPreference).isAnimationAvailable(); + + assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE); + } + @Test public void onPause_shouldCallOnViewInvisibleOnPrefernece() { mController.displayPreference(mScreen);