Merge "Refactor SignalStrength" am: 0f1bf44c99
am: 77a7e552e6
Change-Id: If6529167138e2d7521179a6b26389752dde6fe45
This commit is contained in:
@@ -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";
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user