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