Merge changes from topic "revert-19279477-UFVLVIEMJU" into tm-qpr-dev am: bd614b00a0

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19436883

Change-Id: Ibf59ae872cbf6632ac97cab0f28ee7f7b6782a1e
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Neha Jain
2022-07-27 21:19:52 +00:00
committed by Automerger Merge Worker
19 changed files with 614 additions and 230 deletions

View File

@@ -44,8 +44,6 @@ public class MobileStatusTracker {
private final Handler mReceiverHandler; private final Handler mReceiverHandler;
private final MobileTelephonyCallback mTelephonyCallback; private final MobileTelephonyCallback mTelephonyCallback;
private boolean mListening = false;
/** /**
* MobileStatusTracker constructors * MobileStatusTracker constructors
* *
@@ -78,7 +76,6 @@ public class MobileStatusTracker {
* Config the MobileStatusTracker to start or stop monitoring platform signals. * Config the MobileStatusTracker to start or stop monitoring platform signals.
*/ */
public void setListening(boolean listening) { public void setListening(boolean listening) {
mListening = listening;
if (listening) { if (listening) {
mPhone.registerTelephonyCallback(mReceiverHandler::post, mTelephonyCallback); mPhone.registerTelephonyCallback(mReceiverHandler::post, mTelephonyCallback);
} else { } else {
@@ -86,10 +83,6 @@ public class MobileStatusTracker {
} }
} }
public boolean isListening() {
return mListening;
}
private void updateDataSim() { private void updateDataSim() {
int activeDataSubId = mDefaults.getActiveDataSubId(); int activeDataSubId = mDefaults.getActiveDataSubId();
if (SubscriptionManager.isValidSubscriptionId(activeDataSubId)) { if (SubscriptionManager.isValidSubscriptionId(activeDataSubId)) {

View File

@@ -134,9 +134,18 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader
mQSCarrierGroupController mQSCarrierGroupController
.setOnSingleCarrierChangedListener(mView::setIsSingleCarrier); .setOnSingleCarrierChangedListener(mView::setIsSingleCarrier);
List<String> rssiIgnoredSlots = List.of( List<String> rssiIgnoredSlots;
getResources().getString(com.android.internal.R.string.status_bar_mobile)
); if (mFeatureFlags.isEnabled(Flags.COMBINED_STATUS_BAR_SIGNAL_ICONS)) {
rssiIgnoredSlots = List.of(
getResources().getString(com.android.internal.R.string.status_bar_no_calling),
getResources().getString(com.android.internal.R.string.status_bar_call_strength)
);
} else {
rssiIgnoredSlots = List.of(
getResources().getString(com.android.internal.R.string.status_bar_mobile)
);
}
mView.onAttach(mIconManager, mQSExpansionPathInterpolator, rssiIgnoredSlots, mView.onAttach(mIconManager, mQSExpansionPathInterpolator, rssiIgnoredSlots,
mInsetsProvider, mFeatureFlags.isEnabled(Flags.COMBINED_QS_HEADERS)); mInsetsProvider, mFeatureFlags.isEnabled(Flags.COMBINED_QS_HEADERS));

View File

@@ -27,6 +27,7 @@ data class CellSignalState(
@JvmField val contentDescription: String? = null, @JvmField val contentDescription: String? = null,
@JvmField val typeContentDescription: String? = null, @JvmField val typeContentDescription: String? = null,
@JvmField val roaming: Boolean = false, @JvmField val roaming: Boolean = false,
@JvmField val providerModelBehavior: Boolean = false
) { ) {
/** /**
* Changes the visibility of this state by returning a copy with the visibility changed. * Changes the visibility of this state by returning a copy with the visibility changed.
@@ -40,4 +41,4 @@ data class CellSignalState(
if (this.visible == visible) return this if (this.visible == visible) return this
else return copy(visible = visible) else return copy(visible = visible)
} }
} }

View File

@@ -45,7 +45,7 @@ public class QSCarrier extends LinearLayout {
private View mSpacer; private View mSpacer;
@Nullable @Nullable
private CellSignalState mLastSignalState; private CellSignalState mLastSignalState;
private boolean mMobileSignalInitialized = false; private boolean mProviderModelInitialized = false;
private boolean mIsSingleCarrier; private boolean mIsSingleCarrier;
public QSCarrier(Context context) { public QSCarrier(Context context) {
@@ -96,25 +96,35 @@ public class QSCarrier extends LinearLayout {
mMobileRoaming.setImageTintList(colorStateList); mMobileRoaming.setImageTintList(colorStateList);
mMobileSignal.setImageTintList(colorStateList); mMobileSignal.setImageTintList(colorStateList);
if (!mMobileSignalInitialized) { if (state.providerModelBehavior) {
mMobileSignalInitialized = true; if (!mProviderModelInitialized) {
mMobileSignal.setImageDrawable(new SignalDrawable(mContext)); mProviderModelInitialized = true;
mMobileSignal.setImageDrawable(
mContext.getDrawable(R.drawable.ic_qs_no_calling_sms));
}
mMobileSignal.setImageDrawable(mContext.getDrawable(state.mobileSignalIconId));
mMobileSignal.setContentDescription(state.contentDescription);
} else {
if (!mProviderModelInitialized) {
mProviderModelInitialized = true;
mMobileSignal.setImageDrawable(new SignalDrawable(mContext));
}
mMobileSignal.setImageLevel(state.mobileSignalIconId);
StringBuilder contentDescription = new StringBuilder();
if (state.contentDescription != null) {
contentDescription.append(state.contentDescription).append(", ");
}
if (state.roaming) {
contentDescription
.append(mContext.getString(R.string.data_connection_roaming))
.append(", ");
}
// TODO: show mobile data off/no internet text for 5 seconds before carrier text
if (hasValidTypeContentDescription(state.typeContentDescription)) {
contentDescription.append(state.typeContentDescription);
}
mMobileSignal.setContentDescription(contentDescription);
} }
mMobileSignal.setImageLevel(state.mobileSignalIconId);
StringBuilder contentDescription = new StringBuilder();
if (state.contentDescription != null) {
contentDescription.append(state.contentDescription).append(", ");
}
if (state.roaming) {
contentDescription
.append(mContext.getString(R.string.data_connection_roaming))
.append(", ");
}
// TODO: show mobile data off/no internet text for 5 seconds before carrier text
if (hasValidTypeContentDescription(state.typeContentDescription)) {
contentDescription.append(state.typeContentDescription);
}
mMobileSignal.setContentDescription(contentDescription);
} }
return true; return true;
} }

View File

@@ -42,7 +42,10 @@ import com.android.systemui.R;
import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.connectivity.IconState;
import com.android.systemui.statusbar.connectivity.MobileDataIndicators; import com.android.systemui.statusbar.connectivity.MobileDataIndicators;
import com.android.systemui.statusbar.connectivity.NetworkController; import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.SignalCallback; import com.android.systemui.statusbar.connectivity.SignalCallback;
@@ -75,6 +78,7 @@ public class QSCarrierGroupController {
private QSCarrier[] mCarrierGroups = new QSCarrier[SIM_SLOTS]; private QSCarrier[] mCarrierGroups = new QSCarrier[SIM_SLOTS];
private int[] mLastSignalLevel = new int[SIM_SLOTS]; private int[] mLastSignalLevel = new int[SIM_SLOTS];
private String[] mLastSignalLevelDescription = new String[SIM_SLOTS]; private String[] mLastSignalLevelDescription = new String[SIM_SLOTS];
private final boolean mProviderModel;
private final CarrierConfigTracker mCarrierConfigTracker; private final CarrierConfigTracker mCarrierConfigTracker;
private boolean mIsSingleCarrier; private boolean mIsSingleCarrier;
@@ -86,6 +90,9 @@ public class QSCarrierGroupController {
private final SignalCallback mSignalCallback = new SignalCallback() { private final SignalCallback mSignalCallback = new SignalCallback() {
@Override @Override
public void setMobileDataIndicators(@NonNull MobileDataIndicators indicators) { public void setMobileDataIndicators(@NonNull MobileDataIndicators indicators) {
if (mProviderModel) {
return;
}
int slotIndex = getSlotIndex(indicators.subId); int slotIndex = getSlotIndex(indicators.subId);
if (slotIndex >= SIM_SLOTS) { if (slotIndex >= SIM_SLOTS) {
Log.w(TAG, "setMobileDataIndicators - slot: " + slotIndex); Log.w(TAG, "setMobileDataIndicators - slot: " + slotIndex);
@@ -100,11 +107,90 @@ public class QSCarrierGroupController {
indicators.statusIcon.icon, indicators.statusIcon.icon,
indicators.statusIcon.contentDescription, indicators.statusIcon.contentDescription,
indicators.typeContentDescription.toString(), indicators.typeContentDescription.toString(),
indicators.roaming indicators.roaming,
mProviderModel
); );
mMainHandler.obtainMessage(H.MSG_UPDATE_STATE).sendToTarget(); mMainHandler.obtainMessage(H.MSG_UPDATE_STATE).sendToTarget();
} }
@Override
public void setCallIndicator(@NonNull IconState statusIcon, int subId) {
if (!mProviderModel) {
return;
}
int slotIndex = getSlotIndex(subId);
if (slotIndex >= SIM_SLOTS) {
Log.w(TAG, "setMobileDataIndicators - slot: " + slotIndex);
return;
}
if (slotIndex == SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
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,
statusIcon.icon,
statusIcon.contentDescription,
"",
false,
mProviderModel);
} else {
// Whenever the no Calling & SMS state is cleared, switched to the last
// known call strength icon.
if (displayCallStrengthIcon) {
mInfos[slotIndex] = new CellSignalState(
true,
mLastSignalLevel[slotIndex],
mLastSignalLevelDescription[slotIndex],
"",
false,
mProviderModel);
} else {
mInfos[slotIndex] = new CellSignalState(
true,
R.drawable.ic_qs_sim_card,
"",
"",
false,
mProviderModel);
}
}
mMainHandler.obtainMessage(H.MSG_UPDATE_STATE).sendToTarget();
} else {
mLastSignalLevel[slotIndex] = statusIcon.icon;
mLastSignalLevelDescription[slotIndex] = statusIcon.contentDescription;
// Only Shows the call strength icon when the no Calling & SMS icon is not
// shown.
if (mInfos[slotIndex].mobileSignalIconId
!= R.drawable.ic_qs_no_calling_sms) {
if (displayCallStrengthIcon) {
mInfos[slotIndex] = new CellSignalState(
true,
statusIcon.icon,
statusIcon.contentDescription,
"",
false,
mProviderModel);
} else {
mInfos[slotIndex] = new CellSignalState(
true,
R.drawable.ic_qs_sim_card,
"",
"",
false,
mProviderModel);
}
mMainHandler.obtainMessage(H.MSG_UPDATE_STATE).sendToTarget();
}
}
}
@Override @Override
public void setNoSims(boolean hasNoSims, boolean simDetected) { public void setNoSims(boolean hasNoSims, boolean simDetected) {
if (hasNoSims) { if (hasNoSims) {
@@ -133,8 +219,14 @@ public class QSCarrierGroupController {
@Background Handler bgHandler, @Main Looper mainLooper, @Background Handler bgHandler, @Main Looper mainLooper,
NetworkController networkController, NetworkController networkController,
CarrierTextManager.Builder carrierTextManagerBuilder, Context context, CarrierTextManager.Builder carrierTextManagerBuilder, Context context,
CarrierConfigTracker carrierConfigTracker, SlotIndexResolver slotIndexResolver) { CarrierConfigTracker carrierConfigTracker, FeatureFlags featureFlags,
SlotIndexResolver slotIndexResolver) {
if (featureFlags.isEnabled(Flags.COMBINED_STATUS_BAR_SIGNAL_ICONS)) {
mProviderModel = true;
} else {
mProviderModel = false;
}
mActivityStarter = activityStarter; mActivityStarter = activityStarter;
mBgHandler = bgHandler; mBgHandler = bgHandler;
mNetworkController = networkController; mNetworkController = networkController;
@@ -170,7 +262,8 @@ public class QSCarrierGroupController {
R.drawable.ic_qs_no_calling_sms, R.drawable.ic_qs_no_calling_sms,
context.getText(AccessibilityContentDescriptions.NO_CALLING).toString(), context.getText(AccessibilityContentDescriptions.NO_CALLING).toString(),
"", "",
false); false,
mProviderModel);
mLastSignalLevel[i] = TelephonyIcons.MOBILE_CALL_STRENGTH_ICONS[0]; mLastSignalLevel[i] = TelephonyIcons.MOBILE_CALL_STRENGTH_ICONS[0];
mLastSignalLevelDescription[i] = mLastSignalLevelDescription[i] =
context.getText(AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0]) context.getText(AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0])
@@ -258,7 +351,8 @@ public class QSCarrierGroupController {
for (int i = 0; i < SIM_SLOTS; i++) { for (int i = 0; i < SIM_SLOTS; i++) {
if (mInfos[i].visible if (mInfos[i].visible
&& mInfos[i].mobileSignalIconId == R.drawable.ic_qs_sim_card) { && mInfos[i].mobileSignalIconId == R.drawable.ic_qs_sim_card) {
mInfos[i] = new CellSignalState(true, R.drawable.ic_blank, "", "", false); mInfos[i] = new CellSignalState(true, R.drawable.ic_blank, "", "", false,
mProviderModel);
} }
} }
} }
@@ -376,13 +470,15 @@ public class QSCarrierGroupController {
private final CarrierTextManager.Builder mCarrierTextControllerBuilder; private final CarrierTextManager.Builder mCarrierTextControllerBuilder;
private final Context mContext; private final Context mContext;
private final CarrierConfigTracker mCarrierConfigTracker; private final CarrierConfigTracker mCarrierConfigTracker;
private final FeatureFlags mFeatureFlags;
private final SlotIndexResolver mSlotIndexResolver; private final SlotIndexResolver mSlotIndexResolver;
@Inject @Inject
public Builder(ActivityStarter activityStarter, @Background Handler handler, public Builder(ActivityStarter activityStarter, @Background Handler handler,
@Main Looper looper, NetworkController networkController, @Main Looper looper, NetworkController networkController,
CarrierTextManager.Builder carrierTextControllerBuilder, Context context, CarrierTextManager.Builder carrierTextControllerBuilder, Context context,
CarrierConfigTracker carrierConfigTracker, SlotIndexResolver slotIndexResolver) { CarrierConfigTracker carrierConfigTracker, FeatureFlags featureFlags,
SlotIndexResolver slotIndexResolver) {
mActivityStarter = activityStarter; mActivityStarter = activityStarter;
mHandler = handler; mHandler = handler;
mLooper = looper; mLooper = looper;
@@ -390,6 +486,7 @@ public class QSCarrierGroupController {
mCarrierTextControllerBuilder = carrierTextControllerBuilder; mCarrierTextControllerBuilder = carrierTextControllerBuilder;
mContext = context; mContext = context;
mCarrierConfigTracker = carrierConfigTracker; mCarrierConfigTracker = carrierConfigTracker;
mFeatureFlags = featureFlags;
mSlotIndexResolver = slotIndexResolver; mSlotIndexResolver = slotIndexResolver;
} }
@@ -401,7 +498,7 @@ public class QSCarrierGroupController {
public QSCarrierGroupController build() { public QSCarrierGroupController build() {
return new QSCarrierGroupController(mView, mActivityStarter, mHandler, mLooper, return new QSCarrierGroupController(mView, mActivityStarter, mHandler, mLooper,
mNetworkController, mCarrierTextControllerBuilder, mContext, mNetworkController, mCarrierTextControllerBuilder, mContext,
mCarrierConfigTracker, mSlotIndexResolver); mCarrierConfigTracker, mFeatureFlags, mSlotIndexResolver);
} }
} }

View File

@@ -778,8 +778,7 @@ public class InternetDialogController implements AccessPointController.AccessPoi
return; return;
} }
mTelephonyManager.setDataEnabledForReason( mTelephonyManager.setDataEnabled(enabled);
TelephonyManager.DATA_ENABLED_REASON_USER, enabled);
if (disableOtherSubscriptions) { if (disableOtherSubscriptions) {
final List<SubscriptionInfo> subInfoList = final List<SubscriptionInfo> subInfoList =
mSubscriptionManager.getActiveSubscriptionInfoList(); mSubscriptionManager.getActiveSubscriptionInfoList();

View File

@@ -26,17 +26,25 @@ import android.net.NetworkCapabilities;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.provider.Settings.Global; import android.provider.Settings.Global;
import android.telephony.AccessNetworkConstants;
import android.telephony.CellSignalStrength; import android.telephony.CellSignalStrength;
import android.telephony.CellSignalStrengthCdma; import android.telephony.CellSignalStrengthCdma;
import android.telephony.ServiceState;
import android.telephony.SignalStrength; import android.telephony.SignalStrength;
import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.telephony.ims.ImsException;
import android.telephony.ims.ImsMmTelManager;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.ImsRegistrationAttributes;
import android.telephony.ims.RegistrationManager.RegistrationCallback;
import android.text.Html; import android.text.Html;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.AccessibilityContentDescriptions;
import com.android.settingslib.SignalIcon.MobileIconGroup; import com.android.settingslib.SignalIcon.MobileIconGroup;
import com.android.settingslib.graph.SignalDrawable; import com.android.settingslib.graph.SignalDrawable;
import com.android.settingslib.mobile.MobileMappings.Config; import com.android.settingslib.mobile.MobileMappings.Config;
@@ -46,6 +54,8 @@ import com.android.settingslib.mobile.MobileStatusTracker.SubscriptionDefaults;
import com.android.settingslib.mobile.TelephonyIcons; import com.android.settingslib.mobile.TelephonyIcons;
import com.android.settingslib.net.SignalStrengthUtil; import com.android.settingslib.net.SignalStrengthUtil;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.util.CarrierConfigTracker; import com.android.systemui.util.CarrierConfigTracker;
import java.io.PrintWriter; import java.io.PrintWriter;
@@ -60,22 +70,33 @@ import java.util.Map;
public class MobileSignalController extends SignalController<MobileState, MobileIconGroup> { public class MobileSignalController extends SignalController<MobileState, MobileIconGroup> {
private static final SimpleDateFormat SSDF = new SimpleDateFormat("MM-dd HH:mm:ss.SSS"); private static final SimpleDateFormat SSDF = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
private static final int STATUS_HISTORY_SIZE = 64; private static final int STATUS_HISTORY_SIZE = 64;
private static final int IMS_TYPE_WWAN = 1;
private static final int IMS_TYPE_WLAN = 2;
private static final int IMS_TYPE_WLAN_CROSS_SIM = 3;
private final TelephonyManager mPhone; private final TelephonyManager mPhone;
private final CarrierConfigTracker mCarrierConfigTracker; private final CarrierConfigTracker mCarrierConfigTracker;
private final ImsMmTelManager mImsMmTelManager;
private final SubscriptionDefaults mDefaults; private final SubscriptionDefaults mDefaults;
private final String mNetworkNameDefault; private final String mNetworkNameDefault;
private final String mNetworkNameSeparator; private final String mNetworkNameSeparator;
private final ContentObserver mObserver; private final ContentObserver mObserver;
private final boolean mProviderModelBehavior;
private final Handler mReceiverHandler;
private int mImsType = IMS_TYPE_WWAN;
// Save entire info for logging, we only use the id. // Save entire info for logging, we only use the id.
final SubscriptionInfo mSubscriptionInfo; final SubscriptionInfo mSubscriptionInfo;
private Map<String, MobileIconGroup> mNetworkToIconLookup; private Map<String, MobileIconGroup> mNetworkToIconLookup;
private int mLastLevel;
private MobileIconGroup mDefaultIcons; private MobileIconGroup mDefaultIcons;
private Config mConfig; private Config mConfig;
@VisibleForTesting @VisibleForTesting
boolean mInflateSignalStrengths = false; boolean mInflateSignalStrengths = false;
private int mLastWwanLevel;
private int mLastWlanLevel;
private int mLastWlanCrossSimLevel;
@VisibleForTesting @VisibleForTesting
final MobileStatusTracker mMobileStatusTracker; MobileStatusTracker mMobileStatusTracker;
// Save the previous STATUS_HISTORY_SIZE states for logging. // Save the previous STATUS_HISTORY_SIZE states for logging.
private final String[] mMobileStatusHistory = new String[STATUS_HISTORY_SIZE]; private final String[] mMobileStatusHistory = new String[STATUS_HISTORY_SIZE];
@@ -112,6 +133,52 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
} }
}; };
private final RegistrationCallback mRegistrationCallback = new RegistrationCallback() {
@Override
public void onRegistered(ImsRegistrationAttributes attributes) {
Log.d(mTag, "onRegistered: " + "attributes=" + attributes);
int imsTransportType = attributes.getTransportType();
int registrationAttributes = attributes.getAttributeFlags();
if (imsTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
mImsType = IMS_TYPE_WWAN;
IconState statusIcon = new IconState(
true,
getCallStrengthIcon(mLastWwanLevel, /* isWifi= */false),
getCallStrengthDescription(mLastWwanLevel, /* isWifi= */false));
notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId());
} else if (imsTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
if (registrationAttributes == 0) {
mImsType = IMS_TYPE_WLAN;
IconState statusIcon = new IconState(
true,
getCallStrengthIcon(mLastWlanLevel, /* isWifi= */true),
getCallStrengthDescription(mLastWlanLevel, /* isWifi= */true));
notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId());
} else if (registrationAttributes
== ImsRegistrationAttributes.ATTR_EPDG_OVER_CELL_INTERNET) {
mImsType = IMS_TYPE_WLAN_CROSS_SIM;
IconState statusIcon = new IconState(
true,
getCallStrengthIcon(mLastWlanCrossSimLevel, /* isWifi= */false),
getCallStrengthDescription(
mLastWlanCrossSimLevel, /* isWifi= */false));
notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId());
}
}
}
@Override
public void onUnregistered(ImsReasonInfo info) {
Log.d(mTag, "onDeregistered: " + "info=" + info);
mImsType = IMS_TYPE_WWAN;
IconState statusIcon = new IconState(
true,
getCallStrengthIcon(mLastWwanLevel, /* isWifi= */false),
getCallStrengthDescription(mLastWwanLevel, /* isWifi= */false));
notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId());
}
};
// TODO: Reduce number of vars passed in, if we have the NetworkController, probably don't // TODO: Reduce number of vars passed in, if we have the NetworkController, probably don't
// need listener lists anymore. // need listener lists anymore.
public MobileSignalController( public MobileSignalController(
@@ -125,7 +192,7 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
SubscriptionDefaults defaults, SubscriptionDefaults defaults,
Looper receiverLooper, Looper receiverLooper,
CarrierConfigTracker carrierConfigTracker, CarrierConfigTracker carrierConfigTracker,
MobileStatusTrackerFactory mobileStatusTrackerFactory FeatureFlags featureFlags
) { ) {
super("MobileSignalController(" + info.getSubscriptionId() + ")", context, super("MobileSignalController(" + info.getSubscriptionId() + ")", context,
NetworkCapabilities.TRANSPORT_CELLULAR, callbackHandler, NetworkCapabilities.TRANSPORT_CELLULAR, callbackHandler,
@@ -139,6 +206,7 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
R.string.status_bar_network_name_separator).toString(); R.string.status_bar_network_name_separator).toString();
mNetworkNameDefault = getTextIfExists( mNetworkNameDefault = getTextIfExists(
com.android.internal.R.string.lockscreen_carrier_default).toString(); com.android.internal.R.string.lockscreen_carrier_default).toString();
mReceiverHandler = new Handler(receiverLooper);
mNetworkToIconLookup = mapIconSets(mConfig); mNetworkToIconLookup = mapIconSets(mConfig);
mDefaultIcons = getDefaultIcons(mConfig); mDefaultIcons = getDefaultIcons(mConfig);
@@ -155,7 +223,10 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
updateTelephony(); updateTelephony();
} }
}; };
mMobileStatusTracker = mobileStatusTrackerFactory.createTracker(mMobileCallback); mImsMmTelManager = ImsMmTelManager.createForSubscriptionId(info.getSubscriptionId());
mMobileStatusTracker = new MobileStatusTracker(mPhone, receiverLooper,
info, mDefaults, mMobileCallback);
mProviderModelBehavior = featureFlags.isEnabled(Flags.COMBINED_STATUS_BAR_SIGNAL_ICONS);
} }
void setConfiguration(Config config) { void setConfiguration(Config config) {
@@ -200,14 +271,41 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
mContext.getContentResolver().registerContentObserver(Global.getUriFor( mContext.getContentResolver().registerContentObserver(Global.getUriFor(
Global.MOBILE_DATA + mSubscriptionInfo.getSubscriptionId()), Global.MOBILE_DATA + mSubscriptionInfo.getSubscriptionId()),
true, mObserver); true, mObserver);
if (mProviderModelBehavior) {
mReceiverHandler.post(mTryRegisterIms);
}
} }
// There is no listener to monitor whether the IMS service is ready, so we have to retry the
// IMS registration.
private final Runnable mTryRegisterIms = new Runnable() {
private static final int MAX_RETRY = 12;
private int mRetryCount;
@Override
public void run() {
try {
mRetryCount++;
mImsMmTelManager.registerImsRegistrationCallback(
mReceiverHandler::post, mRegistrationCallback);
Log.d(mTag, "registerImsRegistrationCallback succeeded");
} catch (RuntimeException | ImsException e) {
if (mRetryCount < MAX_RETRY) {
Log.e(mTag, mRetryCount + " registerImsRegistrationCallback failed", e);
// Wait for 5 seconds to retry
mReceiverHandler.postDelayed(mTryRegisterIms, 5000);
}
}
}
};
/** /**
* Stop listening for phone state changes. * Stop listening for phone state changes.
*/ */
public void unregisterListener() { public void unregisterListener() {
mMobileStatusTracker.setListening(false); mMobileStatusTracker.setListening(false);
mContext.getContentResolver().unregisterContentObserver(mObserver); mContext.getContentResolver().unregisterContentObserver(mObserver);
mImsMmTelManager.unregisterImsRegistrationCallback(mRegistrationCallback);
} }
private void updateInflateSignalStrength() { private void updateInflateSignalStrength() {
@@ -296,7 +394,7 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
CharSequence qsDescription = null; CharSequence qsDescription = null;
if (mCurrentState.dataSim) { if (mCurrentState.dataSim) {
// only show QS icons if the state is also default // If using provider model behavior, only show QS icons if the state is also default
if (!mCurrentState.isDefault) { if (!mCurrentState.isDefault) {
return new QsInfo(qsTypeIcon, qsIcon, qsDescription); return new QsInfo(qsTypeIcon, qsIcon, qsDescription);
} }
@@ -318,15 +416,32 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
private SbInfo getSbInfo(String contentDescription, int dataTypeIcon) { private SbInfo getSbInfo(String contentDescription, int dataTypeIcon) {
final boolean dataDisabled = mCurrentState.isDataDisabledOrNotDefault(); final boolean dataDisabled = mCurrentState.isDataDisabledOrNotDefault();
IconState statusIcon = new IconState( boolean showTriangle = false;
mCurrentState.enabled && !mCurrentState.airplaneMode, int typeIcon = 0;
getCurrentIconId(), contentDescription); IconState statusIcon = null;
boolean showDataIconInStatusBar = if (mProviderModelBehavior) {
(mCurrentState.dataConnected && mCurrentState.isDefault) || dataDisabled; boolean showDataIconStatusBar = (mCurrentState.dataConnected || dataDisabled)
int typeIcon = && (mCurrentState.dataSim && mCurrentState.isDefault);
(showDataIconInStatusBar || mConfig.alwaysShowDataRatIcon) ? dataTypeIcon : 0; typeIcon =
boolean showTriangle = mCurrentState.enabled && !mCurrentState.airplaneMode; (showDataIconStatusBar || mConfig.alwaysShowDataRatIcon) ? dataTypeIcon : 0;
showDataIconStatusBar |= mCurrentState.roaming;
statusIcon = new IconState(
showDataIconStatusBar && !mCurrentState.airplaneMode,
getCurrentIconId(), contentDescription);
showTriangle = showDataIconStatusBar && !mCurrentState.airplaneMode;
} else {
statusIcon = new IconState(
mCurrentState.enabled && !mCurrentState.airplaneMode,
getCurrentIconId(), contentDescription);
boolean showDataIconInStatusBar =
(mCurrentState.dataConnected && mCurrentState.isDefault) || dataDisabled;
typeIcon =
(showDataIconInStatusBar || mConfig.alwaysShowDataRatIcon) ? dataTypeIcon : 0;
showTriangle = mCurrentState.enabled && !mCurrentState.airplaneMode;
}
return new SbInfo(showTriangle, typeIcon, statusIcon); return new SbInfo(showTriangle, typeIcon, statusIcon);
} }
@@ -445,7 +560,144 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
} }
private void updateMobileStatus(MobileStatus mobileStatus) { private void updateMobileStatus(MobileStatus mobileStatus) {
int lastVoiceState = mCurrentState.getVoiceServiceState();
mCurrentState.setFromMobileStatus(mobileStatus); mCurrentState.setFromMobileStatus(mobileStatus);
notifyMobileLevelChangeIfNecessary(mobileStatus.signalStrength);
if (mProviderModelBehavior) {
maybeNotifyCallStateChanged(lastVoiceState);
}
}
/** Call state changed is only applicable when provider model behavior is true */
private void maybeNotifyCallStateChanged(int lastVoiceState) {
int currentVoiceState = mCurrentState.getVoiceServiceState();
if (lastVoiceState == currentVoiceState) {
return;
}
// 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
// ServiceState.STATE_IN_SERVICE
if (lastVoiceState == -1
|| (lastVoiceState == ServiceState.STATE_IN_SERVICE
|| currentVoiceState == ServiceState.STATE_IN_SERVICE)) {
boolean isNoCalling = mCurrentState.isNoCalling();
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 = mCurrentState.getVoiceServiceState();
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];
}
private String getCallStrengthDescription(int level, boolean isWifi) {
return isWifi
? getTextIfExists(AccessibilityContentDescriptions.WIFI_CONNECTION_STRENGTH[level])
.toString()
: getTextIfExists(AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[level])
.toString();
}
void refreshCallIndicator(SignalCallback callback) {
boolean isNoCalling = mCurrentState.isNoCalling();
isNoCalling &= !hideNoCalling();
IconState statusIcon = new IconState(isNoCalling,
R.drawable.ic_qs_no_calling_sms,
getTextIfExists(AccessibilityContentDescriptions.NO_CALLING).toString());
callback.setCallIndicator(statusIcon, mSubscriptionInfo.getSubscriptionId());
switch (mImsType) {
case IMS_TYPE_WWAN:
statusIcon = new IconState(
true,
getCallStrengthIcon(mLastWwanLevel, /* isWifi= */false),
getCallStrengthDescription(mLastWwanLevel, /* isWifi= */false));
break;
case IMS_TYPE_WLAN:
statusIcon = new IconState(
true,
getCallStrengthIcon(mLastWlanLevel, /* isWifi= */true),
getCallStrengthDescription(mLastWlanLevel, /* isWifi= */true));
break;
case IMS_TYPE_WLAN_CROSS_SIM:
statusIcon = new IconState(
true,
getCallStrengthIcon(mLastWlanCrossSimLevel, /* isWifi= */false),
getCallStrengthDescription(mLastWlanCrossSimLevel, /* isWifi= */false));
}
callback.setCallIndicator(statusIcon, mSubscriptionInfo.getSubscriptionId());
}
void notifyWifiLevelChange(int level) {
if (!mProviderModelBehavior) {
return;
}
mLastWlanLevel = level;
if (mImsType != IMS_TYPE_WLAN) {
return;
}
IconState statusIcon = new IconState(
true,
getCallStrengthIcon(level, /* isWifi= */true),
getCallStrengthDescription(level, /* isWifi= */true));
notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId());
}
void notifyDefaultMobileLevelChange(int level) {
if (!mProviderModelBehavior) {
return;
}
mLastWlanCrossSimLevel = level;
if (mImsType != IMS_TYPE_WLAN_CROSS_SIM) {
return;
}
IconState statusIcon = new IconState(
true,
getCallStrengthIcon(level, /* isWifi= */false),
getCallStrengthDescription(level, /* isWifi= */false));
notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId());
}
void notifyMobileLevelChangeIfNecessary(SignalStrength signalStrength) {
if (!mProviderModelBehavior) {
return;
}
int newLevel = getSignalLevel(signalStrength);
if (newLevel != mLastLevel) {
mLastLevel = newLevel;
mLastWwanLevel = newLevel;
if (mImsType == IMS_TYPE_WWAN) {
IconState statusIcon = new IconState(
true,
getCallStrengthIcon(newLevel, /* isWifi= */false),
getCallStrengthDescription(newLevel, /* isWifi= */false));
notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId());
}
if (mCurrentState.dataSim) {
mNetworkController.notifyDefaultMobileLevelChange(newLevel);
}
}
} }
int getSignalLevel(SignalStrength signalStrength) { int getSignalLevel(SignalStrength signalStrength) {
@@ -549,14 +801,19 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
mMobileStatusHistoryIndex = (mMobileStatusHistoryIndex + 1) % STATUS_HISTORY_SIZE; mMobileStatusHistoryIndex = (mMobileStatusHistoryIndex + 1) % STATUS_HISTORY_SIZE;
} }
@VisibleForTesting
void setImsType(int imsType) {
mImsType = imsType;
}
@Override @Override
public void dump(PrintWriter pw) { public void dump(PrintWriter pw) {
super.dump(pw); super.dump(pw);
pw.println(" mSubscription=" + mSubscriptionInfo + ","); pw.println(" mSubscription=" + mSubscriptionInfo + ",");
pw.println(" mProviderModelBehavior=" + mProviderModelBehavior + ",");
pw.println(" mInflateSignalStrengths=" + mInflateSignalStrengths + ","); pw.println(" mInflateSignalStrengths=" + mInflateSignalStrengths + ",");
pw.println(" isDataDisabled=" + isDataDisabled() + ","); pw.println(" isDataDisabled=" + isDataDisabled() + ",");
pw.println(" mNetworkToIconLookup=" + mNetworkToIconLookup + ","); pw.println(" mNetworkToIconLookup=" + mNetworkToIconLookup + ",");
pw.println(" mMobileStatusTracker.isListening=" + mMobileStatusTracker.isListening());
pw.println(" MobileStatusHistory"); pw.println(" MobileStatusHistory");
int size = 0; int size = 0;
for (int i = 0; i < STATUS_HISTORY_SIZE; i++) { for (int i = 0; i < STATUS_HISTORY_SIZE; i++) {
@@ -586,11 +843,6 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
icon = iconState; icon = iconState;
description = desc; description = desc;
} }
@Override
public String toString() {
return "QsInfo: ratTypeIcon=" + ratTypeIcon + " icon=" + icon;
}
} }
/** Box for status bar icon info */ /** Box for status bar icon info */
@@ -604,11 +856,5 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
ratTypeIcon = typeIcon; ratTypeIcon = typeIcon;
icon = iconState; icon = iconState;
} }
@Override
public String toString() {
return "SbInfo: showTriangle=" + showTriangle + " ratTypeIcon=" + ratTypeIcon
+ " icon=" + icon;
}
} }
} }

