From 23dd176915fc118563e510647f048589c12e78e5 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Wed, 10 Sep 2014 22:58:54 +0900 Subject: Make status bar indicators reflect the network actually in use. Currently, when we are connected to a wifi network without Internet connectivity (e.g., a captive portal, or an access point that's not connected to the Internet), we display the wifi icon and hide the mobile network type icon. This is incorrect, because all traffic is in fact going over mobile data. This could cause nasty surprises if mobile data is metered. Instead, make the icons reflect the true state of affairs: - A wifi icon means device traffic goes through wifi. - A wifi icon with ! means wifi is connected but has no Internet and traffic is not going through wifi. - Mobile bars with a network type (e.g., "LTE" means device traffic goes through mobile data. - Mobile bars without a network type mean that mobile data is connected but device traffic is not going through mobile data. - Mobile bars with ! mean that cell is not connected. Bug: 17237507 Change-Id: I923edbeab3013f10314633c01922c8684591b15c --- .../systemui/statusbar/SignalClusterView.java | 2 +- .../statusbar/policy/NetworkControllerImpl.java | 116 +++++++++++++-------- 2 files changed, 73 insertions(+), 45 deletions(-) (limited to 'packages') diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java index 18ef024..b71c9bf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java @@ -257,7 +257,7 @@ public class SignalClusterView (mMobileVisible ? "VISIBLE" : "GONE"), mMobileStrengthId, mMobileTypeId)); - mMobileType.setVisibility(!mWifiVisible || mRoaming ? View.VISIBLE : View.GONE); + mMobileType.setVisibility((mRoaming || mMobileTypeId != 0) ? View.VISIBLE : View.GONE); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index 4d248c2..79d769a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -128,6 +128,8 @@ public class NetworkControllerImpl extends BroadcastReceiver private boolean mConnected = false; private int mConnectedNetworkType = ConnectivityManager.TYPE_NONE; private String mConnectedNetworkTypeName; + private int mLastConnectedNetworkType = ConnectivityManager.TYPE_NONE; + private int mInetCondition = 0; private int mLastInetCondition = 0; private static final int INET_CONDITION_THRESHOLD = 50; @@ -221,7 +223,7 @@ public class NetworkControllerImpl extends BroadcastReceiver filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); filter.addAction(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION); - filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); + filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE); filter.addAction(ConnectivityManager.INET_CONDITION_ACTION); filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); @@ -462,7 +464,7 @@ public class NetworkControllerImpl extends BroadcastReceiver intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_PLMN, false), intent.getStringExtra(TelephonyIntents.EXTRA_PLMN)); refreshViews(); - } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION) || + } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE) || action.equals(ConnectivityManager.INET_CONDITION_ACTION)) { updateConnectivity(intent); refreshViews(); @@ -669,21 +671,28 @@ public class NetworkControllerImpl extends BroadcastReceiver } } + private int inetConditionForNetwork(int networkType) { + return (mInetCondition == 1 && mConnectedNetworkType == networkType) ? 1 : 0; + } + private final void updateDataNetType() { + int inetCondition; + mDataTypeIconId = mQSDataTypeIconId = 0; if (mIsWimaxEnabled && mWimaxConnected) { // wimax is a special 4g network not handled by telephony - mDataIconList = TelephonyIcons.DATA_4G[mInetCondition]; + inetCondition = inetConditionForNetwork(ConnectivityManager.TYPE_WIMAX); + mDataIconList = TelephonyIcons.DATA_4G[inetCondition]; mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_4g; - mQSDataTypeIconId = TelephonyIcons.QS_DATA_4G[mInetCondition]; + mQSDataTypeIconId = TelephonyIcons.QS_DATA_4G[inetCondition]; mContentDescriptionDataType = mContext.getString( R.string.accessibility_data_connection_4g); } else { + inetCondition = inetConditionForNetwork(ConnectivityManager.TYPE_MOBILE); + final boolean showDataTypeIcon = (inetCondition > 0); switch (mDataNetType) { case TelephonyManager.NETWORK_TYPE_UNKNOWN: if (!mShowAtLeastThreeGees) { - mDataIconList = TelephonyIcons.DATA_G[mInetCondition]; - mDataTypeIconId = 0; - mQSDataTypeIconId = 0; + mDataIconList = TelephonyIcons.DATA_G[inetCondition]; mContentDescriptionDataType = ""; break; } else { @@ -691,9 +700,10 @@ public class NetworkControllerImpl extends BroadcastReceiver } case TelephonyManager.NETWORK_TYPE_EDGE: if (!mShowAtLeastThreeGees) { - mDataIconList = TelephonyIcons.DATA_E[mInetCondition]; - mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_e; - mQSDataTypeIconId = TelephonyIcons.QS_DATA_E[mInetCondition]; + mDataIconList = TelephonyIcons.DATA_E[inetCondition]; + mDataTypeIconId = showDataTypeIcon ? + R.drawable.stat_sys_data_fully_connected_e : 0; + mQSDataTypeIconId = TelephonyIcons.QS_DATA_E[inetCondition]; mContentDescriptionDataType = mContext.getString( R.string.accessibility_data_connection_edge); break; @@ -701,9 +711,10 @@ public class NetworkControllerImpl extends BroadcastReceiver // fall through } case TelephonyManager.NETWORK_TYPE_UMTS: - mDataIconList = TelephonyIcons.DATA_3G[mInetCondition]; - mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_3g; - mQSDataTypeIconId = TelephonyIcons.QS_DATA_3G[mInetCondition]; + mDataIconList = TelephonyIcons.DATA_3G[inetCondition]; + mDataTypeIconId = showDataTypeIcon ? + R.drawable.stat_sys_data_fully_connected_3g : 0; + mQSDataTypeIconId = TelephonyIcons.QS_DATA_3G[inetCondition]; mContentDescriptionDataType = mContext.getString( R.string.accessibility_data_connection_3g); break; @@ -712,15 +723,17 @@ public class NetworkControllerImpl extends BroadcastReceiver case TelephonyManager.NETWORK_TYPE_HSPA: case TelephonyManager.NETWORK_TYPE_HSPAP: if (mHspaDataDistinguishable) { - mDataIconList = TelephonyIcons.DATA_H[mInetCondition]; - mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_h; - mQSDataTypeIconId = TelephonyIcons.QS_DATA_H[mInetCondition]; + mDataIconList = TelephonyIcons.DATA_H[inetCondition]; + mDataTypeIconId = showDataTypeIcon ? + R.drawable.stat_sys_data_fully_connected_h : 0; + mQSDataTypeIconId = TelephonyIcons.QS_DATA_H[inetCondition]; mContentDescriptionDataType = mContext.getString( R.string.accessibility_data_connection_3_5g); } else { - mDataIconList = TelephonyIcons.DATA_3G[mInetCondition]; - mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_3g; - mQSDataTypeIconId = TelephonyIcons.QS_DATA_3G[mInetCondition]; + mDataIconList = TelephonyIcons.DATA_3G[inetCondition]; + mDataTypeIconId = showDataTypeIcon ? + R.drawable.stat_sys_data_fully_connected_3g : 0; + mQSDataTypeIconId = TelephonyIcons.QS_DATA_3G[inetCondition]; mContentDescriptionDataType = mContext.getString( R.string.accessibility_data_connection_3g); } @@ -728,9 +741,10 @@ public class NetworkControllerImpl extends BroadcastReceiver case TelephonyManager.NETWORK_TYPE_CDMA: if (!mShowAtLeastThreeGees) { // display 1xRTT for IS95A/B - mDataIconList = TelephonyIcons.DATA_1X[mInetCondition]; - mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_1x; - mQSDataTypeIconId = TelephonyIcons.QS_DATA_1X[mInetCondition]; + mDataIconList = TelephonyIcons.DATA_1X[inetCondition]; + mDataTypeIconId = showDataTypeIcon ? + R.drawable.stat_sys_data_fully_connected_1x : 0; + mQSDataTypeIconId = TelephonyIcons.QS_DATA_1X[inetCondition]; mContentDescriptionDataType = mContext.getString( R.string.accessibility_data_connection_cdma); break; @@ -739,9 +753,10 @@ public class NetworkControllerImpl extends BroadcastReceiver } case TelephonyManager.NETWORK_TYPE_1xRTT: if (!mShowAtLeastThreeGees) { - mDataIconList = TelephonyIcons.DATA_1X[mInetCondition]; - mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_1x; - mQSDataTypeIconId = TelephonyIcons.QS_DATA_1X[mInetCondition]; + mDataIconList = TelephonyIcons.DATA_1X[inetCondition]; + mDataTypeIconId = showDataTypeIcon ? + R.drawable.stat_sys_data_fully_connected_1x : 0; + mQSDataTypeIconId = TelephonyIcons.QS_DATA_1X[inetCondition]; mContentDescriptionDataType = mContext.getString( R.string.accessibility_data_connection_cdma); break; @@ -752,39 +767,43 @@ public class NetworkControllerImpl extends BroadcastReceiver case TelephonyManager.NETWORK_TYPE_EVDO_A: case TelephonyManager.NETWORK_TYPE_EVDO_B: case TelephonyManager.NETWORK_TYPE_EHRPD: - mDataIconList = TelephonyIcons.DATA_3G[mInetCondition]; - mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_3g; - mQSDataTypeIconId = TelephonyIcons.QS_DATA_3G[mInetCondition]; + mDataIconList = TelephonyIcons.DATA_3G[inetCondition]; + mDataTypeIconId = showDataTypeIcon ? + R.drawable.stat_sys_data_fully_connected_3g : 0; + mQSDataTypeIconId = TelephonyIcons.QS_DATA_3G[inetCondition]; mContentDescriptionDataType = mContext.getString( R.string.accessibility_data_connection_3g); break; case TelephonyManager.NETWORK_TYPE_LTE: boolean show4GforLTE = mContext.getResources().getBoolean(R.bool.config_show4GForLTE); if (show4GforLTE) { - mDataIconList = TelephonyIcons.DATA_4G[mInetCondition]; - mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_4g; - mQSDataTypeIconId = TelephonyIcons.QS_DATA_4G[mInetCondition]; + mDataIconList = TelephonyIcons.DATA_4G[inetCondition]; + mDataTypeIconId = showDataTypeIcon ? + R.drawable.stat_sys_data_fully_connected_4g : 0; + mQSDataTypeIconId = TelephonyIcons.QS_DATA_4G[inetCondition]; mContentDescriptionDataType = mContext.getString( R.string.accessibility_data_connection_4g); } else { - mDataIconList = TelephonyIcons.DATA_LTE[mInetCondition]; - mDataTypeIconId = TelephonyIcons.ICON_LTE; - mQSDataTypeIconId = TelephonyIcons.QS_DATA_LTE[mInetCondition]; + mDataIconList = TelephonyIcons.DATA_LTE[inetCondition]; + mDataTypeIconId = showDataTypeIcon ? TelephonyIcons.ICON_LTE : 0; + mQSDataTypeIconId = TelephonyIcons.QS_DATA_LTE[inetCondition]; mContentDescriptionDataType = mContext.getString( R.string.accessibility_data_connection_lte); } break; default: if (!mShowAtLeastThreeGees) { - mDataIconList = TelephonyIcons.DATA_G[mInetCondition]; - mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_g; - mQSDataTypeIconId = TelephonyIcons.QS_DATA_G[mInetCondition]; + mDataIconList = TelephonyIcons.DATA_G[inetCondition]; + mDataTypeIconId = showDataTypeIcon ? + R.drawable.stat_sys_data_fully_connected_g : 0; + mQSDataTypeIconId = TelephonyIcons.QS_DATA_G[inetCondition]; mContentDescriptionDataType = mContext.getString( R.string.accessibility_data_connection_gprs); } else { - mDataIconList = TelephonyIcons.DATA_3G[mInetCondition]; - mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_3g; - mQSDataTypeIconId = TelephonyIcons.QS_DATA_3G[mInetCondition]; + mDataIconList = TelephonyIcons.DATA_3G[inetCondition]; + mDataTypeIconId = showDataTypeIcon ? + R.drawable.stat_sys_data_fully_connected_3g : 0; + mQSDataTypeIconId = TelephonyIcons.QS_DATA_3G[inetCondition]; mContentDescriptionDataType = mContext.getString( R.string.accessibility_data_connection_3g); } @@ -967,9 +986,10 @@ public class NetworkControllerImpl extends BroadcastReceiver } private void updateWifiIcons() { + int inetCondition = inetConditionForNetwork(ConnectivityManager.TYPE_WIFI); if (mWifiConnected) { - mWifiIconId = WifiIcons.WIFI_SIGNAL_STRENGTH[mInetCondition][mWifiLevel]; - mQSWifiIconId = WifiIcons.QS_WIFI_SIGNAL_STRENGTH[mInetCondition][mWifiLevel]; + mWifiIconId = WifiIcons.WIFI_SIGNAL_STRENGTH[inetCondition][mWifiLevel]; + mQSWifiIconId = WifiIcons.QS_WIFI_SIGNAL_STRENGTH[inetCondition][mWifiLevel]; mContentDescriptionWifi = mContext.getString( AccessibilityContentDescriptions.WIFI_CONNECTION_STRENGTH[mWifiLevel]); } else { @@ -1028,10 +1048,11 @@ public class NetworkControllerImpl extends BroadcastReceiver private void updateWimaxIcons() { if (mIsWimaxEnabled) { if (mWimaxConnected) { + int inetCondition = inetConditionForNetwork(ConnectivityManager.TYPE_WIMAX); if (mWimaxIdle) mWimaxIconId = WimaxIcons.WIMAX_IDLE; else - mWimaxIconId = WimaxIcons.WIMAX_SIGNAL_STRENGTH[mInetCondition][mWimaxSignal]; + mWimaxIconId = WimaxIcons.WIMAX_SIGNAL_STRENGTH[inetCondition][mWimaxSignal]; mContentDescriptionWimax = mContext.getString( AccessibilityContentDescriptions.WIMAX_CONNECTION_STRENGTH[mWimaxSignal]); } else { @@ -1208,6 +1229,8 @@ public class NetworkControllerImpl extends BroadcastReceiver mContentDescriptionCombinedSignal = mHasMobileDataFeature ? mContentDescriptionDataType : mContentDescriptionWifi; + int inetCondition = inetConditionForNetwork(ConnectivityManager.TYPE_MOBILE); + mDataTypeIconId = 0; mQSDataTypeIconId = 0; if (isCdma()) { @@ -1266,7 +1289,8 @@ public class NetworkControllerImpl extends BroadcastReceiver || mLastWimaxIconId != mWimaxIconId || mLastDataTypeIconId != mDataTypeIconId || mLastAirplaneMode != mAirplaneMode - || mLastLocale != mLocale) + || mLastLocale != mLocale + || mLastConnectedNetworkType != mConnectedNetworkType) { // NB: the mLast*s will be updated later for (SignalCluster cluster : mSignalClusters) { @@ -1301,6 +1325,10 @@ public class NetworkControllerImpl extends BroadcastReceiver mLastInetCondition = mInetCondition; } + if (mLastConnectedNetworkType != mConnectedNetworkType) { + mLastConnectedNetworkType = mConnectedNetworkType; + } + // the wimax icon on phones if (mLastWimaxIconId != mWimaxIconId) { mLastWimaxIconId = mWimaxIconId; -- cgit v1.1