blob: 8ed0065cdd7aeb9f64da019a0710dbfffb1897ba [file] [log] [blame]
/*
* 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.
*
* @hide
*/
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
*
*/
public static SignalStrength newFromBundle(Bundle m) {
SignalStrength ret;
ret = new SignalStrength();
ret.setFromNotifierBundle(m);
return ret;
}
/**
* Empty constructor
*
*/
public SignalStrength() {
mGsmSignalStrength = 99;
mGsmBitErrorRate = -1;
mCdmaDbm = -1;
mCdmaEcio = -1;
mEvdoDbm = -1;
mEvdoEcio = -1;
mEvdoSnr = -1;
isGsm = true;
}
/**
* Constructor
*
*/
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
*/
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.
*/
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);
}
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);
}
public int describeContents() {
return 0;
}
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;
}
/**
* @hide
*/
public boolean isGsm() {
return this.isGsm;
}
/**
* @hide
*/
@Override
public int hashCode() {
return ((mGsmSignalStrength * 0x1234)
+ mGsmBitErrorRate
+ mCdmaDbm + mCdmaEcio
+ mEvdoDbm + mEvdoEcio + mEvdoSnr
+ (isGsm ? 1 : 0));
}
/**
* @hide
*/
@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);
}
/**
* @hide
*/
@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));
}
}