View File

@@ -1,64 +0,0 @@
/*
* Copyright (C) 2022 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.statusbar.connectivity
import android.content.Context
import android.os.Looper
import android.telephony.SubscriptionInfo
import android.telephony.TelephonyManager
import com.android.settingslib.mobile.MobileMappings
import com.android.settingslib.mobile.MobileStatusTracker
import com.android.systemui.util.CarrierConfigTracker
import javax.inject.Inject
/**
* Factory to make MobileSignalController injectable
*/
internal class MobileSignalControllerFactory @Inject constructor(
val context: Context,
val callbackHandler: CallbackHandler,
val carrierConfigTracker: CarrierConfigTracker,
) {
fun createMobileSignalController(
config: MobileMappings.Config,
hasMobileData: Boolean,
phone: TelephonyManager,
networkController: NetworkControllerImpl,
subscriptionInfo: SubscriptionInfo,
subscriptionDefaults: MobileStatusTracker.SubscriptionDefaults,
receiverLooper: Looper,
): MobileSignalController {
val mobileTrackerFactory = MobileStatusTrackerFactory(
phone,
receiverLooper,
subscriptionInfo,
subscriptionDefaults)
return MobileSignalController(
context,
config,
hasMobileData,
phone,
callbackHandler,
networkController,
subscriptionInfo,
subscriptionDefaults,
receiverLooper,
carrierConfigTracker,
mobileTrackerFactory,
)
}
}

