From c7bc84b92d39cf93466307bfef33533d11ea268a Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Mon, 11 Mar 2019 13:57:31 -0400 Subject: [PATCH] Added correct TalkBack support for QSCarrier Added new MobileIconGroup to TelephonyIcons for SIMs that are not set as default for mobile data. This group behaves identically to DATA_DISABLES except that is checked before it so we can assign it correctly. This addition was made for properly providing content description of carriers that are not set as default for data. Previously it said "Mobile Data Off" which could be misleading. Test: manual with 1 and 2 sims Test: atest NetworkControllerDataTest NetworkControllerSignalTest Bug: 123299825 Change-Id: Ia9e085b6296ff8df861e1e40bf8004b20b0d2c11 --- packages/SystemUI/res/layout/qs_carrier.xml | 3 +- .../SystemUI/res/layout/qs_carrier_group.xml | 6 ++- packages/SystemUI/res/values/strings.xml | 3 ++ .../com/android/systemui/qs/QSCarrier.java | 14 +++++-- .../policy/MobileSignalController.java | 13 +++++-- .../policy/NetworkControllerImpl.java | 1 + .../statusbar/policy/TelephonyIcons.java | 17 +++++++++ .../policy/NetworkControllerBaseTest.java | 24 +++++++++++- .../policy/NetworkControllerDataTest.java | 38 +++++++++++++++++-- 9 files changed, 104 insertions(+), 15 deletions(-) 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