TunerAdapter.java revision 8cfb0e81fdd91b7fe1c02287394ac068287281d5
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 */ 16347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 17347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykpackage android.hardware.radio; 18347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 19347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport android.annotation.NonNull; 20347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport android.annotation.Nullable; 21347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport android.os.RemoteException; 22347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport android.util.Log; 23347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 24347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport java.util.List; 25347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 26347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk/** 27347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk * Implements the RadioTuner interface by forwarding calls to radio service. 28347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk */ 29347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykclass TunerAdapter extends RadioTuner { 30347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk private static final String TAG = "radio.TunerAdapter"; 31347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 32347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @NonNull private final ITuner mTuner; 33d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk private boolean mIsClosed = false; 34347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 358cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk private @RadioManager.Band int mBand; 368cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk 378cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk TunerAdapter(ITuner tuner, @RadioManager.Band int band) { 38347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk if (tuner == null) { 39347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk throw new NullPointerException(); 40347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 41347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk mTuner = tuner; 428cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk mBand = band; 43347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 44347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 45347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 46347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public void close() { 47d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk synchronized (mTuner) { 48d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk if (mIsClosed) { 4914752375d74908632195a875f32a2b5fd1e719efTomasz Wasilczyk Log.v(TAG, "Tuner is already closed"); 50d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk return; 51d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk } 52d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk mIsClosed = true; 53d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk } 54d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk try { 55d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk mTuner.close(); 56d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk } catch (RemoteException e) { 57d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk Log.e(TAG, "Exception trying to close tuner", e); 58d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk } 59347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 60347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 61347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 62347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public int setConfiguration(RadioManager.BandConfig config) { 638b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk try { 648b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk mTuner.setConfiguration(config); 658cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk mBand = config.getType(); 668b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk return RadioManager.STATUS_OK; 678b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk } catch (IllegalArgumentException e) { 688b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk Log.e(TAG, "Can't set configuration", e); 698b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk return RadioManager.STATUS_BAD_VALUE; 708b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk } catch (RemoteException e) { 719fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk Log.e(TAG, "service died", e); 729fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk return RadioManager.STATUS_DEAD_OBJECT; 738b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk } 74347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 75347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 76347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 77347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public int getConfiguration(RadioManager.BandConfig[] config) { 788b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk if (config == null || config.length != 1) { 798b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk throw new IllegalArgumentException("The argument must be an array of length 1"); 808b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk } 818b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk try { 828b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk config[0] = mTuner.getConfiguration(); 838b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk return RadioManager.STATUS_OK; 848b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk } catch (RemoteException e) { 859fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk Log.e(TAG, "service died", e); 869fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk return RadioManager.STATUS_DEAD_OBJECT; 878b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk } 88347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 89347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 90347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 91347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public int setMute(boolean mute) { 929fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk try { 939fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk mTuner.setMuted(mute); 949fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk } catch (IllegalStateException e) { 959fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk Log.e(TAG, "Can't set muted", e); 969fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk return RadioManager.STATUS_ERROR; 979fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk } catch (RemoteException e) { 989fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk Log.e(TAG, "service died", e); 999fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk return RadioManager.STATUS_DEAD_OBJECT; 1009fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk } 1019fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk return RadioManager.STATUS_OK; 102347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 103347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 104347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 105347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public boolean getMute() { 1069fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk try { 1079fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk return mTuner.isMuted(); 1089fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk } catch (RemoteException e) { 1099fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk Log.e(TAG, "service died", e); 1109fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk return true; 1119fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk } 112347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 113347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 114347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 115347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public int step(int direction, boolean skipSubChannel) { 1162383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk try { 1172383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk mTuner.step(direction == RadioTuner.DIRECTION_DOWN, skipSubChannel); 1182383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk } catch (IllegalStateException e) { 1192383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk Log.e(TAG, "Can't step", e); 1202383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk return RadioManager.STATUS_INVALID_OPERATION; 1212383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk } catch (RemoteException e) { 1222383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk Log.e(TAG, "service died", e); 1232383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk return RadioManager.STATUS_DEAD_OBJECT; 1242383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk } 1252383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk return RadioManager.STATUS_OK; 126347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 127347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 128347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 129347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public int scan(int direction, boolean skipSubChannel) { 1302383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk try { 1312383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk mTuner.scan(direction == RadioTuner.DIRECTION_DOWN, skipSubChannel); 1322383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk } catch (IllegalStateException e) { 1332383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk Log.e(TAG, "Can't scan", e); 1342383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk return RadioManager.STATUS_INVALID_OPERATION; 1352383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk } catch (RemoteException e) { 1362383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk Log.e(TAG, "service died", e); 1372383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk return RadioManager.STATUS_DEAD_OBJECT; 1382383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk } 1392383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk return RadioManager.STATUS_OK; 140347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 141347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 142347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 143347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public int tune(int channel, int subChannel) { 14437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk try { 1458cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk mTuner.tune(ProgramSelector.createAmFmSelector(mBand, channel, subChannel)); 14637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } catch (IllegalStateException e) { 14737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk Log.e(TAG, "Can't tune", e); 14837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk return RadioManager.STATUS_INVALID_OPERATION; 14937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } catch (IllegalArgumentException e) { 15037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk Log.e(TAG, "Can't tune", e); 15137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk return RadioManager.STATUS_BAD_VALUE; 15237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } catch (RemoteException e) { 15337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk Log.e(TAG, "service died", e); 15437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk return RadioManager.STATUS_DEAD_OBJECT; 15537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } 15637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk return RadioManager.STATUS_OK; 157347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 158347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 159347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 1608cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk public void tune(@NonNull ProgramSelector selector) { 1618cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk try { 1628cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk mTuner.tune(selector); 1638cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk } catch (RemoteException e) { 1648cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk throw new RuntimeException("service died", e); 1658cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk } 1668cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk } 1678cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk 1688cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk @Override 169347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public int cancel() { 17037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk try { 17137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk mTuner.cancel(); 17237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } catch (IllegalStateException e) { 17337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk Log.e(TAG, "Can't cancel", e); 17437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk return RadioManager.STATUS_INVALID_OPERATION; 17537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } catch (RemoteException e) { 17637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk Log.e(TAG, "service died", e); 17737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk return RadioManager.STATUS_DEAD_OBJECT; 17837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } 17937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk return RadioManager.STATUS_OK; 180347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 181347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 182347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 183347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public int getProgramInformation(RadioManager.ProgramInfo[] info) { 184347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk if (info == null || info.length != 1) { 185347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk throw new IllegalArgumentException("The argument must be an array of length 1"); 186347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 187347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk try { 18837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk info[0] = mTuner.getProgramInformation(); 18937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk return RadioManager.STATUS_OK; 190347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } catch (RemoteException e) { 1919fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk Log.e(TAG, "service died", e); 1929fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk return RadioManager.STATUS_DEAD_OBJECT; 193347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 194347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 195347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 196347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 197347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public boolean startBackgroundScan() { 198d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk try { 199d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk return mTuner.startBackgroundScan(); 200d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } catch (RemoteException e) { 201d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk throw new RuntimeException("service died", e); 202d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } 203347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 204347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 205347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 206347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public @NonNull List<RadioManager.ProgramInfo> getProgramList(@Nullable String filter) { 207d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk try { 208d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk return mTuner.getProgramList(filter); 209d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } catch (RemoteException e) { 210d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk throw new RuntimeException("service died", e); 211d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } 212347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 213347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 214347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 215347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public boolean isAnalogForced() { 216d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk try { 217d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk return mTuner.isAnalogForced(); 218d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } catch (RemoteException e) { 219d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk throw new RuntimeException("service died", e); 220d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } 221347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 222347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 223347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 224347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public void setAnalogForced(boolean isForced) { 225d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk try { 226d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk mTuner.setAnalogForced(isForced); 227d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } catch (RemoteException e) { 228d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk throw new RuntimeException("service died", e); 229d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } 230347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 231347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 232347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 233347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public boolean isAntennaConnected() { 23439ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk try { 23539ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk return mTuner.isAntennaConnected(); 23639ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk } catch (RemoteException e) { 23739ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk throw new RuntimeException("service died", e); 23839ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk } 239347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 240347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 241347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 242347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public boolean hasControl() { 243468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk try { 244468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk // don't rely on mIsClosed, as tuner might get closed internally 245468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk return !mTuner.isClosed(); 246468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk } catch (RemoteException e) { 247468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk return false; 248468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk } 249347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 250347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk} 251