12035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent/** 22035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Copyright (C) 2015 The Android Open Source Project 32035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * 42035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 52035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * you may not use this file except in compliance with the License. 62035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * You may obtain a copy of the License at 72035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * 82035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * http://www.apache.org/licenses/LICENSE-2.0 92035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * 102035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Unless required by applicable law or agreed to in writing, software 112035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 122035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * See the License for the specific language governing permissions and 142035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * limitations under the License. 152035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 162035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 172035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurentpackage android.hardware.radio; 182035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 192035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurentimport android.annotation.SystemApi; 202035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurentimport android.content.Context; 212035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurentimport android.os.Handler; 222035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurentimport android.os.Parcel; 232035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurentimport android.os.Parcelable; 242035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurentimport java.util.List; 252035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurentimport java.util.Arrays; 262035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 272035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent/** 282035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * The RadioManager class allows to control a broadcast radio tuner present on the device. 292035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * It provides data structures and methods to query for available radio modules, list their 302035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * properties and open an interface to control tuning operations and receive callbacks when 312035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * asynchronous operations complete or events occur. 322035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @hide 332035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 342035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent@SystemApi 352035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurentpublic class RadioManager { 362035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 372035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Method return status: successful operation */ 382035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int STATUS_OK = 0; 392035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Method return status: unspecified error */ 402035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int STATUS_ERROR = Integer.MIN_VALUE; 412035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Method return status: permission denied */ 422035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int STATUS_PERMISSION_DENIED = -1; 432035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Method return status: initialization failure */ 442035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int STATUS_NO_INIT = -19; 452035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Method return status: invalid argument provided */ 462035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int STATUS_BAD_VALUE = -22; 472035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Method return status: cannot reach service */ 482035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int STATUS_DEAD_OBJECT = -32; 492035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Method return status: invalid or out of sequence operation */ 502035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int STATUS_INVALID_OPERATION = -38; 512035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Method return status: time out before operation completion */ 522035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int STATUS_TIMED_OUT = -110; 532035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 542035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 552035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent // keep in sync with radio_class_t in /system/core/incluse/system/radio.h 562035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Radio module class supporting FM (including HD radio) and AM */ 572035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int CLASS_AM_FM = 0; 582035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Radio module class supporting satellite radio */ 592035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int CLASS_SAT = 1; 602035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Radio module class supporting Digital terrestrial radio */ 612035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int CLASS_DT = 2; 622035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 632035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent // keep in sync with radio_band_t in /system/core/incluse/system/radio.h 642035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** AM radio band (LW/MW/SW). 652035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @see BandDescriptor */ 662035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int BAND_AM = 0; 672035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** FM radio band. 682035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @see BandDescriptor */ 692035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int BAND_FM = 1; 702035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** FM HD radio or DRM band. 712035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @see BandDescriptor */ 722035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int BAND_FM_HD = 2; 732035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** AM HD radio or DRM band. 742035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @see BandDescriptor */ 752035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int BAND_AM_HD = 3; 762035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 772035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent // keep in sync with radio_region_t in /system/core/incluse/system/radio.h 782035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Africa, Europe. 792035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @see BandDescriptor */ 802035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int REGION_ITU_1 = 0; 812035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Americas. 822035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @see BandDescriptor */ 832035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int REGION_ITU_2 = 1; 842035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Russia. 852035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @see BandDescriptor */ 862035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int REGION_OIRT = 2; 872035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Japan. 882035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @see BandDescriptor */ 892035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int REGION_JAPAN = 3; 902035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Korea. 912035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @see BandDescriptor */ 922035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final int REGION_KOREA = 4; 932035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 942035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /***************************************************************************** 952035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Lists properties, options and radio bands supported by a given broadcast radio module. 962035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Each module has a unique ID used to address it when calling RadioManager APIs. 972035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Module properties are returned by {@link #listModules(List <ModuleProperties>)} method. 982035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent ****************************************************************************/ 992035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static class ModuleProperties implements Parcelable { 1002035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 1012035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final int mId; 1022035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final int mClassId; 1032035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final String mImplementor; 1042035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final String mProduct; 1052035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final String mVersion; 1062035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final String mSerial; 1072035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final int mNumTuners; 1082035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final int mNumAudioSources; 1092035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final boolean mIsCaptureSupported; 1102035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final BandDescriptor[] mBands; 1112035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 1122035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent ModuleProperties(int id, int classId, String implementor, String product, String version, 1132035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent String serial, int numTuners, int numAudioSources, boolean isCaptureSupported, 1142035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent BandDescriptor[] bands) { 1152035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mId = id; 1162035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mClassId = classId; 1172035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mImplementor = implementor; 1182035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mProduct = product; 1192035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mVersion = version; 1202035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mSerial = serial; 1212035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mNumTuners = numTuners; 1222035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mNumAudioSources = numAudioSources; 1232035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mIsCaptureSupported = isCaptureSupported; 1242035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mBands = bands; 1252035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 1262035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 1272035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 1282035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Unique module identifier provided by the native service. 1292035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * For use with {@link #openTuner(int, BandConfig, boolean, Callback, Handler)}. 1302035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the radio module unique identifier. 1312035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 1322035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int getId() { 1332035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mId; 1342035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 1352035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 1362035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Module class identifier: {@link #CLASS_AM_FM}, {@link #CLASS_SAT}, {@link #CLASS_DT} 1372035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the radio module class identifier. 1382035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 1392035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int getClassId() { 1402035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mClassId; 1412035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 1422035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 1432035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Human readable broadcast radio module implementor 1442035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the name of the radio module implementator. 1452035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 1462035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public String getImplementor() { 1472035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mImplementor; 1482035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 1492035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 1502035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Human readable broadcast radio module product name 1512035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the radio module product name. 1522035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 1532035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public String getProduct() { 1542035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mProduct; 1552035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 1562035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 1572035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Human readable broadcast radio module version number 1582035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the radio module version. 1592035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 1602035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public String getVersion() { 1612035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mVersion; 1622035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 1632035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 1642035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Radio module serial number. 1652035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Can be used for subscription services. 1662035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the radio module serial number. 1672035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 1682035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public String getSerial() { 1692035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mSerial; 1702035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 1712035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 1722035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Number of tuners available. 1732035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * This is the number of tuners that can be open simultaneously. 1742035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the number of tuners supported. 1752035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 1762035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int getNumTuners() { 1772035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mNumTuners; 1782035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 1792035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 1802035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Number tuner audio sources available. Must be less or equal to getNumTuners(). 1812035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * When more than one tuner is supported, one is usually for playback and has one 1822035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * associated audio source and the other is for pre scanning and building a 1832035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * program list. 1842035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the number of audio sources available. 1852035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 1862035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int getNumAudioSources() { 1872035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mNumAudioSources; 1882035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 1892035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 1902035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** {@code true} if audio capture is possible from radio tuner output. 1912035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * This indicates if routing to audio devices not connected to the same HAL as the FM radio 1922035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * is possible (e.g. to USB) or DAR (Digital Audio Recorder) feature can be implemented. 1932035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return {@code true} if audio capture is possible, {@code false} otherwise. 1942035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 1952035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean isCaptureSupported() { 1962035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mIsCaptureSupported; 1972035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 1982035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 1992035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** List of descriptors for all bands supported by this module. 2002035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return an array of {@link BandDescriptor}. 2012035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 2022035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public BandDescriptor[] getBands() { 2032035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mBands; 2042035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 2052035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 2062035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private ModuleProperties(Parcel in) { 2072035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mId = in.readInt(); 2082035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mClassId = in.readInt(); 2092035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mImplementor = in.readString(); 2102035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mProduct = in.readString(); 2112035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mVersion = in.readString(); 2122035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mSerial = in.readString(); 2132035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mNumTuners = in.readInt(); 2142035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mNumAudioSources = in.readInt(); 2152035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mIsCaptureSupported = in.readInt() == 1; 2162035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent Parcelable[] tmp = in.readParcelableArray(BandDescriptor.class.getClassLoader()); 2172035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mBands = new BandDescriptor[tmp.length]; 2182035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent for (int i = 0; i < tmp.length; i++) { 2192035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mBands[i] = (BandDescriptor) tmp[i]; 2202035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 2212035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 2222035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 2232035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final Parcelable.Creator<ModuleProperties> CREATOR 2242035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent = new Parcelable.Creator<ModuleProperties>() { 2252035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public ModuleProperties createFromParcel(Parcel in) { 2262035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return new ModuleProperties(in); 2272035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 2282035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 2292035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public ModuleProperties[] newArray(int size) { 2302035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return new ModuleProperties[size]; 2312035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 2322035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent }; 2332035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 2342035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 2352035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public void writeToParcel(Parcel dest, int flags) { 2362035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeInt(mId); 2372035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeInt(mClassId); 2382035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeString(mImplementor); 2392035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeString(mProduct); 2402035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeString(mVersion); 2412035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeString(mSerial); 2422035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeInt(mNumTuners); 2432035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeInt(mNumAudioSources); 2442035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeInt(mIsCaptureSupported ? 1 : 0); 2452035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeParcelableArray(mBands, flags); 2462035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 2472035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 2482035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 2492035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int describeContents() { 2502035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return 0; 2512035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 2522035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 2532035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 2542035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public String toString() { 2552035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return "ModuleProperties [mId=" + mId + ", mClassId=" + mClassId 2562035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent + ", mImplementor=" + mImplementor + ", mProduct=" + mProduct 2572035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent + ", mVersion=" + mVersion + ", mSerial=" + mSerial 2582035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent + ", mNumTuners=" + mNumTuners 2592035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent + ", mNumAudioSources=" + mNumAudioSources 2602035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent + ", mIsCaptureSupported=" + mIsCaptureSupported 2612035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent + ", mBands=" + Arrays.toString(mBands) + "]"; 2622035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 2632035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 2642035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 2652035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int hashCode() { 2662035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent final int prime = 31; 2672035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent int result = 1; 2682035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + mId; 2692035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + mClassId; 2702035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + ((mImplementor == null) ? 0 : mImplementor.hashCode()); 2712035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + ((mProduct == null) ? 0 : mProduct.hashCode()); 2722035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + ((mVersion == null) ? 0 : mVersion.hashCode()); 2732035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + ((mSerial == null) ? 0 : mSerial.hashCode()); 2742035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + mNumTuners; 2752035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + mNumAudioSources; 2762035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + (mIsCaptureSupported ? 1 : 0); 2772035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + Arrays.hashCode(mBands); 2782035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return result; 2792035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 2802035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 2812035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 2822035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean equals(Object obj) { 2832035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (this == obj) 2842035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return true; 2852035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (!(obj instanceof ModuleProperties)) 2862035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 2872035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent ModuleProperties other = (ModuleProperties) obj; 2882035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mId != other.getId()) 2892035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 2902035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mClassId != other.getClassId()) 2912035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 2922035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mImplementor == null) { 2932035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (other.getImplementor() != null) 2942035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 2952035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } else if (!mImplementor.equals(other.getImplementor())) 2962035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 2972035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mProduct == null) { 2982035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (other.getProduct() != null) 2992035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 3002035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } else if (!mProduct.equals(other.getProduct())) 3012035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 3022035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mVersion == null) { 3032035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (other.getVersion() != null) 3042035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 3052035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } else if (!mVersion.equals(other.getVersion())) 3062035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 3072035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mSerial == null) { 3082035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (other.getSerial() != null) 3092035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 3102035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } else if (!mSerial.equals(other.getSerial())) 3112035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 3122035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mNumTuners != other.getNumTuners()) 3132035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 3142035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mNumAudioSources != other.getNumAudioSources()) 3152035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 3162035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mIsCaptureSupported != other.isCaptureSupported()) 3172035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 3182035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (!Arrays.equals(mBands, other.getBands())) 3192035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 3202035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return true; 3212035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 3222035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 3232035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 3242035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Radio band descriptor: an element in ModuleProperties bands array. 3252035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * It is either an instance of {@link FmBandDescriptor} or {@link AmBandDescriptor} */ 3262035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static class BandDescriptor implements Parcelable { 3272035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 3282035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final int mRegion; 3292035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final int mType; 3302035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final int mLowerLimit; 3312035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final int mUpperLimit; 3322035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final int mSpacing; 3332035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 3342035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent BandDescriptor(int region, int type, int lowerLimit, int upperLimit, int spacing) { 3352035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mRegion = region; 3362035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mType = type; 3372035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mLowerLimit = lowerLimit; 3382035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mUpperLimit = upperLimit; 3392035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mSpacing = spacing; 3402035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 3412035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 3422035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Region this band applies to. E.g. {@link #REGION_ITU_1} 3432035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the region this band is associated to. 3442035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 3452035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int getRegion() { 3462035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mRegion; 3472035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 3482035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Band type, e.g {@link #BAND_FM}. Defines the subclass this descriptor can be cast to: 3492035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * <ul> 3502035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * <li>{@link #BAND_FM} or {@link #BAND_FM_HD} cast to {@link FmBandDescriptor}, </li> 3512035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * <li>{@link #BAND_AM} cast to {@link AmBandDescriptor}, </li> 3522035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * </ul> 3532035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the band type. 3542035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 3552035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int getType() { 3562035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mType; 3572035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 3582035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Lower band limit expressed in units according to band type. 3592035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Currently all defined band types express channels as frequency in kHz 3602035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the lower band limit. 3612035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 3622035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int getLowerLimit() { 3632035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mLowerLimit; 3642035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 3652035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Upper band limit expressed in units according to band type. 3662035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Currently all defined band types express channels as frequency in kHz 3672035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the upper band limit. 3682035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 3692035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int getUpperLimit() { 3702035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mUpperLimit; 3712035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 3722035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Channel spacing in units according to band type. 3732035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Currently all defined band types express channels as frequency in kHz 3742035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the channel spacing. 3752035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 3762035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int getSpacing() { 3772035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mSpacing; 3782035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 3792035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 3802035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private BandDescriptor(Parcel in) { 3812035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mRegion = in.readInt(); 3822035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mType = in.readInt(); 3832035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mLowerLimit = in.readInt(); 3842035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mUpperLimit = in.readInt(); 3852035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mSpacing = in.readInt(); 3862035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 3872035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 3882035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final Parcelable.Creator<BandDescriptor> CREATOR 3892035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent = new Parcelable.Creator<BandDescriptor>() { 3902035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public BandDescriptor createFromParcel(Parcel in) { 3912035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return new BandDescriptor(in); 3922035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 3932035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 3942035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public BandDescriptor[] newArray(int size) { 3952035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return new BandDescriptor[size]; 3962035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 3972035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent }; 3982035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 3992035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 4002035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public void writeToParcel(Parcel dest, int flags) { 4012035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeInt(mRegion); 4022035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeInt(mType); 4032035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeInt(mLowerLimit); 4042035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeInt(mUpperLimit); 4052035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeInt(mSpacing); 4062035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 4072035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 4082035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 4092035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int describeContents() { 4102035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return 0; 4112035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 4122035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 4132035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 4142035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public String toString() { 4152035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return "BandDescriptor [mRegion=" + mRegion + ", mType=" + mType + ", mLowerLimit=" 4162035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent + mLowerLimit + ", mUpperLimit=" + mUpperLimit + ", mSpacing=" + mSpacing + "]"; 4172035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 4182035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 4192035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 4202035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int hashCode() { 4212035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent final int prime = 31; 4222035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent int result = 1; 4232035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + mRegion; 4242035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + mType; 4252035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + mLowerLimit; 4262035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + mUpperLimit; 4272035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + mSpacing; 4282035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return result; 4292035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 4302035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 4312035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 4322035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean equals(Object obj) { 4332035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (this == obj) 4342035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return true; 4352035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (!(obj instanceof BandDescriptor)) 4362035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 4372035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent BandDescriptor other = (BandDescriptor) obj; 4382035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mRegion != other.getRegion()) 4392035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 4402035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mType != other.getType()) 4412035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 4422035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mLowerLimit != other.getLowerLimit()) 4432035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 4442035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mUpperLimit != other.getUpperLimit()) 4452035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 4462035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mSpacing != other.getSpacing()) 4472035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 4482035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return true; 4492035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 4502035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 4512035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 4522035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** FM band descriptor 4532035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @see #BAND_FM 4542035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @see #BAND_FM_HD */ 4552035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static class FmBandDescriptor extends BandDescriptor { 4562035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final boolean mStereo; 4572035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final boolean mRds; 4582035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final boolean mTa; 4592035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final boolean mAf; 4602035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 4612035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent FmBandDescriptor(int region, int type, int lowerLimit, int upperLimit, int spacing, 4622035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent boolean stereo, boolean rds, boolean ta, boolean af) { 4632035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent super(region, type, lowerLimit, upperLimit, spacing); 4642035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = stereo; 4652035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mRds = rds; 4662035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mTa = ta; 4672035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mAf = af; 4682035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 4692035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 4702035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Stereo is supported 4712035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return {@code true} if stereo is supported, {@code false} otherwise. 4722035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 4732035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean isStereoSupported() { 4742035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mStereo; 4752035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 4762035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** RDS or RBDS(if region is ITU2) is supported 4772035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return {@code true} if RDS or RBDS is supported, {@code false} otherwise. 4782035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 4792035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean isRdsSupported() { 4802035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mRds; 4812035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 4822035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Traffic announcement is supported 4832035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return {@code true} if TA is supported, {@code false} otherwise. 4842035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 4852035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean isTaSupported() { 4862035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mTa; 4872035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 4882035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Alternate Frequency Switching is supported 4892035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return {@code true} if AF switching is supported, {@code false} otherwise. 4902035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 4912035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean isAfSupported() { 4922035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mAf; 4932035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 4942035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 4952035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /* Parcelable implementation */ 4962035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private FmBandDescriptor(Parcel in) { 4972035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent super(in); 4982035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = in.readByte() == 1; 4992035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mRds = in.readByte() == 1; 5002035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mTa = in.readByte() == 1; 5012035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mAf = in.readByte() == 1; 5022035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 5032035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 5042035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final Parcelable.Creator<FmBandDescriptor> CREATOR 5052035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent = new Parcelable.Creator<FmBandDescriptor>() { 5062035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public FmBandDescriptor createFromParcel(Parcel in) { 5072035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return new FmBandDescriptor(in); 5082035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 5092035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 5102035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public FmBandDescriptor[] newArray(int size) { 5112035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return new FmBandDescriptor[size]; 5122035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 5132035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent }; 5142035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 5152035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 5162035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public void writeToParcel(Parcel dest, int flags) { 5172035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent super.writeToParcel(dest, flags); 5182035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeByte((byte) (mStereo ? 1 : 0)); 5192035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeByte((byte) (mRds ? 1 : 0)); 5202035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeByte((byte) (mTa ? 1 : 0)); 5212035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeByte((byte) (mAf ? 1 : 0)); 5222035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 5232035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 5242035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 5252035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int describeContents() { 5262035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return 0; 5272035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 5282035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 5292035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 5302035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public String toString() { 5312035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return "FmBandDescriptor [ "+ super.toString() + " mStereo=" + mStereo 5322035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent + ", mRds=" + mRds + ", mTa=" + mTa + ", mAf=" + mAf + "]"; 5332035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 5342035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 5352035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 5362035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int hashCode() { 5372035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent final int prime = 31; 5382035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent int result = super.hashCode(); 5392035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + (mStereo ? 1 : 0); 5402035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + (mRds ? 1 : 0); 5412035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + (mTa ? 1 : 0); 5422035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + (mAf ? 1 : 0); 5432035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return result; 5442035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 5452035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 5462035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 5472035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean equals(Object obj) { 5482035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (this == obj) 5492035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return true; 5502035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (!super.equals(obj)) 5512035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 5522035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (!(obj instanceof FmBandDescriptor)) 5532035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 5542035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent FmBandDescriptor other = (FmBandDescriptor) obj; 5552035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mStereo != other.isStereoSupported()) 5562035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 5572035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mRds != other.isRdsSupported()) 5582035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 5592035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mTa != other.isTaSupported()) 5602035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 5612035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mAf != other.isAfSupported()) 5622035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 5632035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return true; 5642035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 5652035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 5662035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 5672035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** AM band descriptor. 5682035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @see #BAND_AM */ 5692035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static class AmBandDescriptor extends BandDescriptor { 5702035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 5712035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final boolean mStereo; 5722035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 5732035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent AmBandDescriptor(int region, int type, int lowerLimit, int upperLimit, int spacing, 5742035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent boolean stereo) { 5752035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent super(region, type, lowerLimit, upperLimit, spacing); 5762035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = stereo; 5772035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 5782035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 5792035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Stereo is supported 5802035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return {@code true} if stereo is supported, {@code false} otherwise. 5812035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 5822035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean isStereoSupported() { 5832035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mStereo; 5842035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 5852035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 5862035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private AmBandDescriptor(Parcel in) { 5872035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent super(in); 5882035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = in.readByte() == 1; 5892035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 5902035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 5912035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final Parcelable.Creator<AmBandDescriptor> CREATOR 5922035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent = new Parcelable.Creator<AmBandDescriptor>() { 5932035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public AmBandDescriptor createFromParcel(Parcel in) { 5942035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return new AmBandDescriptor(in); 5952035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 5962035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 5972035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public AmBandDescriptor[] newArray(int size) { 5982035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return new AmBandDescriptor[size]; 5992035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 6002035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent }; 6012035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 6022035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 6032035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public void writeToParcel(Parcel dest, int flags) { 6042035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent super.writeToParcel(dest, flags); 6052035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeByte((byte) (mStereo ? 1 : 0)); 6062035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 6072035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 6082035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 6092035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int describeContents() { 6102035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return 0; 6112035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 6122035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 6132035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 6142035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public String toString() { 6152035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return "AmBandDescriptor [ "+ super.toString() + " mStereo=" + mStereo + "]"; 6162035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 6172035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 6182035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 6192035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int hashCode() { 6202035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent final int prime = 31; 6212035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent int result = super.hashCode(); 6222035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + (mStereo ? 1 : 0); 6232035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return result; 6242035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 6252035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 6262035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 6272035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean equals(Object obj) { 6282035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (this == obj) 6292035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return true; 6302035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (!super.equals(obj)) 6312035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 6322035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (!(obj instanceof AmBandDescriptor)) 6332035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 6342035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent AmBandDescriptor other = (AmBandDescriptor) obj; 6352035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mStereo != other.isStereoSupported()) 6362035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 6372035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return true; 6382035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 6392035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 6402035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 6412035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 6422035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Radio band configuration. */ 6432035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static class BandConfig implements Parcelable { 6442035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 6452035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent final BandDescriptor mDescriptor; 6462035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 6472035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent BandConfig(BandDescriptor descriptor) { 6482035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mDescriptor = descriptor; 6492035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 6502035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 6512035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent BandConfig(int region, int type, int lowerLimit, int upperLimit, int spacing) { 6522035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mDescriptor = new BandDescriptor(region, type, lowerLimit, upperLimit, spacing); 6532035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 6542035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 6552035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private BandConfig(Parcel in) { 6562035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mDescriptor = new BandDescriptor(in); 6572035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 6582035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 6592035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent BandDescriptor getDescriptor() { 6602035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mDescriptor; 6612035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 6622035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 6632035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Region this band applies to. E.g. {@link #REGION_ITU_1} 6642035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the region associated with this band. 6652035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 6662035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int getRegion() { 6672035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mDescriptor.getRegion(); 6682035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 6692035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Band type, e.g {@link #BAND_FM}. Defines the subclass this descriptor can be cast to: 6702035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * <ul> 6712035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * <li>{@link #BAND_FM} or {@link #BAND_FM_HD} cast to {@link FmBandDescriptor}, </li> 6722035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * <li>{@link #BAND_AM} cast to {@link AmBandDescriptor}, </li> 6732035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * </ul> 6742035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the band type. 6752035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 6762035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int getType() { 6772035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mDescriptor.getType(); 6782035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 6792035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Lower band limit expressed in units according to band type. 6802035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Currently all defined band types express channels as frequency in kHz 6812035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the lower band limit. 6822035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 6832035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int getLowerLimit() { 6842035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mDescriptor.getLowerLimit(); 6852035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 6862035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Upper band limit expressed in units according to band type. 6872035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Currently all defined band types express channels as frequency in kHz 6882035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the upper band limit. 6892035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 6902035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int getUpperLimit() { 6912035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mDescriptor.getUpperLimit(); 6922035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 6932035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Channel spacing in units according to band type. 6942035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Currently all defined band types express channels as frequency in kHz 6952035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the channel spacing. 6962035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 6972035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int getSpacing() { 6982035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mDescriptor.getSpacing(); 6992035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 7002035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 7012035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 7022035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final Parcelable.Creator<BandConfig> CREATOR 7032035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent = new Parcelable.Creator<BandConfig>() { 7042035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public BandConfig createFromParcel(Parcel in) { 7052035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return new BandConfig(in); 7062035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 7072035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 7082035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public BandConfig[] newArray(int size) { 7092035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return new BandConfig[size]; 7102035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 7112035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent }; 7122035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 7132035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 7142035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public void writeToParcel(Parcel dest, int flags) { 7152035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mDescriptor.writeToParcel(dest, flags); 7162035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 7172035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 7182035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 7192035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int describeContents() { 7202035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return 0; 7212035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 7222035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 7232035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 7242035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public String toString() { 7252035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return "BandConfig [ " + mDescriptor.toString() + "]"; 7262035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 7272035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 7282035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 7292035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int hashCode() { 7302035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent final int prime = 31; 7312035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent int result = 1; 7322035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + mDescriptor.hashCode(); 7332035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return result; 7342035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 7352035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 7362035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 7372035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean equals(Object obj) { 7382035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (this == obj) 7392035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return true; 7402035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (!(obj instanceof BandConfig)) 7412035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 7422035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent BandConfig other = (BandConfig) obj; 7432035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mDescriptor != other.getDescriptor()) 7442035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 7452035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return true; 7462035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 7472035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 7482035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 7492035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** FM band configuration. 7502035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @see #BAND_FM 7512035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @see #BAND_FM_HD */ 7522035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static class FmBandConfig extends BandConfig { 7532035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final boolean mStereo; 7542035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final boolean mRds; 7552035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final boolean mTa; 7562035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final boolean mAf; 7572035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 7582035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent FmBandConfig(FmBandDescriptor descriptor) { 7592035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent super((BandDescriptor)descriptor); 7602035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = descriptor.isStereoSupported(); 7612035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mRds = descriptor.isRdsSupported(); 7622035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mTa = descriptor.isTaSupported(); 7632035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mAf = descriptor.isAfSupported(); 7642035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 7652035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 7662035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent FmBandConfig(int region, int type, int lowerLimit, int upperLimit, int spacing, 7672035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent boolean stereo, boolean rds, boolean ta, boolean af) { 7682035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent super(region, type, lowerLimit, upperLimit, spacing); 7692035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = stereo; 7702035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mRds = rds; 7712035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mTa = ta; 7722035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mAf = af; 7732035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 7742035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 7752035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Get stereo enable state 7762035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the enable state. 7772035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 7782035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean getStereo() { 7792035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mStereo; 7802035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 7812035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 7822035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Get RDS or RBDS(if region is ITU2) enable state 7832035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the enable state. 7842035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 7852035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean getRds() { 7862035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mRds; 7872035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 7882035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 7892035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Get Traffic announcement enable state 7902035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the enable state. 7912035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 7922035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean getTa() { 7932035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mTa; 7942035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 7952035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 7962035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Get Alternate Frequency Switching enable state 7972035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the enable state. 7982035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 7992035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean getAf() { 8002035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mAf; 8012035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 8022035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 8032035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private FmBandConfig(Parcel in) { 8042035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent super(in); 8052035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = in.readByte() == 1; 8062035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mRds = in.readByte() == 1; 8072035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mTa = in.readByte() == 1; 8082035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mAf = in.readByte() == 1; 8092035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 8102035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 8112035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final Parcelable.Creator<FmBandConfig> CREATOR 8122035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent = new Parcelable.Creator<FmBandConfig>() { 8132035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public FmBandConfig createFromParcel(Parcel in) { 8142035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return new FmBandConfig(in); 8152035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 8162035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 8172035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public FmBandConfig[] newArray(int size) { 8182035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return new FmBandConfig[size]; 8192035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 8202035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent }; 8212035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 8222035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 8232035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public void writeToParcel(Parcel dest, int flags) { 8242035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent super.writeToParcel(dest, flags); 8252035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeByte((byte) (mStereo ? 1 : 0)); 8262035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeByte((byte) (mRds ? 1 : 0)); 8272035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeByte((byte) (mTa ? 1 : 0)); 8282035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeByte((byte) (mAf ? 1 : 0)); 8292035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 8302035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 8312035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 8322035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int describeContents() { 8332035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return 0; 8342035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 8352035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 8362035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 8372035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public String toString() { 8382035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return "FmBandConfig [" + super.toString() 8392035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent + ", mStereo=" + mStereo + ", mRds=" + mRds + ", mTa=" + mTa 8402035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent + ", mAf=" + mAf + "]"; 8412035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 8422035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 8432035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 8442035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int hashCode() { 8452035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent final int prime = 31; 8462035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent int result = super.hashCode(); 8472035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + (mStereo ? 1 : 0); 8482035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + (mRds ? 1 : 0); 8492035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + (mTa ? 1 : 0); 8502035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + (mAf ? 1 : 0); 8512035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return result; 8522035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 8532035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 8542035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 8552035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean equals(Object obj) { 8562035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (this == obj) 8572035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return true; 8582035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (!super.equals(obj)) 8592035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 8602035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (!(obj instanceof FmBandConfig)) 8612035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 8622035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent FmBandConfig other = (FmBandConfig) obj; 8632035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mStereo != other.mStereo) 8642035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 8652035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mRds != other.mRds) 8662035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 8672035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mTa != other.mTa) 8682035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 8692035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mAf != other.mAf) 8702035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 8712035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return true; 8722035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 8732035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 8742035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** 8752035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Builder class for {@link FmBandConfig} objects. 8762035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 8772035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static class Builder { 8782035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final BandDescriptor mDescriptor; 8792035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private boolean mStereo; 8802035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private boolean mRds; 8812035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private boolean mTa; 8822035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private boolean mAf; 8832035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 8842035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** 8852035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Constructs a new Builder with the defaults from an {@link FmBandDescriptor} . 8862035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @param descriptor the FmBandDescriptor defaults are read from . 8872035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 8882035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public Builder(FmBandDescriptor descriptor) { 8892035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mDescriptor = new BandDescriptor(descriptor.getRegion(), descriptor.getType(), 8902035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent descriptor.getLowerLimit(), descriptor.getUpperLimit(), 8912035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent descriptor.getSpacing()); 8922035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = descriptor.isStereoSupported(); 8932035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mRds = descriptor.isRdsSupported(); 8942035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mTa = descriptor.isTaSupported(); 8952035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mAf = descriptor.isAfSupported(); 8962035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 8972035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 8982035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** 8992035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Constructs a new Builder from a given {@link FmBandConfig} 9002035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @param config the FmBandConfig object whose data will be reused in the new Builder. 9012035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 9022035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public Builder(FmBandConfig config) { 9032035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mDescriptor = new BandDescriptor(config.getRegion(), config.getType(), 9042035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent config.getLowerLimit(), config.getUpperLimit(), config.getSpacing()); 9052035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = config.getStereo(); 9062035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mRds = config.getRds(); 9072035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mTa = config.getTa(); 9082035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mAf = config.getAf(); 9092035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 9102035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 9112035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** 9122035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Combines all of the parameters that have been set and return a new 9132035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * {@link FmBandConfig} object. 9142035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return a new {@link FmBandConfig} object 9152035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 9162035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public FmBandConfig build() { 9172035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent FmBandConfig config = new FmBandConfig(mDescriptor.getRegion(), 9182035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mDescriptor.getType(), mDescriptor.getLowerLimit(), 9192035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mDescriptor.getUpperLimit(), mDescriptor.getSpacing(), 9202035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo, mRds, mTa, mAf); 9212035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return config; 9222035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 9232035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 9242035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Set stereo enable state 9252035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @param state The new enable state. 9262035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the same Builder instance. 9272035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 9282035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public Builder setStereo(boolean state) { 9292035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = state; 9302035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return this; 9312035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 9322035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 9332035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Set RDS or RBDS(if region is ITU2) enable state 9342035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @param state The new enable state. 9352035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the same Builder instance. 9362035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 9372035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public Builder setRds(boolean state) { 9382035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mRds = state; 9392035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return this; 9402035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 9412035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 9422035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Set Traffic announcement enable state 9432035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @param state The new enable state. 9442035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the same Builder instance. 9452035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 9462035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public Builder setTa(boolean state) { 9472035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mTa = state; 9482035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return this; 9492035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 9502035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 9512035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Set Alternate Frequency Switching enable state 9522035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @param state The new enable state. 9532035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the same Builder instance. 9542035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 9552035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public Builder setAf(boolean state) { 9562035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mAf = state; 9572035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return this; 9582035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 9592035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent }; 9602035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 9612035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 9622035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** AM band configuration. 9632035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @see #BAND_AM */ 9642035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static class AmBandConfig extends BandConfig { 9652035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final boolean mStereo; 9662035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 9672035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent AmBandConfig(AmBandDescriptor descriptor) { 9682035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent super((BandDescriptor)descriptor); 9692035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = descriptor.isStereoSupported(); 9702035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 9712035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 9722035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent AmBandConfig(int region, int type, int lowerLimit, int upperLimit, int spacing, 9732035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent boolean stereo) { 9742035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent super(region, type, lowerLimit, upperLimit, spacing); 9752035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = stereo; 9762035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 9772035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 9782035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Get stereo enable state 9792035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the enable state. 9802035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 9812035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean getStereo() { 9822035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mStereo; 9832035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 9842035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 9852035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private AmBandConfig(Parcel in) { 9862035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent super(in); 9872035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = in.readByte() == 1; 9882035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 9892035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 9902035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final Parcelable.Creator<AmBandConfig> CREATOR 9912035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent = new Parcelable.Creator<AmBandConfig>() { 9922035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public AmBandConfig createFromParcel(Parcel in) { 9932035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return new AmBandConfig(in); 9942035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 9952035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 9962035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public AmBandConfig[] newArray(int size) { 9972035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return new AmBandConfig[size]; 9982035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 9992035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent }; 10002035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 10012035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 10022035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public void writeToParcel(Parcel dest, int flags) { 10032035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent super.writeToParcel(dest, flags); 10042035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeByte((byte) (mStereo ? 1 : 0)); 10052035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 10062035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 10072035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 10082035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int describeContents() { 10092035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return 0; 10102035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 10112035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 10122035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 10132035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public String toString() { 10142035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return "AmBandConfig [" + super.toString() 10152035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent + ", mStereo=" + mStereo + "]"; 10162035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 10172035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 10182035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 10192035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int hashCode() { 10202035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent final int prime = 31; 10212035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent int result = super.hashCode(); 10222035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + (mStereo ? 1 : 0); 10232035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return result; 10242035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 10252035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 10262035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 10272035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean equals(Object obj) { 10282035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (this == obj) 10292035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return true; 10302035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (!super.equals(obj)) 10312035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 10322035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (!(obj instanceof AmBandConfig)) 10332035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 10342035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent AmBandConfig other = (AmBandConfig) obj; 10352035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mStereo != other.getStereo()) 10362035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 10372035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return true; 10382035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 10392035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 10402035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** 10412035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Builder class for {@link AmBandConfig} objects. 10422035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 10432035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static class Builder { 10442035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final BandDescriptor mDescriptor; 10452035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private boolean mStereo; 10462035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 10472035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** 10482035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Constructs a new Builder with the defaults from an {@link AmBandDescriptor} . 10492035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @param descriptor the FmBandDescriptor defaults are read from . 10502035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 10512035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public Builder(AmBandDescriptor descriptor) { 10522035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mDescriptor = new BandDescriptor(descriptor.getRegion(), descriptor.getType(), 10532035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent descriptor.getLowerLimit(), descriptor.getUpperLimit(), 10542035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent descriptor.getSpacing()); 10552035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = descriptor.isStereoSupported(); 10562035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 10572035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 10582035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** 10592035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Constructs a new Builder from a given {@link AmBandConfig} 10602035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @param config the FmBandConfig object whose data will be reused in the new Builder. 10612035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 10622035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public Builder(AmBandConfig config) { 10632035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mDescriptor = new BandDescriptor(config.getRegion(), config.getType(), 10642035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent config.getLowerLimit(), config.getUpperLimit(), config.getSpacing()); 10652035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = config.getStereo(); 10662035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 10672035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 10682035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** 10692035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Combines all of the parameters that have been set and return a new 10702035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * {@link AmBandConfig} object. 10712035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return a new {@link AmBandConfig} object 10722035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 10732035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public AmBandConfig build() { 10742035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent AmBandConfig config = new AmBandConfig(mDescriptor.getRegion(), 10752035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mDescriptor.getType(), mDescriptor.getLowerLimit(), 10762035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mDescriptor.getUpperLimit(), mDescriptor.getSpacing(), 10772035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo); 10782035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return config; 10792035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 10802035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 10812035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Set stereo enable state 10822035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @param state The new enable state. 10832035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the same Builder instance. 10842035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 10852035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public Builder setStereo(boolean state) { 10862035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = state; 10872035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return this; 10882035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 10892035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent }; 10902035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 10912035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 10922035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Radio program information returned by 10932035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * {@link RadioTuner#getProgramInformation(RadioManager.ProgramInfo[])} */ 10942035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static class ProgramInfo implements Parcelable { 10952035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 10962035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final int mChannel; 10972035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final int mSubChannel; 10982035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final boolean mTuned; 10992035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final boolean mStereo; 11002035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final boolean mDigital; 11012035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final int mSignalStrength; 11022035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final RadioMetadata mMetadata; 11032035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 11042035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent ProgramInfo(int channel, int subChannel, boolean tuned, boolean stereo, 11052035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent boolean digital, int signalStrength, RadioMetadata metadata) { 11062035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mChannel = channel; 11072035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mSubChannel = subChannel; 11082035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mTuned = tuned; 11092035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = stereo; 11102035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mDigital = digital; 11112035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mSignalStrength = signalStrength; 11122035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mMetadata = metadata; 11132035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 11142035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 11152035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Main channel expressed in units according to band type. 11162035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Currently all defined band types express channels as frequency in kHz 11172035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the program channel 11182035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 11192035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int getChannel() { 11202035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mChannel; 11212035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 11222035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Sub channel ID. E.g 1 for HD radio HD1 11232035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the program sub channel 11242035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 11252035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int getSubChannel() { 11262035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mSubChannel; 11272035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 11282035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** {@code true} if the tuner is currently tuned on a valid station 11292035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return {@code true} if currently tuned, {@code false} otherwise. 11302035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 11312035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean isTuned() { 11322035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mTuned; 11332035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 11342035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** {@code true} if the received program is stereo 11352035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return {@code true} if stereo, {@code false} otherwise. 11362035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 11372035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean isStereo() { 11382035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mStereo; 11392035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 11402035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** {@code true} if the received program is digital (e.g HD radio) 11412035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return {@code true} if digital, {@code false} otherwise. 11422035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 11432035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean isDigital() { 11442035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mDigital; 11452035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 11462035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Signal strength indicator from 0 (no signal) to 100 (excellent) 11472035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return the signal strength indication. 11482035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 11492035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int getSignalStrength() { 11502035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mSignalStrength; 11512035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 11522035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** Metadata currently received from this station. 11532035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * null if no metadata have been received 11542035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return current meta data received from this program. 11552035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 11562035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public RadioMetadata getMetadata() { 11572035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return mMetadata; 11582035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 11592035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 11602035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private ProgramInfo(Parcel in) { 11612035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mChannel = in.readInt(); 11622035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mSubChannel = in.readInt(); 11632035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mTuned = in.readByte() == 1; 11642035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mStereo = in.readByte() == 1; 11652035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mDigital = in.readByte() == 1; 11662035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mSignalStrength = in.readInt(); 11672035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (in.readByte() == 1) { 11682035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mMetadata = RadioMetadata.CREATOR.createFromParcel(in); 11692035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } else { 11702035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mMetadata = null; 11712035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 11722035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 11732035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 11742035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public static final Parcelable.Creator<ProgramInfo> CREATOR 11752035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent = new Parcelable.Creator<ProgramInfo>() { 11762035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public ProgramInfo createFromParcel(Parcel in) { 11772035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return new ProgramInfo(in); 11782035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 11792035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 11802035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public ProgramInfo[] newArray(int size) { 11812035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return new ProgramInfo[size]; 11822035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 11832035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent }; 11842035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 11852035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 11862035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public void writeToParcel(Parcel dest, int flags) { 11872035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeInt(mChannel); 11882035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeInt(mSubChannel); 11892035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeByte((byte)(mTuned ? 1 : 0)); 11902035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeByte((byte)(mStereo ? 1 : 0)); 11912035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeByte((byte)(mDigital ? 1 : 0)); 11922035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeInt(mSignalStrength); 11932035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mMetadata == null) { 11942035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeByte((byte)0); 11952035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } else { 11962035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent dest.writeByte((byte)1); 11972035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mMetadata.writeToParcel(dest, flags); 11982035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 11992035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 12002035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 12012035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 12022035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int describeContents() { 12032035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return 0; 12042035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 12052035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 12062035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 12072035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public String toString() { 12082035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return "ProgramInfo [mChannel=" + mChannel + ", mSubChannel=" + mSubChannel 12092035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent + ", mTuned=" + mTuned + ", mStereo=" + mStereo + ", mDigital=" + mDigital 12102035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent + ", mSignalStrength=" + mSignalStrength 12112035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent + ((mMetadata == null) ? "" : (", mMetadata=" + mMetadata.toString())) 12122035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent + "]"; 12132035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 12142035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 12152035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 12162035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public int hashCode() { 12172035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent final int prime = 31; 12182035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent int result = 1; 12192035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + mChannel; 12202035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + mSubChannel; 12212035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + (mTuned ? 1 : 0); 12222035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + (mStereo ? 1 : 0); 12232035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + (mDigital ? 1 : 0); 12242035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + mSignalStrength; 12252035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent result = prime * result + ((mMetadata == null) ? 0 : mMetadata.hashCode()); 12262035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return result; 12272035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 12282035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 12292035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent @Override 12302035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public boolean equals(Object obj) { 12312035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (this == obj) 12322035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return true; 12332035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (!(obj instanceof ProgramInfo)) 12342035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 12352035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent ProgramInfo other = (ProgramInfo) obj; 12362035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mChannel != other.getChannel()) 12372035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 12382035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mSubChannel != other.getSubChannel()) 12392035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 12402035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mTuned != other.isTuned()) 12412035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 12422035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mStereo != other.isStereo()) 12432035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 12442035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mDigital != other.isDigital()) 12452035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 12462035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mSignalStrength != other.getSignalStrength()) 12472035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 12482035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (mMetadata == null) { 12492035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (other.getMetadata() != null) 12502035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 12512035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } else if (!mMetadata.equals(other.getMetadata())) 12522035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return false; 12532035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return true; 12542035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 12552035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 12562035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 12572035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 12582035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** 12592035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Returns a list of descriptors for all broadcast radio modules present on the device. 12602035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @param modules An List of {@link ModuleProperties} where the list will be returned. 12612035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return 12622035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * <ul> 12632035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * <li>{@link #STATUS_OK} in case of success, </li> 12642035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * <li>{@link #STATUS_ERROR} in case of unspecified error, </li> 12652035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * <li>{@link #STATUS_NO_INIT} if the native service cannot be reached, </li> 12662035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * <li>{@link #STATUS_BAD_VALUE} if modules is null, </li> 12672035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * <li>{@link #STATUS_DEAD_OBJECT} if the binder transaction to the native service fails, </li> 12682035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * </ul> 12692035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 12702035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public native int listModules(List <ModuleProperties> modules); 12712035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 12722035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** 12732035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Open an interface to control a tuner on a given broadcast radio module. 12742035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Optionally selects and applies the configuration passed as "config" argument. 12752035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @param moduleId radio module identifier {@link ModuleProperties#getId()}. Mandatory. 12762035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @param config desired band and configuration to apply when enabling the hardware module. 12772035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * optional, can be null. 12782035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @param withAudio {@code true} to request a tuner with an audio source. 12792035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * This tuner is intended for live listening or recording or a radio program. 12802035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * If {@code false}, the tuner can only be used to retrieve program informations. 12812035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @param callback {@link RadioTuner.Callback} interface. Mandatory. 12822035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @param handler the Handler on which the callbacks will be received. 12832035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * Can be null if default handler is OK. 12842035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @return a valid {@link RadioTuner} interface in case of success or null in case of error. 12852035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 12862035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public RadioTuner openTuner(int moduleId, BandConfig config, boolean withAudio, 12872035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent RadioTuner.Callback callback, Handler handler) { 12882035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (callback == null) { 12892035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return null; 12902035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 12912035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent RadioModule module = new RadioModule(moduleId, config, withAudio, callback, handler); 12922035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (module != null) { 12932035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent if (!module.initCheck()) { 12942035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent module = null; 12952035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 12962035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 12972035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent return (RadioTuner)module; 12982035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 12992035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 13002035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent private final Context mContext; 13012035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent 13022035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent /** 13032035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent * @hide 13042035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent */ 13052035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent public RadioManager(Context context) { 13062035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent mContext = context; 13072035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent } 13082035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent} 1309