1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.hardware.radio;
18 
19 import android.Manifest;
20 import android.annotation.IntDef;
21 import android.annotation.NonNull;
22 import android.annotation.Nullable;
23 import android.annotation.RequiresPermission;
24 import android.annotation.SystemApi;
25 import android.graphics.Bitmap;
26 import android.os.Handler;
27 
28 import java.lang.annotation.Retention;
29 import java.lang.annotation.RetentionPolicy;
30 import java.util.List;
31 import java.util.Map;
32 import java.util.concurrent.Executor;
33 
34 /**
35  * RadioTuner interface provides methods to control a radio tuner on the device: selecting and
36  * configuring the active band, muting/unmuting, scanning and tuning, etc...
37  *
38  * Obtain a RadioTuner interface by calling {@link RadioManager#openTuner(int,
39  * RadioManager.BandConfig, boolean, RadioTuner.Callback, Handler)}.
40  * @hide
41  */
42 @SystemApi
43 public abstract class RadioTuner {
44 
45     /** Scanning direction UP for {@link #step(int, boolean)}, {@link #scan(int, boolean)} */
46     public static final int DIRECTION_UP      = 0;
47 
48     /** Scanning directions DOWN for {@link #step(int, boolean)}, {@link #scan(int, boolean)} */
49     public static final int DIRECTION_DOWN    = 1;
50 
51     /**
52      * Close the tuner interface.
53      *
54      * <p>The {@link Callback} callback will not be called anymore and associated resources will be
55      * released. Must be called when the tuner is not needed to make hardware resources available
56      * to others.
57      * */
58     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
close()59     public abstract void close();
60 
61     /**
62      * Set the active band configuration for this module.
63      *
64      * <p>Must be a valid configuration obtained via buildConfig() from a valid BandDescriptor
65      * listed in the ModuleProperties of the module with the specified ID.
66      *
67      * @param config The desired band configuration (FmBandConfig or AmBandConfig).
68      * @return
69      * <ul>
70      *  <li>{@link RadioManager#STATUS_OK} in case of success, </li>
71      *  <li>{@link RadioManager#STATUS_ERROR} in case of unspecified error, </li>
72      *  <li>{@link RadioManager#STATUS_NO_INIT} if the native service cannot be reached, </li>
73      *  <li>{@link RadioManager#STATUS_BAD_VALUE} if parameters are invalid, </li>
74      *  <li>{@link RadioManager#STATUS_INVALID_OPERATION} if the call is out of sequence, </li>
75      *  <li>{@link RadioManager#STATUS_DEAD_OBJECT} if the binder transaction to the native
76      *  service fails, </li>
77      * </ul>
78      * @deprecated Only applicable for HAL 1.x.
79      */
80     @Deprecated
81     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
82     @RadioManager.RadioStatusType
setConfiguration(RadioManager.BandConfig config)83     public abstract int setConfiguration(RadioManager.BandConfig config);
84 
85     /**
86      * Get current configuration.
87      *
88      * @param config a BandConfig array of lengh 1 where the configuration is returned.
89      * @return
90      * <ul>
91      *  <li>{@link RadioManager#STATUS_OK} in case of success, </li>
92      *  <li>{@link RadioManager#STATUS_ERROR} in case of unspecified error, </li>
93      *  <li>{@link RadioManager#STATUS_NO_INIT} if the native service cannot be reached, </li>
94      *  <li>{@link RadioManager#STATUS_BAD_VALUE} if parameters are invalid, </li>
95      *  <li>{@link RadioManager#STATUS_INVALID_OPERATION} if the call is out of sequence, </li>
96      *  <li>{@link RadioManager#STATUS_DEAD_OBJECT} if the binder transaction to the native
97      *  service fails, </li>
98      * </ul>
99      *
100      * @deprecated Only applicable for HAL 1.x.
101      */
102     @Deprecated
103     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
104     @RadioManager.RadioStatusType
getConfiguration(RadioManager.BandConfig[] config)105     public abstract int getConfiguration(RadioManager.BandConfig[] config);
106 
107 
108     /**
109      * Set mute state.
110      *
111      * <p>When muted, the radio tuner audio source is not available for playback on
112      * any audio device. when unmuted, the radio tuner audio source is output as a media source
113      * and renderd over the audio device selected for media use case.
114      * The radio tuner audio source is muted by default when the tuner is first attached.
115      * Only effective if the tuner is attached with audio enabled.
116      *
117      * @param mute the requested mute state.
118      * @return
119      * <ul>
120      *  <li>{@link RadioManager#STATUS_OK} in case of success, </li>
121      *  <li>{@link RadioManager#STATUS_ERROR} in case of unspecified error, </li>
122      *  <li>{@link RadioManager#STATUS_NO_INIT} if the native service cannot be reached, </li>
123      *  <li>{@link RadioManager#STATUS_INVALID_OPERATION} if the call is out of sequence, </li>
124      *  <li>{@link RadioManager#STATUS_DEAD_OBJECT} if the binder transaction to the native
125      *  service fails, </li>
126      * </ul>
127      */
128     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
129     @RadioManager.RadioStatusType
setMute(boolean mute)130     public abstract int setMute(boolean mute);
131 
132     /**
133      * Get mute state.
134      *
135      * @return {@code true} if the radio tuner audio source is muted or a problem occured
136      * retrieving the mute state, {@code false} otherwise.
137      */
138     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
getMute()139     public abstract boolean getMute();
140 
141     /**
142      * Step up or down by one channel spacing.
143      *
144      * <p>The operation is asynchronous and {@link Callback#onProgramInfoChanged}
145      * will be called when step completes or {@link Callback#onTuneFailed}
146      * when timeout or canceled.
147      *
148      * <p>When this operation is called by users other than current user or system user, it is
149      * ignored silently.
150      *
151      * @param direction {@link #DIRECTION_UP} or {@link #DIRECTION_DOWN}.
152      * @param skipSubChannel indicates to skip sub channels when the configuration currently
153      * selected supports sub channel (e.g HD Radio). N/A otherwise.
154      * @return
155      * <ul>
156      *  <li>{@link RadioManager#STATUS_OK} in case of success, </li>
157      *  <li>{@link RadioManager#STATUS_ERROR} in case of unspecified error, </li>
158      *  <li>{@link RadioManager#STATUS_NO_INIT} if the native service cannot be reached, </li>
159      *  <li>{@link RadioManager#STATUS_BAD_VALUE} if parameters are invalid, </li>
160      *  <li>{@link RadioManager#STATUS_INVALID_OPERATION} if the call is out of sequence, </li>
161      *  <li>{@link RadioManager#STATUS_DEAD_OBJECT} if the binder transaction to the native
162      *  service fails, </li>
163      * </ul>
164      */
165     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
166     @RadioManager.RadioStatusType
step(int direction, boolean skipSubChannel)167     public abstract int step(int direction, boolean skipSubChannel);
168 
169     /**
170      * Scan up or down to next valid station.
171      *
172      * <p>The operation is asynchronous and {@link Callback#onProgramInfoChanged}
173      * will be called when scan completes or {@link Callback#onTuneFailed}
174      * when timeout or canceled.
175      *
176      * <p>When this operation is called by users other than current user or system user, it is
177      * ignored silently.
178      *
179      * @param direction {@link #DIRECTION_UP} or {@link #DIRECTION_DOWN}.
180      * @param skipSubChannel indicates to skip sub channels when the configuration currently
181      * selected supports sub channel (e.g HD Radio). N/A otherwise.
182      * @return
183      * <ul>
184      *  <li>{@link RadioManager#STATUS_OK} in case of success, </li>
185      *  <li>{@link RadioManager#STATUS_ERROR} in case of unspecified error, </li>
186      *  <li>{@link RadioManager#STATUS_NO_INIT} if the native service cannot be reached, </li>
187      *  <li>{@link RadioManager#STATUS_BAD_VALUE} if parameters are invalid, </li>
188      *  <li>{@link RadioManager#STATUS_INVALID_OPERATION} if the call is out of sequence, </li>
189      *  <li>{@link RadioManager#STATUS_DEAD_OBJECT} if the binder transaction to the native
190      *  service fails, </li>
191      * </ul>
192      * @deprecated Use {@link #seek(int, boolean)} instead.
193      */
194     @Deprecated
195     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
196     @RadioManager.RadioStatusType
scan(int direction, boolean skipSubChannel)197     public abstract int scan(int direction, boolean skipSubChannel);
198 
199     /**
200      * Seek up or down to next valid station.
201      *
202      * <p>The operation is asynchronous and {@link Callback#onProgramInfoChanged}
203      * will be called when seek completes or {@link Callback#onTuneFailed}
204      * when timeout or canceled.
205      *
206      * <p>When this operation is called by users other than current user or system user, it is
207      * ignore silently.
208      *
209      * @param direction {@link #DIRECTION_UP} or {@link #DIRECTION_DOWN}.
210      * @param skipSubChannel indicates to skip sub channels when the configuration currently
211      * selected supports sub channel (e.g HD Radio). N/A otherwise.
212      * @return
213      * <ul>
214      *  <li>{@link RadioManager#STATUS_OK} in case of success, </li>
215      *  <li>{@link RadioManager#STATUS_ERROR} in case of unspecified error, </li>
216      *  <li>{@link RadioManager#STATUS_NO_INIT} if the native service cannot be reached, </li>
217      *  <li>{@link RadioManager#STATUS_BAD_VALUE} if parameters are invalid, </li>
218      *  <li>{@link RadioManager#STATUS_INVALID_OPERATION} if the call is out of sequence, </li>
219      *  <li>{@link RadioManager#STATUS_DEAD_OBJECT} if the binder transaction to the native
220      *  service fails, </li>
221      * </ul>
222      */
223     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
224     @RadioManager.RadioStatusType
seek(int direction, boolean skipSubChannel)225     public int seek(int direction, boolean skipSubChannel) {
226         throw new UnsupportedOperationException("Seeking is not supported");
227     }
228 
229     /**
230      * Tune to a specific frequency.
231      *
232      * <p>The operation is asynchronous and {@link Callback#onProgramInfoChanged}
233      * will be called when tune completes or {@link Callback#onTuneFailed}
234      * when timeout or canceled.
235      *
236      * <p>When this operation is called by users other than current user or system user, it is
237      * ignored silently.
238      *
239      * @param channel the specific channel or frequency to tune to.
240      * @param subChannel the specific sub-channel to tune to. N/A if the selected configuration
241      * does not support cub channels.
242      * @return
243      * <ul>
244      *  <li>{@link RadioManager#STATUS_OK} in case of success, </li>
245      *  <li>{@link RadioManager#STATUS_ERROR} in case of unspecified error, </li>
246      *  <li>{@link RadioManager#STATUS_NO_INIT} if the native service cannot be reached, </li>
247      *  <li>{@link RadioManager#STATUS_BAD_VALUE} if parameters are invalid, </li>
248      *  <li>{@link RadioManager#STATUS_INVALID_OPERATION} if the call is out of sequence, </li>
249      *  <li>{@link RadioManager#STATUS_DEAD_OBJECT} if the binder transaction to the native
250      *  service fails, </li>
251      * </ul>
252      * @deprecated Use {@link #tune(ProgramSelector)} instead.
253      */
254     @Deprecated
255     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
256     @RadioManager.RadioStatusType
tune(int channel, int subChannel)257     public abstract int tune(int channel, int subChannel);
258 
259     /**
260      * Tune to a program.
261      *
262      * <p>The operation is asynchronous and {@link Callback#onProgramInfoChanged}
263      * will be called when tune completes or {@link Callback#onTuneFailed}
264      * when timeout or canceled.
265      *
266      * <p>When this operation is called by users other than current user or system user, it is
267      * ignored silently.
268      *
269      * @throws IllegalArgumentException if the provided selector is invalid
270      */
271     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
tune(@onNull ProgramSelector selector)272     public abstract void tune(@NonNull ProgramSelector selector);
273 
274     /**
275      * Cancel a pending scan or tune operation.
276      *
277      * <p>If an operation is pending, {@link Callback#onTuneFailed} will be called with
278      * {@link #ERROR_CANCELLED}.
279      *
280      * <p>When this operation is called by users other than current user or system
281      * user, it is ignored silently.
282      *
283      * @return
284      * <ul>
285      *  <li>{@link RadioManager#STATUS_OK} in case of success, </li>
286      *  <li>{@link RadioManager#STATUS_ERROR} in case of unspecified error, </li>
287      *  <li>{@link RadioManager#STATUS_NO_INIT} if the native service cannot be reached, </li>
288      *  <li>{@link RadioManager#STATUS_BAD_VALUE} if parameters are invalid, </li>
289      *  <li>{@link RadioManager#STATUS_INVALID_OPERATION} if the call is out of sequence, </li>
290      *  <li>{@link RadioManager#STATUS_DEAD_OBJECT} if the binder transaction to the native
291      *  service fails, </li>
292      * </ul>
293      */
294     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
295     @RadioManager.RadioStatusType
cancel()296     public abstract int cancel();
297 
298     /**
299      * Cancels traffic or emergency announcement.
300      *
301      * <p>If there was no announcement to cancel, no action is taken.
302      *
303      * <p>There is a race condition between calling cancelAnnouncement and the actual announcement
304      * being finished, so onTrafficAnnouncement / onEmergencyAnnouncement callback should be
305      * tracked with proper locking.
306      * @deprecated Only applicable for HAL 1.x.
307      */
308     @Deprecated
309     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
cancelAnnouncement()310     public abstract void cancelAnnouncement();
311 
312     /**
313      * Get current station information.
314      *
315      * @param info a ProgramInfo array of lengh 1 where the information is returned.
316      * @return
317      * <ul>
318      *  <li>{@link RadioManager#STATUS_OK} in case of success, </li>
319      *  <li>{@link RadioManager#STATUS_ERROR} in case of unspecified error, </li>
320      *  <li>{@link RadioManager#STATUS_NO_INIT} if the native service cannot be reached, </li>
321      *  <li>{@link RadioManager#STATUS_BAD_VALUE} if parameters are invalid, </li>
322      *  <li>{@link RadioManager#STATUS_INVALID_OPERATION} if the call is out of sequence, </li>
323      *  <li>{@link RadioManager#STATUS_DEAD_OBJECT} if the binder transaction to the native
324      *  service fails, </li>
325      * </ul>
326      * @deprecated Use {@link Callback#onProgramInfoChanged(RadioManager.ProgramInfo)} callback
327      * instead.
328      */
329     @Deprecated
330     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
331     @RadioManager.RadioStatusType
getProgramInformation(RadioManager.ProgramInfo[] info)332     public abstract int getProgramInformation(RadioManager.ProgramInfo[] info);
333 
334     /**
335      * Retrieves a {@link Bitmap} for the given image ID or null,
336      * if the image was missing from the tuner.
337      *
338      * <p>This involves doing a call to the tuner, so the bitmap should be cached
339      * on the application side.
340      *
341      * <p>If the method returns null for non-zero ID, it means the image was
342      * updated on the tuner side. There is a race conditon between fetching
343      * image for an old ID and tuner updating the image (and cleaning up the
344      * old image). In such case, a new ProgramInfo with updated image id will
345      * be sent with a {@link Callback#onProgramInfoChanged(RadioManager.ProgramInfo)}
346      * callback.
347      *
348      * @param id The image identifier, retrieved with
349      *           {@link RadioMetadata#getBitmapId(String)}.
350      * @return A {@link Bitmap} or null.
351      * @throws IllegalArgumentException if id==0
352      * @hide This API is not thoroughly elaborated yet
353      */
354     @SuppressWarnings("HiddenAbstractMethod")
355     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
getMetadataImage(int id)356     public abstract @Nullable Bitmap getMetadataImage(int id);
357 
358     /**
359      * Initiates a background scan to update internally cached program list.
360      *
361      * <p>It may not be necessary to initiate the scan explicitly - the scan MAY be performed on
362      * boot.
363      *
364      * <p>The operation is asynchronous and {@link Callback} backgroundScanComplete or onError will
365      * be called if the return value of this call was {@code true}. As result of this call
366      * programListChanged may be triggered (if the scanned list differs).
367      *
368      * @return {@code true} if the scan was properly scheduled, {@code false} if the scan feature
369      * is unavailable; ie. temporarily due to ongoing foreground playback in single-tuner device
370      * or permanently if the feature is not supported
371      * (see ModuleProperties#isBackgroundScanningSupported()).
372      * @deprecated Only applicable for HAL 1.x.
373      */
374     @Deprecated
375     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
startBackgroundScan()376     public abstract boolean startBackgroundScan();
377 
378     /**
379      * Get the list of discovered radio stations.
380      *
381      * <p>To get the full list, set filter to null or empty map.
382      * Keys must be prefixed with unique vendor Java-style namespace,
383      * eg. 'com.somecompany.parameter1'.
384      *
385      * @param vendorFilter vendor-specific selector for radio stations.
386      * @return a list of radio stations.
387      * @throws IllegalStateException if the scan is in progress or has not been started,
388      *         startBackgroundScan() call may fix it.
389      * @throws IllegalArgumentException if the vendorFilter argument is not valid.
390      * @deprecated Use {@link #getDynamicProgramList(ProgramList.Filter)} instead.
391      */
392     @Deprecated
393     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
394     public abstract @NonNull List<RadioManager.ProgramInfo>
getProgramList(@ullable Map<String, String> vendorFilter)395             getProgramList(@Nullable Map<String, String> vendorFilter);
396 
397     /**
398      * Get the dynamic list of discovered radio stations.
399      *
400      * <p>The list object is updated asynchronously; to get the updates register
401      * with {@link ProgramList#registerListCallback(ProgramList.ListCallback)}
402      * or {@link ProgramList#registerListCallback(Executor, ProgramList.ListCallback)}.
403      *
404      * <p>When the returned object is no longer used, it must be closed.
405      *
406      * @param filter filter for the list, or null to get the full list.
407      * @return the dynamic program list object, close it after use
408      *         or {@code null} if program list is not supported by the tuner
409      */
410     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
getDynamicProgramList(@ullable ProgramList.Filter filter)411     public @Nullable ProgramList getDynamicProgramList(@Nullable ProgramList.Filter filter) {
412         return null;
413     }
414 
415     /**
416      * Checks, if the analog playback is forced, see setAnalogForced.
417      *
418      * @throws IllegalStateException if the switch is not supported at current
419      *         configuration.
420      * @return {@code true} if analog is forced, {@code false} otherwise.
421      * @deprecated Use {@link #isConfigFlagSet(int)} instead.
422      */
423     @Deprecated
424     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
isAnalogForced()425     public abstract boolean isAnalogForced();
426 
427     /**
428      * Forces the analog playback for the supporting radio technology.
429      *
430      * <p>User may disable digital playback for FM HD Radio or hybrid FM/DAB with
431      * this option. This is purely user choice, ie. does not reflect digital-
432      * analog handover managed from the HAL implementation side.
433      *
434      * <p>Some radio technologies may not support this, ie. DAB.
435      *
436      * @param isForced {@code true} to force analog, {@code false} for a default behaviour.
437      * @throws IllegalStateException if the switch is not supported at current
438      *         configuration.
439      * @deprecated Use {@link #setConfigFlag(int, boolean)}  instead.
440      */
441     @Deprecated
442     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
setAnalogForced(boolean isForced)443     public abstract void setAnalogForced(boolean isForced);
444 
445     /**
446      * Checks, if a given config flag is supported
447      *
448      * @param flag Flag to check.
449      * @return True, if the flag is supported.
450      */
451     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
isConfigFlagSupported(@adioManager.ConfigFlag int flag)452     public boolean isConfigFlagSupported(@RadioManager.ConfigFlag int flag) {
453         return false;
454     }
455 
456     /**
457      * Fetches the current setting of a given config flag.
458      *
459      * <p>The success/failure result is consistent with isConfigFlagSupported.
460      *
461      * @param flag Flag to fetch.
462      * @return The current value of the flag.
463      * @throws IllegalStateException if the flag is not applicable right now.
464      * @throws UnsupportedOperationException if the flag is not supported at all.
465      */
466     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
isConfigFlagSet(@adioManager.ConfigFlag int flag)467     public boolean isConfigFlagSet(@RadioManager.ConfigFlag int flag) {
468         throw new UnsupportedOperationException("isConfigFlagSet is not supported");
469     }
470 
471     /**
472      * Sets the config flag.
473      *
474      * <p>The success/failure result is consistent with isConfigFlagSupported.
475      *
476      * <p>When this operation is called by users other than current user or system user,
477      * it is ignored silently.
478      *
479      * @param flag Flag to set.
480      * @param value The new value of a given flag.
481      * @throws IllegalStateException if the flag is not applicable right now.
482      * @throws UnsupportedOperationException if the flag is not supported at all.
483      */
484     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
setConfigFlag(@adioManager.ConfigFlag int flag, boolean value)485     public void setConfigFlag(@RadioManager.ConfigFlag int flag, boolean value) {
486         throw new UnsupportedOperationException("Setting config flag is not supported");
487     }
488 
489     /**
490      * Generic method for setting vendor-specific parameter values.
491      * The framework does not interpret the parameters, they are passed
492      * in an opaque manner between a vendor application and HAL.
493      *
494      * <p>Framework does not make any assumptions on the keys or values, other than
495      * ones stated in VendorKeyValue documentation (a requirement of key
496      * prefixes).
497      * See VendorKeyValue at hardware/interfaces/broadcastradio/2.0/types.hal for
498      * HIDL 2.0 HAL or
499      * hardware/interfaces/broadcastradio/aidl/android/hardware/broadcastradio/VendorKeyValue.aidl
500      * for AIDL HAL.
501      *
502      * <p>For each pair in the result map, the key will be one of the keys
503      * contained in the input (possibly with wildcards expanded), and the value
504      * will be a vendor-specific result status (such as "OK" or an error code).
505      * The implementation may choose to return an empty map, or only return
506      * a status for a subset of the provided inputs, at its discretion.
507      *
508      * <p>Application and HAL must not use keys with unknown prefix. In particular,
509      * it must not place a key-value pair in results vector for unknown key from
510      * parameters vector - instead, an unknown key should simply be ignored.
511      * In other words, results vector may contain a subset of parameter keys
512      * (however, the framework doesn't enforce a strict subset - the only
513      * formal requirement is vendor domain prefix for keys).
514      *
515      * <p>When this operation is called by users other than current user or system user,
516      * it is ignored silently.
517      *
518      * @param parameters Vendor-specific key-value pairs.
519      * @return Operation completion status for parameters being set.
520      */
521     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
522     public @NonNull Map<String, String>
setParameters(@onNull Map<String, String> parameters)523             setParameters(@NonNull Map<String, String> parameters) {
524         throw new UnsupportedOperationException("Setting parameters is not supported");
525     }
526 
527     /**
528      * Generic method for retrieving vendor-specific parameter values.
529      * The framework does not interpret the parameters, they are passed
530      * in an opaque manner between a vendor application and HAL.
531      *
532      * <p>Framework does not cache set/get requests, so it's possible for
533      * getParameter to return a different value than previous setParameter call.
534      *
535      * <p>The syntax and semantics of keys are up to the vendor (as long as prefix
536      * rules are obeyed). For instance, vendors may include some form of
537      * wildcard support. In such case, result vector may be of different size
538      * than requested keys vector. However, wildcards are not recognized by
539      * framework and they are passed as-is to the HAL implementation.
540      *
541      * <p>Unknown keys must be ignored and not placed into results vector.
542      *
543      * @param keys Parameter keys to fetch.
544      * @return Vendor-specific key-value pairs.
545      */
546     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
547     public @NonNull Map<String, String>
getParameters(@onNull List<String> keys)548             getParameters(@NonNull List<String> keys) {
549         throw new UnsupportedOperationException("Getting parameters is not supported");
550     }
551 
552     /**
553      * Get current antenna connection state for current configuration.
554      * Only valid if a configuration has been applied.
555      * @return {@code true} if the antenna is connected, {@code false} otherwise.
556      *
557      * @deprecated Use {@link Callback#onAntennaState(boolean)} callback instead
558      */
559     @Deprecated
560     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
isAntennaConnected()561     public abstract boolean isAntennaConnected();
562 
563     /**
564      * Indicates if this client actually controls the tuner.
565      *
566      * <p>Control is always granted after
567      * {@link RadioManager#openTuner(int,
568      * RadioManager.BandConfig, boolean, Callback, Handler)}
569      * returns a non null tuner interface.
570      * Control is lost when another client opens an interface on the same tuner.
571      * When this happens, {@link Callback#onControlChanged(boolean)} is received.
572      * The client can either wait for control to be returned (which is indicated by the same
573      * callback) or close and reopen the tuner interface.
574      *
575      * @return {@code true} if this interface controls the tuner,
576      * {@code false} otherwise or if a problem occured retrieving the state.
577      */
578     @RequiresPermission(Manifest.permission.ACCESS_BROADCAST_RADIO)
hasControl()579     public abstract boolean hasControl();
580 
581     /** Indicates a failure of radio IC or driver.
582      *
583      * <p>The application must close and re open the tuner
584      *
585      * @deprecated See {@link RadioTuner.Callback#onError(int)} callback.
586      */
587     @Deprecated
588     public static final int ERROR_HARDWARE_FAILURE = 0;
589     /** Indicates a failure of the radio service.
590      *
591      * <p>The application must close and re open the tuner
592      * @deprecated See {@link RadioTuner.Callback#onError(int)} callback.
593      */
594     @Deprecated
595     public static final  int ERROR_SERVER_DIED = 1;
596     /** A pending seek or tune operation was cancelled
597      * @deprecated See {@link RadioTuner.Callback#onError(int)} callback.
598      */
599     @Deprecated
600     public static final  int ERROR_CANCELLED = 2;
601     /** A pending seek or tune operation timed out
602      * @deprecated See {@link RadioTuner.Callback#onError(int)} callback.
603      */
604     @Deprecated
605     public static final  int ERROR_SCAN_TIMEOUT = 3;
606     /** The requested configuration could not be applied
607      * @deprecated See {@link RadioTuner.Callback#onError(int)} callback.
608      */
609     @Deprecated
610     public static final  int ERROR_CONFIG = 4;
611     /** Background scan was interrupted due to hardware becoming temporarily unavailable.
612      * @deprecated See {@link RadioTuner.Callback#onError(int)} callback.
613      */
614     @Deprecated
615     public static final int ERROR_BACKGROUND_SCAN_UNAVAILABLE = 5;
616     /** Background scan failed due to other error, ie. HW failure.
617      * @deprecated See {@link RadioTuner.Callback#onError(int)} callback.
618      */
619     @Deprecated
620     public static final int ERROR_BACKGROUND_SCAN_FAILED = 6;
621     /** Result when a tune, seek, or step operation runs without error.
622      */
623     public static final int TUNER_RESULT_OK = 0;
624     /** Result when internal error occurs in HAL.
625      * See {@link RadioTuner.Callback#onTuneFailed(int, ProgramSelector)} callback.
626      */
627     public static final int TUNER_RESULT_INTERNAL_ERROR = 1;
628     /** Result used when the input argument for the method is invalid.
629      * See {@link RadioTuner.Callback#onTuneFailed(int, ProgramSelector)} callback.
630      */
631     public static final int TUNER_RESULT_INVALID_ARGUMENTS = 2;
632     /** Result when HAL is of invalid state.
633      * See {@link RadioTuner.Callback#onTuneFailed(int, ProgramSelector)} callback.
634      */
635     public static final int TUNER_RESULT_INVALID_STATE = 3;
636     /** Result when the operation is not supported.
637      * See {@link RadioTuner.Callback#onTuneFailed(int, ProgramSelector)} callback.
638      */
639     public static final int TUNER_RESULT_NOT_SUPPORTED = 4;
640     /** Result when a tune, seek, or step operation is timeout
641      * See {@link RadioTuner.Callback#onTuneFailed(int, ProgramSelector)} callback.
642      */
643     public static final int TUNER_RESULT_TIMEOUT = 5;
644     /** Result when a tune, seek, or step operation is canceled before processed.
645      * See {@link RadioTuner.Callback#onTuneFailed(int, ProgramSelector)} callback.
646      */
647     public static final int TUNER_RESULT_CANCELED = 6;
648     /** Result when a tune, seek, or step operation fails due to unknown error.
649      * See {@link RadioTuner.Callback#onTuneFailed(int, ProgramSelector)} callback.
650      */
651     public static final int TUNER_RESULT_UNKNOWN_ERROR = 7;
652 
653     /**
654      *  Tuning operation result types
655      *
656      * @hide
657      */
658     @IntDef(prefix = { "TUNER_RESULT_" }, value = {
659             TUNER_RESULT_OK,
660             TUNER_RESULT_INTERNAL_ERROR,
661             TUNER_RESULT_INVALID_ARGUMENTS,
662             TUNER_RESULT_INVALID_STATE,
663             TUNER_RESULT_NOT_SUPPORTED,
664             TUNER_RESULT_TIMEOUT,
665             TUNER_RESULT_CANCELED,
666             TUNER_RESULT_UNKNOWN_ERROR,
667     })
668     @Retention(RetentionPolicy.SOURCE)
669     public @interface TunerResultType{}
670 
671     /**
672      * Callback provided by the client application when opening a {@link RadioTuner}
673      * to receive asynchronous operation results, updates and error notifications.
674      */
675     public static abstract class Callback {
676         /**
677          * onError() is called when an error occured while performing an asynchronous
678          * operation of when the hardware or system service experiences a problem.
679          * status is one of {@link #ERROR_HARDWARE_FAILURE}, {@link #ERROR_SERVER_DIED},
680          * {@link #ERROR_CANCELLED}, {@link #ERROR_SCAN_TIMEOUT},
681          * {@link #ERROR_CONFIG}
682          *
683          * @deprecated Use {@link RadioTuner.Callback#onTuneFailed(int, ProgramSelector)} for
684          *             tune, scan and step; other use cases (configuration, background scan)
685          *             are already deprecated.
686          */
onError(int status)687         public void onError(int status) {}
688 
689         /**
690          * Called when tune, scan or step operation fails.
691          *
692          * @param result cause of the failure
693          * @param selector ProgramSelector argument of tune that failed;
694          *                 null for scan and step.
695          */
onTuneFailed(@unerResultType int result, @Nullable ProgramSelector selector)696         public void onTuneFailed(@TunerResultType int result, @Nullable ProgramSelector selector) {}
697 
698         /**
699          * onConfigurationChanged() is called upon successful completion of
700          * {@link RadioManager#openTuner(int, RadioManager.BandConfig, boolean, Callback, Handler)}
701          * or {@link RadioTuner#setConfiguration(RadioManager.BandConfig)}
702          *
703          * @deprecated Only applicable for HAL 1.x.
704          */
705         @Deprecated
onConfigurationChanged(RadioManager.BandConfig config)706         public void onConfigurationChanged(RadioManager.BandConfig config) {}
707 
708         /**
709          * Called when program info (including metadata) for the current program has changed.
710          *
711          * <p>It happens either upon successful completion of {@link RadioTuner#step(int, boolean)},
712          * {@link RadioTuner#scan(int, boolean)}, {@link RadioTuner#tune(int, int)}; when
713          * a switching to alternate frequency occurs; or when metadata is updated.
714          */
onProgramInfoChanged(RadioManager.ProgramInfo info)715         public void onProgramInfoChanged(RadioManager.ProgramInfo info) {}
716 
717         /**
718          * Called when metadata is updated for the current program.
719          *
720          * @deprecated Use {@link #onProgramInfoChanged(RadioManager.ProgramInfo)} instead.
721          */
722         @Deprecated
onMetadataChanged(RadioMetadata metadata)723         public void onMetadataChanged(RadioMetadata metadata) {}
724 
725         /**
726          * onTrafficAnnouncement() is called when a traffic announcement starts and stops.
727          */
onTrafficAnnouncement(boolean active)728         public void onTrafficAnnouncement(boolean active) {}
729         /**
730          * onEmergencyAnnouncement() is called when an emergency annoucement starts and stops.
731          */
onEmergencyAnnouncement(boolean active)732         public void onEmergencyAnnouncement(boolean active) {}
733         /**
734          * onAntennaState() is called when the antenna is connected or disconnected.
735          */
onAntennaState(boolean connected)736         public void onAntennaState(boolean connected) {}
737         /**
738          * onControlChanged() is called when the client loses or gains control of the radio tuner.
739          * The control is always granted after a successful call to
740          * {@link RadioManager#openTuner(int, RadioManager.BandConfig, boolean, Callback, Handler)}.
741          * If another client opens the same tuner, onControlChanged() will be called with
742          * control set to {@code false} to indicate loss of control.
743          * At this point, RadioTuner APIs other than getters will return
744          * {@link RadioManager#STATUS_INVALID_OPERATION}.
745          * When the other client releases the tuner, onControlChanged() will be called
746          * with control set to {@code true}.
747          */
onControlChanged(boolean control)748         public void onControlChanged(boolean control) {}
749 
750         /**
751          * onBackgroundScanAvailabilityChange() is called when background scan
752          * feature becomes available or not.
753          *
754          * @param isAvailable true, if the tuner turned temporarily background-
755          *                    capable, false in the other case.
756          */
onBackgroundScanAvailabilityChange(boolean isAvailable)757         public void onBackgroundScanAvailabilityChange(boolean isAvailable) {}
758 
759         /**
760          * Called when a background scan completes successfully.
761          */
onBackgroundScanComplete()762         public void onBackgroundScanComplete() {}
763 
764         /**
765          * Called when available program list changed.
766          *
767          * Use {@link RadioTuner#getProgramList(Map)} to get an actual list.
768          */
onProgramListChanged()769         public void onProgramListChanged() {}
770 
771         /**
772          * Called when config flags are updated asynchronously due to internal events
773          * in broadcast radio HAL.
774          *
775          * {@link RadioTuner#setConfigFlag(int, boolean)} must not trigger this
776          * callback.
777          *
778          * @param flag Config flag updated
779          * @param value Value of the updated config flag
780          */
onConfigFlagUpdated(@adioManager.ConfigFlag int flag, boolean value)781         public void onConfigFlagUpdated(@RadioManager.ConfigFlag int flag, boolean value) {}
782 
783         /**
784          * Generic callback for passing updates to vendor-specific parameter values.
785          *
786          * <p>The framework does not interpret the parameters, they are passed
787          * in an opaque manner between a vendor application and HAL.
788          *
789          * <p>It's up to the HAL implementation if and how to implement this callback,
790          * as long as it obeys the prefix rule. In particular, only selected keys
791          * may be notified this way. However, setParameters must not trigger
792          * this callback, while an internal event can change parameters
793          * asynchronously.
794          *
795          * @param parameters Vendor-specific key-value pairs.
796          */
onParametersUpdated(@onNull Map<String, String> parameters)797         public void onParametersUpdated(@NonNull Map<String, String> parameters) {}
798     }
799 
800 }
801 
802