From edabbd52d0eeaf7c5c28b1a9a34688cec80aa512 Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 12 Feb 2019 16:36:03 +0000 Subject: [PATCH] Update Robolectric and Truth. PiperOrigin-RevId: 233612344 --- constants.gradle | 4 +- extensions/cast/build.gradle | 2 + .../src/test/resources/robolectric.properties | 1 - extensions/cronet/build.gradle | 2 + .../src/test/resources/robolectric.properties | 1 - extensions/ffmpeg/build.gradle | 2 + .../src/test/resources/robolectric.properties | 1 - extensions/flac/build.gradle | 2 + .../src/test/resources/robolectric.properties | 1 - extensions/gvr/build.gradle | 2 + extensions/ima/build.gradle | 2 + .../src/test/resources/robolectric.properties | 1 - extensions/jobdispatcher/build.gradle | 2 + extensions/leanback/build.gradle | 2 + extensions/mediasession/build.gradle | 2 + extensions/okhttp/build.gradle | 2 + extensions/opus/build.gradle | 2 + .../src/test/resources/robolectric.properties | 1 - extensions/rtmp/build.gradle | 2 + extensions/vp9/build.gradle | 2 + .../src/test/resources/robolectric.properties | 1 - gradle.properties | 1 + library/core/build.gradle | 2 + .../exoplayer2/audio/AudioFocusManager.java | 6 + .../android/exoplayer2/ExoPlayerTest.java | 5 +- .../audio/AudioFocusManagerTest.java | 132 ++++++++++++++++-- .../src/test/resources/robolectric.properties | 1 - library/dash/build.gradle | 2 + .../src/test/resources/robolectric.properties | 1 - library/hls/build.gradle | 2 + .../src/test/resources/robolectric.properties | 1 - library/smoothstreaming/build.gradle | 2 + .../src/test/resources/robolectric.properties | 1 - library/ui/build.gradle | 2 + .../src/test/resources/robolectric.properties | 1 - playbacktests/build.gradle | 2 + testutils/build.gradle | 2 + .../src/test/resources/robolectric.properties | 1 - testutils_robolectric/build.gradle | 2 + .../exoplayer2/testutil/RobolectricUtil.java | 6 +- 40 files changed, 176 insertions(+), 33 deletions(-) delete mode 100644 extensions/cast/src/test/resources/robolectric.properties delete mode 100644 extensions/cronet/src/test/resources/robolectric.properties delete mode 100644 extensions/ffmpeg/src/test/resources/robolectric.properties delete mode 100644 extensions/flac/src/test/resources/robolectric.properties delete mode 100644 extensions/ima/src/test/resources/robolectric.properties delete mode 100644 extensions/opus/src/test/resources/robolectric.properties delete mode 100644 extensions/vp9/src/test/resources/robolectric.properties delete mode 100644 library/core/src/test/resources/robolectric.properties delete mode 100644 library/dash/src/test/resources/robolectric.properties delete mode 100644 library/hls/src/test/resources/robolectric.properties delete mode 100644 library/smoothstreaming/src/test/resources/robolectric.properties delete mode 100644 library/ui/src/test/resources/robolectric.properties delete mode 100644 testutils/src/test/resources/robolectric.properties diff --git a/constants.gradle b/constants.gradle index 84158f00f6..ab3d097fbc 100644 --- a/constants.gradle +++ b/constants.gradle @@ -23,8 +23,8 @@ project.ext { dexmakerVersion = '1.2' mockitoVersion = '1.9.5' junitVersion = '4.12' - truthVersion = '0.39' - robolectricVersion = '3.7.1' + truthVersion = '0.42' + robolectricVersion = '4.1' autoValueVersion = '1.6' checkerframeworkVersion = '2.5.0' testRunnerVersion = '1.1.0-alpha3' diff --git a/extensions/cast/build.gradle b/extensions/cast/build.gradle index 2bfd037fbc..cc7709e2dc 100644 --- a/extensions/cast/build.gradle +++ b/extensions/cast/build.gradle @@ -26,6 +26,8 @@ android { minSdkVersion project.ext.minSdkVersion targetSdkVersion project.ext.targetSdkVersion } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/extensions/cast/src/test/resources/robolectric.properties b/extensions/cast/src/test/resources/robolectric.properties deleted file mode 100644 index 2f3210368e..0000000000 --- a/extensions/cast/src/test/resources/robolectric.properties +++ /dev/null @@ -1 +0,0 @@ -manifest=src/test/AndroidManifest.xml diff --git a/extensions/cronet/build.gradle b/extensions/cronet/build.gradle index f1adc9b6ce..c2654267e6 100644 --- a/extensions/cronet/build.gradle +++ b/extensions/cronet/build.gradle @@ -26,6 +26,8 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/extensions/cronet/src/test/resources/robolectric.properties b/extensions/cronet/src/test/resources/robolectric.properties deleted file mode 100644 index 2f3210368e..0000000000 --- a/extensions/cronet/src/test/resources/robolectric.properties +++ /dev/null @@ -1 +0,0 @@ -manifest=src/test/AndroidManifest.xml diff --git a/extensions/ffmpeg/build.gradle b/extensions/ffmpeg/build.gradle index 2c2499759d..7147cc7cb7 100644 --- a/extensions/ffmpeg/build.gradle +++ b/extensions/ffmpeg/build.gradle @@ -32,6 +32,8 @@ android { jniLibs.srcDir 'src/main/libs' jni.srcDirs = [] // Disable the automatic ndk-build call by Android Studio. } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/extensions/ffmpeg/src/test/resources/robolectric.properties b/extensions/ffmpeg/src/test/resources/robolectric.properties deleted file mode 100644 index 2f3210368e..0000000000 --- a/extensions/ffmpeg/src/test/resources/robolectric.properties +++ /dev/null @@ -1 +0,0 @@ -manifest=src/test/AndroidManifest.xml diff --git a/extensions/flac/build.gradle b/extensions/flac/build.gradle index 41148bbc7d..fbc919a4c4 100644 --- a/extensions/flac/build.gradle +++ b/extensions/flac/build.gradle @@ -33,6 +33,8 @@ android { jniLibs.srcDir 'src/main/libs' jni.srcDirs = [] // Disable the automatic ndk-build call by Android Studio. } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/extensions/flac/src/test/resources/robolectric.properties b/extensions/flac/src/test/resources/robolectric.properties deleted file mode 100644 index 2f3210368e..0000000000 --- a/extensions/flac/src/test/resources/robolectric.properties +++ /dev/null @@ -1 +0,0 @@ -manifest=src/test/AndroidManifest.xml diff --git a/extensions/gvr/build.gradle b/extensions/gvr/build.gradle index 44200e9259..7d8184939d 100644 --- a/extensions/gvr/build.gradle +++ b/extensions/gvr/build.gradle @@ -26,6 +26,8 @@ android { minSdkVersion 19 targetSdkVersion project.ext.targetSdkVersion } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/extensions/ima/build.gradle b/extensions/ima/build.gradle index fa263dd53a..85a9ed1603 100644 --- a/extensions/ima/build.gradle +++ b/extensions/ima/build.gradle @@ -27,6 +27,8 @@ android { targetSdkVersion project.ext.targetSdkVersion consumerProguardFiles 'proguard-rules.txt' } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/extensions/ima/src/test/resources/robolectric.properties b/extensions/ima/src/test/resources/robolectric.properties deleted file mode 100644 index 2f3210368e..0000000000 --- a/extensions/ima/src/test/resources/robolectric.properties +++ /dev/null @@ -1 +0,0 @@ -manifest=src/test/AndroidManifest.xml diff --git a/extensions/jobdispatcher/build.gradle b/extensions/jobdispatcher/build.gradle index b601e013c2..d7f19d2545 100644 --- a/extensions/jobdispatcher/build.gradle +++ b/extensions/jobdispatcher/build.gradle @@ -28,6 +28,8 @@ android { minSdkVersion project.ext.minSdkVersion targetSdkVersion project.ext.targetSdkVersion } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/extensions/leanback/build.gradle b/extensions/leanback/build.gradle index e63ce8aae1..d276fc0f8a 100644 --- a/extensions/leanback/build.gradle +++ b/extensions/leanback/build.gradle @@ -26,6 +26,8 @@ android { minSdkVersion 17 targetSdkVersion project.ext.targetSdkVersion } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/extensions/mediasession/build.gradle b/extensions/mediasession/build.gradle index 29544c4759..30e5454772 100644 --- a/extensions/mediasession/build.gradle +++ b/extensions/mediasession/build.gradle @@ -26,6 +26,8 @@ android { minSdkVersion project.ext.minSdkVersion targetSdkVersion project.ext.targetSdkVersion } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/extensions/okhttp/build.gradle b/extensions/okhttp/build.gradle index 172fa175b5..9c24c489e2 100644 --- a/extensions/okhttp/build.gradle +++ b/extensions/okhttp/build.gradle @@ -27,6 +27,8 @@ android { targetSdkVersion project.ext.targetSdkVersion consumerProguardFiles 'proguard-rules.txt' } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/extensions/opus/build.gradle b/extensions/opus/build.gradle index 212c985157..0f8669ae9b 100644 --- a/extensions/opus/build.gradle +++ b/extensions/opus/build.gradle @@ -33,6 +33,8 @@ android { jniLibs.srcDir 'src/main/libs' jni.srcDirs = [] // Disable the automatic ndk-build call by Android Studio. } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/extensions/opus/src/test/resources/robolectric.properties b/extensions/opus/src/test/resources/robolectric.properties deleted file mode 100644 index 2f3210368e..0000000000 --- a/extensions/opus/src/test/resources/robolectric.properties +++ /dev/null @@ -1 +0,0 @@ -manifest=src/test/AndroidManifest.xml diff --git a/extensions/rtmp/build.gradle b/extensions/rtmp/build.gradle index 5d8f864594..cf03ca14b7 100644 --- a/extensions/rtmp/build.gradle +++ b/extensions/rtmp/build.gradle @@ -26,6 +26,8 @@ android { minSdkVersion project.ext.minSdkVersion targetSdkVersion project.ext.targetSdkVersion } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/extensions/vp9/build.gradle b/extensions/vp9/build.gradle index f6702e28bb..9e5f15375a 100644 --- a/extensions/vp9/build.gradle +++ b/extensions/vp9/build.gradle @@ -33,6 +33,8 @@ android { jniLibs.srcDir 'src/main/libs' jni.srcDirs = [] // Disable the automatic ndk-build call by Android Studio. } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/extensions/vp9/src/test/resources/robolectric.properties b/extensions/vp9/src/test/resources/robolectric.properties deleted file mode 100644 index 2f3210368e..0000000000 --- a/extensions/vp9/src/test/resources/robolectric.properties +++ /dev/null @@ -1 +0,0 @@ -manifest=src/test/AndroidManifest.xml diff --git a/gradle.properties b/gradle.properties index b55575bc3b..b1758d4cea 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,4 @@ ## Project-wide Gradle settings. android.useDeprecatedNdk=true +android.enableUnitTestBinaryResources=true buildDir=buildout diff --git a/library/core/build.gradle b/library/core/build.gradle index e143d58ca9..86879743a1 100644 --- a/library/core/build.gradle +++ b/library/core/build.gradle @@ -53,6 +53,8 @@ android { // testCoverageEnabled = true // } } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioFocusManager.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioFocusManager.java index c20ede439f..461849f1e2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioFocusManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioFocusManager.java @@ -21,6 +21,7 @@ import android.media.AudioManager; import android.support.annotation.IntDef; import android.support.annotation.Nullable; import android.support.annotation.RequiresApi; +import android.support.annotation.VisibleForTesting; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Player; @@ -195,6 +196,11 @@ public final class AudioFocusManager { // Internal methods. + @VisibleForTesting + /* package */ AudioManager.OnAudioFocusChangeListener getFocusListener() { + return focusListener; + } + @PlayerCommand private int handleIdle(boolean playWhenReady) { return playWhenReady ? PLAYER_COMMAND_PLAY_WHEN_READY : PLAYER_COMMAND_DO_NOT_PLAY; diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 7f01c02b49..960574d30e 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -19,6 +19,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; import android.content.Context; +import android.graphics.SurfaceTexture; import android.support.annotation.Nullable; import android.view.Surface; import com.google.android.exoplayer2.Player.DiscontinuityReason; @@ -2593,8 +2594,8 @@ public final class ExoPlayerTest { // Internal methods. private static ActionSchedule.Builder addSurfaceSwitch(ActionSchedule.Builder builder) { - final Surface surface1 = new Surface(null); - final Surface surface2 = new Surface(null); + final Surface surface1 = new Surface(new SurfaceTexture(/* texName= */ 0)); + final Surface surface2 = new Surface(new SurfaceTexture(/* texName= */ 1)); return builder .executeRunnable( new PlayerRunnable() { diff --git a/library/core/src/test/java/com/google/android/exoplayer2/audio/AudioFocusManagerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/audio/AudioFocusManagerTest.java index 086c4ebc7f..30d57af4be 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/audio/AudioFocusManagerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/audio/AudioFocusManagerTest.java @@ -22,15 +22,18 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; import android.content.Context; +import android.media.AudioFocusRequest; import android.media.AudioManager; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.util.Util; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; +import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowAudioManager; /** Unit tests for {@link AudioFocusManager}. */ @@ -69,6 +72,7 @@ public class AudioFocusManagerTest { } @Test + @Config(maxSdk = 25) public void setAudioAttributes_withNullUsage_releasesAudioFocus() { // Create attributes and request audio focus. AudioAttributes media = new AudioAttributes.Builder().setUsage(C.USAGE_MEDIA).build(); @@ -92,6 +96,31 @@ public class AudioFocusManagerTest { assertThat(lastRequest).isNotNull(); } + @Test + @Config(minSdk = 26) + public void setAudioAttributes_withNullUsage_releasesAudioFocus_v26() { + // Create attributes and request audio focus. + AudioAttributes media = new AudioAttributes.Builder().setUsage(C.USAGE_MEDIA).build(); + Shadows.shadowOf(audioManager) + .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); + assertThat( + audioFocusManager.setAudioAttributes( + media, /* playWhenReady= */ true, Player.STATE_READY)) + .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); + ShadowAudioManager.AudioFocusRequest request = + Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); + assertThat(getAudioFocusGainFromRequest(request)).isEqualTo(AudioManager.AUDIOFOCUS_GAIN); + + // Ensure that setting null audio attributes with audio focus releases audio focus. + assertThat( + audioFocusManager.setAudioAttributes( + /* audioAttributes= */ null, /* playWhenReady= */ true, Player.STATE_READY)) + .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); + AudioFocusRequest lastRequest = + Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusRequest(); + assertThat(lastRequest).isNotNull(); + } + @Test public void setAudioAttributes_withUsageAlarm_throwsIllegalArgumentException() { // Ensure that audio attributes that map to AUDIOFOCUS_GAIN_TRANSIENT* throw @@ -117,7 +146,7 @@ public class AudioFocusManagerTest { .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); ShadowAudioManager.AudioFocusRequest request = Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); - assertThat(request.durationHint).isEqualTo(AudioManager.AUDIOFOCUS_GAIN); + assertThat(getAudioFocusGainFromRequest(request)).isEqualTo(AudioManager.AUDIOFOCUS_GAIN); } @Test @@ -133,7 +162,7 @@ public class AudioFocusManagerTest { .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); ShadowAudioManager.AudioFocusRequest request = Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); - assertThat(request.durationHint).isEqualTo(AudioManager.AUDIOFOCUS_GAIN); + assertThat(getAudioFocusGainFromRequest(request)).isEqualTo(AudioManager.AUDIOFOCUS_GAIN); } @Test @@ -189,12 +218,12 @@ public class AudioFocusManagerTest { media, /* playWhenReady= */ true, Player.STATE_READY)) .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); - ShadowAudioManager.AudioFocusRequest request = - Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); - request.listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK); + audioFocusManager + .getFocusListener() + .onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK); assertThat(testPlayerControl.lastVolumeMultiplier).isLessThan(1.0f); assertThat(testPlayerControl.lastPlayerCommand).isEqualTo(NO_COMMAND_RECEIVED); - request.listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_GAIN); + audioFocusManager.getFocusListener().onAudioFocusChange(AudioManager.AUDIOFOCUS_GAIN); assertThat(testPlayerControl.lastVolumeMultiplier).isEqualTo(1.0f); } @@ -215,12 +244,12 @@ public class AudioFocusManagerTest { media, /* playWhenReady= */ true, Player.STATE_READY)) .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); - ShadowAudioManager.AudioFocusRequest request = - Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); - request.listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK); + audioFocusManager + .getFocusListener() + .onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK); assertThat(testPlayerControl.lastPlayerCommand).isEqualTo(PLAYER_COMMAND_WAIT_FOR_CALLBACK); assertThat(testPlayerControl.lastVolumeMultiplier).isEqualTo(1.0f); - request.listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_GAIN); + audioFocusManager.getFocusListener().onAudioFocusChange(AudioManager.AUDIOFOCUS_GAIN); assertThat(testPlayerControl.lastPlayerCommand).isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); } @@ -237,14 +266,13 @@ public class AudioFocusManagerTest { media, /* playWhenReady= */ true, Player.STATE_READY)) .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); - ShadowAudioManager.AudioFocusRequest request = - Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); - request.listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT); + audioFocusManager.getFocusListener().onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT); assertThat(testPlayerControl.lastVolumeMultiplier).isEqualTo(1.0f); assertThat(testPlayerControl.lastPlayerCommand).isEqualTo(PLAYER_COMMAND_WAIT_FOR_CALLBACK); } @Test + @Config(maxSdk = 25) public void onAudioFocusChange_withAudioFocusLost_sendsDoNotPlayAndAbandondsFocus() { // Ensure that AUDIOFOCUS_LOSS causes AudioFocusManager to pause playback and abandon audio // focus. @@ -271,6 +299,32 @@ public class AudioFocusManagerTest { } @Test + @Config(minSdk = 26) + public void onAudioFocusChange_withAudioFocusLost_sendsDoNotPlayAndAbandondsFocus_v26() { + // Ensure that AUDIOFOCUS_LOSS causes AudioFocusManager to pause playback and abandon audio + // focus. + AudioAttributes media = + new AudioAttributes.Builder() + .setUsage(C.USAGE_MEDIA) + .setContentType(C.CONTENT_TYPE_SPEECH) + .build(); + + Shadows.shadowOf(audioManager) + .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); + assertThat( + audioFocusManager.setAudioAttributes( + media, /* playWhenReady= */ true, Player.STATE_READY)) + .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); + assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusRequest()).isNull(); + + audioFocusManager.getFocusListener().onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS); + assertThat(testPlayerControl.lastPlayerCommand).isEqualTo(PLAYER_COMMAND_DO_NOT_PLAY); + assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusRequest()) + .isEqualTo(Shadows.shadowOf(audioManager).getLastAudioFocusRequest().audioFocusRequest); + } + + @Test + @Config(maxSdk = 25) public void handleStop_withAudioFocus_abandonsAudioFocus() { // Ensure that handleStop causes AudioFocusManager to abandon audio focus. AudioAttributes media = @@ -295,6 +349,32 @@ public class AudioFocusManagerTest { } @Test + @Config(minSdk = 26) + public void handleStop_withAudioFocus_abandonsAudioFocus_v26() { + // Ensure that handleStop causes AudioFocusManager to abandon audio focus. + AudioAttributes media = + new AudioAttributes.Builder() + .setUsage(C.USAGE_MEDIA) + .setContentType(C.CONTENT_TYPE_SPEECH) + .build(); + + Shadows.shadowOf(audioManager) + .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); + assertThat( + audioFocusManager.setAudioAttributes( + media, /* playWhenReady= */ true, Player.STATE_READY)) + .isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY); + assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusRequest()).isNull(); + + ShadowAudioManager.AudioFocusRequest request = + Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); + audioFocusManager.handleStop(); + assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusRequest()) + .isEqualTo(request.audioFocusRequest); + } + + @Test + @Config(maxSdk = 25) public void handleStop_withoutAudioFocus_stillAbandonsFocus() { // Ensure that handleStop causes AudioFocusManager to call through to abandon audio focus // even if focus wasn't requested. @@ -320,6 +400,7 @@ public class AudioFocusManagerTest { } @Test + @Config(maxSdk = 25) public void handleStop_withoutHandlingAudioFocus_isNoOp() { // Ensure that handleStop is a no-op if audio focus isn't handled. Shadows.shadowOf(audioManager) @@ -337,6 +418,31 @@ public class AudioFocusManagerTest { assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusListener()).isNull(); } + @Test + @Config(minSdk = 26) + public void handleStop_withoutHandlingAudioFocus_isNoOp_v26() { + // Ensure that handleStop is a no-op if audio focus isn't handled. + Shadows.shadowOf(audioManager) + .setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED); + assertThat( + audioFocusManager.setAudioAttributes( + /* audioAttributes= */ null, /* playWhenReady= */ false, Player.STATE_READY)) + .isEqualTo(PLAYER_COMMAND_DO_NOT_PLAY); + assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusRequest()).isNull(); + ShadowAudioManager.AudioFocusRequest request = + Shadows.shadowOf(audioManager).getLastAudioFocusRequest(); + assertThat(request).isNull(); + + audioFocusManager.handleStop(); + assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusRequest()).isNull(); + } + + private int getAudioFocusGainFromRequest(ShadowAudioManager.AudioFocusRequest audioFocusRequest) { + return Util.SDK_INT >= 26 + ? audioFocusRequest.audioFocusRequest.getFocusGain() + : audioFocusRequest.durationHint; + } + private static class TestPlayerControl implements AudioFocusManager.PlayerControl { private float lastVolumeMultiplier = 1.0f; private int lastPlayerCommand = NO_COMMAND_RECEIVED; diff --git a/library/core/src/test/resources/robolectric.properties b/library/core/src/test/resources/robolectric.properties deleted file mode 100644 index 2f3210368e..0000000000 --- a/library/core/src/test/resources/robolectric.properties +++ /dev/null @@ -1 +0,0 @@ -manifest=src/test/AndroidManifest.xml diff --git a/library/dash/build.gradle b/library/dash/build.gradle index 2c21c6f577..319ca7f6e8 100644 --- a/library/dash/build.gradle +++ b/library/dash/build.gradle @@ -35,6 +35,8 @@ android { // testCoverageEnabled = true // } } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/library/dash/src/test/resources/robolectric.properties b/library/dash/src/test/resources/robolectric.properties deleted file mode 100644 index 2f3210368e..0000000000 --- a/library/dash/src/test/resources/robolectric.properties +++ /dev/null @@ -1 +0,0 @@ -manifest=src/test/AndroidManifest.xml diff --git a/library/hls/build.gradle b/library/hls/build.gradle index 165750b3b6..35a63d1d40 100644 --- a/library/hls/build.gradle +++ b/library/hls/build.gradle @@ -35,6 +35,8 @@ android { // testCoverageEnabled = true // } } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/library/hls/src/test/resources/robolectric.properties b/library/hls/src/test/resources/robolectric.properties deleted file mode 100644 index 2f3210368e..0000000000 --- a/library/hls/src/test/resources/robolectric.properties +++ /dev/null @@ -1 +0,0 @@ -manifest=src/test/AndroidManifest.xml diff --git a/library/smoothstreaming/build.gradle b/library/smoothstreaming/build.gradle index 4957d97c41..ae47e7fe52 100644 --- a/library/smoothstreaming/build.gradle +++ b/library/smoothstreaming/build.gradle @@ -35,6 +35,8 @@ android { // testCoverageEnabled = true // } } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/library/smoothstreaming/src/test/resources/robolectric.properties b/library/smoothstreaming/src/test/resources/robolectric.properties deleted file mode 100644 index 2f3210368e..0000000000 --- a/library/smoothstreaming/src/test/resources/robolectric.properties +++ /dev/null @@ -1 +0,0 @@ -manifest=src/test/AndroidManifest.xml diff --git a/library/ui/build.gradle b/library/ui/build.gradle index 8418d306ae..69e18e1a7d 100644 --- a/library/ui/build.gradle +++ b/library/ui/build.gradle @@ -34,6 +34,8 @@ android { // testCoverageEnabled = true // } } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/library/ui/src/test/resources/robolectric.properties b/library/ui/src/test/resources/robolectric.properties deleted file mode 100644 index 2f3210368e..0000000000 --- a/library/ui/src/test/resources/robolectric.properties +++ /dev/null @@ -1 +0,0 @@ -manifest=src/test/AndroidManifest.xml diff --git a/playbacktests/build.gradle b/playbacktests/build.gradle index f892def24b..7670cbb21a 100644 --- a/playbacktests/build.gradle +++ b/playbacktests/build.gradle @@ -27,6 +27,8 @@ android { targetSdkVersion project.ext.targetSdkVersion testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/testutils/build.gradle b/testutils/build.gradle index 4b7d9d9e48..cdf765c5e7 100644 --- a/testutils/build.gradle +++ b/testutils/build.gradle @@ -33,6 +33,8 @@ android { // See: https://github.com/junit-team/junit4/pull/1187. disable 'InvalidPackage' } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/testutils/src/test/resources/robolectric.properties b/testutils/src/test/resources/robolectric.properties deleted file mode 100644 index 2f3210368e..0000000000 --- a/testutils/src/test/resources/robolectric.properties +++ /dev/null @@ -1 +0,0 @@ -manifest=src/test/AndroidManifest.xml diff --git a/testutils_robolectric/build.gradle b/testutils_robolectric/build.gradle index 35ccfeafc9..e6f20aa448 100644 --- a/testutils_robolectric/build.gradle +++ b/testutils_robolectric/build.gradle @@ -32,6 +32,8 @@ android { // which is not part of Android. disable 'InvalidPackage' } + + testOptions.unitTests.includeAndroidResources = true } dependencies { diff --git a/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/RobolectricUtil.java b/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/RobolectricUtil.java index 1e7f09bacf..1a9547d087 100644 --- a/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/RobolectricUtil.java +++ b/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/RobolectricUtil.java @@ -165,7 +165,7 @@ public final class RobolectricUtil { public boolean enqueueMessage(Message msg, long when) { Looper looper = ShadowLooper.getLooperForThread(looperThread); if (shadowOf(looper) instanceof CustomLooper - && shadowOf(looper) != ShadowLooper.getShadowMainLooper()) { + && shadowOf(looper) != shadowOf(Looper.getMainLooper())) { ((CustomLooper) shadowOf(looper)).addPendingMessage(msg, when); } else { super.enqueueMessage(msg, when); @@ -177,7 +177,7 @@ public final class RobolectricUtil { public void removeMessages(Handler handler, int what, Object object) { Looper looper = ShadowLooper.getLooperForThread(looperThread); if (shadowOf(looper) instanceof CustomLooper - && shadowOf(looper) != ShadowLooper.getShadowMainLooper()) { + && shadowOf(looper) != shadowOf(Looper.getMainLooper())) { ((CustomLooper) shadowOf(looper)).removeMessages(handler, what, object); } } @@ -186,7 +186,7 @@ public final class RobolectricUtil { public void removeCallbacksAndMessages(Handler handler, Object object) { Looper looper = ShadowLooper.getLooperForThread(looperThread); if (shadowOf(looper) instanceof CustomLooper - && shadowOf(looper) != ShadowLooper.getShadowMainLooper()) { + && shadowOf(looper) != shadowOf(Looper.getMainLooper())) { ((CustomLooper) shadowOf(looper)).removeMessages(handler, ANY_MESSAGE, object); } }