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