/* * Copyright (C) 2009 Qualcomm Innovation Center, Inc. All Rights Reserved. * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.telephony; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.util.Log; /** * Contains phone signal strength related information. */ public class SignalStrength implements Parcelable { static final String LOG_TAG = "PHONE"; private int mGsmSignalStrength; // Valid values are (0-31, 99) as defined in TS 27.007 8.5 private int mGsmBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5 private int mCdmaDbm; // This value is the RSSI value private int mCdmaEcio; // This value is the Ec/Io 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 boolean isGsm; // This value is set by the ServiceStateTracker onSignalStrengthResult /** * Create a new SignalStrength from a intent notifier Bundle * * This method is used by PhoneStateIntentReceiver and maybe by * external applications. * * @param m Bundle from intent notifier * @return newly created SignalStrength * * @hide */ public static SignalStrength newFromBundle(Bundle m) { SignalStrength ret; ret = new SignalStrength(); ret.setFromNotifierBundle(m); return ret; } /** * Empty constructor * * @hide */ public SignalStrength() { mGsmSignalStrength = 99; mGsmBitErrorRate = -1; mCdmaDbm = -1; mCdmaEcio = -1; mEvdoDbm = -1; mEvdoEcio = -1; mEvdoSnr = -1; isGsm = true; } /** * Constructor * * @hide */ public SignalStrength(int gsmSignalStrength, int gsmBitErrorRate, int cdmaDbm, int cdmaEcio, int evdoDbm, int evdoEcio, int evdoSnr, boolean gsm) { mGsmSignalStrength = gsmSignalStrength; mGsmBitErrorRate = gsmBitErrorRate; mCdmaDbm = cdmaDbm; mCdmaEcio = cdmaEcio; mEvdoDbm = evdoDbm; mEvdoEcio = evdoEcio; mEvdoSnr = evdoSnr; isGsm = gsm; } /** * Copy constructors * * @param s Source SignalStrength * * @hide */ public SignalStrength(SignalStrength s) { copyFrom(s); } /** * @hide */ protected void copyFrom(SignalStrength s) { mGsmSignalStrength = s.mGsmSignalStrength; mGsmBitErrorRate = s.mGsmBitErrorRate; mCdmaDbm = s.mCdmaDbm; mCdmaEcio = s.mCdmaEcio; mEvdoDbm = s.mEvdoDbm; mEvdoEcio = s.mEvdoEcio; mEvdoSnr = s.mEvdoSnr; isGsm = s.isGsm; } /** * Construct a SignalStrength object from the given parcel. * * @hide */ public SignalStrength(Parcel in) { mGsmSignalStrength = in.readInt(); mGsmBitErrorRate = in.readInt(); mCdmaDbm = in.readInt(); mCdmaEcio = in.readInt(); mEvdoDbm = in.readInt(); mEvdoEcio = in.readInt(); mEvdoSnr = in.readInt(); isGsm = (in.readInt() != 0); } /** * {@link Parcelable#writeToParcel} */ public void writeToParcel(Parcel out, int flags) { out.writeInt(mGsmSignalStrength); out.writeInt(mGsmBitErrorRate); out.writeInt(mCdmaDbm); out.writeInt(mCdmaEcio); out.writeInt(mEvdoDbm); out.writeInt(mEvdoEcio); out.writeInt(mEvdoSnr); out.writeInt(isGsm ? 1 : 0); } /** * {@link Parcelable#describeContents} */ public int describeContents() { return 0; } /** * {@link Parcelable.Creator} * * @hide */ public static final Parcelable.Creator<SignalStrength> CREATOR = new Parcelable.Creator() { public SignalStrength createFromParcel(Parcel in) { return new SignalStrength(in); } public SignalStrength[] newArray(int size) { return new SignalStrength[size]; } }; /** * Get the GSM Signal Strength, valid values are (0-31, 99) as defined in TS 27.007 8.5 */ public int getGsmSignalStrength() { return this.mGsmSignalStrength; } /** * Get the GSM bit error rate (0-7, 99) as defined in TS 27.007 8.5 */ public int getGsmBitErrorRate() { return this.mGsmBitErrorRate; } /** * Get the CDMA RSSI value in dBm */ public int getCdmaDbm() { return this.mCdmaDbm; } /** * Get the CDMA Ec/Io value in dB*10 */ public int getCdmaEcio() { return this.mCdmaEcio; } /** * Get the EVDO RSSI value in dBm */ public int getEvdoDbm() { return this.mEvdoDbm; } /** * Get the EVDO Ec/Io value in dB*10 */ public int getEvdoEcio() { return this.mEvdoEcio; } /** * Get the signal to noise ratio. Valid values are 0-8. 8 is the highest. */ public int getEvdoSnr() { return this.mEvdoSnr; } /** * @return true if this is for GSM */ public boolean isGsm() { return this.isGsm; } /** * @return hash code */ @Override public int hashCode() { return ((mGsmSignalStrength * 0x1234) + mGsmBitErrorRate + mCdmaDbm + mCdmaEcio + mEvdoDbm + mEvdoEcio + mEvdoSnr + (isGsm ? 1 : 0)); } /** * @return true if the signal strengths are the same */ @Override public boolean equals (Object o) { SignalStrength s; try { s = (SignalStrength) o; } catch (ClassCastException ex) { return false; } if (o == null) { return false; } return (mGsmSignalStrength == s.mGsmSignalStrength && mGsmBitErrorRate == s.mGsmBitErrorRate && mCdmaDbm == s.mCdmaDbm && mCdmaEcio == s.mCdmaEcio && mEvdoDbm == s.mEvdoDbm && mEvdoEcio == s.mEvdoEcio && mEvdoSnr == s.mEvdoSnr && isGsm == s.isGsm); } /** * @return string representation. */ @Override public String toString() { return ("SignalStrength:" + " " + mGsmSignalStrength + " " + mGsmBitErrorRate + " " + mCdmaDbm + " " + mCdmaEcio + " " + mEvdoDbm + " " + mEvdoEcio + " " + mEvdoSnr + " " + (isGsm ? "gsm" : "cdma")); } /** * Test whether two objects hold the same data values or both are null * * @param a first obj * @param b second obj * @return true if two objects equal or both are null * @hide */ private static boolean equalsHandlesNulls (Object a, Object b) { return (a == null) ? (b == null) : a.equals (b); } /** * Set SignalStrength based on intent notifier map * * @param m intent notifier map * @hide */ private void setFromNotifierBundle(Bundle m) { mGsmSignalStrength = m.getInt("GsmSignalStrength"); mGsmBitErrorRate = m.getInt("GsmBitErrorRate"); mCdmaDbm = m.getInt("CdmaDbm"); mCdmaEcio = m.getInt("CdmaEcio"); mEvdoDbm = m.getInt("EvdoDbm"); mEvdoEcio = m.getInt("EvdoEcio"); mEvdoSnr = m.getInt("EvdoSnr"); isGsm = m.getBoolean("isGsm"); } /** * Set intent notifier Bundle based on SignalStrength * * @param m intent notifier Bundle * @hide */ public void fillInNotifierBundle(Bundle m) { m.putInt("GsmSignalStrength", mGsmSignalStrength); m.putInt("GsmBitErrorRate", mGsmBitErrorRate); m.putInt("CdmaDbm", mCdmaDbm); m.putInt("CdmaEcio", mCdmaEcio); m.putInt("EvdoDbm", mEvdoDbm); m.putInt("EvdoEcio", mEvdoEcio); m.putInt("EvdoSnr", mEvdoSnr); m.putBoolean("isGsm", Boolean.valueOf(isGsm)); } }