Loading src/com/android/settings/network/telephony/MobileNetworkUtils.java +43 −24 Original line number Diff line number Diff line Loading @@ -38,7 +38,10 @@ import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.euicc.EuiccManager; import android.telephony.ims.ProvisioningManager; import android.telephony.ims.feature.ImsFeature; import android.telephony.ims.feature.MmTelFeature; import android.telephony.ims.stub.ImsRegistrationImplBase; import android.text.TextUtils; import android.util.Log; import android.view.Gravity; Loading Loading @@ -96,7 +99,7 @@ public class MobileNetworkUtils { * Returns true if Wifi calling is enabled for at least one subscription. */ public static boolean isWifiCallingEnabled(Context context) { SubscriptionManager subManager = context.getSystemService(SubscriptionManager.class); final SubscriptionManager subManager = context.getSystemService(SubscriptionManager.class); if (subManager == null) { Log.e(TAG, "isWifiCallingEnabled: couldn't get system service."); return false; Loading @@ -109,6 +112,22 @@ public class MobileNetworkUtils { return false; } /** * Returns true if Wifi calling is provisioned for the specific subscription with id * {@code subId}. */ @VisibleForTesting public static boolean isWfcProvisionedOnDevice(int subId) { final ProvisioningManager provisioningMgr = ProvisioningManager.createForSubscriptionId(subId); if (provisioningMgr == null) { return true; } return provisioningMgr.getProvisioningStatusForCapability( MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE, ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN); } /** * Returns true if Wifi calling is enabled for the specific subscription with id {@code subId}. */ Loading @@ -119,15 +138,15 @@ public class MobileNetworkUtils { boolean isWifiCallingEnabled; if (simCallManager != null) { Intent intent = buildPhoneAccountConfigureIntent( final Intent intent = buildPhoneAccountConfigureIntent( context, simCallManager); isWifiCallingEnabled = intent != null; } else { ImsManager imsMgr = ImsManager.getInstance(context, phoneId); final ImsManager imsMgr = ImsManager.getInstance(context, phoneId); isWifiCallingEnabled = imsMgr != null && imsMgr.isWfcEnabledByPlatform() && imsMgr.isWfcProvisionedOnDevice() && isWfcProvisionedOnDevice(subId) && isImsServiceStateReady(imsMgr); } Loading Loading @@ -162,8 +181,8 @@ public class MobileNetworkUtils { intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, accountHandle); // Check to see that the phone account package can handle the setting intent. PackageManager pm = context.getPackageManager(); List<ResolveInfo> resolutions = pm.queryIntentActivities(intent, 0); final PackageManager pm = context.getPackageManager(); final List<ResolveInfo> resolutions = pm.queryIntentActivities(intent, 0); if (resolutions.size() == 0) { intent = null; // set no intent if the package cannot handle it. } Loading Loading @@ -194,7 +213,7 @@ public class MobileNetworkUtils { * the user has enabled development mode. */ public static boolean showEuiccSettings(Context context) { EuiccManager euiccManager = final EuiccManager euiccManager = (EuiccManager) context.getSystemService(EuiccManager.class); if (!euiccManager.isEnabled()) { return false; Loading @@ -202,16 +221,16 @@ public class MobileNetworkUtils { final ContentResolver cr = context.getContentResolver(); TelephonyManager tm = final TelephonyManager tm = (TelephonyManager) context.getSystemService(TelephonyManager.class); String currentCountry = tm.getNetworkCountryIso().toLowerCase(); String supportedCountries = final String currentCountry = tm.getNetworkCountryIso().toLowerCase(); final String supportedCountries = Settings.Global.getString(cr, Settings.Global.EUICC_SUPPORTED_COUNTRIES); boolean inEsimSupportedCountries = false; if (TextUtils.isEmpty(currentCountry)) { inEsimSupportedCountries = true; } else if (!TextUtils.isEmpty(supportedCountries)) { List<String> supportedCountryList = final List<String> supportedCountryList = Arrays.asList(TextUtils.split(supportedCountries.toLowerCase(), ",")); if (supportedCountryList.contains(currentCountry)) { inEsimSupportedCountries = true; Loading Loading @@ -244,7 +263,7 @@ public class MobileNetworkUtils { telephonyManager.setDataEnabled(enabled); if (disableOtherSubscriptions) { List<SubscriptionInfo> subInfoList = final List<SubscriptionInfo> subInfoList = subscriptionManager.getActiveSubscriptionInfoList(true); if (subInfoList != null) { for (SubscriptionInfo subInfo : subInfoList) { Loading Loading @@ -358,7 +377,7 @@ public class MobileNetworkUtils { * Return {@code true} if we need show settings for network selection(i.e. Verizon) */ public static boolean shouldDisplayNetworkSelectOptions(Context context, int subId) { final TelephonyManager telephonyManager = TelephonyManager.from(context) final TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class) .createForSubscriptionId(subId); final PersistableBundle carrierConfig = context.getSystemService( CarrierConfigManager.class).getConfigForSubId(subId); Loading Loading @@ -419,8 +438,8 @@ public class MobileNetworkUtils { return true; } String operatorNumeric = telephonyManager.getServiceState().getOperatorNumeric(); String[] numericArray = carrierConfig.getStringArray( final String operatorNumeric = telephonyManager.getServiceState().getOperatorNumeric(); final String[] numericArray = carrierConfig.getStringArray( CarrierConfigManager.KEY_SUPPORT_TDSCDMA_ROAMING_NETWORKS_STRING_ARRAY); if (numericArray == null || operatorNumeric == null) { return false; Loading Loading @@ -511,12 +530,12 @@ public class MobileNetworkUtils { public static Drawable getSignalStrengthIcon(Context context, int level, int numLevels, int iconType, boolean cutOut) { SignalDrawable signalDrawable = new SignalDrawable(context); final SignalDrawable signalDrawable = new SignalDrawable(context); signalDrawable.setLevel( SignalDrawable.getState(level, numLevels, cutOut)); // Make the network type drawable Drawable networkDrawable = final Drawable networkDrawable = iconType == NO_CELL_DATA_TYPE_ICON ? EMPTY_DRAWABLE : context Loading @@ -527,7 +546,7 @@ public class MobileNetworkUtils { final int iconSize = context.getResources().getDimensionPixelSize(R.dimen.signal_strength_icon_size); LayerDrawable icons = new LayerDrawable(layers); final LayerDrawable icons = new LayerDrawable(layers); // Set the network type icon at the top left icons.setLayerGravity(0 /* index of networkDrawable */, Gravity.TOP | Gravity.LEFT); // Set the signal strength icon at the bottom right Loading @@ -545,9 +564,9 @@ public class MobileNetworkUtils { * 2. Similar design which aligned with operator name displayed in status bar */ public static CharSequence getCurrentCarrierNameForDisplay(Context context, int subId) { SubscriptionManager sm = context.getSystemService(SubscriptionManager.class); final SubscriptionManager sm = context.getSystemService(SubscriptionManager.class); if (sm != null) { SubscriptionInfo subInfo = getSubscriptionInfo(sm, subId); final SubscriptionInfo subInfo = getSubscriptionInfo(sm, subId); if (subInfo != null) { return subInfo.getCarrierName(); } Loading @@ -556,10 +575,10 @@ public class MobileNetworkUtils { } public static CharSequence getCurrentCarrierNameForDisplay(Context context) { SubscriptionManager sm = context.getSystemService(SubscriptionManager.class); final SubscriptionManager sm = context.getSystemService(SubscriptionManager.class); if (sm != null) { int subId = sm.getDefaultSubscriptionId(); SubscriptionInfo subInfo = getSubscriptionInfo(sm, subId); final int subId = sm.getDefaultSubscriptionId(); final SubscriptionInfo subInfo = getSubscriptionInfo(sm, subId); if (subInfo != null) { return subInfo.getCarrierName(); } Loading @@ -585,7 +604,7 @@ public class MobileNetworkUtils { } private static String getOperatorNameFromTelephonyManager(Context context) { TelephonyManager tm = final TelephonyManager tm = (TelephonyManager) context.getSystemService(TelephonyManager.class); if (tm == null) { return null; Loading src/com/android/settings/network/telephony/WifiCallingPreferenceController.java +46 −21 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Looper; import android.os.PersistableBundle; import android.provider.Settings; import android.telecom.PhoneAccountHandle; Loading @@ -29,12 +28,12 @@ import android.telephony.CarrierConfigManager; import android.telephony.PhoneStateListener; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.ims.ImsMmTelManager; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.ims.ImsConfig; import com.android.ims.ImsManager; import com.android.settings.R; import com.android.settingslib.core.lifecycle.LifecycleObserver; Loading @@ -49,11 +48,13 @@ import java.util.List; public class WifiCallingPreferenceController extends TelephonyBasePreferenceController implements LifecycleObserver, OnStart, OnStop { private TelephonyManager mTelephonyManager; @VisibleForTesting Integer mCallState; @VisibleForTesting CarrierConfigManager mCarrierConfigManager; @VisibleForTesting ImsManager mImsManager; private ImsMmTelManager mImsMmTelManager; @VisibleForTesting PhoneAccountHandle mSimCallManager; private PhoneCallStateListener mPhoneStateListener; Loading @@ -62,8 +63,7 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont public WifiCallingPreferenceController(Context context, String key) { super(context, key); mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class); mTelephonyManager = context.getSystemService(TelephonyManager.class); mPhoneStateListener = new PhoneCallStateListener(Looper.getMainLooper()); mPhoneStateListener = new PhoneCallStateListener(); } @Override Loading @@ -76,7 +76,7 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont @Override public void onStart() { mPhoneStateListener.register(mSubId); mPhoneStateListener.register(mContext, mSubId); } @Override Loading @@ -88,7 +88,7 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mPreference = screen.findPreference(getPreferenceKey()); Intent intent = mPreference.getIntent(); final Intent intent = mPreference.getIntent(); if (intent != null) { intent.putExtra(Settings.EXTRA_SUB_ID, mSubId); } Loading @@ -97,15 +97,18 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont @Override public void updateState(Preference preference) { super.updateState(preference); if (mCallState == null) { return; } if (mSimCallManager != null) { Intent intent = MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext, final Intent intent = MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext, mSimCallManager); if (intent == null) { // Do nothing in this case since preference is invisible return; } final PackageManager pm = mContext.getPackageManager(); List<ResolveInfo> resolutions = pm.queryIntentActivities(intent, 0); final List<ResolveInfo> resolutions = pm.queryIntentActivities(intent, 0); preference.setTitle(resolutions.get(0).loadLabel(pm)); preference.setSummary(null); preference.setIntent(intent); Loading @@ -125,17 +128,20 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont .KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL); } } final boolean isRoaming = mTelephonyManager.isNetworkRoaming(); int wfcMode = mImsManager.getWfcMode(isRoaming && !useWfcHomeModeForRoaming); final boolean isRoaming = getTelephonyManager(mContext, mSubId) .isNetworkRoaming(); final int wfcMode = (isRoaming && !useWfcHomeModeForRoaming) ? mImsMmTelManager.getVoWiFiRoamingModeSetting() : mImsMmTelManager.getVoWiFiModeSetting(); switch (wfcMode) { case ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY: case ImsMmTelManager.WIFI_MODE_WIFI_ONLY: resId = com.android.internal.R.string.wfc_mode_wifi_only_summary; break; case ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED: case ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED: resId = com.android.internal.R.string .wfc_mode_cellular_preferred_summary; break; case ImsConfig.WfcModeFeatureValueConstants.WIFI_PREFERRED: case ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED: resId = com.android.internal.R.string.wfc_mode_wifi_preferred_summary; break; default: Loading @@ -144,37 +150,56 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont } preference.setSummary(resId); } preference.setEnabled( mTelephonyManager.getCallState(mSubId) == TelephonyManager.CALL_STATE_IDLE); preference.setEnabled(mCallState == TelephonyManager.CALL_STATE_IDLE); } public WifiCallingPreferenceController init(int subId) { mSubId = subId; mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId); mImsManager = ImsManager.getInstance(mContext, SubscriptionManager.getPhoneId(mSubId)); mImsMmTelManager = getImsMmTelManager(mSubId); mSimCallManager = mContext.getSystemService(TelecomManager.class) .getSimCallManagerForSubscription(mSubId); return this; } protected ImsMmTelManager getImsMmTelManager(int subId) { return ImsMmTelManager.createForSubscriptionId(subId); } @VisibleForTesting TelephonyManager getTelephonyManager(Context context, int subId) { final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class); if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { return telephonyMgr; } final TelephonyManager subscriptionTelephonyMgr = telephonyMgr.createForSubscriptionId(subId); return (subscriptionTelephonyMgr == null) ? telephonyMgr : subscriptionTelephonyMgr; } private class PhoneCallStateListener extends PhoneStateListener { public PhoneCallStateListener(Looper looper) { super(looper); PhoneCallStateListener() { super(); } private TelephonyManager mTelephonyManager; @Override public void onCallStateChanged(int state, String incomingNumber) { mCallState = state; updateState(mPreference); } public void register(int subId) { mSubId = subId; public void register(Context context, int subId) { mTelephonyManager = getTelephonyManager(context, subId); mTelephonyManager.listen(this, PhoneStateListener.LISTEN_CALL_STATE); } public void unregister() { mCallState = null; mTelephonyManager.listen(this, PhoneStateListener.LISTEN_NONE); } } Loading src/com/android/settings/wifi/calling/WifiCallingSettings.java +16 −6 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ import android.os.Bundle; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.ims.ProvisioningManager; import android.telephony.ims.feature.MmTelFeature; import android.telephony.ims.stub.ImsRegistrationImplBase; import android.util.Log; import android.view.LayoutInflater; import android.view.View; Loading Loading @@ -100,11 +103,11 @@ public class WifiCallingSettings extends InstrumentedFragment implements HelpRes if (mSil == null) { return; } Intent intent = getActivity().getIntent(); final Intent intent = getActivity().getIntent(); if (intent == null) { return; } int subId = intent.getIntExtra(Settings.EXTRA_SUB_ID, final int subId = intent.getIntExtra(Settings.EXTRA_SUB_ID, SubscriptionManager.INVALID_SUBSCRIPTION_ID); if (SubscriptionManager.isValidSubscriptionId(subId)) { for (SubscriptionInfo subInfo : mSil) { Loading Loading @@ -168,7 +171,7 @@ public class WifiCallingSettings extends InstrumentedFragment implements HelpRes args.putBoolean(SearchMenuController.NEED_SEARCH_ICON_IN_ACTION_BAR, false); args.putInt(WifiCallingSettingsForSub.FRAGMENT_BUNDLE_SUBID, mSil.get(position).getSubscriptionId()); WifiCallingSettingsForSub fragment = new WifiCallingSettingsForSub(); final WifiCallingSettingsForSub fragment = new WifiCallingSettingsForSub(); fragment.setArguments(args); return fragment; Loading @@ -195,14 +198,21 @@ public class WifiCallingSettings extends InstrumentedFragment implements HelpRes @VisibleForTesting boolean isWfcEnabledByPlatform(SubscriptionInfo info) { ImsManager imsManager = ImsManager.getInstance(getActivity(), info.getSimSlotIndex()); final ImsManager imsManager = ImsManager.getInstance(getActivity(), info.getSimSlotIndex()); return imsManager.isWfcEnabledByPlatform(); } @VisibleForTesting boolean isWfcProvisionedOnDevice(SubscriptionInfo info) { ImsManager imsManager = ImsManager.getInstance(getActivity(), info.getSimSlotIndex()); return imsManager.isWfcProvisionedOnDevice(); final ProvisioningManager provisioningMgr = ProvisioningManager.createForSubscriptionId(info.getSubscriptionId()); if (provisioningMgr == null) { return true; } return provisioningMgr.getProvisioningStatusForCapability( MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE, ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN); } private void updateSubList() { Loading src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java +56 −41 File changed.Preview size limit exceeded, changes collapsed. Show changes src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java +35 −22 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.os.PersistableBundle; import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import android.telephony.ims.ImsMmTelManager; import android.text.TextUtils; import android.util.Log; Loading @@ -44,6 +45,7 @@ import com.android.ims.ImsConfig; import com.android.ims.ImsManager; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.network.telephony.MobileNetworkUtils; import com.android.settings.slices.SliceBroadcastReceiver; import java.util.concurrent.Callable; Loading Loading @@ -138,7 +140,7 @@ public class WifiCallingSliceHelper { final ImsManager imsManager = getImsManager(subId); if (!imsManager.isWfcEnabledByPlatform() || !imsManager.isWfcProvisionedOnDevice()) { || !isWfcProvisionedOnDevice(subId)) { Log.d(TAG, "Wifi calling is either not provisioned or not enabled by Platform"); return null; } Loading Loading @@ -233,9 +235,10 @@ public class WifiCallingSliceHelper { final boolean isWifiOnlySupported = isCarrierConfigManagerKeyEnabled( CarrierConfigManager.KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL, subId, true); final ImsManager imsManager = getImsManager(subId); final ImsMmTelManager imsMmTelManager = getImsMmTelManager(subId); if (!imsManager.isWfcEnabledByPlatform() || !imsManager.isWfcProvisionedOnDevice()) { || !isWfcProvisionedOnDevice(subId)) { Log.d(TAG, "Wifi calling is either not provisioned or not enabled by platform"); return null; } Loading @@ -249,7 +252,7 @@ public class WifiCallingSliceHelper { int wfcMode = -1; try { isWifiCallingEnabled = isWifiCallingEnabled(imsManager); wfcMode = getWfcMode(imsManager); wfcMode = getWfcMode(imsMmTelManager); } catch (InterruptedException | ExecutionException | TimeoutException e) { Log.e(TAG, "Unable to get wifi calling preferred mode", e); return null; Loading Loading @@ -279,7 +282,7 @@ public class WifiCallingSliceHelper { Uri sliceUri) { final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.wifi_signal); // Top row shows information on current preference state ListBuilder listBuilder = new ListBuilder(mContext, sliceUri, ListBuilder.INFINITY) final ListBuilder listBuilder = new ListBuilder(mContext, sliceUri, ListBuilder.INFINITY) .setAccentColor(Utils.getColorAccentDefaultColor(mContext)); listBuilder.setHeader(new ListBuilder.HeaderBuilder() .setTitle(mContext.getText(R.string.wifi_calling_mode_title)) Loading @@ -294,18 +297,18 @@ public class WifiCallingSliceHelper { listBuilder.addRow(wifiPreferenceRowBuilder(listBuilder, com.android.internal.R.string.wfc_mode_wifi_only_summary, ACTION_WIFI_CALLING_PREFERENCE_WIFI_ONLY, currentWfcPref == ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY)); currentWfcPref == ImsMmTelManager.WIFI_MODE_WIFI_ONLY)); } listBuilder.addRow(wifiPreferenceRowBuilder(listBuilder, com.android.internal.R.string.wfc_mode_wifi_preferred_summary, ACTION_WIFI_CALLING_PREFERENCE_WIFI_PREFERRED, currentWfcPref == ImsConfig.WfcModeFeatureValueConstants.WIFI_PREFERRED)); currentWfcPref == ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED)); listBuilder.addRow(wifiPreferenceRowBuilder(listBuilder, com.android.internal.R.string.wfc_mode_cellular_preferred_summary, ACTION_WIFI_CALLING_PREFERENCE_CELLULAR_PREFERRED, currentWfcPref == ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED)); currentWfcPref == ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED)); return listBuilder.build(); } Loading Loading @@ -337,13 +340,13 @@ public class WifiCallingSliceHelper { */ private CharSequence getWifiCallingPreferenceSummary(int wfcMode) { switch (wfcMode) { case ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY: case ImsMmTelManager.WIFI_MODE_WIFI_ONLY: return mContext.getText( com.android.internal.R.string.wfc_mode_wifi_only_summary); case ImsConfig.WfcModeFeatureValueConstants.WIFI_PREFERRED: case ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED: return mContext.getText( com.android.internal.R.string.wfc_mode_wifi_preferred_summary); case ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED: case ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED: return mContext.getText( com.android.internal.R.string.wfc_mode_cellular_preferred_summary); default: Loading @@ -355,15 +358,19 @@ public class WifiCallingSliceHelper { return ImsManager.getInstance(mContext, SubscriptionManager.getPhoneId(subId)); } private int getWfcMode(ImsManager imsManager) protected ImsMmTelManager getImsMmTelManager(int subId) { return ImsMmTelManager.createForSubscriptionId(subId); } private int getWfcMode(ImsMmTelManager imsMmTelManager) throws InterruptedException, ExecutionException, TimeoutException { FutureTask<Integer> wfcModeTask = new FutureTask<>(new Callable<Integer>() { final FutureTask<Integer> wfcModeTask = new FutureTask<>(new Callable<Integer>() { @Override public Integer call() { return imsManager.getWfcMode(false); return imsMmTelManager.getVoWiFiModeSetting(); } }); ExecutorService executor = Executors.newSingleThreadExecutor(); final ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(wfcModeTask); return wfcModeTask.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); } Loading @@ -380,7 +387,7 @@ public class WifiCallingSliceHelper { if (subId > SubscriptionManager.INVALID_SUBSCRIPTION_ID) { final ImsManager imsManager = getImsManager(subId); if (imsManager.isWfcEnabledByPlatform() && imsManager.isWfcProvisionedOnDevice()) { && isWfcProvisionedOnDevice(subId)) { final boolean currentValue = imsManager.isWfcEnabledByUser() && imsManager.isNonTtyOrTtyOnVolteEnabled(); final boolean newValue = intent.getBooleanExtra(EXTRA_TOGGLE_STATE, Loading Loading @@ -420,33 +427,34 @@ public class WifiCallingSliceHelper { final boolean isWifiOnlySupported = isCarrierConfigManagerKeyEnabled( CarrierConfigManager.KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL, subId, true); ImsManager imsManager = getImsManager(subId); final ImsManager imsManager = getImsManager(subId); if (isWifiCallingPrefEditable && imsManager.isWfcEnabledByPlatform() && imsManager.isWfcProvisionedOnDevice() && isWfcProvisionedOnDevice(subId) && imsManager.isWfcEnabledByUser() && imsManager.isNonTtyOrTtyOnVolteEnabled()) { // Change the preference only when wifi calling is enabled // And when wifi calling preference is editable for the current carrier final int currentValue = imsManager.getWfcMode(false); final ImsMmTelManager imsMmTelManager = getImsMmTelManager(subId); final int currentValue = imsMmTelManager.getVoWiFiModeSetting(); int newValue = errorValue; switch (intent.getAction()) { case ACTION_WIFI_CALLING_PREFERENCE_WIFI_ONLY: if (isWifiOnlySupported) { // change to wifi_only when wifi_only is enabled. newValue = ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY; newValue = ImsMmTelManager.WIFI_MODE_WIFI_ONLY; } break; case ACTION_WIFI_CALLING_PREFERENCE_WIFI_PREFERRED: newValue = ImsConfig.WfcModeFeatureValueConstants.WIFI_PREFERRED; newValue = ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED; break; case ACTION_WIFI_CALLING_PREFERENCE_CELLULAR_PREFERRED: newValue = ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED; newValue = ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED; break; } if (newValue != errorValue && newValue != currentValue) { // Update the setting only when there is a valid update imsManager.setWfcMode(newValue, false); imsMmTelManager.setVoWiFiModeSetting(newValue); } } } Loading Loading @@ -505,6 +513,11 @@ public class WifiCallingSliceHelper { return SubscriptionManager.getDefaultVoiceSubscriptionId(); } @VisibleForTesting boolean isWfcProvisionedOnDevice(int subId) { return MobileNetworkUtils.isWfcProvisionedOnDevice(subId); } /** * Returns Intent of the activation app required to activate wifi calling or null if there is no * need for activation. Loading Loading
src/com/android/settings/network/telephony/MobileNetworkUtils.java +43 −24 Original line number Diff line number Diff line Loading @@ -38,7 +38,10 @@ import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.euicc.EuiccManager; import android.telephony.ims.ProvisioningManager; import android.telephony.ims.feature.ImsFeature; import android.telephony.ims.feature.MmTelFeature; import android.telephony.ims.stub.ImsRegistrationImplBase; import android.text.TextUtils; import android.util.Log; import android.view.Gravity; Loading Loading @@ -96,7 +99,7 @@ public class MobileNetworkUtils { * Returns true if Wifi calling is enabled for at least one subscription. */ public static boolean isWifiCallingEnabled(Context context) { SubscriptionManager subManager = context.getSystemService(SubscriptionManager.class); final SubscriptionManager subManager = context.getSystemService(SubscriptionManager.class); if (subManager == null) { Log.e(TAG, "isWifiCallingEnabled: couldn't get system service."); return false; Loading @@ -109,6 +112,22 @@ public class MobileNetworkUtils { return false; } /** * Returns true if Wifi calling is provisioned for the specific subscription with id * {@code subId}. */ @VisibleForTesting public static boolean isWfcProvisionedOnDevice(int subId) { final ProvisioningManager provisioningMgr = ProvisioningManager.createForSubscriptionId(subId); if (provisioningMgr == null) { return true; } return provisioningMgr.getProvisioningStatusForCapability( MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE, ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN); } /** * Returns true if Wifi calling is enabled for the specific subscription with id {@code subId}. */ Loading @@ -119,15 +138,15 @@ public class MobileNetworkUtils { boolean isWifiCallingEnabled; if (simCallManager != null) { Intent intent = buildPhoneAccountConfigureIntent( final Intent intent = buildPhoneAccountConfigureIntent( context, simCallManager); isWifiCallingEnabled = intent != null; } else { ImsManager imsMgr = ImsManager.getInstance(context, phoneId); final ImsManager imsMgr = ImsManager.getInstance(context, phoneId); isWifiCallingEnabled = imsMgr != null && imsMgr.isWfcEnabledByPlatform() && imsMgr.isWfcProvisionedOnDevice() && isWfcProvisionedOnDevice(subId) && isImsServiceStateReady(imsMgr); } Loading Loading @@ -162,8 +181,8 @@ public class MobileNetworkUtils { intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, accountHandle); // Check to see that the phone account package can handle the setting intent. PackageManager pm = context.getPackageManager(); List<ResolveInfo> resolutions = pm.queryIntentActivities(intent, 0); final PackageManager pm = context.getPackageManager(); final List<ResolveInfo> resolutions = pm.queryIntentActivities(intent, 0); if (resolutions.size() == 0) { intent = null; // set no intent if the package cannot handle it. } Loading Loading @@ -194,7 +213,7 @@ public class MobileNetworkUtils { * the user has enabled development mode. */ public static boolean showEuiccSettings(Context context) { EuiccManager euiccManager = final EuiccManager euiccManager = (EuiccManager) context.getSystemService(EuiccManager.class); if (!euiccManager.isEnabled()) { return false; Loading @@ -202,16 +221,16 @@ public class MobileNetworkUtils { final ContentResolver cr = context.getContentResolver(); TelephonyManager tm = final TelephonyManager tm = (TelephonyManager) context.getSystemService(TelephonyManager.class); String currentCountry = tm.getNetworkCountryIso().toLowerCase(); String supportedCountries = final String currentCountry = tm.getNetworkCountryIso().toLowerCase(); final String supportedCountries = Settings.Global.getString(cr, Settings.Global.EUICC_SUPPORTED_COUNTRIES); boolean inEsimSupportedCountries = false; if (TextUtils.isEmpty(currentCountry)) { inEsimSupportedCountries = true; } else if (!TextUtils.isEmpty(supportedCountries)) { List<String> supportedCountryList = final List<String> supportedCountryList = Arrays.asList(TextUtils.split(supportedCountries.toLowerCase(), ",")); if (supportedCountryList.contains(currentCountry)) { inEsimSupportedCountries = true; Loading Loading @@ -244,7 +263,7 @@ public class MobileNetworkUtils { telephonyManager.setDataEnabled(enabled); if (disableOtherSubscriptions) { List<SubscriptionInfo> subInfoList = final List<SubscriptionInfo> subInfoList = subscriptionManager.getActiveSubscriptionInfoList(true); if (subInfoList != null) { for (SubscriptionInfo subInfo : subInfoList) { Loading Loading @@ -358,7 +377,7 @@ public class MobileNetworkUtils { * Return {@code true} if we need show settings for network selection(i.e. Verizon) */ public static boolean shouldDisplayNetworkSelectOptions(Context context, int subId) { final TelephonyManager telephonyManager = TelephonyManager.from(context) final TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class) .createForSubscriptionId(subId); final PersistableBundle carrierConfig = context.getSystemService( CarrierConfigManager.class).getConfigForSubId(subId); Loading Loading @@ -419,8 +438,8 @@ public class MobileNetworkUtils { return true; } String operatorNumeric = telephonyManager.getServiceState().getOperatorNumeric(); String[] numericArray = carrierConfig.getStringArray( final String operatorNumeric = telephonyManager.getServiceState().getOperatorNumeric(); final String[] numericArray = carrierConfig.getStringArray( CarrierConfigManager.KEY_SUPPORT_TDSCDMA_ROAMING_NETWORKS_STRING_ARRAY); if (numericArray == null || operatorNumeric == null) { return false; Loading Loading @@ -511,12 +530,12 @@ public class MobileNetworkUtils { public static Drawable getSignalStrengthIcon(Context context, int level, int numLevels, int iconType, boolean cutOut) { SignalDrawable signalDrawable = new SignalDrawable(context); final SignalDrawable signalDrawable = new SignalDrawable(context); signalDrawable.setLevel( SignalDrawable.getState(level, numLevels, cutOut)); // Make the network type drawable Drawable networkDrawable = final Drawable networkDrawable = iconType == NO_CELL_DATA_TYPE_ICON ? EMPTY_DRAWABLE : context Loading @@ -527,7 +546,7 @@ public class MobileNetworkUtils { final int iconSize = context.getResources().getDimensionPixelSize(R.dimen.signal_strength_icon_size); LayerDrawable icons = new LayerDrawable(layers); final LayerDrawable icons = new LayerDrawable(layers); // Set the network type icon at the top left icons.setLayerGravity(0 /* index of networkDrawable */, Gravity.TOP | Gravity.LEFT); // Set the signal strength icon at the bottom right Loading @@ -545,9 +564,9 @@ public class MobileNetworkUtils { * 2. Similar design which aligned with operator name displayed in status bar */ public static CharSequence getCurrentCarrierNameForDisplay(Context context, int subId) { SubscriptionManager sm = context.getSystemService(SubscriptionManager.class); final SubscriptionManager sm = context.getSystemService(SubscriptionManager.class); if (sm != null) { SubscriptionInfo subInfo = getSubscriptionInfo(sm, subId); final SubscriptionInfo subInfo = getSubscriptionInfo(sm, subId); if (subInfo != null) { return subInfo.getCarrierName(); } Loading @@ -556,10 +575,10 @@ public class MobileNetworkUtils { } public static CharSequence getCurrentCarrierNameForDisplay(Context context) { SubscriptionManager sm = context.getSystemService(SubscriptionManager.class); final SubscriptionManager sm = context.getSystemService(SubscriptionManager.class); if (sm != null) { int subId = sm.getDefaultSubscriptionId(); SubscriptionInfo subInfo = getSubscriptionInfo(sm, subId); final int subId = sm.getDefaultSubscriptionId(); final SubscriptionInfo subInfo = getSubscriptionInfo(sm, subId); if (subInfo != null) { return subInfo.getCarrierName(); } Loading @@ -585,7 +604,7 @@ public class MobileNetworkUtils { } private static String getOperatorNameFromTelephonyManager(Context context) { TelephonyManager tm = final TelephonyManager tm = (TelephonyManager) context.getSystemService(TelephonyManager.class); if (tm == null) { return null; Loading
src/com/android/settings/network/telephony/WifiCallingPreferenceController.java +46 −21 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Looper; import android.os.PersistableBundle; import android.provider.Settings; import android.telecom.PhoneAccountHandle; Loading @@ -29,12 +28,12 @@ import android.telephony.CarrierConfigManager; import android.telephony.PhoneStateListener; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.ims.ImsMmTelManager; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.ims.ImsConfig; import com.android.ims.ImsManager; import com.android.settings.R; import com.android.settingslib.core.lifecycle.LifecycleObserver; Loading @@ -49,11 +48,13 @@ import java.util.List; public class WifiCallingPreferenceController extends TelephonyBasePreferenceController implements LifecycleObserver, OnStart, OnStop { private TelephonyManager mTelephonyManager; @VisibleForTesting Integer mCallState; @VisibleForTesting CarrierConfigManager mCarrierConfigManager; @VisibleForTesting ImsManager mImsManager; private ImsMmTelManager mImsMmTelManager; @VisibleForTesting PhoneAccountHandle mSimCallManager; private PhoneCallStateListener mPhoneStateListener; Loading @@ -62,8 +63,7 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont public WifiCallingPreferenceController(Context context, String key) { super(context, key); mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class); mTelephonyManager = context.getSystemService(TelephonyManager.class); mPhoneStateListener = new PhoneCallStateListener(Looper.getMainLooper()); mPhoneStateListener = new PhoneCallStateListener(); } @Override Loading @@ -76,7 +76,7 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont @Override public void onStart() { mPhoneStateListener.register(mSubId); mPhoneStateListener.register(mContext, mSubId); } @Override Loading @@ -88,7 +88,7 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mPreference = screen.findPreference(getPreferenceKey()); Intent intent = mPreference.getIntent(); final Intent intent = mPreference.getIntent(); if (intent != null) { intent.putExtra(Settings.EXTRA_SUB_ID, mSubId); } Loading @@ -97,15 +97,18 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont @Override public void updateState(Preference preference) { super.updateState(preference); if (mCallState == null) { return; } if (mSimCallManager != null) { Intent intent = MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext, final Intent intent = MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext, mSimCallManager); if (intent == null) { // Do nothing in this case since preference is invisible return; } final PackageManager pm = mContext.getPackageManager(); List<ResolveInfo> resolutions = pm.queryIntentActivities(intent, 0); final List<ResolveInfo> resolutions = pm.queryIntentActivities(intent, 0); preference.setTitle(resolutions.get(0).loadLabel(pm)); preference.setSummary(null); preference.setIntent(intent); Loading @@ -125,17 +128,20 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont .KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL); } } final boolean isRoaming = mTelephonyManager.isNetworkRoaming(); int wfcMode = mImsManager.getWfcMode(isRoaming && !useWfcHomeModeForRoaming); final boolean isRoaming = getTelephonyManager(mContext, mSubId) .isNetworkRoaming(); final int wfcMode = (isRoaming && !useWfcHomeModeForRoaming) ? mImsMmTelManager.getVoWiFiRoamingModeSetting() : mImsMmTelManager.getVoWiFiModeSetting(); switch (wfcMode) { case ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY: case ImsMmTelManager.WIFI_MODE_WIFI_ONLY: resId = com.android.internal.R.string.wfc_mode_wifi_only_summary; break; case ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED: case ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED: resId = com.android.internal.R.string .wfc_mode_cellular_preferred_summary; break; case ImsConfig.WfcModeFeatureValueConstants.WIFI_PREFERRED: case ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED: resId = com.android.internal.R.string.wfc_mode_wifi_preferred_summary; break; default: Loading @@ -144,37 +150,56 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont } preference.setSummary(resId); } preference.setEnabled( mTelephonyManager.getCallState(mSubId) == TelephonyManager.CALL_STATE_IDLE); preference.setEnabled(mCallState == TelephonyManager.CALL_STATE_IDLE); } public WifiCallingPreferenceController init(int subId) { mSubId = subId; mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId); mImsManager = ImsManager.getInstance(mContext, SubscriptionManager.getPhoneId(mSubId)); mImsMmTelManager = getImsMmTelManager(mSubId); mSimCallManager = mContext.getSystemService(TelecomManager.class) .getSimCallManagerForSubscription(mSubId); return this; } protected ImsMmTelManager getImsMmTelManager(int subId) { return ImsMmTelManager.createForSubscriptionId(subId); } @VisibleForTesting TelephonyManager getTelephonyManager(Context context, int subId) { final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class); if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { return telephonyMgr; } final TelephonyManager subscriptionTelephonyMgr = telephonyMgr.createForSubscriptionId(subId); return (subscriptionTelephonyMgr == null) ? telephonyMgr : subscriptionTelephonyMgr; } private class PhoneCallStateListener extends PhoneStateListener { public PhoneCallStateListener(Looper looper) { super(looper); PhoneCallStateListener() { super(); } private TelephonyManager mTelephonyManager; @Override public void onCallStateChanged(int state, String incomingNumber) { mCallState = state; updateState(mPreference); } public void register(int subId) { mSubId = subId; public void register(Context context, int subId) { mTelephonyManager = getTelephonyManager(context, subId); mTelephonyManager.listen(this, PhoneStateListener.LISTEN_CALL_STATE); } public void unregister() { mCallState = null; mTelephonyManager.listen(this, PhoneStateListener.LISTEN_NONE); } } Loading
src/com/android/settings/wifi/calling/WifiCallingSettings.java +16 −6 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ import android.os.Bundle; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.ims.ProvisioningManager; import android.telephony.ims.feature.MmTelFeature; import android.telephony.ims.stub.ImsRegistrationImplBase; import android.util.Log; import android.view.LayoutInflater; import android.view.View; Loading Loading @@ -100,11 +103,11 @@ public class WifiCallingSettings extends InstrumentedFragment implements HelpRes if (mSil == null) { return; } Intent intent = getActivity().getIntent(); final Intent intent = getActivity().getIntent(); if (intent == null) { return; } int subId = intent.getIntExtra(Settings.EXTRA_SUB_ID, final int subId = intent.getIntExtra(Settings.EXTRA_SUB_ID, SubscriptionManager.INVALID_SUBSCRIPTION_ID); if (SubscriptionManager.isValidSubscriptionId(subId)) { for (SubscriptionInfo subInfo : mSil) { Loading Loading @@ -168,7 +171,7 @@ public class WifiCallingSettings extends InstrumentedFragment implements HelpRes args.putBoolean(SearchMenuController.NEED_SEARCH_ICON_IN_ACTION_BAR, false); args.putInt(WifiCallingSettingsForSub.FRAGMENT_BUNDLE_SUBID, mSil.get(position).getSubscriptionId()); WifiCallingSettingsForSub fragment = new WifiCallingSettingsForSub(); final WifiCallingSettingsForSub fragment = new WifiCallingSettingsForSub(); fragment.setArguments(args); return fragment; Loading @@ -195,14 +198,21 @@ public class WifiCallingSettings extends InstrumentedFragment implements HelpRes @VisibleForTesting boolean isWfcEnabledByPlatform(SubscriptionInfo info) { ImsManager imsManager = ImsManager.getInstance(getActivity(), info.getSimSlotIndex()); final ImsManager imsManager = ImsManager.getInstance(getActivity(), info.getSimSlotIndex()); return imsManager.isWfcEnabledByPlatform(); } @VisibleForTesting boolean isWfcProvisionedOnDevice(SubscriptionInfo info) { ImsManager imsManager = ImsManager.getInstance(getActivity(), info.getSimSlotIndex()); return imsManager.isWfcProvisionedOnDevice(); final ProvisioningManager provisioningMgr = ProvisioningManager.createForSubscriptionId(info.getSubscriptionId()); if (provisioningMgr == null) { return true; } return provisioningMgr.getProvisioningStatusForCapability( MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE, ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN); } private void updateSubList() { Loading
src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java +56 −41 File changed.Preview size limit exceeded, changes collapsed. Show changes
src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java +35 −22 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.os.PersistableBundle; import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import android.telephony.ims.ImsMmTelManager; import android.text.TextUtils; import android.util.Log; Loading @@ -44,6 +45,7 @@ import com.android.ims.ImsConfig; import com.android.ims.ImsManager; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.network.telephony.MobileNetworkUtils; import com.android.settings.slices.SliceBroadcastReceiver; import java.util.concurrent.Callable; Loading Loading @@ -138,7 +140,7 @@ public class WifiCallingSliceHelper { final ImsManager imsManager = getImsManager(subId); if (!imsManager.isWfcEnabledByPlatform() || !imsManager.isWfcProvisionedOnDevice()) { || !isWfcProvisionedOnDevice(subId)) { Log.d(TAG, "Wifi calling is either not provisioned or not enabled by Platform"); return null; } Loading Loading @@ -233,9 +235,10 @@ public class WifiCallingSliceHelper { final boolean isWifiOnlySupported = isCarrierConfigManagerKeyEnabled( CarrierConfigManager.KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL, subId, true); final ImsManager imsManager = getImsManager(subId); final ImsMmTelManager imsMmTelManager = getImsMmTelManager(subId); if (!imsManager.isWfcEnabledByPlatform() || !imsManager.isWfcProvisionedOnDevice()) { || !isWfcProvisionedOnDevice(subId)) { Log.d(TAG, "Wifi calling is either not provisioned or not enabled by platform"); return null; } Loading @@ -249,7 +252,7 @@ public class WifiCallingSliceHelper { int wfcMode = -1; try { isWifiCallingEnabled = isWifiCallingEnabled(imsManager); wfcMode = getWfcMode(imsManager); wfcMode = getWfcMode(imsMmTelManager); } catch (InterruptedException | ExecutionException | TimeoutException e) { Log.e(TAG, "Unable to get wifi calling preferred mode", e); return null; Loading Loading @@ -279,7 +282,7 @@ public class WifiCallingSliceHelper { Uri sliceUri) { final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.wifi_signal); // Top row shows information on current preference state ListBuilder listBuilder = new ListBuilder(mContext, sliceUri, ListBuilder.INFINITY) final ListBuilder listBuilder = new ListBuilder(mContext, sliceUri, ListBuilder.INFINITY) .setAccentColor(Utils.getColorAccentDefaultColor(mContext)); listBuilder.setHeader(new ListBuilder.HeaderBuilder() .setTitle(mContext.getText(R.string.wifi_calling_mode_title)) Loading @@ -294,18 +297,18 @@ public class WifiCallingSliceHelper { listBuilder.addRow(wifiPreferenceRowBuilder(listBuilder, com.android.internal.R.string.wfc_mode_wifi_only_summary, ACTION_WIFI_CALLING_PREFERENCE_WIFI_ONLY, currentWfcPref == ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY)); currentWfcPref == ImsMmTelManager.WIFI_MODE_WIFI_ONLY)); } listBuilder.addRow(wifiPreferenceRowBuilder(listBuilder, com.android.internal.R.string.wfc_mode_wifi_preferred_summary, ACTION_WIFI_CALLING_PREFERENCE_WIFI_PREFERRED, currentWfcPref == ImsConfig.WfcModeFeatureValueConstants.WIFI_PREFERRED)); currentWfcPref == ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED)); listBuilder.addRow(wifiPreferenceRowBuilder(listBuilder, com.android.internal.R.string.wfc_mode_cellular_preferred_summary, ACTION_WIFI_CALLING_PREFERENCE_CELLULAR_PREFERRED, currentWfcPref == ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED)); currentWfcPref == ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED)); return listBuilder.build(); } Loading Loading @@ -337,13 +340,13 @@ public class WifiCallingSliceHelper { */ private CharSequence getWifiCallingPreferenceSummary(int wfcMode) { switch (wfcMode) { case ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY: case ImsMmTelManager.WIFI_MODE_WIFI_ONLY: return mContext.getText( com.android.internal.R.string.wfc_mode_wifi_only_summary); case ImsConfig.WfcModeFeatureValueConstants.WIFI_PREFERRED: case ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED: return mContext.getText( com.android.internal.R.string.wfc_mode_wifi_preferred_summary); case ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED: case ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED: return mContext.getText( com.android.internal.R.string.wfc_mode_cellular_preferred_summary); default: Loading @@ -355,15 +358,19 @@ public class WifiCallingSliceHelper { return ImsManager.getInstance(mContext, SubscriptionManager.getPhoneId(subId)); } private int getWfcMode(ImsManager imsManager) protected ImsMmTelManager getImsMmTelManager(int subId) { return ImsMmTelManager.createForSubscriptionId(subId); } private int getWfcMode(ImsMmTelManager imsMmTelManager) throws InterruptedException, ExecutionException, TimeoutException { FutureTask<Integer> wfcModeTask = new FutureTask<>(new Callable<Integer>() { final FutureTask<Integer> wfcModeTask = new FutureTask<>(new Callable<Integer>() { @Override public Integer call() { return imsManager.getWfcMode(false); return imsMmTelManager.getVoWiFiModeSetting(); } }); ExecutorService executor = Executors.newSingleThreadExecutor(); final ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(wfcModeTask); return wfcModeTask.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); } Loading @@ -380,7 +387,7 @@ public class WifiCallingSliceHelper { if (subId > SubscriptionManager.INVALID_SUBSCRIPTION_ID) { final ImsManager imsManager = getImsManager(subId); if (imsManager.isWfcEnabledByPlatform() && imsManager.isWfcProvisionedOnDevice()) { && isWfcProvisionedOnDevice(subId)) { final boolean currentValue = imsManager.isWfcEnabledByUser() && imsManager.isNonTtyOrTtyOnVolteEnabled(); final boolean newValue = intent.getBooleanExtra(EXTRA_TOGGLE_STATE, Loading Loading @@ -420,33 +427,34 @@ public class WifiCallingSliceHelper { final boolean isWifiOnlySupported = isCarrierConfigManagerKeyEnabled( CarrierConfigManager.KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL, subId, true); ImsManager imsManager = getImsManager(subId); final ImsManager imsManager = getImsManager(subId); if (isWifiCallingPrefEditable && imsManager.isWfcEnabledByPlatform() && imsManager.isWfcProvisionedOnDevice() && isWfcProvisionedOnDevice(subId) && imsManager.isWfcEnabledByUser() && imsManager.isNonTtyOrTtyOnVolteEnabled()) { // Change the preference only when wifi calling is enabled // And when wifi calling preference is editable for the current carrier final int currentValue = imsManager.getWfcMode(false); final ImsMmTelManager imsMmTelManager = getImsMmTelManager(subId); final int currentValue = imsMmTelManager.getVoWiFiModeSetting(); int newValue = errorValue; switch (intent.getAction()) { case ACTION_WIFI_CALLING_PREFERENCE_WIFI_ONLY: if (isWifiOnlySupported) { // change to wifi_only when wifi_only is enabled. newValue = ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY; newValue = ImsMmTelManager.WIFI_MODE_WIFI_ONLY; } break; case ACTION_WIFI_CALLING_PREFERENCE_WIFI_PREFERRED: newValue = ImsConfig.WfcModeFeatureValueConstants.WIFI_PREFERRED; newValue = ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED; break; case ACTION_WIFI_CALLING_PREFERENCE_CELLULAR_PREFERRED: newValue = ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED; newValue = ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED; break; } if (newValue != errorValue && newValue != currentValue) { // Update the setting only when there is a valid update imsManager.setWfcMode(newValue, false); imsMmTelManager.setVoWiFiModeSetting(newValue); } } } Loading Loading @@ -505,6 +513,11 @@ public class WifiCallingSliceHelper { return SubscriptionManager.getDefaultVoiceSubscriptionId(); } @VisibleForTesting boolean isWfcProvisionedOnDevice(int subId) { return MobileNetworkUtils.isWfcProvisionedOnDevice(subId); } /** * Returns Intent of the activation app required to activate wifi calling or null if there is no * need for activation. Loading