Merge "Implement the CarrierConfig for call indicators"

This commit is contained in:
Ying Xu
2021-05-06 15:19:44 +00:00
committed by Android (Google) Code Review
15 changed files with 304 additions and 42 deletions

View 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>

View 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>

View File

@@ -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);
}
}
}

View File

@@ -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();

View File

@@ -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));
}

View File

@@ -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,

View File

@@ -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(

View File

@@ -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;

View File

@@ -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;
}
}

View File

@@ -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();

View File

@@ -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,

View File

@@ -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();

View File

@@ -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();

View File

@@ -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.

View File

@@ -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]);
}