From efbb8f337658f417a3af5f8e656eb5d23372596e Mon Sep 17 00:00:00 2001 From: Nathan Harold Date: Thu, 5 May 2016 11:12:27 -0700 Subject: [PATCH] CellInfo Parceling for Invalid Values Within CellInfo Fields, Integer.MAX_VALUE should indicate that a field is not present in a report. This change makes the invalid value consistent, and also ensures that it is checked in the calculation of power levels / asu. -Update parcel/unparcel functions to avoid -MAX_VALUE -Update LTE and CDMA asuLevel() and level() functions to be consistently aware of the possibility of incomplete information Bug: 27946114 Change-Id: Iacdc85db894e4a7809da8b5dc759488a1b6321ea --- .../telephony/CellSignalStrengthCdma.java | 41 ++++++++++++------- .../telephony/CellSignalStrengthLte.java | 16 +++++--- 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/telephony/java/android/telephony/CellSignalStrengthCdma.java b/telephony/java/android/telephony/CellSignalStrengthCdma.java index be13acc99dcc0..047436207ada9 100644 --- a/telephony/java/android/telephony/CellSignalStrengthCdma.java +++ b/telephony/java/android/telephony/CellSignalStrengthCdma.java @@ -145,7 +145,8 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements int cdmaAsuLevel; int ecioAsuLevel; - if (cdmaDbm >= -75) cdmaAsuLevel = 16; + if (cdmaDbm == Integer.MAX_VALUE) cdmaAsuLevel = 99; + else if (cdmaDbm >= -75) cdmaAsuLevel = 16; else if (cdmaDbm >= -82) cdmaAsuLevel = 8; else if (cdmaDbm >= -90) cdmaAsuLevel = 4; else if (cdmaDbm >= -95) cdmaAsuLevel = 2; @@ -153,7 +154,8 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements else cdmaAsuLevel = 99; // Ec/Io are in dB*10 - if (cdmaEcio >= -90) ecioAsuLevel = 16; + if (cdmaEcio == Integer.MAX_VALUE) ecioAsuLevel = 99; + else if (cdmaEcio >= -90) ecioAsuLevel = 16; else if (cdmaEcio >= -100) ecioAsuLevel = 8; else if (cdmaEcio >= -115) ecioAsuLevel = 4; else if (cdmaEcio >= -130) ecioAsuLevel = 2; @@ -174,14 +176,16 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements int levelDbm; int levelEcio; - if (cdmaDbm >= -75) levelDbm = SIGNAL_STRENGTH_GREAT; + if (cdmaDbm == Integer.MAX_VALUE) levelDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + else if (cdmaDbm >= -75) levelDbm = SIGNAL_STRENGTH_GREAT; else if (cdmaDbm >= -85) levelDbm = SIGNAL_STRENGTH_GOOD; else if (cdmaDbm >= -95) levelDbm = SIGNAL_STRENGTH_MODERATE; else if (cdmaDbm >= -100) levelDbm = SIGNAL_STRENGTH_POOR; else levelDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; // Ec/Io are in dB*10 - if (cdmaEcio >= -90) levelEcio = SIGNAL_STRENGTH_GREAT; + if (cdmaEcio == Integer.MAX_VALUE) levelEcio = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + else if (cdmaEcio >= -90) levelEcio = SIGNAL_STRENGTH_GREAT; else if (cdmaEcio >= -110) levelEcio = SIGNAL_STRENGTH_GOOD; else if (cdmaEcio >= -130) levelEcio = SIGNAL_STRENGTH_MODERATE; else if (cdmaEcio >= -150) levelEcio = SIGNAL_STRENGTH_POOR; @@ -201,13 +205,15 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements int levelEvdoDbm; int levelEvdoSnr; - if (evdoDbm >= -65) levelEvdoDbm = SIGNAL_STRENGTH_GREAT; + if (evdoDbm == Integer.MAX_VALUE) levelEvdoDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + else if (evdoDbm >= -65) levelEvdoDbm = SIGNAL_STRENGTH_GREAT; else if (evdoDbm >= -75) levelEvdoDbm = SIGNAL_STRENGTH_GOOD; else if (evdoDbm >= -90) levelEvdoDbm = SIGNAL_STRENGTH_MODERATE; else if (evdoDbm >= -105) levelEvdoDbm = SIGNAL_STRENGTH_POOR; else levelEvdoDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; - if (evdoSnr >= 7) levelEvdoSnr = SIGNAL_STRENGTH_GREAT; + if (evdoSnr == Integer.MAX_VALUE) levelEvdoSnr = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + else if (evdoSnr >= 7) levelEvdoSnr = SIGNAL_STRENGTH_GREAT; else if (evdoSnr >= 5) levelEvdoSnr = SIGNAL_STRENGTH_GOOD; else if (evdoSnr >= 3) levelEvdoSnr = SIGNAL_STRENGTH_MODERATE; else if (evdoSnr >= 1) levelEvdoSnr = SIGNAL_STRENGTH_POOR; @@ -332,10 +338,11 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements if (DBG) log("writeToParcel(Parcel, int): " + toString()); // Need to multiply CdmaDbm, CdmaEcio, EvdoDbm and EvdoEcio by -1 // to ensure consistency when reading values written here - dest.writeInt(mCdmaDbm * -1); - dest.writeInt(mCdmaEcio * -1); - dest.writeInt(mEvdoDbm * -1); - dest.writeInt(mEvdoEcio * -1); + // unless the value is invalid + dest.writeInt(mCdmaDbm * (mCdmaDbm != Integer.MAX_VALUE ? -1 : 1)); + dest.writeInt(mCdmaEcio * (mCdmaEcio != Integer.MAX_VALUE ? -1 : 1)); + dest.writeInt(mEvdoDbm * (mEvdoDbm != Integer.MAX_VALUE ? -1 : 1)); + dest.writeInt(mEvdoEcio * (mEvdoEcio != Integer.MAX_VALUE ? -1 : 1)); dest.writeInt(mEvdoSnr); } @@ -346,11 +353,15 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements private CellSignalStrengthCdma(Parcel in) { // CdmaDbm, CdmaEcio, EvdoDbm and EvdoEcio are written into // the parcel as positive values. - // Need to convert into negative values - mCdmaDbm = in.readInt() * -1; - mCdmaEcio = in.readInt() * -1; - mEvdoDbm = in.readInt() * -1; - mEvdoEcio = in.readInt() * -1; + // Need to convert into negative values unless the value is invalid + mCdmaDbm = in.readInt(); + if (mCdmaDbm != Integer.MAX_VALUE) mCdmaDbm *= -1; + mCdmaEcio = in.readInt(); + if (mCdmaEcio != Integer.MAX_VALUE) mCdmaEcio *= -1; + mEvdoDbm = in.readInt(); + if (mEvdoDbm != Integer.MAX_VALUE) mEvdoDbm *= -1; + mEvdoEcio = in.readInt(); + if (mEvdoEcio != Integer.MAX_VALUE) mEvdoEcio *= -1; mEvdoSnr = in.readInt(); if (DBG) log("CellSignalStrengthCdma(Parcel): " + toString()); } diff --git a/telephony/java/android/telephony/CellSignalStrengthLte.java b/telephony/java/android/telephony/CellSignalStrengthLte.java index 2606466146e35..3c0a8d6f8a38d 100644 --- a/telephony/java/android/telephony/CellSignalStrengthLte.java +++ b/telephony/java/android/telephony/CellSignalStrengthLte.java @@ -197,7 +197,8 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P public int getAsuLevel() { int lteAsuLevel = 99; int lteDbm = getDbm(); - if (lteDbm <= -140) lteAsuLevel = 0; + if (lteDbm == Integer.MAX_VALUE) lteAsuLevel = 99; + else if (lteDbm <= -140) lteAsuLevel = 0; else if (lteDbm >= -43) lteAsuLevel = 97; else lteAsuLevel = lteDbm + 140; if (DBG) log("Lte Asu level: "+lteAsuLevel); @@ -263,8 +264,9 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P dest.writeInt(mSignalStrength); // Need to multiply rsrp and rsrq by -1 // to ensure consistency when reading values written here - dest.writeInt(mRsrp * -1); - dest.writeInt(mRsrq * -1); + // unless the values are invalid + dest.writeInt(mRsrp * (mRsrp != Integer.MAX_VALUE ? -1 : 1)); + dest.writeInt(mRsrq * (mRsrq != Integer.MAX_VALUE ? -1 : 1)); dest.writeInt(mRssnr); dest.writeInt(mCqi); dest.writeInt(mTimingAdvance); @@ -277,9 +279,11 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P private CellSignalStrengthLte(Parcel in) { mSignalStrength = in.readInt(); // rsrp and rsrq are written into the parcel as positive values. - // Need to convert into negative values - mRsrp = in.readInt() * -1; - mRsrq = in.readInt() * -1; + // Need to convert into negative values unless the values are invalid + mRsrp = in.readInt(); + if (mRsrp != Integer.MAX_VALUE) mRsrp *= -1; + mRsrq = in.readInt(); + if (mRsrq != Integer.MAX_VALUE) mRsrq *= -1; mRssnr = in.readInt(); mCqi = in.readInt(); mTimingAdvance = in.readInt();