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