View File

@@ -1,42 +0,0 @@
/*
* Copyright (C) 2022 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.statusbar.connectivity
import android.os.Looper
import android.telephony.SubscriptionInfo
import android.telephony.TelephonyManager
import com.android.settingslib.mobile.MobileStatusTracker
/**
* Factory for [MobileStatusTracker], which lives in SettingsLib
*/
class MobileStatusTrackerFactory (
val phone: TelephonyManager,
val receiverLooper: Looper,
val info: SubscriptionInfo,
val defaults: MobileStatusTracker.SubscriptionDefaults,
) {
fun createTracker(
callback: MobileStatusTracker.Callback
): MobileStatusTracker {
return MobileStatusTracker(
phone,
receiverLooper,
info,
defaults,
callback)
}
}

View File

@@ -71,6 +71,8 @@ import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.demomode.DemoMode; import com.android.systemui.demomode.DemoMode;
import com.android.systemui.demomode.DemoModeController; import com.android.systemui.demomode.DemoModeController;
import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.log.LogBuffer; import com.android.systemui.log.LogBuffer;
import com.android.systemui.log.LogLevel; import com.android.systemui.log.LogLevel;
import com.android.systemui.log.dagger.StatusBarNetworkControllerLog; import com.android.systemui.log.dagger.StatusBarNetworkControllerLog;
@@ -132,11 +134,12 @@ public class NetworkControllerImpl extends BroadcastReceiver
private final BroadcastDispatcher mBroadcastDispatcher; private final BroadcastDispatcher mBroadcastDispatcher;
private final DemoModeController mDemoModeController; private final DemoModeController mDemoModeController;
private final Object mLock = new Object(); private final Object mLock = new Object();
private final boolean mProviderModelBehavior;
private Config mConfig; private Config mConfig;
private final CarrierConfigTracker mCarrierConfigTracker; private final CarrierConfigTracker mCarrierConfigTracker;
private final FeatureFlags mFeatureFlags;
private final DumpManager mDumpManager; private final DumpManager mDumpManager;
private final LogBuffer mLogBuffer; private final LogBuffer mLogBuffer;
private final MobileSignalControllerFactory mMobileFactory;
private TelephonyCallback.ActiveDataSubscriptionIdListener mPhoneStateListener; private TelephonyCallback.ActiveDataSubscriptionIdListener mPhoneStateListener;
private int mActiveMobileDataSubscription = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private int mActiveMobileDataSubscription = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -232,9 +235,9 @@ public class NetworkControllerImpl extends BroadcastReceiver
DemoModeController demoModeController, DemoModeController demoModeController,
CarrierConfigTracker carrierConfigTracker, CarrierConfigTracker carrierConfigTracker,
WifiStatusTrackerFactory trackerFactory, WifiStatusTrackerFactory trackerFactory,
MobileSignalControllerFactory mobileFactory,
@Main Handler handler, @Main Handler handler,
InternetDialogFactory internetDialogFactory, InternetDialogFactory internetDialogFactory,
FeatureFlags featureFlags,
DumpManager dumpManager, DumpManager dumpManager,
@StatusBarNetworkControllerLog LogBuffer logBuffer) { @StatusBarNetworkControllerLog LogBuffer logBuffer) {
this(context, connectivityManager, this(context, connectivityManager,
@@ -254,8 +257,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
demoModeController, demoModeController,
carrierConfigTracker, carrierConfigTracker,
trackerFactory, trackerFactory,
mobileFactory,
handler, handler,
featureFlags,
dumpManager, dumpManager,
logBuffer); logBuffer);
mReceiverHandler.post(mRegisterListeners); mReceiverHandler.post(mRegisterListeners);
@@ -280,8 +283,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
DemoModeController demoModeController, DemoModeController demoModeController,
CarrierConfigTracker carrierConfigTracker, CarrierConfigTracker carrierConfigTracker,
WifiStatusTrackerFactory trackerFactory, WifiStatusTrackerFactory trackerFactory,
MobileSignalControllerFactory mobileFactory,
@Main Handler handler, @Main Handler handler,
FeatureFlags featureFlags,
DumpManager dumpManager, DumpManager dumpManager,
LogBuffer logBuffer LogBuffer logBuffer
) { ) {
@@ -295,7 +298,6 @@ public class NetworkControllerImpl extends BroadcastReceiver
mCallbackHandler = callbackHandler; mCallbackHandler = callbackHandler;
mDataSaverController = new DataSaverControllerImpl(context); mDataSaverController = new DataSaverControllerImpl(context);
mBroadcastDispatcher = broadcastDispatcher; mBroadcastDispatcher = broadcastDispatcher;
mMobileFactory = mobileFactory;
mSubscriptionManager = subManager; mSubscriptionManager = subManager;
mSubDefaults = defaultsHandler; mSubDefaults = defaultsHandler;
@@ -303,6 +305,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
mHasMobileDataFeature = telephonyManager.isDataCapable(); mHasMobileDataFeature = telephonyManager.isDataCapable();
mDemoModeController = demoModeController; mDemoModeController = demoModeController;
mCarrierConfigTracker = carrierConfigTracker; mCarrierConfigTracker = carrierConfigTracker;
mFeatureFlags = featureFlags;
mDumpManager = dumpManager; mDumpManager = dumpManager;
mLogBuffer = logBuffer; mLogBuffer = logBuffer;
@@ -454,6 +457,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
}; };
mDemoModeController.addCallback(this); mDemoModeController.addCallback(this);
mProviderModelBehavior = mFeatureFlags.isEnabled(Flags.COMBINED_STATUS_BAR_SIGNAL_ICONS);
mDumpManager.registerDumpable(TAG, this); mDumpManager.registerDumpable(TAG, this);
} }
@@ -494,16 +498,16 @@ public class NetworkControllerImpl extends BroadcastReceiver
// broadcasts // broadcasts
IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter();
filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
filter.addAction(Intent.ACTION_SERVICE_STATE);
filter.addAction(Intent.ACTION_SIM_STATE_CHANGED); filter.addAction(Intent.ACTION_SIM_STATE_CHANGED);
filter.addAction(Settings.Panel.ACTION_INTERNET_CONNECTIVITY);
filter.addAction(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED); filter.addAction(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED);
filter.addAction(TelephonyManager.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED); filter.addAction(TelephonyManager.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED);
filter.addAction(Intent.ACTION_SERVICE_STATE);
filter.addAction(TelephonyManager.ACTION_SERVICE_PROVIDERS_UPDATED); filter.addAction(TelephonyManager.ACTION_SERVICE_PROVIDERS_UPDATED);
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
filter.addAction(Settings.Panel.ACTION_INTERNET_CONNECTIVITY);
mBroadcastDispatcher.registerReceiverWithHandler(this, filter, mReceiverHandler); mBroadcastDispatcher.registerReceiverWithHandler(this, filter, mReceiverHandler);
mListening = true; mListening = true;
@@ -656,6 +660,20 @@ public class NetworkControllerImpl extends BroadcastReceiver
return controller != null ? controller.getNetworkNameForCarrierWiFi() : ""; return controller != null ? controller.getNetworkNameForCarrierWiFi() : "";
} }
void notifyWifiLevelChange(int level) {
for (int i = 0; i < mMobileSignalControllers.size(); i++) {
MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i);
mobileSignalController.notifyWifiLevelChange(level);
}
}
void notifyDefaultMobileLevelChange(int level) {
for (int i = 0; i < mMobileSignalControllers.size(); i++) {
MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i);
mobileSignalController.notifyDefaultMobileLevelChange(level);
}
}
private void notifyControllersMobileDataChanged() { private void notifyControllersMobileDataChanged() {
for (int i = 0; i < mMobileSignalControllers.size(); i++) { for (int i = 0; i < mMobileSignalControllers.size(); i++) {
MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i); MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i);
@@ -728,6 +746,9 @@ public class NetworkControllerImpl extends BroadcastReceiver
for (int i = 0; i < mMobileSignalControllers.size(); i++) { for (int i = 0; i < mMobileSignalControllers.size(); i++) {
MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i); MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i);
mobileSignalController.notifyListeners(cb); mobileSignalController.notifyListeners(cb);
if (mProviderModelBehavior) {
mobileSignalController.refreshCallIndicator(cb);
}
} }
mCallbackHandler.setListening(cb, true); mCallbackHandler.setListening(cb, true);
} }
@@ -842,6 +863,9 @@ public class NetworkControllerImpl extends BroadcastReceiver
for (int i = 0; i < mMobileSignalControllers.size(); i++) { for (int i = 0; i < mMobileSignalControllers.size(); i++) {
MobileSignalController controller = mMobileSignalControllers.valueAt(i); MobileSignalController controller = mMobileSignalControllers.valueAt(i);
controller.setConfiguration(mConfig); controller.setConfiguration(mConfig);
if (mProviderModelBehavior) {
controller.refreshCallIndicator(mCallbackHandler);
}
} }
refreshLocale(); refreshLocale();
} }
@@ -958,15 +982,11 @@ public class NetworkControllerImpl extends BroadcastReceiver
mMobileSignalControllers.put(subId, cachedControllers.get(subId)); mMobileSignalControllers.put(subId, cachedControllers.get(subId));
cachedControllers.remove(subId); cachedControllers.remove(subId);
} else { } else {
MobileSignalController controller = mMobileFactory.createMobileSignalController( MobileSignalController controller = new MobileSignalController(mContext, mConfig,
mConfig, mHasMobileDataFeature, mPhone.createForSubscriptionId(subId),
mHasMobileDataFeature, mCallbackHandler, this, subscriptions.get(i),
mPhone.createForSubscriptionId(subId), mSubDefaults, mReceiverHandler.getLooper(), mCarrierConfigTracker,
this, mFeatureFlags);
subscriptions.get(i),
mSubDefaults,
mReceiverHandler.getLooper()
);
controller.setUserSetupComplete(mUserSetup); controller.setUserSetupComplete(mUserSetup);
mMobileSignalControllers.put(subId, controller); mMobileSignalControllers.put(subId, controller);
if (subscriptions.get(i).getSimSlotIndex() == 0) { if (subscriptions.get(i).getSimSlotIndex() == 0) {
@@ -1120,11 +1140,24 @@ public class NetworkControllerImpl extends BroadcastReceiver
|| mValidatedTransports.get(NetworkCapabilities.TRANSPORT_ETHERNET); || mValidatedTransports.get(NetworkCapabilities.TRANSPORT_ETHERNET);
pushConnectivityToSignals(); pushConnectivityToSignals();
mNoDefaultNetwork = !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_CELLULAR) if (mProviderModelBehavior) {
&& !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_WIFI) mNoDefaultNetwork = !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_CELLULAR)
&& !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_ETHERNET); && !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_WIFI)
mCallbackHandler.setConnectivityStatus(mNoDefaultNetwork, !mInetCondition, && !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_ETHERNET);
mNoNetworksAvailable); mCallbackHandler.setConnectivityStatus(mNoDefaultNetwork, !mInetCondition,
mNoNetworksAvailable);
for (int i = 0; i < mMobileSignalControllers.size(); i++) {
MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i);
mobileSignalController.updateNoCallingState();
}
notifyAllListeners();
} else {
mNoDefaultNetwork = !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_CELLULAR)
&& !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_WIFI)
&& !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_ETHERNET);
mCallbackHandler.setConnectivityStatus(mNoDefaultNetwork, !mInetCondition,
mNoNetworksAvailable);
}
} }
/** /**
@@ -1314,7 +1347,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
mMobileSignalControllers.clear(); mMobileSignalControllers.clear();
int start = mSubscriptionManager.getActiveSubscriptionInfoCountMax(); int start = mSubscriptionManager.getActiveSubscriptionInfoCountMax();
for (int i = start /* get out of normal index range */; i < start + num; i++) { for (int i = start /* get out of normal index range */; i < start + num; i++) {
subs.add(addDemoModeSignalController(i, i)); subs.add(addSignalController(i, i));
} }
mCallbackHandler.setSubs(subs); mCallbackHandler.setSubs(subs);
for (int i = 0; i < mMobileSignalControllers.size(); i++) { for (int i = 0; i < mMobileSignalControllers.size(); i++) {
@@ -1340,7 +1373,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
List<SubscriptionInfo> subs = new ArrayList<>(); List<SubscriptionInfo> subs = new ArrayList<>();
while (mMobileSignalControllers.size() <= slot) { while (mMobileSignalControllers.size() <= slot) {
int nextSlot = mMobileSignalControllers.size(); int nextSlot = mMobileSignalControllers.size();
subs.add(addDemoModeSignalController(nextSlot, nextSlot)); subs.add(addSignalController(nextSlot, nextSlot));
} }
if (!subs.isEmpty()) { if (!subs.isEmpty()) {
mCallbackHandler.setSubs(subs); mCallbackHandler.setSubs(subs);
@@ -1430,20 +1463,14 @@ public class NetworkControllerImpl extends BroadcastReceiver
mHistoryIndex = (mHistoryIndex + 1) % HISTORY_SIZE; mHistoryIndex = (mHistoryIndex + 1) % HISTORY_SIZE;
} }
private SubscriptionInfo addDemoModeSignalController(int id, int simSlotIndex) { private SubscriptionInfo addSignalController(int id, int simSlotIndex) {
SubscriptionInfo info = new SubscriptionInfo(id, "", simSlotIndex, "", "", 0, 0, "", 0, SubscriptionInfo info = new SubscriptionInfo(id, "", simSlotIndex, "", "", 0, 0, "", 0,
null, null, null, "", false, null, null); null, null, null, "", false, null, null);
MobileSignalController controller = new MobileSignalController(mContext,
MobileSignalController controller = mMobileFactory.createMobileSignalController( mConfig, mHasMobileDataFeature,
mConfig, mPhone.createForSubscriptionId(info.getSubscriptionId()), mCallbackHandler, this,
mHasMobileDataFeature, info, mSubDefaults, mReceiverHandler.getLooper(), mCarrierConfigTracker,
mPhone.createForSubscriptionId(info.getSubscriptionId()), mFeatureFlags);
this,
info,
mSubDefaults,
mReceiverHandler.getLooper()
);
mMobileSignalControllers.put(id, controller); mMobileSignalControllers.put(id, controller);
controller.getState().userSetup = true; controller.getState().userSetup = true;
return info; return info;

View File

@@ -222,6 +222,7 @@ public class WifiSignalController extends SignalController<WifiState, IconGroup>
mCurrentState.connected = mWifiTracker.connected; mCurrentState.connected = mWifiTracker.connected;
mCurrentState.ssid = mWifiTracker.ssid; mCurrentState.ssid = mWifiTracker.ssid;
mCurrentState.rssi = mWifiTracker.rssi; mCurrentState.rssi = mWifiTracker.rssi;
boolean levelChanged = mCurrentState.level != mWifiTracker.level;
mCurrentState.level = mWifiTracker.level; mCurrentState.level = mWifiTracker.level;
mCurrentState.statusLabel = mWifiTracker.statusLabel; mCurrentState.statusLabel = mWifiTracker.statusLabel;
mCurrentState.isCarrierMerged = mWifiTracker.isCarrierMerged; mCurrentState.isCarrierMerged = mWifiTracker.isCarrierMerged;
@@ -229,6 +230,10 @@ public class WifiSignalController extends SignalController<WifiState, IconGroup>
mCurrentState.iconGroup = mCurrentState.iconGroup =
mCurrentState.isCarrierMerged ? mCarrierMergedWifiIconGroup mCurrentState.isCarrierMerged ? mCarrierMergedWifiIconGroup
: mUnmergedWifiIconGroup; : mUnmergedWifiIconGroup;
if (levelChanged) {
mNetworkController.notifyWifiLevelChange(mCurrentState.level);
}
} }
boolean isCarrierMergedWifi(int subId) { boolean isCarrierMergedWifi(int subId) {

View File

@@ -26,6 +26,8 @@ import android.util.Log;
import com.android.settingslib.mobile.TelephonyIcons; import com.android.settingslib.mobile.TelephonyIcons;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.statusbar.connectivity.IconState; import com.android.systemui.statusbar.connectivity.IconState;
import com.android.systemui.statusbar.connectivity.MobileDataIndicators; import com.android.systemui.statusbar.connectivity.MobileDataIndicators;
import com.android.systemui.statusbar.connectivity.NetworkController; import com.android.systemui.statusbar.connectivity.NetworkController;
@@ -64,6 +66,7 @@ public class StatusBarSignalPolicy implements SignalCallback,
private final Handler mHandler = Handler.getMain(); private final Handler mHandler = Handler.getMain();
private final CarrierConfigTracker mCarrierConfigTracker; private final CarrierConfigTracker mCarrierConfigTracker;
private final TunerService mTunerService; private final TunerService mTunerService;
private final FeatureFlags mFeatureFlags;
private boolean mHideAirplane; private boolean mHideAirplane;
private boolean mHideMobile; private boolean mHideMobile;
@@ -87,7 +90,8 @@ public class StatusBarSignalPolicy implements SignalCallback,
CarrierConfigTracker carrierConfigTracker, CarrierConfigTracker carrierConfigTracker,
NetworkController networkController, NetworkController networkController,
SecurityController securityController, SecurityController securityController,
TunerService tunerService TunerService tunerService,
FeatureFlags featureFlags
) { ) {
mContext = context; mContext = context;
@@ -96,6 +100,7 @@ public class StatusBarSignalPolicy implements SignalCallback,
mNetworkController = networkController; mNetworkController = networkController;
mSecurityController = securityController; mSecurityController = securityController;
mTunerService = tunerService; mTunerService = tunerService;
mFeatureFlags = featureFlags;
mSlotAirplane = mContext.getString(com.android.internal.R.string.status_bar_airplane); mSlotAirplane = mContext.getString(com.android.internal.R.string.status_bar_airplane);
mSlotMobile = mContext.getString(com.android.internal.R.string.status_bar_mobile); mSlotMobile = mContext.getString(com.android.internal.R.string.status_bar_mobile);
@@ -372,6 +377,40 @@ public class StatusBarSignalPolicy implements SignalCallback,
// Noop yay! // Noop yay!
} }
@Override
public void setConnectivityStatus(boolean noDefaultNetwork, boolean noValidatedNetwork,
boolean noNetworksAvailable) {
if (!mFeatureFlags.isEnabled(Flags.COMBINED_STATUS_BAR_SIGNAL_ICONS)) {
return;
}
if (DEBUG) {
Log.d(TAG, "setConnectivityStatus: "
+ "noDefaultNetwork = " + noDefaultNetwork + ","
+ "noValidatedNetwork = " + noValidatedNetwork + ","
+ "noNetworksAvailable = " + noNetworksAvailable);
}
WifiIconState newState = mWifiIconState.copy();
newState.noDefaultNetwork = noDefaultNetwork;
newState.noValidatedNetwork = noValidatedNetwork;
newState.noNetworksAvailable = noNetworksAvailable;
newState.slot = mSlotWifi;
newState.airplaneSpacerVisible = mIsAirplaneMode;
if (noDefaultNetwork && noNetworksAvailable && !mIsAirplaneMode) {
newState.visible = true;
newState.resId = R.drawable.ic_qs_no_internet_unavailable;
} else if (noDefaultNetwork && !noNetworksAvailable
&& (!mIsAirplaneMode || (mIsAirplaneMode && mIsWifiEnabled))) {
newState.visible = true;
newState.resId = R.drawable.ic_qs_no_internet_available;
} else {
newState.visible = false;
newState.resId = 0;
}
updateWifiIconWithState(newState);
mWifiIconState = newState;
}
@Override @Override
public void setEthernetIndicators(IconState state) { public void setEthernetIndicators(IconState state) {
boolean visible = state.visible && !mHideEthernet; boolean visible = state.visible && !mHideEthernet;

View File

@@ -26,6 +26,7 @@ import com.android.systemui.battery.BatteryMeterViewController
import com.android.systemui.colorextraction.SysuiColorExtractor import com.android.systemui.colorextraction.SysuiColorExtractor
import com.android.systemui.demomode.DemoModeController import com.android.systemui.demomode.DemoModeController
import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.qs.carrier.QSCarrierGroup import com.android.systemui.qs.carrier.QSCarrierGroup
import com.android.systemui.qs.carrier.QSCarrierGroupController import com.android.systemui.qs.carrier.QSCarrierGroupController
import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
@@ -45,10 +46,10 @@ import org.junit.runner.RunWith
import org.mockito.Answers import org.mockito.Answers
import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Mock import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.Mockito.anyBoolean import org.mockito.Mockito.anyBoolean
import org.mockito.Mockito.reset import org.mockito.Mockito.reset
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations import org.mockito.MockitoAnnotations
@SmallTest @SmallTest
@@ -161,6 +162,7 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() {
@Test @Test
fun testRSSISlot_notCombined() { fun testRSSISlot_notCombined() {
`when`(featureFlags.isEnabled(Flags.COMBINED_STATUS_BAR_SIGNAL_ICONS)).thenReturn(false)
controller.init() controller.init()
val captor = argumentCaptor<List<String>>() val captor = argumentCaptor<List<String>>()
@@ -171,6 +173,20 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() {
) )
} }
@Test
fun testRSSISlot_combined() {
`when`(featureFlags.isEnabled(Flags.COMBINED_STATUS_BAR_SIGNAL_ICONS)).thenReturn(true)
controller.init()
val captor = argumentCaptor<List<String>>()
verify(view).onAttach(any(), any(), capture(captor), any(), anyBoolean())
assertThat(captor.value).containsExactly(
mContext.getString(com.android.internal.R.string.status_bar_no_calling),
mContext.getString(com.android.internal.R.string.status_bar_call_strength)
)
}
@Test @Test
fun testSingleCarrierCallback() { fun testSingleCarrierCallback() {
controller.init() controller.init()

View File

@@ -37,6 +37,7 @@ import android.widget.TextView;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import com.android.keyguard.CarrierTextManager; import com.android.keyguard.CarrierTextManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.connectivity.IconState; import com.android.systemui.statusbar.connectivity.IconState;
import com.android.systemui.statusbar.connectivity.MobileDataIndicators; import com.android.systemui.statusbar.connectivity.MobileDataIndicators;
@@ -79,6 +80,7 @@ public class QSCarrierGroupControllerTest extends LeakCheckedTest {
@Mock @Mock
private QSCarrier mQSCarrier3; private QSCarrier mQSCarrier3;
private TestableLooper mTestableLooper; private TestableLooper mTestableLooper;
@Mock private FeatureFlags mFeatureFlags;
@Mock @Mock
private QSCarrierGroupController.OnSingleCarrierChangedListener mOnSingleCarrierChangedListener; private QSCarrierGroupController.OnSingleCarrierChangedListener mOnSingleCarrierChangedListener;
@@ -118,7 +120,7 @@ public class QSCarrierGroupControllerTest extends LeakCheckedTest {
mQSCarrierGroupController = new QSCarrierGroupController.Builder( mQSCarrierGroupController = new QSCarrierGroupController.Builder(
mActivityStarter, handler, TestableLooper.get(this).getLooper(), mActivityStarter, handler, TestableLooper.get(this).getLooper(),
mNetworkController, mCarrierTextControllerBuilder, mContext, mCarrierConfigTracker, mNetworkController, mCarrierTextControllerBuilder, mContext, mCarrierConfigTracker,
mSlotIndexResolver) mFeatureFlags, mSlotIndexResolver)
.setQSCarrierGroup(mQSCarrierGroup) .setQSCarrierGroup(mQSCarrierGroup)
.build(); .build();

View File

@@ -22,11 +22,13 @@ import static org.junit.Assert.assertTrue;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper; import android.testing.TestableLooper;
import android.util.FeatureFlagUtils;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import com.android.settingslib.graph.SignalDrawable;
import com.android.settingslib.mobile.TelephonyIcons; import com.android.settingslib.mobile.TelephonyIcons;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
@@ -57,14 +59,14 @@ public class QSCarrierTest extends SysuiTestCase {
@Test @Test
public void testUpdateState_first() { public void testUpdateState_first() {
CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false); CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false, false);
assertTrue(mQSCarrier.updateState(c, false)); assertTrue(mQSCarrier.updateState(c, false));
} }
@Test @Test
public void testUpdateState_same() { public void testUpdateState_same() {
CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false); CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false, false);
assertTrue(mQSCarrier.updateState(c, false)); assertTrue(mQSCarrier.updateState(c, false));
assertFalse(mQSCarrier.updateState(c, false)); assertFalse(mQSCarrier.updateState(c, false));
@@ -72,7 +74,7 @@ public class QSCarrierTest extends SysuiTestCase {
@Test @Test
public void testUpdateState_changed() { public void testUpdateState_changed() {
CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false); CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false, false);
assertTrue(mQSCarrier.updateState(c, false)); assertTrue(mQSCarrier.updateState(c, false));
@@ -83,14 +85,14 @@ public class QSCarrierTest extends SysuiTestCase {
@Test @Test
public void testUpdateState_singleCarrier_first() { public void testUpdateState_singleCarrier_first() {
CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false); CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false, false);
assertTrue(mQSCarrier.updateState(c, true)); assertTrue(mQSCarrier.updateState(c, true));
} }
@Test @Test
public void testUpdateState_singleCarrier_noShowIcon() { public void testUpdateState_singleCarrier_noShowIcon() {
CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false); CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false, false);
mQSCarrier.updateState(c, true); mQSCarrier.updateState(c, true);
@@ -99,7 +101,7 @@ public class QSCarrierTest extends SysuiTestCase {
@Test @Test
public void testUpdateState_multiCarrier_showIcon() { public void testUpdateState_multiCarrier_showIcon() {
CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false); CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false, false);
mQSCarrier.updateState(c, false); mQSCarrier.updateState(c, false);
@@ -108,7 +110,7 @@ public class QSCarrierTest extends SysuiTestCase {
@Test @Test
public void testUpdateState_changeSingleMultiSingle() { public void testUpdateState_changeSingleMultiSingle() {
CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false); CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false, false);
mQSCarrier.updateState(c, true); mQSCarrier.updateState(c, true);
assertEquals(View.GONE, mQSCarrier.getRSSIView().getVisibility()); assertEquals(View.GONE, mQSCarrier.getRSSIView().getVisibility());

View File

@@ -70,6 +70,8 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.demomode.DemoModeController; import com.android.systemui.demomode.DemoModeController;
import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.log.LogBuffer; import com.android.systemui.log.LogBuffer;
import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
@@ -125,8 +127,8 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
protected CarrierConfigTracker mCarrierConfigTracker; protected CarrierConfigTracker mCarrierConfigTracker;
protected FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock()); protected FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
protected Handler mMainHandler; protected Handler mMainHandler;
protected FeatureFlags mFeatureFlags;
protected WifiStatusTrackerFactory mWifiStatusTrackerFactory; protected WifiStatusTrackerFactory mWifiStatusTrackerFactory;
protected MobileSignalControllerFactory mMobileFactory;
protected int mSubId; protected int mSubId;
@@ -156,6 +158,9 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
mFeatureFlags = mock(FeatureFlags.class);
when(mFeatureFlags.isEnabled(Flags.COMBINED_STATUS_BAR_SIGNAL_ICONS)).thenReturn(false);
mInstrumentation = InstrumentationRegistry.getInstrumentation(); mInstrumentation = InstrumentationRegistry.getInstrumentation();
Settings.Global.putInt(mContext.getContentResolver(), Global.AIRPLANE_MODE_ON, 0); Settings.Global.putInt(mContext.getContentResolver(), Global.AIRPLANE_MODE_ON, 0);
TestableResources res = mContext.getOrCreateTestableResources(); TestableResources res = mContext.getOrCreateTestableResources();
@@ -219,11 +224,6 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
mWifiStatusTrackerFactory = new WifiStatusTrackerFactory( mWifiStatusTrackerFactory = new WifiStatusTrackerFactory(
mContext, mMockWm, mMockNsm, mMockCm, mMainHandler); mContext, mMockWm, mMockNsm, mMockCm, mMainHandler);
mMobileFactory = new MobileSignalControllerFactory(
mContext,
mCallbackHandler,
mCarrierConfigTracker
);
mNetworkController = new NetworkControllerImpl(mContext, mNetworkController = new NetworkControllerImpl(mContext,
mMockCm, mMockCm,
@@ -243,8 +243,8 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
mDemoModeController, mDemoModeController,
mCarrierConfigTracker, mCarrierConfigTracker,
mWifiStatusTrackerFactory, mWifiStatusTrackerFactory,
mMobileFactory,
mMainHandler, mMainHandler,
mFeatureFlags,
mock(DumpManager.class), mock(DumpManager.class),
mock(LogBuffer.class) mock(LogBuffer.class)
); );
@@ -438,6 +438,10 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
updateSignalStrength(); updateSignalStrength();
} }
public void setImsType(int imsType) {
mMobileSignalController.setImsType(imsType);
}
public void setIsGsm(boolean gsm) { public void setIsGsm(boolean gsm) {
when(mSignalStrength.isGsm()).thenReturn(gsm); when(mSignalStrength.isGsm()).thenReturn(gsm);
updateSignalStrength(); updateSignalStrength();
@@ -633,4 +637,5 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
protected void assertDataNetworkNameEquals(String expected) { protected void assertDataNetworkNameEquals(String expected) {
assertEquals("Data network name", expected, mNetworkController.getMobileDataNetworkName()); assertEquals("Data network name", expected, mNetworkController.getMobileDataNetworkName());
} }
} }

View File

@@ -145,8 +145,8 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest {
mDemoModeController, mDemoModeController,
mock(CarrierConfigTracker.class), mock(CarrierConfigTracker.class),
mWifiStatusTrackerFactory, mWifiStatusTrackerFactory,
mMobileFactory,
new Handler(TestableLooper.get(this).getLooper()), new Handler(TestableLooper.get(this).getLooper()),
mFeatureFlags,
mock(DumpManager.class), mock(DumpManager.class),
mock(LogBuffer.class)); mock(LogBuffer.class));
setupNetworkController(); setupNetworkController();

View File

@@ -85,8 +85,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
mDemoModeController, mDemoModeController,
mCarrierConfigTracker, mCarrierConfigTracker,
mWifiStatusTrackerFactory, mWifiStatusTrackerFactory,
mMobileFactory,
mMainHandler, mMainHandler,
mFeatureFlags,
mock(DumpManager.class), mock(DumpManager.class),
mock(LogBuffer.class) mock(LogBuffer.class)
); );
@@ -121,8 +121,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
mDemoModeController, mDemoModeController,
mCarrierConfigTracker, mCarrierConfigTracker,
mWifiStatusTrackerFactory, mWifiStatusTrackerFactory,
mMobileFactory,
mMainHandler, mMainHandler,
mFeatureFlags,
mock(DumpManager.class), mock(DumpManager.class),
mock(LogBuffer.class)); mock(LogBuffer.class));
TestableLooper.get(this).processAllMessages(); TestableLooper.get(this).processAllMessages();
@@ -155,8 +155,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
mDemoModeController, mDemoModeController,
mock(CarrierConfigTracker.class), mock(CarrierConfigTracker.class),
mWifiStatusTrackerFactory, mWifiStatusTrackerFactory,
mMobileFactory,
mMainHandler, mMainHandler,
mFeatureFlags,
mock(DumpManager.class), mock(DumpManager.class),
mock(LogBuffer.class)); mock(LogBuffer.class));
setupNetworkController(); setupNetworkController();
@@ -192,8 +192,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
mDemoModeController, mDemoModeController,
mock(CarrierConfigTracker.class), mock(CarrierConfigTracker.class),
mWifiStatusTrackerFactory, mWifiStatusTrackerFactory,
mMobileFactory,
mMainHandler, mMainHandler,
mFeatureFlags,
mock(DumpManager.class), mock(DumpManager.class),
mock(LogBuffer.class)); mock(LogBuffer.class));
mNetworkController.registerListeners(); mNetworkController.registerListeners();
@@ -277,8 +277,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
mDemoModeController, mDemoModeController,
mock(CarrierConfigTracker.class), mock(CarrierConfigTracker.class),
mWifiStatusTrackerFactory, mWifiStatusTrackerFactory,
mMobileFactory,
mMainHandler, mMainHandler,
mFeatureFlags,
mock(DumpManager.class), mock(DumpManager.class),
mock(LogBuffer.class)); mock(LogBuffer.class));
setupNetworkController(); setupNetworkController();

