RadioTunerTest.java revision 6b4b646d9c0fa42973a429dbe78c8919a2772961
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;
31347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport java.util.List;
32347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
33347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport org.junit.After;
34347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport org.junit.Before;
35347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport org.junit.Test;
36347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport org.junit.runner.RunWith;
3737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczykimport org.mockito.ArgumentCaptor;
382134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczykimport org.mockito.Mock;
398b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczykimport org.mockito.Mockito;
402134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczykimport org.mockito.MockitoAnnotations;
41347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
42347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport static org.junit.Assert.*;
43347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport static org.junit.Assume.*;
442134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczykimport static org.mockito.Matchers.any;
452134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczykimport static org.mockito.Matchers.anyInt;
4637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczykimport static org.mockito.Mockito.after;
4724250ef9481da08f26cdeb2ef7075783662f05eeTomasz Wasilczykimport static org.mockito.Mockito.atLeast;
4837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczykimport static org.mockito.Mockito.atMost;
492134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczykimport static org.mockito.Mockito.never;
508b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczykimport static org.mockito.Mockito.timeout;
512134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczykimport static org.mockito.Mockito.times;
522134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczykimport static org.mockito.Mockito.verify;
532383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczykimport static org.mockito.Mockito.verifyNoMoreInteractions;
54d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczykimport static org.testng.Assert.assertThrows;
55347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
56347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk/**
57347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk * A test for broadcast radio API.
58347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk */
59347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk@RunWith(AndroidJUnit4.class)
606390f888de30b7560b2838629011ceb76ff574a1smaraaosp@MediumTest
616b4b646d9c0fa42973a429dbe78c8919a2772961Tomasz Wasilczykpublic class RadioTunerTest {
626b4b646d9c0fa42973a429dbe78c8919a2772961Tomasz Wasilczyk    private static final String TAG = "BroadcastRadioTests.RadioTuner";
63347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
64347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public final Context mContext = InstrumentationRegistry.getContext();
65347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
6637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    private final int kConfigCallbackTimeoutMs = 10000;
6737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    private final int kCancelTimeoutMs = 1000;
6837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    private final int kTuneCallbackTimeoutMs = 30000;
698cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk    private final int kFullScanTimeoutMs = 60000;
708b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk
71347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    private RadioManager mRadioManager;
72347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    private RadioTuner mRadioTuner;
73d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    private RadioManager.ModuleProperties mModule;
74347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    private final List<RadioManager.ModuleProperties> mModules = new ArrayList<>();
752134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk    @Mock private RadioTuner.Callback mCallback;
762134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk
772134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk    RadioManager.AmBandDescriptor mAmBandDescriptor;
782134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk    RadioManager.FmBandDescriptor mFmBandDescriptor;
79347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
808b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk    RadioManager.BandConfig mAmBandConfig;
818b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk    RadioManager.BandConfig mFmBandConfig;
828b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk
83347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Before
84347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public void setup() {
852134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        MockitoAnnotations.initMocks(this);
862134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk
87347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        // check if radio is supported and skip the test if it's not
88347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        PackageManager packageManager = mContext.getPackageManager();
8905392d6360b89538aa8fcbb1afd50775adfadcf4Tomasz Wasilczyk        boolean isRadioSupported = packageManager.hasSystemFeature(
9005392d6360b89538aa8fcbb1afd50775adfadcf4Tomasz Wasilczyk                PackageManager.FEATURE_BROADCAST_RADIO);
91347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        assumeTrue(isRadioSupported);
92347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
9340ce30096cd2c5c242558d99fa43f956a7035394Tomasz Wasilczyk        // Check radio access permission
9440ce30096cd2c5c242558d99fa43f956a7035394Tomasz Wasilczyk        int res = mContext.checkCallingOrSelfPermission(Manifest.permission.ACCESS_FM_RADIO);
9540ce30096cd2c5c242558d99fa43f956a7035394Tomasz Wasilczyk        assertEquals("ACCESS_FM_RADIO permission not granted",
9640ce30096cd2c5c242558d99fa43f956a7035394Tomasz Wasilczyk                PackageManager.PERMISSION_GRANTED, res);
9740ce30096cd2c5c242558d99fa43f956a7035394Tomasz Wasilczyk
98347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        mRadioManager = (RadioManager)mContext.getSystemService(Context.RADIO_SERVICE);
99347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        assertNotNull(mRadioManager);
100347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
101347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        int status = mRadioManager.listModules(mModules);
102347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, status);
103347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        assertFalse(mModules.isEmpty());
104347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
105347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
106347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @After
107347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public void tearDown() {
108347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        mRadioManager = null;
109347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        mModules.clear();
110347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        if (mRadioTuner != null) {
111347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk            mRadioTuner.close();
112347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk            mRadioTuner = null;
113347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        }
11424250ef9481da08f26cdeb2ef7075783662f05eeTomasz Wasilczyk        resetCallback();
115347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
116347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
1172134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk    private void openTuner() {
1189fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        openTuner(true);
1199fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    }
1209fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
1212383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk    private void resetCallback() {
12224250ef9481da08f26cdeb2ef7075783662f05eeTomasz Wasilczyk        verify(mCallback, atLeast(0)).onMetadataChanged(any());
1232383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        verifyNoMoreInteractions(mCallback);
1242383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        Mockito.reset(mCallback);
1252383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk    }
1262383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk
1279fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    private void openTuner(boolean withAudio) {
128347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        assertNull(mRadioTuner);
129347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
130347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        // find FM band and build its config
131d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        mModule = mModules.get(0);
132d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        for (RadioManager.BandDescriptor band : mModule.getBands()) {
13333d00704d6c04327350c42d87aa74da5ccfaf865Tomasz Wasilczyk            int bandType = band.getType();
13433d00704d6c04327350c42d87aa74da5ccfaf865Tomasz Wasilczyk            if (bandType == RadioManager.BAND_AM || bandType == RadioManager.BAND_AM_HD) {
1352134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk                mAmBandDescriptor = (RadioManager.AmBandDescriptor)band;
1362134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk            }
13733d00704d6c04327350c42d87aa74da5ccfaf865Tomasz Wasilczyk            if (bandType == RadioManager.BAND_FM || bandType == RadioManager.BAND_FM_HD) {
1382134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk                mFmBandDescriptor = (RadioManager.FmBandDescriptor)band;
139347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk            }
140347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        }
1412134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        assertNotNull(mAmBandDescriptor);
1422134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        assertNotNull(mFmBandDescriptor);
1438b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        mAmBandConfig = new RadioManager.AmBandConfig.Builder(mAmBandDescriptor).build();
1448b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        mFmBandConfig = new RadioManager.FmBandConfig.Builder(mFmBandDescriptor).build();
145347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
146d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        mRadioTuner = mRadioManager.openTuner(mModule.getId(),
1479fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk                mFmBandConfig, withAudio, mCallback, null);
148347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        assertNotNull(mRadioTuner);
14937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any());
1502383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        resetCallback();
151347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
1528cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        boolean isAntennaConnected = mRadioTuner.isAntennaConnected();
1538cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        assertTrue(isAntennaConnected);
15437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    }
15537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
156347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Test
157347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public void testOpenTuner() {
1582134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        openTuner();
159347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
160d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk
161d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk    @Test
1628b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk    public void testReopenTuner() throws Throwable {
1632134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        openTuner();
164d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk        mRadioTuner.close();
165d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk        mRadioTuner = null;
1668b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        Thread.sleep(100);  // TODO(b/36122635): force reopen
1672134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        openTuner();
1682134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk    }
1692134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk
1702134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk    @Test
171f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    public void testDoubleClose() {
172f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        openTuner();
173f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        mRadioTuner.close();
174f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        mRadioTuner.close();
175f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    }
176f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk
177f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    @Test
178f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    public void testUseAfterClose() {
179f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        openTuner();
180f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        mRadioTuner.close();
181f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        int ret = mRadioTuner.cancel();
182f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_INVALID_OPERATION, ret);
183f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    }
184f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk
185f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    @Test
1862134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk    public void testSetAndGetConfiguration() {
1872134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        openTuner();
1882134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk
1898b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        // set
1908b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        int ret = mRadioTuner.setConfiguration(mAmBandConfig);
1918b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
19237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any());
1938b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk
1948b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        // get
1958b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        RadioManager.BandConfig[] config = new RadioManager.BandConfig[1];
1968b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        ret = mRadioTuner.getConfiguration(config);
1978b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
1982134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk
1998b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(mAmBandConfig, config[0]);
2008b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk    }
2012134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk
2028b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk    @Test
2038b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk    public void testSetBadConfiguration() throws Throwable {
2048b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        openTuner();
2058b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk
2068b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        // set bad config
2078b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        Constructor<RadioManager.AmBandConfig> configConstr =
2088b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk                RadioManager.AmBandConfig.class.getDeclaredConstructor(
2098b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk                        int.class, int.class, int.class, int.class, int.class, boolean.class);
2108b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        configConstr.setAccessible(true);
2118b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        RadioManager.AmBandConfig badConfig = configConstr.newInstance(
2128b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk                0 /*region*/, RadioManager.BAND_AM /*type*/,
2138b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk                10000 /*lowerLimit*/, 1 /*upperLimit*/, 100 /*spacing*/, false /*stereo*/);
2148b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        int ret = mRadioTuner.setConfiguration(badConfig);
2158b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_BAD_VALUE, ret);
2168b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        verify(mCallback, never()).onConfigurationChanged(any());
2178b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk
2188b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        // set null config
2198b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        ret = mRadioTuner.setConfiguration(null);
2208b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_BAD_VALUE, ret);
2218b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        verify(mCallback, never()).onConfigurationChanged(any());
2228b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk
2238b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        // setting good config should recover
2248b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        ret = mRadioTuner.setConfiguration(mAmBandConfig);
2258b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
22637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any());
227d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk    }
2289fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2299fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    @Test
2309fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    public void testMute() {
2319fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        openTuner();
2329fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2339fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        boolean isMuted = mRadioTuner.getMute();
2349fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertFalse(isMuted);
2359fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2369fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        int ret = mRadioTuner.setMute(true);
2379fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
2389fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        isMuted = mRadioTuner.getMute();
2399fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertTrue(isMuted);
2409fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2419fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        ret = mRadioTuner.setMute(false);
2429fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
2439fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        isMuted = mRadioTuner.getMute();
2449fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertFalse(isMuted);
2459fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    }
2469fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2479fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    @Test
2489fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    public void testMuteNoAudio() {
2499fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        openTuner(false);
2509fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2519fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        int ret = mRadioTuner.setMute(false);
2529fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertEquals(RadioManager.STATUS_ERROR, ret);
2539fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2549fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        boolean isMuted = mRadioTuner.getMute();
2559fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertTrue(isMuted);
2569fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    }
2572383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk
2582383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk    @Test
2592383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk    public void testStep() {
2602383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        openTuner();
2612383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk
2622383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        int ret = mRadioTuner.step(RadioTuner.DIRECTION_DOWN, true);
2632383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
26437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
2652383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk
2662383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        resetCallback();
2672383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk
2682383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        ret = mRadioTuner.step(RadioTuner.DIRECTION_UP, false);
2692383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
27037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
27137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    }
27237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
27337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    @Test
27437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    public void testTuneAndGetPI() {
27537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        openTuner();
27637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
27737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int channel = mFmBandConfig.getLowerLimit() + mFmBandConfig.getSpacing();
27837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
27937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        // test tune
28037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int ret = mRadioTuner.tune(channel, 0);
28137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
28237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        ArgumentCaptor<RadioManager.ProgramInfo> infoc =
28337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk                ArgumentCaptor.forClass(RadioManager.ProgramInfo.class);
28437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kTuneCallbackTimeoutMs))
28537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk                .onProgramInfoChanged(infoc.capture());
28637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(channel, infoc.getValue().getChannel());
28737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
28837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        // test getProgramInformation
28937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        RadioManager.ProgramInfo[] info = new RadioManager.ProgramInfo[1];
29037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        ret = mRadioTuner.getProgramInformation(info);
29137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
29237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertNotNull(info[0]);
29337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(channel, info[0].getChannel());
29437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    }
29537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
29637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    @Test
29737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    public void testDummyCancel() {
29837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        openTuner();
29937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
30037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int ret = mRadioTuner.cancel();
30137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
30237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    }
30337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
30437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    @Test
30537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    public void testLateCancel() {
30637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        openTuner();
30737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
30837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int ret = mRadioTuner.step(RadioTuner.DIRECTION_DOWN, false);
30937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
31037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
31137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
31237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int cancelRet = mRadioTuner.cancel();
31337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, cancelRet);
31437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    }
31537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
31637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    @Test
31737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    public void testScanAndCancel() {
31837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        openTuner();
31937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
32037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        /* There is a possible race condition between scan and cancel commands - the scan may finish
32137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk         * before cancel command is issued. Thus we accept both outcomes in this test.
32237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk         */
32337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int scanRet = mRadioTuner.scan(RadioTuner.DIRECTION_DOWN, true);
32437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int cancelRet = mRadioTuner.cancel();
32537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
32637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, scanRet);
32737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, cancelRet);
32837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
32937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, after(kCancelTimeoutMs).atMost(1)).onError(RadioTuner.ERROR_CANCELLED);
33037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, atMost(1)).onProgramInfoChanged(any());
3312383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk    }
332d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
333d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    @Test
334d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    public void testStartBackgroundScan() {
335d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        openTuner();
336d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
337d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        boolean ret = mRadioTuner.startBackgroundScan();
338d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        boolean isSupported = mModule.isBackgroundScanningSupported();
339d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        assertEquals(isSupported, ret);
340d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    }
341d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
342d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    @Test
343d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    public void testGetProgramList() {
344d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        openTuner();
345d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
346d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        try {
347d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            List<RadioManager.ProgramInfo> list = mRadioTuner.getProgramList(null);
348d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            assertNotNull(list);
349d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        } catch (IllegalStateException e) {
350d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            // the list may or may not be ready at this point
351d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            Log.i(TAG, "Background list is not ready");
352d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        }
353d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    }
354d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
355d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    @Test
3568cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk    public void testTuneFromProgramList() {
3578cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        openTuner();
3588cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3598cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        List<RadioManager.ProgramInfo> list;
3608cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3618cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        try {
3628cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            list = mRadioTuner.getProgramList(null);
3638cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            assertNotNull(list);
3648cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        } catch (IllegalStateException e) {
3658cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            Log.i(TAG, "Background list is not ready, trying to fix it");
3668cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3678cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            boolean success = mRadioTuner.startBackgroundScan();
3688cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            assertTrue(success);
3698cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            verify(mCallback, timeout(kFullScanTimeoutMs)).onBackgroundScanComplete();
3708cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3718cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            list = mRadioTuner.getProgramList(null);
3728cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            assertNotNull(list);
3738cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        }
3748cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3758cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        if (list.isEmpty()) {
3768cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            Log.i(TAG, "Program list is empty, can't test tune");
3778cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            return;
3788cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        }
3798cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3808cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        ProgramSelector sel = list.get(0).getSelector();
3818cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        mRadioTuner.tune(sel);
3828cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        ArgumentCaptor<RadioManager.ProgramInfo> infoc =
3838cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk                ArgumentCaptor.forClass(RadioManager.ProgramInfo.class);
3848cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(infoc.capture());
3858cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        assertEquals(sel, infoc.getValue().getSelector());
3868cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk    }
3878cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3888cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk    @Test
389d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    public void testForcedAnalog() {
390d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        openTuner();
391d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
392d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        boolean isSupported = true;
393d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        boolean isForced;
394d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        try {
395d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            isForced = mRadioTuner.isAnalogForced();
396d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            assertFalse(isForced);
397d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        } catch (IllegalStateException ex) {
398d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            Log.i(TAG, "Forced analog switch is not supported by this tuner");
399d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            isSupported = false;
400d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        }
401d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
402d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        if (isSupported) {
403d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            mRadioTuner.setAnalogForced(true);
404d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            isForced = mRadioTuner.isAnalogForced();
405d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            assertTrue(isForced);
406d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
407d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            mRadioTuner.setAnalogForced(false);
408d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            isForced = mRadioTuner.isAnalogForced();
409d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            assertFalse(isForced);
410d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        } else {
411d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            assertThrows(IllegalStateException.class, () -> mRadioTuner.setAnalogForced(true));
412d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        }
413d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    }
414347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk}
415