diff options
19 files changed, 614 insertions, 230 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java b/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java index b416738ade4a..1a08366734bc 100644 --- a/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java +++ b/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java @@ -44,8 +44,6 @@ public class MobileStatusTracker { private final Handler mReceiverHandler; private final MobileTelephonyCallback mTelephonyCallback; - private boolean mListening = false; - /** * MobileStatusTracker constructors * @@ -78,7 +76,6 @@ public class MobileStatusTracker { * Config the MobileStatusTracker to start or stop monitoring platform signals. */ public void setListening(boolean listening) { - mListening = listening; if (listening) { mPhone.registerTelephonyCallback(mReceiverHandler::post, mTelephonyCallback); } else { @@ -86,10 +83,6 @@ public class MobileStatusTracker { } } - public boolean isListening() { - return mListening; - } - private void updateDataSim() { int activeDataSubId = mDefaults.getActiveDataSubId(); if (SubscriptionManager.isValidSubscriptionId(activeDataSubId)) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java index eeb1010693fc..ec0d0811ee76 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java @@ -134,9 +134,18 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader mQSCarrierGroupController .setOnSingleCarrierChangedListener(mView::setIsSingleCarrier); - List<String> rssiIgnoredSlots = List.of( - getResources().getString(com.android.internal.R.string.status_bar_mobile) - ); + List<String> rssiIgnoredSlots; + + 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, mInsetsProvider, mFeatureFlags.isEnabled(Flags.COMBINED_QS_HEADERS)); diff --git a/packages/SystemUI/src/com/android/systemui/qs/carrier/CellSignalState.kt b/packages/SystemUI/src/com/android/systemui/qs/carrier/CellSignalState.kt index e925b5472c27..2dac63905524 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/carrier/CellSignalState.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/carrier/CellSignalState.kt @@ -27,6 +27,7 @@ data class CellSignalState( @JvmField val contentDescription: String? = null, @JvmField val typeContentDescription: String? = null, @JvmField val roaming: Boolean = false, + @JvmField val providerModelBehavior: Boolean = false ) { /** * 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 else return copy(visible = visible) } -} +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrier.java b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrier.java index 703b95a082dc..592da6554b90 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrier.java +++ b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrier.java @@ -45,7 +45,7 @@ public class QSCarrier extends LinearLayout { private View mSpacer; @Nullable private CellSignalState mLastSignalState; - private boolean mMobileSignalInitialized = false; + private boolean mProviderModelInitialized = false; private boolean mIsSingleCarrier; public QSCarrier(Context context) { @@ -96,25 +96,35 @@ public class QSCarrier extends LinearLayout { mMobileRoaming.setImageTintList(colorStateList); mMobileSignal.setImageTintList(colorStateList); - if (!mMobileSignalInitialized) { - mMobileSignalInitialized = true; - mMobileSignal.setImageDrawable(new SignalDrawable(mContext)); + if (state.providerModelBehavior) { + if (!mProviderModelInitialized) { + 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; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java index cb76ee2bb6a1..6908e5ab49e6 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java @@ -42,7 +42,10 @@ import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Background; 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.statusbar.connectivity.IconState; import com.android.systemui.statusbar.connectivity.MobileDataIndicators; import com.android.systemui.statusbar.connectivity.NetworkController; import com.android.systemui.statusbar.connectivity.SignalCallback; @@ -75,6 +78,7 @@ public class QSCarrierGroupController { private QSCarrier[] mCarrierGroups = new QSCarrier[SIM_SLOTS]; private int[] mLastSignalLevel = new int[SIM_SLOTS]; private String[] mLastSignalLevelDescription = new String[SIM_SLOTS]; + private final boolean mProviderModel; private final CarrierConfigTracker mCarrierConfigTracker; private boolean mIsSingleCarrier; @@ -86,6 +90,9 @@ public class QSCarrierGroupController { private final SignalCallback mSignalCallback = new SignalCallback() { @Override public void setMobileDataIndicators(@NonNull MobileDataIndicators indicators) { + if (mProviderModel) { + return; + } int slotIndex = getSlotIndex(indicators.subId); if (slotIndex >= SIM_SLOTS) { Log.w(TAG, "setMobileDataIndicators - slot: " + slotIndex); @@ -100,12 +107,91 @@ public class QSCarrierGroupController { indicators.statusIcon.icon, indicators.statusIcon.contentDescription, indicators.typeContentDescription.toString(), - indicators.roaming + indicators.roaming, + mProviderModel ); 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 public void setNoSims(boolean hasNoSims, boolean simDetected) { if (hasNoSims) { for (int i = 0; i < SIM_SLOTS; i++) { @@ -133,8 +219,14 @@ public class QSCarrierGroupController { @Background Handler bgHandler, @Main Looper mainLooper, NetworkController networkController, 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; mBgHandler = bgHandler; mNetworkController = networkController; @@ -170,7 +262,8 @@ public class QSCarrierGroupController { R.drawable.ic_qs_no_calling_sms, context.getText(AccessibilityContentDescriptions.NO_CALLING).toString(), "", - false); + false, + mProviderModel); mLastSignalLevel[i] = TelephonyIcons.MOBILE_CALL_STRENGTH_ICONS[0]; mLastSignalLevelDescription[i] = context.getText(AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0]) @@ -258,7 +351,8 @@ public class QSCarrierGroupController { 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); + 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 Context mContext; private final CarrierConfigTracker mCarrierConfigTracker; + private final FeatureFlags mFeatureFlags; private final SlotIndexResolver mSlotIndexResolver; @Inject public Builder(ActivityStarter activityStarter, @Background Handler handler, @Main Looper looper, NetworkController networkController, CarrierTextManager.Builder carrierTextControllerBuilder, Context context, - CarrierConfigTracker carrierConfigTracker, SlotIndexResolver slotIndexResolver) { + CarrierConfigTracker carrierConfigTracker, FeatureFlags featureFlags, + SlotIndexResolver slotIndexResolver) { mActivityStarter = activityStarter; mHandler = handler; mLooper = looper; @@ -390,6 +486,7 @@ public class QSCarrierGroupController { mCarrierTextControllerBuilder = carrierTextControllerBuilder; mContext = context; mCarrierConfigTracker = carrierConfigTracker; + mFeatureFlags = featureFlags; mSlotIndexResolver = slotIndexResolver; } @@ -401,7 +498,7 @@ public class QSCarrierGroupController { public QSCarrierGroupController build() { return new QSCarrierGroupController(mView, mActivityStarter, mHandler, mLooper, mNetworkController, mCarrierTextControllerBuilder, mContext, - mCarrierConfigTracker, mSlotIndexResolver); + mCarrierConfigTracker, mFeatureFlags, mSlotIndexResolver); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java index 3c8775d01e2d..f1fdae7db482 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java @@ -778,8 +778,7 @@ public class InternetDialogController implements AccessPointController.AccessPoi return; } - mTelephonyManager.setDataEnabledForReason( - TelephonyManager.DATA_ENABLED_REASON_USER, enabled); + mTelephonyManager.setDataEnabled(enabled); if (disableOtherSubscriptions) { final List<SubscriptionInfo> subInfoList = mSubscriptionManager.getActiveSubscriptionInfoList(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java index 5cf1abc18274..9d8667a3ccb0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java @@ -26,17 +26,25 @@ import android.net.NetworkCapabilities; import android.os.Handler; import android.os.Looper; import android.provider.Settings.Global; +import android.telephony.AccessNetworkConstants; import android.telephony.CellSignalStrength; import android.telephony.CellSignalStrengthCdma; +import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; 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.TextUtils; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; +import com.android.settingslib.AccessibilityContentDescriptions; import com.android.settingslib.SignalIcon.MobileIconGroup; import com.android.settingslib.graph.SignalDrawable; 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.net.SignalStrengthUtil; import com.android.systemui.R; +import com.android.systemui.flags.FeatureFlags; +import com.android.systemui.flags.Flags; import com.android.systemui.util.CarrierConfigTracker; import java.io.PrintWriter; @@ -60,22 +70,33 @@ import java.util.Map; public class MobileSignalController extends SignalController<MobileState, MobileIconGroup> { 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 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 CarrierConfigTracker mCarrierConfigTracker; + private final ImsMmTelManager mImsMmTelManager; private final SubscriptionDefaults mDefaults; private final String mNetworkNameDefault; private final String mNetworkNameSeparator; 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. final SubscriptionInfo mSubscriptionInfo; private Map<String, MobileIconGroup> mNetworkToIconLookup; + private int mLastLevel; private MobileIconGroup mDefaultIcons; private Config mConfig; @VisibleForTesting boolean mInflateSignalStrengths = false; + private int mLastWwanLevel; + private int mLastWlanLevel; + private int mLastWlanCrossSimLevel; @VisibleForTesting - final MobileStatusTracker mMobileStatusTracker; + MobileStatusTracker mMobileStatusTracker; // Save the previous STATUS_HISTORY_SIZE states for logging. 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 // need listener lists anymore. public MobileSignalController( @@ -125,7 +192,7 @@ public class MobileSignalController extends SignalController<MobileState, Mobile SubscriptionDefaults defaults, Looper receiverLooper, CarrierConfigTracker carrierConfigTracker, - MobileStatusTrackerFactory mobileStatusTrackerFactory + FeatureFlags featureFlags ) { super("MobileSignalController(" + info.getSubscriptionId() + ")", context, NetworkCapabilities.TRANSPORT_CELLULAR, callbackHandler, @@ -139,6 +206,7 @@ public class MobileSignalController extends SignalController<MobileState, Mobile R.string.status_bar_network_name_separator).toString(); mNetworkNameDefault = getTextIfExists( com.android.internal.R.string.lockscreen_carrier_default).toString(); + mReceiverHandler = new Handler(receiverLooper); mNetworkToIconLookup = mapIconSets(mConfig); mDefaultIcons = getDefaultIcons(mConfig); @@ -155,7 +223,10 @@ public class MobileSignalController extends SignalController<MobileState, Mobile 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) { @@ -200,14 +271,41 @@ public class MobileSignalController extends SignalController<MobileState, Mobile mContext.getContentResolver().registerContentObserver(Global.getUriFor( Global.MOBILE_DATA + mSubscriptionInfo.getSubscriptionId()), 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. */ public void unregisterListener() { mMobileStatusTracker.setListening(false); mContext.getContentResolver().unregisterContentObserver(mObserver); + mImsMmTelManager.unregisterImsRegistrationCallback(mRegistrationCallback); } private void updateInflateSignalStrength() { @@ -296,7 +394,7 @@ public class MobileSignalController extends SignalController<MobileState, Mobile CharSequence qsDescription = null; 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) { return new QsInfo(qsTypeIcon, qsIcon, qsDescription); } @@ -318,15 +416,32 @@ public class MobileSignalController extends SignalController<MobileState, Mobile private SbInfo getSbInfo(String contentDescription, int dataTypeIcon) { final boolean dataDisabled = mCurrentState.isDataDisabledOrNotDefault(); - IconState statusIcon = new IconState( - mCurrentState.enabled && !mCurrentState.airplaneMode, - getCurrentIconId(), contentDescription); + boolean showTriangle = false; + int typeIcon = 0; + IconState statusIcon = null; + + if (mProviderModelBehavior) { + boolean showDataIconStatusBar = (mCurrentState.dataConnected || dataDisabled) + && (mCurrentState.dataSim && mCurrentState.isDefault); + typeIcon = + (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; - int typeIcon = - (showDataIconInStatusBar || mConfig.alwaysShowDataRatIcon) ? dataTypeIcon : 0; - boolean showTriangle = mCurrentState.enabled && !mCurrentState.airplaneMode; + boolean showDataIconInStatusBar = + (mCurrentState.dataConnected && mCurrentState.isDefault) || dataDisabled; + typeIcon = + (showDataIconInStatusBar || mConfig.alwaysShowDataRatIcon) ? dataTypeIcon : 0; + showTriangle = mCurrentState.enabled && !mCurrentState.airplaneMode; + } return new SbInfo(showTriangle, typeIcon, statusIcon); } @@ -445,7 +560,144 @@ public class MobileSignalController extends SignalController<MobileState, Mobile } private void updateMobileStatus(MobileStatus mobileStatus) { + int lastVoiceState = mCurrentState.getVoiceServiceState(); 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) { @@ -549,14 +801,19 @@ public class MobileSignalController extends SignalController<MobileState, Mobile mMobileStatusHistoryIndex = (mMobileStatusHistoryIndex + 1) % STATUS_HISTORY_SIZE; } + @VisibleForTesting + void setImsType(int imsType) { + mImsType = imsType; + } + @Override public void dump(PrintWriter pw) { super.dump(pw); pw.println(" mSubscription=" + mSubscriptionInfo + ","); + pw.println(" mProviderModelBehavior=" + mProviderModelBehavior + ","); pw.println(" mInflateSignalStrengths=" + mInflateSignalStrengths + ","); pw.println(" isDataDisabled=" + isDataDisabled() + ","); pw.println(" mNetworkToIconLookup=" + mNetworkToIconLookup + ","); - pw.println(" mMobileStatusTracker.isListening=" + mMobileStatusTracker.isListening()); pw.println(" MobileStatusHistory"); int size = 0; for (int i = 0; i < STATUS_HISTORY_SIZE; i++) { @@ -586,11 +843,6 @@ public class MobileSignalController extends SignalController<MobileState, Mobile icon = iconState; description = desc; } - - @Override - public String toString() { - return "QsInfo: ratTypeIcon=" + ratTypeIcon + " icon=" + icon; - } } /** Box for status bar icon info */ @@ -604,11 +856,5 @@ public class MobileSignalController extends SignalController<MobileState, Mobile ratTypeIcon = typeIcon; icon = iconState; } - - @Override - public String toString() { - return "SbInfo: showTriangle=" + showTriangle + " ratTypeIcon=" + ratTypeIcon - + " icon=" + icon; - } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalControllerFactory.kt b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalControllerFactory.kt deleted file mode 100644 index f0e52f190165..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalControllerFactory.kt +++ /dev/null @@ -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, - ) - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileStatusTrackerFactory.kt b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileStatusTrackerFactory.kt deleted file mode 100644 index a4c1a1989933..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileStatusTrackerFactory.kt +++ /dev/null @@ -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) - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java index b3dd853cd2e1..a1dc7b41d42b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java @@ -71,6 +71,8 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.demomode.DemoMode; import com.android.systemui.demomode.DemoModeController; 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.LogLevel; import com.android.systemui.log.dagger.StatusBarNetworkControllerLog; @@ -132,11 +134,12 @@ public class NetworkControllerImpl extends BroadcastReceiver private final BroadcastDispatcher mBroadcastDispatcher; private final DemoModeController mDemoModeController; private final Object mLock = new Object(); + private final boolean mProviderModelBehavior; private Config mConfig; private final CarrierConfigTracker mCarrierConfigTracker; + private final FeatureFlags mFeatureFlags; private final DumpManager mDumpManager; private final LogBuffer mLogBuffer; - private final MobileSignalControllerFactory mMobileFactory; private TelephonyCallback.ActiveDataSubscriptionIdListener mPhoneStateListener; private int mActiveMobileDataSubscription = SubscriptionManager.INVALID_SUBSCRIPTION_ID; @@ -232,9 +235,9 @@ public class NetworkControllerImpl extends BroadcastReceiver DemoModeController demoModeController, CarrierConfigTracker carrierConfigTracker, WifiStatusTrackerFactory trackerFactory, - MobileSignalControllerFactory mobileFactory, @Main Handler handler, InternetDialogFactory internetDialogFactory, + FeatureFlags featureFlags, DumpManager dumpManager, @StatusBarNetworkControllerLog LogBuffer logBuffer) { this(context, connectivityManager, @@ -254,8 +257,8 @@ public class NetworkControllerImpl extends BroadcastReceiver demoModeController, carrierConfigTracker, trackerFactory, - mobileFactory, handler, + featureFlags, dumpManager, logBuffer); mReceiverHandler.post(mRegisterListeners); @@ -280,8 +283,8 @@ public class NetworkControllerImpl extends BroadcastReceiver DemoModeController demoModeController, CarrierConfigTracker carrierConfigTracker, WifiStatusTrackerFactory trackerFactory, - MobileSignalControllerFactory mobileFactory, @Main Handler handler, + FeatureFlags featureFlags, DumpManager dumpManager, LogBuffer logBuffer ) { @@ -295,7 +298,6 @@ public class NetworkControllerImpl extends BroadcastReceiver mCallbackHandler = callbackHandler; mDataSaverController = new DataSaverControllerImpl(context); mBroadcastDispatcher = broadcastDispatcher; - mMobileFactory = mobileFactory; mSubscriptionManager = subManager; mSubDefaults = defaultsHandler; @@ -303,6 +305,7 @@ public class NetworkControllerImpl extends BroadcastReceiver mHasMobileDataFeature = telephonyManager.isDataCapable(); mDemoModeController = demoModeController; mCarrierConfigTracker = carrierConfigTracker; + mFeatureFlags = featureFlags; mDumpManager = dumpManager; mLogBuffer = logBuffer; @@ -454,6 +457,7 @@ public class NetworkControllerImpl extends BroadcastReceiver }; mDemoModeController.addCallback(this); + mProviderModelBehavior = mFeatureFlags.isEnabled(Flags.COMBINED_STATUS_BAR_SIGNAL_ICONS); mDumpManager.registerDumpable(TAG, this); } @@ -494,16 +498,16 @@ public class NetworkControllerImpl extends BroadcastReceiver // broadcasts IntentFilter filter = new IntentFilter(); - filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); - filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); - filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); - filter.addAction(Intent.ACTION_SERVICE_STATE); + filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); 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_VOICE_SUBSCRIPTION_CHANGED); + filter.addAction(Intent.ACTION_SERVICE_STATE); 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); mListening = true; @@ -656,6 +660,20 @@ public class NetworkControllerImpl extends BroadcastReceiver 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() { for (int i = 0; i < mMobileSignalControllers.size(); i++) { MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i); @@ -728,6 +746,9 @@ public class NetworkControllerImpl extends BroadcastReceiver for (int i = 0; i < mMobileSignalControllers.size(); i++) { MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i); mobileSignalController.notifyListeners(cb); + if (mProviderModelBehavior) { + mobileSignalController.refreshCallIndicator(cb); + } } mCallbackHandler.setListening(cb, true); } @@ -842,6 +863,9 @@ public class NetworkControllerImpl extends BroadcastReceiver for (int i = 0; i < mMobileSignalControllers.size(); i++) { MobileSignalController controller = mMobileSignalControllers.valueAt(i); controller.setConfiguration(mConfig); + if (mProviderModelBehavior) { + controller.refreshCallIndicator(mCallbackHandler); + } } refreshLocale(); } @@ -958,15 +982,11 @@ public class NetworkControllerImpl extends BroadcastReceiver mMobileSignalControllers.put(subId, cachedControllers.get(subId)); cachedControllers.remove(subId); } else { - MobileSignalController controller = mMobileFactory.createMobileSignalController( - mConfig, - mHasMobileDataFeature, - mPhone.createForSubscriptionId(subId), - this, - subscriptions.get(i), - mSubDefaults, - mReceiverHandler.getLooper() - ); + MobileSignalController controller = new MobileSignalController(mContext, mConfig, + mHasMobileDataFeature, mPhone.createForSubscriptionId(subId), + mCallbackHandler, this, subscriptions.get(i), + mSubDefaults, mReceiverHandler.getLooper(), mCarrierConfigTracker, + mFeatureFlags); controller.setUserSetupComplete(mUserSetup); mMobileSignalControllers.put(subId, controller); if (subscriptions.get(i).getSimSlotIndex() == 0) { @@ -1120,11 +1140,24 @@ public class NetworkControllerImpl extends BroadcastReceiver || mValidatedTransports.get(NetworkCapabilities.TRANSPORT_ETHERNET); pushConnectivityToSignals(); - mNoDefaultNetwork = !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_CELLULAR) - && !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_WIFI) - && !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_ETHERNET); - mCallbackHandler.setConnectivityStatus(mNoDefaultNetwork, !mInetCondition, - mNoNetworksAvailable); + if (mProviderModelBehavior) { + mNoDefaultNetwork = !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_CELLULAR) + && !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_WIFI) + && !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_ETHERNET); + 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(); int start = mSubscriptionManager.getActiveSubscriptionInfoCountMax(); 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); for (int i = 0; i < mMobileSignalControllers.size(); i++) { @@ -1340,7 +1373,7 @@ public class NetworkControllerImpl extends BroadcastReceiver List<SubscriptionInfo> subs = new ArrayList<>(); while (mMobileSignalControllers.size() <= slot) { int nextSlot = mMobileSignalControllers.size(); - subs.add(addDemoModeSignalController(nextSlot, nextSlot)); + subs.add(addSignalController(nextSlot, nextSlot)); } if (!subs.isEmpty()) { mCallbackHandler.setSubs(subs); @@ -1430,20 +1463,14 @@ public class NetworkControllerImpl extends BroadcastReceiver 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, null, null, null, "", false, null, null); - - MobileSignalController controller = mMobileFactory.createMobileSignalController( - mConfig, - mHasMobileDataFeature, - mPhone.createForSubscriptionId(info.getSubscriptionId()), - this, - info, - mSubDefaults, - mReceiverHandler.getLooper() - ); - + MobileSignalController controller = new MobileSignalController(mContext, + mConfig, mHasMobileDataFeature, + mPhone.createForSubscriptionId(info.getSubscriptionId()), mCallbackHandler, this, + info, mSubDefaults, mReceiverHandler.getLooper(), mCarrierConfigTracker, + mFeatureFlags); mMobileSignalControllers.put(id, controller); controller.getState().userSetup = true; return info; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java index 12f2c22ab86a..87cdb17245f5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java @@ -222,6 +222,7 @@ public class WifiSignalController extends SignalController<WifiState, IconGroup> mCurrentState.connected = mWifiTracker.connected; mCurrentState.ssid = mWifiTracker.ssid; mCurrentState.rssi = mWifiTracker.rssi; + boolean levelChanged = mCurrentState.level != mWifiTracker.level; mCurrentState.level = mWifiTracker.level; mCurrentState.statusLabel = mWifiTracker.statusLabel; mCurrentState.isCarrierMerged = mWifiTracker.isCarrierMerged; @@ -229,6 +230,10 @@ public class WifiSignalController extends SignalController<WifiState, IconGroup> mCurrentState.iconGroup = mCurrentState.isCarrierMerged ? mCarrierMergedWifiIconGroup : mUnmergedWifiIconGroup; + + if (levelChanged) { + mNetworkController.notifyWifiLevelChange(mCurrentState.level); + } } boolean isCarrierMergedWifi(int subId) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java index 492734e93dca..ee242a4b1b75 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java @@ -26,6 +26,8 @@ import android.util.Log; import com.android.settingslib.mobile.TelephonyIcons; import com.android.systemui.R; 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.MobileDataIndicators; import com.android.systemui.statusbar.connectivity.NetworkController; @@ -64,6 +66,7 @@ public class StatusBarSignalPolicy implements SignalCallback, private final Handler mHandler = Handler.getMain(); private final CarrierConfigTracker mCarrierConfigTracker; private final TunerService mTunerService; + private final FeatureFlags mFeatureFlags; private boolean mHideAirplane; private boolean mHideMobile; @@ -87,7 +90,8 @@ public class StatusBarSignalPolicy implements SignalCallback, CarrierConfigTracker carrierConfigTracker, NetworkController networkController, SecurityController securityController, - TunerService tunerService + TunerService tunerService, + FeatureFlags featureFlags ) { mContext = context; @@ -96,6 +100,7 @@ public class StatusBarSignalPolicy implements SignalCallback, mNetworkController = networkController; mSecurityController = securityController; mTunerService = tunerService; + mFeatureFlags = featureFlags; mSlotAirplane = mContext.getString(com.android.internal.R.string.status_bar_airplane); mSlotMobile = mContext.getString(com.android.internal.R.string.status_bar_mobile); @@ -373,6 +378,40 @@ public class StatusBarSignalPolicy implements SignalCallback, } @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 public void setEthernetIndicators(IconState state) { boolean visible = state.visible && !mHideEthernet; int resId = state.icon; diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt index be14cc51ef96..07c8af953d1e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt @@ -26,6 +26,7 @@ import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.colorextraction.SysuiColorExtractor import com.android.systemui.demomode.DemoModeController 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.QSCarrierGroupController import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider @@ -45,10 +46,10 @@ import org.junit.runner.RunWith import org.mockito.Answers import org.mockito.ArgumentMatchers.anyInt import org.mockito.Mock +import org.mockito.Mockito.`when` import org.mockito.Mockito.anyBoolean import org.mockito.Mockito.reset import org.mockito.Mockito.verify -import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations @SmallTest @@ -161,6 +162,7 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() { @Test fun testRSSISlot_notCombined() { + `when`(featureFlags.isEnabled(Flags.COMBINED_STATUS_BAR_SIGNAL_ICONS)).thenReturn(false) controller.init() val captor = argumentCaptor<List<String>>() @@ -172,6 +174,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 fun testSingleCarrierCallback() { controller.init() reset(view) diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java index 1963e30e741e..bd794d6813ec 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java @@ -37,6 +37,7 @@ import android.widget.TextView; import androidx.test.filters.SmallTest; import com.android.keyguard.CarrierTextManager; +import com.android.systemui.flags.FeatureFlags; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.statusbar.connectivity.IconState; import com.android.systemui.statusbar.connectivity.MobileDataIndicators; @@ -79,6 +80,7 @@ public class QSCarrierGroupControllerTest extends LeakCheckedTest { @Mock private QSCarrier mQSCarrier3; private TestableLooper mTestableLooper; + @Mock private FeatureFlags mFeatureFlags; @Mock private QSCarrierGroupController.OnSingleCarrierChangedListener mOnSingleCarrierChangedListener; @@ -118,7 +120,7 @@ public class QSCarrierGroupControllerTest extends LeakCheckedTest { mQSCarrierGroupController = new QSCarrierGroupController.Builder( mActivityStarter, handler, TestableLooper.get(this).getLooper(), mNetworkController, mCarrierTextControllerBuilder, mContext, mCarrierConfigTracker, - mSlotIndexResolver) + mFeatureFlags, mSlotIndexResolver) .setQSCarrierGroup(mQSCarrierGroup) .build(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierTest.java index 99a17a613041..5212255078fc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierTest.java @@ -22,11 +22,13 @@ import static org.junit.Assert.assertTrue; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; +import android.util.FeatureFlagUtils; import android.view.LayoutInflater; import android.view.View; import androidx.test.filters.SmallTest; +import com.android.settingslib.graph.SignalDrawable; import com.android.settingslib.mobile.TelephonyIcons; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; @@ -57,14 +59,14 @@ public class QSCarrierTest extends SysuiTestCase { @Test public void testUpdateState_first() { - CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false); + CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false, false); assertTrue(mQSCarrier.updateState(c, false)); } @Test public void testUpdateState_same() { - CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false); + CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false, false); assertTrue(mQSCarrier.updateState(c, false)); assertFalse(mQSCarrier.updateState(c, false)); @@ -72,7 +74,7 @@ public class QSCarrierTest extends SysuiTestCase { @Test public void testUpdateState_changed() { - CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false); + CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false, false); assertTrue(mQSCarrier.updateState(c, false)); @@ -83,14 +85,14 @@ public class QSCarrierTest extends SysuiTestCase { @Test 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)); } @Test public void testUpdateState_singleCarrier_noShowIcon() { - CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false); + CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false, false); mQSCarrier.updateState(c, true); @@ -99,7 +101,7 @@ public class QSCarrierTest extends SysuiTestCase { @Test public void testUpdateState_multiCarrier_showIcon() { - CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false); + CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false, false); mQSCarrier.updateState(c, false); @@ -108,7 +110,7 @@ public class QSCarrierTest extends SysuiTestCase { @Test public void testUpdateState_changeSingleMultiSingle() { - CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false); + CellSignalState c = new CellSignalState(true, mSignalIconId, "", "", false, false); mQSCarrier.updateState(c, true); assertEquals(View.GONE, mQSCarrier.getRSSIView().getVisibility()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java index f8a0d2fc415c..0d1879cb2593 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java @@ -70,6 +70,8 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.demomode.DemoModeController; 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.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; @@ -125,8 +127,8 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected CarrierConfigTracker mCarrierConfigTracker; protected FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock()); protected Handler mMainHandler; + protected FeatureFlags mFeatureFlags; protected WifiStatusTrackerFactory mWifiStatusTrackerFactory; - protected MobileSignalControllerFactory mMobileFactory; protected int mSubId; @@ -156,6 +158,9 @@ public class NetworkControllerBaseTest extends SysuiTestCase { @Before public void setUp() throws Exception { + mFeatureFlags = mock(FeatureFlags.class); + when(mFeatureFlags.isEnabled(Flags.COMBINED_STATUS_BAR_SIGNAL_ICONS)).thenReturn(false); + mInstrumentation = InstrumentationRegistry.getInstrumentation(); Settings.Global.putInt(mContext.getContentResolver(), Global.AIRPLANE_MODE_ON, 0); TestableResources res = mContext.getOrCreateTestableResources(); @@ -219,11 +224,6 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mWifiStatusTrackerFactory = new WifiStatusTrackerFactory( mContext, mMockWm, mMockNsm, mMockCm, mMainHandler); - mMobileFactory = new MobileSignalControllerFactory( - mContext, - mCallbackHandler, - mCarrierConfigTracker - ); mNetworkController = new NetworkControllerImpl(mContext, mMockCm, @@ -243,8 +243,8 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mDemoModeController, mCarrierConfigTracker, mWifiStatusTrackerFactory, - mMobileFactory, mMainHandler, + mFeatureFlags, mock(DumpManager.class), mock(LogBuffer.class) ); @@ -438,6 +438,10 @@ public class NetworkControllerBaseTest extends SysuiTestCase { updateSignalStrength(); } + public void setImsType(int imsType) { + mMobileSignalController.setImsType(imsType); + } + public void setIsGsm(boolean gsm) { when(mSignalStrength.isGsm()).thenReturn(gsm); updateSignalStrength(); @@ -633,4 +637,5 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected void assertDataNetworkNameEquals(String expected) { assertEquals("Data network name", expected, mNetworkController.getMobileDataNetworkName()); } + } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java index ed8a3e16cdd1..e3dd6f4e6e40 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java @@ -145,8 +145,8 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { mDemoModeController, mock(CarrierConfigTracker.class), mWifiStatusTrackerFactory, - mMobileFactory, new Handler(TestableLooper.get(this).getLooper()), + mFeatureFlags, mock(DumpManager.class), mock(LogBuffer.class)); setupNetworkController(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java index a76676e01c15..698899a8fc36 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java @@ -85,8 +85,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mDemoModeController, mCarrierConfigTracker, mWifiStatusTrackerFactory, - mMobileFactory, mMainHandler, + mFeatureFlags, mock(DumpManager.class), mock(LogBuffer.class) ); @@ -121,8 +121,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mDemoModeController, mCarrierConfigTracker, mWifiStatusTrackerFactory, - mMobileFactory, mMainHandler, + mFeatureFlags, mock(DumpManager.class), mock(LogBuffer.class)); TestableLooper.get(this).processAllMessages(); @@ -155,8 +155,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mDemoModeController, mock(CarrierConfigTracker.class), mWifiStatusTrackerFactory, - mMobileFactory, mMainHandler, + mFeatureFlags, mock(DumpManager.class), mock(LogBuffer.class)); setupNetworkController(); @@ -192,8 +192,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mDemoModeController, mock(CarrierConfigTracker.class), mWifiStatusTrackerFactory, - mMobileFactory, mMainHandler, + mFeatureFlags, mock(DumpManager.class), mock(LogBuffer.class)); mNetworkController.registerListeners(); @@ -277,8 +277,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mDemoModeController, mock(CarrierConfigTracker.class), mWifiStatusTrackerFactory, - mMobileFactory, mMainHandler, + mFeatureFlags, mock(DumpManager.class), mock(LogBuffer.class)); setupNetworkController(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java index 68170ea4b518..3f7149159247 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java @@ -30,6 +30,7 @@ import android.net.NetworkInfo; import android.net.vcn.VcnTransportInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; +import android.telephony.CellSignalStrength; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; @@ -284,6 +285,44 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { 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) { // TODO: Not this, because this variable probably isn't sticking around. mNetworkController.mWifiSignalController.setActivity(activity); |