Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 95e1c8d0 authored by Bonian Chen's avatar Bonian Chen Committed by Gerrit Code Review
Browse files

Merge "[Settings] Fix conflict of AOSP merge on wifi call"

parents 0e7b8f7a cacf047d
Loading
Loading
Loading
Loading
+43 −24
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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}.
     */
@@ -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);
        }

@@ -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.
        }
@@ -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;
@@ -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;
@@ -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) {
@@ -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);
@@ -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;
@@ -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
@@ -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
@@ -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();
            }
@@ -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();
            }
@@ -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;
+46 −21
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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
@@ -76,7 +76,7 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont

    @Override
    public void onStart() {
        mPhoneStateListener.register(mSubId);
        mPhoneStateListener.register(mContext, mSubId);
    }

    @Override
@@ -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);
        }
@@ -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);
@@ -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:
@@ -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);
        }
    }
+16 −6
Original line number Diff line number Diff line
@@ -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;
@@ -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) {
@@ -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;
@@ -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() {
+56 −41

File changed.

Preview size limit exceeded, changes collapsed.

+35 −22
Original line number Diff line number Diff line
@@ -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;

@@ -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;
@@ -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;
        }
@@ -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;
        }
@@ -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;
@@ -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))
@@ -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();
    }
@@ -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:
@@ -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);
    }
@@ -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,
@@ -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);
                }
            }
        }
@@ -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