TunerAdapter.java revision ca98cde254fef6c31634d8a3069a0d7b76ecf908
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; 214482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczykimport android.graphics.Bitmap; 22347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport android.os.RemoteException; 23347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport android.util.Log; 24347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 25347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykimport java.util.List; 260f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczykimport java.util.Map; 278e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczykimport java.util.Objects; 28347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 29347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk/** 30347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk * Implements the RadioTuner interface by forwarding calls to radio service. 31347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk */ 32347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczykclass TunerAdapter extends RadioTuner { 336b4b646d9c0fa42973a429dbe78c8919a2772961Tomasz Wasilczyk private static final String TAG = "BroadcastRadio.TunerAdapter"; 34347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 35347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @NonNull private final ITuner mTuner; 36d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk private boolean mIsClosed = false; 37347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 388cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk private @RadioManager.Band int mBand; 398cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk 408cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk TunerAdapter(ITuner tuner, @RadioManager.Band int band) { 41347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk if (tuner == null) { 42347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk throw new NullPointerException(); 43347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 44347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk mTuner = tuner; 458cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk mBand = band; 46347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 47347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 48347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 49347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public void close() { 50d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk synchronized (mTuner) { 51d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk if (mIsClosed) { 5214752375d74908632195a875f32a2b5fd1e719efTomasz Wasilczyk Log.v(TAG, "Tuner is already closed"); 53d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk return; 54d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk } 55d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk mIsClosed = true; 56d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk } 57d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk try { 58d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk mTuner.close(); 59d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk } catch (RemoteException e) { 60d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk Log.e(TAG, "Exception trying to close tuner", e); 61d7c21d3cbfe8e1016a92234f89d6fe8c110144d1Tomasz Wasilczyk } 62347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 63347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 64347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 65347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public int setConfiguration(RadioManager.BandConfig config) { 66ca98cde254fef6c31634d8a3069a0d7b76ecf908Tomasz Wasilczyk if (config == null) return RadioManager.STATUS_BAD_VALUE; 678b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk try { 688b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk mTuner.setConfiguration(config); 698cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk mBand = config.getType(); 708b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk return RadioManager.STATUS_OK; 718b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk } catch (IllegalArgumentException e) { 728b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk Log.e(TAG, "Can't set configuration", e); 738b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk return RadioManager.STATUS_BAD_VALUE; 748b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk } catch (RemoteException e) { 759fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk Log.e(TAG, "service died", e); 769fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk return RadioManager.STATUS_DEAD_OBJECT; 778b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk } 78347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 79347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 80347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 81347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public int getConfiguration(RadioManager.BandConfig[] config) { 828b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk if (config == null || config.length != 1) { 838b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk throw new IllegalArgumentException("The argument must be an array of length 1"); 848b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk } 858b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk try { 868b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk config[0] = mTuner.getConfiguration(); 878b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk return RadioManager.STATUS_OK; 888b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk } catch (RemoteException e) { 899fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk Log.e(TAG, "service died", e); 909fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk return RadioManager.STATUS_DEAD_OBJECT; 918b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk } 92347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 93347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 94347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 95347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public int setMute(boolean mute) { 969fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk try { 979fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk mTuner.setMuted(mute); 989fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk } catch (IllegalStateException e) { 999fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk Log.e(TAG, "Can't set muted", e); 1009fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk return RadioManager.STATUS_ERROR; 1019fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk } catch (RemoteException e) { 1029fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk Log.e(TAG, "service died", e); 1039fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk return RadioManager.STATUS_DEAD_OBJECT; 1049fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk } 1059fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk return RadioManager.STATUS_OK; 106347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 107347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 108347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 109347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public boolean getMute() { 1109fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk try { 1119fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk return mTuner.isMuted(); 1129fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk } catch (RemoteException e) { 1139fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk Log.e(TAG, "service died", e); 1149fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk return true; 1159fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk } 116347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 117347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 118347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 119347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public int step(int direction, boolean skipSubChannel) { 1202383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk try { 1212383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk mTuner.step(direction == RadioTuner.DIRECTION_DOWN, skipSubChannel); 1222383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk } catch (IllegalStateException e) { 1232383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk Log.e(TAG, "Can't step", e); 1242383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk return RadioManager.STATUS_INVALID_OPERATION; 1252383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk } catch (RemoteException e) { 1262383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk Log.e(TAG, "service died", e); 1272383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk return RadioManager.STATUS_DEAD_OBJECT; 1282383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk } 1292383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk return RadioManager.STATUS_OK; 130347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 131347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 132347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 133347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public int scan(int direction, boolean skipSubChannel) { 1342383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk try { 1352383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk mTuner.scan(direction == RadioTuner.DIRECTION_DOWN, skipSubChannel); 1362383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk } catch (IllegalStateException e) { 1372383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk Log.e(TAG, "Can't scan", e); 1382383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk return RadioManager.STATUS_INVALID_OPERATION; 1392383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk } catch (RemoteException e) { 1402383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk Log.e(TAG, "service died", e); 1412383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk return RadioManager.STATUS_DEAD_OBJECT; 1422383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk } 1432383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk return RadioManager.STATUS_OK; 144347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 145347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 146347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 147347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public int tune(int channel, int subChannel) { 14837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk try { 1498cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk mTuner.tune(ProgramSelector.createAmFmSelector(mBand, channel, subChannel)); 15037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } catch (IllegalStateException e) { 15137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk Log.e(TAG, "Can't tune", e); 15237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk return RadioManager.STATUS_INVALID_OPERATION; 15337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } catch (IllegalArgumentException e) { 15437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk Log.e(TAG, "Can't tune", e); 15537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk return RadioManager.STATUS_BAD_VALUE; 15637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } catch (RemoteException e) { 15737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk Log.e(TAG, "service died", e); 15837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk return RadioManager.STATUS_DEAD_OBJECT; 15937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } 16037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk return RadioManager.STATUS_OK; 161347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 162347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 163347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 1648cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk public void tune(@NonNull ProgramSelector selector) { 1658cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk try { 1668cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk mTuner.tune(selector); 1678cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk } catch (RemoteException e) { 1688cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk throw new RuntimeException("service died", e); 1698cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk } 1708cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk } 1718cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk 1728cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk @Override 173347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public int cancel() { 17437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk try { 17537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk mTuner.cancel(); 17637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } catch (IllegalStateException e) { 17737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk Log.e(TAG, "Can't cancel", e); 17837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk return RadioManager.STATUS_INVALID_OPERATION; 17937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } catch (RemoteException e) { 18037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk Log.e(TAG, "service died", e); 18137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk return RadioManager.STATUS_DEAD_OBJECT; 18237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk } 18337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk return RadioManager.STATUS_OK; 184347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 185347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 186347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 187c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk public void cancelAnnouncement() { 188c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk try { 189c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk mTuner.cancelAnnouncement(); 190c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk } catch (RemoteException e) { 191c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk throw new RuntimeException("service died", e); 192c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk } 193c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk } 194c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk 195c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk @Override 196347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public int getProgramInformation(RadioManager.ProgramInfo[] info) { 197347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk if (info == null || info.length != 1) { 198347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk throw new IllegalArgumentException("The argument must be an array of length 1"); 199347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 200347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk try { 20137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk info[0] = mTuner.getProgramInformation(); 20237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk return RadioManager.STATUS_OK; 203347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } catch (RemoteException e) { 2049fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk Log.e(TAG, "service died", e); 2059fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk return RadioManager.STATUS_DEAD_OBJECT; 206347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 207347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 208347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 209347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 2104482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk public @Nullable Bitmap getMetadataImage(int id) { 2114482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk try { 2124482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk return mTuner.getImage(id); 2134482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk } catch (RemoteException e) { 2144482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk throw new RuntimeException("service died", e); 2154482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk } 2164482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk } 2174482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk 2184482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk @Override 219347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public boolean startBackgroundScan() { 220d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk try { 221d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk return mTuner.startBackgroundScan(); 222d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } catch (RemoteException e) { 223d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk throw new RuntimeException("service died", e); 224d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } 225347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 226347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 227347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 2280f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk public @NonNull List<RadioManager.ProgramInfo> 2290f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk getProgramList(@Nullable Map<String, String> vendorFilter) { 230d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk try { 2310f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk return mTuner.getProgramList(vendorFilter); 232d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } catch (RemoteException e) { 233d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk throw new RuntimeException("service died", e); 234d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } 235347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 236347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 237347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 238347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public boolean isAnalogForced() { 239d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk try { 240d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk return mTuner.isAnalogForced(); 241d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } catch (RemoteException e) { 242d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk throw new RuntimeException("service died", e); 243d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } 244347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 245347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 246347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 247347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public void setAnalogForced(boolean isForced) { 248d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk try { 249d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk mTuner.setAnalogForced(isForced); 250d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } catch (RemoteException e) { 251d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk throw new RuntimeException("service died", e); 252d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk } 253347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 254347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 255347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 2568e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk public @NonNull Map<String, String> setParameters(@NonNull Map<String, String> parameters) { 2578e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk try { 2588e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk return mTuner.setParameters(Objects.requireNonNull(parameters)); 2598e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk } catch (RemoteException e) { 2608e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk throw new RuntimeException("service died", e); 2618e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk } 2628e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk } 2638e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk 2648e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk @Override 2658e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk public @NonNull Map<String, String> getParameters(@NonNull List<String> keys) { 2668e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk try { 2678e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk return mTuner.getParameters(Objects.requireNonNull(keys)); 2688e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk } catch (RemoteException e) { 2698e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk throw new RuntimeException("service died", e); 2708e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk } 2718e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk } 2728e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk 2738e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk @Override 274347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public boolean isAntennaConnected() { 27539ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk try { 27639ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk return mTuner.isAntennaConnected(); 27739ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk } catch (RemoteException e) { 27839ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk throw new RuntimeException("service died", e); 27939ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk } 280347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 281347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk 282347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk @Override 283347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk public boolean hasControl() { 284468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk try { 285468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk // don't rely on mIsClosed, as tuner might get closed internally 286468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk return !mTuner.isClosed(); 287468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk } catch (RemoteException e) { 288468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk return false; 289468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk } 290347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk } 291347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk} 292