diff --git a/packages/SystemUI/res/layout/qs_carrier.xml b/packages/SystemUI/res/layout/qs_carrier.xml index 6edccbabb8236..b94a3163804f4 100644 --- a/packages/SystemUI/res/layout/qs_carrier.xml +++ b/packages/SystemUI/res/layout/qs_carrier.xml @@ -24,7 +24,8 @@ android:background="@android:color/transparent" android:clickable="false" android:clipChildren="false" - android:clipToPadding="false" > + android:clipToPadding="false" + android:focusable="true" > + android:visibility="gone" + android:importantForAccessibility="no"/> + android:visibility="gone" + android:importantForAccessibility="no"/> Mobile data off + + Not set to use data + Off diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSCarrier.java b/packages/SystemUI/src/com/android/systemui/qs/QSCarrier.java index 3ff30c527f39f..f19445c1f33ba 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSCarrier.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSCarrier.java @@ -89,16 +89,22 @@ public class QSCarrier extends LinearLayout { .append(", "); } // TODO: show mobile data off/no internet text for 5 seconds before carrier text - if (TextUtils.equals(state.typeContentDescription, - mContext.getString(R.string.data_connection_no_internet)) - || TextUtils.equals(state.typeContentDescription, - mContext.getString(R.string.cell_data_off_content_description))) { + if (hasValidTypeContentDescription(state.typeContentDescription)) { contentDescription.append(state.typeContentDescription); } mMobileSignal.setContentDescription(contentDescription); } } + private boolean hasValidTypeContentDescription(String typeContentDescription) { + return TextUtils.equals(typeContentDescription, + mContext.getString(R.string.data_connection_no_internet)) + || TextUtils.equals(typeContentDescription, + mContext.getString(R.string.cell_data_off_content_description)) + || TextUtils.equals(typeContentDescription, + mContext.getString(R.string.not_default_data_content_description)); + } + public void setCarrierText(CharSequence text) { mCarrierText.setText(text); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index 3deede091a056..2589ac8dd200b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -256,7 +256,8 @@ public class MobileSignalController extends SignalController< level++; } boolean dataDisabled = mCurrentState.userSetup - && mCurrentState.iconGroup == TelephonyIcons.DATA_DISABLED; + && (mCurrentState.iconGroup == TelephonyIcons.DATA_DISABLED + || mCurrentState.iconGroup == TelephonyIcons.NOT_DEFAULT_DATA); boolean noInternet = mCurrentState.inetCondition == 0; boolean cutOut = dataDisabled || noInternet; return SignalDrawable.getState(level, getNumLevels(), cutOut); @@ -285,7 +286,8 @@ public class MobileSignalController extends SignalController< if (mCurrentState.inetCondition == 0) { dataContentDescription = mContext.getString(R.string.data_connection_no_internet); } - final boolean dataDisabled = mCurrentState.iconGroup == TelephonyIcons.DATA_DISABLED + final boolean dataDisabled = (mCurrentState.iconGroup == TelephonyIcons.DATA_DISABLED + || mCurrentState.iconGroup == TelephonyIcons.NOT_DEFAULT_DATA) && mCurrentState.userSetup; // Show icon in QS when we are connected or data is disabled. @@ -456,7 +458,12 @@ public class MobileSignalController extends SignalController< if (isCarrierNetworkChangeActive()) { mCurrentState.iconGroup = TelephonyIcons.CARRIER_NETWORK_CHANGE; } else if (isDataDisabled() && !mConfig.alwaysShowDataRatIcon) { - mCurrentState.iconGroup = TelephonyIcons.DATA_DISABLED; + if (mSubscriptionInfo.getSubscriptionId() + != mDefaults.getDefaultDataSubId()) { + mCurrentState.iconGroup = TelephonyIcons.NOT_DEFAULT_DATA; + } else { + mCurrentState.iconGroup = TelephonyIcons.DATA_DISABLED; + } } if (isEmergencyOnly() != mCurrentState.isEmergency) { mCurrentState.isEmergency = isEmergencyOnly(); 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 f4d623770c579..ef39912b65782 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -987,6 +987,7 @@ public class NetworkControllerImpl extends BroadcastReceiver datatype.equals("lte") ? TelephonyIcons.LTE : datatype.equals("lte+") ? TelephonyIcons.LTE_PLUS : datatype.equals("dis") ? TelephonyIcons.DATA_DISABLED : + datatype.equals("not") ? TelephonyIcons.NOT_DEFAULT_DATA : TelephonyIcons.UNKNOWN; } if (args.containsKey("roam")) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java index 7347f66de8ceb..e151ca3e23f37 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java @@ -245,6 +245,22 @@ class TelephonyIcons { 0, false); + static final MobileIconGroup NOT_DEFAULT_DATA = new MobileIconGroup( + "NotDefaultData", + null, + null, + AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, + 0, 0, + 0, + 0, + AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], + R.string.not_default_data_content_description, + 0, + false); + + // When adding a new MobileIconGround, check if the dataContentDescription has to be filtered + // in QSCarrier#hasValidTypeContentDescription + /** Mapping icon name(lower case) to the icon object. */ static final Map ICON_NAME_TO_ICON; static { @@ -265,6 +281,7 @@ class TelephonyIcons { ICON_NAME_TO_ICON.put("5g", NR_5G); ICON_NAME_TO_ICON.put("5g_plus", NR_5G_PLUS); ICON_NAME_TO_ICON.put("datadisable", DATA_DISABLED); + ICON_NAME_TO_ICON.put("notdefaultdata", NOT_DEFAULT_DATA); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index c1f88855ac246..5cafc028d3795 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -45,11 +45,13 @@ import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.testing.TestableLooper; +import android.testing.TestableResources; import android.util.Log; import com.android.internal.telephony.cdma.EriInfo; import com.android.settingslib.graph.SignalDrawable; import com.android.settingslib.net.DataUsageController; +import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; import com.android.systemui.statusbar.policy.NetworkController.IconState; @@ -76,6 +78,8 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected static final int DEFAULT_QS_SIGNAL_STRENGTH = DEFAULT_LEVEL; protected static final int DEFAULT_ICON = TelephonyIcons.ICON_3G; protected static final int DEFAULT_QS_ICON = TelephonyIcons.ICON_3G; + protected static final String NO_DATA_STRING = "Data disabled"; + protected static final String NOT_DEFAULT_DATA_STRING = "Not default data"; protected NetworkControllerImpl mNetworkController; protected MobileSignalController mMobileSignalController; @@ -113,6 +117,10 @@ public class NetworkControllerBaseTest extends SysuiTestCase { @Before public void setUp() throws Exception { Settings.Global.putInt(mContext.getContentResolver(), Global.AIRPLANE_MODE_ON, 0); + TestableResources res = mContext.getOrCreateTestableResources(); + res.addOverride(R.string.cell_data_off_content_description, NO_DATA_STRING); + res.addOverride(R.string.not_default_data_content_description, NOT_DEFAULT_DATA_STRING); + mMockWm = mock(WifiManager.class); mMockTm = mock(TelephonyManager.class); mMockSm = mock(SubscriptionManager.class); @@ -392,12 +400,21 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon, boolean qsVisible, int qsIcon, int qsTypeIcon, boolean dataIn, boolean dataOut, boolean cutOut) { + verifyLastMobileDataIndicators( + visible, icon, typeIcon, qsVisible, qsIcon, qsTypeIcon, dataIn, dataOut, cutOut, + null); + } + + protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon, + boolean qsVisible, int qsIcon, int qsTypeIcon, boolean dataIn, boolean dataOut, + boolean cutOut, String typeContentDescription) { ArgumentCaptor iconArg = ArgumentCaptor.forClass(IconState.class); ArgumentCaptor typeIconArg = ArgumentCaptor.forClass(Integer.class); ArgumentCaptor qsIconArg = ArgumentCaptor.forClass(IconState.class); ArgumentCaptor qsTypeIconArg = ArgumentCaptor.forClass(Integer.class); ArgumentCaptor dataInArg = ArgumentCaptor.forClass(Boolean.class); ArgumentCaptor dataOutArg = ArgumentCaptor.forClass(Boolean.class); + ArgumentCaptor typeContentDescriptionArg = ArgumentCaptor.forClass(String.class); Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators( iconArg.capture(), @@ -406,7 +423,8 @@ public class NetworkControllerBaseTest extends SysuiTestCase { qsTypeIconArg.capture(), dataInArg.capture(), dataOutArg.capture(), - anyString(), anyString(), anyBoolean(), anyInt(), anyBoolean()); + typeContentDescriptionArg.capture(), + anyString(), anyBoolean(), anyInt(), anyBoolean()); IconState iconState = iconArg.getValue(); @@ -424,6 +442,10 @@ public class NetworkControllerBaseTest extends SysuiTestCase { (boolean) dataInArg.getValue()); assertEquals("Data direction out in quick settings", dataOut, (boolean) dataOutArg.getValue()); + if (typeContentDescription != null) { // Only check if it was provided + assertEquals("Type content description", typeContentDescription, + typeContentDescriptionArg.getValue()); + } } protected void assertNetworkNameEquals(String expected) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java index 2baea1ae3b19e..1d1282bdc9171 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java @@ -117,7 +117,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { } @Test - public void testNoInternetIcon() { + public void testNoInternetIcon_withDefaultSub() { setupNetworkController(); when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); setupDefaultSignal(); @@ -127,11 +127,11 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { // Verify that a SignalDrawable with a cut out is used to display data disabled. verifyLastMobileDataIndicators(true, DEFAULT_SIGNAL_STRENGTH, 0, true, DEFAULT_QS_SIGNAL_STRENGTH, 0, false, - false, true); + false, true, NO_DATA_STRING); } @Test - public void testDataDisabledIcon() { + public void testDataDisabledIcon_withDefaultSub() { setupNetworkController(); when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); setupDefaultSignal(); @@ -141,7 +141,37 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { // Verify that a SignalDrawable with a cut out is used to display data disabled. verifyLastMobileDataIndicators(true, DEFAULT_SIGNAL_STRENGTH, 0, true, DEFAULT_QS_SIGNAL_STRENGTH, 0, false, - false, true); + false, true, NO_DATA_STRING); + } + + @Test + public void testNoInternetIcon_withoutDefaultSub() { + setupNetworkController(); + when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); + setupDefaultSignal(); + setDefaultSubId(mSubId + 1); + updateDataConnectionState(TelephonyManager.DATA_CONNECTED, 0); + setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_CELLULAR, false, false); + + // Verify that a SignalDrawable with a cut out is used to display data disabled. + verifyLastMobileDataIndicators(true, DEFAULT_SIGNAL_STRENGTH, 0, + true, DEFAULT_QS_SIGNAL_STRENGTH, 0, false, + false, true, NOT_DEFAULT_DATA_STRING); + } + + @Test + public void testDataDisabledIcon_withoutDefaultSub() { + setupNetworkController(); + when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); + setupDefaultSignal(); + setDefaultSubId(mSubId + 1); + updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, 0); + setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_CELLULAR, false, false); + + // Verify that a SignalDrawable with a cut out is used to display data disabled. + verifyLastMobileDataIndicators(true, DEFAULT_SIGNAL_STRENGTH, 0, + true, DEFAULT_QS_SIGNAL_STRENGTH, 0, false, + false, true, NOT_DEFAULT_DATA_STRING); } @Test