Merge "Refactor SignalStrength" am: 0f1bf44c99

am: 77a7e552e6

Change-Id: If6529167138e2d7521179a6b26389752dde6fe45
This commit is contained in:
Nathan Harold
2018-12-21 17:04:24 -08:00
committed by android-build-merger
9 changed files with 904 additions and 1209 deletions

View File

@@ -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";

View File

@@ -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;
}
}

View File

@@ -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() {
@@ -219,6 +257,63 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements
return level;
}
/**
* 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
*/
@@ -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());
}

View File

@@ -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;
return mLevel;
}
// 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;
/** @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);
}
private static final CellSignalStrengthGsm sInvalid = new CellSignalStrengthGsm();
/** @hide */
@Override
public boolean isValid() {
return !this.equals(sInvalid);
}
@Override
public boolean equals (Object o) {
CellSignalStrengthGsm s;
public boolean equals(Object o) {
if (!(o instanceof CellSignalStrengthGsm)) return false;
CellSignalStrengthGsm s = (CellSignalStrengthGsm) o;
try {
s = (CellSignalStrengthGsm) o;
} catch (ClassCastException ex) {
return false;
}
if (o == null) {
return false;
}
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());
}

View File

@@ -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;
return mLevel;
}
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;
// 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;
// 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;
/** @hide */
@Override
public void updateLevel(PersistableBundle cc, ServiceState ss) {
int[] thresholds;
boolean rsrpOnly;
if (cc == null) {
thresholds = sThresholds;
rsrpOnly = false;
} else {
level = (levelRssnr < levelRsrp) ? levelRssnr : levelRsrp;
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));
}
if (DBG) log("Lte rsrp level: " + levelRsrp
+ " snr level: " + levelRssnr + " level: " + level);
return level;
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 {
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;
}
}
/*
* 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 instanceof CellSignalStrengthLte)) return false;
s = (CellSignalStrengthLte) o;
if (o == null) {
return false;
}
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);

View File

@@ -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() {
@@ -205,16 +224,34 @@ public final class CellSignalStrengthNr extends CellSignalStrength implements Pa
return mCsiRsrp;
}
/** @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();
}

View File

@@ -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;
return mLevel;
}
// 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;
/** @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);
}
private static final CellSignalStrengthTdscdma sInvalid = new CellSignalStrengthTdscdma();
/** @hide */
@Override
public boolean isValid() {
return !this.equals(sInvalid);
}
@Override
public boolean equals(Object o) {
CellSignalStrengthTdscdma s;
if (!(o instanceof CellSignalStrengthTdscdma)) return false;
CellSignalStrengthTdscdma s = (CellSignalStrengthTdscdma) o;
try {
s = (CellSignalStrengthTdscdma) o;
} catch (ClassCastException ex) {
return false;
}
if (o == null) {
return false;
}
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());
}

View File

@@ -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;
return mLevel;
}
// 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;
/** @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);
}
private static final CellSignalStrengthWcdma sInvalid = new CellSignalStrengthWcdma();
/** @hide */
@Override
public boolean isValid() {
return !this.equals(sInvalid);
}
@Override
public boolean equals (Object o) {
CellSignalStrengthWcdma s;
public boolean equals(Object o) {
if (!(o instanceof CellSignalStrengthWcdma)) return false;
CellSignalStrengthWcdma s = (CellSignalStrengthWcdma) o;
try {
s = (CellSignalStrengthWcdma) o;
} catch (ClassCastException ex) {
return false;
}
if (o == null) {
return false;
}
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());
}

File diff suppressed because it is too large Load Diff