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