From 80b5d35d2a7acd4221ebe751249b10863b784773 Mon Sep 17 00:00:00 2001 From: Evan Laird Date: Tue, 24 Sep 2019 19:14:05 -0400 Subject: DO NOT MERGE Allow for HTML styling in mobile data type content descriptions This CL implements a (somewhat hacky) way to enable HTML attributes in the mobile data type content description strings. This way we can use some basic styling in the Quick Settings cellular data tile which uses it in a TextView. We do this by assuming that the content description is valid, escaped HTML, and send two separate CharSequences to all of the listeners, all of which can then decide if they need the regular content description or the prettified version. Test: atest SystemUITests; system ui demo mode Bug: 141177147 Change-Id: Idf387111b0cdc34ad3762eac0ec6c2b484b393e3 Merged-In: Idf387111b0cdc34ad3762eac0ec6c2b484b393e3 (cherry picked from commit a3b5dd1b8993184db77a582e525da1282aa593c8) --- packages/SystemUI/res/values/strings.xml | 3 +++ .../com/android/systemui/qs/QSCarrierGroup.java | 7 ++--- .../android/systemui/qs/tiles/CellularTile.java | 17 +++++++----- .../statusbar/phone/StatusBarSignalPolicy.java | 8 +++--- .../systemui/statusbar/policy/CallbackHandler.java | 31 +++++++++------------- .../statusbar/policy/EthernetSignalController.java | 2 +- .../statusbar/policy/MobileSignalController.java | 27 +++++++++++-------- .../statusbar/policy/NetworkController.java | 26 ++++++++++++++++-- .../statusbar/policy/NetworkControllerImpl.java | 3 +++ .../statusbar/policy/SignalController.java | 5 ++-- .../systemui/statusbar/policy/TelephonyIcons.java | 2 +- .../statusbar/policy/WifiSignalController.java | 2 +- .../android/systemui/qs/QSCarrierGroupTest.java | 2 +- .../statusbar/policy/CallbackHandlerTest.java | 18 ++++++++----- .../policy/NetworkControllerBaseTest.java | 7 ++--- .../policy/NetworkControllerSignalTest.java | 6 ++--- 16 files changed, 104 insertions(+), 62 deletions(-) diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 7feacb469f81..4b70b979bc2f 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -440,6 +440,9 @@ 5Ge + + <i>5G <small>E</small></i> + 5G diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSCarrierGroup.java b/packages/SystemUI/src/com/android/systemui/qs/QSCarrierGroup.java index 4571ef3ef4ef..255a4ba2f063 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSCarrierGroup.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSCarrierGroup.java @@ -205,8 +205,9 @@ public class QSCarrierGroup extends LinearLayout implements public void setMobileDataIndicators(NetworkController.IconState statusIcon, NetworkController.IconState qsIcon, int statusType, int qsType, boolean activityIn, boolean activityOut, - String typeContentDescription, - String description, boolean isWide, int subId, boolean roaming) { + CharSequence typeContentDescription, + CharSequence typeContentDescriptionHtml, CharSequence description, + boolean isWide, int subId, boolean roaming) { int slotIndex = getSlotIndex(subId); if (slotIndex >= SIM_SLOTS) { Log.w(TAG, "setMobileDataIndicators - slot: " + slotIndex); @@ -219,7 +220,7 @@ public class QSCarrierGroup extends LinearLayout implements mInfos[slotIndex].visible = statusIcon.visible; mInfos[slotIndex].mobileSignalIconId = statusIcon.icon; mInfos[slotIndex].contentDescription = statusIcon.contentDescription; - mInfos[slotIndex].typeContentDescription = typeContentDescription; + mInfos[slotIndex].typeContentDescription = typeContentDescription.toString(); mInfos[slotIndex].roaming = roaming; handleUpdateState(); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java index 20069ead5e8d..664ea8b33ec9 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java @@ -26,6 +26,7 @@ import android.content.res.Resources; import android.provider.Settings; import android.service.quicksettings.Tile; import android.telephony.SubscriptionManager; +import android.text.Html; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; @@ -199,12 +200,13 @@ public class CellularTile extends QSTileImpl { private CharSequence appendMobileDataType(CharSequence current, CharSequence dataType) { if (TextUtils.isEmpty(dataType)) { - return current; + return Html.fromHtml(current.toString(), 0); } if (TextUtils.isEmpty(current)) { - return dataType; + return Html.fromHtml(dataType.toString(), 0); } - return mContext.getString(R.string.mobile_carrier_text_format, current, dataType); + String concat = mContext.getString(R.string.mobile_carrier_text_format, current, dataType); + return Html.fromHtml(concat, 0); } private CharSequence getMobileDataContentName(CallbackInfo cb) { @@ -245,14 +247,17 @@ public class CellularTile extends QSTileImpl { @Override public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, - int qsType, boolean activityIn, boolean activityOut, String typeContentDescription, - String description, boolean isWide, int subId, boolean roaming) { + int qsType, boolean activityIn, boolean activityOut, + CharSequence typeContentDescription, + CharSequence typeContentDescriptionHtml, CharSequence description, + boolean isWide, int subId, boolean roaming) { if (qsIcon == null) { // Not data sim, don't display. return; } mInfo.dataSubscriptionName = mController.getMobileDataNetworkName(); - mInfo.dataContentDescription = (description != null) ? typeContentDescription : null; + mInfo.dataContentDescription = + (description != null) ? typeContentDescriptionHtml : null; mInfo.activityIn = activityIn; mInfo.activityOut = activityOut; mInfo.roaming = roaming; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java index 8286d26e9999..4531fbdf6f29 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java @@ -177,8 +177,10 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba @Override public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, - int qsType, boolean activityIn, boolean activityOut, String typeContentDescription, - String description, boolean isWide, int subId, boolean roaming) { + int qsType, boolean activityIn, boolean activityOut, + CharSequence typeContentDescription, + CharSequence typeContentDescriptionHtml, CharSequence description, + boolean isWide, int subId, boolean roaming) { MobileIconState state = getState(subId); if (state == null) { return; @@ -387,7 +389,7 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba public int typeId; public boolean roaming; public boolean needsLeadingPadding; - public String typeContentDescription; + public CharSequence typeContentDescription; private MobileIconState(int subId) { super(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java index e1bb19a6f69f..97d348bb6a22 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java @@ -111,30 +111,25 @@ public class CallbackHandler extends Handler implements EmergencyListener, Signa public void setWifiIndicators(final boolean enabled, final IconState statusIcon, final IconState qsIcon, final boolean activityIn, final boolean activityOut, final String description, boolean isTransient, String secondaryLabel) { - post(new Runnable() { - @Override - public void run() { - for (SignalCallback callback : mSignalCallbacks) { - callback.setWifiIndicators(enabled, statusIcon, qsIcon, activityIn, activityOut, - description, isTransient, secondaryLabel); - } + post(() -> { + for (SignalCallback callback : mSignalCallbacks) { + callback.setWifiIndicators(enabled, statusIcon, qsIcon, activityIn, activityOut, + description, isTransient, secondaryLabel); } }); } @Override public void setMobileDataIndicators(final IconState statusIcon, final IconState qsIcon, - final int statusType, final int qsType,final boolean activityIn, - final boolean activityOut, final String typeContentDescription, - final String description, final boolean isWide, final int subId, boolean roaming) { - post(new Runnable() { - @Override - public void run() { - for (SignalCallback signalCluster : mSignalCallbacks) { - signalCluster.setMobileDataIndicators(statusIcon, qsIcon, statusType, qsType, - activityIn, activityOut, typeContentDescription, description, isWide, - subId, roaming); - } + final int statusType, final int qsType, final boolean activityIn, + final boolean activityOut, final CharSequence typeContentDescription, + CharSequence typeContentDescriptionHtml, final CharSequence description, + final boolean isWide, final int subId, boolean roaming) { + post(() -> { + for (SignalCallback signalCluster : mSignalCallbacks) { + signalCluster.setMobileDataIndicators(statusIcon, qsIcon, statusType, qsType, + activityIn, activityOut, typeContentDescription, + typeContentDescriptionHtml, description, isWide, subId, roaming); } }); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/EthernetSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/EthernetSignalController.java index 159bd41a2094..a48fb9297888 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/EthernetSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/EthernetSignalController.java @@ -49,7 +49,7 @@ public class EthernetSignalController extends @Override public void notifyListeners(SignalCallback callback) { boolean ethernetVisible = mCurrentState.connected; - String contentDescription = getStringIfExists(getContentDescription()); + String contentDescription = getStringIfExists(getContentDescription()).toString(); // TODO: wire up data transfer using WifiSignalPoller. callback.setEthernetIndicators(new IconState(ethernetVisible, getCurrentIconId(), 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 e75365e66f81..94c2232c2deb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -29,6 +29,7 @@ import android.telephony.SignalStrength; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; +import android.text.Html; import android.text.TextUtils; import android.util.Log; import android.util.SparseArray; @@ -96,9 +97,10 @@ public class MobileSignalController extends SignalController< mDefaults = defaults; mSubscriptionInfo = info; mPhoneStateListener = new MobilePhoneStateListener(receiverLooper); - mNetworkNameSeparator = getStringIfExists(R.string.status_bar_network_name_separator); + mNetworkNameSeparator = getStringIfExists(R.string.status_bar_network_name_separator) + .toString(); mNetworkNameDefault = getStringIfExists( - com.android.internal.R.string.lockscreen_carrier_default); + com.android.internal.R.string.lockscreen_carrier_default).toString(); mapIconSets(); @@ -125,10 +127,6 @@ public class MobileSignalController extends SignalController< updateTelephony(); } - public int getDataContentDescription() { - return getIcons().mDataContentDescription; - } - public void setAirplaneMode(boolean airplaneMode) { mCurrentState.airplaneMode = airplaneMode; notifyListenersIfNecessary(); @@ -296,8 +294,14 @@ public class MobileSignalController extends SignalController< public void notifyListeners(SignalCallback callback) { MobileIconGroup icons = getIcons(); - String contentDescription = getStringIfExists(getContentDescription()); - String dataContentDescription = getStringIfExists(icons.mDataContentDescription); + String contentDescription = getStringIfExists(getContentDescription()).toString(); + CharSequence dataContentDescriptionHtml = getStringIfExists(icons.mDataContentDescription); + + //TODO: Hacky + // The data content description can sometimes be shown in a text view and might come to us + // as HTML. Strip any styling here so that listeners don't have to care + CharSequence dataContentDescription = Html.fromHtml( + dataContentDescriptionHtml.toString(), 0).toString(); if (mCurrentState.inetCondition == 0) { dataContentDescription = mContext.getString(R.string.data_connection_no_internet); } @@ -312,7 +316,7 @@ public class MobileSignalController extends SignalController< int qsTypeIcon = 0; IconState qsIcon = null; - String description = null; + CharSequence description = null; // Only send data sim callbacks to QS. if (mCurrentState.dataSim) { qsTypeIcon = (showDataIcon || mConfig.alwaysShowDataRatIcon) ? icons.mQsDataType : 0; @@ -329,8 +333,9 @@ public class MobileSignalController extends SignalController< showDataIcon &= mCurrentState.isDefault || dataDisabled; int typeIcon = (showDataIcon || mConfig.alwaysShowDataRatIcon) ? icons.mDataType : 0; callback.setMobileDataIndicators(statusIcon, qsIcon, typeIcon, qsTypeIcon, - activityIn, activityOut, dataContentDescription, description, icons.mIsWide, - mSubscriptionInfo.getSubscriptionId(), mCurrentState.roaming); + activityIn, activityOut, dataContentDescription, dataContentDescriptionHtml, + description, icons.mIsWide, mSubscriptionInfo.getSubscriptionId(), + mCurrentState.roaming); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java index 71db618d6076..95a97729936b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java @@ -44,6 +44,7 @@ public interface NetworkController extends CallbackController, D void addEmergencyListener(EmergencyListener listener); void removeEmergencyListener(EmergencyListener listener); boolean hasEmergencyCryptKeeperText(); + boolean isRadioOn(); public interface SignalCallback { @@ -51,10 +52,31 @@ public interface NetworkController extends CallbackController, D boolean activityIn, boolean activityOut, String description, boolean isTransient, String statusLabel) {} + /** + * Callback for listeners to be able to update the state of any UI tracking connectivity + * @param statusIcon the icon that should be shown in the status bar + * @param qsIcon the icon to show in Quick Settings + * @param statusType the resId of the data type icon (e.g. LTE) to show in the status bar + * @param qsType similar to above, the resId of the data type icon to show in Quick Settings + * @param activityIn indicates whether there is inbound activity + * @param activityOut indicates outbound activity + * @param typeContentDescription the contentDescription of the data type + * @param typeContentDescriptionHtml the (possibly HTML-styled) contentDescription of the + * data type. Suitable for display + * @param description description of the network (usually just the network name) + * @param isWide //TODO: unused? + * @param subId subscription ID for which to update the UI + * @param roaming indicates roaming + */ default void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, - int qsType, boolean activityIn, boolean activityOut, String typeContentDescription, - String description, boolean isWide, int subId, boolean roaming) {} + int qsType, boolean activityIn, boolean activityOut, + CharSequence typeContentDescription, + CharSequence typeContentDescriptionHtml, CharSequence description, + boolean isWide, int subId, boolean roaming) { + } + default void setSubs(List subs) {} + default void setNoSims(boolean show, boolean simDetected) {} default void setEthernetIndicators(IconState icon) {} 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 1c24bb9e88d1..011dd8580bce 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -992,6 +992,9 @@ public class NetworkControllerImpl extends BroadcastReceiver datatype.equals("3g") ? TelephonyIcons.THREE_G : datatype.equals("4g") ? TelephonyIcons.FOUR_G : datatype.equals("4g+") ? TelephonyIcons.FOUR_G_PLUS : + datatype.equals("5g") ? TelephonyIcons.NR_5G : + datatype.equals("5ge") ? TelephonyIcons.LTE_CA_5G_E : + datatype.equals("5g+") ? TelephonyIcons.NR_5G_PLUS : datatype.equals("e") ? TelephonyIcons.E : datatype.equals("g") ? TelephonyIcons.G : datatype.equals("h") ? TelephonyIcons.H : diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java index 9ec30d43ac75..52f7ae0c5837 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.policy; import static com.android.systemui.statusbar.policy.NetworkControllerImpl.TAG; +import android.annotation.NonNull; import android.content.Context; import android.text.format.DateFormat; import android.util.Log; @@ -166,8 +167,8 @@ public abstract class SignalController statusArg = ArgumentCaptor.forClass(IconState.class); @@ -132,14 +133,16 @@ public class CallbackHandlerTest extends SysuiTestCase { ArgumentCaptor qsTypeIconArg = ArgumentCaptor.forClass(Integer.class); ArgumentCaptor inArg = ArgumentCaptor.forClass(Boolean.class); ArgumentCaptor outArg = ArgumentCaptor.forClass(Boolean.class); - ArgumentCaptor typeContentArg = ArgumentCaptor.forClass(String.class); - ArgumentCaptor descArg = ArgumentCaptor.forClass(String.class); + ArgumentCaptor typeContentArg = ArgumentCaptor.forClass(CharSequence.class); + ArgumentCaptor typeContentHtmlArg = + ArgumentCaptor.forClass(CharSequence.class); + ArgumentCaptor descArg = ArgumentCaptor.forClass(CharSequence.class); ArgumentCaptor wideArg = ArgumentCaptor.forClass(Boolean.class); ArgumentCaptor subIdArg = ArgumentCaptor.forClass(Integer.class); Mockito.verify(mSignalCallback).setMobileDataIndicators(statusArg.capture(), qsArg.capture(), typeIconArg.capture(), qsTypeIconArg.capture(), inArg.capture(), - outArg.capture(), typeContentArg.capture(), descArg.capture(), wideArg.capture(), - subIdArg.capture(), eq(roaming)); + outArg.capture(), typeContentArg.capture(), typeContentHtmlArg.capture(), + descArg.capture(), wideArg.capture(), subIdArg.capture(), eq(roaming)); assertEquals(status, statusArg.getValue()); assertEquals(qs, qsArg.getValue()); assertEquals(type, (int) typeIconArg.getValue()); @@ -147,6 +150,7 @@ public class CallbackHandlerTest extends SysuiTestCase { assertEquals(in, (boolean) inArg.getValue()); assertEquals(out, (boolean) outArg.getValue()); assertEquals(typeDescription, typeContentArg.getValue()); + assertEquals(typeDescriptionHtml, typeContentHtmlArg.getValue()); assertEquals(description, descArg.getValue()); assertEquals(wide, (boolean) wideArg.getValue()); assertEquals(subId, (int) subIdArg.getValue()); 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 9ae9ceb2629f..edc513ba829e 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 @@ -350,7 +350,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { iconArg.capture(), anyInt(), typeIconArg.capture(), dataInArg.capture(), dataOutArg.capture(), - anyString(), anyString(), anyBoolean(), anyInt(), anyBoolean()); + anyString(), anyString(), anyString(), anyBoolean(), anyInt(), anyBoolean()); IconState iconState = iconArg.getValue(); int state = SignalDrawable.getState(icon, SignalStrength.NUM_SIGNAL_STRENGTH_BINS, false); @@ -382,8 +382,8 @@ public class NetworkControllerBaseTest extends SysuiTestCase { iconArg.capture(), any(), typeIconArg.capture(), - anyInt(), anyBoolean(), anyBoolean(), anyString(), anyString(), anyBoolean(), - anyInt(), eq(roaming)); + anyInt(), anyBoolean(), anyBoolean(), anyString(), anyString(), anyString(), + anyBoolean(), anyInt(), eq(roaming)); IconState iconState = iconArg.getValue(); int state = icon == -1 ? 0 @@ -426,6 +426,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { dataInArg.capture(), dataOutArg.capture(), typeContentDescriptionArg.capture(), + typeContentDescriptionArg.capture(), anyString(), anyBoolean(), anyInt(), anyBoolean()); IconState iconState = iconArg.getValue(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java index 0b53c486356f..91c6ab162dd7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java @@ -370,7 +370,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { String defaultNetworkName = mMobileSignalController .getStringIfExists( - com.android.internal.R.string.lockscreen_carrier_default); + com.android.internal.R.string.lockscreen_carrier_default).toString(); assertNetworkNameEquals(defaultNetworkName); } @@ -384,7 +384,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mNetworkController.onReceive(mContext, intent); String defaultNetworkName = mMobileSignalController.getStringIfExists( - com.android.internal.R.string.lockscreen_carrier_default); + com.android.internal.R.string.lockscreen_carrier_default).toString(); assertNetworkNameEquals(defaultNetworkName); } @@ -402,7 +402,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { assertNetworkNameEquals(plmn + mMobileSignalController.getStringIfExists( - R.string.status_bar_network_name_separator) + R.string.status_bar_network_name_separator).toString() + spn); } -- cgit v1.2.3