diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index 46922dc617e7..3cecca17ebf1 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -77,6 +77,7 @@ android_library { libs: [ "telephony-common", + "ims-common", ], kotlincflags: ["-Xjvm-default=enable"], @@ -139,6 +140,7 @@ android_library { "android.test.runner", "telephony-common", "android.test.base", + "ims-common", ], kotlincflags: ["-Xjvm-default=enable"], aaptflags: [ @@ -165,6 +167,7 @@ android_app { }, libs: [ + "ims-common", "telephony-common", ], @@ -196,6 +199,7 @@ android_app { ], libs: [ "telephony-common", + "ims-common", ], kotlincflags: ["-Xjvm-default=enable"], diff --git a/packages/SystemUI/res/drawable/ic_volte.xml b/packages/SystemUI/res/drawable/ic_volte.xml new file mode 100644 index 000000000000..b56fa99f8912 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volte.xml @@ -0,0 +1,19 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volte_no_voice.xml b/packages/SystemUI/res/drawable/ic_volte_no_voice.xml new file mode 100644 index 000000000000..490b624927f0 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volte_no_voice.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml b/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml index 42d541e3afc9..976ce9da23b8 100644 --- a/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml +++ b/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml @@ -30,7 +30,12 @@ android:layout_height="match_parent" android:gravity="center_vertical" android:orientation="horizontal" > - + false + + true diff --git a/packages/SystemUI/res/values/ext_strings.xml b/packages/SystemUI/res/values/ext_strings.xml index 15597ffc90dc..7e84801e164f 100644 --- a/packages/SystemUI/res/values/ext_strings.xml +++ b/packages/SystemUI/res/values/ext_strings.xml @@ -122,6 +122,7 @@ Camera Location Microphone + VoLTE This keeps it in view until you unpin. Touch & hold Back to unpin. diff --git a/packages/SystemUI/res/xml/status_bar_prefs.xml b/packages/SystemUI/res/xml/status_bar_prefs.xml index b3fe8151556a..5ca1d7c27f8a 100644 --- a/packages/SystemUI/res/xml/status_bar_prefs.xml +++ b/packages/SystemUI/res/xml/status_bar_prefs.xml @@ -84,6 +84,11 @@ android:key="location" android:title="@string/status_bar_location" /> + + = SIM_SLOTS) { Log.w(TAG, "setMobileDataIndicators - slot: " + slotIndex); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java index 6a6e4c625e12..6f01961e26e7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java @@ -271,7 +271,7 @@ private final class CellSignalCallback implements SignalCallback { @Override public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, - int qsType, boolean activityIn, boolean activityOut, + int qsType, boolean activityIn, boolean activityOut, int volteIcon, CharSequence typeContentDescription, CharSequence typeContentDescriptionHtml, CharSequence description, boolean isWide, int subId, boolean roaming) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java index 239addd4ee1d..691ca60ee62c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java @@ -60,6 +60,8 @@ public class StatusBarMobileView extends FrameLayout implements DarkReceiver, private int mVisibleState = -1; private DualToneHandler mDualToneHandler; + private ImageView mVolte; + public static StatusBarMobileView fromContext(Context context, String slot) { LayoutInflater inflater = LayoutInflater.from(context); StatusBarMobileView v = (StatusBarMobileView) @@ -109,6 +111,7 @@ private void init() { mIn = findViewById(R.id.mobile_in); mOut = findViewById(R.id.mobile_out); mInoutContainer = findViewById(R.id.inout_container); + mVolte = findViewById(R.id.mobile_volte); mMobileDrawable = new SignalDrawable(getContext()); mMobile.setImageDrawable(mMobileDrawable); @@ -167,6 +170,12 @@ private void initViewState() { mOut.setVisibility(mState.activityOut ? View.VISIBLE : View.GONE); mInoutContainer.setVisibility((mState.activityIn || mState.activityOut) ? View.VISIBLE : View.GONE); + if (mState.volteId > 0) { + mVolte.setImageResource(mState.volteId); + mVolte.setVisibility(View.VISIBLE); + } else { + mVolte.setVisibility(View.GONE); + } } private boolean updateState(MobileIconState state) { @@ -198,6 +207,15 @@ private boolean updateState(MobileIconState state) { mInoutContainer.setVisibility((state.activityIn || state.activityOut) ? View.VISIBLE : View.GONE); + if (mState.volteId != state.volteId) { + if (state.volteId != 0) { + mVolte.setImageResource(state.volteId); + mVolte.setVisibility(View.VISIBLE); + } else { + mVolte.setVisibility(View.GONE); + } + } + needsLayout |= state.roaming != mState.roaming || state.activityIn != mState.activityIn || state.activityOut != mState.activityOut; @@ -215,6 +233,7 @@ public void onDarkChanged(Rect area, float darkIntensity, int tint) { mIn.setImageTintList(color); mOut.setImageTintList(color); mMobileType.setImageTintList(color); + mVolte.setImageTintList(color); mMobileRoaming.setImageTintList(color); mDotView.setDecorColor(tint); mDotView.setIconColor(tint, false); @@ -240,6 +259,7 @@ public void setStaticDrawableColor(int color) { mIn.setImageTintList(list); mOut.setImageTintList(list); mMobileType.setImageTintList(list); + mVolte.setImageTintList(list); mMobileRoaming.setImageTintList(list); mDotView.setDecorColor(color); } 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 4531fbdf6f29..2853b431cd69 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java @@ -155,7 +155,7 @@ public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState q newState.contentDescription = statusIcon.contentDescription; MobileIconState first = getFirstMobileState(); - newState.signalSpacerVisible = first != null && first.typeId != 0; + newState.signalSpacerVisible = first != null && (first.typeId != 0 || first.volteId != 0); updateWifiIconWithState(newState); mWifiIconState = newState; @@ -163,7 +163,7 @@ public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState q private void updateShowWifiSignalSpacer(WifiIconState state) { MobileIconState first = getFirstMobileState(); - state.signalSpacerVisible = first != null && first.typeId != 0; + state.signalSpacerVisible = first != null && (first.typeId != 0 || first.volteId != 0); } private void updateWifiIconWithState(WifiIconState state) { @@ -177,7 +177,7 @@ private void updateWifiIconWithState(WifiIconState state) { @Override public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, - int qsType, boolean activityIn, boolean activityOut, + int qsType, boolean activityIn, boolean activityOut, int volteIcon, CharSequence typeContentDescription, CharSequence typeContentDescriptionHtml, CharSequence description, boolean isWide, int subId, boolean roaming) { @@ -186,8 +186,9 @@ public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int return; } - // Visibility of the data type indicator changed - boolean typeChanged = statusType != state.typeId && (statusType == 0 || state.typeId == 0); + // Visibility of the data type indicator changed or volteIcon changed + boolean typeChanged = (statusType != state.typeId && (statusType == 0 || state.typeId == 0)) + || (volteIcon != state.volteId && (volteIcon == 0 || state.volteId == 0)); state.visible = statusIcon.visible && !mBlockMobile; state.strengthId = statusIcon.icon; @@ -197,6 +198,7 @@ public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int state.roaming = roaming; state.activityIn = activityIn && mActivityEnabled; state.activityOut = activityOut && mActivityEnabled; + state.volteId = volteIcon; // Always send a copy to maintain value type semantics mIconController.setMobileIcons(mSlotMobile, MobileIconState.copyStates(mMobileStates)); @@ -390,6 +392,7 @@ public static class MobileIconState extends SignalIconState { public boolean roaming; public boolean needsLeadingPadding; public CharSequence typeContentDescription; + public int volteId; private MobileIconState(int subId) { super(); @@ -410,7 +413,8 @@ public boolean equals(Object o) { typeId == that.typeId && roaming == that.roaming && needsLeadingPadding == that.needsLeadingPadding && - Objects.equals(typeContentDescription, that.typeContentDescription); + Objects.equals(typeContentDescription, that.typeContentDescription) && + volteId == that.volteId; } @Override @@ -435,6 +439,7 @@ public void copyTo(MobileIconState other) { other.roaming = roaming; other.needsLeadingPadding = needsLeadingPadding; other.typeContentDescription = typeContentDescription; + other.volteId = volteId; } private static List copyStates(List inStates) { @@ -450,7 +455,8 @@ private static List copyStates(List inStates) @Override public String toString() { return "MobileIconState(subId=" + subId + ", strengthId=" + strengthId + ", roaming=" - + roaming + ", typeId=" + typeId + ", visible=" + visible + ")"; + + roaming + ", typeId=" + typeId + ", volteId=" + volteId + + ", visible=" + visible + ")"; } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java index 97d348bb6a22..46426f4af10d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java @@ -122,13 +122,14 @@ public void setWifiIndicators(final boolean enabled, final IconState statusIcon, @Override public void setMobileDataIndicators(final IconState statusIcon, final IconState qsIcon, final int statusType, final int qsType, final boolean activityIn, - final boolean activityOut, final CharSequence typeContentDescription, + final boolean activityOut, final int volteIcon, + final CharSequence typeContentDescription, CharSequence typeContentDescriptionHtml, final CharSequence description, final boolean isWide, final int subId, boolean roaming) { post(() -> { for (SignalCallback signalCluster : mSignalCallbacks) { signalCluster.setMobileDataIndicators(statusIcon, qsIcon, statusType, qsType, - activityIn, activityOut, typeContentDescription, + activityIn, activityOut, volteIcon, typeContentDescription, typeContentDescriptionHtml, description, isWide, subId, roaming); } }); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index 8ea09e56164d..8f4e4f7307a0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -30,22 +30,29 @@ import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; +import android.telephony.ims.ImsMmTelManager; +import android.telephony.ims.ImsReasonInfo; +import android.telephony.ims.feature.MmTelFeature; import android.text.Html; import android.text.TextUtils; import android.util.Log; import android.util.SparseArray; +import com.android.ims.ImsException; +import com.android.ims.ImsManager; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.cdma.EriInfo; import com.android.settingslib.Utils; import com.android.settingslib.graph.SignalDrawable; import com.android.settingslib.net.SignalStrengthUtil; +import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.statusbar.policy.NetworkController.IconState; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config; import com.android.systemui.statusbar.policy.NetworkControllerImpl.SubscriptionDefaults; +import com.android.systemui.tuner.TunerService; import java.io.PrintWriter; import java.util.BitSet; @@ -55,7 +62,8 @@ public class MobileSignalController extends SignalController< - MobileSignalController.MobileState, MobileSignalController.MobileIconGroup> { + MobileSignalController.MobileState, MobileSignalController.MobileIconGroup> + implements TunerService.Tunable { // The message to display Nr5G icon gracfully by CarrierConfig timeout private static final int MSG_DISPLAY_GRACE = 1; @@ -90,6 +98,11 @@ public class MobileSignalController extends SignalController< // Some specific carriers have 5GE network which is special LTE CA network. private static final int NETWORK_TYPE_LTE_CA_5GE = TelephonyManager.MAX_NETWORK_TYPE + 1; + private ImsManager mImsManager; + private ImsManager.Connector mImsManagerConnector; + private boolean mShowVolteIcon; + private static final String SHOW_VOLTE_ICON = "show_volte_icon"; + // TODO: Reduce number of vars passed in, if we have the NetworkController, probably don't // need listener lists anymore. public MobileSignalController(Context context, Config config, boolean hasMobileData, @@ -120,6 +133,24 @@ public MobileSignalController(Context context, Config config, boolean hasMobileD mLastState.iconGroup = mCurrentState.iconGroup = mDefaultIcons; // Get initial data sim state. updateDataSim(); + + int phoneId = mSubscriptionInfo.getSimSlotIndex(); + mImsManagerConnector = new ImsManager.Connector(mContext, phoneId, + new ImsManager.Connector.Listener() { + @Override + public void connectionReady(ImsManager manager) throws ImsException { + Log.d(mTag, "ImsManager: connection ready."); + mImsManager = manager; + setListeners(); + } + + @Override + public void connectionUnavailable() { + Log.d(mTag, "ImsManager: connection unavailable."); + removeListeners(); + } + }); + mObserver = new ContentObserver(new Handler(receiverLooper)) { @Override public void onChange(boolean selfChange) { @@ -127,6 +158,7 @@ public void onChange(boolean selfChange) { } }; + Dependency.get(TunerService.class).addTunable(this, SHOW_VOLTE_ICON); mDisplayGraceHandler = new Handler(receiverLooper) { @Override public void handleMessage(Message msg) { @@ -138,6 +170,17 @@ public void handleMessage(Message msg) { }; } + @Override + public void onTuningChanged(String key, String newValue) { + switch (key) { + case SHOW_VOLTE_ICON: + mShowVolteIcon = TunerService.parseIntegerSwitch(newValue, false); + Log.d(mTag, "mShowVolteIcon=" + mShowVolteIcon); + mCurrentState.showVolteIcon=mShowVolteIcon && mConfig.showVolteIcon; + notifyListenersIfNecessary(); + } + } + public void setConfiguration(Config config) { mConfig = config; updateInflateSignalStrength(); @@ -186,6 +229,7 @@ public void registerListener() { mContext.getContentResolver().registerContentObserver(Global.getUriFor( Global.MOBILE_DATA + mSubscriptionInfo.getSubscriptionId()), true, mObserver); + mImsManagerConnector.connect(); } /** @@ -194,6 +238,7 @@ public void registerListener() { public void unregisterListener() { mPhone.listen(mPhoneStateListener, 0); mContext.getContentResolver().unregisterContentObserver(mObserver); + mImsManagerConnector.disconnect(); } /** @@ -309,6 +354,72 @@ public int getQsCurrentIconId() { return getCurrentIconId(); } + private boolean isVolteSwitchOn() { + return mImsManager != null && mImsManager.isEnhanced4gLteModeSettingEnabledByUser(); + } + + private int getVolteResId() { + int resId = 0; + int voiceNetType = getVoiceNetworkType(); + if ((mCurrentState.voiceCapable || mCurrentState.videoCapable) + && mCurrentState.imsRegistered) { + resId = R.drawable.ic_volte; + } else if ((mDataNetType == TelephonyManager.NETWORK_TYPE_LTE + || mDataNetType == TelephonyManager.NETWORK_TYPE_LTE_CA) + && voiceNetType == TelephonyManager.NETWORK_TYPE_UNKNOWN) { + resId = R.drawable.ic_volte_no_voice; + } + return resId; + } + + private void setListeners() { + if (mImsManager == null) { + Log.e(mTag, "setListeners mImsManager is null"); + return; + } + try { + mImsManager.addCapabilitiesCallback(mCapabilityCallback); + mImsManager.addRegistrationCallback(mImsRegistrationCallback); + Log.d(mTag, "addCapabilitiesCallback " + mCapabilityCallback + " into " + mImsManager); + Log.d(mTag, "addRegistrationCallback " + mImsRegistrationCallback + + " into " + mImsManager); + } catch (ImsException e) { + Log.d(mTag, "unable to addCapabilitiesCallback callback."); + } + queryImsState(); + } + + private void queryImsState() { + TelephonyManager tm = mPhone.createForSubscriptionId(mSubscriptionInfo.getSubscriptionId()); + mCurrentState.voiceCapable = tm.isVolteAvailable(); + mCurrentState.videoCapable = tm.isVideoTelephonyAvailable(); + mCurrentState.imsRegistered = mPhone.isImsRegistered(mSubscriptionInfo.getSubscriptionId()); + if (DEBUG) { + Log.d(mTag, "queryImsState tm=" + tm + " phone=" + mPhone + + " voiceCapable=" + mCurrentState.voiceCapable + + " videoCapable=" + mCurrentState.videoCapable + + " imsResitered=" + mCurrentState.imsRegistered); + } + notifyListenersIfNecessary(); + } + + private void removeListeners() { + if (mImsManager == null) { + Log.e(mTag, "removeListeners mImsManager is null"); + return; + } + try { + mImsManager.removeCapabilitiesCallback(mCapabilityCallback); + mImsManager.removeRegistrationListener(mImsRegistrationCallback); + Log.d(mTag, "removeCapabilitiesCallback " + mCapabilityCallback + + " from " + mImsManager); + Log.d(mTag, "removeRegistrationCallback " + mImsRegistrationCallback + + " from " + mImsManager); + } catch (ImsException e) { + Log.d(mTag, "unable to remove callback."); + } + } + @Override public void notifyListeners(SignalCallback callback) { MobileIconGroup icons = getIcons(); @@ -351,10 +462,12 @@ public void notifyListeners(SignalCallback callback) { && mCurrentState.activityOut; showDataIcon &= mCurrentState.isDefault || dataDisabled; int typeIcon = (showDataIcon || mConfig.alwaysShowDataRatIcon) ? icons.mDataType : 0; + int volteIcon = (mShowVolteIcon && mConfig.showVolteIcon + && isVolteSwitchOn()) ? getVolteResId() : 0; callback.setMobileDataIndicators(statusIcon, qsIcon, typeIcon, qsTypeIcon, - activityIn, activityOut, dataContentDescription, dataContentDescriptionHtml, - description, icons.mIsWide, mSubscriptionInfo.getSubscriptionId(), - mCurrentState.roaming); + activityIn, activityOut, volteIcon, dataContentDescription, + dataContentDescriptionHtml, description, icons.mIsWide, + mSubscriptionInfo.getSubscriptionId(), mCurrentState.roaming); } @Override @@ -645,6 +758,11 @@ boolean isDataDisabled() { return !mPhone.isDataCapable(); } + private int getVoiceNetworkType() { + return mServiceState != null + ? mServiceState.getVoiceNetworkType() : TelephonyManager.NETWORK_TYPE_UNKNOWN; + } + @VisibleForTesting void setActivity(int activity) { mCurrentState.activityIn = activity == TelephonyManager.DATA_ACTIVITY_INOUT @@ -745,6 +863,44 @@ public void onActiveDataSubscriptionIdChanged(int subId) { } }; + private ImsMmTelManager.CapabilityCallback mCapabilityCallback = + new ImsMmTelManager.CapabilityCallback() { + @Override + public void onCapabilitiesStatusChanged(MmTelFeature.MmTelCapabilities config) { + mCurrentState.voiceCapable = + config.isCapable(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE); + mCurrentState.videoCapable = + config.isCapable(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO); + Log.d(mTag, "onCapabilitiesStatusChanged isVoiceCapable=" + mCurrentState.voiceCapable + + " isVideoCapable=" + mCurrentState.videoCapable); + notifyListenersIfNecessary(); + } + }; + + private final ImsMmTelManager.RegistrationCallback mImsRegistrationCallback = + new ImsMmTelManager.RegistrationCallback() { + @Override + public void onRegistered(int imsTransportType) { + Log.d(mTag, "onRegistered imsTransportType=" + imsTransportType); + mCurrentState.imsRegistered = true; + notifyListenersIfNecessary(); + } + + @Override + public void onRegistering(int imsTransportType) { + Log.d(mTag, "onRegistering imsTransportType=" + imsTransportType); + mCurrentState.imsRegistered = false; + notifyListenersIfNecessary(); + } + + @Override + public void onUnregistered(ImsReasonInfo info) { + Log.d(mTag, "onDeregistered imsReasonInfo=" + info); + mCurrentState.imsRegistered = false; + notifyListenersIfNecessary(); + } + }; + static class MobileIconGroup extends SignalController.IconGroup { final int mDataContentDescription; // mContentDescriptionDataType final int mDataType; @@ -775,6 +931,10 @@ static class MobileState extends SignalController.State { boolean userSetup; boolean roaming; boolean defaultDataOff; // Tracks the on/off state of the defaultDataSubscription + boolean imsRegistered; + boolean voiceCapable; + boolean videoCapable; + boolean showVolteIcon; // Tracks showing in status bar configuration change @Override public void copyFrom(State s) { @@ -791,6 +951,10 @@ public void copyFrom(State s) { userSetup = state.userSetup; roaming = state.roaming; defaultDataOff = state.defaultDataOff; + imsRegistered = state.imsRegistered; + voiceCapable = state.voiceCapable; + videoCapable = state.videoCapable; + showVolteIcon = state.showVolteIcon; } @Override @@ -808,7 +972,11 @@ protected void toString(StringBuilder builder) { builder.append("carrierNetworkChangeMode=").append(carrierNetworkChangeMode) .append(','); builder.append("userSetup=").append(userSetup).append(','); - builder.append("defaultDataOff=").append(defaultDataOff); + builder.append("defaultDataOff=").append(defaultDataOff).append(','); + builder.append("imsRegistered=").append(imsRegistered).append(','); + builder.append("voiceCapable=").append(voiceCapable).append(','); + builder.append("videoCapable=").append(videoCapable).append(','); + builder.append("showVolteIcon=").append(showVolteIcon); } @Override @@ -824,7 +992,11 @@ public boolean equals(Object o) { && ((MobileState) o).userSetup == userSetup && ((MobileState) o).isDefault == isDefault && ((MobileState) o).roaming == roaming - && ((MobileState) o).defaultDataOff == defaultDataOff; + && ((MobileState) o).defaultDataOff == defaultDataOff + && ((MobileState) o).imsRegistered == imsRegistered + && ((MobileState) o).voiceCapable == voiceCapable + && ((MobileState) o).videoCapable == videoCapable + && ((MobileState) o).showVolteIcon == showVolteIcon; } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java index 95a97729936b..ea18da45419a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java @@ -69,7 +69,7 @@ default void setWifiIndicators(boolean enabled, IconState statusIcon, IconState * @param roaming indicates roaming */ default void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, - int qsType, boolean activityIn, boolean activityOut, + int qsType, boolean activityIn, boolean activityOut, int volteIcon, CharSequence typeContentDescription, CharSequence typeContentDescriptionHtml, CharSequence description, boolean isWide, int subId, boolean roaming) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index 2ad5a8aa7fe5..c8443179282c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -1148,7 +1148,7 @@ static class Config { boolean alwaysShowDataRatIcon = false; public String patternOfCarrierSpecificDataIcon = ""; public long nrIconDisplayGracePeriodMs; - + boolean showVolteIcon = false; /** * Mapping from NR 5G status string to an integer. The NR 5G status string should match * those in carrier config. @@ -1174,6 +1174,7 @@ static Config readConfig(Context context) { res.getBoolean(R.bool.config_hspa_data_distinguishable); config.inflateSignalStrengths = res.getBoolean( com.android.internal.R.bool.config_inflateSignalStrength); + config.showVolteIcon = res.getBoolean(R.bool.config_display_volte); CarrierConfigManager configMgr = (CarrierConfigManager) context.getSystemService(Context.CARRIER_CONFIG_SERVICE);