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