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
This commit is contained in:
22
packages/SystemUI/res/drawable/ic_blank.xml
Normal file
22
packages/SystemUI/res/drawable/ic_blank.xml
Normal file
@@ -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>
|
||||
47
packages/SystemUI/res/drawable/ic_qs_sim_card.xml
Normal file
47
packages/SystemUI/res/drawable/ic_qs_sim_card.xml
Normal file
@@ -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>
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user