13961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu/* 23961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu * Copyright (C) 2017 The Android Open Source Project 33961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu * 43961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu * Licensed under the Apache License, Version 2.0 (the "License"); 53961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu * you may not use this file except in compliance with the License. 63961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu * You may obtain a copy of the License at 73961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu * 83961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu * http://www.apache.org/licenses/LICENSE-2.0 93961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu * 103961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu * Unless required by applicable law or agreed to in writing, software 113961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu * distributed under the License is distributed on an "AS IS" BASIS, 123961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu * See the License for the specific language governing permissions and 143961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu * limitations under the License. 153961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu */ 163961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu 173961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gupackage android.support.v17.leanback.media; 183961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu 193961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Guimport static org.junit.Assert.assertNull; 203961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Guimport static org.mockito.Mockito.atLeastOnce; 213961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Guimport static org.mockito.Mockito.never; 22f37579e64940bfdd642cc315f6347d60b5addd69Dake Guimport static org.mockito.Mockito.times; 233961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu 243961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Guimport android.content.Context; 253961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Guimport android.net.Uri; 26542fe4d971ef42aede22e2173cff8430804effceDake Guimport android.os.Build; 273961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Guimport android.os.SystemClock; 283961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Guimport android.support.test.InstrumentationRegistry; 293961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Guimport android.support.test.filters.MediumTest; 30542fe4d971ef42aede22e2173cff8430804effceDake Guimport android.support.test.filters.SdkSuppress; 313961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Guimport android.support.test.runner.AndroidJUnit4; 323961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Guimport android.support.v17.leanback.testutils.PollingCheck; 333961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu 343961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Guimport org.junit.Test; 353961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Guimport org.junit.runner.RunWith; 363961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Guimport org.mockito.Mockito; 373961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu 383961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu@RunWith(AndroidJUnit4.class) 393961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu@MediumTest 403961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gupublic class MediaPlayerGlueTest { 413961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu 42542fe4d971ef42aede22e2173cff8430804effceDake Gu /** 43542fe4d971ef42aede22e2173cff8430804effceDake Gu * Mockito spy not working on API 19 if class has package private method (b/35387610) 44542fe4d971ef42aede22e2173cff8430804effceDake Gu */ 45542fe4d971ef42aede22e2173cff8430804effceDake Gu @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP) 463961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu @Test 473961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu public void mediaPlayer() { 483961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu // create a MediaPlayerGlue with updatePeriod = 100ms 493961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); 503961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu final MediaPlayerGlue[] result = new MediaPlayerGlue[1]; 513961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { 523961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu @Override 533961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu public void run() { 543961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu result[0] = new MediaPlayerGlue(context); 553961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu } 563961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu }); 573961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu final MediaPlayerGlue glue = Mockito.spy(result[0]); 583961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu Mockito.when(glue.getUpdatePeriod()).thenReturn(100); 593961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu 603961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu final PlaybackGlueHostImpl host = new PlaybackGlueHostImpl(); 613961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu 623961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu glue.setHost(host); 633961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu glue.setMode(MediaPlayerGlue.REPEAT_ALL); 643961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu final boolean[] ready = new boolean[] {false}; 653961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu glue.setPlayerCallback(new PlaybackGlue.PlayerCallback() { 663961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu @Override 673961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu public void onReadyForPlayback() { 683961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu glue.play(); 693961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu ready[0] = true; 703961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu 713961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu } 723961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu }); 733961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { 743961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu @Override 753961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu public void run() { 763961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu glue.setMediaSource(Uri.parse( 773961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu "android.resource://android.support.v17.leanback.test/raw/track_01")); 783961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu } 793961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu }); 803961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu PollingCheck.waitFor(new PollingCheck.PollingCheckCondition() { 813961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu @Override 823961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu public boolean canProceed() { 833961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu return ready[0]; 843961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu } 853961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu }); 863961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu 873bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu // Test setProgressUpdatingEnabled(true) and setProgressUpdatingEnabled(false); 883961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { 893961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu @Override 903961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu public void run() { 913961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu glue.enableProgressUpdating(true); 923961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu } 933961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu }); 943961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu Mockito.reset(glue); 953961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu SystemClock.sleep(1000); 963961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu Mockito.verify(glue, atLeastOnce()).updateProgress(); 973961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu 983961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { 993961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu @Override 1003961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu public void run() { 1013961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu glue.enableProgressUpdating(false); 1023961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu } 1033961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu }); 1043961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu Mockito.reset(glue); 1053961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu SystemClock.sleep(1000); 1063961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu Mockito.verify(glue, never()).updateProgress(); 1073961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu 1083961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu // Test onStart()/onStop() will pause the updateProgress. 1093961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { 1103961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu @Override 1113961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu public void run() { 1123961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu host.notifyOnStart(); 1133961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu } 1143961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu }); 1153961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu Mockito.reset(glue); 1163961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu SystemClock.sleep(1000); 1173961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu Mockito.verify(glue, atLeastOnce()).updateProgress(); 1183961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu 1193961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { 1203961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu @Override 1213961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu public void run() { 1223961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu host.notifyOnStop(); 1233961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu } 1243961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu }); 1253961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu Mockito.reset(glue); 1263961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu SystemClock.sleep(1000); 1273961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu Mockito.verify(glue, never()).updateProgress(); 1283961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu 1293961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { 1303961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu @Override 1313961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu public void run() { 1323961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu host.notifyOnDestroy(); 1333961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu } 1343961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu }); 1353961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu assertNull(glue.getHost()); 136f37579e64940bfdd642cc315f6347d60b5addd69Dake Gu Mockito.verify(glue, times(1)).onDetachedFromHost(); 137f37579e64940bfdd642cc315f6347d60b5addd69Dake Gu Mockito.verify(glue, times(1)).release(); 1383961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu } 1393961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu 1403961cea270f51c29433a7eb21ec5f8c9ca7bd7d7Dake Gu} 141