summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author yinxu <yinxu@google.com> 2021-05-05 10:06:14 -0700
committer yinxu <yinxu@google.com> 2021-05-06 08:38:39 -0700
commit3948bf5d044780be8393ff1cb7cb0ada2361f1c4 (patch)
treeca8d00794379d722366b6100585def4756d16463
parent19943bde4bc6dce8afb8e17ce615e473a503f031 (diff)
Implement the CarrierConfig for call indicators
This CL implements the CarirerConfigs for both no calling icons and call strength icons. 1. Carriers can choose to only show the no calling icons when there is no IP connections. 2. Carriers can choose to hide the call strength icon, and show either a blacnk icon (single SIM) or SIM card icon (multi SIM) Bug: 181667933 Test: Manual tests Change-Id: I54386cb7399c7e3b3160ad01e09cb71f7e1f1a6e Merged-In: I54386cb7399c7e3b3160ad01e09cb71f7e1f1a6e
-rw-r--r--packages/SystemUI/res/drawable/ic_blank.xml22
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_sim_card.xml47
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java59
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java34
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/CarrierConfigTracker.java96
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java9
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java2
15 files changed, 304 insertions, 42 deletions
diff --git a/packages/SystemUI/res/drawable/ic_blank.xml b/packages/SystemUI/res/drawable/ic_blank.xml
new file mode 100644
index 000000000000..b94088f65d27
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_blank.xml
@@ -0,0 +1,22 @@
+<!--
+Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="16dp"
+ android:height="16dp"
+ android:viewportWidth="16.0"
+ android:viewportHeight="16.0">
+ <path/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_sim_card.xml b/packages/SystemUI/res/drawable/ic_qs_sim_card.xml
new file mode 100644
index 000000000000..6eda929b54d3
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_sim_card.xml
@@ -0,0 +1,47 @@
+<!--
+Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="?android:attr/colorControlNormal"
+ >
+
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M18,2h-8L4,8v12c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V4C20,2.9,19.1,2,18,2z M18,4v16H6V8.83L10.83,4L18,4L18,4z" />
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M 7 17 H 9 V 19 H 7 V 17 Z" />
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M 15 17 H 17 V 19 H 15 V 17 Z" />
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M 7 11 H 9 V 15 H 7 V 11 Z" />
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M 11 15 H 13 V 19 H 11 V 15 Z" />
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M 11 11 H 13 V 13 H 11 V 11 Z" />
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M 15 11 H 17 V 15 H 15 V 11 Z" />
+ <path
+ android:pathData="M0,0h24v24H0V0z" />
+</vector>
diff --git a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java
index 5afe1c87121d..c49e0547e433 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java
@@ -43,6 +43,7 @@ import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators;
+import com.android.systemui.util.CarrierConfigTracker;
import java.util.function.Consumer;
@@ -71,6 +72,7 @@ public class QSCarrierGroupController {
private int[] mLastSignalLevel = new int[SIM_SLOTS];
private String[] mLastSignalLevelDescription = new String[SIM_SLOTS];
private final boolean mProviderModel;
+ private final CarrierConfigTracker mCarrierConfigTracker;
private final NetworkController.SignalCallback mSignalCallback =
new NetworkController.SignalCallback() {
@@ -112,6 +114,10 @@ public class QSCarrierGroupController {
Log.e(TAG, "Invalid SIM slot index for subscription: " + subId);
return;
}
+
+ boolean displayCallStrengthIcon =
+ mCarrierConfigTracker.getCallStrengthConfig(subId);
+
if (statusIcon.icon == R.drawable.ic_qs_no_calling_sms) {
if (statusIcon.visible) {
mInfos[slotIndex] = new CellSignalState(true,
@@ -119,9 +125,14 @@ public class QSCarrierGroupController {
} else {
// Whenever the no Calling & SMS state is cleared, switched to the last
// known call strength icon.
- mInfos[slotIndex] = new CellSignalState(
- true, mLastSignalLevel[slotIndex],
- mLastSignalLevelDescription[slotIndex], "", false);
+ if (displayCallStrengthIcon) {
+ mInfos[slotIndex] = new CellSignalState(
+ true, mLastSignalLevel[slotIndex],
+ mLastSignalLevelDescription[slotIndex], "", false);
+ } else {
+ mInfos[slotIndex] = new CellSignalState(
+ true, R.drawable.ic_qs_sim_card, "", "", false);
+ }
}
mMainHandler.obtainMessage(H.MSG_UPDATE_STATE).sendToTarget();
} else {
@@ -131,8 +142,13 @@ public class QSCarrierGroupController {
// shown.
if (mInfos[slotIndex].mobileSignalIconId
!= R.drawable.ic_qs_no_calling_sms) {
- mInfos[slotIndex] = new CellSignalState(true, statusIcon.icon,
- statusIcon.contentDescription, "", false);
+ if (displayCallStrengthIcon) {
+ mInfos[slotIndex] = new CellSignalState(true, statusIcon.icon,
+ statusIcon.contentDescription, "", false);
+ } else {
+ mInfos[slotIndex] = new CellSignalState(
+ true, R.drawable.ic_qs_sim_card, "", "", false);
+ }
mMainHandler.obtainMessage(H.MSG_UPDATE_STATE).sendToTarget();
}
}
@@ -165,7 +181,8 @@ public class QSCarrierGroupController {
private QSCarrierGroupController(QSCarrierGroup view, ActivityStarter activityStarter,
@Background Handler bgHandler, @Main Looper mainLooper,
NetworkController networkController,
- CarrierTextManager.Builder carrierTextManagerBuilder, Context context) {
+ CarrierTextManager.Builder carrierTextManagerBuilder, Context context,
+ CarrierConfigTracker carrierConfigTracker) {
if (FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL)) {
mProviderModel = true;
} else {
@@ -178,7 +195,7 @@ public class QSCarrierGroupController {
.setShowAirplaneMode(false)
.setShowMissingSim(false)
.build();
-
+ mCarrierConfigTracker = carrierConfigTracker;
View.OnClickListener onClickListener = v -> {
if (!v.isVisibleToUser()) {
return;
@@ -228,6 +245,17 @@ public class QSCarrierGroupController {
return SubscriptionManager.getSlotIndex(subscriptionId);
}
+ private boolean isSingleCarrier() {
+ int carrierCount = 0;
+ for (int i = 0; i < SIM_SLOTS; i++) {
+
+ if (mInfos[i].visible) {
+ carrierCount++;
+ }
+ }
+ return carrierCount == 1;
+ }
+
public void setListening(boolean listening) {
if (listening == mListening) {
return;
@@ -257,6 +285,15 @@ public class QSCarrierGroupController {
return;
}
+ if (isSingleCarrier()) {
+ for (int i = 0; i < SIM_SLOTS; i++) {
+ if (mInfos[i].visible
+ && mInfos[i].mobileSignalIconId == R.drawable.ic_qs_sim_card) {
+ mInfos[i] = new CellSignalState(true, R.drawable.ic_blank, "", "", false);
+ }
+ }
+ }
+
for (int i = 0; i < SIM_SLOTS; i++) {
mCarrierGroups[i].updateState(mInfos[i]);
}
@@ -363,17 +400,20 @@ public class QSCarrierGroupController {
private final NetworkController mNetworkController;
private final CarrierTextManager.Builder mCarrierTextControllerBuilder;
private final Context mContext;
+ private final CarrierConfigTracker mCarrierConfigTracker;
@Inject
public Builder(ActivityStarter activityStarter, @Background Handler handler,
@Main Looper looper, NetworkController networkController,
- CarrierTextManager.Builder carrierTextControllerBuilder, Context context) {
+ CarrierTextManager.Builder carrierTextControllerBuilder, Context context,
+ CarrierConfigTracker carrierConfigTracker) {
mActivityStarter = activityStarter;
mHandler = handler;
mLooper = looper;
mNetworkController = networkController;
mCarrierTextControllerBuilder = carrierTextControllerBuilder;
mContext = context;
+ mCarrierConfigTracker = carrierConfigTracker;
}
public Builder setQSCarrierGroup(QSCarrierGroup view) {
@@ -383,7 +423,8 @@ public class QSCarrierGroupController {
public QSCarrierGroupController build() {
return new QSCarrierGroupController(mView, mActivityStarter, mHandler, mLooper,
- mNetworkController, mCarrierTextControllerBuilder, mContext);
+ mNetworkController, mCarrierTextControllerBuilder, mContext,
+ mCarrierConfigTracker);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index bd17d00063d7..cae7e354465b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -393,7 +393,6 @@ public class StatusBar extends SystemUI implements DemoMode,
private final Object mQueueLock = new Object();
- private final StatusBarIconController mIconController;
private final PulseExpansionHandler mPulseExpansionHandler;
private final NotificationWakeUpCoordinator mWakeUpCoordinator;
private final KeyguardBypassController mKeyguardBypassController;
@@ -720,7 +719,7 @@ public class StatusBar extends SystemUI implements DemoMode,
LightBarController lightBarController,
AutoHideController autoHideController,
KeyguardUpdateMonitor keyguardUpdateMonitor,
- StatusBarIconController statusBarIconController,
+ StatusBarSignalPolicy signalPolicy,
PulseExpansionHandler pulseExpansionHandler,
NotificationWakeUpCoordinator notificationWakeUpCoordinator,
KeyguardBypassController keyguardBypassController,
@@ -806,7 +805,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mLightBarController = lightBarController;
mAutoHideController = autoHideController;
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
- mIconController = statusBarIconController;
+ mSignalPolicy = signalPolicy;
mPulseExpansionHandler = pulseExpansionHandler;
mWakeUpCoordinator = notificationWakeUpCoordinator;
mKeyguardBypassController = keyguardBypassController;
@@ -1015,7 +1014,6 @@ public class StatusBar extends SystemUI implements DemoMode,
// Lastly, call to the icon policy to install/update all the icons.
mIconPolicy.init();
- mSignalPolicy = new StatusBarSignalPolicy(mContext, mIconController);
mKeyguardStateController.addCallback(this);
startKeyguard();
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 3445826eefbe..142cf21c4f29 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
@@ -25,6 +25,7 @@ import android.util.Log;
import com.android.settingslib.mobile.TelephonyIcons;
import com.android.systemui.Dependency;
import com.android.systemui.R;
+import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators;
@@ -33,12 +34,16 @@ import com.android.systemui.statusbar.policy.NetworkControllerImpl;
import com.android.systemui.statusbar.policy.SecurityController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
+import com.android.systemui.util.CarrierConfigTracker;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+import javax.inject.Inject;
+/** Controls the signal policies for icons shown in the StatusBar. **/
+@SysUISingleton
public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallback,
SecurityController.SecurityControllerCallback, Tunable {
private static final String TAG = "StatusBarSignalPolicy";
@@ -57,6 +62,7 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba
private final NetworkController mNetworkController;
private final SecurityController mSecurityController;
private final Handler mHandler = Handler.getMain();
+ private final CarrierConfigTracker mCarrierConfigTracker;
private boolean mHideAirplane;
private boolean mHideMobile;
@@ -75,7 +81,9 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba
new ArrayList<CallIndicatorIconState>();
private WifiIconState mWifiIconState = new WifiIconState();
- public StatusBarSignalPolicy(Context context, StatusBarIconController iconController) {
+ @Inject
+ public StatusBarSignalPolicy(Context context, StatusBarIconController iconController,
+ CarrierConfigTracker carrierConfigTracker) {
mContext = context;
mSlotAirplane = mContext.getString(com.android.internal.R.string.status_bar_airplane);
@@ -95,6 +103,7 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba
Dependency.get(TunerService.class).addTunable(this, StatusBarIconController.ICON_HIDE_LIST);
mNetworkController.addCallback(this);
mSecurityController.addCallback(this);
+ mCarrierConfigTracker = carrierConfigTracker;
}
public void destroy() {
@@ -215,8 +224,12 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba
state.callStrengthResId = statusIcon.icon;
state.callStrengthDescription = statusIcon.contentDescription;
}
- mIconController.setCallStrengthIcons(mSlotCallStrength,
- CallIndicatorIconState.copyStates(mCallIndicatorStates));
+ if (mCarrierConfigTracker.getCallStrengthConfig(subId)) {
+ mIconController.setCallStrengthIcons(mSlotCallStrength,
+ CallIndicatorIconState.copyStates(mCallIndicatorStates));
+ } else {
+ mIconController.removeIcon(mSlotCallStrength, subId);
+ }
mIconController.setNoCallingIcons(mSlotNoCalling,
CallIndicatorIconState.copyStates(mCallIndicatorStates));
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
index ae11a74748cd..d0d2cb288aa5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java
@@ -88,10 +88,10 @@ import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.StatusBarLocationPublisher;
import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarter;
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy;
import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.policy.BatteryController;
@@ -134,7 +134,7 @@ public interface StatusBarPhoneModule {
LightBarController lightBarController,
AutoHideController autoHideController,
KeyguardUpdateMonitor keyguardUpdateMonitor,
- StatusBarIconController statusBarIconController,
+ StatusBarSignalPolicy signalPolicy,
PulseExpansionHandler pulseExpansionHandler,
NotificationWakeUpCoordinator notificationWakeUpCoordinator,
KeyguardBypassController keyguardBypassController,
@@ -221,7 +221,7 @@ public interface StatusBarPhoneModule {
lightBarController,
autoHideController,
keyguardUpdateMonitor,
- statusBarIconController,
+ signalPolicy,
pulseExpansionHandler,
notificationWakeUpCoordinator,
keyguardBypassController,
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 044f52fd689e..ce080752b5cc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
@@ -61,6 +61,7 @@ import com.android.systemui.R;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators;
import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
+import com.android.systemui.util.CarrierConfigTracker;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
@@ -78,6 +79,7 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
private static final int IMS_TYPE_WLAN = 2;
private static final int IMS_TYPE_WLAN_CROSS_SIM = 3;
private final TelephonyManager mPhone;
+ private final CarrierConfigTracker mCarrierConfigTracker;
private final ImsMmTelManager mImsMmTelManager;
private final SubscriptionDefaults mDefaults;
private final String mNetworkNameDefault;
@@ -123,10 +125,12 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
public MobileSignalController(Context context, Config config, boolean hasMobileData,
TelephonyManager phone, CallbackHandler callbackHandler,
NetworkControllerImpl networkController, SubscriptionInfo info,
- SubscriptionDefaults defaults, Looper receiverLooper) {
+ SubscriptionDefaults defaults, Looper receiverLooper,
+ CarrierConfigTracker carrierConfigTracker) {
super("MobileSignalController(" + info.getSubscriptionId() + ")", context,
NetworkCapabilities.TRANSPORT_CELLULAR, callbackHandler,
networkController);
+ mCarrierConfigTracker = carrierConfigTracker;
mConfig = config;
mPhone = phone;
mDefaults = defaults;
@@ -583,7 +587,7 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
mTelephonyDisplayInfo = mobileStatus.telephonyDisplayInfo;
int lastVoiceState = mServiceState != null ? mServiceState.getState() : -1;
mServiceState = mobileStatus.serviceState;
- int currentVoiceState = mServiceState != null ? mServiceState.getState() : -1;
+ int currentVoiceState = mServiceState != null ? mServiceState.getState() : -1;
// Only update the no calling Status in the below scenarios
// 1. The first valid voice state has been received
// 2. The voice state has been changed and either the last or current state is
@@ -594,12 +598,29 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
|| (lastVoiceState == ServiceState.STATE_IN_SERVICE
|| currentVoiceState == ServiceState.STATE_IN_SERVICE))) {
boolean isNoCalling = currentVoiceState != ServiceState.STATE_IN_SERVICE;
- IconState statusIcon = new IconState(isNoCalling, R.drawable.ic_qs_no_calling_sms,
+ isNoCalling &= !hideNoCalling();
+ IconState statusIcon = new IconState(isNoCalling,
+ R.drawable.ic_qs_no_calling_sms,
getTextIfExists(AccessibilityContentDescriptions.NO_CALLING).toString());
notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId());
}
}
+ void updateNoCallingState() {
+ int currentVoiceState = mServiceState != null ? mServiceState.getState() : -1;
+ boolean isNoCalling = currentVoiceState != ServiceState.STATE_IN_SERVICE;
+ isNoCalling &= !hideNoCalling();
+ IconState statusIcon = new IconState(isNoCalling,
+ R.drawable.ic_qs_no_calling_sms,
+ getTextIfExists(AccessibilityContentDescriptions.NO_CALLING).toString());
+ notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId());
+ }
+
+ private boolean hideNoCalling() {
+ return mNetworkController.hasDefaultNetwork()
+ && mCarrierConfigTracker.getNoCallingConfig(mSubscriptionInfo.getSubscriptionId());
+ }
+
private int getCallStrengthIcon(int level, boolean isWifi) {
return isWifi ? TelephonyIcons.WIFI_CALL_STRENGTH_ICONS[level]
: TelephonyIcons.MOBILE_CALL_STRENGTH_ICONS[level];
@@ -616,7 +637,9 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
void refreshCallIndicator(SignalCallback callback) {
boolean isNoCalling = mServiceState != null
&& mServiceState.getState() != ServiceState.STATE_IN_SERVICE;
- IconState statusIcon = new IconState(isNoCalling, R.drawable.ic_qs_no_calling_sms,
+ isNoCalling &= !hideNoCalling();
+ IconState statusIcon = new IconState(isNoCalling,
+ R.drawable.ic_qs_no_calling_sms,
getTextIfExists(AccessibilityContentDescriptions.NO_CALLING).toString());
callback.setCallIndicator(statusIcon, mSubscriptionInfo.getSubscriptionId());
@@ -646,7 +669,6 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
if (!mProviderModel) {
return;
}
- Log.d("mTag", "notifyWifiLevelChange " + mImsType);
mLastWlanLevel = level;
if (mImsType != IMS_TYPE_WLAN) {
return;
@@ -662,7 +684,6 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
if (!mProviderModel) {
return;
}
- Log.d("mTag", "notifyDefaultMobileLevelChange " + mImsType);
mLastWlanCrossSimLevel = level;
if (mImsType != IMS_TYPE_WLAN_CROSS_SIM) {
return;
@@ -681,7 +702,6 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
int newLevel = getSignalLevel(signalStrength);
if (newLevel != mLastLevel) {
mLastLevel = newLevel;
- Log.d("mTag", "notifyMobileLevelChangeIfNecessary " + mImsType);
mLastWwanLevel = newLevel;
if (mImsType == IMS_TYPE_WWAN) {
IconState statusIcon = new IconState(
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 f683603c9cd5..f45218df0b58 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -74,6 +74,7 @@ import com.android.systemui.demomode.DemoModeController;
import com.android.systemui.settings.CurrentUserTracker;
import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
import com.android.systemui.telephony.TelephonyListenerManager;
+import com.android.systemui.util.CarrierConfigTracker;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -122,6 +123,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
private final Object mLock = new Object();
private final boolean mProviderModel;
private Config mConfig;
+ private final CarrierConfigTracker mCarrierConfigTracker;
private TelephonyCallback.ActiveDataSubscriptionIdListener mPhoneStateListener;
private int mActiveMobileDataSubscription = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -212,7 +214,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
@Nullable WifiManager wifiManager,
NetworkScoreManager networkScoreManager,
AccessPointControllerImpl accessPointController,
- DemoModeController demoModeController) {
+ DemoModeController demoModeController,
+ CarrierConfigTracker carrierConfigTracker) {
this(context, connectivityManager,
telephonyManager,
telephonyListenerManager,
@@ -228,7 +231,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
new SubscriptionDefaults(),
deviceProvisionedController,
broadcastDispatcher,
- demoModeController);
+ demoModeController,
+ carrierConfigTracker);
mReceiverHandler.post(mRegisterListeners);
}
@@ -246,7 +250,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
SubscriptionDefaults defaultsHandler,
DeviceProvisionedController deviceProvisionedController,
BroadcastDispatcher broadcastDispatcher,
- DemoModeController demoModeController) {
+ DemoModeController demoModeController,
+ CarrierConfigTracker carrierConfigTracker) {
mContext = context;
mTelephonyListenerManager = telephonyListenerManager;
mConfig = config;
@@ -262,6 +267,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
mConnectivityManager = connectivityManager;
mHasMobileDataFeature = telephonyManager.isDataCapable();
mDemoModeController = demoModeController;
+ mCarrierConfigTracker = carrierConfigTracker;
// telephony
mPhone = telephonyManager;
@@ -574,6 +580,10 @@ public class NetworkControllerImpl extends BroadcastReceiver
return mWifiSignalController.isCarrierMergedWifi(subId);
}
+ boolean hasDefaultNetwork() {
+ return !mNoDefaultNetwork;
+ }
+
boolean isNonCarrierWifiNetworkAvailable() {
return !mNoNetworksAvailable;
}
@@ -884,7 +894,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
MobileSignalController controller = new MobileSignalController(mContext, mConfig,
mHasMobileDataFeature, mPhone.createForSubscriptionId(subId),
mCallbackHandler, this, subscriptions.get(i),
- mSubDefaults, mReceiverHandler.getLooper());
+ mSubDefaults, mReceiverHandler.getLooper(), mCarrierConfigTracker);
controller.setUserSetupComplete(mUserSetup);
mMobileSignalControllers.put(subId, controller);
if (subscriptions.get(i).getSimSlotIndex() == 0) {
@@ -1027,6 +1037,10 @@ public class NetworkControllerImpl extends BroadcastReceiver
mNoDefaultNetwork = mConnectedTransports.isEmpty();
mCallbackHandler.setConnectivityStatus(mNoDefaultNetwork, !mInetCondition,
mNoNetworksAvailable);
+ for (int i = 0; i < mMobileSignalControllers.size(); i++) {
+ MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i);
+ mobileSignalController.updateNoCallingState();
+ }
notifyAllListeners();
}
}
@@ -1334,8 +1348,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
null, null, null, "", false, null, null);
MobileSignalController controller = new MobileSignalController(mContext,
mConfig, mHasMobileDataFeature,
- mPhone.createForSubscriptionId(info.getSubscriptionId()), mCallbackHandler, this, info,
- mSubDefaults, mReceiverHandler.getLooper());
+ mPhone.createForSubscriptionId(info.getSubscriptionId()), mCallbackHandler, this,
+ info, mSubDefaults, mReceiverHandler.getLooper(), mCarrierConfigTracker);
mMobileSignalControllers.put(id, controller);
controller.getState().userSetup = true;
return info;
diff --git a/packages/SystemUI/src/com/android/systemui/util/CarrierConfigTracker.java b/packages/SystemUI/src/com/android/systemui/util/CarrierConfigTracker.java
new file mode 100644
index 000000000000..02a07e48e814
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/util/CarrierConfigTracker.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.util;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
+import android.util.SparseArray;
+
+import com.android.systemui.dagger.SysUISingleton;
+
+import javax.inject.Inject;
+
+/**
+ * Tracks the Carrier Config values.
+ */
+@SysUISingleton
+public class CarrierConfigTracker extends BroadcastReceiver {
+ private final SparseArray<Boolean> mCallStrengthConfigs = new SparseArray<>();
+ private final SparseArray<Boolean> mNoCallingConfigs = new SparseArray<>();
+ private final CarrierConfigManager mCarrierConfigManager;
+ private final boolean mDefaultCallStrengthConfig;
+ private final boolean mDefaultNoCallingConfig;
+
+ @Inject
+ public CarrierConfigTracker(Context context) {
+ mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);
+ context.registerReceiver(
+ this, new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
+ mDefaultCallStrengthConfig =
+ CarrierConfigManager.getDefaultConfig().getBoolean(
+ CarrierConfigManager.KEY_DISPLAY_CALL_STRENGTH_INDICATOR_BOOL);
+ mDefaultNoCallingConfig =
+ CarrierConfigManager.getDefaultConfig().getBoolean(
+ CarrierConfigManager.KEY_USE_IP_FOR_CALLING_INDICATOR_BOOL);
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction() == CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED) {
+ int subId = intent.getIntExtra(
+ CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX,
+ SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+ return;
+ }
+ PersistableBundle b = mCarrierConfigManager.getConfigForSubId(subId);
+ if (b != null) {
+ boolean hideNoCallingConfig = b.getBoolean(
+ CarrierConfigManager.KEY_USE_IP_FOR_CALLING_INDICATOR_BOOL);
+ boolean displayCallStrengthIcon = b.getBoolean(
+ CarrierConfigManager.KEY_DISPLAY_CALL_STRENGTH_INDICATOR_BOOL);
+ mCallStrengthConfigs.put(subId, displayCallStrengthIcon);
+ mNoCallingConfigs.put(subId, hideNoCallingConfig);
+ }
+ }
+ }
+
+ /**
+ * Returns the KEY_DISPLAY_CALL_STRENGTH_INDICATOR_BOOL value for the given subId.
+ */
+ public boolean getCallStrengthConfig(int subId) {
+ if (mCallStrengthConfigs.indexOfKey(subId) >= 0) {
+ return mCallStrengthConfigs.get(subId);
+ }
+ return mDefaultCallStrengthConfig;
+ }
+
+ /**
+ * Returns the KEY_USE_IP_FOR_CALLING_INDICATOR_BOOL value for the given subId.
+ */
+ public boolean getNoCallingConfig(int subId) {
+ if (mNoCallingConfigs.indexOfKey(subId) >= 0) {
+ return mNoCallingConfigs.get(subId);
+ }
+ return mDefaultNoCallingConfig;
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java
index 59a5f03da530..876acc12f7db 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java
@@ -37,6 +37,7 @@ import com.android.keyguard.CarrierTextManager;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators;
+import com.android.systemui.util.CarrierConfigTracker;
import com.android.systemui.utils.leaks.LeakCheckedTest;
import com.android.systemui.utils.os.FakeHandler;
@@ -66,6 +67,8 @@ public class QSCarrierGroupControllerTest extends LeakCheckedTest {
private CarrierTextManager.Builder mCarrierTextControllerBuilder;
@Mock
private CarrierTextManager mCarrierTextManager;
+ @Mock
+ private CarrierConfigTracker mCarrierConfigTracker;
private TestableLooper mTestableLooper;
@Before
@@ -99,7 +102,7 @@ public class QSCarrierGroupControllerTest extends LeakCheckedTest {
mQSCarrierGroupController = new QSCarrierGroupController.Builder(
mActivityStarter, handler, TestableLooper.get(this).getLooper(),
- mNetworkController, mCarrierTextControllerBuilder, mContext)
+ mNetworkController, mCarrierTextControllerBuilder, mContext, mCarrierConfigTracker)
.setQSCarrierGroup(mQSCarrierGroup)
.build();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index b2487e8e2444..b3d52b80c815 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -178,7 +178,7 @@ public class StatusBarTest extends SysuiTestCase {
@Mock private NotificationsController mNotificationsController;
@Mock private LightBarController mLightBarController;
- @Mock private StatusBarIconController mStatusBarIconController;
+ @Mock private StatusBarSignalPolicy mStatusBarSignalPolicy;
@Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
@Mock private KeyguardStateController mKeyguardStateController;
@Mock private KeyguardIndicationController mKeyguardIndicationController;
@@ -356,7 +356,7 @@ public class StatusBarTest extends SysuiTestCase {
mLightBarController,
mAutoHideController,
mKeyguardUpdateMonitor,
- mStatusBarIconController,
+ mStatusBarSignalPolicy,
mPulseExpansionHandler,
mNotificationWakeUpCoordinator,
mKeyguardBypassController,
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 f33c9e88c347..abc66dbca2a2 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
@@ -76,6 +76,7 @@ import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators;
import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
import com.android.systemui.telephony.TelephonyListenerManager;
+import com.android.systemui.util.CarrierConfigTracker;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.time.FakeSystemClock;
@@ -124,6 +125,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
protected DeviceProvisionedListener mUserCallback;
protected Instrumentation mInstrumentation;
protected DemoModeController mDemoModeController;
+ protected CarrierConfigTracker mCarrierConfigTracker;
protected FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
protected int mSubId;
@@ -174,6 +176,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
mMockBd = mock(BroadcastDispatcher.class);
mMockNsm = mock(NetworkScoreManager.class);
mMockSubDefaults = mock(SubscriptionDefaults.class);
+ mCarrierConfigTracker = mock(CarrierConfigTracker.class);
mNetCapabilities = new NetworkCapabilities();
when(mMockTm.isDataCapable()).thenReturn(true);
when(mMockTm.createForSubscriptionId(anyInt())).thenReturn(mMockTm);
@@ -231,7 +234,8 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
mMockSubDefaults,
mMockProvisionController,
mMockBd,
- mDemoModeController);
+ mDemoModeController,
+ mCarrierConfigTracker);
setupNetworkController();
// Trigger blank callbacks to always get the current state (some tests don't trigger
@@ -298,7 +302,8 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
mCallbackHandler,
mock(AccessPointControllerImpl.class),
mock(DataUsageController.class), mMockSubDefaults,
- mock(DeviceProvisionedController.class), mMockBd, mDemoModeController);
+ mock(DeviceProvisionedController.class), mMockBd, mDemoModeController,
+ mCarrierConfigTracker);
setupNetworkController();
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 6219fafc98db..09554e717d3d 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
@@ -21,6 +21,7 @@ import android.testing.TestableLooper.RunWithLooper;
import com.android.settingslib.mobile.TelephonyIcons;
import com.android.settingslib.net.DataUsageController;
+import com.android.systemui.util.CarrierConfigTracker;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -111,7 +112,8 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest {
mMockNsm, mMockSm, mConfig, Looper.getMainLooper(), mFakeExecutor, mCallbackHandler,
mock(AccessPointControllerImpl.class),
mock(DataUsageController.class), mMockSubDefaults,
- mock(DeviceProvisionedController.class), mMockBd, mDemoModeController);
+ mock(DeviceProvisionedController.class), mMockBd, mDemoModeController,
+ mock(CarrierConfigTracker.class));
setupNetworkController();
setupDefaultSignal();
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 8d3e403f1189..1e7801d63f75 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
@@ -41,6 +41,7 @@ import com.android.settingslib.graph.SignalDrawable;
import com.android.settingslib.mobile.TelephonyIcons;
import com.android.settingslib.net.DataUsageController;
import com.android.systemui.R;
+import com.android.systemui.util.CarrierConfigTracker;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -66,7 +67,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
Looper.getMainLooper(), mFakeExecutor, mCallbackHandler,
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd,
- mDemoModeController);
+ mDemoModeController, mock(CarrierConfigTracker.class));
setupNetworkController();
verifyLastMobileDataIndicators(false, -1, 0);
@@ -86,7 +87,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
Looper.getMainLooper(), mFakeExecutor, mCallbackHandler,
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd,
- mDemoModeController);
+ mDemoModeController, mock(CarrierConfigTracker.class));
mNetworkController.registerListeners();
// Wait for the main looper to execute the previous command
@@ -154,7 +155,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
Looper.getMainLooper(), mFakeExecutor, mCallbackHandler,
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd,
- mDemoModeController);
+ mDemoModeController, mock(CarrierConfigTracker.class));
setupNetworkController();
// No Subscriptions.
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
index bfb98deda452..687ca601bd6e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
@@ -269,9 +269,9 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest {
}
// Set the ImsType to be IMS_TYPE_WWAN
setImsType(1);
+ setupDefaultSignal();
for (int testStrength = 0;
testStrength < CellSignalStrength.getNumSignalStrengthLevels(); testStrength++) {
- setupDefaultSignal();
setLevel(testStrength);
verifyLastCallStrength(TelephonyIcons.MOBILE_CALL_STRENGTH_ICONS[testStrength]);
}