TunerAdapter.java revision 8e932c61db78e7a04f6a98e070089f10abdccf1a
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) {
668b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        try {
678b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk            mTuner.setConfiguration(config);
688cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            mBand = config.getType();
698b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk            return RadioManager.STATUS_OK;
708b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        } catch (IllegalArgumentException e) {
718b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk            Log.e(TAG, "Can't set configuration", e);
728b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk            return RadioManager.STATUS_BAD_VALUE;
738b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        } catch (RemoteException e) {
749fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk            Log.e(TAG, "service died", e);
759fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk            return RadioManager.STATUS_DEAD_OBJECT;
768b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        }
77347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
78347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
79347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Override
80347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public int getConfiguration(RadioManager.BandConfig[] config) {
818b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        if (config == null || config.length != 1) {
828b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk            throw new IllegalArgumentException("The argument must be an array of length 1");
838b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        }
848b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        try {
858b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk            config[0] = mTuner.getConfiguration();
868b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk            return RadioManager.STATUS_OK;
878b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        } catch (RemoteException e) {
889fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk            Log.e(TAG, "service died", e);
899fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk            return RadioManager.STATUS_DEAD_OBJECT;
908b6db4f2eb02f231dd8006debbc1e1be1181178aTomasz Wasilczyk        }
91347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
92347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
93347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Override
94347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public int setMute(boolean mute) {
959fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        try {
969fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk            mTuner.setMuted(mute);
979fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        } catch (IllegalStateException e) {
989fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk            Log.e(TAG, "Can't set muted", e);
999fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk            return RadioManager.STATUS_ERROR;
1009fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        } catch (RemoteException e) {
1019fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk            Log.e(TAG, "service died", e);
1029fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk            return RadioManager.STATUS_DEAD_OBJECT;
1039fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        }
1049fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        return RadioManager.STATUS_OK;
105347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
106347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
107347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Override
108347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public boolean getMute() {
1099fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        try {
1109fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk            return mTuner.isMuted();
1119fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        } catch (RemoteException e) {
1129fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk            Log.e(TAG, "service died", e);
1139fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk            return true;
1149fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk        }
115347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
116347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
117347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Override
118347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public int step(int direction, boolean skipSubChannel) {
1192383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        try {
1202383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk            mTuner.step(direction == RadioTuner.DIRECTION_DOWN, skipSubChannel);
1212383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        } catch (IllegalStateException e) {
1222383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk            Log.e(TAG, "Can't step", e);
1232383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk            return RadioManager.STATUS_INVALID_OPERATION;
1242383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        } catch (RemoteException e) {
1252383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk            Log.e(TAG, "service died", e);
1262383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk            return RadioManager.STATUS_DEAD_OBJECT;
1272383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        }
1282383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        return RadioManager.STATUS_OK;
129347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
130347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
131347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Override
132347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public int scan(int direction, boolean skipSubChannel) {
1332383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        try {
1342383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk            mTuner.scan(direction == RadioTuner.DIRECTION_DOWN, skipSubChannel);
1352383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        } catch (IllegalStateException e) {
1362383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk            Log.e(TAG, "Can't scan", e);
1372383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk            return RadioManager.STATUS_INVALID_OPERATION;
1382383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        } catch (RemoteException e) {
1392383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk            Log.e(TAG, "service died", e);
1402383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk            return RadioManager.STATUS_DEAD_OBJECT;
1412383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        }
1422383793eaee223546985ee12c2f35a3445e34b1cTomasz Wasilczyk        return RadioManager.STATUS_OK;
143347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
144347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
145347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Override
146347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public int tune(int channel, int subChannel) {
14737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        try {
1488cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            mTuner.tune(ProgramSelector.createAmFmSelector(mBand, channel, subChannel));
14937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        } catch (IllegalStateException e) {
15037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk            Log.e(TAG, "Can't tune", e);
15137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk            return RadioManager.STATUS_INVALID_OPERATION;
15237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        } catch (IllegalArgumentException e) {
15337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk            Log.e(TAG, "Can't tune", e);
15437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk            return RadioManager.STATUS_BAD_VALUE;
15537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        } catch (RemoteException e) {
15637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk            Log.e(TAG, "service died", e);
15737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk            return RadioManager.STATUS_DEAD_OBJECT;
15837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        }
15937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        return RadioManager.STATUS_OK;
160347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
161347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
162347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Override
1638cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk    public void tune(@NonNull ProgramSelector selector) {
1648cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        try {
1658cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            mTuner.tune(selector);
1668cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        } catch (RemoteException e) {
1678cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk            throw new RuntimeException("service died", e);
1688cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk        }
1698cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk    }
1708cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk
1718cfb0e81fdd91b7fe1c02287394ac068287281d5Tomasz Wasilczyk    @Override
172347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public int cancel() {
17337d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        try {
17437d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk            mTuner.cancel();
17537d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        } catch (IllegalStateException e) {
17637d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk            Log.e(TAG, "Can't cancel", e);
17737d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk            return RadioManager.STATUS_INVALID_OPERATION;
17837d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        } catch (RemoteException e) {
17937d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk            Log.e(TAG, "service died", e);
18037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk            return RadioManager.STATUS_DEAD_OBJECT;
18137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        }
18237d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk        return RadioManager.STATUS_OK;
183347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
184347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
185347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Override
186c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk    public void cancelAnnouncement() {
187c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk        try {
188c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk            mTuner.cancelAnnouncement();
189c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk        } catch (RemoteException e) {
190c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk            throw new RuntimeException("service died", e);
191c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk        }
192c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk    }
193c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk
194c4cd823a2e4ce62d3a1c6ee6c71bb406c564608cTomasz Wasilczyk    @Override
195347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public int getProgramInformation(RadioManager.ProgramInfo[] info) {
196347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        if (info == null || info.length != 1) {
197347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk            throw new IllegalArgumentException("The argument must be an array of length 1");
198347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        }
199347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        try {
20037d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk            info[0] = mTuner.getProgramInformation();
20137d986d17d0210706be907ce9119b711eeaca235Tomasz Wasilczyk            return RadioManager.STATUS_OK;
202347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        } catch (RemoteException e) {
2039fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk            Log.e(TAG, "service died", e);
2049fa0287c1802df074d4039489dcfad712c19bcbaTomasz Wasilczyk            return RadioManager.STATUS_DEAD_OBJECT;
205347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk        }
206347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
207347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
208347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Override
2094482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk    public @Nullable Bitmap getMetadataImage(int id) {
2104482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk        try {
2114482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk            return mTuner.getImage(id);
2124482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk        } catch (RemoteException e) {
2134482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk            throw new RuntimeException("service died", e);
2144482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk        }
2154482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk    }
2164482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk
2174482b1413656b9c0c5937b4d7a73235f872a6678Tomasz Wasilczyk    @Override
218347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public boolean startBackgroundScan() {
219d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        try {
220d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            return mTuner.startBackgroundScan();
221d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        } catch (RemoteException e) {
222d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            throw new RuntimeException("service died", e);
223d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        }
224347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
225347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
226347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Override
2270f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk    public @NonNull List<RadioManager.ProgramInfo>
2280f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk            getProgramList(@Nullable Map<String, String> vendorFilter) {
229d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        try {
2300f1776d08b43f5f71a9f89b6a4f1838df4d3d744Tomasz Wasilczyk            return mTuner.getProgramList(vendorFilter);
231d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        } catch (RemoteException e) {
232d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            throw new RuntimeException("service died", e);
233d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        }
234347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
235347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
236347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Override
237347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public boolean isAnalogForced() {
238d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        try {
239d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            return mTuner.isAnalogForced();
240d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        } catch (RemoteException e) {
241d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            throw new RuntimeException("service died", e);
242d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        }
243347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
244347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
245347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Override
246347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public void setAnalogForced(boolean isForced) {
247d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        try {
248d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            mTuner.setAnalogForced(isForced);
249d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        } catch (RemoteException e) {
250d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            throw new RuntimeException("service died", e);
251d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        }
252347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
253347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
254347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Override
2558e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk    public @NonNull Map<String, String> setParameters(@NonNull Map<String, String> parameters) {
2568e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk        try {
2578e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk            return mTuner.setParameters(Objects.requireNonNull(parameters));
2588e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk        } catch (RemoteException e) {
2598e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk            throw new RuntimeException("service died", e);
2608e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk        }
2618e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk    }
2628e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk
2638e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk    @Override
2648e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk    public @NonNull Map<String, String> getParameters(@NonNull List<String> keys) {
2658e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk        try {
2668e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk            return mTuner.getParameters(Objects.requireNonNull(keys));
2678e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk        } catch (RemoteException e) {
2688e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk            throw new RuntimeException("service died", e);
2698e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk        }
2708e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk    }
2718e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk
2728e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk    @Override
273347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public boolean isAntennaConnected() {
27439ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk        try {
27539ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk            return mTuner.isAntennaConnected();
27639ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk        } catch (RemoteException e) {
27739ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk            throw new RuntimeException("service died", e);
27839ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk        }
279347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
280347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
281347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Override
282347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public boolean hasControl() {
283468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk        try {
284468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk            // don't rely on mIsClosed, as tuner might get closed internally
285468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk            return !mTuner.isClosed();
286468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk        } catch (RemoteException e) {
287468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk            return false;
288468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk        }
289347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
290347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk}
291