RadioTunerTest.java revision fd7194acb3e20a00f2d51ac890a7ac6ad93828d8
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);
134a6f1523532c08387e4ecd0282460321b50aecf0eTomasz Wasilczyk
135d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        for (RadioManager.BandDescriptor band : mModule.getBands()) {
136a6f1523532c08387e4ecd0282460321b50aecf0eTomasz Wasilczyk            Log.d(TAG, "Band: " + band);
13733d00704d6c04327350c42d87aa74da5ccfaf865Tomasz Wasilczyk            int bandType = band.getType();
13833d00704d6c04327350c42d87aa74da5ccfaf865Tomasz Wasilczyk            if (bandType == RadioManager.BAND_AM || bandType == RadioManager.BAND_AM_HD) {
1392134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk                mAmBandDescriptor = (RadioManager.AmBandDescriptor)band;
1402134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk            }
14133d00704d6c04327350c42d87aa74da5ccfaf865Tomasz Wasilczyk            if (bandType == RadioManager.BAND_FM || bandType == RadioManager.BAND_FM_HD) {
1422134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk                mFmBandDescriptor = (RadioManager.FmBandDescriptor)band;
143347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk            }
144347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        }
1452134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        assertNotNull(mAmBandDescriptor);
1462134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        assertNotNull(mFmBandDescriptor);
1478b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        mAmBandConfig = new RadioManager.AmBandConfig.Builder(mAmBandDescriptor).build();
1488b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        mFmBandConfig = new RadioManager.FmBandConfig.Builder(mFmBandDescriptor).build();
149347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
150d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        mRadioTuner = mRadioManager.openTuner(mModule.getId(),
1519fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk                mFmBandConfig, withAudio, mCallback, null);
152347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        assertNotNull(mRadioTuner);
15337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any());
1542383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        resetCallback();
155347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
1568cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        boolean isAntennaConnected = mRadioTuner.isAntennaConnected();
1578cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        assertTrue(isAntennaConnected);
15837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    }
15937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
160347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Test
161347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public void testOpenTuner() {
1622134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        openTuner();
163347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
164d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk
165d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk    @Test
1668b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk    public void testReopenTuner() throws Throwable {
1672134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        openTuner();
168d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk        mRadioTuner.close();
169d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk        mRadioTuner = null;
1708b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        Thread.sleep(100);  // TODO(b/36122635): force reopen
1712134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        openTuner();
1722134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk    }
1732134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk
1742134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk    @Test
175f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    public void testDoubleClose() {
176f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        openTuner();
177f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        mRadioTuner.close();
178f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        mRadioTuner.close();
179f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    }
180f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk
181f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    @Test
182f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    public void testUseAfterClose() {
183f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        openTuner();
184f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        mRadioTuner.close();
185f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        int ret = mRadioTuner.cancel();
186f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_INVALID_OPERATION, ret);
187f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    }
188f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk
189f13b8419b84848a557a87938d7504bb13ecbe62aTomasz Wasilczyk    @Test
1902134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk    public void testSetAndGetConfiguration() {
1912134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk        openTuner();
1922134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk
1938b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        // set
1948b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        int ret = mRadioTuner.setConfiguration(mAmBandConfig);
1958b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
19637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any());
1978b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk
1988b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        // get
1998b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        RadioManager.BandConfig[] config = new RadioManager.BandConfig[1];
2008b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        ret = mRadioTuner.getConfiguration(config);
2018b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
2022134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk
2038b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(mAmBandConfig, config[0]);
2048b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk    }
2052134817b391b004a6f54cee8574e1cc4a1e98285Tomasz Wasilczyk
2068b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk    @Test
2078b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk    public void testSetBadConfiguration() throws Throwable {
2088b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        openTuner();
2098b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk
2108b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        // set bad config
2118b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        Constructor<RadioManager.AmBandConfig> configConstr =
2128b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk                RadioManager.AmBandConfig.class.getDeclaredConstructor(
2138b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk                        int.class, int.class, int.class, int.class, int.class, boolean.class);
2148b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        configConstr.setAccessible(true);
2158b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        RadioManager.AmBandConfig badConfig = configConstr.newInstance(
2168b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk                0 /*region*/, RadioManager.BAND_AM /*type*/,
2178b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk                10000 /*lowerLimit*/, 1 /*upperLimit*/, 100 /*spacing*/, false /*stereo*/);
2188b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        int ret = mRadioTuner.setConfiguration(badConfig);
2198b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_BAD_VALUE, ret);
2208b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        verify(mCallback, never()).onConfigurationChanged(any());
2218b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk
2228b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        // set null config
2238b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        ret = mRadioTuner.setConfiguration(null);
2248b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_BAD_VALUE, ret);
2258b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        verify(mCallback, never()).onConfigurationChanged(any());
2268b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk
2278b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        // setting good config should recover
2288b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        ret = mRadioTuner.setConfiguration(mAmBandConfig);
2298b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
23037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any());
231d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk    }
2329fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2339fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    @Test
2349fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    public void testMute() {
2359fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        openTuner();
2369fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2379fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        boolean isMuted = mRadioTuner.getMute();
2389fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertFalse(isMuted);
2399fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2409fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        int ret = mRadioTuner.setMute(true);
2419fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
2429fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        isMuted = mRadioTuner.getMute();
2439fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertTrue(isMuted);
2449fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2459fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        ret = mRadioTuner.setMute(false);
2469fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
2479fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        isMuted = mRadioTuner.getMute();
2489fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertFalse(isMuted);
2499fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    }
2509fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2519fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    @Test
2529fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    public void testMuteNoAudio() {
2539fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        openTuner(false);
2549fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2559fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        int ret = mRadioTuner.setMute(false);
2569fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertEquals(RadioManager.STATUS_ERROR, ret);
2579fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk
2589fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        boolean isMuted = mRadioTuner.getMute();
2599fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        assertTrue(isMuted);
2609fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk    }
2612383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk
2622383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk    @Test
2632383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk    public void testStep() {
2642383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        openTuner();
2652383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk
2662383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        int ret = mRadioTuner.step(RadioTuner.DIRECTION_DOWN, true);
2672383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
26837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
2692383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk
2702383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        resetCallback();
2712383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk
2722383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        ret = mRadioTuner.step(RadioTuner.DIRECTION_UP, false);
2732383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
27437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
27537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    }
27637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
27737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    @Test
278fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk    public void testStepLoop() {
279fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk        openTuner();
280fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk
281fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk        for (int i = 0; i < 10; i++) {
282fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk            Log.d(TAG, "step loop iteration " + (i + 1));
283fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk
284fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk            int ret = mRadioTuner.step(RadioTuner.DIRECTION_DOWN, true);
285fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk            assertEquals(RadioManager.STATUS_OK, ret);
286fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk            verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
287fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk
288fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk            resetCallback();
289fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk        }
290fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk    }
291fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk
292fd7194acb3e20a00f2d51ac890a7ac6ad93828d8Tomasz Wasilczyk    @Test
29337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    public void testTuneAndGetPI() {
29437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        openTuner();
29537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
29637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int channel = mFmBandConfig.getLowerLimit() + mFmBandConfig.getSpacing();
29737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
29837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        // test tune
29937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int ret = mRadioTuner.tune(channel, 0);
30037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
30137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        ArgumentCaptor<RadioManager.ProgramInfo> infoc =
30237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk                ArgumentCaptor.forClass(RadioManager.ProgramInfo.class);
30337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kTuneCallbackTimeoutMs))
30437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk                .onProgramInfoChanged(infoc.capture());
30537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(channel, infoc.getValue().getChannel());
30637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
30737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        // test getProgramInformation
30837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        RadioManager.ProgramInfo[] info = new RadioManager.ProgramInfo[1];
30937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        ret = mRadioTuner.getProgramInformation(info);
31037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
31137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertNotNull(info[0]);
31237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(channel, info[0].getChannel());
3130f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk        Log.d(TAG, "PI: " + info[0].toString());
31437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    }
31537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
31637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    @Test
31737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    public void testDummyCancel() {
31837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        openTuner();
31937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
32037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int ret = mRadioTuner.cancel();
32137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
32237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    }
32337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
32437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    @Test
32537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    public void testLateCancel() {
32637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        openTuner();
32737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
32837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int ret = mRadioTuner.step(RadioTuner.DIRECTION_DOWN, false);
32937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, ret);
33037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
33137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
33237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int cancelRet = mRadioTuner.cancel();
33337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, cancelRet);
33437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    }
33537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
33637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    @Test
33737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk    public void testScanAndCancel() {
33837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        openTuner();
33937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
34037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        /* There is a possible race condition between scan and cancel commands - the scan may finish
34137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk         * before cancel command is issued. Thus we accept both outcomes in this test.
34237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk         */
34337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int scanRet = mRadioTuner.scan(RadioTuner.DIRECTION_DOWN, true);
34437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        int cancelRet = mRadioTuner.cancel();
34537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
34637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, scanRet);
34737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        assertEquals(RadioManager.STATUS_OK, cancelRet);
34837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk
34937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, after(kCancelTimeoutMs).atMost(1)).onError(RadioTuner.ERROR_CANCELLED);
35037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        verify(mCallback, atMost(1)).onProgramInfoChanged(any());
3512383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk    }
352d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
353d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    @Test
354d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    public void testStartBackgroundScan() {
355d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        openTuner();
356d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
357d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        boolean ret = mRadioTuner.startBackgroundScan();
358d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        boolean isSupported = mModule.isBackgroundScanningSupported();
359d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        assertEquals(isSupported, ret);
360d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    }
361d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
362d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    @Test
363d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    public void testGetProgramList() {
364d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        openTuner();
365d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
366d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        try {
3670f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk            Map<String, String> filter = new HashMap<>();
3680f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk            filter.put("com.google.dummy", "dummy");
3690f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk            List<RadioManager.ProgramInfo> list = mRadioTuner.getProgramList(filter);
370d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            assertNotNull(list);
371d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        } catch (IllegalStateException e) {
372d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            // the list may or may not be ready at this point
373d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            Log.i(TAG, "Background list is not ready");
374d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        }
375d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    }
376d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
377d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    @Test
3788cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk    public void testTuneFromProgramList() {
3798cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        openTuner();
3808cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3818cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        List<RadioManager.ProgramInfo> list;
3828cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3838cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        try {
3848cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            list = mRadioTuner.getProgramList(null);
3858cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            assertNotNull(list);
3868cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        } catch (IllegalStateException e) {
3878cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            Log.i(TAG, "Background list is not ready, trying to fix it");
3888cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3898cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            boolean success = mRadioTuner.startBackgroundScan();
3908cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            assertTrue(success);
3918cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            verify(mCallback, timeout(kFullScanTimeoutMs)).onBackgroundScanComplete();
3928cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3938cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            list = mRadioTuner.getProgramList(null);
3948cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            assertNotNull(list);
3958cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        }
3968cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
3978cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        if (list.isEmpty()) {
3988cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            Log.i(TAG, "Program list is empty, can't test tune");
3998cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            return;
4008cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        }
4018cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
4028cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        ProgramSelector sel = list.get(0).getSelector();
4038cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        mRadioTuner.tune(sel);
4048cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        ArgumentCaptor<RadioManager.ProgramInfo> infoc =
4058cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk                ArgumentCaptor.forClass(RadioManager.ProgramInfo.class);
4068cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(infoc.capture());
4078cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        assertEquals(sel, infoc.getValue().getSelector());
4088cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk    }
4098cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
4108cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk    @Test
411d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    public void testForcedAnalog() {
412d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        openTuner();
413d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
414d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        boolean isSupported = true;
415d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        boolean isForced;
416d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        try {
417d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            isForced = mRadioTuner.isAnalogForced();
418d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            assertFalse(isForced);
419d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        } catch (IllegalStateException ex) {
420d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            Log.i(TAG, "Forced analog switch is not supported by this tuner");
421d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            isSupported = false;
422d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        }
423d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
424d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        if (isSupported) {
425d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            mRadioTuner.setAnalogForced(true);
426d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            isForced = mRadioTuner.isAnalogForced();
427d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            assertTrue(isForced);
428d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk
429d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            mRadioTuner.setAnalogForced(false);
430d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            isForced = mRadioTuner.isAnalogForced();
431d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            assertFalse(isForced);
432d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        } else {
433d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            assertThrows(IllegalStateException.class, () -> mRadioTuner.setAnalogForced(true));
434d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        }
435d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk    }
436347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk}
437