RadioTunerTest.java revision 0f1776d08b43f5f71a9f89b6a4f1838df4d3d744
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());
1252383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        verifyNoMoreInteractions(mCallback);
1262383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        Mockito.reset(mCallback);
1272383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk    }
1282383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk
1299fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    private void openTuner(boolean withAudio) {
130347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        assertNull(mRadioTuner);
131347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
132347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        // find FM band and build its config
133d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        mModule = mModules.get(0);
134d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        for (RadioManager.BandDescriptor band : mModule.getBands()) {
13533d00704d6c04327350c42d87aa74da5ccfaf865Tomasz Wasilczyk            int bandType = band.getType();
13633d00704d6c04327350c42d87aa74da5ccfaf865Tomasz Wasilczyk            if (bandType == RadioManager.BAND_AM || bandType == RadioManager.BAND_AM_HD) {
1372134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk                mAmBandDescriptor = (RadioManager.AmBandDescriptor)band;
1382134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk            }
13933d00704d6c04327350c42d87aa74da5ccfaf865Tomasz Wasilczyk            if (bandType == RadioManager.BAND_FM || bandType == RadioManager.BAND_FM_HD) {
1402134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk                mFmBandDescriptor = (RadioManager.FmBandDescriptor)band;
141347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk            }
142347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        }
1432134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        assertNotNull(mAmBandDescriptor);
1442134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        assertNotNull(mFmBandDescriptor);
1458b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        mAmBandConfig = new RadioManager.AmBandConfig.Builder(mAmBandDescriptor).build();
1468b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        mFmBandConfig = new RadioManager.FmBandConfig.Builder(mFmBandDescriptor).build();
147347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
148d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        mRadioTuner = mRadioManager.openTuner(mModule.getId(),
1499fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk                mFmBandConfig, withAudio, mCallback, null);
150347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        assertNotNull(mRadioTuner);
15137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any());
1522383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        resetCallback();
153347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
1548cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        boolean isAntennaConnected = mRadioTuner.isAntennaConnected();
1558cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        assertTrue(isAntennaConnected);
15637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    }
15737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
158347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Test
159347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public void testOpenTuner() {
1602134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        openTuner();
161347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
162d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk
163d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk    @Test
1648b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk    public void testReopenTuner() throws Throwable {
1652134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        openTuner();
166d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk        mRadioTuner.close();
167d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk        mRadioTuner = null;
1688b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        Thread.sleep(100);  // TODO(b/36122635): force reopen
1692134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        openTuner();
1702134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk    }
1712134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk
1722134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk    @Test
173f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    public void testDoubleClose() {
174f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        openTuner();
175f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        mRadioTuner.close();
176f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        mRadioTuner.close();
177f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    }
178f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk
179f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    @Test
180f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    public void testUseAfterClose() {
181f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        openTuner();
182f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        mRadioTuner.close();
183f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        int ret = mRadioTuner.cancel();
184f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_INVALID_OPERATION, ret);
185f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    }
186f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk
187f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    @Test
1882134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk    public void testSetAndGetConfiguration() {
1892134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        openTuner();
1902134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk
1918b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        // set
1928b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        int ret = mRadioTuner.setConfiguration(mAmBandConfig);
1938b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
19437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any());
1958b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk
1968b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        // get
1978b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        RadioManager.BandConfig[] config = new RadioManager.BandConfig[1];
1988b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        ret = mRadioTuner.getConfiguration(config);
1998b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
2002134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk
2018b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(mAmBandConfig, config[0]);
2028b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk    }
2032134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk
2048b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk    @Test
2058b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk    public void testSetBadConfiguration() throws Throwable {
2068b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        openTuner();
2078b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk
2088b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        // set bad config
2098b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        Constructor<RadioManager.AmBandConfig> configConstr =
2108b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk                RadioManager.AmBandConfig.class.getDeclaredConstructor(
2118b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk                        int.class, int.class, int.class, int.class, int.class, boolean.class);
2128b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        configConstr.setAccessible(true);
2138b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        RadioManager.AmBandConfig badConfig = configConstr.newInstance(
2148b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk                0 /*region*/, RadioManager.BAND_AM /*type*/,
2158b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk                10000 /*lowerLimit*/, 1 /*upperLimit*/, 100 /*spacing*/, false /*stereo*/);
2168b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        int ret = mRadioTuner.setConfiguration(badConfig);
2178b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_BAD_VALUE, ret);
2188b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        verify(mCallback, never()).onConfigurationChanged(any());
2198b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk
2208b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        // set null config
2218b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        ret = mRadioTuner.setConfiguration(null);
2228b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_BAD_VALUE, ret);
2238b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        verify(mCallback, never()).onConfigurationChanged(any());
2248b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk
2258b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        // setting good config should recover
2268b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        ret = mRadioTuner.setConfiguration(mAmBandConfig);
2278b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
22837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any());
229d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk    }
2309fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2319fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    @Test
2329fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    public void testMute() {
2339fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        openTuner();
2349fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2359fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        boolean isMuted = mRadioTuner.getMute();
2369fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertFalse(isMuted);
2379fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2389fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        int ret = mRadioTuner.setMute(true);
2399fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
2409fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        isMuted = mRadioTuner.getMute();
2419fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertTrue(isMuted);
2429fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2439fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        ret = mRadioTuner.setMute(false);
2449fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
2459fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        isMuted = mRadioTuner.getMute();
2469fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertFalse(isMuted);
2479fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    }
2489fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2499fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    @Test
2509fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    public void testMuteNoAudio() {
2519fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        openTuner(false);
2529fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2539fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        int ret = mRadioTuner.setMute(false);
2549fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertEquals(RadioManager.STATUS_ERROR, ret);
2559fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2569fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        boolean isMuted = mRadioTuner.getMute();
2579fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertTrue(isMuted);
2589fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    }
2592383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk
2602383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk    @Test
2612383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk    public void testStep() {
2622383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        openTuner();
2632383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk
2642383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        int ret = mRadioTuner.step(RadioTuner.DIRECTION_DOWN, true);
2652383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
26637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
2672383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk
2682383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        resetCallback();
2692383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk
2702383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        ret = mRadioTuner.step(RadioTuner.DIRECTION_UP, false);
2712383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
27237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
27337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    }
27437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
27537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    @Test
27637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    public void testTuneAndGetPI() {
27737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        openTuner();
27837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
27937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int channel = mFmBandConfig.getLowerLimit() + mFmBandConfig.getSpacing();
28037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
28137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        // test tune
28237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int ret = mRadioTuner.tune(channel, 0);
28337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
28437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        ArgumentCaptor<RadioManager.ProgramInfo> infoc =
28537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk                ArgumentCaptor.forClass(RadioManager.ProgramInfo.class);
28637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kTuneCallbackTimeoutMs))
28737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk                .onProgramInfoChanged(infoc.capture());
28837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(channel, infoc.getValue().getChannel());
28937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
29037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        // test getProgramInformation
29137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        RadioManager.ProgramInfo[] info = new RadioManager.ProgramInfo[1];
29237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        ret = mRadioTuner.getProgramInformation(info);
29337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
29437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertNotNull(info[0]);
29537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(channel, info[0].getChannel());
2960f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk        Log.d(TAG, "PI: " + info[0].toString());
29737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    }
29837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
29937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    @Test
30037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    public void testDummyCancel() {
30137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        openTuner();
30237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
30337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int ret = mRadioTuner.cancel();
30437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
30537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    }
30637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
30737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    @Test
30837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    public void testLateCancel() {
30937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        openTuner();
31037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
31137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int ret = mRadioTuner.step(RadioTuner.DIRECTION_DOWN, false);
31237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
31337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
31437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
31537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int cancelRet = mRadioTuner.cancel();
31637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, cancelRet);
31737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    }
31837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
31937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    @Test
32037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    public void testScanAndCancel() {
32137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        openTuner();
32237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
32337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        /* There is a possible race condition between scan and cancel commands - the scan may finish
32437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk         * before cancel command is issued. Thus we accept both outcomes in this test.
32537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk         */
32637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int scanRet = mRadioTuner.scan(RadioTuner.DIRECTION_DOWN, true);
32737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int cancelRet = mRadioTuner.cancel();
32837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
32937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, scanRet);
33037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, cancelRet);
33137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
33237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, after(kCancelTimeoutMs).atMost(1)).onError(RadioTuner.ERROR_CANCELLED);
33337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, atMost(1)).onProgramInfoChanged(any());
3342383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk    }
335d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
336d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    @Test
337d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    public void testStartBackgroundScan() {
338d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        openTuner();
339d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
340d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        boolean ret = mRadioTuner.startBackgroundScan();
341d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        boolean isSupported = mModule.isBackgroundScanningSupported();
342d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        assertEquals(isSupported, ret);
343d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    }
344d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
345d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    @Test
346d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    public void testGetProgramList() {
347d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        openTuner();
348d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
349d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        try {
3500f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk            Map<String, String> filter = new HashMap<>();
3510f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk            filter.put("com.google.dummy", "dummy");
3520f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk            List<RadioManager.ProgramInfo> list = mRadioTuner.getProgramList(filter);
353d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            assertNotNull(list);
354d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        } catch (IllegalStateException e) {
355d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            // the list may or may not be ready at this point
356d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            Log.i(TAG, "Background list is not ready");
357d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        }
358d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    }
359d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
360d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    @Test
3618cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk    public void testTuneFromProgramList() {
3628cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        openTuner();
3638cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3648cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        List<RadioManager.ProgramInfo> list;
3658cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3668cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        try {
3678cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            list = mRadioTuner.getProgramList(null);
3688cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            assertNotNull(list);
3698cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        } catch (IllegalStateException e) {
3708cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            Log.i(TAG, "Background list is not ready, trying to fix it");
3718cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3728cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            boolean success = mRadioTuner.startBackgroundScan();
3738cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            assertTrue(success);
3748cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            verify(mCallback, timeout(kFullScanTimeoutMs)).onBackgroundScanComplete();
3758cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3768cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            list = mRadioTuner.getProgramList(null);
3778cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            assertNotNull(list);
3788cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        }
3798cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3808cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        if (list.isEmpty()) {
3818cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            Log.i(TAG, "Program list is empty, can't test tune");
3828cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            return;
3838cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        }
3848cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3858cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        ProgramSelector sel = list.get(0).getSelector();
3868cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        mRadioTuner.tune(sel);
3878cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        ArgumentCaptor<RadioManager.ProgramInfo> infoc =
3888cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk                ArgumentCaptor.forClass(RadioManager.ProgramInfo.class);
3898cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(infoc.capture());
3908cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        assertEquals(sel, infoc.getValue().getSelector());
3918cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk    }
3928cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3938cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk    @Test
394d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    public void testForcedAnalog() {
395d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        openTuner();
396d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
397d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        boolean isSupported = true;
398d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        boolean isForced;
399d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        try {
400d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            isForced = mRadioTuner.isAnalogForced();
401d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            assertFalse(isForced);
402d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        } catch (IllegalStateException ex) {
403d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            Log.i(TAG, "Forced analog switch is not supported by this tuner");
404d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            isSupported = false;
405d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        }
406d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
407d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        if (isSupported) {
408d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            mRadioTuner.setAnalogForced(true);
409d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            isForced = mRadioTuner.isAnalogForced();
410d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            assertTrue(isForced);
411d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
412d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            mRadioTuner.setAnalogForced(false);
413d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            isForced = mRadioTuner.isAnalogForced();
414d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            assertFalse(isForced);
415d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        } else {
416d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            assertThrows(IllegalStateException.class, () -> mRadioTuner.setAnalogForced(true));
417d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        }
418d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    }
419347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk}
420