1347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk/* 2347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk * Copyright (C) 2017 The Android Open Source Project 3347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk * 4347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk * Licensed under the Apache License, Version 2.0 (the "License"); 5347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk * you may not use this file except in compliance with the License. 6347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk * You may obtain a copy of the License at 7347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk * 8347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk * http://www.apache.org/licenses/LICENSE-2.0 9347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk * 10347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk * Unless required by applicable law or agreed to in writing, software 11347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk * distributed under the License is distributed on an "AS IS" BASIS, 12347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk * See the License for the specific language governing permissions and 14347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk * limitations under the License. 15347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk */ 166b4b646d9c0fa42973a429dbe78c8919a2772961Tomasz Wasilczykpackage android.hardware.radio.tests.functional; 17347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 1840ce30096cd2c5c242558d99fa43f956a7035394Tomasz Wasilczykimport android.Manifest; 19347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport android.content.Context; 20347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport android.content.pm.PackageManager; 218cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczykimport android.hardware.radio.ProgramSelector; 22347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport android.hardware.radio.RadioManager; 23347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport android.hardware.radio.RadioTuner; 24347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport android.support.test.InstrumentationRegistry; 25347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport android.support.test.runner.AndroidJUnit4; 266390f888de30b7560b2838629011ceb76ff574a1smaraaospimport android.test.suitebuilder.annotation.MediumTest; 27d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczykimport android.util.Log; 28347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 298b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczykimport java.lang.reflect.Constructor; 30347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport java.util.ArrayList; 310f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczykimport java.util.HashMap; 32347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport java.util.List; 330f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczykimport java.util.Map; 34347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 35347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport org.junit.After; 36347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport org.junit.Before; 37347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport org.junit.Test; 38347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport org.junit.runner.RunWith; 3937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczykimport org.mockito.ArgumentCaptor; 402134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczykimport org.mockito.Mock; 418b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczykimport org.mockito.Mockito; 422134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczykimport org.mockito.MockitoAnnotations; 43347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 44347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport static org.junit.Assert.*; 45347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport static org.junit.Assume.*; 462134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczykimport static org.mockito.Matchers.any; 472134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczykimport static org.mockito.Matchers.anyInt; 4837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczykimport static org.mockito.Mockito.after; 4924250ef9481da08f26cdeb2ef7075783662f05eeTomasz Wasilczykimport static org.mockito.Mockito.atLeast; 5037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczykimport static org.mockito.Mockito.atMost; 512134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczykimport static org.mockito.Mockito.never; 528b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczykimport static org.mockito.Mockito.timeout; 532134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczykimport static org.mockito.Mockito.times; 542134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczykimport static org.mockito.Mockito.verify; 552383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczykimport static org.mockito.Mockito.verifyNoMoreInteractions; 56d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczykimport static org.testng.Assert.assertThrows; 57347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 58347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk/** 59347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk * A test for broadcast radio API. 60347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk */ 61347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk@RunWith(AndroidJUnit4.class) 626390f888de30b7560b2838629011ceb76ff574a1smaraaosp@MediumTest 636b4b646d9c0fa42973a429dbe78c8919a2772961Tomasz Wasilczykpublic class RadioTunerTest { 646b4b646d9c0fa42973a429dbe78c8919a2772961Tomasz Wasilczyk private static final String TAG = "BroadcastRadioTests.RadioTuner"; 65347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 66347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public final Context mContext = InstrumentationRegistry.getContext(); 67347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 6837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk private final int kConfigCallbackTimeoutMs = 10000; 6937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk private final int kCancelTimeoutMs = 1000; 7037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk private final int kTuneCallbackTimeoutMs = 30000; 718cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk private final int kFullScanTimeoutMs = 60000; 728b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk 73347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk private RadioManager mRadioManager; 74347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk private RadioTuner mRadioTuner; 75d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk private RadioManager.ModuleProperties mModule; 76347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk private final List<RadioManager.ModuleProperties> mModules = new ArrayList<>(); 772134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk @Mock private RadioTuner.Callback mCallback; 782134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk 792134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk RadioManager.AmBandDescriptor mAmBandDescriptor; 802134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk RadioManager.FmBandDescriptor mFmBandDescriptor; 81347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 828b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk RadioManager.BandConfig mAmBandConfig; 838b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk RadioManager.BandConfig mFmBandConfig; 848b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk 85347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Before 86347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public void setup() { 872134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk MockitoAnnotations.initMocks(this); 882134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk 89347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk // check if radio is supported and skip the test if it's not 90347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk PackageManager packageManager = mContext.getPackageManager(); 9105392d6360b89538aa8fcbb1afd50775adfadcf4Tomasz Wasilczyk boolean isRadioSupported = packageManager.hasSystemFeature( 9205392d6360b89538aa8fcbb1afd50775adfadcf4Tomasz Wasilczyk PackageManager.FEATURE_BROADCAST_RADIO); 93347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk assumeTrue(isRadioSupported); 94347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 9540ce30096cd2c5c242558d99fa43f956a7035394Tomasz Wasilczyk // Check radio access permission 96df77643cd8024b381c7df2f509175c7be719fae9Tomasz Wasilczyk int res = mContext.checkCallingOrSelfPermission(Manifest.permission.ACCESS_BROADCAST_RADIO); 97df77643cd8024b381c7df2f509175c7be719fae9Tomasz Wasilczyk assertEquals("ACCESS_BROADCAST_RADIO permission not granted", 9840ce30096cd2c5c242558d99fa43f956a7035394Tomasz Wasilczyk PackageManager.PERMISSION_GRANTED, res); 9940ce30096cd2c5c242558d99fa43f956a7035394Tomasz Wasilczyk 100347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk mRadioManager = (RadioManager)mContext.getSystemService(Context.RADIO_SERVICE); 101347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk assertNotNull(mRadioManager); 102347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 103347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk int status = mRadioManager.listModules(mModules); 104347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk assertEquals(RadioManager.STATUS_OK, status); 105347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk assertFalse(mModules.isEmpty()); 106347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 107347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 108347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @After 109347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public void tearDown() { 110347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk mRadioManager = null; 111347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk mModules.clear(); 112347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk if (mRadioTuner != null) { 113347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk mRadioTuner.close(); 114347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk mRadioTuner = null; 115347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 11624250ef9481da08f26cdeb2ef7075783662f05eeTomasz Wasilczyk resetCallback(); 117347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 118347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 1192134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk private void openTuner() { 1209fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk openTuner(true); 1219fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk } 1229fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk 1232383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk private void resetCallback() { 12424250ef9481da08f26cdeb2ef7075783662f05eeTomasz Wasilczyk verify(mCallback, atLeast(0)).onMetadataChanged(any()); 1253b4465e65688f899f2eecf5701cda044a3104523Tomasz Wasilczyk verify(mCallback, atLeast(0)).onProgramInfoChanged(any()); 126050ec61a48e41af35b2f9f1187bf00adbe893851Tomasz Wasilczyk verify(mCallback, atLeast(0)).onProgramListChanged(); 1272383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk verifyNoMoreInteractions(mCallback); 1282383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk Mockito.reset(mCallback); 1292383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk } 1302383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk 1319fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk private void openTuner(boolean withAudio) { 132347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk assertNull(mRadioTuner); 133347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 134347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk // find FM band and build its config 135d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk mModule = mModules.get(0); 136a6f1523532c08387e4ecd0282460321b50aecf0eTomasz Wasilczyk 137d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk for (RadioManager.BandDescriptor band : mModule.getBands()) { 138a6f1523532c08387e4ecd0282460321b50aecf0eTomasz Wasilczyk Log.d(TAG, "Band: " + band); 13933d00704d6c04327350c42d87aa74da5ccfaf865Tomasz Wasilczyk int bandType = band.getType(); 14033d00704d6c04327350c42d87aa74da5ccfaf865Tomasz Wasilczyk if (bandType == RadioManager.BAND_AM || bandType == RadioManager.BAND_AM_HD) { 1412134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk mAmBandDescriptor = (RadioManager.AmBandDescriptor)band; 1422134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk } 14333d00704d6c04327350c42d87aa74da5ccfaf865Tomasz Wasilczyk if (bandType == RadioManager.BAND_FM || bandType == RadioManager.BAND_FM_HD) { 1442134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk mFmBandDescriptor = (RadioManager.FmBandDescriptor)band; 145347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 146347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 1472134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk assertNotNull(mAmBandDescriptor); 1482134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk assertNotNull(mFmBandDescriptor); 1498b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk mAmBandConfig = new RadioManager.AmBandConfig.Builder(mAmBandDescriptor).build(); 1508b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk mFmBandConfig = new RadioManager.FmBandConfig.Builder(mFmBandDescriptor).build(); 151347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 152d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk mRadioTuner = mRadioManager.openTuner(mModule.getId(), 1539fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk mFmBandConfig, withAudio, mCallback, null); 154ca98cde254fef6c31634d8a3069a0d7b76ecf908Tomasz Wasilczyk if (!withAudio) { 155ca98cde254fef6c31634d8a3069a0d7b76ecf908Tomasz Wasilczyk // non-audio sessions might not be supported - if so, then skip the test 156ca98cde254fef6c31634d8a3069a0d7b76ecf908Tomasz Wasilczyk assumeNotNull(mRadioTuner); 157ca98cde254fef6c31634d8a3069a0d7b76ecf908Tomasz Wasilczyk } 158347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk assertNotNull(mRadioTuner); 15937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any()); 1602383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk resetCallback(); 161347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 1628cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk boolean isAntennaConnected = mRadioTuner.isAntennaConnected(); 1638cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk assertTrue(isAntennaConnected); 16437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } 16537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk 166347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Test 167347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public void testOpenTuner() { 1682134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk openTuner(); 169347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 170d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk 171d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk @Test 1728b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk public void testReopenTuner() throws Throwable { 1732134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk openTuner(); 174d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk mRadioTuner.close(); 175d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk mRadioTuner = null; 1768b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk Thread.sleep(100); // TODO(b/36122635): force reopen 1772134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk openTuner(); 1782134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk } 1792134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk 1802134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk @Test 181f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk public void testDoubleClose() { 182f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk openTuner(); 183f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk mRadioTuner.close(); 184f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk mRadioTuner.close(); 185f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk } 186f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk 187f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk @Test 188f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk public void testUseAfterClose() { 189f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk openTuner(); 190f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk mRadioTuner.close(); 191f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk int ret = mRadioTuner.cancel(); 192f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk assertEquals(RadioManager.STATUS_INVALID_OPERATION, ret); 193f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk } 194f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk 195f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk @Test 1962134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk public void testSetAndGetConfiguration() { 1972134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk openTuner(); 1982134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk 1998b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk // set 2008b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk int ret = mRadioTuner.setConfiguration(mAmBandConfig); 2018b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk assertEquals(RadioManager.STATUS_OK, ret); 20237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any()); 2038b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk 2048b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk // get 2058b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk RadioManager.BandConfig[] config = new RadioManager.BandConfig[1]; 2068b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk ret = mRadioTuner.getConfiguration(config); 2078b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk assertEquals(RadioManager.STATUS_OK, ret); 2082134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk 2098b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk assertEquals(mAmBandConfig, config[0]); 2108b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk } 2112134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk 2128b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk @Test 2138b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk public void testSetBadConfiguration() throws Throwable { 2148b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk openTuner(); 2158b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk 2168b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk // set null config 217ca98cde254fef6c31634d8a3069a0d7b76ecf908Tomasz Wasilczyk int ret = mRadioTuner.setConfiguration(null); 2188b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk assertEquals(RadioManager.STATUS_BAD_VALUE, ret); 2198b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk verify(mCallback, never()).onConfigurationChanged(any()); 2208b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk 2218b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk // setting good config should recover 2228b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk ret = mRadioTuner.setConfiguration(mAmBandConfig); 2238b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk assertEquals(RadioManager.STATUS_OK, ret); 22437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any()); 225d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk } 2269fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk 2279fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk @Test 2289fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk public void testMute() { 2299fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk openTuner(); 2309fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk 2319fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk boolean isMuted = mRadioTuner.getMute(); 2329fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk assertFalse(isMuted); 2339fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk 2349fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk int ret = mRadioTuner.setMute(true); 2359fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk assertEquals(RadioManager.STATUS_OK, ret); 2369fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk isMuted = mRadioTuner.getMute(); 2379fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk assertTrue(isMuted); 2389fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk 2399fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk ret = mRadioTuner.setMute(false); 2409fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk assertEquals(RadioManager.STATUS_OK, ret); 2419fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk isMuted = mRadioTuner.getMute(); 2429fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk assertFalse(isMuted); 2439fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk } 2449fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk 2459fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk @Test 2469fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk public void testMuteNoAudio() { 2479fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk openTuner(false); 2489fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk 2499fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk int ret = mRadioTuner.setMute(false); 2509fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk assertEquals(RadioManager.STATUS_ERROR, ret); 2519fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk 2529fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk boolean isMuted = mRadioTuner.getMute(); 2539fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk assertTrue(isMuted); 2549fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk } 2552383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk 2562383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk @Test 2572383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk public void testStep() { 2582383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk openTuner(); 2592383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk 2602383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk int ret = mRadioTuner.step(RadioTuner.DIRECTION_DOWN, true); 2612383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk assertEquals(RadioManager.STATUS_OK, ret); 26237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any()); 2632383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk 2642383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk resetCallback(); 2652383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk 2662383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk ret = mRadioTuner.step(RadioTuner.DIRECTION_UP, false); 2672383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk assertEquals(RadioManager.STATUS_OK, ret); 26837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any()); 26937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } 27037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk 27137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk @Test 272fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk public void testStepLoop() { 273fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk openTuner(); 274fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk 275fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk for (int i = 0; i < 10; i++) { 276fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk Log.d(TAG, "step loop iteration " + (i + 1)); 277fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk 278fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk int ret = mRadioTuner.step(RadioTuner.DIRECTION_DOWN, true); 279fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk assertEquals(RadioManager.STATUS_OK, ret); 280fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any()); 281fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk 282fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk resetCallback(); 283fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk } 284fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk } 285fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk 286fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk @Test 28737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk public void testTuneAndGetPI() { 28837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk openTuner(); 28937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk 29037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk int channel = mFmBandConfig.getLowerLimit() + mFmBandConfig.getSpacing(); 29137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk 29237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk // test tune 29337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk int ret = mRadioTuner.tune(channel, 0); 29437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk assertEquals(RadioManager.STATUS_OK, ret); 29537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk ArgumentCaptor<RadioManager.ProgramInfo> infoc = 29637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk ArgumentCaptor.forClass(RadioManager.ProgramInfo.class); 29737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk verify(mCallback, timeout(kTuneCallbackTimeoutMs)) 29837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk .onProgramInfoChanged(infoc.capture()); 29937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk assertEquals(channel, infoc.getValue().getChannel()); 30037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk 30137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk // test getProgramInformation 30237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk RadioManager.ProgramInfo[] info = new RadioManager.ProgramInfo[1]; 30337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk ret = mRadioTuner.getProgramInformation(info); 30437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk assertEquals(RadioManager.STATUS_OK, ret); 30537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk assertNotNull(info[0]); 30637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk assertEquals(channel, info[0].getChannel()); 3070f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk Log.d(TAG, "PI: " + info[0].toString()); 30837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } 30937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk 31037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk @Test 31137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk public void testDummyCancel() { 31237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk openTuner(); 31337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk 31437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk int ret = mRadioTuner.cancel(); 31537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk assertEquals(RadioManager.STATUS_OK, ret); 31637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } 31737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk 31837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk @Test 31937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk public void testLateCancel() { 32037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk openTuner(); 32137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk 32237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk int ret = mRadioTuner.step(RadioTuner.DIRECTION_DOWN, false); 32337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk assertEquals(RadioManager.STATUS_OK, ret); 32437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any()); 32537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk 32637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk int cancelRet = mRadioTuner.cancel(); 32737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk assertEquals(RadioManager.STATUS_OK, cancelRet); 32837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } 32937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk 33037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk @Test 33137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk public void testScanAndCancel() { 33237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk openTuner(); 33337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk 33437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk /* There is a possible race condition between scan and cancel commands - the scan may finish 33537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk * before cancel command is issued. Thus we accept both outcomes in this test. 33637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk */ 33737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk int scanRet = mRadioTuner.scan(RadioTuner.DIRECTION_DOWN, true); 33837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk int cancelRet = mRadioTuner.cancel(); 33937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk 34037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk assertEquals(RadioManager.STATUS_OK, scanRet); 34137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk assertEquals(RadioManager.STATUS_OK, cancelRet); 34237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk 34337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk verify(mCallback, after(kCancelTimeoutMs).atMost(1)).onError(RadioTuner.ERROR_CANCELLED); 34437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk verify(mCallback, atMost(1)).onProgramInfoChanged(any()); 3452383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk } 346d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk 347d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk @Test 348d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk public void testStartBackgroundScan() { 349d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk openTuner(); 350d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk 351d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk boolean ret = mRadioTuner.startBackgroundScan(); 352d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk boolean isSupported = mModule.isBackgroundScanningSupported(); 353d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk assertEquals(isSupported, ret); 354d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } 355d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk 356d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk @Test 357d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk public void testGetProgramList() { 358d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk openTuner(); 359d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk 360d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk try { 3610f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk Map<String, String> filter = new HashMap<>(); 3620f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk filter.put("com.google.dummy", "dummy"); 3630f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk List<RadioManager.ProgramInfo> list = mRadioTuner.getProgramList(filter); 364d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk assertNotNull(list); 365d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } catch (IllegalStateException e) { 366d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk // the list may or may not be ready at this point 367d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk Log.i(TAG, "Background list is not ready"); 368d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } 369d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } 370d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk 371d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk @Test 3728cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk public void testTuneFromProgramList() { 3738cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk openTuner(); 3748cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk 3758cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk List<RadioManager.ProgramInfo> list; 3768cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk 3778cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk try { 3788cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk list = mRadioTuner.getProgramList(null); 3798cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk assertNotNull(list); 3808cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk } catch (IllegalStateException e) { 3818cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk Log.i(TAG, "Background list is not ready, trying to fix it"); 3828cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk 3838cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk boolean success = mRadioTuner.startBackgroundScan(); 3848cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk assertTrue(success); 3858cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk verify(mCallback, timeout(kFullScanTimeoutMs)).onBackgroundScanComplete(); 3868cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk 3878cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk list = mRadioTuner.getProgramList(null); 3888cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk assertNotNull(list); 3898cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk } 3908cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk 3918cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk if (list.isEmpty()) { 3928cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk Log.i(TAG, "Program list is empty, can't test tune"); 3938cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk return; 3948cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk } 3958cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk 3968cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk ProgramSelector sel = list.get(0).getSelector(); 3978cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk mRadioTuner.tune(sel); 3988cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk ArgumentCaptor<RadioManager.ProgramInfo> infoc = 3998cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk ArgumentCaptor.forClass(RadioManager.ProgramInfo.class); 4008cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(infoc.capture()); 4018cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk assertEquals(sel, infoc.getValue().getSelector()); 4028cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk } 4038cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk 4048cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk @Test 405d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk public void testForcedAnalog() { 406d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk openTuner(); 407d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk 408d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk boolean isSupported = true; 409d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk boolean isForced; 410d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk try { 411d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk isForced = mRadioTuner.isAnalogForced(); 412d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk assertFalse(isForced); 413d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } catch (IllegalStateException ex) { 414d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk Log.i(TAG, "Forced analog switch is not supported by this tuner"); 415d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk isSupported = false; 416d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } 417d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk 418d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk if (isSupported) { 419d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk mRadioTuner.setAnalogForced(true); 420d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk isForced = mRadioTuner.isAnalogForced(); 421d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk assertTrue(isForced); 422d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk 423d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk mRadioTuner.setAnalogForced(false); 424d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk isForced = mRadioTuner.isAnalogForced(); 425d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk assertFalse(isForced); 426d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } else { 427d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk assertThrows(IllegalStateException.class, () -> mRadioTuner.setAnalogForced(true)); 428d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } 429d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } 430347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk} 431