diff --git a/res/values/strings.xml b/res/values/strings.xml index 9e22f9d7277..83029f49cd5 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -12592,13 +12592,15 @@ SMS - Preferred for calls & SMS + preferred - Preferred for calls + preferred for calls - Preferred for SMS + preferred for SMS - Temporarily unavailable + unavailable + + Temporarily unavailable No SIM diff --git a/src/com/android/settings/network/NetworkProviderCallsSmsController.java b/src/com/android/settings/network/NetworkProviderCallsSmsController.java index 417c4a91c7e..f83418ba551 100644 --- a/src/com/android/settings/network/NetworkProviderCallsSmsController.java +++ b/src/com/android/settings/network/NetworkProviderCallsSmsController.java @@ -20,8 +20,10 @@ import static androidx.lifecycle.Lifecycle.Event; import android.content.Context; import android.os.UserManager; +import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.LifecycleObserver; @@ -31,6 +33,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settingslib.RestrictedPreference; +import com.android.settingslib.Utils; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; @@ -45,7 +48,7 @@ public class NetworkProviderCallsSmsController extends AbstractPreferenceControl private UserManager mUserManager; private SubscriptionManager mSubscriptionManager; private SubscriptionsChangeListener mSubscriptionsChangeListener; - + private TelephonyManager mTelephonyManager; private RestrictedPreference mPreference; /** @@ -57,6 +60,7 @@ public class NetworkProviderCallsSmsController extends AbstractPreferenceControl mUserManager = context.getSystemService(UserManager.class); mSubscriptionManager = context.getSystemService(SubscriptionManager.class); + mTelephonyManager = mContext.getSystemService(TelephonyManager.class); if (lifecycle != null) { mSubscriptionsChangeListener = new SubscriptionsChangeListener(context, this); lifecycle.addObserver(this); @@ -91,16 +95,18 @@ public class NetworkProviderCallsSmsController extends AbstractPreferenceControl final StringBuilder summary = new StringBuilder(); for (SubscriptionInfo subInfo : subs) { int subsSize = subs.size(); + int subId = subInfo.getSubscriptionId(); final CharSequence displayName = SubscriptionUtil.getUniqueSubscriptionDisplayName( subInfo, mContext); // Set displayName as summary if there is only one valid SIM. if (subsSize == 1 - && SubscriptionManager.isValidSubscriptionId(subInfo.getSubscriptionId())) { + && SubscriptionManager.isValidSubscriptionId(subId) + && isInService(subId)) { return displayName; } - CharSequence status = getPreferredStatus(subInfo); + CharSequence status = getPreferredStatus(subsSize, subId); if (status.toString().isEmpty()) { // If there are 2 or more SIMs and one of these has no preferred status, // set only its displayName as summary. @@ -121,14 +127,14 @@ public class NetworkProviderCallsSmsController extends AbstractPreferenceControl } @VisibleForTesting - protected CharSequence getPreferredStatus(SubscriptionInfo subInfo) { - final int subId = subInfo.getSubscriptionId(); + protected CharSequence getPreferredStatus(int subsSize, int subId) { String status = ""; boolean isDataPreferred = subId == getDefaultVoiceSubscriptionId(); boolean isSmsPreferred = subId == getDefaultSmsSubscriptionId(); - if (!SubscriptionManager.isValidSubscriptionId(subId)) { - status = setSummaryResId(R.string.calls_sms_unavailable); + if (!SubscriptionManager.isValidSubscriptionId(subId) || !isInService(subId)) { + status = setSummaryResId(subsSize > 1 ? R.string.calls_sms_unavailable : + R.string.calls_sms_temp_unavailable); } else { if (isDataPreferred && isSmsPreferred) { status = setSummaryResId(R.string.calls_sms_preferred); @@ -203,4 +209,11 @@ public class NetworkProviderCallsSmsController extends AbstractPreferenceControl refreshSummary(mPreference); update(); } + + @VisibleForTesting + protected boolean isInService(int subId) { + ServiceState serviceState = + mTelephonyManager.createForSubscriptionId(subId).getServiceState(); + return Utils.isInService(serviceState); + } } diff --git a/src/com/android/settings/network/telephony/CallsDefaultSubscriptionController.java b/src/com/android/settings/network/telephony/CallsDefaultSubscriptionController.java index 99009c9295e..36b19ba1e60 100644 --- a/src/com/android/settings/network/telephony/CallsDefaultSubscriptionController.java +++ b/src/com/android/settings/network/telephony/CallsDefaultSubscriptionController.java @@ -20,6 +20,8 @@ import android.content.Context; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; +import com.android.settings.Utils; + public class CallsDefaultSubscriptionController extends DefaultSubscriptionController { public CallsDefaultSubscriptionController(Context context, String preferenceKey) { @@ -40,4 +42,13 @@ public class CallsDefaultSubscriptionController extends DefaultSubscriptionContr protected void setDefaultSubscription(int subscriptionId) { mManager.setDefaultVoiceSubscriptionId(subscriptionId); } + + @Override + public CharSequence getSummary() { + if (Utils.isProviderModelEnabled(mContext)) { + return MobileNetworkUtils.getPreferredStatus(mContext, mManager, true); + } else { + return super.getSummary(); + } + } } diff --git a/src/com/android/settings/network/telephony/MobileNetworkUtils.java b/src/com/android/settings/network/telephony/MobileNetworkUtils.java index e8f97708042..0834632a0dc 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java +++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java @@ -73,6 +73,7 @@ import com.android.internal.util.ArrayUtils; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.core.BasePreferenceController; +import com.android.settings.network.SubscriptionUtil; import com.android.settings.network.ims.WifiCallingQueryImsState; import com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants; import com.android.settingslib.development.DevelopmentSettingsEnabler; @@ -600,8 +601,7 @@ public class MobileNetworkUtils { final Drawable networkDrawable = iconType == NO_CELL_DATA_TYPE_ICON ? EMPTY_DRAWABLE - : context - .getResources().getDrawable(iconType, context.getTheme()); + : context.getResources().getDrawable(iconType, context.getTheme()); // Overlay the two drawables final Drawable[] layers = {networkDrawable, signalDrawable}; @@ -920,4 +920,78 @@ public class MobileNetworkUtils { } return isWifiCallingEnabled; } + + + /** + * Returns preferred status of Calls & SMS separately when Provider Model is enabled. + */ + public static CharSequence getPreferredStatus(Context context, + SubscriptionManager subscriptionManager, boolean isPreferredCallStatus) { + final List subs = SubscriptionUtil.getActiveSubscriptions( + subscriptionManager); + if (!subs.isEmpty()) { + final StringBuilder summary = new StringBuilder(); + for (SubscriptionInfo subInfo : subs) { + int subsSize = subs.size(); + final CharSequence displayName = SubscriptionUtil.getUniqueSubscriptionDisplayName( + subInfo, context); + + // Set displayName as summary if there is only one valid SIM. + if (subsSize == 1 + && SubscriptionManager.isValidSubscriptionId(subInfo.getSubscriptionId())) { + return displayName; + } + + CharSequence status = isPreferredCallStatus + ? getPreferredCallStatus(context, subInfo) + : getPreferredSmsStatus(context, subInfo); + if (status.toString().isEmpty()) { + // If there are 2 or more SIMs and one of these has no preferred status, + // set only its displayName as summary. + summary.append(displayName); + } else { + summary.append(displayName) + .append(" (") + .append(status) + .append(")"); + } + // Do not add ", " for the last subscription. + if (subInfo != subs.get(subs.size() - 1)) { + summary.append(", "); + } + } + return summary; + } else { + return ""; + } + } + + private static CharSequence getPreferredCallStatus(Context context, SubscriptionInfo subInfo) { + final int subId = subInfo.getSubscriptionId(); + String status = ""; + boolean isDataPreferred = subId == SubscriptionManager.getDefaultVoiceSubscriptionId(); + + if (isDataPreferred) { + status = setSummaryResId(context, R.string.calls_sms_preferred); + } + + return status; + } + + private static CharSequence getPreferredSmsStatus(Context context, SubscriptionInfo subInfo) { + final int subId = subInfo.getSubscriptionId(); + String status = ""; + boolean isSmsPreferred = subId == SubscriptionManager.getDefaultSmsSubscriptionId(); + + if (isSmsPreferred) { + status = setSummaryResId(context, R.string.calls_sms_preferred); + } + + return status; + } + + private static String setSummaryResId(Context context, int resId) { + return context.getResources().getString(resId); + } + } diff --git a/src/com/android/settings/network/telephony/SmsDefaultSubscriptionController.java b/src/com/android/settings/network/telephony/SmsDefaultSubscriptionController.java index fadddd54745..ca8c0f6c5d3 100644 --- a/src/com/android/settings/network/telephony/SmsDefaultSubscriptionController.java +++ b/src/com/android/settings/network/telephony/SmsDefaultSubscriptionController.java @@ -21,6 +21,8 @@ import android.telecom.PhoneAccountHandle; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; +import com.android.settings.Utils; + public class SmsDefaultSubscriptionController extends DefaultSubscriptionController { private final boolean mIsAskEverytimeSupported; @@ -56,4 +58,13 @@ public class SmsDefaultSubscriptionController extends DefaultSubscriptionControl // Not supporting calling account override by VoIP return null; } + + @Override + public CharSequence getSummary() { + if (Utils.isProviderModelEnabled(mContext)) { + return MobileNetworkUtils.getPreferredStatus(mContext, mManager, false); + } else { + return super.getSummary(); + } + } } diff --git a/tests/unit/src/com/android/settings/network/NetworkProviderCallsSmsControllerTest.java b/tests/unit/src/com/android/settings/network/NetworkProviderCallsSmsControllerTest.java index 16433c3ad5d..eba45d4ffbb 100644 --- a/tests/unit/src/com/android/settings/network/NetworkProviderCallsSmsControllerTest.java +++ b/tests/unit/src/com/android/settings/network/NetworkProviderCallsSmsControllerTest.java @@ -93,7 +93,7 @@ public class NetworkProviderCallsSmsControllerTest { private int mDefaultVoiceSubscriptionId; private int mDefaultSmsSubscriptionId; - + private boolean mIsInService; @Override protected int getDefaultVoiceSubscriptionId() { return mDefaultVoiceSubscriptionId; @@ -104,6 +104,11 @@ public class NetworkProviderCallsSmsControllerTest { return mDefaultSmsSubscriptionId; } + @Override + protected boolean isInService(int subId) { + return mIsInService; + } + public void setDefaultVoiceSubscriptionId(int subscriptionId) { mDefaultVoiceSubscriptionId = subscriptionId; } @@ -111,6 +116,10 @@ public class NetworkProviderCallsSmsControllerTest { public void setDefaultSmsSubscriptionId(int subscriptionId) { mDefaultSmsSubscriptionId = subscriptionId; } + + public void setInService(boolean inService) { + mIsInService = inService; + } } @Before @@ -128,7 +137,7 @@ public class NetworkProviderCallsSmsControllerTest { mPreference = new RestrictedPreference(mContext); mPreference.setKey(KEY_PREFERENCE_CALLS_SMS); mController = new MockNetworkProviderCallsSmsController(mContext, mLifecycle); - + mController.setInService(true); mLifecycleRegistry = new LifecycleRegistry(mLifecycleOwner); when(mLifecycleOwner.getLifecycle()).thenReturn(mLifecycleRegistry); } @@ -176,7 +185,7 @@ public class NetworkProviderCallsSmsControllerTest { final StringBuilder summary = new StringBuilder(); summary.append(DISPLAY_NAME_1) .append(" (") - .append(setSummaryResId("calls_sms_unavailable")) + .append(setSummaryResId("calls_sms_temp_unavailable")) .append(")"); assertTrue(TextUtils.equals(mController.getSummary(), summary));