package android.telephony;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.telephony.CarrierConfigManager;
import android.util.Log;
import android.content.res.Resources;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Objects;
public class SignalStrength implements Parcelable {
private static final String LOG_TAG = "SignalStrength";
private static final boolean DBG = false;
public static final int SIGNAL_STRENGTH_NONE_OR_UNKNOWN
= TelephonyProtoEnums.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
public static final int SIGNAL_STRENGTH_POOR
= TelephonyProtoEnums.SIGNAL_STRENGTH_POOR;
public static final int SIGNAL_STRENGTH_MODERATE
= TelephonyProtoEnums.SIGNAL_STRENGTH_MODERATE;
public static final int SIGNAL_STRENGTH_GOOD
= TelephonyProtoEnums.SIGNAL_STRENGTH_GOOD;
public static final int SIGNAL_STRENGTH_GREAT
= TelephonyProtoEnums.SIGNAL_STRENGTH_GREAT;
public static final int NUM_SIGNAL_STRENGTH_BINS = 5;
public static final String[] SIGNAL_STRENGTH_NAMES = {
"none", "poor", "moderate", "good", "great"
};
public static final int INVALID = Integer.MAX_VALUE;
private static final int LTE_RSRP_THRESHOLDS_NUM = 4;
private static final int MAX_LTE_RSRP = -44;
private static final int MIN_LTE_RSRP = -140;
private static final int WCDMA_RSCP_THRESHOLDS_NUM = 4;
private static final int MAX_WCDMA_RSCP = -24;
private static final int MIN_WCDMA_RSCP = -120;
private static final String MEASUMENT_TYPE_RSCP = "rscp";
private int mGsmSignalStrength;
private int mGsmBitErrorRate;
private int mCdmaDbm;
private int mCdmaEcio;
private int mEvdoDbm;
private int mEvdoEcio;
private int mEvdoSnr;
private int mLteSignalStrength;
private int mLteRsrp;
private int mLteRsrq;
private int mLteRssnr;
private int mLteCqi;
private int mTdScdmaRscp;
private int mWcdmaSignalStrength;
private int mWcdmaRscpAsu;
private int mWcdmaRscp;
private int mLteRsrpBoost;
private boolean mIsGsm;
private boolean mUseOnlyRsrpForLteLevel;
private int mLteRsrpThresholds[] = new int[LTE_RSRP_THRESHOLDS_NUM];
private String mWcdmaDefaultSignalMeasurement;
private int mWcdmaRscpThresholds[] = new int[WCDMA_RSCP_THRESHOLDS_NUM];
public static SignalStrength newFromBundle(Bundle m) {
SignalStrength ret;
ret = new SignalStrength();
ret.setFromNotifierBundle(m);
return ret;
}
public SignalStrength() {
this(true);
}
public SignalStrength(boolean gsmFlag) {
mGsmSignalStrength = 99;
mGsmBitErrorRate = -1;
mCdmaDbm = -1;
mCdmaEcio = -1;
mEvdoDbm = -1;
mEvdoEcio = -1;
mEvdoSnr = -1;
mLteSignalStrength = 99;
mLteRsrp = INVALID;
mLteRsrq = INVALID;
mLteRssnr = INVALID;
mLteCqi = INVALID;
mTdScdmaRscp = INVALID;
mWcdmaSignalStrength = 99;
mWcdmaRscp = INVALID;
mWcdmaRscpAsu = 255;
mLteRsrpBoost = 0;
mIsGsm = gsmFlag;
mUseOnlyRsrpForLteLevel = false;
mWcdmaDefaultSignalMeasurement = "";
setLteRsrpThresholds(getDefaultLteRsrpThresholds());
setWcdmaRscpThresholds(getDefaultWcdmaRscpThresholds());
}
public SignalStrength(
int gsmSignalStrength, int gsmBitErrorRate,
int cdmaDbm, int cdmaEcio,
int evdoDbm, int evdoEcio, int evdoSnr,
int lteSignalStrength, int lteRsrp, int lteRsrq, int lteRssnr, int lteCqi,
int tdScdmaRscp, int wcdmaSignalStrength, int wcdmaRscpAsu,
int lteRsrpBoost, boolean gsmFlag, boolean lteLevelBaseOnRsrp,
String wcdmaDefaultMeasurement) {
mGsmSignalStrength = gsmSignalStrength;
mGsmBitErrorRate = gsmBitErrorRate;
mCdmaDbm = cdmaDbm;
mCdmaEcio = cdmaEcio;
mEvdoDbm = evdoDbm;
mEvdoEcio = evdoEcio;
mEvdoSnr = evdoSnr;
mLteSignalStrength = lteSignalStrength;
mLteRsrp = lteRsrp;
mLteRsrq = lteRsrq;
mLteRssnr = lteRssnr;
mLteCqi = lteCqi;
mTdScdmaRscp = INVALID;
mWcdmaSignalStrength = wcdmaSignalStrength;
mWcdmaRscpAsu = wcdmaRscpAsu;
mWcdmaRscp = wcdmaRscpAsu - 120;
mLteRsrpBoost = lteRsrpBoost;
mIsGsm = gsmFlag;
mUseOnlyRsrpForLteLevel = lteLevelBaseOnRsrp;
mWcdmaDefaultSignalMeasurement = wcdmaDefaultMeasurement;
setLteRsrpThresholds(getDefaultLteRsrpThresholds());
setWcdmaRscpThresholds(getDefaultWcdmaRscpThresholds());
if (DBG) log("initialize: " + toString());
}
public SignalStrength(int gsmSignalStrength, int gsmBitErrorRate,
int cdmaDbm, int cdmaEcio,
int evdoDbm, int evdoEcio, int evdoSnr,
int lteSignalStrength, int lteRsrp, int lteRsrq, int lteRssnr, int lteCqi,
int tdScdmaRscp) {
this(gsmSignalStrength, gsmBitErrorRate, cdmaDbm, cdmaEcio,
evdoDbm, evdoEcio, evdoSnr, lteSignalStrength, lteRsrp,
lteRsrq, lteRssnr, lteCqi, tdScdmaRscp, 99, INVALID, 0, true, false, "");
}
public SignalStrength(int gsmSignalStrength, int gsmBitErrorRate,
int cdmaDbm, int cdmaEcio,
int evdoDbm, int evdoEcio, int evdoSnr,
int lteSignalStrength, int lteRsrp, int lteRsrq, int lteRssnr, int lteCqi,
int tdScdmaRscp, int wcdmaSignalStrength, int wcdmaRscp) {
this(gsmSignalStrength, gsmBitErrorRate, cdmaDbm, cdmaEcio,
evdoDbm, evdoEcio, evdoSnr, lteSignalStrength, lteRsrp,
lteRsrq, lteRssnr, lteCqi, tdScdmaRscp, wcdmaSignalStrength, wcdmaRscp, 0, true,
false, "");
}
public SignalStrength(SignalStrength s) {
copyFrom(s);
}
protected void copyFrom(SignalStrength s) {
mGsmSignalStrength = s.mGsmSignalStrength;
mGsmBitErrorRate = s.mGsmBitErrorRate;
mCdmaDbm = s.mCdmaDbm;
mCdmaEcio = s.mCdmaEcio;
mEvdoDbm = s.mEvdoDbm;
mEvdoEcio = s.mEvdoEcio;
mEvdoSnr = s.mEvdoSnr;
mLteSignalStrength = s.mLteSignalStrength;
mLteRsrp = s.mLteRsrp;
mLteRsrq = s.mLteRsrq;
mLteRssnr = s.mLteRssnr;
mLteCqi = s.mLteCqi;
mTdScdmaRscp = s.mTdScdmaRscp;
mWcdmaSignalStrength = s.mWcdmaSignalStrength;
mWcdmaRscpAsu = s.mWcdmaRscpAsu;
mWcdmaRscp = s.mWcdmaRscp;
mLteRsrpBoost = s.mLteRsrpBoost;
mIsGsm = s.mIsGsm;
mUseOnlyRsrpForLteLevel = s.mUseOnlyRsrpForLteLevel;
mWcdmaDefaultSignalMeasurement = s.mWcdmaDefaultSignalMeasurement;
setLteRsrpThresholds(s.mLteRsrpThresholds);
setWcdmaRscpThresholds(s.mWcdmaRscpThresholds);
}
public SignalStrength(Parcel in) {
if (DBG) log("Size of signalstrength parcel:" + in.dataSize());
mGsmSignalStrength = in.readInt();
mGsmBitErrorRate = in.readInt();
mCdmaDbm = in.readInt();
mCdmaEcio = in.readInt();
mEvdoDbm = in.readInt();
mEvdoEcio = in.readInt();
mEvdoSnr = in.readInt();
mLteSignalStrength = in.readInt();
mLteRsrp = in.readInt();
mLteRsrq = in.readInt();
mLteRssnr = in.readInt();
mLteCqi = in.readInt();
mTdScdmaRscp = in.readInt();
mWcdmaSignalStrength = in.readInt();
mWcdmaRscpAsu = in.readInt();
mWcdmaRscp = in.readInt();
mLteRsrpBoost = in.readInt();
mIsGsm = in.readBoolean();
mUseOnlyRsrpForLteLevel = in.readBoolean();
mWcdmaDefaultSignalMeasurement = in.readString();
in.readIntArray(mLteRsrpThresholds);
in.readIntArray(mWcdmaRscpThresholds);
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mGsmSignalStrength);
out.writeInt(mGsmBitErrorRate);
out.writeInt(mCdmaDbm);
out.writeInt(mCdmaEcio);
out.writeInt(mEvdoDbm);
out.writeInt(mEvdoEcio);
out.writeInt(mEvdoSnr);
out.writeInt(mLteSignalStrength);
out.writeInt(mLteRsrp);
out.writeInt(mLteRsrq);
out.writeInt(mLteRssnr);
out.writeInt(mLteCqi);
out.writeInt(mTdScdmaRscp);
out.writeInt(mWcdmaSignalStrength);
out.writeInt(mWcdmaRscpAsu);
out.writeInt(mWcdmaRscp);
out.writeInt(mLteRsrpBoost);
out.writeBoolean(mIsGsm);
out.writeBoolean(mUseOnlyRsrpForLteLevel);
out.writeString(mWcdmaDefaultSignalMeasurement);
out.writeIntArray(mLteRsrpThresholds);
out.writeIntArray(mWcdmaRscpThresholds);
}
public int describeContents() {
return 0;
}
public static final Parcelable.Creator<SignalStrength> CREATOR = new Parcelable.Creator() {
public SignalStrength createFromParcel(Parcel in) {
return new SignalStrength(in);
}
public SignalStrength[] newArray(int size) {
return new SignalStrength[size];
}
};
public void validateInput() {
if (DBG) log("Signal before validate=" + this);
mGsmSignalStrength = mGsmSignalStrength >= 0 ? mGsmSignalStrength : 99;
mWcdmaSignalStrength = (mWcdmaSignalStrength >= 0) ? mWcdmaSignalStrength : 99;
mLteSignalStrength = (mLteSignalStrength >= 0) ? mLteSignalStrength : 99;
mWcdmaRscpAsu =
((mWcdmaRscpAsu - 120 >= MIN_WCDMA_RSCP) && (mWcdmaRscpAsu - 120 <= MAX_WCDMA_RSCP))
? mWcdmaRscpAsu : 255;
mWcdmaRscp = ((mWcdmaRscp >= MIN_WCDMA_RSCP) && (mWcdmaRscp <= MAX_WCDMA_RSCP))
? mWcdmaRscp : INVALID;
mCdmaDbm = mCdmaDbm > 0 ? -mCdmaDbm : -120;
mCdmaEcio = (mCdmaEcio >= 0) ? -mCdmaEcio : -160;
mEvdoDbm = (mEvdoDbm > 0) ? -mEvdoDbm : -120;
mEvdoEcio = (mEvdoEcio >= 0) ? -mEvdoEcio : -160;
mEvdoSnr = ((mEvdoSnr >= 0) && (mEvdoSnr <= 8)) ? mEvdoSnr : -1;
mLteRsrp = ((-mLteRsrp >= MIN_LTE_RSRP) && (-mLteRsrp <= MAX_LTE_RSRP)) ? -mLteRsrp
: SignalStrength.INVALID;
mLteRsrq = ((mLteRsrq >= 3) && (mLteRsrq <= 20)) ? -mLteRsrq : SignalStrength.INVALID;
mLteRssnr = ((mLteRssnr >= -200) && (mLteRssnr <= 300)) ? mLteRssnr
: SignalStrength.INVALID;
mTdScdmaRscp = ((mTdScdmaRscp >= 0) && (mTdScdmaRscp <= 96))
? (mTdScdmaRscp - 120) : SignalStrength.INVALID;
if (DBG) log("Signal after validate=" + this);
}
public void fixType() {
mIsGsm = getCdmaRelatedSignalStrength() == SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
}
public void setGsm(boolean gsmFlag) {
mIsGsm = gsmFlag;
}
public void setUseOnlyRsrpForLteLevel(boolean useOnlyRsrpForLteLevel) {
mUseOnlyRsrpForLteLevel = useOnlyRsrpForLteLevel;
}
public void setWcdmaDefaultSignalMeasurement(String defaultMeasurement) {
mWcdmaDefaultSignalMeasurement = defaultMeasurement;
}
public void setLteRsrpBoost(int lteRsrpBoost) {
mLteRsrpBoost = lteRsrpBoost;
}
public void setLteRsrpThresholds(int[] lteRsrpThresholds) {
if ((lteRsrpThresholds == null)
|| (lteRsrpThresholds.length != LTE_RSRP_THRESHOLDS_NUM)) {
Log.wtf(LOG_TAG, "setLteRsrpThresholds - lteRsrpThresholds is invalid.");
return;
}
System.arraycopy(lteRsrpThresholds, 0, mLteRsrpThresholds, 0, LTE_RSRP_THRESHOLDS_NUM);
}
public int getGsmSignalStrength() {
return this.mGsmSignalStrength;
}
public int getGsmBitErrorRate() {
return this.mGsmBitErrorRate;
}
public void setWcdmaRscpThresholds(int[] wcdmaRscpThresholds) {
if ((wcdmaRscpThresholds == null)
|| (wcdmaRscpThresholds.length != WCDMA_RSCP_THRESHOLDS_NUM)) {
Log.wtf(LOG_TAG, "setWcdmaRscpThresholds - wcdmaRscpThresholds is invalid.");
return;
}
System.arraycopy(wcdmaRscpThresholds, 0, mWcdmaRscpThresholds, 0,
WCDMA_RSCP_THRESHOLDS_NUM);
}
public int getCdmaDbm() {
return this.mCdmaDbm;
}
public int getCdmaEcio() {
return this.mCdmaEcio;
}
public int getEvdoDbm() {
return this.mEvdoDbm;
}
public int getEvdoEcio() {
return this.mEvdoEcio;
}
public int getEvdoSnr() {
return this.mEvdoSnr;
}
public int getLteSignalStrength() {
return mLteSignalStrength;
}
public int getLteRsrp() {
return mLteRsrp;
}
public int getLteRsrq() {
return mLteRsrq;
}
public int getLteRssnr() {
return mLteRssnr;
}
public int getLteCqi() {
return mLteCqi;
}
public int getLteRsrpBoost() {
return mLteRsrpBoost;
}
public int getLevel() {
int level = mIsGsm ? getGsmRelatedSignalStrength() : getCdmaRelatedSignalStrength();
if (DBG) log("getLevel=" + level);
return level;
}
public int getAsuLevel() {
int asuLevel = 0;
if (mIsGsm) {
if (mLteRsrp != SignalStrength.INVALID) {
asuLevel = getLteAsuLevel();
} else if (mTdScdmaRscp != SignalStrength.INVALID) {
asuLevel = getTdScdmaAsuLevel();
} else if (mWcdmaRscp != SignalStrength.INVALID) {
asuLevel = getWcdmaAsuLevel();
} else {
asuLevel = getGsmAsuLevel();
}
} else {
int cdmaAsuLevel = getCdmaAsuLevel();
int evdoAsuLevel = getEvdoAsuLevel();
if (evdoAsuLevel == 0) {
asuLevel = cdmaAsuLevel;
} else if (cdmaAsuLevel == 0) {
asuLevel = evdoAsuLevel;
} else {
asuLevel = cdmaAsuLevel < evdoAsuLevel ? cdmaAsuLevel : evdoAsuLevel;
}
}
if (DBG) log("getAsuLevel=" + asuLevel);
return asuLevel;
}
public int getDbm() {
int dBm = INVALID;
if(isGsm()) {
dBm = getLteDbm();
if (dBm == INVALID) {
if (getTdScdmaLevel() == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
if (getWcdmaDbm() == INVALID) {
dBm = getGsmDbm();
} else {
dBm = getWcdmaDbm();
}
} else {
dBm = getTdScdmaDbm();
}
}
} else {
int cdmaDbm = getCdmaDbm();
int evdoDbm = getEvdoDbm();
return (evdoDbm == -120) ? cdmaDbm : ((cdmaDbm == -120) ? evdoDbm
: (cdmaDbm < evdoDbm ? cdmaDbm : evdoDbm));
}
if (DBG) log("getDbm=" + dBm);
return dBm;
}
public int getGsmDbm() {
int dBm;
int gsmSignalStrength = getGsmSignalStrength();
int asu = (gsmSignalStrength == 99 ? -1 : gsmSignalStrength);
if (asu != -1) {
dBm = -113 + (2 * asu);
} else {
dBm = -1;
}
if (DBG) log("getGsmDbm=" + dBm);
return dBm;
}
public int getGsmLevel() {
int level;
int asu = getGsmSignalStrength();
if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT;
else if (asu >= 8) level = SIGNAL_STRENGTH_GOOD;
else if (asu >= 5) level = SIGNAL_STRENGTH_MODERATE;
else level = SIGNAL_STRENGTH_POOR;
if (DBG) log("getGsmLevel=" + level);
return level;
}
public int getGsmAsuLevel() {
int level = getGsmSignalStrength();
if (DBG) log("getGsmAsuLevel=" + level);
return level;
}
public int getCdmaLevel() {
final int cdmaDbm = getCdmaDbm();
final int cdmaEcio = getCdmaEcio();
int levelDbm;
int levelEcio;
if (cdmaDbm >= -75) levelDbm = SIGNAL_STRENGTH_GREAT;
else if (cdmaDbm >= -85) levelDbm = SIGNAL_STRENGTH_GOOD;
else if (cdmaDbm >= -95) levelDbm = SIGNAL_STRENGTH_MODERATE;
else if (cdmaDbm >= -100) levelDbm = SIGNAL_STRENGTH_POOR;
else levelDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
if (cdmaEcio >= -90) levelEcio = SIGNAL_STRENGTH_GREAT;
else if (cdmaEcio >= -110) levelEcio = SIGNAL_STRENGTH_GOOD;
else if (cdmaEcio >= -130) levelEcio = SIGNAL_STRENGTH_MODERATE;
else if (cdmaEcio >= -150) levelEcio = SIGNAL_STRENGTH_POOR;
else levelEcio = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
int level = (levelDbm < levelEcio) ? levelDbm : levelEcio;
if (DBG) log("getCdmaLevel=" + level);
return level;
}
public int getCdmaAsuLevel() {
final int cdmaDbm = getCdmaDbm();
final int cdmaEcio = getCdmaEcio();
int cdmaAsuLevel;
int ecioAsuLevel;
if (cdmaDbm >= -75) cdmaAsuLevel = 16;
else if (cdmaDbm >= -82) cdmaAsuLevel = 8;
else if (cdmaDbm >= -90) cdmaAsuLevel = 4;
else if (cdmaDbm >= -95) cdmaAsuLevel = 2;
else if (cdmaDbm >= -100) cdmaAsuLevel = 1;
else cdmaAsuLevel = 99;
if (cdmaEcio >= -90) ecioAsuLevel = 16;
else if (cdmaEcio >= -100) ecioAsuLevel = 8;
else if (cdmaEcio >= -115) ecioAsuLevel = 4;
else if (cdmaEcio >= -130) ecioAsuLevel = 2;
else if (cdmaEcio >= -150) ecioAsuLevel = 1;
else ecioAsuLevel = 99;
int level = (cdmaAsuLevel < ecioAsuLevel) ? cdmaAsuLevel : ecioAsuLevel;
if (DBG) log("getCdmaAsuLevel=" + level);
return level;
}
public int getEvdoLevel() {
int evdoDbm = getEvdoDbm();
int evdoSnr = getEvdoSnr();
int levelEvdoDbm;
int levelEvdoSnr;
if (evdoDbm >= -65) levelEvdoDbm = SIGNAL_STRENGTH_GREAT;
else if (evdoDbm >= -75) levelEvdoDbm = SIGNAL_STRENGTH_GOOD;
else if (evdoDbm >= -90) levelEvdoDbm = SIGNAL_STRENGTH_MODERATE;
else if (evdoDbm >= -105) levelEvdoDbm = SIGNAL_STRENGTH_POOR;
else levelEvdoDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
if (evdoSnr >= 7) levelEvdoSnr = SIGNAL_STRENGTH_GREAT;
else if (evdoSnr >= 5) levelEvdoSnr = SIGNAL_STRENGTH_GOOD;
else if (evdoSnr >= 3) levelEvdoSnr = SIGNAL_STRENGTH_MODERATE;
else if (evdoSnr >= 1) levelEvdoSnr = SIGNAL_STRENGTH_POOR;
else levelEvdoSnr = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
int level = (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr;
if (DBG) log("getEvdoLevel=" + level);
return level;
}
public int getEvdoAsuLevel() {
int evdoDbm = getEvdoDbm();
int evdoSnr = getEvdoSnr();
int levelEvdoDbm;
int levelEvdoSnr;
if (evdoDbm >= -65) levelEvdoDbm = 16;
else if (evdoDbm >= -75) levelEvdoDbm = 8;
else if (evdoDbm >= -85) levelEvdoDbm = 4;
else if (evdoDbm >= -95) levelEvdoDbm = 2;
else if (evdoDbm >= -105) levelEvdoDbm = 1;
else levelEvdoDbm = 99;
if (evdoSnr >= 7) levelEvdoSnr = 16;
else if (evdoSnr >= 6) levelEvdoSnr = 8;
else if (evdoSnr >= 5) levelEvdoSnr = 4;
else if (evdoSnr >= 3) levelEvdoSnr = 2;
else if (evdoSnr >= 1) levelEvdoSnr = 1;
else levelEvdoSnr = 99;
int level = (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr;
if (DBG) log("getEvdoAsuLevel=" + level);
return level;
}
public int getLteDbm() {
return mLteRsrp;
}
public int getLteLevel() {
int rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN, rsrpIconLevel = -1, snrIconLevel = -1;
if (mLteRsrp > MAX_LTE_RSRP || mLteRsrp < MIN_LTE_RSRP) {
if (mLteRsrp != INVALID) {
Log.wtf(LOG_TAG, "getLteLevel - invalid lte rsrp: mLteRsrp=" + mLteRsrp);
}
} else if (mLteRsrp >= (mLteRsrpThresholds[3] - mLteRsrpBoost)) {
rsrpIconLevel = SIGNAL_STRENGTH_GREAT;
} else if (mLteRsrp >= (mLteRsrpThresholds[2] - mLteRsrpBoost)) {
rsrpIconLevel = SIGNAL_STRENGTH_GOOD;
} else if (mLteRsrp >= (mLteRsrpThresholds[1] - mLteRsrpBoost)) {
rsrpIconLevel = SIGNAL_STRENGTH_MODERATE;
} else if (mLteRsrp >= (mLteRsrpThresholds[0] - mLteRsrpBoost)) {
rsrpIconLevel = SIGNAL_STRENGTH_POOR;
} else {
rsrpIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
}
if (useOnlyRsrpForLteLevel()) {
log("getLTELevel - rsrp = " + rsrpIconLevel);
if (rsrpIconLevel != -1) {
return rsrpIconLevel;
}
}
if (mLteRssnr > 300) snrIconLevel = -1;
else if (mLteRssnr >= 130) snrIconLevel = SIGNAL_STRENGTH_GREAT;
else if (mLteRssnr >= 45) snrIconLevel = SIGNAL_STRENGTH_GOOD;
else if (mLteRssnr >= 10) snrIconLevel = SIGNAL_STRENGTH_MODERATE;
else if (mLteRssnr >= -30) snrIconLevel = SIGNAL_STRENGTH_POOR;
else if (mLteRssnr >= -200)
snrIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
if (DBG) log("getLTELevel - rsrp:" + mLteRsrp + " snr:" + mLteRssnr + " rsrpIconLevel:"
+ rsrpIconLevel + " snrIconLevel:" + snrIconLevel
+ " lteRsrpBoost:" + mLteRsrpBoost);
if (snrIconLevel != -1 && rsrpIconLevel != -1) {
return (rsrpIconLevel < snrIconLevel ? rsrpIconLevel : snrIconLevel);
}
if (snrIconLevel != -1) return snrIconLevel;
if (rsrpIconLevel != -1) return rsrpIconLevel;
if (mLteSignalStrength > 63) rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
else if (mLteSignalStrength >= 12) rssiIconLevel = SIGNAL_STRENGTH_GREAT;
else if (mLteSignalStrength >= 8) rssiIconLevel = SIGNAL_STRENGTH_GOOD;
else if (mLteSignalStrength >= 5) rssiIconLevel = SIGNAL_STRENGTH_MODERATE;
else if (mLteSignalStrength >= 0) rssiIconLevel = SIGNAL_STRENGTH_POOR;
if (DBG) log("getLteLevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"
+ rssiIconLevel);
return rssiIconLevel;
}
public int getLteAsuLevel() {
int lteAsuLevel = 99;
int lteDbm = getLteDbm();
if (lteDbm == SignalStrength.INVALID) lteAsuLevel = 255;
else lteAsuLevel = lteDbm + 140;
if (DBG) log("Lte Asu level: "+lteAsuLevel);
return lteAsuLevel;
}
public boolean isGsm() {
return this.mIsGsm;
}
public boolean useOnlyRsrpForLteLevel() {
return this.mUseOnlyRsrpForLteLevel;
}
public int getTdScdmaDbm() {
return this.mTdScdmaRscp;
}
public int getTdScdmaLevel() {
final int tdScdmaDbm = getTdScdmaDbm();
int level;
if ((tdScdmaDbm > -25) || (tdScdmaDbm == SignalStrength.INVALID))
level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
else if (tdScdmaDbm >= -49) level = SIGNAL_STRENGTH_GREAT;
else if (tdScdmaDbm >= -73) level = SIGNAL_STRENGTH_GOOD;
else if (tdScdmaDbm >= -97) level = SIGNAL_STRENGTH_MODERATE;
else if (tdScdmaDbm >= -110) level = SIGNAL_STRENGTH_POOR;
else level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
if (DBG) log("getTdScdmaLevel = " + level);
return level;
}
public int getTdScdmaAsuLevel() {
final int tdScdmaDbm = getTdScdmaDbm();
int tdScdmaAsuLevel;
if (tdScdmaDbm == INVALID) tdScdmaAsuLevel = 255;
else tdScdmaAsuLevel = tdScdmaDbm + 120;
if (DBG) log("TD-SCDMA Asu level: " + tdScdmaAsuLevel);
return tdScdmaAsuLevel;
}
public int getWcdmaRscp() {
return mWcdmaRscp;
}
public int getWcdmaAsuLevel() {
final int wcdmaDbm = getWcdmaDbm();
int wcdmaAsuLevel = 255;
if (wcdmaDbm == SignalStrength.INVALID) wcdmaAsuLevel = 255;
else wcdmaAsuLevel = wcdmaDbm + 120;
if (DBG) log("Wcdma Asu level: " + wcdmaAsuLevel);
return wcdmaAsuLevel;
}
public int getWcdmaDbm() {
return mWcdmaRscp;
}
public int getWcdmaLevel() {
int level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
if (mWcdmaDefaultSignalMeasurement == null) {
Log.wtf(LOG_TAG, "getWcdmaLevel - WCDMA default signal measurement is invalid.");
return level;
}
switch (mWcdmaDefaultSignalMeasurement) {
case MEASUMENT_TYPE_RSCP:
if (mWcdmaRscp < MIN_WCDMA_RSCP || mWcdmaRscp > MAX_WCDMA_RSCP) {
if (mWcdmaRscp != INVALID) {
Log.wtf(LOG_TAG, "getWcdmaLevel - invalid WCDMA RSCP: mWcdmaRscp="
+ mWcdmaRscp);
}
} else if (mWcdmaRscp >= mWcdmaRscpThresholds[3]) {
level = SIGNAL_STRENGTH_GREAT;
} else if (mWcdmaRscp >= mWcdmaRscpThresholds[2]) {
level = SIGNAL_STRENGTH_GOOD;
} else if (mWcdmaRscp >= mWcdmaRscpThresholds[1]) {
level = SIGNAL_STRENGTH_MODERATE;
} else if (mWcdmaRscp >= mWcdmaRscpThresholds[0]) {
level = SIGNAL_STRENGTH_POOR;
}
if (DBG) log("getWcdmaLevel=" + level + " WcdmaRscp=" + mWcdmaRscp);
break;
default:
if (mWcdmaSignalStrength < 0 || mWcdmaSignalStrength > 31) {
if (mWcdmaSignalStrength != 99) {
Log.wtf(LOG_TAG, "getWcdmaLevel - invalid WCDMA RSSI: mWcdmaSignalStrength="
+ mWcdmaSignalStrength);
}
} else if (mWcdmaSignalStrength >= 18) {
level = SIGNAL_STRENGTH_GREAT;
} else if (mWcdmaSignalStrength >= 13) {
level = SIGNAL_STRENGTH_GOOD;
} else if (mWcdmaSignalStrength >= 8) {
level = SIGNAL_STRENGTH_MODERATE;
} else if (mWcdmaSignalStrength >= 3) {
level = SIGNAL_STRENGTH_POOR;
}
if (DBG) log("getWcdmaLevel=" + level + " WcdmaSignalStrength=" +
mWcdmaSignalStrength);
break;
}
return level;
}
@Override
public int hashCode() {
int primeNum = 31;
return ((mGsmSignalStrength * primeNum)
+ (mGsmBitErrorRate * primeNum)
+ (mCdmaDbm * primeNum) + (mCdmaEcio * primeNum)
+ (mEvdoDbm * primeNum) + (mEvdoEcio * primeNum) + (mEvdoSnr * primeNum)
+ (mLteSignalStrength * primeNum) + (mLteRsrp * primeNum)
+ (mLteRsrq * primeNum) + (mLteRssnr * primeNum) + (mLteCqi * primeNum)
+ (mLteRsrpBoost * primeNum) + (mTdScdmaRscp * primeNum)
+ (mWcdmaSignalStrength * primeNum) + (mWcdmaRscpAsu * primeNum)
+ (mWcdmaRscp * primeNum) + (mIsGsm ? 1 : 0) + (mUseOnlyRsrpForLteLevel ? 1 : 0)
+ (Objects.hashCode(mWcdmaDefaultSignalMeasurement))
+ (Arrays.hashCode(mLteRsrpThresholds)) + (Arrays.hashCode(mWcdmaRscpThresholds)));
}
@Override
public boolean equals (Object o) {
SignalStrength s;
try {
s = (SignalStrength) o;
} catch (ClassCastException ex) {
return false;
}
if (o == null) {
return false;
}
return (mGsmSignalStrength == s.mGsmSignalStrength
&& mGsmBitErrorRate == s.mGsmBitErrorRate
&& mCdmaDbm == s.mCdmaDbm
&& mCdmaEcio == s.mCdmaEcio
&& mEvdoDbm == s.mEvdoDbm
&& mEvdoEcio == s.mEvdoEcio
&& mEvdoSnr == s.mEvdoSnr
&& mLteSignalStrength == s.mLteSignalStrength
&& mLteRsrp == s.mLteRsrp
&& mLteRsrq == s.mLteRsrq
&& mLteRssnr == s.mLteRssnr
&& mLteCqi == s.mLteCqi
&& mLteRsrpBoost == s.mLteRsrpBoost
&& mTdScdmaRscp == s.mTdScdmaRscp
&& mWcdmaSignalStrength == s.mWcdmaSignalStrength
&& mWcdmaRscpAsu == s.mWcdmaRscpAsu
&& mWcdmaRscp == s.mWcdmaRscp
&& mIsGsm == s.mIsGsm
&& mUseOnlyRsrpForLteLevel == s.mUseOnlyRsrpForLteLevel
&& Objects.equals(mWcdmaDefaultSignalMeasurement, s.mWcdmaDefaultSignalMeasurement)
&& Arrays.equals(mLteRsrpThresholds, s.mLteRsrpThresholds)
&& Arrays.equals(mWcdmaRscpThresholds, s.mWcdmaRscpThresholds));
}
@Override
public String toString() {
return ("SignalStrength:"
+ " " + mGsmSignalStrength
+ " " + mGsmBitErrorRate
+ " " + mCdmaDbm
+ " " + mCdmaEcio
+ " " + mEvdoDbm
+ " " + mEvdoEcio
+ " " + mEvdoSnr
+ " " + mLteSignalStrength
+ " " + mLteRsrp
+ " " + mLteRsrq
+ " " + mLteRssnr
+ " " + mLteCqi
+ " " + mLteRsrpBoost
+ " " + mTdScdmaRscp
+ " " + mWcdmaSignalStrength
+ " " + mWcdmaRscpAsu
+ " " + mWcdmaRscp
+ " " + (mIsGsm ? "gsm|lte" : "cdma")
+ " " + (mUseOnlyRsrpForLteLevel ? "use_only_rsrp_for_lte_level" :
"use_rsrp_and_rssnr_for_lte_level")
+ " " + mWcdmaDefaultSignalMeasurement
+ " " + (Arrays.toString(mLteRsrpThresholds))
+ " " + (Arrays.toString(mWcdmaRscpThresholds)));
}
private int getGsmRelatedSignalStrength() {
int level = getLteLevel();
if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
level = getTdScdmaLevel();
if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
level = getWcdmaLevel();
if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
level = getGsmLevel();
}
}
}
return level;
}
private int getCdmaRelatedSignalStrength() {
int level;
int cdmaLevel = getCdmaLevel();
int evdoLevel = getEvdoLevel();
if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
level = cdmaLevel;
} else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
level = evdoLevel;
} else {
level = cdmaLevel < evdoLevel ? cdmaLevel : evdoLevel;
}
return level;
}
private void setFromNotifierBundle(Bundle m) {
mGsmSignalStrength = m.getInt("GsmSignalStrength");
mGsmBitErrorRate = m.getInt("GsmBitErrorRate");
mCdmaDbm = m.getInt("CdmaDbm");
mCdmaEcio = m.getInt("CdmaEcio");
mEvdoDbm = m.getInt("EvdoDbm");
mEvdoEcio = m.getInt("EvdoEcio");
mEvdoSnr = m.getInt("EvdoSnr");
mLteSignalStrength = m.getInt("LteSignalStrength");
mLteRsrp = m.getInt("LteRsrp");
mLteRsrq = m.getInt("LteRsrq");
mLteRssnr = m.getInt("LteRssnr");
mLteCqi = m.getInt("LteCqi");
mLteRsrpBoost = m.getInt("LteRsrpBoost");
mTdScdmaRscp = m.getInt("TdScdma");
mWcdmaSignalStrength = m.getInt("WcdmaSignalStrength");
mWcdmaRscpAsu = m.getInt("WcdmaRscpAsu");
mWcdmaRscp = m.getInt("WcdmaRscp");
mIsGsm = m.getBoolean("IsGsm");
mUseOnlyRsrpForLteLevel = m.getBoolean("UseOnlyRsrpForLteLevel");
mWcdmaDefaultSignalMeasurement = m.getString("WcdmaDefaultSignalMeasurement");
ArrayList<Integer> lteRsrpThresholds = m.getIntegerArrayList("lteRsrpThresholds");
for (int i = 0; i < lteRsrpThresholds.size(); i++) {
mLteRsrpThresholds[i] = lteRsrpThresholds.get(i);
}
ArrayList<Integer> wcdmaRscpThresholds = m.getIntegerArrayList("wcdmaRscpThresholds");
for (int i = 0; i < wcdmaRscpThresholds.size(); i++) {
mWcdmaRscpThresholds[i] = wcdmaRscpThresholds.get(i);
}
}
public void fillInNotifierBundle(Bundle m) {
m.putInt("GsmSignalStrength", mGsmSignalStrength);
m.putInt("GsmBitErrorRate", mGsmBitErrorRate);
m.putInt("CdmaDbm", mCdmaDbm);
m.putInt("CdmaEcio", mCdmaEcio);
m.putInt("EvdoDbm", mEvdoDbm);
m.putInt("EvdoEcio", mEvdoEcio);
m.putInt("EvdoSnr", mEvdoSnr);
m.putInt("LteSignalStrength", mLteSignalStrength);
m.putInt("LteRsrp", mLteRsrp);
m.putInt("LteRsrq", mLteRsrq);
m.putInt("LteRssnr", mLteRssnr);
m.putInt("LteCqi", mLteCqi);
m.putInt("LteRsrpBoost", mLteRsrpBoost);
m.putInt("TdScdma", mTdScdmaRscp);
m.putInt("WcdmaSignalStrength", mWcdmaSignalStrength);
m.putInt("WcdmaRscpAsu", mWcdmaRscpAsu);
m.putInt("WcdmaRscp", mWcdmaRscp);
m.putBoolean("IsGsm", mIsGsm);
m.putBoolean("UseOnlyRsrpForLteLevel", mUseOnlyRsrpForLteLevel);
m.putString("WcdmaDefaultSignalMeasurement", mWcdmaDefaultSignalMeasurement);
ArrayList<Integer> lteRsrpThresholds = new ArrayList<Integer>();
for (int value : mLteRsrpThresholds) {
lteRsrpThresholds.add(value);
}
m.putIntegerArrayList("lteRsrpThresholds", lteRsrpThresholds);
ArrayList<Integer> wcdmaRscpThresholds = new ArrayList<Integer>();
for (int value : mWcdmaRscpThresholds) {
wcdmaRscpThresholds.add(value);
}
m.putIntegerArrayList("wcdmaRscpThresholds", wcdmaRscpThresholds);
}
private int[] getDefaultLteRsrpThresholds() {
return CarrierConfigManager.getDefaultConfig().getIntArray(
CarrierConfigManager.KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY);
}
private int[] getDefaultWcdmaRscpThresholds() {
return CarrierConfigManager.getDefaultConfig().getIntArray(
CarrierConfigManager.KEY_WCDMA_RSCP_THRESHOLDS_INT_ARRAY);
}
private static void log(String s) {
Rlog.w(LOG_TAG, s);
}
}