View File

@@ -30,6 +30,7 @@ import android.net.NetworkInfo;
import android.net.vcn.VcnTransportInfo; import android.net.vcn.VcnTransportInfo;
import android.net.wifi.WifiInfo; import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.telephony.CellSignalStrength;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper; import android.testing.TestableLooper.RunWithLooper;
@@ -284,6 +285,44 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest {
verifyLastMobileDataIndicatorsForVcn(false, 1, 0, false); verifyLastMobileDataIndicatorsForVcn(false, 1, 0, false);
} }
@Test
public void testCallStrengh() {
if (true) return;
String testSsid = "Test SSID";
setWifiEnabled(true);
setWifiState(true, testSsid);
// Set the ImsType to be IMS_TYPE_WLAN
setImsType(2);
setWifiLevel(1);
for (int testLevel = 0; testLevel < WifiIcons.WIFI_LEVEL_COUNT; testLevel++) {
setWifiLevel(testLevel);
verifyLastCallStrength(TelephonyIcons.WIFI_CALL_STRENGTH_ICONS[testLevel]);
}
// Set the ImsType to be IMS_TYPE_WWAN
setImsType(1);
setupDefaultSignal();
for (int testStrength = 0;
testStrength < CellSignalStrength.getNumSignalStrengthLevels(); testStrength++) {
setLevel(testStrength);
verifyLastCallStrength(TelephonyIcons.MOBILE_CALL_STRENGTH_ICONS[testStrength]);
}
}
@Test
public void testNonPrimaryWiFi() {
if (true) return;
String testSsid = "Test SSID";
setWifiEnabled(true);
setWifiState(true, testSsid);
// Set the ImsType to be IMS_TYPE_WLAN
setImsType(2);
setWifiLevel(1);
verifyLastCallStrength(TelephonyIcons.WIFI_CALL_STRENGTH_ICONS[1]);
when(mWifiInfo.isPrimary()).thenReturn(false);
setWifiLevel(3);
verifyLastCallStrength(TelephonyIcons.WIFI_CALL_STRENGTH_ICONS[1]);
}
protected void setWifiActivity(int activity) { protected void setWifiActivity(int activity) {
// TODO: Not this, because this variable probably isn't sticking around. // TODO: Not this, because this variable probably isn't sticking around.
mNetworkController.mWifiSignalController.setActivity(activity); mNetworkController.mWifiSignalController.setActivity(activity);