Merge "Implement the CarrierConfig for call indicators"
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