Home | History | Annotate | Download | only in telephony
      1 /*
      2  * Copyright (C) 2009 Qualcomm Innovation Center, Inc.  All Rights Reserved.
      3  * Copyright (C) 2009 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *      http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 package android.telephony;
     19 
     20 import android.os.Bundle;
     21 import android.os.Parcel;
     22 import android.os.Parcelable;
     23 import android.util.Log;
     24 
     25 /**
     26  * Contains phone signal strength related information.
     27  */
     28 public class SignalStrength implements Parcelable {
     29 
     30     private static final String LOG_TAG = "SignalStrength";
     31     private static final boolean DBG = false;
     32 
     33     /** @hide */
     34     public static final int SIGNAL_STRENGTH_NONE_OR_UNKNOWN = 0;
     35     /** @hide */
     36     public static final int SIGNAL_STRENGTH_POOR = 1;
     37     /** @hide */
     38     public static final int SIGNAL_STRENGTH_MODERATE = 2;
     39     /** @hide */
     40     public static final int SIGNAL_STRENGTH_GOOD = 3;
     41     /** @hide */
     42     public static final int SIGNAL_STRENGTH_GREAT = 4;
     43     /** @hide */
     44     public static final int NUM_SIGNAL_STRENGTH_BINS = 5;
     45     /** @hide */
     46     public static final String[] SIGNAL_STRENGTH_NAMES = {
     47         "none", "poor", "moderate", "good", "great"
     48     };
     49 
     50     private int mGsmSignalStrength; // Valid values are (0-31, 99) as defined in TS 27.007 8.5
     51     private int mGsmBitErrorRate;   // bit error rate (0-7, 99) as defined in TS 27.007 8.5
     52     private int mCdmaDbm;   // This value is the RSSI value
     53     private int mCdmaEcio;  // This value is the Ec/Io
     54     private int mEvdoDbm;   // This value is the EVDO RSSI value
     55     private int mEvdoEcio;  // This value is the EVDO Ec/Io
     56     private int mEvdoSnr;   // Valid values are 0-8.  8 is the highest signal to noise ratio
     57     private int mLteSignalStrength;
     58     private int mLteRsrp;
     59     private int mLteRsrq;
     60     private int mLteRssnr;
     61     private int mLteCqi;
     62 
     63     private boolean isGsm; // This value is set by the ServiceStateTracker onSignalStrengthResult
     64 
     65     /**
     66      * Create a new SignalStrength from a intent notifier Bundle
     67      *
     68      * This method is used by PhoneStateIntentReceiver and maybe by
     69      * external applications.
     70      *
     71      * @param m Bundle from intent notifier
     72      * @return newly created SignalStrength
     73      *
     74      * @hide
     75      */
     76     public static SignalStrength newFromBundle(Bundle m) {
     77         SignalStrength ret;
     78         ret = new SignalStrength();
     79         ret.setFromNotifierBundle(m);
     80         return ret;
     81     }
     82 
     83     /**
     84      * Empty constructor
     85      *
     86      * @hide
     87      */
     88     public SignalStrength() {
     89         mGsmSignalStrength = 99;
     90         mGsmBitErrorRate = -1;
     91         mCdmaDbm = -1;
     92         mCdmaEcio = -1;
     93         mEvdoDbm = -1;
     94         mEvdoEcio = -1;
     95         mEvdoSnr = -1;
     96         mLteSignalStrength = -1;
     97         mLteRsrp = -1;
     98         mLteRsrq = -1;
     99         mLteRssnr = -1;
    100         mLteCqi = -1;
    101         isGsm = true;
    102     }
    103 
    104     /**
    105      * Constructor
    106      *
    107      * @hide
    108      */
    109     public SignalStrength(int gsmSignalStrength, int gsmBitErrorRate,
    110             int cdmaDbm, int cdmaEcio,
    111             int evdoDbm, int evdoEcio, int evdoSnr,
    112             int lteSignalStrength, int lteRsrp, int lteRsrq, int lteRssnr, int lteCqi,
    113             boolean gsm) {
    114         mGsmSignalStrength = gsmSignalStrength;
    115         mGsmBitErrorRate = gsmBitErrorRate;
    116         mCdmaDbm = cdmaDbm;
    117         mCdmaEcio = cdmaEcio;
    118         mEvdoDbm = evdoDbm;
    119         mEvdoEcio = evdoEcio;
    120         mEvdoSnr = evdoSnr;
    121         mLteSignalStrength = lteSignalStrength;
    122         mLteRsrp = lteRsrp;
    123         mLteRsrq = lteRsrq;
    124         mLteRssnr = lteRssnr;
    125         mLteCqi = lteCqi;
    126         isGsm = gsm;
    127     }
    128 
    129     /**
    130      * Constructor
    131      *
    132      * @hide
    133      */
    134     public SignalStrength(int gsmSignalStrength, int gsmBitErrorRate,
    135             int cdmaDbm, int cdmaEcio,
    136             int evdoDbm, int evdoEcio, int evdoSnr,
    137             boolean gsm) {
    138         this(gsmSignalStrength, gsmBitErrorRate, cdmaDbm, cdmaEcio,
    139                 evdoDbm, evdoEcio, evdoSnr, -1, -1, -1, -1, -1, gsm);
    140     }
    141 
    142     /**
    143      * Copy constructors
    144      *
    145      * @param s Source SignalStrength
    146      *
    147      * @hide
    148      */
    149     public SignalStrength(SignalStrength s) {
    150         copyFrom(s);
    151     }
    152 
    153     /**
    154      * @hide
    155      */
    156     protected void copyFrom(SignalStrength s) {
    157         mGsmSignalStrength = s.mGsmSignalStrength;
    158         mGsmBitErrorRate = s.mGsmBitErrorRate;
    159         mCdmaDbm = s.mCdmaDbm;
    160         mCdmaEcio = s.mCdmaEcio;
    161         mEvdoDbm = s.mEvdoDbm;
    162         mEvdoEcio = s.mEvdoEcio;
    163         mEvdoSnr = s.mEvdoSnr;
    164         mLteSignalStrength = s.mLteSignalStrength;
    165         mLteRsrp = s.mLteRsrp;
    166         mLteRsrq = s.mLteRsrq;
    167         mLteRssnr = s.mLteRssnr;
    168         mLteCqi = s.mLteCqi;
    169         isGsm = s.isGsm;
    170     }
    171 
    172     /**
    173      * Construct a SignalStrength object from the given parcel.
    174      *
    175      * @hide
    176      */
    177     public SignalStrength(Parcel in) {
    178         mGsmSignalStrength = in.readInt();
    179         mGsmBitErrorRate = in.readInt();
    180         mCdmaDbm = in.readInt();
    181         mCdmaEcio = in.readInt();
    182         mEvdoDbm = in.readInt();
    183         mEvdoEcio = in.readInt();
    184         mEvdoSnr = in.readInt();
    185         mLteSignalStrength = in.readInt();
    186         mLteRsrp = in.readInt();
    187         mLteRsrq = in.readInt();
    188         mLteRssnr = in.readInt();
    189         mLteCqi = in.readInt();
    190         isGsm = (in.readInt() != 0);
    191     }
    192 
    193     /**
    194      * {@link Parcelable#writeToParcel}
    195      */
    196     public void writeToParcel(Parcel out, int flags) {
    197         out.writeInt(mGsmSignalStrength);
    198         out.writeInt(mGsmBitErrorRate);
    199         out.writeInt(mCdmaDbm);
    200         out.writeInt(mCdmaEcio);
    201         out.writeInt(mEvdoDbm);
    202         out.writeInt(mEvdoEcio);
    203         out.writeInt(mEvdoSnr);
    204         out.writeInt(mLteSignalStrength);
    205         out.writeInt(mLteRsrp);
    206         out.writeInt(mLteRsrq);
    207         out.writeInt(mLteRssnr);
    208         out.writeInt(mLteCqi);
    209         out.writeInt(isGsm ? 1 : 0);
    210     }
    211 
    212     /**
    213      * {@link Parcelable#describeContents}
    214      */
    215     public int describeContents() {
    216         return 0;
    217     }
    218 
    219     /**
    220      * {@link Parcelable.Creator}
    221      *
    222      * @hide
    223      */
    224     public static final Parcelable.Creator<SignalStrength> CREATOR = new Parcelable.Creator() {
    225         public SignalStrength createFromParcel(Parcel in) {
    226             return new SignalStrength(in);
    227         }
    228 
    229         public SignalStrength[] newArray(int size) {
    230             return new SignalStrength[size];
    231         }
    232     };
    233 
    234     /**
    235      * Get the GSM Signal Strength, valid values are (0-31, 99) as defined in TS 27.007 8.5
    236      */
    237     public int getGsmSignalStrength() {
    238         return this.mGsmSignalStrength;
    239     }
    240 
    241     /**
    242      * Get the GSM bit error rate (0-7, 99) as defined in TS 27.007 8.5
    243      */
    244     public int getGsmBitErrorRate() {
    245         return this.mGsmBitErrorRate;
    246     }
    247 
    248     /**
    249      * Get the CDMA RSSI value in dBm
    250      */
    251     public int getCdmaDbm() {
    252         return this.mCdmaDbm;
    253     }
    254 
    255     /**
    256      * Get the CDMA Ec/Io value in dB*10
    257      */
    258     public int getCdmaEcio() {
    259         return this.mCdmaEcio;
    260     }
    261 
    262     /**
    263      * Get the EVDO RSSI value in dBm
    264      */
    265     public int getEvdoDbm() {
    266         return this.mEvdoDbm;
    267     }
    268 
    269     /**
    270      * Get the EVDO Ec/Io value in dB*10
    271      */
    272     public int getEvdoEcio() {
    273         return this.mEvdoEcio;
    274     }
    275 
    276     /**
    277      * Get the signal to noise ratio. Valid values are 0-8. 8 is the highest.
    278      */
    279     public int getEvdoSnr() {
    280         return this.mEvdoSnr;
    281     }
    282 
    283     /**
    284      * Get signal level as an int from 0..4
    285      *
    286      * @hide
    287      */
    288     public int getLevel() {
    289         int level;
    290 
    291         if (isGsm) {
    292             if ((mLteSignalStrength == -1)
    293                     && (mLteRsrp == -1)
    294                     && (mLteRsrq == -1)
    295                     && (mLteRssnr == -1)
    296                     && (mLteCqi == -1)) {
    297                 level = getGsmLevel();
    298             } else {
    299                 level = getLteLevel();
    300             }
    301         } else {
    302             int cdmaLevel = getCdmaLevel();
    303             int evdoLevel = getEvdoLevel();
    304             if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
    305                 /* We don't know evdo, use cdma */
    306                 level = getCdmaLevel();
    307             } else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
    308                 /* We don't know cdma, use evdo */
    309                 level = getEvdoLevel();
    310             } else {
    311                 /* We know both, use the lowest level */
    312                 level = cdmaLevel < evdoLevel ? cdmaLevel : evdoLevel;
    313             }
    314         }
    315         if (DBG) log("getLevel=" + level);
    316         return level;
    317     }
    318 
    319     /**
    320      * Get the signal level as an asu value between 0..31, 99 is unknown
    321      *
    322      * @hide
    323      */
    324     public int getAsuLevel() {
    325         int asuLevel;
    326         if (isGsm) {
    327             if ((mLteSignalStrength == -1)
    328                     && (mLteRsrp == -1)
    329                     && (mLteRsrq == -1)
    330                     && (mLteRssnr == -1)
    331                     && (mLteCqi == -1)) {
    332                 asuLevel = getGsmAsuLevel();
    333             } else {
    334                 asuLevel = getLteAsuLevel();
    335             }
    336         } else {
    337             int cdmaAsuLevel = getCdmaAsuLevel();
    338             int evdoAsuLevel = getEvdoAsuLevel();
    339             if (evdoAsuLevel == 0) {
    340                 /* We don't know evdo use, cdma */
    341                 asuLevel = cdmaAsuLevel;
    342             } else if (cdmaAsuLevel == 0) {
    343                 /* We don't know cdma use, evdo */
    344                 asuLevel = evdoAsuLevel;
    345             } else {
    346                 /* We know both, use the lowest level */
    347                 asuLevel = cdmaAsuLevel < evdoAsuLevel ? cdmaAsuLevel : evdoAsuLevel;
    348             }
    349         }
    350         if (DBG) log("getAsuLevel=" + asuLevel);
    351         return asuLevel;
    352     }
    353 
    354     /**
    355      * Get the signal strength as dBm
    356      *
    357      * @hide
    358      */
    359     public int getDbm() {
    360         int dBm;
    361 
    362         if(isGsm()) {
    363             if ((mLteSignalStrength == -1)
    364                     && (mLteRsrp == -1)
    365                     && (mLteRsrq == -1)
    366                     && (mLteRssnr == -1)
    367                     && (mLteCqi == -1)) {
    368                 dBm = getGsmDbm();
    369             } else {
    370                 dBm = getLteDbm();
    371             }
    372         } else {
    373             dBm = getCdmaDbm();
    374         }
    375         if (DBG) log("getDbm=" + dBm);
    376         return dBm;
    377     }
    378 
    379     /**
    380      * Get Gsm signal strength as dBm
    381      *
    382      * @hide
    383      */
    384     public int getGsmDbm() {
    385         int dBm;
    386 
    387         int gsmSignalStrength = getGsmSignalStrength();
    388         int asu = (gsmSignalStrength == 99 ? -1 : gsmSignalStrength);
    389         if (asu != -1) {
    390             dBm = -113 + (2 * asu);
    391         } else {
    392             dBm = -1;
    393         }
    394         if (DBG) log("getGsmDbm=" + dBm);
    395         return dBm;
    396     }
    397 
    398     /**
    399      * Get gsm as level 0..4
    400      *
    401      * @hide
    402      */
    403     public int getGsmLevel() {
    404         int level;
    405 
    406         // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
    407         // asu = 0 (-113dB or less) is very weak
    408         // signal, its better to show 0 bars to the user in such cases.
    409         // asu = 99 is a special case, where the signal strength is unknown.
    410         int asu = getGsmSignalStrength();
    411         if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
    412         else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT;
    413         else if (asu >= 8)  level = SIGNAL_STRENGTH_GOOD;
    414         else if (asu >= 5)  level = SIGNAL_STRENGTH_MODERATE;
    415         else level = SIGNAL_STRENGTH_POOR;
    416         if (DBG) log("getGsmLevel=" + level);
    417         return level;
    418     }
    419 
    420     /**
    421      * Get the gsm signal level as an asu value between 0..31, 99 is unknown
    422      *
    423      * @hide
    424      */
    425     public int getGsmAsuLevel() {
    426         // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
    427         // asu = 0 (-113dB or less) is very weak
    428         // signal, its better to show 0 bars to the user in such cases.
    429         // asu = 99 is a special case, where the signal strength is unknown.
    430         int level = getGsmSignalStrength();
    431         if (DBG) log("getGsmAsuLevel=" + level);
    432         return level;
    433     }
    434 
    435     /**
    436      * Get cdma as level 0..4
    437      *
    438      * @hide
    439      */
    440     public int getCdmaLevel() {
    441         final int cdmaDbm = getCdmaDbm();
    442         final int cdmaEcio = getCdmaEcio();
    443         int levelDbm;
    444         int levelEcio;
    445 
    446         if (cdmaDbm >= -75) levelDbm = SIGNAL_STRENGTH_GREAT;
    447         else if (cdmaDbm >= -85) levelDbm = SIGNAL_STRENGTH_GOOD;
    448         else if (cdmaDbm >= -95) levelDbm = SIGNAL_STRENGTH_MODERATE;
    449         else if (cdmaDbm >= -100) levelDbm = SIGNAL_STRENGTH_POOR;
    450         else levelDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
    451 
    452         // Ec/Io are in dB*10
    453         if (cdmaEcio >= -90) levelEcio = SIGNAL_STRENGTH_GREAT;
    454         else if (cdmaEcio >= -110) levelEcio = SIGNAL_STRENGTH_GOOD;
    455         else if (cdmaEcio >= -130) levelEcio = SIGNAL_STRENGTH_MODERATE;
    456         else if (cdmaEcio >= -150) levelEcio = SIGNAL_STRENGTH_POOR;
    457         else levelEcio = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
    458 
    459         int level = (levelDbm < levelEcio) ? levelDbm : levelEcio;
    460         if (DBG) log("getCdmaLevel=" + level);
    461         return level;
    462     }
    463 
    464     /**
    465      * Get the cdma signal level as an asu value between 0..31, 99 is unknown
    466      *
    467      * @hide
    468      */
    469     public int getCdmaAsuLevel() {
    470         final int cdmaDbm = getCdmaDbm();
    471         final int cdmaEcio = getCdmaEcio();
    472         int cdmaAsuLevel;
    473         int ecioAsuLevel;
    474 
    475         if (cdmaDbm >= -75) cdmaAsuLevel = 16;
    476         else if (cdmaDbm >= -82) cdmaAsuLevel = 8;
    477         else if (cdmaDbm >= -90) cdmaAsuLevel = 4;
    478         else if (cdmaDbm >= -95) cdmaAsuLevel = 2;
    479         else if (cdmaDbm >= -100) cdmaAsuLevel = 1;
    480         else cdmaAsuLevel = 99;
    481 
    482         // Ec/Io are in dB*10
    483         if (cdmaEcio >= -90) ecioAsuLevel = 16;
    484         else if (cdmaEcio >= -100) ecioAsuLevel = 8;
    485         else if (cdmaEcio >= -115) ecioAsuLevel = 4;
    486         else if (cdmaEcio >= -130) ecioAsuLevel = 2;
    487         else if (cdmaEcio >= -150) ecioAsuLevel = 1;
    488         else ecioAsuLevel = 99;
    489 
    490         int level = (cdmaAsuLevel < ecioAsuLevel) ? cdmaAsuLevel : ecioAsuLevel;
    491         if (DBG) log("getCdmaAsuLevel=" + level);
    492         return level;
    493     }
    494 
    495     /**
    496      * Get Evdo as level 0..4
    497      *
    498      * @hide
    499      */
    500     public int getEvdoLevel() {
    501         int evdoDbm = getEvdoDbm();
    502         int evdoSnr = getEvdoSnr();
    503         int levelEvdoDbm;
    504         int levelEvdoSnr;
    505 
    506         if (evdoDbm >= -65) levelEvdoDbm = SIGNAL_STRENGTH_GREAT;
    507         else if (evdoDbm >= -75) levelEvdoDbm = SIGNAL_STRENGTH_GOOD;
    508         else if (evdoDbm >= -90) levelEvdoDbm = SIGNAL_STRENGTH_MODERATE;
    509         else if (evdoDbm >= -105) levelEvdoDbm = SIGNAL_STRENGTH_POOR;
    510         else levelEvdoDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
    511 
    512         if (evdoSnr >= 7) levelEvdoSnr = SIGNAL_STRENGTH_GREAT;
    513         else if (evdoSnr >= 5) levelEvdoSnr = SIGNAL_STRENGTH_GOOD;
    514         else if (evdoSnr >= 3) levelEvdoSnr = SIGNAL_STRENGTH_MODERATE;
    515         else if (evdoSnr >= 1) levelEvdoSnr = SIGNAL_STRENGTH_POOR;
    516         else levelEvdoSnr = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
    517 
    518         int level = (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr;
    519         if (DBG) log("getEvdoLevel=" + level);
    520         return level;
    521     }
    522 
    523     /**
    524      * Get the evdo signal level as an asu value between 0..31, 99 is unknown
    525      *
    526      * @hide
    527      */
    528     public int getEvdoAsuLevel() {
    529         int evdoDbm = getEvdoDbm();
    530         int evdoSnr = getEvdoSnr();
    531         int levelEvdoDbm;
    532         int levelEvdoSnr;
    533 
    534         if (evdoDbm >= -65) levelEvdoDbm = 16;
    535         else if (evdoDbm >= -75) levelEvdoDbm = 8;
    536         else if (evdoDbm >= -85) levelEvdoDbm = 4;
    537         else if (evdoDbm >= -95) levelEvdoDbm = 2;
    538         else if (evdoDbm >= -105) levelEvdoDbm = 1;
    539         else levelEvdoDbm = 99;
    540 
    541         if (evdoSnr >= 7) levelEvdoSnr = 16;
    542         else if (evdoSnr >= 6) levelEvdoSnr = 8;
    543         else if (evdoSnr >= 5) levelEvdoSnr = 4;
    544         else if (evdoSnr >= 3) levelEvdoSnr = 2;
    545         else if (evdoSnr >= 1) levelEvdoSnr = 1;
    546         else levelEvdoSnr = 99;
    547 
    548         int level = (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr;
    549         if (DBG) log("getEvdoAsuLevel=" + level);
    550         return level;
    551     }
    552 
    553     /**
    554      * Get LTE as dBm
    555      *
    556      * @hide
    557      */
    558     public int getLteDbm() {
    559         return mLteRsrp;
    560     }
    561 
    562     /**
    563      * Get LTE as level 0..4
    564      *
    565      * @hide
    566      */
    567     public int getLteLevel() {
    568         int levelLteRsrp = 0;
    569 
    570         if (mLteRsrp == -1) levelLteRsrp = 0;
    571         else if (mLteRsrp >= -85) levelLteRsrp = SIGNAL_STRENGTH_GREAT;
    572         else if (mLteRsrp >= -95) levelLteRsrp = SIGNAL_STRENGTH_GOOD;
    573         else if (mLteRsrp >= -105) levelLteRsrp = SIGNAL_STRENGTH_MODERATE;
    574         else if (mLteRsrp >= -115) levelLteRsrp = SIGNAL_STRENGTH_POOR;
    575         else levelLteRsrp = 0;
    576 
    577         if (DBG) log("Lte level: "+levelLteRsrp);
    578         return levelLteRsrp;
    579     }
    580 
    581     /**
    582      * Get the LTE signal level as an asu value between 0..97, 99 is unknown
    583      * Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69
    584      *
    585      * @hide
    586      */
    587     public int getLteAsuLevel() {
    588         int lteAsuLevel = 99;
    589         int lteDbm = getLteDbm();
    590         if (lteDbm <= -140) lteAsuLevel = 0;
    591         else if (lteDbm >= -43) lteAsuLevel = 97;
    592         else lteAsuLevel = lteDbm + 140;
    593         if (DBG) log("Lte Asu level: "+lteAsuLevel);
    594         return lteAsuLevel;
    595     }
    596 
    597     /**
    598      * @return true if this is for GSM
    599      */
    600     public boolean isGsm() {
    601         return this.isGsm;
    602     }
    603 
    604     /**
    605      * @return hash code
    606      */
    607     @Override
    608     public int hashCode() {
    609         int primeNum = 31;
    610         return ((mGsmSignalStrength * primeNum)
    611                 + (mGsmBitErrorRate * primeNum)
    612                 + (mCdmaDbm * primeNum) + (mCdmaEcio * primeNum)
    613                 + (mEvdoDbm * primeNum) + (mEvdoEcio * primeNum) + (mEvdoSnr * primeNum)
    614                 + (mLteSignalStrength * primeNum) + (mLteRsrp * primeNum)
    615                 + (mLteRsrq * primeNum) + (mLteRssnr * primeNum) + (mLteCqi * primeNum)
    616                 + (isGsm ? 1 : 0));
    617     }
    618 
    619     /**
    620      * @return true if the signal strengths are the same
    621      */
    622     @Override
    623     public boolean equals (Object o) {
    624         SignalStrength s;
    625 
    626         try {
    627             s = (SignalStrength) o;
    628         } catch (ClassCastException ex) {
    629             return false;
    630         }
    631 
    632         if (o == null) {
    633             return false;
    634         }
    635 
    636         return (mGsmSignalStrength == s.mGsmSignalStrength
    637                 && mGsmBitErrorRate == s.mGsmBitErrorRate
    638                 && mCdmaDbm == s.mCdmaDbm
    639                 && mCdmaEcio == s.mCdmaEcio
    640                 && mEvdoDbm == s.mEvdoDbm
    641                 && mEvdoEcio == s.mEvdoEcio
    642                 && mEvdoSnr == s.mEvdoSnr
    643                 && mLteSignalStrength == s.mLteSignalStrength
    644                 && mLteRsrp == s.mLteRsrp
    645                 && mLteRsrq == s.mLteRsrq
    646                 && mLteRssnr == s.mLteRssnr
    647                 && mLteCqi == s.mLteCqi
    648                 && isGsm == s.isGsm);
    649     }
    650 
    651     /**
    652      * @return string representation.
    653      */
    654     @Override
    655     public String toString() {
    656         return ("SignalStrength:"
    657                 + " " + mGsmSignalStrength
    658                 + " " + mGsmBitErrorRate
    659                 + " " + mCdmaDbm
    660                 + " " + mCdmaEcio
    661                 + " " + mEvdoDbm
    662                 + " " + mEvdoEcio
    663                 + " " + mEvdoSnr
    664                 + " " + mLteSignalStrength
    665                 + " " + mLteRsrp
    666                 + " " + mLteRsrq
    667                 + " " + mLteRssnr
    668                 + " " + mLteCqi
    669                 + " " + (isGsm ? "gsm|lte" : "cdma"));
    670     }
    671 
    672     /**
    673      * Set SignalStrength based on intent notifier map
    674      *
    675      * @param m intent notifier map
    676      * @hide
    677      */
    678     private void setFromNotifierBundle(Bundle m) {
    679         mGsmSignalStrength = m.getInt("GsmSignalStrength");
    680         mGsmBitErrorRate = m.getInt("GsmBitErrorRate");
    681         mCdmaDbm = m.getInt("CdmaDbm");
    682         mCdmaEcio = m.getInt("CdmaEcio");
    683         mEvdoDbm = m.getInt("EvdoDbm");
    684         mEvdoEcio = m.getInt("EvdoEcio");
    685         mEvdoSnr = m.getInt("EvdoSnr");
    686         mLteSignalStrength = m.getInt("LteSignalStrength");
    687         mLteRsrp = m.getInt("LteRsrp");
    688         mLteRsrq = m.getInt("LteRsrq");
    689         mLteRssnr = m.getInt("LteRssnr");
    690         mLteCqi = m.getInt("LteCqi");
    691         isGsm = m.getBoolean("isGsm");
    692     }
    693 
    694     /**
    695      * Set intent notifier Bundle based on SignalStrength
    696      *
    697      * @param m intent notifier Bundle
    698      * @hide
    699      */
    700     public void fillInNotifierBundle(Bundle m) {
    701         m.putInt("GsmSignalStrength", mGsmSignalStrength);
    702         m.putInt("GsmBitErrorRate", mGsmBitErrorRate);
    703         m.putInt("CdmaDbm", mCdmaDbm);
    704         m.putInt("CdmaEcio", mCdmaEcio);
    705         m.putInt("EvdoDbm", mEvdoDbm);
    706         m.putInt("EvdoEcio", mEvdoEcio);
    707         m.putInt("EvdoSnr", mEvdoSnr);
    708         m.putInt("LteSignalStrength", mLteSignalStrength);
    709         m.putInt("LteRsrp", mLteRsrp);
    710         m.putInt("LteRsrq", mLteRsrq);
    711         m.putInt("LteRssnr", mLteRssnr);
    712         m.putInt("LteCqi", mLteCqi);
    713         m.putBoolean("isGsm", Boolean.valueOf(isGsm));
    714     }
    715 
    716     /**
    717      * log
    718      */
    719     private static void log(String s) {
    720         Log.w(LOG_TAG, s);
    721     }
    722 }
    723