1e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville/* 2e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * Copyright (C) 2012 The Android Open Source Project 3e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * 4e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * you may not use this file except in compliance with the License. 6e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * You may obtain a copy of the License at 7e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * 8e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 9e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * 10e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * Unless required by applicable law or agreed to in writing, software 11e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * See the License for the specific language governing permissions and 14e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * limitations under the License. 15e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville */ 16e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 17e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Savillepackage android.telephony; 18e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 19e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Savilleimport android.os.Parcel; 20e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Savilleimport android.os.Parcelable; 21e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Savilleimport android.telephony.Rlog; 22e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 23017e7f90eea67b0ecd002d1ab193f60238ad0555Nathan Haroldimport java.util.Objects; 24017e7f90eea67b0ecd002d1ab193f60238ad0555Nathan Harold 25e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville/** 26e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * Wcdma signal strength related information. 27e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville */ 28e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Savillepublic final class CellSignalStrengthWcdma extends CellSignalStrength implements Parcelable { 29e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 30e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville private static final String LOG_TAG = "CellSignalStrengthWcdma"; 31e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville private static final boolean DBG = false; 32e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 33e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville private static final int WCDMA_SIGNAL_STRENGTH_GREAT = 12; 34e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville private static final int WCDMA_SIGNAL_STRENGTH_GOOD = 8; 35e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville private static final int WCDMA_SIGNAL_STRENGTH_MODERATE = 5; 36e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 379d729c5304508b355345e5490d69f9509bb1cb4dNathan Harold private int mSignalStrength; // in ASU; Valid values are (0-31, 99) as defined in TS 27.007 8.5 389d729c5304508b355345e5490d69f9509bb1cb4dNathan Harold private int mBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5 39e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 409d729c5304508b355345e5490d69f9509bb1cb4dNathan Harold /** @hide */ 41e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville public CellSignalStrengthWcdma() { 42e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville setDefaultValues(); 43e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 44e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 459d729c5304508b355345e5490d69f9509bb1cb4dNathan Harold /** @hide */ 46e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville public CellSignalStrengthWcdma(int ss, int ber) { 479d729c5304508b355345e5490d69f9509bb1cb4dNathan Harold mSignalStrength = ss; 489d729c5304508b355345e5490d69f9509bb1cb4dNathan Harold mBitErrorRate = ber; 49e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 50e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 519d729c5304508b355345e5490d69f9509bb1cb4dNathan Harold /** @hide */ 52e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville public CellSignalStrengthWcdma(CellSignalStrengthWcdma s) { 53e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville copyFrom(s); 54e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 55e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 569d729c5304508b355345e5490d69f9509bb1cb4dNathan Harold /** @hide */ 57e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville protected void copyFrom(CellSignalStrengthWcdma s) { 58e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville mSignalStrength = s.mSignalStrength; 59e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville mBitErrorRate = s.mBitErrorRate; 60e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 61e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 629d729c5304508b355345e5490d69f9509bb1cb4dNathan Harold /** @hide */ 63e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville @Override 64e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville public CellSignalStrengthWcdma copy() { 65e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville return new CellSignalStrengthWcdma(this); 66e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 67e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 68e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville /** @hide */ 69e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville @Override 70e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville public void setDefaultValues() { 71e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville mSignalStrength = Integer.MAX_VALUE; 72e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville mBitErrorRate = Integer.MAX_VALUE; 73e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 74e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 75e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville /** 76e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * Get signal level as an int from 0..4 77e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville */ 78e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville @Override 79e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville public int getLevel() { 80e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville int level; 81e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 82e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5 83e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville // asu = 0 (-113dB or less) is very weak 84e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville // signal, its better to show 0 bars to the user in such cases. 85e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville // asu = 99 is a special case, where the signal strength is unknown. 86e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville int asu = mSignalStrength; 87e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 88e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville else if (asu >= WCDMA_SIGNAL_STRENGTH_GREAT) level = SIGNAL_STRENGTH_GREAT; 89e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville else if (asu >= WCDMA_SIGNAL_STRENGTH_GOOD) level = SIGNAL_STRENGTH_GOOD; 90e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville else if (asu >= WCDMA_SIGNAL_STRENGTH_MODERATE) level = SIGNAL_STRENGTH_MODERATE; 91e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville else level = SIGNAL_STRENGTH_POOR; 92e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville if (DBG) log("getLevel=" + level); 93e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville return level; 94e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 95e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 96e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville /** 97e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * Get the signal strength as dBm 98e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville */ 99e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville @Override 100e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville public int getDbm() { 101e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville int dBm; 102e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 103e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville int level = mSignalStrength; 104e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville int asu = (level == 99 ? Integer.MAX_VALUE : level); 105e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville if (asu != Integer.MAX_VALUE) { 106e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville dBm = -113 + (2 * asu); 107e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } else { 108e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville dBm = Integer.MAX_VALUE; 109e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 110e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville if (DBG) log("getDbm=" + dBm); 111e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville return dBm; 112e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 113e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 114e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville /** 115e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * Get the signal level as an asu value between 0..31, 99 is unknown 116e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69 117e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville */ 118e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville @Override 119e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville public int getAsuLevel() { 120e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5 121e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville // asu = 0 (-113dB or less) is very weak 122e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville // signal, its better to show 0 bars to the user in such cases. 123e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville // asu = 99 is a special case, where the signal strength is unknown. 124e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville int level = mSignalStrength; 125e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville if (DBG) log("getAsuLevel=" + level); 126e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville return level; 127e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 128e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 129e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville @Override 130e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville public int hashCode() { 131017e7f90eea67b0ecd002d1ab193f60238ad0555Nathan Harold return Objects.hash(mSignalStrength, mBitErrorRate); 132e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 133e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 134e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville @Override 135e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville public boolean equals (Object o) { 136e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville CellSignalStrengthWcdma s; 137e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 138e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville try { 139e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville s = (CellSignalStrengthWcdma) o; 140e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } catch (ClassCastException ex) { 141e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville return false; 142e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 143e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 144e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville if (o == null) { 145e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville return false; 146e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 147e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 148e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville return mSignalStrength == s.mSignalStrength && mBitErrorRate == s.mBitErrorRate; 149e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 150e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 151e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville /** 152e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * @return string representation. 153e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville */ 154e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville @Override 155e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville public String toString() { 156e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville return "CellSignalStrengthWcdma:" 157e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville + " ss=" + mSignalStrength 158e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville + " ber=" + mBitErrorRate; 159e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 160e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 161e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville /** Implement the Parcelable interface */ 162e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville @Override 163e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville public void writeToParcel(Parcel dest, int flags) { 164e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville if (DBG) log("writeToParcel(Parcel, int): " + toString()); 165e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville dest.writeInt(mSignalStrength); 166e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville dest.writeInt(mBitErrorRate); 167e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 168e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 169e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville /** 170e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * Construct a SignalStrength object from the given parcel 171e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * where the token is already been processed. 172e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville */ 173e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville private CellSignalStrengthWcdma(Parcel in) { 174e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville mSignalStrength = in.readInt(); 175e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville mBitErrorRate = in.readInt(); 176e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville if (DBG) log("CellSignalStrengthWcdma(Parcel): " + toString()); 177e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 178e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 179e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville /** Implement the Parcelable interface */ 180e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville @Override 181e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville public int describeContents() { 182e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville return 0; 183e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 184e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 185e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville /** Implement the Parcelable interface */ 186e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville @SuppressWarnings("hiding") 187e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville public static final Parcelable.Creator<CellSignalStrengthWcdma> CREATOR = 188e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville new Parcelable.Creator<CellSignalStrengthWcdma>() { 189e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville @Override 190e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville public CellSignalStrengthWcdma createFromParcel(Parcel in) { 191e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville return new CellSignalStrengthWcdma(in); 192e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 193e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 194e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville @Override 195e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville public CellSignalStrengthWcdma[] newArray(int size) { 196e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville return new CellSignalStrengthWcdma[size]; 197e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 198e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville }; 199e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville 200e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville /** 201e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville * log 202e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville */ 203e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville private static void log(String s) { 204e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville Rlog.w(LOG_TAG, s); 205e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville } 206e3a9cbc052db7f00a96cc7b9580097d67538f360Wink Saville} 207