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