diff options
| author | 2018-11-19 18:09:40 -0800 | |
|---|---|---|
| committer | 2018-12-20 13:53:43 -0800 | |
| commit | f23153f1667d1071b6933be0a036b1946d542852 (patch) | |
| tree | 887f495093d12bbb6718bd493fe2d39e7123c908 | |
| parent | bcf293c674307a90238671edcf5c82b17e3bca62 (diff) | |
Refactor SignalStrength
Refactor SignalStrength as a container of
individual CellSignalStrength objects for each
radio technology.
-Change SignalStrength to contain CellSignalStrength
rather than individual measurements.
-Change the constructors for SignalStrength to take
CellSignalStrength objects.
-Consolidate all the logic for calculating the getLevel()
function to CellSignalStrength.
-Store the level value in SignalStrengths rather than
compute it on the fly when needed.
-Add a few missing functions needed by SignalStrength:
-CellSignalStrengthCdma#getEvdoAsuLevel()
-CellSignalStrengthTdscdma#getRscp()
-Convert CellSignalStrength classes to take actual values
instead of ASU values.
Bug: 25984037
Test: atest SignalStrengthTest
Change-Id: I302e7a8c6f68559dc69a3138061eec739ee7561f
9 files changed, 907 insertions, 1212 deletions
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 4b7d10787c78..4561ea33bb95 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -2000,6 +2000,8 @@ public class CarrierConfigManager { * Determine whether to use only RSRP for the number of LTE signal bars. * @hide */ + // FIXME: this key and related keys must not be exposed without a consistent philosophy for + // all RATs. public static final String KEY_USE_ONLY_RSRP_FOR_LTE_SIGNAL_BAR_BOOL = "use_only_rsrp_for_lte_signal_bar_bool"; @@ -2243,6 +2245,8 @@ public class CarrierConfigManager { * Currently this only supports the value "rscp" * @hide */ + // FIXME: this key and related keys must not be exposed without a consistent philosophy for + // all RATs. public static final String KEY_WCDMA_DEFAULT_SIGNAL_STRENGTH_MEASUREMENT_STRING = "wcdma_default_signal_strength_measurement_string"; diff --git a/telephony/java/android/telephony/CellSignalStrength.java b/telephony/java/android/telephony/CellSignalStrength.java index afa492226f65..a18275f95f9d 100644 --- a/telephony/java/android/telephony/CellSignalStrength.java +++ b/telephony/java/android/telephony/CellSignalStrength.java @@ -16,6 +16,8 @@ package android.telephony; +import android.os.PersistableBundle; + /** * Abstract base class for cell phone signal strength related information. */ @@ -80,9 +82,74 @@ public abstract class CellSignalStrength { */ public abstract CellSignalStrength copy(); + /** + * Checks and returns whether there are any non-default values in this CellSignalStrength. + * + * Checks all the values in the subclass of CellSignalStrength and returns true if any of them + * have been set to a value other than their default. + * + * @hide + */ + public abstract boolean isValid(); + @Override public abstract int hashCode(); @Override public abstract boolean equals (Object o); + + /** + * Calculate and set the carrier-influenced values such as the signal "Level". + * + * @hide + */ + public abstract void updateLevel(PersistableBundle cc, ServiceState ss); + + // Range for RSSI in ASU (0-31, 99) as defined in TS 27.007 8.69 + /** @hide */ + protected static final int getRssiDbmFromAsu(int asu) { + if (asu > 31 || asu < 0) return CellInfo.UNAVAILABLE; + return -113 + (2 * asu); + } + + // Range for RSSI in ASU (0-31, 99) as defined in TS 27.007 8.69 + /** @hide */ + protected static final int getAsuFromRssiDbm(int dbm) { + if (dbm == CellInfo.UNAVAILABLE) return 99; + return (dbm / 2) + 113; + } + + // Range for RSCP in ASU (0-96, 255) as defined in TS 27.007 8.69 + /** @hide */ + protected static final int getRscpDbmFromAsu(int asu) { + if (asu > 96 || asu < 0) return CellInfo.UNAVAILABLE; + return asu - 120; + } + + // Range for RSCP in ASU (0-96, 255) as defined in TS 27.007 8.69 + /** @hide */ + protected static final int getAsuFromRscpDbm(int dbm) { + if (dbm == CellInfo.UNAVAILABLE) return 255; + return dbm + 120; + } + + // Range for SNR in ASU (0-49, 255) as defined in TS 27.007 8.69 + /** @hide */ + protected static final int getEcNoDbFromAsu(int asu) { + if (asu > 49 || asu < 0) return CellInfo.UNAVAILABLE; + return -24 + (asu / 2); + } + + /** @hide */ + protected static final int inRangeOrUnavailable(int value, int rangeMin, int rangeMax) { + if (value < rangeMin || value > rangeMax) return CellInfo.UNAVAILABLE; + return value; + } + + /** @hide */ + protected static final int inRangeOrUnavailable( + int value, int rangeMin, int rangeMax, int special) { + if ((value < rangeMin || value > rangeMax) && value != special) return CellInfo.UNAVAILABLE; + return value; + } } diff --git a/telephony/java/android/telephony/CellSignalStrengthCdma.java b/telephony/java/android/telephony/CellSignalStrengthCdma.java index 5123052cb78b..47faf1e96aac 100644 --- a/telephony/java/android/telephony/CellSignalStrengthCdma.java +++ b/telephony/java/android/telephony/CellSignalStrengthCdma.java @@ -18,6 +18,7 @@ package android.telephony; import android.os.Parcel; import android.os.Parcelable; +import android.os.PersistableBundle; import android.telephony.Rlog; import java.util.Objects; @@ -35,6 +36,7 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements private int mEvdoDbm; // This value is the EVDO RSSI value private int mEvdoEcio; // This value is the EVDO Ec/Io private int mEvdoSnr; // Valid values are 0-8. 8 is the highest signal to noise ratio + private int mLevel; /** @hide */ public CellSignalStrengthCdma() { @@ -55,23 +57,29 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements * rather than left as -1, which is a departure from SignalStrength, which is stuck with the * values it currently reports. * - * @param cdmaDbm negative of the CDMA signal strength value or -1 if invalid. - * @param cdmaEcio negative of the CDMA pilot/noise ratio or -1 if invalid. - * @param evdoDbm negative of the EvDO signal strength value or -1 if invalid. - * @param evdoEcio negative of the EvDO pilot/noise ratio or -1 if invalid. - * @param evdoSnr an SNR value 0..8 or -1 if invalid. + * @param cdmaDbm CDMA signal strength value or CellInfo.UNAVAILABLE if invalid. + * @param cdmaEcio CDMA pilot/noise ratio or CellInfo.UNAVAILABLE if invalid. + * @param evdoDbm negative of the EvDO signal strength value or CellInfo.UNAVAILABLE if invalid. + * @param evdoEcio negative of the EvDO pilot/noise ratio or CellInfo.UNAVAILABLE if invalid. + * @param evdoSnr an SNR value 0..8 or CellInfo.UNVAILABLE if invalid. * @hide */ public CellSignalStrengthCdma(int cdmaDbm, int cdmaEcio, int evdoDbm, int evdoEcio, int evdoSnr) { - // The values here were lifted from SignalStrength.validateInput() - // FIXME: Combine all checking and setting logic between this and SignalStrength. - mCdmaDbm = ((cdmaDbm > 0) && (cdmaDbm < 120)) ? -cdmaDbm : CellInfo.UNAVAILABLE; - mCdmaEcio = ((cdmaEcio > 0) && (cdmaEcio < 160)) ? -cdmaEcio : CellInfo.UNAVAILABLE; + mCdmaDbm = inRangeOrUnavailable(cdmaDbm, -120, 0); + mCdmaEcio = inRangeOrUnavailable(cdmaEcio, -160, 0); + mEvdoDbm = inRangeOrUnavailable(evdoDbm, -120, 0); + mEvdoEcio = inRangeOrUnavailable(evdoEcio, -160, 0); + mEvdoSnr = inRangeOrUnavailable(evdoSnr, 0, 8); - mEvdoDbm = ((evdoDbm > 0) && (evdoDbm < 120)) ? -evdoDbm : CellInfo.UNAVAILABLE; - mEvdoEcio = ((evdoEcio > 0) && (evdoEcio < 160)) ? -evdoEcio : CellInfo.UNAVAILABLE; - mEvdoSnr = ((evdoSnr > 0) && (evdoSnr <= 8)) ? evdoSnr : CellInfo.UNAVAILABLE; + updateLevel(null, null); + } + + /** @hide */ + public CellSignalStrengthCdma(android.hardware.radio.V1_0.CdmaSignalStrength cdma, + android.hardware.radio.V1_0.EvdoSignalStrength evdo) { + // Convert from HAL values as part of construction. + this(-cdma.dbm, -cdma.ecio, -evdo.dbm, -evdo.ecio, evdo.signalNoiseRatio); } /** @hide */ @@ -86,6 +94,7 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements mEvdoDbm = s.mEvdoDbm; mEvdoEcio = s.mEvdoEcio; mEvdoSnr = s.mEvdoSnr; + mLevel = s.mLevel; } /** @hide */ @@ -102,6 +111,7 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements mEvdoDbm = CellInfo.UNAVAILABLE; mEvdoEcio = CellInfo.UNAVAILABLE; mEvdoSnr = CellInfo.UNAVAILABLE; + mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; } /** @@ -112,26 +122,54 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements */ @Override public int getLevel() { - int level; + return mLevel; + } + /** @hide */ + @Override + public void updateLevel(PersistableBundle cc, ServiceState ss) { int cdmaLevel = getCdmaLevel(); int evdoLevel = getEvdoLevel(); if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { /* We don't know evdo, use cdma */ - level = getCdmaLevel(); + mLevel = getCdmaLevel(); } else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { /* We don't know cdma, use evdo */ - level = getEvdoLevel(); + mLevel = getEvdoLevel(); } else { /* We know both, use the lowest level */ - level = cdmaLevel < evdoLevel ? cdmaLevel : evdoLevel; + mLevel = cdmaLevel < evdoLevel ? cdmaLevel : evdoLevel; } - if (DBG) log("getLevel=" + level); - return level; } /** - * Get the signal level as an asu value between 0..97, 99 is unknown + * Get the 1xRTT Level in (Android) ASU. + * + * There is no standard definition of ASU for CDMA; however, Android defines it as the + * the lesser of the following two results (for 1xRTT): + * <table> + * <thead><tr><th>RSSI Range (dBm)</th><th>ASU Value</th></tr><thead> + * <tbody> + * <tr><td>-75..</td><td>16</td></tr> + * <tr><td>-82..-76</td><td>8</td></tr> + * <tr><td>-90..-83</td><td>4</td></tr> + * <tr><td>-95..-91</td><td>2</td></tr> + * <tr><td>-100..-96</td><td>1</td></tr> + * <tr><td>..-101</td><td>99</td></tr> + * </tbody> + * </table> + * <table> + * <thead><tr><th>Ec/Io Range (dB)</th><th>ASU Value</th></tr><thead> + * <tbody> + * <tr><td>-90..</td><td>16</td></tr> + * <tr><td>-100..-91</td><td>8</td></tr> + * <tr><td>-115..-101</td><td>4</td></tr> + * <tr><td>-130..-116</td><td>2</td></tr> + * <tr><td>--150..-131</td><td>1</td></tr> + * <tr><td>..-151</td><td>99</td></tr> + * </tbody> + * </table> + * @return 1xRTT Level in Android ASU {1,2,4,8,16,99} */ @Override public int getAsuLevel() { @@ -220,6 +258,63 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements } /** + * Get the EVDO Level in (Android) ASU. + * + * There is no standard definition of ASU for CDMA; however, Android defines it as the + * the lesser of the following two results (for EVDO): + * <table> + * <thead><tr><th>RSSI Range (dBm)</th><th>ASU Value</th></tr><thead> + * <tbody> + * <tr><td>-65..</td><td>16</td></tr> + * <tr><td>-75..-66</td><td>8</td></tr> + * <tr><td>-85..-76</td><td>4</td></tr> + * <tr><td>-95..-86</td><td>2</td></tr> + * <tr><td>-105..-96</td><td>1</td></tr> + * <tr><td>..-106</td><td>99</td></tr> + * </tbody> + * </table> + * <table> + * <thead><tr><th>SNR Range (unitless)</th><th>ASU Value</th></tr><thead> + * <tbody> + * <tr><td>7..</td><td>16</td></tr> + * <tr><td>6</td><td>8</td></tr> + * <tr><td>5</td><td>4</td></tr> + * <tr><td>3..4</td><td>2</td></tr> + * <tr><td>1..2</td><td>1</td></tr> + * <tr><td>0</td><td>99</td></tr> + * </tbody> + * </table> + * + * @return EVDO Level in Android ASU {1,2,4,8,16,99} + * + * @hide + */ + 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; + } + + /** * Get the signal strength as dBm */ @Override @@ -237,6 +332,7 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements public int getCdmaDbm() { return mCdmaDbm; } + /** @hide */ public void setCdmaDbm(int cdmaDbm) { mCdmaDbm = cdmaDbm; @@ -248,6 +344,7 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements public int getCdmaEcio() { return mCdmaEcio; } + /** @hide */ public void setCdmaEcio(int cdmaEcio) { mCdmaEcio = cdmaEcio; @@ -259,6 +356,7 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements public int getEvdoDbm() { return mEvdoDbm; } + /** @hide */ public void setEvdoDbm(int evdoDbm) { mEvdoDbm = evdoDbm; @@ -270,6 +368,7 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements public int getEvdoEcio() { return mEvdoEcio; } + /** @hide */ public void setEvdoEcio(int evdoEcio) { mEvdoEcio = evdoEcio; @@ -281,6 +380,7 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements public int getEvdoSnr() { return mEvdoSnr; } + /** @hide */ public void setEvdoSnr(int evdoSnr) { mEvdoSnr = evdoSnr; @@ -288,28 +388,29 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements @Override public int hashCode() { - return Objects.hash(mCdmaDbm, mCdmaEcio, mEvdoDbm, mEvdoEcio, mEvdoSnr); + return Objects.hash(mCdmaDbm, mCdmaEcio, mEvdoDbm, mEvdoEcio, mEvdoSnr, mLevel); + } + + private static final CellSignalStrengthCdma sInvalid = new CellSignalStrengthCdma(); + + /** @hide */ + @Override + public boolean isValid() { + return !this.equals(sInvalid); } @Override public boolean equals (Object o) { CellSignalStrengthCdma s; - - try { - s = (CellSignalStrengthCdma) o; - } catch (ClassCastException ex) { - return false; - } - - if (o == null) { - return false; - } + if (!(o instanceof CellSignalStrengthCdma)) return false; + s = (CellSignalStrengthCdma) o; return mCdmaDbm == s.mCdmaDbm && mCdmaEcio == s.mCdmaEcio && mEvdoDbm == s.mEvdoDbm && mEvdoEcio == s.mEvdoEcio - && mEvdoSnr == s.mEvdoSnr; + && mEvdoSnr == s.mEvdoSnr + && mLevel == s.mLevel; } /** @@ -322,7 +423,8 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements + " cdmaEcio=" + mCdmaEcio + " evdoDbm=" + mEvdoDbm + " evdoEcio=" + mEvdoEcio - + " evdoSnr=" + mEvdoSnr; + + " evdoSnr=" + mEvdoSnr + + " level=" + mLevel; } /** Implement the Parcelable interface */ @@ -334,6 +436,7 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements dest.writeInt(mEvdoDbm); dest.writeInt(mEvdoEcio); dest.writeInt(mEvdoSnr); + dest.writeInt(mLevel); } /** @@ -349,6 +452,7 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements mEvdoDbm = in.readInt(); mEvdoEcio = in.readInt(); mEvdoSnr = in.readInt(); + mLevel = in.readInt(); if (DBG) log("CellSignalStrengthCdma(Parcel): " + toString()); } diff --git a/telephony/java/android/telephony/CellSignalStrengthGsm.java b/telephony/java/android/telephony/CellSignalStrengthGsm.java index e906f460024a..7b29f69da6da 100644 --- a/telephony/java/android/telephony/CellSignalStrengthGsm.java +++ b/telephony/java/android/telephony/CellSignalStrengthGsm.java @@ -19,6 +19,7 @@ package android.telephony; import android.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; +import android.os.PersistableBundle; import android.telephony.Rlog; import java.util.Objects; @@ -31,16 +32,18 @@ public final class CellSignalStrengthGsm extends CellSignalStrength implements P private static final String LOG_TAG = "CellSignalStrengthGsm"; private static final boolean DBG = false; - private static final int GSM_SIGNAL_STRENGTH_GREAT = 12; - private static final int GSM_SIGNAL_STRENGTH_GOOD = 8; - private static final int GSM_SIGNAL_STRENGTH_MODERATE = 5; + private static final int GSM_RSSI_MAX = -51; + private static final int GSM_RSSI_GREAT = -89; + private static final int GSM_RSSI_GOOD = -97; + private static final int GSM_RSSI_MODERATE = -103; + private static final int GSM_RSSI_POOR = -107; + private int mRssi; // in dBm [-113, -51] or UNAVAILABLE @UnsupportedAppUsage - private int mSignalStrength; // in ASU; Valid values are (0-31, 99) as defined in TS 27.007 8.5 - @UnsupportedAppUsage - private int mBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5 - @UnsupportedAppUsage + private int mBitErrorRate; // bit error rate (0-7, 99) TS 27.007 8.5 or UNAVAILABLE + @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.O) private int mTimingAdvance; // range from 0-219 or CellInfo.UNAVAILABLE if unknown + private int mLevel; /** @hide */ @UnsupportedAppUsage @@ -49,15 +52,17 @@ public final class CellSignalStrengthGsm extends CellSignalStrength implements P } /** @hide */ - public CellSignalStrengthGsm(int ss, int ber) { - this(ss, ber, CellInfo.UNAVAILABLE); + public CellSignalStrengthGsm(int rssi, int ber, int ta) { + mRssi = inRangeOrUnavailable(rssi, -113, -51); + mBitErrorRate = inRangeOrUnavailable(ber, 0, 7, 99); + mTimingAdvance = inRangeOrUnavailable(ta, 0, 219); + updateLevel(null, null); } /** @hide */ - public CellSignalStrengthGsm(int ss, int ber, int ta) { - mSignalStrength = ss; - mBitErrorRate = ber; - mTimingAdvance = ta; + public CellSignalStrengthGsm(android.hardware.radio.V1_0.GsmSignalStrength gsm) { + // Convert from HAL values as part of construction. + this(getRssiDbmFromAsu(gsm.signalStrength), gsm.bitErrorRate, gsm.timingAdvance); } /** @hide */ @@ -67,9 +72,10 @@ public final class CellSignalStrengthGsm extends CellSignalStrength implements P /** @hide */ protected void copyFrom(CellSignalStrengthGsm s) { - mSignalStrength = s.mSignalStrength; + mRssi = s.mRssi; mBitErrorRate = s.mBitErrorRate; mTimingAdvance = s.mTimingAdvance; + mLevel = s.mLevel; } /** @hide */ @@ -81,9 +87,10 @@ public final class CellSignalStrengthGsm extends CellSignalStrength implements P /** @hide */ @Override public void setDefaultValues() { - mSignalStrength = CellInfo.UNAVAILABLE; + mRssi = CellInfo.UNAVAILABLE; mBitErrorRate = CellInfo.UNAVAILABLE; mTimingAdvance = CellInfo.UNAVAILABLE; + mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; } /** @@ -94,20 +101,18 @@ public final class CellSignalStrengthGsm extends CellSignalStrength implements P */ @Override public int getLevel() { - int level; - - // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5 - // asu = 0 (-113dB or less) is very weak - // signal, its better to show 0 bars to the user in such cases. - // asu = 99 is a special case, where the signal strength is unknown. - int asu = mSignalStrength; - if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; - else if (asu >= GSM_SIGNAL_STRENGTH_GREAT) level = SIGNAL_STRENGTH_GREAT; - else if (asu >= GSM_SIGNAL_STRENGTH_GOOD) level = SIGNAL_STRENGTH_GOOD; - else if (asu >= GSM_SIGNAL_STRENGTH_MODERATE) level = SIGNAL_STRENGTH_MODERATE; - else level = SIGNAL_STRENGTH_POOR; - if (DBG) log("getLevel=" + level); - return level; + return mLevel; + } + + /** @hide */ + @Override + public void updateLevel(PersistableBundle cc, ServiceState ss) { + if (mRssi > GSM_RSSI_MAX) mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + else if (mRssi >= GSM_RSSI_GREAT) mLevel = SIGNAL_STRENGTH_GREAT; + else if (mRssi >= GSM_RSSI_GOOD) mLevel = SIGNAL_STRENGTH_GOOD; + else if (mRssi >= GSM_RSSI_MODERATE) mLevel = SIGNAL_STRENGTH_MODERATE; + else if (mRssi >= GSM_RSSI_POOR) mLevel = SIGNAL_STRENGTH_POOR; + else mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; } /** @@ -126,55 +131,52 @@ public final class CellSignalStrengthGsm extends CellSignalStrength implements P */ @Override public int getDbm() { - int dBm; - - int level = mSignalStrength; - int asu = (level == 99 ? CellInfo.UNAVAILABLE : level); - if (asu != CellInfo.UNAVAILABLE) { - dBm = -113 + (2 * asu); - } else { - dBm = CellInfo.UNAVAILABLE; - } - if (DBG) log("getDbm=" + dBm); - return dBm; + return mRssi; } /** - * Get the signal level as an asu value between 0..31, 99 is unknown + * Get the RSSI in ASU. + * * Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69 + * + * @return RSSI in ASU 0..31, 99, or UNAVAILABLE */ @Override public int getAsuLevel() { - // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5 - // asu = 0 (-113dB or less) is very weak - // signal, its better to show 0 bars to the user in such cases. - // asu = 99 is a special case, where the signal strength is unknown. - int level = mSignalStrength; - if (DBG) log("getAsuLevel=" + level); - return level; + return getAsuFromRssiDbm(mRssi); + } + + /** + * Return the Bit Error Rate + * @returns the bit error rate (0-7, 99) as defined in TS 27.007 8.5 or UNAVAILABLE. + * @hide + */ + public int getBitErrorRate() { + return mBitErrorRate; } @Override public int hashCode() { - return Objects.hash(mSignalStrength, mBitErrorRate, mTimingAdvance); + return Objects.hash(mRssi, mBitErrorRate, mTimingAdvance); } - @Override - public boolean equals (Object o) { - CellSignalStrengthGsm s; + private static final CellSignalStrengthGsm sInvalid = new CellSignalStrengthGsm(); - try { - s = (CellSignalStrengthGsm) o; - } catch (ClassCastException ex) { - return false; - } + /** @hide */ + @Override + public boolean isValid() { + return !this.equals(sInvalid); + } - if (o == null) { - return false; - } + @Override + public boolean equals(Object o) { + if (!(o instanceof CellSignalStrengthGsm)) return false; + CellSignalStrengthGsm s = (CellSignalStrengthGsm) o; - return mSignalStrength == s.mSignalStrength && mBitErrorRate == s.mBitErrorRate && - s.mTimingAdvance == mTimingAdvance; + return mRssi == s.mRssi + && mBitErrorRate == s.mBitErrorRate + && mTimingAdvance == s.mTimingAdvance + && mLevel == s.mLevel; } /** @@ -183,18 +185,20 @@ public final class CellSignalStrengthGsm extends CellSignalStrength implements P @Override public String toString() { return "CellSignalStrengthGsm:" - + " ss=" + mSignalStrength + + " rssi=" + mRssi + " ber=" + mBitErrorRate - + " mTa=" + mTimingAdvance; + + " mTa=" + mTimingAdvance + + " mLevel=" + mLevel; } /** Implement the Parcelable interface */ @Override public void writeToParcel(Parcel dest, int flags) { if (DBG) log("writeToParcel(Parcel, int): " + toString()); - dest.writeInt(mSignalStrength); + dest.writeInt(mRssi); dest.writeInt(mBitErrorRate); dest.writeInt(mTimingAdvance); + dest.writeInt(mLevel); } /** @@ -202,9 +206,10 @@ public final class CellSignalStrengthGsm extends CellSignalStrength implements P * where the token is already been processed. */ private CellSignalStrengthGsm(Parcel in) { - mSignalStrength = in.readInt(); + mRssi = in.readInt(); mBitErrorRate = in.readInt(); mTimingAdvance = in.readInt(); + mLevel = in.readInt(); if (DBG) log("CellSignalStrengthGsm(Parcel): " + toString()); } diff --git a/telephony/java/android/telephony/CellSignalStrengthLte.java b/telephony/java/android/telephony/CellSignalStrengthLte.java index d07539431348..893dbe31ce0b 100644 --- a/telephony/java/android/telephony/CellSignalStrengthLte.java +++ b/telephony/java/android/telephony/CellSignalStrengthLte.java @@ -19,7 +19,9 @@ package android.telephony; import android.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; +import android.os.PersistableBundle; +import java.util.Arrays; import java.util.Objects; /** @@ -28,7 +30,7 @@ import java.util.Objects; public final class CellSignalStrengthLte extends CellSignalStrength implements Parcelable { private static final String LOG_TAG = "CellSignalStrengthLte"; - private static final boolean DBG = false; + private static final boolean DBG = true; /** * Indicates the unknown or undetectable RSSI value in ASU. @@ -49,18 +51,23 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P */ private static final int SIGNAL_STRENGTH_LTE_RSSI_VALID_ASU_MIN_VALUE = 0; - @UnsupportedAppUsage - private int mSignalStrength; - @UnsupportedAppUsage + private static final int MAX_LTE_RSRP = -44; + private static final int MIN_LTE_RSRP = -140; + + @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.P) + private int mSignalStrength; // To be removed + private int mRssi; + @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.O) private int mRsrp; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.O) private int mRsrq; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.O) private int mRssnr; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.O) private int mCqi; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.O) private int mTimingAdvance; + private int mLevel; /** @hide */ @UnsupportedAppUsage @@ -68,15 +75,38 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P setDefaultValues(); } + /** + * Construct a cell signal strength + * + * @param rssi in dBm [-113,-51], UNKNOWN + * @param rsrp in dBm [-140,-43], UNKNOWN + * @param rsrq in dB [-20,-3], UNKNOWN + * @param rssnr in 10*dB [-200, +300], UNKNOWN + * @param cqi [0, 15], UNKNOWN + * @param timingAdvance [0, 1282], UNKNOWN + * + */ /** @hide */ - public CellSignalStrengthLte(int signalStrength, int rsrp, int rsrq, int rssnr, int cqi, + public CellSignalStrengthLte(int rssi, int rsrp, int rsrq, int rssnr, int cqi, int timingAdvance) { - mSignalStrength = signalStrength; - mRsrp = rsrp; - mRsrq = rsrq; - mRssnr = rssnr; - mCqi = cqi; - mTimingAdvance = timingAdvance; + + mRssi = inRangeOrUnavailable(rssi, -113, -51); + mSignalStrength = mRssi; + mRsrp = inRangeOrUnavailable(rsrp, -140, -43); + mRsrq = inRangeOrUnavailable(rsrq, -20, -3); + mRssnr = inRangeOrUnavailable(rssnr, -200, 300); + mCqi = inRangeOrUnavailable(cqi, 0, 15); + mTimingAdvance = inRangeOrUnavailable(timingAdvance, 0, 1282); + updateLevel(null, null); + } + + /** @hide */ + public CellSignalStrengthLte(android.hardware.radio.V1_0.LteSignalStrength lte) { + // Convert from HAL values as part of construction. + this(convertRssiAsuToDBm(lte.signalStrength), + lte.rsrp != CellInfo.UNAVAILABLE ? -lte.rsrp : lte.rsrp, + lte.rsrq != CellInfo.UNAVAILABLE ? -lte.rsrq : lte.rsrq, + lte.rssnr, lte.cqi, lte.timingAdvance); } /** @hide */ @@ -87,11 +117,13 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P /** @hide */ protected void copyFrom(CellSignalStrengthLte s) { mSignalStrength = s.mSignalStrength; + mRssi = s.mRssi; mRsrp = s.mRsrp; mRsrq = s.mRsrq; mRssnr = s.mRssnr; mCqi = s.mCqi; mTimingAdvance = s.mTimingAdvance; + mLevel = s.mLevel; } /** @hide */ @@ -104,11 +136,13 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P @Override public void setDefaultValues() { mSignalStrength = CellInfo.UNAVAILABLE; + mRssi = CellInfo.UNAVAILABLE; mRsrp = CellInfo.UNAVAILABLE; mRsrq = CellInfo.UNAVAILABLE; mRssnr = CellInfo.UNAVAILABLE; mCqi = CellInfo.UNAVAILABLE; mTimingAdvance = CellInfo.UNAVAILABLE; + mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; } /** @@ -119,34 +153,106 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P */ @Override public int getLevel() { - int levelRsrp = 0; - int levelRssnr = 0; - - if (mRsrp == CellInfo.UNAVAILABLE) levelRsrp = 0; - else if (mRsrp >= -95) levelRsrp = SIGNAL_STRENGTH_GREAT; - else if (mRsrp >= -105) levelRsrp = SIGNAL_STRENGTH_GOOD; - else if (mRsrp >= -115) levelRsrp = SIGNAL_STRENGTH_MODERATE; - else levelRsrp = SIGNAL_STRENGTH_POOR; - - // See RIL_LTE_SignalStrength in ril.h - if (mRssnr == CellInfo.UNAVAILABLE) levelRssnr = 0; - else if (mRssnr >= 45) levelRssnr = SIGNAL_STRENGTH_GREAT; - else if (mRssnr >= 10) levelRssnr = SIGNAL_STRENGTH_GOOD; - else if (mRssnr >= -30) levelRssnr = SIGNAL_STRENGTH_MODERATE; - else levelRssnr = SIGNAL_STRENGTH_POOR; - - int level; - if (mRsrp == CellInfo.UNAVAILABLE) { - level = levelRssnr; - } else if (mRssnr == CellInfo.UNAVAILABLE) { - level = levelRsrp; + return mLevel; + } + + // Lifted from Default carrier configs and max range of RSRP + private static final int[] sThresholds = new int[]{-115, -105, -95, -85}; + private static final int sRsrpBoost = 0; + + /** @hide */ + @Override + public void updateLevel(PersistableBundle cc, ServiceState ss) { + int[] thresholds; + boolean rsrpOnly; + if (cc == null) { + thresholds = sThresholds; + rsrpOnly = false; + } else { + rsrpOnly = cc.getBoolean( + CarrierConfigManager.KEY_USE_ONLY_RSRP_FOR_LTE_SIGNAL_BAR_BOOL, false); + thresholds = cc.getIntArray( + CarrierConfigManager.KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY); + if (thresholds == null) thresholds = sThresholds; + if (DBG) log("updateLevel() carrierconfig - rsrpOnly=" + + rsrpOnly + ", thresholds=" + Arrays.toString(thresholds)); + } + + + int rsrpBoost = 0; + if (ss != null) { + rsrpBoost = ss.getLteEarfcnRsrpBoost(); + } + + int rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + int rsrpIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + int snrIconLevel = -1; + + int rsrp = mRsrp + rsrpBoost; + + if (rsrp < MIN_LTE_RSRP || rsrp > MAX_LTE_RSRP) { + rsrpIconLevel = -1; } else { - level = (levelRssnr < levelRsrp) ? levelRssnr : levelRsrp; + rsrpIconLevel = thresholds.length; + while (rsrpIconLevel > 0 && rsrp < thresholds[rsrpIconLevel - 1]) rsrpIconLevel--; + } + + if (rsrpOnly) { + if (DBG) log("updateLevel() - rsrp = " + rsrpIconLevel); + if (rsrpIconLevel != -1) { + mLevel = rsrpIconLevel; + return; + } } - if (DBG) log("Lte rsrp level: " + levelRsrp - + " snr level: " + levelRssnr + " level: " + level); - return level; + /* + * Values are -200 dB to +300 (SNR*10dB) RS_SNR >= 13.0 dB =>4 bars 4.5 + * dB <= RS_SNR < 13.0 dB => 3 bars 1.0 dB <= RS_SNR < 4.5 dB => 2 bars + * -3.0 dB <= RS_SNR < 1.0 dB 1 bar RS_SNR < -3.0 dB/No Service Antenna + * Icon Only + */ + if (mRssnr > 300) snrIconLevel = -1; + else if (mRssnr >= 130) snrIconLevel = SIGNAL_STRENGTH_GREAT; + else if (mRssnr >= 45) snrIconLevel = SIGNAL_STRENGTH_GOOD; + else if (mRssnr >= 10) snrIconLevel = SIGNAL_STRENGTH_MODERATE; + else if (mRssnr >= -30) snrIconLevel = SIGNAL_STRENGTH_POOR; + else if (mRssnr >= -200) + snrIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + + if (DBG) log("updateLevel() - rsrp:" + mRsrp + " snr:" + mRssnr + " rsrpIconLevel:" + + rsrpIconLevel + " snrIconLevel:" + snrIconLevel + + " lteRsrpBoost:" + sRsrpBoost); + + /* Choose a measurement type to use for notification */ + if (snrIconLevel != -1 && rsrpIconLevel != -1) { + /* + * The number of bars displayed shall be the smaller of the bars + * associated with LTE RSRP and the bars associated with the LTE + * RS_SNR + */ + mLevel = (rsrpIconLevel < snrIconLevel ? rsrpIconLevel : snrIconLevel); + return; + } + + if (snrIconLevel != -1) { + mLevel = snrIconLevel; + return; + } + + if (rsrpIconLevel != -1) { + mLevel = rsrpIconLevel; + return; + } + + if (mRssi > -51) rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + else if (mRssi >= -89) rssiIconLevel = SIGNAL_STRENGTH_GREAT; + else if (mRssi >= -97) rssiIconLevel = SIGNAL_STRENGTH_GOOD; + else if (mRssi >= -103) rssiIconLevel = SIGNAL_STRENGTH_MODERATE; + else if (mRssi >= -113) rssiIconLevel = SIGNAL_STRENGTH_POOR; + else rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + if (DBG) log("getLteLevel - rssi:" + mRssi + " rssiIconLevel:" + + rssiIconLevel); + mLevel = rssiIconLevel; } /** @@ -169,7 +275,7 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P * @return the RSSI if available or {@link CellInfo#UNAVAILABLE} if unavailable. */ public int getRssi() { - return convertRssiAsuToDBm(mSignalStrength); + return mRssi; } /** @@ -212,13 +318,16 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P } /** - * Get the LTE signal level as an asu value between 0..97, 99 is unknown + * Get the RSRP in ASU. + * * Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69 + * + * @return RSCP in ASU 0..97, 255, or UNAVAILABLE */ @Override public int getAsuLevel() { int lteAsuLevel = 99; - int lteDbm = getDbm(); + int lteDbm = mRsrp; if (lteDbm == CellInfo.UNAVAILABLE) lteAsuLevel = 99; else if (lteDbm <= -140) lteAsuLevel = 0; else if (lteDbm >= -43) lteAsuLevel = 97; @@ -241,29 +350,31 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P @Override public int hashCode() { - return Objects.hash(mSignalStrength, mRsrp, mRsrq, mRssnr, mCqi, mTimingAdvance); + return Objects.hash(mRssi, mRsrp, mRsrq, mRssnr, mCqi, mTimingAdvance, mLevel); + } + + private static final CellSignalStrengthLte sInvalid = new CellSignalStrengthLte(); + + /** @hide */ + @Override + public boolean isValid() { + return !this.equals(sInvalid); } @Override public boolean equals (Object o) { CellSignalStrengthLte s; - try { - s = (CellSignalStrengthLte) o; - } catch (ClassCastException ex) { - return false; - } - - if (o == null) { - return false; - } + if (!(o instanceof CellSignalStrengthLte)) return false; + s = (CellSignalStrengthLte) o; - return mSignalStrength == s.mSignalStrength + return mRssi == s.mRssi && mRsrp == s.mRsrp && mRsrq == s.mRsrq && mRssnr == s.mRssnr && mCqi == s.mCqi - && mTimingAdvance == s.mTimingAdvance; + && mTimingAdvance == s.mTimingAdvance + && mLevel == s.mLevel; } /** @@ -272,27 +383,29 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P @Override public String toString() { return "CellSignalStrengthLte:" - + " ss=" + mSignalStrength + + " rssi=" + mRssi + " rsrp=" + mRsrp + " rsrq=" + mRsrq + " rssnr=" + mRssnr + " cqi=" + mCqi - + " ta=" + mTimingAdvance; + + " ta=" + mTimingAdvance + + " level=" + mLevel; } /** Implement the Parcelable interface */ @Override public void writeToParcel(Parcel dest, int flags) { if (DBG) log("writeToParcel(Parcel, int): " + toString()); - dest.writeInt(mSignalStrength); + dest.writeInt(mRssi); // Need to multiply rsrp and rsrq by -1 // to ensure consistency when reading values written here // unless the values are invalid - dest.writeInt(mRsrp * (mRsrp != CellInfo.UNAVAILABLE ? -1 : 1)); - dest.writeInt(mRsrq * (mRsrq != CellInfo.UNAVAILABLE ? -1 : 1)); + dest.writeInt(mRsrp); + dest.writeInt(mRsrq); dest.writeInt(mRssnr); dest.writeInt(mCqi); dest.writeInt(mTimingAdvance); + dest.writeInt(mLevel); } /** @@ -300,16 +413,14 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P * where the token is already been processed. */ private CellSignalStrengthLte(Parcel in) { - mSignalStrength = in.readInt(); - // rsrp and rsrq are written into the parcel as positive values. - // Need to convert into negative values unless the values are invalid + mRssi = in.readInt(); + mSignalStrength = mRssi; mRsrp = in.readInt(); - if (mRsrp != CellInfo.UNAVAILABLE) mRsrp *= -1; mRsrq = in.readInt(); - if (mRsrq != CellInfo.UNAVAILABLE) mRsrq *= -1; mRssnr = in.readInt(); mCqi = in.readInt(); mTimingAdvance = in.readInt(); + mLevel = in.readInt(); if (DBG) log("CellSignalStrengthLte(Parcel): " + toString()); } @@ -342,13 +453,12 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P } private static int convertRssiAsuToDBm(int rssiAsu) { - if (rssiAsu != SIGNAL_STRENGTH_LTE_RSSI_ASU_UNKNOWN - && (rssiAsu < SIGNAL_STRENGTH_LTE_RSSI_VALID_ASU_MIN_VALUE - || rssiAsu > SIGNAL_STRENGTH_LTE_RSSI_VALID_ASU_MAX_VALUE)) { - Rlog.e(LOG_TAG, "convertRssiAsuToDBm: invalid RSSI in ASU=" + rssiAsu); + if (rssiAsu == SIGNAL_STRENGTH_LTE_RSSI_ASU_UNKNOWN) { return CellInfo.UNAVAILABLE; } - if (rssiAsu == SIGNAL_STRENGTH_LTE_RSSI_ASU_UNKNOWN) { + if ((rssiAsu < SIGNAL_STRENGTH_LTE_RSSI_VALID_ASU_MIN_VALUE + || rssiAsu > SIGNAL_STRENGTH_LTE_RSSI_VALID_ASU_MAX_VALUE)) { + Rlog.e(LOG_TAG, "convertRssiAsuToDBm: invalid RSSI in ASU=" + rssiAsu); return CellInfo.UNAVAILABLE; } return -113 + (2 * rssiAsu); diff --git a/telephony/java/android/telephony/CellSignalStrengthNr.java b/telephony/java/android/telephony/CellSignalStrengthNr.java index 807924222a26..061cd4b33950 100644 --- a/telephony/java/android/telephony/CellSignalStrengthNr.java +++ b/telephony/java/android/telephony/CellSignalStrengthNr.java @@ -18,6 +18,7 @@ package android.telephony; import android.os.Parcel; import android.os.Parcelable; +import android.os.PersistableBundle; import java.util.Objects; @@ -48,6 +49,12 @@ public final class CellSignalStrengthNr extends CellSignalStrength implements Pa private int mSsRsrp; private int mSsRsrq; private int mSsSinr; + private int mLevel; + + /** @hide */ + public CellSignalStrengthNr() { + setDefaultValues(); + } /** * @param csiRsrp CSI reference signal received power. @@ -60,12 +67,13 @@ public final class CellSignalStrengthNr extends CellSignalStrength implements Pa */ public CellSignalStrengthNr( int csiRsrp, int csiRsrq, int csiSinr, int ssRsrp, int ssRsrq, int ssSinr) { - mCsiRsrp = csiRsrp; - mCsiRsrq = csiRsrq; - mCsiSinr = csiSinr; - mSsRsrp = ssRsrp; - mSsRsrq = ssRsrq; - mSsSinr = ssSinr; + mCsiRsrp = inRangeOrUnavailable(csiRsrp, -140, -44); + mCsiRsrq = inRangeOrUnavailable(csiRsrq, -20, -3); + mCsiSinr = inRangeOrUnavailable(csiSinr, -23, 23); + mSsRsrp = inRangeOrUnavailable(ssRsrp, -140, -44); + mSsRsrq = inRangeOrUnavailable(ssRsrq, -20, -3); + mSsSinr = inRangeOrUnavailable(ssSinr, -23, 40); + updateLevel(null, null); } /** @@ -142,6 +150,7 @@ public final class CellSignalStrengthNr extends CellSignalStrength implements Pa dest.writeInt(mSsRsrp); dest.writeInt(mSsRsrq); dest.writeInt(mSsSinr); + dest.writeInt(mLevel); } private CellSignalStrengthNr(Parcel in) { @@ -151,6 +160,7 @@ public final class CellSignalStrengthNr extends CellSignalStrength implements Pa mSsRsrp = in.readInt(); mSsRsrq = in.readInt(); mSsSinr = in.readInt(); + mLevel = in.readInt(); } /** @hide */ @@ -162,27 +172,36 @@ public final class CellSignalStrengthNr extends CellSignalStrength implements Pa mSsRsrp = CellInfo.UNAVAILABLE; mSsRsrq = CellInfo.UNAVAILABLE; mSsSinr = CellInfo.UNAVAILABLE; + mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; } @Override public int getLevel() { + return mLevel; + } + + /** @hide */ + @Override + public void updateLevel(PersistableBundle cc, ServiceState ss) { if (mCsiRsrp == CellInfo.UNAVAILABLE) { - return SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; } else if (mCsiRsrp >= SIGNAL_GREAT_THRESHOLD) { - return SIGNAL_STRENGTH_GREAT; + mLevel = SIGNAL_STRENGTH_GREAT; } else if (mCsiRsrp >= SIGNAL_GOOD_THRESHOLD) { - return SIGNAL_STRENGTH_GOOD; + mLevel = SIGNAL_STRENGTH_GOOD; } else if (mCsiRsrp >= SIGNAL_MODERATE_THRESHOLD) { - return SIGNAL_STRENGTH_MODERATE; + mLevel = SIGNAL_STRENGTH_MODERATE; } else { - return SIGNAL_STRENGTH_POOR; + mLevel = SIGNAL_STRENGTH_POOR; } } /** - * Calculates the NR signal as an asu value between 0..97, 99 is unknown. - * Asu is calculated based on 3GPP RSRP, refer to 3GPP TS 27.007 section 8.69. - * @return an integer represent the asu level of the signal strength. + * Get the RSRP in ASU. + * + * Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69 + * + * @return RSCP in ASU 0..97, 255, or UNAVAILABLE */ @Override public int getAsuLevel() { @@ -206,15 +225,33 @@ public final class CellSignalStrengthNr extends CellSignalStrength implements Pa } /** @hide */ + public CellSignalStrengthNr(CellSignalStrengthNr s) { + mCsiRsrp = s.mCsiRsrp; + mCsiRsrq = s.mCsiRsrq; + mCsiSinr = s.mCsiSinr; + mSsRsrp = s.mSsRsrp; + mSsRsrq = s.mSsRsrq; + mSsSinr = s.mSsSinr; + mLevel = s.mLevel; + } + + /** @hide */ @Override - public CellSignalStrength copy() { - return new CellSignalStrengthNr( - mCsiRsrp, mCsiRsrq, mCsiSinr, mSsRsrp, mSsRsrq, mSsSinr); + public CellSignalStrengthNr copy() { + return new CellSignalStrengthNr(this); } @Override public int hashCode() { - return Objects.hash(mCsiRsrp, mCsiRsrq, mCsiSinr, mSsRsrp, mSsRsrq, mSsSinr); + return Objects.hash(mCsiRsrp, mCsiRsrq, mCsiSinr, mSsRsrp, mSsRsrq, mSsSinr, mLevel); + } + + private static final CellSignalStrengthNr sInvalid = new CellSignalStrengthNr(); + + /** @hide */ + @Override + public boolean isValid() { + return !this.equals(sInvalid); } @Override @@ -222,7 +259,8 @@ public final class CellSignalStrengthNr extends CellSignalStrength implements Pa if (obj instanceof CellSignalStrengthNr) { CellSignalStrengthNr o = (CellSignalStrengthNr) obj; return mCsiRsrp == o.mCsiRsrp && mCsiRsrq == o.mCsiRsrq && mCsiSinr == o.mCsiSinr - && mSsRsrp == o.mSsRsrp && mSsRsrq == o.mSsRsrq && mSsSinr == o.mSsSinr; + && mSsRsrp == o.mSsRsrp && mSsRsrq == o.mSsRsrq && mSsSinr == o.mSsSinr + && mLevel == o.mLevel; } return false; } @@ -237,6 +275,7 @@ public final class CellSignalStrengthNr extends CellSignalStrength implements Pa .append(" ssRsrp = " + mSsRsrp) .append(" ssRsrq = " + mSsRsrq) .append(" ssSinr = " + mSsSinr) + .append(" level = " + mLevel) .append(" }") .toString(); } diff --git a/telephony/java/android/telephony/CellSignalStrengthTdscdma.java b/telephony/java/android/telephony/CellSignalStrengthTdscdma.java index 4d040cca5fff..6f52b853d23b 100644 --- a/telephony/java/android/telephony/CellSignalStrengthTdscdma.java +++ b/telephony/java/android/telephony/CellSignalStrengthTdscdma.java @@ -18,6 +18,7 @@ package android.telephony; import android.os.Parcel; import android.os.Parcelable; +import android.os.PersistableBundle; import java.util.Objects; @@ -31,27 +32,53 @@ public final class CellSignalStrengthTdscdma extends CellSignalStrength implemen private static final String LOG_TAG = "CellSignalStrengthTdscdma"; private static final boolean DBG = false; - private static final int TDSCDMA_SIGNAL_STRENGTH_GREAT = 12; - private static final int TDSCDMA_SIGNAL_STRENGTH_GOOD = 8; - private static final int TDSCDMA_SIGNAL_STRENGTH_MODERATE = 5; + private static final int TDSCDMA_RSSI_MAX = -51; + private static final int TDSCDMA_RSSI_GREAT = -77; + private static final int TDSCDMA_RSSI_GOOD = -87; + private static final int TDSCDMA_RSSI_MODERATE = -97; + private static final int TDSCDMA_RSSI_POOR = -107; + + private static final int TDSCDMA_RSCP_MIN = -120; + private static final int TDSCDMA_RSCP_MAX = -24; + + private int mRssi; // in dBm [-113, -51], CellInfo.UNAVAILABLE - private int mSignalStrength; // in ASU; Valid values are (0-31, 99) as defined in TS 27.007 8.5 - // or CellInfo.UNAVAILABLE if unknown private int mBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5 or // CellInfo.UNAVAILABLE if unknown - private int mRscp; // Pilot power (0-96, 255) as defined in TS 27.007 8.69 or + private int mRscp; // Pilot Power in dBm [-120, -24] or CellInfo.UNAVAILABLE // CellInfo.UNAVAILABLE if unknown + private int mLevel; + /** @hide */ public CellSignalStrengthTdscdma() { setDefaultValues(); } + /** + * @param rssi in dBm [-113, -51] or UNAVAILABLE + * @param ber [0-7], 99 or UNAVAILABLE + * @param rscp in dBm [-120, -24] or UNAVAILABLE + * @hide */ + public CellSignalStrengthTdscdma(int rssi, int ber, int rscp) { + mRssi = inRangeOrUnavailable(rssi, -113, -51); + mBitErrorRate = inRangeOrUnavailable(ber, 0, 7, 99); + mRscp = inRangeOrUnavailable(rscp, -120, -24); + updateLevel(null, null); + } + /** @hide */ - public CellSignalStrengthTdscdma(int ss, int ber, int rscp) { - mSignalStrength = ss; - mBitErrorRate = ber; - mRscp = rscp; + public CellSignalStrengthTdscdma(android.hardware.radio.V1_0.TdScdmaSignalStrength tdscdma) { + // Convert from HAL values as part of construction. + this(CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, + tdscdma.rscp != CellInfo.UNAVAILABLE ? -tdscdma.rscp : tdscdma.rscp); + } + + /** @hide */ + public CellSignalStrengthTdscdma(android.hardware.radio.V1_2.TdscdmaSignalStrength tdscdma) { + // Convert from HAL values as part of construction. + this(getRssiDbmFromAsu(tdscdma.signalStrength), + tdscdma.bitErrorRate, getRscpDbmFromAsu(tdscdma.rscp)); } /** @hide */ @@ -61,9 +88,10 @@ public final class CellSignalStrengthTdscdma extends CellSignalStrength implemen /** @hide */ protected void copyFrom(CellSignalStrengthTdscdma s) { - mSignalStrength = s.mSignalStrength; + mRssi = s.mRssi; mBitErrorRate = s.mBitErrorRate; mRscp = s.mRscp; + mLevel = s.mLevel; } /** @hide */ @@ -75,9 +103,10 @@ public final class CellSignalStrengthTdscdma extends CellSignalStrength implemen /** @hide */ @Override public void setDefaultValues() { - mSignalStrength = CellInfo.UNAVAILABLE; + mRssi = CellInfo.UNAVAILABLE; mBitErrorRate = CellInfo.UNAVAILABLE; mRscp = CellInfo.UNAVAILABLE; + mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; } /** @@ -88,26 +117,18 @@ public final class CellSignalStrengthTdscdma extends CellSignalStrength implemen */ @Override public int getLevel() { - int level; - - // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5 - // asu = 0 (-113dB or less) is very weak - // signal, its better to show 0 bars to the user in such cases. - // asu = 99 is a special case, where the signal strength is unknown. - int asu = mSignalStrength; - if (asu <= 2 || asu == 99) { - level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; - } else if (asu >= TDSCDMA_SIGNAL_STRENGTH_GREAT) { - level = SIGNAL_STRENGTH_GREAT; - } else if (asu >= TDSCDMA_SIGNAL_STRENGTH_GOOD) { - level = SIGNAL_STRENGTH_GOOD; - } else if (asu >= TDSCDMA_SIGNAL_STRENGTH_MODERATE) { - level = SIGNAL_STRENGTH_MODERATE; - } else { - level = SIGNAL_STRENGTH_POOR; - } - if (DBG) log("getLevel=" + level); - return level; + return mLevel; + } + + /** @hide */ + @Override + public void updateLevel(PersistableBundle cc, ServiceState ss) { + if (mRssi > TDSCDMA_RSSI_MAX) mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + else if (mRssi >= TDSCDMA_RSSI_GREAT) mLevel = SIGNAL_STRENGTH_GREAT; + else if (mRssi >= TDSCDMA_RSSI_GOOD) mLevel = SIGNAL_STRENGTH_GOOD; + else if (mRssi >= TDSCDMA_RSSI_MODERATE) mLevel = SIGNAL_STRENGTH_MODERATE; + else if (mRssi >= TDSCDMA_RSSI_POOR) mLevel = SIGNAL_STRENGTH_POOR; + else mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; } /** @@ -115,56 +136,55 @@ public final class CellSignalStrengthTdscdma extends CellSignalStrength implemen */ @Override public int getDbm() { - int dBm; - - int level = mSignalStrength; - int asu = (level == 99 ? CellInfo.UNAVAILABLE : level); - if (asu != CellInfo.UNAVAILABLE) { - dBm = -113 + (2 * asu); - } else { - dBm = CellInfo.UNAVAILABLE; - } - if (DBG) log("getDbm=" + dBm); - return dBm; + return mRscp; } /** - * Get the signal level as an asu value between 0..31, 99 is unknown + * Get the RSCP as dBm + * @hide + */ + public int getRscp() { + return mRscp; + } + + /** + * Get the RSCP in ASU. + * * Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69 + * + * @return RSCP in ASU 0..96, 255, or UNAVAILABLE */ @Override public int getAsuLevel() { - // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5 - // asu = 0 (-113dB or less) is very weak - // signal, its better to show 0 bars to the user in such cases. - // asu = 99 is a special case, where the signal strength is unknown. - int level = mSignalStrength; - if (DBG) log("getAsuLevel=" + level); - return level; + if (mRscp != CellInfo.UNAVAILABLE) return getAsuFromRscpDbm(mRscp); + // For historical reasons, if RSCP is unavailable, this API will very incorrectly return + // RSSI. This hackery will be removed when most devices are using Radio HAL 1.2+ + if (mRssi != CellInfo.UNAVAILABLE) return getAsuFromRssiDbm(mRssi); + return getAsuFromRscpDbm(CellInfo.UNAVAILABLE); } @Override public int hashCode() { - return Objects.hash(mSignalStrength, mBitErrorRate); + return Objects.hash(mRssi, mBitErrorRate, mRscp, mLevel); } - @Override - public boolean equals(Object o) { - CellSignalStrengthTdscdma s; + private static final CellSignalStrengthTdscdma sInvalid = new CellSignalStrengthTdscdma(); - try { - s = (CellSignalStrengthTdscdma) o; - } catch (ClassCastException ex) { - return false; - } + /** @hide */ + @Override + public boolean isValid() { + return !this.equals(sInvalid); + } - if (o == null) { - return false; - } + @Override + public boolean equals(Object o) { + if (!(o instanceof CellSignalStrengthTdscdma)) return false; + CellSignalStrengthTdscdma s = (CellSignalStrengthTdscdma) o; - return mSignalStrength == s.mSignalStrength + return mRssi == s.mRssi && mBitErrorRate == s.mBitErrorRate - && mRscp == s.mRscp; + && mRscp == s.mRscp + && mLevel == s.mLevel; } /** @@ -173,18 +193,20 @@ public final class CellSignalStrengthTdscdma extends CellSignalStrength implemen @Override public String toString() { return "CellSignalStrengthTdscdma:" - + " ss=" + mSignalStrength + + " rssi=" + mRssi + " ber=" + mBitErrorRate - + " rscp=" + mRscp; + + " rscp=" + mRscp + + " level=" + mLevel; } /** Implement the Parcelable interface */ @Override public void writeToParcel(Parcel dest, int flags) { if (DBG) log("writeToParcel(Parcel, int): " + toString()); - dest.writeInt(mSignalStrength); + dest.writeInt(mRssi); dest.writeInt(mBitErrorRate); dest.writeInt(mRscp); + dest.writeInt(mLevel); } /** @@ -192,9 +214,10 @@ public final class CellSignalStrengthTdscdma extends CellSignalStrength implemen * where the token is already been processed. */ private CellSignalStrengthTdscdma(Parcel in) { - mSignalStrength = in.readInt(); + mRssi = in.readInt(); mBitErrorRate = in.readInt(); mRscp = in.readInt(); + mLevel = in.readInt(); if (DBG) log("CellSignalStrengthTdscdma(Parcel): " + toString()); } diff --git a/telephony/java/android/telephony/CellSignalStrengthWcdma.java b/telephony/java/android/telephony/CellSignalStrengthWcdma.java index 0048cbdea8f6..88f6fbc4464d 100644 --- a/telephony/java/android/telephony/CellSignalStrengthWcdma.java +++ b/telephony/java/android/telephony/CellSignalStrengthWcdma.java @@ -16,11 +16,14 @@ package android.telephony; -import android.annotation.UnsupportedAppUsage; +import android.annotation.StringDef; import android.os.Parcel; import android.os.Parcelable; +import android.os.PersistableBundle; import android.telephony.Rlog; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Objects; /** @@ -31,20 +34,32 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements private static final String LOG_TAG = "CellSignalStrengthWcdma"; private static final boolean DBG = false; - private static final int WCDMA_SIGNAL_STRENGTH_GREAT = 12; - private static final int WCDMA_SIGNAL_STRENGTH_GOOD = 8; - private static final int WCDMA_SIGNAL_STRENGTH_MODERATE = 5; + private static final int WCDMA_RSSI_MAX = -51; + private static final int WCDMA_RSSI_GREAT = -77; + private static final int WCDMA_RSSI_GOOD = -87; + private static final int WCDMA_RSSI_MODERATE = -97; + private static final int WCDMA_RSSI_POOR = -107; + private static final int WCDMA_RSSI_MIN = -113; - @UnsupportedAppUsage - private int mSignalStrength; // in ASU; Valid values are (0-31, 99) as defined in TS 27.007 8.5 - // or CellInfo.UNAVAILABLE if unknown - @UnsupportedAppUsage + private static final int WCDMA_RSCP_MIN = -120; + private static final int WCDMA_RSCP_MAX = -24; + + // TODO: Because these are used as values in CarrierConfig, they should be exposed somehow. + /** @hide */ + @Retention(RetentionPolicy.SOURCE) + @StringDef({LEVEL_CALCULATION_METHOD_RSSI, LEVEL_CALCULATION_METHOD_RSCP}) + public @interface LevelCalculationMethod {} + /** @hide */ + public static final String LEVEL_CALCULATION_METHOD_RSSI = "rssi"; + /** @hide */ + public static final String LEVEL_CALCULATION_METHOD_RSCP = "rscp"; + + private int mRssi; // in dBm [-113, 51] or CellInfo.UNAVAILABLE if unknown private int mBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5 or // CellInfo.UNAVAILABLE if unknown - private int mRscp; // bit error rate (0-96, 255) as defined in TS 27.007 8.69 or - // CellInfo.UNAVAILABLE if unknown - private int mEcNo; // signal to noise radio (0-49, 255) as defined in TS 27.007 8.69 or - // CellInfo.UNAVAILABLE if unknown + private int mRscp; // in dBm [-120, -24] + private int mEcNo; // range -24, 1, CellInfo.UNAVAILABLE if unknown + private int mLevel; /** @hide */ public CellSignalStrengthWcdma() { @@ -52,11 +67,28 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements } /** @hide */ - public CellSignalStrengthWcdma(int ss, int ber, int rscp, int ecno) { - mSignalStrength = ss; - mBitErrorRate = ber; - mRscp = rscp; - mEcNo = ecno; + public CellSignalStrengthWcdma(int rssi, int ber, int rscp, int ecno) { + mRssi = inRangeOrUnavailable(rssi, WCDMA_RSSI_MIN, WCDMA_RSSI_MAX); + mBitErrorRate = inRangeOrUnavailable(ber, 0, 7, 99); + mRscp = inRangeOrUnavailable(rscp, -120, -24); + mEcNo = inRangeOrUnavailable(ecno, -24, 1); + updateLevel(null, null); + } + + /** @hide */ + public CellSignalStrengthWcdma(android.hardware.radio.V1_0.WcdmaSignalStrength wcdma) { + // Convert from HAL values as part of construction. + this(getRssiDbmFromAsu(wcdma.signalStrength), + wcdma.bitErrorRate, CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE); + } + + /** @hide */ + public CellSignalStrengthWcdma(android.hardware.radio.V1_2.WcdmaSignalStrength wcdma) { + // Convert from HAL values as part of construction. + this(getRssiDbmFromAsu(wcdma.base.signalStrength), + wcdma.base.bitErrorRate, + getRscpDbmFromAsu(wcdma.rscp), + getEcNoDbFromAsu(wcdma.ecno)); } /** @hide */ @@ -66,10 +98,11 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements /** @hide */ protected void copyFrom(CellSignalStrengthWcdma s) { - mSignalStrength = s.mSignalStrength; + mRssi = s.mRssi; mBitErrorRate = s.mBitErrorRate; mRscp = s.mRscp; mEcNo = s.mEcNo; + mLevel = s.mLevel; } /** @hide */ @@ -81,12 +114,17 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements /** @hide */ @Override public void setDefaultValues() { - mSignalStrength = CellInfo.UNAVAILABLE; + mRssi = CellInfo.UNAVAILABLE; mBitErrorRate = CellInfo.UNAVAILABLE; mRscp = CellInfo.UNAVAILABLE; mEcNo = CellInfo.UNAVAILABLE; + mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; } + private static final String sLevelCalculationMethod = LEVEL_CALCULATION_METHOD_RSSI; + private static final int[] sThresholds = new int[]{ + WCDMA_RSSI_POOR, WCDMA_RSSI_GOOD, WCDMA_RSSI_GOOD, WCDMA_RSSI_GREAT}; + /** * Retrieve an abstract level value for the overall signal strength. * @@ -95,20 +133,49 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements */ @Override public int getLevel() { - int level; - - // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5 - // asu = 0 (-113dB or less) is very weak - // signal, its better to show 0 bars to the user in such cases. - // asu = 99 is a special case, where the signal strength is unknown. - int asu = mSignalStrength; - if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; - else if (asu >= WCDMA_SIGNAL_STRENGTH_GREAT) level = SIGNAL_STRENGTH_GREAT; - else if (asu >= WCDMA_SIGNAL_STRENGTH_GOOD) level = SIGNAL_STRENGTH_GOOD; - else if (asu >= WCDMA_SIGNAL_STRENGTH_MODERATE) level = SIGNAL_STRENGTH_MODERATE; - else level = SIGNAL_STRENGTH_POOR; - if (DBG) log("getLevel=" + level); - return level; + return mLevel; + } + + /** @hide */ + @Override + public void updateLevel(PersistableBundle cc, ServiceState ss) { + String calcMethod; + int[] thresholds; + + if (cc == null) { + calcMethod = sLevelCalculationMethod; + thresholds = sThresholds; + } else { + // TODO: abstract this entire thing into a series of functions + calcMethod = cc.getString( + CarrierConfigManager.KEY_WCDMA_DEFAULT_SIGNAL_STRENGTH_MEASUREMENT_STRING, + sLevelCalculationMethod); + thresholds = cc.getIntArray( + CarrierConfigManager.KEY_WCDMA_RSCP_THRESHOLDS_INT_ARRAY); + if (thresholds == null) thresholds = sThresholds; + } + + int level = thresholds.length; + switch (calcMethod) { + case LEVEL_CALCULATION_METHOD_RSCP: + if (mRscp < WCDMA_RSCP_MIN || mRscp > WCDMA_RSCP_MAX) { + mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + return; + } + while (level > 0 && mRscp < thresholds[level - 1]) level--; + mLevel = level; + return; + case LEVEL_CALCULATION_METHOD_RSSI: + if (mRssi < WCDMA_RSSI_MIN || mRssi > WCDMA_RSSI_MAX) { + mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + return; + } + while (level > 0 && mRssi < thresholds[level - 1]) level--; + mLevel = level; + return; + default: + mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + } } /** @@ -116,57 +183,66 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements */ @Override public int getDbm() { - int dBm; - - int level = mSignalStrength; - int asu = (level == 99 ? CellInfo.UNAVAILABLE : level); - if (asu != CellInfo.UNAVAILABLE) { - dBm = -113 + (2 * asu); - } else { - dBm = CellInfo.UNAVAILABLE; - } - if (DBG) log("getDbm=" + dBm); - return dBm; + if (mRscp != CellInfo.UNAVAILABLE) return mRscp; + return mRssi; } /** - * Get the signal level as an asu value between 0..31, 99 is unknown - * Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69 + * Get the RSCP in ASU. + * + * Asu is calculated based on 3GPP RSCP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69 + * + * @return RSCP in ASU 0..96, 255, or UNAVAILABLE */ @Override public int getAsuLevel() { - // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5 - // asu = 0 (-113dB or less) is very weak - // signal, its better to show 0 bars to the user in such cases. - // asu = 99 is a special case, where the signal strength is unknown. - int level = mSignalStrength; - if (DBG) log("getAsuLevel=" + level); - return level; + if (mRscp != CellInfo.UNAVAILABLE) return getAsuFromRscpDbm(mRscp); + // For historical reasons, if RSCP is unavailable, this API will very incorrectly return + // RSSI. This hackery will be removed when most devices are using Radio HAL 1.2+ + if (mRssi != CellInfo.UNAVAILABLE) return getAsuFromRssiDbm(mRssi); + return getAsuFromRscpDbm(CellInfo.UNAVAILABLE); + } + + /** + * Get the signal strength as dBm + * + * @hide + */ + public int getRssi() { + return mRssi; + } + + /** + * Get the RSCP as dBm + * @hide + */ + public int getRscp() { + return mRscp; } @Override public int hashCode() { - return Objects.hash(mSignalStrength, mBitErrorRate); + return Objects.hash(mRssi, mBitErrorRate, mRscp, mEcNo, mLevel); } - @Override - public boolean equals (Object o) { - CellSignalStrengthWcdma s; + private static final CellSignalStrengthWcdma sInvalid = new CellSignalStrengthWcdma(); - try { - s = (CellSignalStrengthWcdma) o; - } catch (ClassCastException ex) { - return false; - } + /** @hide */ + @Override + public boolean isValid() { + return !this.equals(sInvalid); + } - if (o == null) { - return false; - } + @Override + public boolean equals(Object o) { + if (!(o instanceof CellSignalStrengthWcdma)) return false; + CellSignalStrengthWcdma s = (CellSignalStrengthWcdma) o; - return mSignalStrength == s.mSignalStrength + return mRssi == s.mRssi && mBitErrorRate == s.mBitErrorRate && mRscp == s.mRscp - && mEcNo == s.mEcNo; + && mEcNo == s.mEcNo + && mLevel == s.mLevel; } /** @@ -175,20 +251,22 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements @Override public String toString() { return "CellSignalStrengthWcdma:" - + " ss=" + mSignalStrength + + " ss=" + mRssi + " ber=" + mBitErrorRate + " rscp=" + mRscp - + " ecno=" + mEcNo; + + " ecno=" + mEcNo + + " level=" + mLevel; } /** Implement the Parcelable interface */ @Override public void writeToParcel(Parcel dest, int flags) { if (DBG) log("writeToParcel(Parcel, int): " + toString()); - dest.writeInt(mSignalStrength); + dest.writeInt(mRssi); dest.writeInt(mBitErrorRate); dest.writeInt(mRscp); dest.writeInt(mEcNo); + dest.writeInt(mLevel); } /** @@ -196,10 +274,11 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements * where the token is already been processed. */ private CellSignalStrengthWcdma(Parcel in) { - mSignalStrength = in.readInt(); + mRssi = in.readInt(); mBitErrorRate = in.readInt(); mRscp = in.readInt(); mEcNo = in.readInt(); + mLevel = in.readInt(); if (DBG) log("CellSignalStrengthWcdma(Parcel): " + toString()); } diff --git a/telephony/java/android/telephony/SignalStrength.java b/telephony/java/android/telephony/SignalStrength.java index 240b8a981e70..ef185c5eeaf1 100644 --- a/telephony/java/android/telephony/SignalStrength.java +++ b/telephony/java/android/telephony/SignalStrength.java @@ -16,16 +16,14 @@ package android.telephony; +import android.annotation.NonNull; import android.annotation.UnsupportedAppUsage; import android.os.Build; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; -import android.telephony.CarrierConfigManager; -import android.util.Log; +import android.os.PersistableBundle; -import java.util.ArrayList; -import java.util.Arrays; import java.util.Objects; /** @@ -59,6 +57,8 @@ public class SignalStrength implements Parcelable { /** @hide */ @UnsupportedAppUsage public static final int NUM_SIGNAL_STRENGTH_BINS = 5; + + /** SIGNAL_STRENGTH_NAMES is currently used by BatteryStats, but to-be-removed soon. */ /** @hide */ public static final String[] SIGNAL_STRENGTH_NAMES = { "none", "poor", "moderate", "good", "great" @@ -72,66 +72,22 @@ public class SignalStrength implements Parcelable { 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; /* The type of signal measurement */ - private static final String MEASUMENT_TYPE_RSCP = "rscp"; + private static final String MEASUREMENT_TYPE_RSCP = "rscp"; - /** Parameters reported by the Radio */ - @UnsupportedAppUsage - private int mGsmSignalStrength; // Valid values are (0-31, 99) as defined in TS 27.007 8.5 - @UnsupportedAppUsage - private int mGsmBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5 - @UnsupportedAppUsage - private int mCdmaDbm; // This value is the RSSI value - @UnsupportedAppUsage - private int mCdmaEcio; // This value is the Ec/Io - @UnsupportedAppUsage - private int mEvdoDbm; // This value is the EVDO RSSI value - @UnsupportedAppUsage - private int mEvdoEcio; // This value is the EVDO Ec/Io - @UnsupportedAppUsage - private int mEvdoSnr; // Valid values are 0-8. 8 is the highest signal to noise ratio - @UnsupportedAppUsage - private int mLteSignalStrength; - @UnsupportedAppUsage - private int mLteRsrp; - @UnsupportedAppUsage - private int mLteRsrq; - @UnsupportedAppUsage - private int mLteRssnr; - @UnsupportedAppUsage - private int mLteCqi; - @UnsupportedAppUsage - private int mTdScdmaRscp; // Valid values are -24...-120dBm or INVALID if unknown - private int mWcdmaSignalStrength; - private int mWcdmaRscpAsu; // the WCDMA RSCP in ASU as reported from the HAL - @UnsupportedAppUsage - private int mWcdmaRscp; // the WCDMA RSCP in dBm + CellSignalStrengthCdma mCdma; + CellSignalStrengthGsm mGsm; + CellSignalStrengthWcdma mWcdma; + CellSignalStrengthTdscdma mTdscdma; + CellSignalStrengthLte mLte; /** Parameters from the framework */ @UnsupportedAppUsage private int mLteRsrpBoost; // offset to be reduced from the rsrp threshold while calculating // signal strength level - private boolean mIsGsm; // This value is set by the ServiceStateTracker - // onSignalStrengthResult. - private boolean mUseOnlyRsrpForLteLevel; // Use only RSRP for the number of LTE signal bar. - - // The threshold of LTE RSRP for determining the display level of LTE signal bar. Note that the - // min and max are fixed at MIN_LTE_RSRP (-140) and MAX_LTE_RSRP (-44). - private int mLteRsrpThresholds[] = new int[LTE_RSRP_THRESHOLDS_NUM]; - - // The type of default measurement for determining the display level of WCDMA signal bar. - private String mWcdmaDefaultSignalMeasurement; - - // The threshold of WCDMA RSCP for determining the display level of WCDMA signal bar. Note that - // the min and max are fixed at MIN_WCDMA_RSCP (-120) and MAX_WCDMA_RSCP (-24). - private int mWcdmaRscpThresholds[] = new int[WCDMA_RSCP_THRESHOLDS_NUM]; /** * Create a new SignalStrength from a intent notifier Bundle @@ -153,47 +109,17 @@ public class SignalStrength implements Parcelable { } /** - * Empty constructor - * - * @hide - */ - @UnsupportedAppUsage - public SignalStrength() { - this(true); - } - - /** * This constructor is used to create SignalStrength with default - * values and set the gsmFlag with the value passed in the input + * values. * - * @param gsmFlag true if Gsm Phone,false if Cdma phone * @return newly created SignalStrength * @hide */ @UnsupportedAppUsage - public SignalStrength(boolean gsmFlag) { - mGsmSignalStrength = 99; - mGsmBitErrorRate = -1; - mCdmaDbm = INVALID; - mCdmaEcio = -1; - mEvdoDbm = INVALID; - 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() { + this(new CellSignalStrengthCdma(), new CellSignalStrengthGsm(), + new CellSignalStrengthWcdma(), new CellSignalStrengthTdscdma(), + new CellSignalStrengthLte()); } /** @@ -202,68 +128,64 @@ public class SignalStrength implements Parcelable { * @hide */ 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, - // values Added by config - 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()); + @NonNull CellSignalStrengthCdma cdma, + @NonNull CellSignalStrengthGsm gsm, + @NonNull CellSignalStrengthWcdma wcdma, + @NonNull CellSignalStrengthTdscdma tdscdma, + @NonNull CellSignalStrengthLte lte) { + mCdma = cdma; + mGsm = gsm; + mWcdma = wcdma; + mTdscdma = tdscdma; + mLte = lte; + mLteRsrpBoost = 0; } /** - * Constructor for only values provided by Radio HAL V1.0 + * Constructor for Radio HAL V1.0 * * @hide */ - 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(android.hardware.radio.V1_0.SignalStrength signalStrength) { + this(new CellSignalStrengthCdma(signalStrength.cdma, signalStrength.evdo), + new CellSignalStrengthGsm(signalStrength.gw), + new CellSignalStrengthWcdma(), + new CellSignalStrengthTdscdma(signalStrength.tdScdma), + new CellSignalStrengthLte(signalStrength.lte)); } /** - * Constructor for only values provided by Radio HAL V1.2 + * Constructor for Radio HAL V1.2 * * @hide */ - 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(android.hardware.radio.V1_2.SignalStrength signalStrength) { + this(new CellSignalStrengthCdma(signalStrength.cdma, signalStrength.evdo), + new CellSignalStrengthGsm(signalStrength.gsm), + new CellSignalStrengthWcdma(signalStrength.wcdma), + new CellSignalStrengthTdscdma(signalStrength.tdScdma), + new CellSignalStrengthLte(signalStrength.lte)); + } + + private CellSignalStrength getPrimary() { + // This behavior is intended to replicate the legacy behavior of getLevel() by prioritizing + // newer faster RATs for default/for display purposes. + if (mLte.isValid()) return mLte; + if (mCdma.isValid()) return mCdma; + if (mTdscdma.isValid()) return mTdscdma; + if (mWcdma.isValid()) return mWcdma; + if (mGsm.isValid()) return mGsm; + return mLte; + } + + /** @hide */ + public void updateLevel(PersistableBundle cc, ServiceState ss) { + mLteRsrpBoost = ss.getLteEarfcnRsrpBoost(); + mCdma.updateLevel(cc, ss); + mGsm.updateLevel(cc, ss); + mWcdma.updateLevel(cc, ss); + mTdscdma.updateLevel(cc, ss); + mLte.updateLevel(cc, ss); } /** @@ -283,28 +205,12 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage 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; + mCdma = new CellSignalStrengthCdma(s.mCdma); + mGsm = new CellSignalStrengthGsm(s.mGsm); + mWcdma = new CellSignalStrengthWcdma(s.mWcdma); + mTdscdma = new CellSignalStrengthTdscdma(s.mTdscdma); + mLte = new CellSignalStrengthLte(s.mLte); mLteRsrpBoost = s.mLteRsrpBoost; - mIsGsm = s.mIsGsm; - mUseOnlyRsrpForLteLevel = s.mUseOnlyRsrpForLteLevel; - mWcdmaDefaultSignalMeasurement = s.mWcdmaDefaultSignalMeasurement; - setLteRsrpThresholds(s.mLteRsrpThresholds); - setWcdmaRscpThresholds(s.mWcdmaRscpThresholds); } /** @@ -316,56 +222,25 @@ public class SignalStrength implements Parcelable { 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(); + mCdma = in.readParcelable(CellSignalStrengthCdma.class.getClassLoader()); + mGsm = in.readParcelable(CellSignalStrengthGsm.class.getClassLoader()); + mWcdma = in.readParcelable(CellSignalStrengthWcdma.class.getClassLoader()); + mTdscdma = in.readParcelable(CellSignalStrengthTdscdma.class.getClassLoader()); + mLte = in.readParcelable(CellSignalStrengthLte.class.getClassLoader()); mLteRsrpBoost = in.readInt(); - mIsGsm = in.readBoolean(); - mUseOnlyRsrpForLteLevel = in.readBoolean(); - mWcdmaDefaultSignalMeasurement = in.readString(); - in.readIntArray(mLteRsrpThresholds); - in.readIntArray(mWcdmaRscpThresholds); } /** * {@link Parcelable#writeToParcel} */ 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.writeParcelable(mCdma, flags); + out.writeParcelable(mGsm, flags); + out.writeParcelable(mWcdma, flags); + out.writeParcelable(mTdscdma, flags); + out.writeParcelable(mLte, flags); + out.writeInt(mLteRsrpBoost); - out.writeBoolean(mIsGsm); - out.writeBoolean(mUseOnlyRsrpForLteLevel); - out.writeString(mWcdmaDefaultSignalMeasurement); - out.writeIntArray(mLteRsrpThresholds); - out.writeIntArray(mWcdmaRscpThresholds); } /** @@ -392,153 +267,21 @@ public class SignalStrength implements Parcelable { }; /** - * Validate the individual signal strength fields as per the range - * specified in ril.h - * Set to invalid any field that is not in the valid range - * Cdma, evdo, lte rsrp & rsrq values are sign converted - * when received from ril interface - * - * @return - * Valid values for all signalstrength fields - * @hide - */ - @UnsupportedAppUsage - public void validateInput() { - if (DBG) log("Signal before validate=" + this); - // TS 27.007 8.5 - mGsmSignalStrength = mGsmSignalStrength >= 0 ? mGsmSignalStrength : 99; - mWcdmaSignalStrength = (mWcdmaSignalStrength >= 0) ? mWcdmaSignalStrength : 99; - mLteSignalStrength = (mLteSignalStrength >= 0) ? mLteSignalStrength : 99; - // BER no change; - - // WCDMA RSCP valid values are -120 through -24 as defined in TS 27.007 8.69 - // but are reported in ASU which is 0 through 96, so we do the conversion here - 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; - - // TS 36.214 Physical Layer Section 5.1.3, TS 36.331 RRC - 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; - // Cqi no change - if (DBG) log("Signal after validate=" + this); - } - - /** - * Fix {@link #mIsGsm} based on the signal strength data. + * Get the GSM RSSI in ASU. * - * @hide - */ - public void fixType() { - mIsGsm = getCdmaRelatedSignalStrength() == SIGNAL_STRENGTH_NONE_OR_UNKNOWN; - } - - /** - * @param true - Gsm, Lte phones - * false - Cdma phones - * - * Used by voice phone to set the mIsGsm - * flag - * @hide - */ - public void setGsm(boolean gsmFlag) { - mIsGsm = gsmFlag; - } - - /** - * @param useOnlyRsrpForLteLevel true if it uses only RSRP for the number of LTE signal bar, - * otherwise false. - * - * Used by phone to use only RSRP or not for the number of LTE signal bar. - * @hide - */ - public void setUseOnlyRsrpForLteLevel(boolean useOnlyRsrpForLteLevel) { - mUseOnlyRsrpForLteLevel = useOnlyRsrpForLteLevel; - } - - /** - * @param defaultMeasurement sets the type of WCDMA default signal measurement - * - * Used by phone to determine default measurement type for calculation WCDMA signal level. - * @hide - */ - public void setWcdmaDefaultSignalMeasurement(String defaultMeasurement) { - mWcdmaDefaultSignalMeasurement = defaultMeasurement; - } - - /** - * @param lteRsrpBoost - signal strength offset - * - * Used by phone to set the lte signal strength offset which will be - * reduced from rsrp threshold while calculating signal strength level - * - * @hide - */ - public void setLteRsrpBoost(int lteRsrpBoost) { - mLteRsrpBoost = lteRsrpBoost; - } - - /** - * Sets the threshold array for determining the display level of LTE signal bar. - * - * @param lteRsrpThresholds int array for determining the display level. + * Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69 * - * @hide - */ - 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); - } - - /** - * Get the GSM Signal Strength, valid values are (0-31, 99) as defined in TS - * 27.007 8.5 + * @return RSSI in ASU 0..31, 99, or UNAVAILABLE */ public int getGsmSignalStrength() { - return this.mGsmSignalStrength; + return mGsm.getAsuLevel(); } /** * Get the GSM bit error rate (0-7, 99) as defined in TS 27.007 8.5 */ public int getGsmBitErrorRate() { - return this.mGsmBitErrorRate; - } - - /** - * Sets the threshold array for determining the display level of WCDMA signal bar. - * - * @param wcdmaRscpThresholds int array for determining the display level. - * - * @hide - */ - 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); + return mGsm.getBitErrorRate(); } /** @@ -547,14 +290,14 @@ public class SignalStrength implements Parcelable { * @return the CDMA RSSI value or {@link #INVALID} if invalid */ public int getCdmaDbm() { - return this.mCdmaDbm; + return mCdma.getCdmaDbm(); } /** * Get the CDMA Ec/Io value in dB*10 */ public int getCdmaEcio() { - return this.mCdmaEcio; + return mCdma.getCdmaEcio(); } /** @@ -563,51 +306,51 @@ public class SignalStrength implements Parcelable { * @return the EVDO RSSI value or {@link #INVALID} if invalid */ public int getEvdoDbm() { - return this.mEvdoDbm; + return mCdma.getEvdoDbm(); } /** * Get the EVDO Ec/Io value in dB*10 */ public int getEvdoEcio() { - return this.mEvdoEcio; + return mCdma.getEvdoEcio(); } /** * Get the signal to noise ratio. Valid values are 0-8. 8 is the highest. */ public int getEvdoSnr() { - return this.mEvdoSnr; + return mCdma.getEvdoSnr(); } /** @hide */ @UnsupportedAppUsage public int getLteSignalStrength() { - return mLteSignalStrength; + return mLte.getRssi(); } /** @hide */ @UnsupportedAppUsage public int getLteRsrp() { - return mLteRsrp; + return mLte.getRsrp(); } /** @hide */ @UnsupportedAppUsage public int getLteRsrq() { - return mLteRsrq; + return mLte.getRsrq(); } /** @hide */ @UnsupportedAppUsage public int getLteRssnr() { - return mLteRssnr; + return mLte.getRssnr(); } /** @hide */ @UnsupportedAppUsage public int getLteCqi() { - return mLteCqi; + return mLte.getCqi(); } /** @hide */ @@ -624,9 +367,12 @@ public class SignalStrength implements Parcelable { * while 4 represents a very strong signal strength. */ public int getLevel() { - int level = mIsGsm ? getGsmRelatedSignalStrength() : getCdmaRelatedSignalStrength(); - if (DBG) log("getLevel=" + level); - return level; + int level = getPrimary().getLevel(); + if (level < SIGNAL_STRENGTH_NONE_OR_UNKNOWN || level > SIGNAL_STRENGTH_GREAT) { + log("Invalid Level " + level + ", this=" + this); + return SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + } + return getPrimary().getLevel(); } /** @@ -636,33 +382,7 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage 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) { - /* We don't know evdo use, cdma */ - asuLevel = cdmaAsuLevel; - } else if (cdmaAsuLevel == 0) { - /* We don't know cdma use, evdo */ - asuLevel = evdoAsuLevel; - } else { - /* We know both, use the lowest level */ - asuLevel = cdmaAsuLevel < evdoAsuLevel ? cdmaAsuLevel : evdoAsuLevel; - } - } - if (DBG) log("getAsuLevel=" + asuLevel); - return asuLevel; + return getPrimary().getAsuLevel(); } /** @@ -672,30 +392,7 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage 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; + return getPrimary().getDbm(); } /** @@ -705,17 +402,7 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage 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; + return mGsm.getDbm(); } /** @@ -725,20 +412,7 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage public int getGsmLevel() { - int level; - - // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5 - // asu = 0 (-113dB or less) is very weak - // signal, its better to show 0 bars to the user in such cases. - // asu = 99 is a special case, where the signal strength is unknown. - 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; + return mGsm.getLevel(); } /** @@ -748,13 +422,7 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage public int getGsmAsuLevel() { - // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5 - // asu = 0 (-113dB or less) is very weak - // signal, its better to show 0 bars to the user in such cases. - // asu = 99 is a special case, where the signal strength is unknown. - int level = getGsmSignalStrength(); - if (DBG) log("getGsmAsuLevel=" + level); - return level; + return mGsm.getAsuLevel(); } /** @@ -764,27 +432,7 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage 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; - - // Ec/Io are in dB*10 - 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; + return mCdma.getLevel(); } /** @@ -794,29 +442,7 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage 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; - - // Ec/Io are in dB*10 - 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; + return mCdma.getAsuLevel(); } /** @@ -826,26 +452,7 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage 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; + return mCdma.getEvdoLevel(); } /** @@ -855,28 +462,7 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage 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; + return mCdma.getEvdoAsuLevel(); } /** @@ -886,7 +472,7 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage public int getLteDbm() { - return mLteRsrp; + return mLte.getRsrp(); } /** @@ -896,83 +482,7 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage public int getLteLevel() { - /* - * TS 36.214 Physical Layer Section 5.1.3 - * TS 36.331 RRC - * - * RSSI = received signal + noise - * RSRP = reference signal dBm - * RSRQ = quality of signal dB = Number of Resource blocks*RSRP/RSSI - * SNR = gain = signal/noise ratio = -10log P1/P2 dB - */ - 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; - } - } - - /* - * Values are -200 dB to +300 (SNR*10dB) RS_SNR >= 13.0 dB =>4 bars 4.5 - * dB <= RS_SNR < 13.0 dB => 3 bars 1.0 dB <= RS_SNR < 4.5 dB => 2 bars - * -3.0 dB <= RS_SNR < 1.0 dB 1 bar RS_SNR < -3.0 dB/No Service Antenna - * Icon Only - */ - 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); - - /* Choose a measurement type to use for notification */ - if (snrIconLevel != -1 && rsrpIconLevel != -1) { - /* - * The number of bars displayed shall be the smaller of the bars - * associated with LTE RSRP and the bars associated with the LTE - * RS_SNR - */ - return (rsrpIconLevel < snrIconLevel ? rsrpIconLevel : snrIconLevel); - } - - if (snrIconLevel != -1) return snrIconLevel; - - if (rsrpIconLevel != -1) return rsrpIconLevel; - - /* Valid values are (0-31, 99) as defined in TS 27.007 8.5 */ - if (mLteSignalStrength > 31) 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; - + return mLte.getLevel(); } /** @@ -983,41 +493,14 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage public int getLteAsuLevel() { - int lteAsuLevel = 99; - int lteDbm = getLteDbm(); - /* - * 3GPP 27.007 (Ver 10.3.0) Sec 8.69 - * 0 -140 dBm or less - * 1 -139 dBm - * 2...96 -138... -44 dBm - * 97 -43 dBm or greater - * 255 not known or not detectable - */ - /* - * validateInput will always give a valid range between -140 t0 -44 as - * per ril.h. so RSRP >= -43 & <-140 will fall under asu level 255 - * and not 97 or 0 - */ - if (lteDbm == SignalStrength.INVALID) lteAsuLevel = 255; - else lteAsuLevel = lteDbm + 140; - if (DBG) log("Lte Asu level: "+lteAsuLevel); - return lteAsuLevel; + return mLte.getAsuLevel(); } /** * @return true if this is for GSM */ public boolean isGsm() { - return this.mIsGsm; - } - - /** - * @return true if it uses only RSRP for the number of LTE signal bar, otherwise false. - * - * @hide - */ - public boolean useOnlyRsrpForLteLevel() { - return this.mUseOnlyRsrpForLteLevel; + return !(getPrimary() instanceof CellSignalStrengthCdma); } /** @@ -1027,7 +510,7 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage public int getTdScdmaDbm() { - return this.mTdScdmaRscp; + return mTdscdma.getRscp(); } /** @@ -1040,19 +523,7 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage 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; + return mTdscdma.getLevel(); } /** @@ -1062,13 +533,7 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage 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; + return mTdscdma.getAsuLevel(); } /** @@ -1077,7 +542,7 @@ public class SignalStrength implements Parcelable { * @hide */ public int getWcdmaRscp() { - return mWcdmaRscp; + return mWcdma.getRscp(); } /** @@ -1094,14 +559,7 @@ public class SignalStrength implements Parcelable { * 96 -24 dBm or greater * 255 not known or not detectable */ - final int wcdmaDbm = getWcdmaDbm(); - int wcdmaAsuLevel = 255; - // validateInput will always give a valid range between -120 to -24 as per ril.h. so RSCP - // outside range is already set to INVALID - if (wcdmaDbm == SignalStrength.INVALID) wcdmaAsuLevel = 255; - else wcdmaAsuLevel = wcdmaDbm + 120; - if (DBG) log("Wcdma Asu level: " + wcdmaAsuLevel); - return wcdmaAsuLevel; + return mWcdma.getAsuLevel(); } /** @@ -1110,7 +568,7 @@ public class SignalStrength implements Parcelable { * @hide */ public int getWcdmaDbm() { - return mWcdmaRscp; + return mWcdma.getDbm(); } /** @@ -1119,55 +577,7 @@ public class SignalStrength implements Parcelable { * @hide */ 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: - // RSCP valid values are (-120 through -24) as defined in TS 27.007 8.69 - 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: - // RSSI valid values are (0..31) as defined in TS 27.007 8.5 - 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; + return mWcdma.getLevel(); } /** @@ -1175,18 +585,7 @@ public class SignalStrength implements Parcelable { */ @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))); + return Objects.hash(mCdma, mGsm, mWcdma, mTdscdma, mLte, mLteRsrpBoost); } /** @@ -1194,40 +593,16 @@ public class SignalStrength implements Parcelable { */ @Override public boolean equals (Object o) { - SignalStrength s; + if (!(o instanceof SignalStrength)) return false; - try { - s = (SignalStrength) o; - } catch (ClassCastException ex) { - return false; - } - - if (o == null) { - return false; - } + SignalStrength s = (SignalStrength) o; - 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)); + return mCdma.equals(s.mCdma) + && mGsm.equals(s.mGsm) + && mWcdma.equals(s.mWcdma) + && mTdscdma.equals(s.mTdscdma) + && mLte.equals(s.mLte) + && mLteRsrpBoost == s.mLteRsrpBoost; } /** @@ -1235,63 +610,16 @@ public class SignalStrength implements Parcelable { */ @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))); - } - - /** Returns the signal strength related to GSM. */ - 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; - } - - /** Returns the signal strength related to CDMA. */ - private int getCdmaRelatedSignalStrength() { - int level; - int cdmaLevel = getCdmaLevel(); - int evdoLevel = getEvdoLevel(); - if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { - /* We don't know evdo, use cdma */ - level = cdmaLevel; - } else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { - /* We don't know cdma, use evdo */ - level = evdoLevel; - } else { - /* We know both, use the lowest level */ - level = cdmaLevel < evdoLevel ? cdmaLevel : evdoLevel; - } - return level; + return new StringBuilder().append("SignalStrength:{") + .append("mCdma=").append(mCdma) + .append(",mGsm=").append(mGsm) + .append(",mWcdma=").append(mWcdma) + .append(",mTdscdma=").append(mTdscdma) + .append(",mLte=").append(mLte) + .append(",mLteRsrpBoost=").append(mLteRsrpBoost) + .append(",primary=").append(getPrimary().getClass().getSimpleName()) + .append("}") + .toString(); } /** @@ -1302,34 +630,13 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage 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"); + mCdma = m.getParcelable("Cdma"); + mGsm = m.getParcelable("Gsm"); + mWcdma = m.getParcelable("Wcdma"); + mTdscdma = m.getParcelable("Tdscdma"); + mLte = m.getParcelable("Lte"); + 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); - } } /** @@ -1340,56 +647,13 @@ public class SignalStrength implements Parcelable { */ @UnsupportedAppUsage 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); - } + m.putParcelable("Cdma", mCdma); + m.putParcelable("Gsm", mGsm); + m.putParcelable("Wcdma", mWcdma); + m.putParcelable("Tdscdma", mTdscdma); + m.putParcelable("Lte", mLte); - /** - * Gets the default threshold array for determining the display level of LTE signal bar. - * - * @return int array for determining the display level. - */ - private int[] getDefaultLteRsrpThresholds() { - return CarrierConfigManager.getDefaultConfig().getIntArray( - CarrierConfigManager.KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY); - } - - /** - * Gets the default threshold array for determining the display level of WCDMA signal bar. - * - * @return int array for determining the display level. - */ - private int[] getDefaultWcdmaRscpThresholds() { - return CarrierConfigManager.getDefaultConfig().getIntArray( - CarrierConfigManager.KEY_WCDMA_RSCP_THRESHOLDS_INT_ARRAY); + m.putInt("LteRsrpBoost", mLteRsrpBoost); } /** |