summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Nathan Harold <nharold@google.com> 2018-11-19 18:09:40 -0800
committer Nathan Harold <nharold@google.com> 2018-12-20 13:53:43 -0800
commitf23153f1667d1071b6933be0a036b1946d542852 (patch)
tree887f495093d12bbb6718bd493fe2d39e7123c908
parentbcf293c674307a90238671edcf5c82b17e3bca62 (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
-rw-r--r--telephony/java/android/telephony/CarrierConfigManager.java4
-rw-r--r--telephony/java/android/telephony/CellSignalStrength.java67
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthCdma.java168
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthGsm.java137
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthLte.java250
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthNr.java77
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthTdscdma.java161
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthWcdma.java221
-rw-r--r--telephony/java/android/telephony/SignalStrength.java1034
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);
}
/**