diff options
| author | 2021-05-05 10:06:14 -0700 | |
|---|---|---|
| committer | 2021-05-06 08:38:39 -0700 | |
| commit | 3948bf5d044780be8393ff1cb7cb0ada2361f1c4 (patch) | |
| tree | ca8d00794379d722366b6100585def4756d16463 | |
| parent | 19943bde4bc6dce8afb8e17ce615e473a503f031 (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
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]); } |