TunerAdapter.java revision ce40fe9b1b15221eb91d8b82322b695161664932
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() {
239ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk        return isConfigFlagSet(RadioManager.CONFIG_FORCE_ANALOG);
240ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk    }
241ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk
242ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk    @Override
243ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk    public void setAnalogForced(boolean isForced) {
244ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk        setConfigFlag(RadioManager.CONFIG_FORCE_ANALOG, isForced);
245ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk    }
246ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk
247ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk    @Override
248ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk    public boolean isConfigFlagSupported(@RadioManager.ConfigFlag int flag) {
249d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        try {
250ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk            return mTuner.isConfigFlagSupported(flag);
251d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        } catch (RemoteException e) {
252d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            throw new RuntimeException("service died", e);
253d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        }
254347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
255347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
256347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Override
257ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk    public boolean isConfigFlagSet(@RadioManager.ConfigFlag int flag) {
258ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk        try {
259ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk            return mTuner.isConfigFlagSet(flag);
260ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk        } catch (RemoteException e) {
261ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk            throw new RuntimeException("service died", e);
262ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk        }
263ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk    }
264ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk
265ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk    @Override
266ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk    public void setConfigFlag(@RadioManager.ConfigFlag int flag, boolean value) {
267d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        try {
268ce40fe9b1b15221eb91d8b82322b695161664932Tomasz Wasilczyk            mTuner.setConfigFlag(flag, value);
269d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        } catch (RemoteException e) {
270d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk            throw new RuntimeException("service died", e);
271d3d53f669268fe8dd15f16abbd0504f7b9e38405Tomasz Wasilczyk        }
272347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
273347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
274347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Override
2758e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk    public @NonNull Map<String, String> setParameters(@NonNull Map<String, String> parameters) {
2768e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk        try {
2778e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk            return mTuner.setParameters(Objects.requireNonNull(parameters));
2788e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk        } catch (RemoteException e) {
2798e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk            throw new RuntimeException("service died", e);
2808e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk        }
2818e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk    }
2828e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk
2838e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk    @Override
2848e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk    public @NonNull Map<String, String> getParameters(@NonNull List<String> keys) {
2858e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk        try {
2868e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk            return mTuner.getParameters(Objects.requireNonNull(keys));
2878e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk        } catch (RemoteException e) {
2888e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk            throw new RuntimeException("service died", e);
2898e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk        }
2908e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk    }
2918e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk
2928e932c61db78e7a04f6a98e070089f10abdccf1aTomasz Wasilczyk    @Override
293347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public boolean isAntennaConnected() {
29439ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk        try {
29539ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk            return mTuner.isAntennaConnected();
29639ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk        } catch (RemoteException e) {
29739ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk            throw new RuntimeException("service died", e);
29839ac214838988a33096529bd4e1f003ef7895491Tomasz Wasilczyk        }
299347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
300347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk
301347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    @Override
302347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    public boolean hasControl() {
303468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk        try {
304468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk            // don't rely on mIsClosed, as tuner might get closed internally
305468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk            return !mTuner.isClosed();
306468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk        } catch (RemoteException e) {
307468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk            return false;
308468a53b71025a42dde24922e0255ab3251e63fbeTomasz Wasilczyk        }
309347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk    }
310347192e0da1f39347e7ab7b58b002f166b4afaa7Tomasz Wasilczyk}
311