SignalStrength.java revision 369808638bcdf90a2e4723cbd728aa29e2f4a051
14f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
24f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Copyright (C) 2012 The Android Open Source Project
34f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *
44f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
54f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * you may not use this file except in compliance with the License.
64f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * You may obtain a copy of the License at
74f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *
84f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
94f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *
104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Unless required by applicable law or agreed to in writing, software
114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * See the License for the specific language governing permissions and
144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * limitations under the License.
154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */
164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberpackage android.telephony;
184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberimport android.os.Bundle;
204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberimport android.os.Parcel;
214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberimport android.os.Parcelable;
224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberimport android.telephony.Rlog;
234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberimport android.content.res.Resources;
244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/**
264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Contains phone signal strength related information.
274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */
284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberpublic class SignalStrength implements Parcelable {
294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private static final String LOG_TAG = "SignalStrength";
314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private static final boolean DBG = false;
324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /** @hide */
344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public static final int SIGNAL_STRENGTH_NONE_OR_UNKNOWN = 0;
354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /** @hide */
364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public static final int SIGNAL_STRENGTH_POOR = 1;
374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /** @hide */
384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public static final int SIGNAL_STRENGTH_MODERATE = 2;
394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /** @hide */
404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public static final int SIGNAL_STRENGTH_GOOD = 3;
414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /** @hide */
424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public static final int SIGNAL_STRENGTH_GREAT = 4;
434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /** @hide */
444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public static final int NUM_SIGNAL_STRENGTH_BINS = 5;
454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /** @hide */
464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public static final String[] SIGNAL_STRENGTH_NAMES = {
474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        "none", "poor", "moderate", "good", "great"
484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    };
494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /** @hide */
514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    //Use int max, as -1 is a valid value in signal strength
524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public static final int INVALID = 0x7FFFFFFF;
534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private static final int RSRP_THRESH_TYPE_STRICT = 0;
554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private static final int[] RSRP_THRESH_STRICT = new int[] {-140, -115, -105, -95, -85, -44};
564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private static final int[] RSRP_THRESH_LENIENT = new int[] {-140, -128, -118, -108, -98, -44};
574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private int mGsmSignalStrength; // Valid values are (0-31, 99) as defined in TS 27.007 8.5
604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private int mGsmBitErrorRate;   // bit error rate (0-7, 99) as defined in TS 27.007 8.5
614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private int mCdmaDbm;   // This value is the RSSI value
624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private int mCdmaEcio;  // This value is the Ec/Io
634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private int mEvdoDbm;   // This value is the EVDO RSSI value
644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private int mEvdoEcio;  // This value is the EVDO Ec/Io
654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private int mEvdoSnr;   // Valid values are 0-8.  8 is the highest signal to noise ratio
664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private int mLteSignalStrength;
674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private int mLteRsrp;
684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private int mLteRsrq;
694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private int mLteRssnr;
704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private int mLteCqi;
714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private int mTdScdmaRscp;
724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    private boolean isGsm; // This value is set by the ServiceStateTracker onSignalStrengthResult
744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /**
764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * Create a new SignalStrength from a intent notifier Bundle
774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *
784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * This method is used by PhoneStateIntentReceiver and maybe by
794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * external applications.
804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *
814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param m Bundle from intent notifier
824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @return newly created SignalStrength
834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *
844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @hide
854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     */
864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public static SignalStrength newFromBundle(Bundle m) {
874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        SignalStrength ret;
884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ret = new SignalStrength();
894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ret.setFromNotifierBundle(m);
904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        return ret;
914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /**
944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * Empty constructor
954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *
964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @hide
974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     */
984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public SignalStrength() {
994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mGsmSignalStrength = 99;
1004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mGsmBitErrorRate = -1;
1014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mCdmaDbm = -1;
1024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mCdmaEcio = -1;
1034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mEvdoDbm = -1;
1044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mEvdoEcio = -1;
1054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mEvdoSnr = -1;
1064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteSignalStrength = 99;
1074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteRsrp = INVALID;
1084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteRsrq = INVALID;
1094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteRssnr = INVALID;
1104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteCqi = INVALID;
1114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mTdScdmaRscp = INVALID;
1124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        isGsm = true;
1134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
1144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /**
1164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * This constructor is used to create SignalStrength with default
1174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * values and set the isGsmFlag with the value passed in the input
1184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *
1194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param gsmFlag true if Gsm Phone,false if Cdma phone
1204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @return newly created SignalStrength
1214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @hide
1224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     */
1234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public SignalStrength(boolean gsmFlag) {
1244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mGsmSignalStrength = 99;
1254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mGsmBitErrorRate = -1;
1264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mCdmaDbm = -1;
1274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mCdmaEcio = -1;
1284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mEvdoDbm = -1;
1294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mEvdoEcio = -1;
1304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mEvdoSnr = -1;
1314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteSignalStrength = 99;
1324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteRsrp = INVALID;
1334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteRsrq = INVALID;
1344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteRssnr = INVALID;
1354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteCqi = INVALID;
1364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mTdScdmaRscp = INVALID;
1374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        isGsm = gsmFlag;
1384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
1394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /**
1414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * Constructor
1424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *
1434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @hide
1444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     */
1454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public SignalStrength(int gsmSignalStrength, int gsmBitErrorRate,
1464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            int cdmaDbm, int cdmaEcio,
1474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            int evdoDbm, int evdoEcio, int evdoSnr,
1484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            int lteSignalStrength, int lteRsrp, int lteRsrq, int lteRssnr, int lteCqi,
1494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            int tdScdmaRscp, boolean gsmFlag) {
1504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        initialize(gsmSignalStrength, gsmBitErrorRate, cdmaDbm, cdmaEcio,
1514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                evdoDbm, evdoEcio, evdoSnr, lteSignalStrength, lteRsrp,
1524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                lteRsrq, lteRssnr, lteCqi, gsmFlag);
1534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mTdScdmaRscp = tdScdmaRscp;
1544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
1554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /**
1574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * Constructor
1584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *
1594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @hide
1604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     */
1614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public SignalStrength(int gsmSignalStrength, int gsmBitErrorRate,
1624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            int cdmaDbm, int cdmaEcio,
1634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            int evdoDbm, int evdoEcio, int evdoSnr,
1644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            int lteSignalStrength, int lteRsrp, int lteRsrq, int lteRssnr, int lteCqi,
1654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            boolean gsmFlag) {
1664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        initialize(gsmSignalStrength, gsmBitErrorRate, cdmaDbm, cdmaEcio,
1674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                evdoDbm, evdoEcio, evdoSnr, lteSignalStrength, lteRsrp,
1684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                lteRsrq, lteRssnr, lteCqi, gsmFlag);
1694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
1704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /**
1724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * Constructor
1734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *
1744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @hide
1754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     */
1764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public SignalStrength(int gsmSignalStrength, int gsmBitErrorRate,
1774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            int cdmaDbm, int cdmaEcio,
1784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            int evdoDbm, int evdoEcio, int evdoSnr,
1794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            boolean gsmFlag) {
1804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        initialize(gsmSignalStrength, gsmBitErrorRate, cdmaDbm, cdmaEcio,
1814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                evdoDbm, evdoEcio, evdoSnr, 99, INVALID,
1824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                INVALID, INVALID, INVALID, gsmFlag);
1834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
1844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /**
1864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * Copy constructors
1874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *
1884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param s Source SignalStrength
1894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *
1904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @hide
1914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     */
1924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public SignalStrength(SignalStrength s) {
1934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        copyFrom(s);
1944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
1954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /**
1974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * Initialize gsm/cdma values, sets lte values to defaults.
1984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *
1994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param gsmSignalStrength
2004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param gsmBitErrorRate
2014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param cdmaDbm
2024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param cdmaEcio
2034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param evdoDbm
2044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param evdoEcio
2054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param evdoSnr
2064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param gsm
2074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *
2084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @hide
2094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     */
2104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public void initialize(int gsmSignalStrength, int gsmBitErrorRate,
2114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            int cdmaDbm, int cdmaEcio,
2124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            int evdoDbm, int evdoEcio, int evdoSnr,
2134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            boolean gsm) {
2144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        initialize(gsmSignalStrength, gsmBitErrorRate, cdmaDbm, cdmaEcio,
2154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                evdoDbm, evdoEcio, evdoSnr, 99, INVALID,
2164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                INVALID, INVALID, INVALID, gsm);
2174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
2184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /**
2204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * Initialize all the values
2214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *
2224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param gsmSignalStrength
2234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param gsmBitErrorRate
2244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param cdmaDbm
2254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param cdmaEcio
2264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param evdoDbm
2274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param evdoEcio
2284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param evdoSnr
2294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param lteSignalStrength
2304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param lteRsrp
2314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param lteRsrq
2324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param lteRssnr
2334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param lteCqi
2344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @param gsm
2354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *
2364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @hide
2374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     */
2384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public void initialize(int gsmSignalStrength, int gsmBitErrorRate,
2394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            int cdmaDbm, int cdmaEcio,
2404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            int evdoDbm, int evdoEcio, int evdoSnr,
2414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            int lteSignalStrength, int lteRsrp, int lteRsrq, int lteRssnr, int lteCqi,
2424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            boolean gsm) {
243f27422a71112e77af77de0da2e60d4deb94a9375Martin Storsjo        mGsmSignalStrength = gsmSignalStrength;
2444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mGsmBitErrorRate = gsmBitErrorRate;
2454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mCdmaDbm = cdmaDbm;
2464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mCdmaEcio = cdmaEcio;
247f27422a71112e77af77de0da2e60d4deb94a9375Martin Storsjo        mEvdoDbm = evdoDbm;
2484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mEvdoEcio = evdoEcio;
2494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mEvdoSnr = evdoSnr;
2504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteSignalStrength = lteSignalStrength;
2514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteRsrp = lteRsrp;
2524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteRsrq = lteRsrq;
2534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteRssnr = lteRssnr;
2544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteCqi = lteCqi;
2554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mTdScdmaRscp = INVALID;
2564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        isGsm = gsm;
2574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (DBG) log("initialize: " + toString());
2584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
2594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /**
2614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @hide
2624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     */
2634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    protected void copyFrom(SignalStrength s) {
2644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mGsmSignalStrength = s.mGsmSignalStrength;
2654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mGsmBitErrorRate = s.mGsmBitErrorRate;
2664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mCdmaDbm = s.mCdmaDbm;
2674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mCdmaEcio = s.mCdmaEcio;
2684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mEvdoDbm = s.mEvdoDbm;
2694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mEvdoEcio = s.mEvdoEcio;
2704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mEvdoSnr = s.mEvdoSnr;
2714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteSignalStrength = s.mLteSignalStrength;
2724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteRsrp = s.mLteRsrp;
2734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteRsrq = s.mLteRsrq;
2744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteRssnr = s.mLteRssnr;
2754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteCqi = s.mLteCqi;
2764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mTdScdmaRscp = s.mTdScdmaRscp;
2774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        isGsm = s.isGsm;
2784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
2794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /**
2814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * Construct a SignalStrength object from the given parcel.
2824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *
2834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @hide
2844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     */
2854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public SignalStrength(Parcel in) {
2864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (DBG) log("Size of signalstrength parcel:" + in.dataSize());
2874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mGsmSignalStrength = in.readInt();
2894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mGsmBitErrorRate = in.readInt();
2904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mCdmaDbm = in.readInt();
2914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mCdmaEcio = in.readInt();
2924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mEvdoDbm = in.readInt();
2934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mEvdoEcio = in.readInt();
2944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mEvdoSnr = in.readInt();
2954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteSignalStrength = in.readInt();
2964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteRsrp = in.readInt();
2974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteRsrq = in.readInt();
2984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteRssnr = in.readInt();
2994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mLteCqi = in.readInt();
3004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        mTdScdmaRscp = in.readInt();
3014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        isGsm = (in.readInt() != 0);
3024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
3034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /**
3054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * Make a SignalStrength object from the given parcel as passed up by
3064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * the ril which does not have isGsm. isGsm will be changed by ServiceStateTracker
3074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * so the default is a don't care.
3084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     *
3094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * @hide
3104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     */
3114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public static SignalStrength makeSignalStrengthFromRilParcel(Parcel in) {
3124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (DBG) log("Size of signalstrength parcel:" + in.dataSize());
3134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        SignalStrength ss = new SignalStrength();
3154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ss.mGsmSignalStrength = in.readInt();
3164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ss.mGsmBitErrorRate = in.readInt();
3174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ss.mCdmaDbm = in.readInt();
3184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ss.mCdmaEcio = in.readInt();
3194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ss.mEvdoDbm = in.readInt();
3204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ss.mEvdoEcio = in.readInt();
3214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ss.mEvdoSnr = in.readInt();
3224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ss.mLteSignalStrength = in.readInt();
3234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ss.mLteRsrp = in.readInt();
3244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ss.mLteRsrq = in.readInt();
3254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ss.mLteRssnr = in.readInt();
3264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ss.mLteCqi = in.readInt();
3274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        ss.mTdScdmaRscp = in.readInt();
3284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        return ss;
3294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
3304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /**
3324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     * {@link Parcelable#writeToParcel}
3334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     */
3344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    public void writeToParcel(Parcel out, int flags) {
3354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        out.writeInt(mGsmSignalStrength);
3364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        out.writeInt(mGsmBitErrorRate);
3374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        out.writeInt(mCdmaDbm);
3384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        out.writeInt(mCdmaEcio);
3394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        out.writeInt(mEvdoDbm);
340ffa34edd0fd50d558f9bc7a650d959b4d3d29123Martin Storsjo        out.writeInt(mEvdoEcio);
3414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        out.writeInt(mEvdoSnr);
3424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        out.writeInt(mLteSignalStrength);
343        out.writeInt(mLteRsrp);
344        out.writeInt(mLteRsrq);
345        out.writeInt(mLteRssnr);
346        out.writeInt(mLteCqi);
347        out.writeInt(mTdScdmaRscp);
348        out.writeInt(isGsm ? 1 : 0);
349    }
350
351    /**
352     * {@link Parcelable#describeContents}
353     */
354    public int describeContents() {
355        return 0;
356    }
357
358    /**
359     * {@link Parcelable.Creator}
360     *
361     * @hide
362     */
363    public static final Parcelable.Creator<SignalStrength> CREATOR = new Parcelable.Creator() {
364        public SignalStrength createFromParcel(Parcel in) {
365            return new SignalStrength(in);
366        }
367
368        public SignalStrength[] newArray(int size) {
369            return new SignalStrength[size];
370        }
371    };
372
373    /**
374     * Validate the individual signal strength fields as per the range
375     * specified in ril.h
376     * Set to invalid any field that is not in the valid range
377     * Cdma, evdo, lte rsrp & rsrq values are sign converted
378     * when received from ril interface
379     *
380     * @return
381     *      Valid values for all signalstrength fields
382     * @hide
383     */
384    public void validateInput() {
385        if (DBG) log("Signal before validate=" + this);
386        // TS 27.007 8.5
387        mGsmSignalStrength = mGsmSignalStrength >= 0 ? mGsmSignalStrength : 99;
388        // BER no change;
389
390        mCdmaDbm = mCdmaDbm > 0 ? -mCdmaDbm : -120;
391        mCdmaEcio = (mCdmaEcio > 0) ? -mCdmaEcio : -160;
392
393        mEvdoDbm = (mEvdoDbm > 0) ? -mEvdoDbm : -120;
394        mEvdoEcio = (mEvdoEcio >= 0) ? -mEvdoEcio : -1;
395        mEvdoSnr = ((mEvdoSnr > 0) && (mEvdoSnr <= 8)) ? mEvdoSnr : -1;
396
397        // TS 36.214 Physical Layer Section 5.1.3, TS 36.331 RRC
398        mLteSignalStrength = (mLteSignalStrength >= 0) ? mLteSignalStrength : 99;
399        mLteRsrp = ((mLteRsrp >= 44) && (mLteRsrp <= 140)) ? -mLteRsrp : SignalStrength.INVALID;
400        mLteRsrq = ((mLteRsrq >= 3) && (mLteRsrq <= 20)) ? -mLteRsrq : SignalStrength.INVALID;
401        mLteRssnr = ((mLteRssnr >= -200) && (mLteRssnr <= 300)) ? mLteRssnr
402                : SignalStrength.INVALID;
403
404        mTdScdmaRscp = ((mTdScdmaRscp >= 25) && (mTdScdmaRscp <= 120))
405                ? -mTdScdmaRscp : SignalStrength.INVALID;
406        // Cqi no change
407        if (DBG) log("Signal after validate=" + this);
408    }
409
410    /**
411     * @param true - Gsm, Lte phones
412     *        false - Cdma phones
413     *
414     * Used by voice phone to set the isGsm
415     *        flag
416     * @hide
417     */
418    public void setGsm(boolean gsmFlag) {
419        isGsm = gsmFlag;
420    }
421
422    /**
423     * Get the GSM Signal Strength, valid values are (0-31, 99) as defined in TS
424     * 27.007 8.5
425     */
426    public int getGsmSignalStrength() {
427        return this.mGsmSignalStrength;
428    }
429
430    /**
431     * Get the GSM bit error rate (0-7, 99) as defined in TS 27.007 8.5
432     */
433    public int getGsmBitErrorRate() {
434        return this.mGsmBitErrorRate;
435    }
436
437    /**
438     * Get the CDMA RSSI value in dBm
439     */
440    public int getCdmaDbm() {
441        return this.mCdmaDbm;
442    }
443
444    /**
445     * Get the CDMA Ec/Io value in dB*10
446     */
447    public int getCdmaEcio() {
448        return this.mCdmaEcio;
449    }
450
451    /**
452     * Get the EVDO RSSI value in dBm
453     */
454    public int getEvdoDbm() {
455        return this.mEvdoDbm;
456    }
457
458    /**
459     * Get the EVDO Ec/Io value in dB*10
460     */
461    public int getEvdoEcio() {
462        return this.mEvdoEcio;
463    }
464
465    /**
466     * Get the signal to noise ratio. Valid values are 0-8. 8 is the highest.
467     */
468    public int getEvdoSnr() {
469        return this.mEvdoSnr;
470    }
471
472    /** @hide */
473    public int getLteSignalStrength() {
474        return mLteSignalStrength;
475    }
476
477    /** @hide */
478    public int getLteRsrp() {
479        return mLteRsrp;
480    }
481
482    /** @hide */
483    public int getLteRsrq() {
484        return mLteRsrq;
485    }
486
487    /** @hide */
488    public int getLteRssnr() {
489        return mLteRssnr;
490    }
491
492    /** @hide */
493    public int getLteCqi() {
494        return mLteCqi;
495    }
496
497    /**
498     * Retrieve an abstract level value for the overall signal strength.
499     *
500     * @return a single integer from 0 to 4 representing the general signal quality.
501     *     This may take into account many different radio technology inputs.
502     *     0 represents very poor signal strength
503     *     while 4 represents a very strong signal strength.
504     */
505    public int getLevel() {
506        int level = 0;
507
508        if (isGsm) {
509            level = getLteLevel();
510            if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
511                level = getTdScdmaLevel();
512                if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
513                    level = getGsmLevel();
514                }
515            }
516        } else {
517            int cdmaLevel = getCdmaLevel();
518            int evdoLevel = getEvdoLevel();
519            if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
520                /* We don't know evdo, use cdma */
521                level = cdmaLevel;
522            } else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
523                /* We don't know cdma, use evdo */
524                level = evdoLevel;
525            } else {
526                /* We know both, use the lowest level */
527                level = cdmaLevel < evdoLevel ? cdmaLevel : evdoLevel;
528            }
529        }
530        if (DBG) log("getLevel=" + level);
531        return level;
532    }
533
534    /**
535     * Get the signal level as an asu value between 0..31, 99 is unknown
536     *
537     * @hide
538     */
539    public int getAsuLevel() {
540        int asuLevel = 0;
541        if (isGsm) {
542            if (getLteLevel() == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
543                if (getTdScdmaLevel() == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
544                    asuLevel = getGsmAsuLevel();
545                } else {
546                    asuLevel = getTdScdmaAsuLevel();
547                }
548            } else {
549                asuLevel = getLteAsuLevel();
550            }
551        } else {
552            int cdmaAsuLevel = getCdmaAsuLevel();
553            int evdoAsuLevel = getEvdoAsuLevel();
554            if (evdoAsuLevel == 0) {
555                /* We don't know evdo use, cdma */
556                asuLevel = cdmaAsuLevel;
557            } else if (cdmaAsuLevel == 0) {
558                /* We don't know cdma use, evdo */
559                asuLevel = evdoAsuLevel;
560            } else {
561                /* We know both, use the lowest level */
562                asuLevel = cdmaAsuLevel < evdoAsuLevel ? cdmaAsuLevel : evdoAsuLevel;
563            }
564        }
565        if (DBG) log("getAsuLevel=" + asuLevel);
566        return asuLevel;
567    }
568
569    /**
570     * Get the signal strength as dBm
571     *
572     * @hide
573     */
574    public int getDbm() {
575        int dBm = INVALID;
576
577        if(isGsm()) {
578            dBm = getLteDbm();
579            if (dBm == INVALID) {
580                if (getTdScdmaLevel() == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
581                    dBm = getGsmDbm();
582                } else {
583                    dBm = getTdScdmaDbm();
584                }
585            }
586        } else {
587            int cdmaDbm = getCdmaDbm();
588            int evdoDbm = getEvdoDbm();
589
590            return (evdoDbm == -120) ? cdmaDbm : ((cdmaDbm == -120) ? evdoDbm
591                    : (cdmaDbm < evdoDbm ? cdmaDbm : evdoDbm));
592        }
593        if (DBG) log("getDbm=" + dBm);
594        return dBm;
595    }
596
597    /**
598     * Get Gsm signal strength as dBm
599     *
600     * @hide
601     */
602    public int getGsmDbm() {
603        int dBm;
604
605        int gsmSignalStrength = getGsmSignalStrength();
606        int asu = (gsmSignalStrength == 99 ? -1 : gsmSignalStrength);
607        if (asu != -1) {
608            dBm = -113 + (2 * asu);
609        } else {
610            dBm = -1;
611        }
612        if (DBG) log("getGsmDbm=" + dBm);
613        return dBm;
614    }
615
616    /**
617     * Get gsm as level 0..4
618     *
619     * @hide
620     */
621    public int getGsmLevel() {
622        int level;
623
624        // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
625        // asu = 0 (-113dB or less) is very weak
626        // signal, its better to show 0 bars to the user in such cases.
627        // asu = 99 is a special case, where the signal strength is unknown.
628        int asu = getGsmSignalStrength();
629        if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
630        else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT;
631        else if (asu >= 8)  level = SIGNAL_STRENGTH_GOOD;
632        else if (asu >= 5)  level = SIGNAL_STRENGTH_MODERATE;
633        else level = SIGNAL_STRENGTH_POOR;
634        if (DBG) log("getGsmLevel=" + level);
635        return level;
636    }
637
638    /**
639     * Get the gsm signal level as an asu value between 0..31, 99 is unknown
640     *
641     * @hide
642     */
643    public int getGsmAsuLevel() {
644        // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
645        // asu = 0 (-113dB or less) is very weak
646        // signal, its better to show 0 bars to the user in such cases.
647        // asu = 99 is a special case, where the signal strength is unknown.
648        int level = getGsmSignalStrength();
649        if (DBG) log("getGsmAsuLevel=" + level);
650        return level;
651    }
652
653    /**
654     * Get cdma as level 0..4
655     *
656     * @hide
657     */
658    public int getCdmaLevel() {
659        final int cdmaDbm = getCdmaDbm();
660        final int cdmaEcio = getCdmaEcio();
661        int levelDbm;
662        int levelEcio;
663
664        if (cdmaDbm >= -75) levelDbm = SIGNAL_STRENGTH_GREAT;
665        else if (cdmaDbm >= -85) levelDbm = SIGNAL_STRENGTH_GOOD;
666        else if (cdmaDbm >= -95) levelDbm = SIGNAL_STRENGTH_MODERATE;
667        else if (cdmaDbm >= -100) levelDbm = SIGNAL_STRENGTH_POOR;
668        else levelDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
669
670        // Ec/Io are in dB*10
671        if (cdmaEcio >= -90) levelEcio = SIGNAL_STRENGTH_GREAT;
672        else if (cdmaEcio >= -110) levelEcio = SIGNAL_STRENGTH_GOOD;
673        else if (cdmaEcio >= -130) levelEcio = SIGNAL_STRENGTH_MODERATE;
674        else if (cdmaEcio >= -150) levelEcio = SIGNAL_STRENGTH_POOR;
675        else levelEcio = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
676
677        int level = (levelDbm < levelEcio) ? levelDbm : levelEcio;
678        if (DBG) log("getCdmaLevel=" + level);
679        return level;
680    }
681
682    /**
683     * Get the cdma signal level as an asu value between 0..31, 99 is unknown
684     *
685     * @hide
686     */
687    public int getCdmaAsuLevel() {
688        final int cdmaDbm = getCdmaDbm();
689        final int cdmaEcio = getCdmaEcio();
690        int cdmaAsuLevel;
691        int ecioAsuLevel;
692
693        if (cdmaDbm >= -75) cdmaAsuLevel = 16;
694        else if (cdmaDbm >= -82) cdmaAsuLevel = 8;
695        else if (cdmaDbm >= -90) cdmaAsuLevel = 4;
696        else if (cdmaDbm >= -95) cdmaAsuLevel = 2;
697        else if (cdmaDbm >= -100) cdmaAsuLevel = 1;
698        else cdmaAsuLevel = 99;
699
700        // Ec/Io are in dB*10
701        if (cdmaEcio >= -90) ecioAsuLevel = 16;
702        else if (cdmaEcio >= -100) ecioAsuLevel = 8;
703        else if (cdmaEcio >= -115) ecioAsuLevel = 4;
704        else if (cdmaEcio >= -130) ecioAsuLevel = 2;
705        else if (cdmaEcio >= -150) ecioAsuLevel = 1;
706        else ecioAsuLevel = 99;
707
708        int level = (cdmaAsuLevel < ecioAsuLevel) ? cdmaAsuLevel : ecioAsuLevel;
709        if (DBG) log("getCdmaAsuLevel=" + level);
710        return level;
711    }
712
713    /**
714     * Get Evdo as level 0..4
715     *
716     * @hide
717     */
718    public int getEvdoLevel() {
719        int evdoDbm = getEvdoDbm();
720        int evdoSnr = getEvdoSnr();
721        int levelEvdoDbm;
722        int levelEvdoSnr;
723
724        if (evdoDbm >= -65) levelEvdoDbm = SIGNAL_STRENGTH_GREAT;
725        else if (evdoDbm >= -75) levelEvdoDbm = SIGNAL_STRENGTH_GOOD;
726        else if (evdoDbm >= -90) levelEvdoDbm = SIGNAL_STRENGTH_MODERATE;
727        else if (evdoDbm >= -105) levelEvdoDbm = SIGNAL_STRENGTH_POOR;
728        else levelEvdoDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
729
730        if (evdoSnr >= 7) levelEvdoSnr = SIGNAL_STRENGTH_GREAT;
731        else if (evdoSnr >= 5) levelEvdoSnr = SIGNAL_STRENGTH_GOOD;
732        else if (evdoSnr >= 3) levelEvdoSnr = SIGNAL_STRENGTH_MODERATE;
733        else if (evdoSnr >= 1) levelEvdoSnr = SIGNAL_STRENGTH_POOR;
734        else levelEvdoSnr = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
735
736        int level = (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr;
737        if (DBG) log("getEvdoLevel=" + level);
738        return level;
739    }
740
741    /**
742     * Get the evdo signal level as an asu value between 0..31, 99 is unknown
743     *
744     * @hide
745     */
746    public int getEvdoAsuLevel() {
747        int evdoDbm = getEvdoDbm();
748        int evdoSnr = getEvdoSnr();
749        int levelEvdoDbm;
750        int levelEvdoSnr;
751
752        if (evdoDbm >= -65) levelEvdoDbm = 16;
753        else if (evdoDbm >= -75) levelEvdoDbm = 8;
754        else if (evdoDbm >= -85) levelEvdoDbm = 4;
755        else if (evdoDbm >= -95) levelEvdoDbm = 2;
756        else if (evdoDbm >= -105) levelEvdoDbm = 1;
757        else levelEvdoDbm = 99;
758
759        if (evdoSnr >= 7) levelEvdoSnr = 16;
760        else if (evdoSnr >= 6) levelEvdoSnr = 8;
761        else if (evdoSnr >= 5) levelEvdoSnr = 4;
762        else if (evdoSnr >= 3) levelEvdoSnr = 2;
763        else if (evdoSnr >= 1) levelEvdoSnr = 1;
764        else levelEvdoSnr = 99;
765
766        int level = (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr;
767        if (DBG) log("getEvdoAsuLevel=" + level);
768        return level;
769    }
770
771    /**
772     * Get LTE as dBm
773     *
774     * @hide
775     */
776    public int getLteDbm() {
777        return mLteRsrp;
778    }
779
780    /**
781     * Get LTE as level 0..4
782     *
783     * @hide
784     */
785    public int getLteLevel() {
786        /*
787         * TS 36.214 Physical Layer Section 5.1.3 TS 36.331 RRC RSSI = received
788         * signal + noise RSRP = reference signal dBm RSRQ = quality of signal
789         * dB= Number of Resource blocksxRSRP/RSSI SNR = gain=signal/noise ratio
790         * = -10log P1/P2 dB
791         */
792        int rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN, rsrpIconLevel = -1, snrIconLevel = -1;
793
794        int rsrpThreshType = Resources.getSystem().getInteger(com.android.internal.R.integer.
795                config_LTE_RSRP_threshold_type);
796        int[] threshRsrp;
797        if (rsrpThreshType == RSRP_THRESH_TYPE_STRICT) {
798            threshRsrp = RSRP_THRESH_STRICT;
799        } else {
800            threshRsrp = RSRP_THRESH_LENIENT;
801        }
802
803        if (mLteRsrp > threshRsrp[5]) rsrpIconLevel = -1;
804        else if (mLteRsrp >= threshRsrp[4]) rsrpIconLevel = SIGNAL_STRENGTH_GREAT;
805        else if (mLteRsrp >= threshRsrp[3]) rsrpIconLevel = SIGNAL_STRENGTH_GOOD;
806        else if (mLteRsrp >= threshRsrp[2]) rsrpIconLevel = SIGNAL_STRENGTH_MODERATE;
807        else if (mLteRsrp >= threshRsrp[1]) rsrpIconLevel = SIGNAL_STRENGTH_POOR;
808        else if (mLteRsrp >= threshRsrp[0]) rsrpIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
809
810        /*
811         * Values are -200 dB to +300 (SNR*10dB) RS_SNR >= 13.0 dB =>4 bars 4.5
812         * dB <= RS_SNR < 13.0 dB => 3 bars 1.0 dB <= RS_SNR < 4.5 dB => 2 bars
813         * -3.0 dB <= RS_SNR < 1.0 dB 1 bar RS_SNR < -3.0 dB/No Service Antenna
814         * Icon Only
815         */
816        if (mLteRssnr > 300) snrIconLevel = -1;
817        else if (mLteRssnr >= 130) snrIconLevel = SIGNAL_STRENGTH_GREAT;
818        else if (mLteRssnr >= 45) snrIconLevel = SIGNAL_STRENGTH_GOOD;
819        else if (mLteRssnr >= 10) snrIconLevel = SIGNAL_STRENGTH_MODERATE;
820        else if (mLteRssnr >= -30) snrIconLevel = SIGNAL_STRENGTH_POOR;
821        else if (mLteRssnr >= -200)
822            snrIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
823
824        if (DBG) log("getLTELevel - rsrp:" + mLteRsrp + " snr:" + mLteRssnr + " rsrpIconLevel:"
825                + rsrpIconLevel + " snrIconLevel:" + snrIconLevel);
826
827        /* Choose a measurement type to use for notification */
828        if (snrIconLevel != -1 && rsrpIconLevel != -1) {
829            /*
830             * The number of bars displayed shall be the smaller of the bars
831             * associated with LTE RSRP and the bars associated with the LTE
832             * RS_SNR
833             */
834            return (rsrpIconLevel < snrIconLevel ? rsrpIconLevel : snrIconLevel);
835        }
836
837        if (snrIconLevel != -1) return snrIconLevel;
838
839        if (rsrpIconLevel != -1) return rsrpIconLevel;
840
841        /* Valid values are (0-63, 99) as defined in TS 36.331 */
842        if (mLteSignalStrength > 63) rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
843        else if (mLteSignalStrength >= 12) rssiIconLevel = SIGNAL_STRENGTH_GREAT;
844        else if (mLteSignalStrength >= 8) rssiIconLevel = SIGNAL_STRENGTH_GOOD;
845        else if (mLteSignalStrength >= 5) rssiIconLevel = SIGNAL_STRENGTH_MODERATE;
846        else if (mLteSignalStrength >= 0) rssiIconLevel = SIGNAL_STRENGTH_POOR;
847
848        if (DBG) log("getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"
849                + rssiIconLevel);
850        return rssiIconLevel;
851
852    }
853    /**
854     * Get the LTE signal level as an asu value between 0..97, 99 is unknown
855     * Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69
856     *
857     * @hide
858     */
859    public int getLteAsuLevel() {
860        int lteAsuLevel = 99;
861        int lteDbm = getLteDbm();
862        /*
863         * 3GPP 27.007 (Ver 10.3.0) Sec 8.69
864         * 0   -140 dBm or less
865         * 1   -139 dBm
866         * 2...96  -138... -44 dBm
867         * 97  -43 dBm or greater
868         * 255 not known or not detectable
869         */
870        /*
871         * validateInput will always give a valid range between -140 t0 -44 as
872         * per ril.h. so RSRP >= -43 & <-140 will fall under asu level 255
873         * and not 97 or 0
874         */
875        if (lteDbm == SignalStrength.INVALID) lteAsuLevel = 255;
876        else lteAsuLevel = lteDbm + 140;
877        if (DBG) log("Lte Asu level: "+lteAsuLevel);
878        return lteAsuLevel;
879    }
880
881    /**
882     * @return true if this is for GSM
883     */
884    public boolean isGsm() {
885        return this.isGsm;
886    }
887
888    /**
889     * @return get TD_SCDMA dbm
890     *
891     * @hide
892     */
893    public int getTdScdmaDbm() {
894        return this.mTdScdmaRscp;
895    }
896
897    /**
898     * Get TD-SCDMA as level 0..4
899     * Range : 25 to 120
900     * INT_MAX: 0x7FFFFFFF denotes invalid value
901     * Reference: 3GPP TS 25.123, section 9.1.1.1
902     *
903     * @hide
904     */
905    public int getTdScdmaLevel() {
906        final int tdScdmaDbm = getTdScdmaDbm();
907        int level;
908
909        if ((tdScdmaDbm > -25) || (tdScdmaDbm == SignalStrength.INVALID))
910                level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
911        else if (tdScdmaDbm >= -49) level = SIGNAL_STRENGTH_GREAT;
912        else if (tdScdmaDbm >= -73) level = SIGNAL_STRENGTH_GOOD;
913        else if (tdScdmaDbm >= -97) level = SIGNAL_STRENGTH_MODERATE;
914        else if (tdScdmaDbm >= -120) level = SIGNAL_STRENGTH_POOR;
915        else level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
916
917        if (DBG) log("getTdScdmaLevel = " + level);
918        return level;
919     }
920
921    /**
922     * Get the TD-SCDMA signal level as an asu value.
923     *
924     * @hide
925     */
926    public int getTdScdmaAsuLevel() {
927        final int tdScdmaDbm = getTdScdmaDbm();
928        int tdScdmaAsuLevel;
929
930        if (tdScdmaDbm == INVALID) tdScdmaAsuLevel = 255;
931        else tdScdmaAsuLevel = tdScdmaDbm + 120;
932        if (DBG) log("TD-SCDMA Asu level: " + tdScdmaAsuLevel);
933        return tdScdmaAsuLevel;
934    }
935
936   /**
937     * @return hash code
938     */
939    @Override
940    public int hashCode() {
941        int primeNum = 31;
942        return ((mGsmSignalStrength * primeNum)
943                + (mGsmBitErrorRate * primeNum)
944                + (mCdmaDbm * primeNum) + (mCdmaEcio * primeNum)
945                + (mEvdoDbm * primeNum) + (mEvdoEcio * primeNum) + (mEvdoSnr * primeNum)
946                + (mLteSignalStrength * primeNum) + (mLteRsrp * primeNum)
947                + (mLteRsrq * primeNum) + (mLteRssnr * primeNum) + (mLteCqi * primeNum)
948                + (mTdScdmaRscp * primeNum) + (isGsm ? 1 : 0));
949    }
950
951    /**
952     * @return true if the signal strengths are the same
953     */
954    @Override
955    public boolean equals (Object o) {
956        SignalStrength s;
957
958        try {
959            s = (SignalStrength) o;
960        } catch (ClassCastException ex) {
961            return false;
962        }
963
964        if (o == null) {
965            return false;
966        }
967
968        return (mGsmSignalStrength == s.mGsmSignalStrength
969                && mGsmBitErrorRate == s.mGsmBitErrorRate
970                && mCdmaDbm == s.mCdmaDbm
971                && mCdmaEcio == s.mCdmaEcio
972                && mEvdoDbm == s.mEvdoDbm
973                && mEvdoEcio == s.mEvdoEcio
974                && mEvdoSnr == s.mEvdoSnr
975                && mLteSignalStrength == s.mLteSignalStrength
976                && mLteRsrp == s.mLteRsrp
977                && mLteRsrq == s.mLteRsrq
978                && mLteRssnr == s.mLteRssnr
979                && mLteCqi == s.mLteCqi
980                && mTdScdmaRscp == s.mTdScdmaRscp
981                && isGsm == s.isGsm);
982    }
983
984    /**
985     * @return string representation.
986     */
987    @Override
988    public String toString() {
989        return ("SignalStrength:"
990                + " " + mGsmSignalStrength
991                + " " + mGsmBitErrorRate
992                + " " + mCdmaDbm
993                + " " + mCdmaEcio
994                + " " + mEvdoDbm
995                + " " + mEvdoEcio
996                + " " + mEvdoSnr
997                + " " + mLteSignalStrength
998                + " " + mLteRsrp
999                + " " + mLteRsrq
1000                + " " + mLteRssnr
1001                + " " + mLteCqi
1002                + " " + mTdScdmaRscp
1003                + " " + (isGsm ? "gsm|lte" : "cdma"));
1004    }
1005
1006    /**
1007     * Set SignalStrength based on intent notifier map
1008     *
1009     * @param m intent notifier map
1010     * @hide
1011     */
1012    private void setFromNotifierBundle(Bundle m) {
1013        mGsmSignalStrength = m.getInt("GsmSignalStrength");
1014        mGsmBitErrorRate = m.getInt("GsmBitErrorRate");
1015        mCdmaDbm = m.getInt("CdmaDbm");
1016        mCdmaEcio = m.getInt("CdmaEcio");
1017        mEvdoDbm = m.getInt("EvdoDbm");
1018        mEvdoEcio = m.getInt("EvdoEcio");
1019        mEvdoSnr = m.getInt("EvdoSnr");
1020        mLteSignalStrength = m.getInt("LteSignalStrength");
1021        mLteRsrp = m.getInt("LteRsrp");
1022        mLteRsrq = m.getInt("LteRsrq");
1023        mLteRssnr = m.getInt("LteRssnr");
1024        mLteCqi = m.getInt("LteCqi");
1025        mTdScdmaRscp = m.getInt("TdScdma");
1026        isGsm = m.getBoolean("isGsm");
1027    }
1028
1029    /**
1030     * Set intent notifier Bundle based on SignalStrength
1031     *
1032     * @param m intent notifier Bundle
1033     * @hide
1034     */
1035    public void fillInNotifierBundle(Bundle m) {
1036        m.putInt("GsmSignalStrength", mGsmSignalStrength);
1037        m.putInt("GsmBitErrorRate", mGsmBitErrorRate);
1038        m.putInt("CdmaDbm", mCdmaDbm);
1039        m.putInt("CdmaEcio", mCdmaEcio);
1040        m.putInt("EvdoDbm", mEvdoDbm);
1041        m.putInt("EvdoEcio", mEvdoEcio);
1042        m.putInt("EvdoSnr", mEvdoSnr);
1043        m.putInt("LteSignalStrength", mLteSignalStrength);
1044        m.putInt("LteRsrp", mLteRsrp);
1045        m.putInt("LteRsrq", mLteRsrq);
1046        m.putInt("LteRssnr", mLteRssnr);
1047        m.putInt("LteCqi", mLteCqi);
1048        m.putInt("TdScdma", mTdScdmaRscp);
1049        m.putBoolean("isGsm", Boolean.valueOf(isGsm));
1050    }
1051
1052    /**
1053     * log
1054     */
1055    private static void log(String s) {
1056        Rlog.w(LOG_TAG, s);
1057    }
1058}
1059