1d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/*
2d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2015 The Android Open Source Project
3d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
4d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License");
5d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * you may not use this file except in compliance with the License.
6d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * You may obtain a copy of the License at
7d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
8d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *      http://www.apache.org/licenses/LICENSE-2.0
9d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
10d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Unless required by applicable law or agreed to in writing, software
11d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS,
12d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * See the License for the specific language governing permissions and
14d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * limitations under the License.
15d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */
16d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
17d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpackage com.android.messaging.util;
18d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.content.BroadcastReceiver;
20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.content.Context;
21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.content.Intent;
22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.content.IntentFilter;
23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.net.ConnectivityManager;
24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.telephony.PhoneStateListener;
25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.telephony.ServiceState;
26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.telephony.SignalStrength;
27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.telephony.TelephonyManager;
28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class ConnectivityUtil {
30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // Assume not connected until informed differently
31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private volatile int mCurrentServiceState = ServiceState.STATE_POWER_OFF;
32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final TelephonyManager mTelephonyManager;
34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final Context mContext;
35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final ConnectivityBroadcastReceiver mReceiver;
36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final ConnectivityManager mConnMgr;
37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private ConnectivityListener mListener;
39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final IntentFilter mIntentFilter;
40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public interface ConnectivityListener {
42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void onConnectivityStateChanged(final Context context, final Intent intent);
43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void onPhoneStateChanged(final Context context, int serviceState);
44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public ConnectivityUtil(final Context context) {
47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mContext = context;
48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mConnMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mReceiver = new ConnectivityBroadcastReceiver();
51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mIntentFilter = new IntentFilter();
52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mIntentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public int getCurrentServiceState() {
56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mCurrentServiceState;
57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void onServiceStateChanged(final ServiceState serviceState) {
62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mCurrentServiceState != serviceState.getState()) {
63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mCurrentServiceState = serviceState.getState();
64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                onPhoneStateChanged(mCurrentServiceState);
65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void onDataConnectionStateChanged(final int state) {
70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mCurrentServiceState = (state == TelephonyManager.DATA_DISCONNECTED) ?
71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    ServiceState.STATE_OUT_OF_SERVICE : ServiceState.STATE_IN_SERVICE;
72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    };
74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private void onPhoneStateChanged(final int serviceState) {
76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final ConnectivityListener listener = mListener;
77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (listener != null) {
78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            listener.onPhoneStateChanged(mContext, serviceState);
79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private void onConnectivityChanged(final Context context, final Intent intent) {
83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final ConnectivityListener listener = mListener;
84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (listener != null) {
85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            listener.onConnectivityStateChanged(context, intent);
86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void register(final ConnectivityListener listener) {
90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        Assert.isTrue(mListener == null || mListener == listener);
91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (mListener == null) {
92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mTelephonyManager != null) {
93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mCurrentServiceState = (PhoneUtils.getDefault().isAirplaneModeOn() ?
94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        ServiceState.STATE_POWER_OFF : ServiceState.STATE_IN_SERVICE);
95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mTelephonyManager.listen(mPhoneStateListener,
96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        PhoneStateListener.LISTEN_SERVICE_STATE);
97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mConnMgr != null) {
99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mContext.registerReceiver(mReceiver, mIntentFilter);
100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mListener = listener;
103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void unregister() {
106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (mListener != null) {
107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mTelephonyManager != null) {
108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mCurrentServiceState = ServiceState.STATE_POWER_OFF;
110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mConnMgr != null) {
112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mContext.unregisterReceiver(mReceiver);
113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mListener = null;
116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Connectivity change broadcast receiver. This gets the network connectivity updates.
120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * In case we don't get the active connectivity when we first acquire the network,
121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * this receiver will notify us when it is connected, so to unblock the waiting thread
122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * which is sending the message.
123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public class ConnectivityBroadcastReceiver extends BroadcastReceiver {
125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void onReceive(final Context context, final Intent intent) {
127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (!intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return;
129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            onConnectivityChanged(context, intent);
132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private int mSignalLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
136d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
137d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // We use a separate instance than mPhoneStateListener because the lifetimes are different.
138d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final PhoneStateListener mSignalStrengthListener = new PhoneStateListener() {
139d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
140d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void onSignalStrengthsChanged(final SignalStrength signalStrength) {
141d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mSignalLevel = getLevel(signalStrength);
142d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
143d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    };
144d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
145d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void registerForSignalStrength() {
146d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mTelephonyManager.listen(
147d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mSignalStrengthListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
148d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
149d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
150d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void unregisterForSignalStrength() {
151d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mTelephonyManager.listen(mSignalStrengthListener, PhoneStateListener.LISTEN_NONE);
152d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
153d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
154d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
155d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param subId This is ignored because TelephonyManager does not support it.
156d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return Signal strength as level 0..4
157d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
158d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public int getSignalLevel(final int subId) {
159d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mSignalLevel;
160d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
161d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
162d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int SIGNAL_STRENGTH_NONE_OR_UNKNOWN = 0;
163d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int SIGNAL_STRENGTH_POOR = 1;
164d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int SIGNAL_STRENGTH_MODERATE = 2;
165d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int SIGNAL_STRENGTH_GOOD = 3;
166d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int SIGNAL_STRENGTH_GREAT = 4;
167d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
168d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int GSM_SIGNAL_STRENGTH_GREAT = 12;
169d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int GSM_SIGNAL_STRENGTH_GOOD = 8;
170d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final int GSM_SIGNAL_STRENGTH_MODERATE = 8;
171d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
172d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static int getLevel(final SignalStrength signalStrength) {
173d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (signalStrength.isGsm()) {
174d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            // From frameworks/base/telephony/java/android/telephony/CellSignalStrengthGsm.java
175d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
176d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
177d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            // asu = 0 (-113dB or less) is very weak
178d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            // signal, its better to show 0 bars to the user in such cases.
179d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            // asu = 99 is a special case, where the signal strength is unknown.
180d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final int asu = signalStrength.getGsmSignalStrength();
181d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (asu <= 2 || asu == 99) return SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
182d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            else if (asu >= GSM_SIGNAL_STRENGTH_GREAT) return SIGNAL_STRENGTH_GREAT;
183d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            else if (asu >= GSM_SIGNAL_STRENGTH_GOOD) return SIGNAL_STRENGTH_GOOD;
184d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            else if (asu >= GSM_SIGNAL_STRENGTH_MODERATE) return SIGNAL_STRENGTH_MODERATE;
185d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            else return SIGNAL_STRENGTH_POOR;
186d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        } else {
187d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            // From frameworks/base/telephony/java/android/telephony/CellSignalStrengthCdma.java
188d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
189d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final int cdmaLevel = getCdmaLevel(signalStrength);
190d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final int evdoLevel = getEvdoLevel(signalStrength);
191d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
192d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                /* We don't know evdo, use cdma */
193d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return getCdmaLevel(signalStrength);
194d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            } else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
195d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                /* We don't know cdma, use evdo */
196d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return getEvdoLevel(signalStrength);
197d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            } else {
198d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                /* We know both, use the lowest level */
199d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return cdmaLevel < evdoLevel ? cdmaLevel : evdoLevel;
200d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
201d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
202d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
203d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
204d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
205d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Get cdma as level 0..4
206d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
207d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static int getCdmaLevel(final SignalStrength signalStrength) {
208d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final int cdmaDbm = signalStrength.getCdmaDbm();
209d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final int cdmaEcio = signalStrength.getCdmaEcio();
210d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        int levelDbm;
211d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        int levelEcio;
212d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (cdmaDbm >= -75) levelDbm = SIGNAL_STRENGTH_GREAT;
213d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        else if (cdmaDbm >= -85) levelDbm = SIGNAL_STRENGTH_GOOD;
214d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        else if (cdmaDbm >= -95) levelDbm = SIGNAL_STRENGTH_MODERATE;
215d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        else if (cdmaDbm >= -100) levelDbm = SIGNAL_STRENGTH_POOR;
216d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        else levelDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
217d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // Ec/Io are in dB*10
218d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (cdmaEcio >= -90) levelEcio = SIGNAL_STRENGTH_GREAT;
219d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        else if (cdmaEcio >= -110) levelEcio = SIGNAL_STRENGTH_GOOD;
220d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        else if (cdmaEcio >= -130) levelEcio = SIGNAL_STRENGTH_MODERATE;
221d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        else if (cdmaEcio >= -150) levelEcio = SIGNAL_STRENGTH_POOR;
222d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        else levelEcio = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
223d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final int level = (levelDbm < levelEcio) ? levelDbm : levelEcio;
224d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return level;
225d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
226d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
227d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Get Evdo as level 0..4
228d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
229d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static int getEvdoLevel(final SignalStrength signalStrength) {
230d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final int evdoDbm = signalStrength.getEvdoDbm();
231d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final int evdoSnr = signalStrength.getEvdoSnr();
232d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        int levelEvdoDbm;
233d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        int levelEvdoSnr;
234d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (evdoDbm >= -65) levelEvdoDbm = SIGNAL_STRENGTH_GREAT;
235d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        else if (evdoDbm >= -75) levelEvdoDbm = SIGNAL_STRENGTH_GOOD;
236d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        else if (evdoDbm >= -90) levelEvdoDbm = SIGNAL_STRENGTH_MODERATE;
237d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        else if (evdoDbm >= -105) levelEvdoDbm = SIGNAL_STRENGTH_POOR;
238d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        else levelEvdoDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
239d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (evdoSnr >= 7) levelEvdoSnr = SIGNAL_STRENGTH_GREAT;
240d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        else if (evdoSnr >= 5) levelEvdoSnr = SIGNAL_STRENGTH_GOOD;
241d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        else if (evdoSnr >= 3) levelEvdoSnr = SIGNAL_STRENGTH_MODERATE;
242d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        else if (evdoSnr >= 1) levelEvdoSnr = SIGNAL_STRENGTH_POOR;
243d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        else levelEvdoSnr = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
244d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final int level = (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr;
245d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return level;
246d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
247d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd}
248