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

Commit 61e00344 authored by Bonian Chen's avatar Bonian Chen Committed by Gerrit Code Review
Browse files

Merge "[Settings] Refactor of Wifi Calling part"

parents 8889d601 5042276c
Loading
Loading
Loading
Loading
+71 −41
Original line number Diff line number Diff line
@@ -34,8 +34,8 @@ import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;

import com.android.ims.ImsManager;
import com.android.settings.R;
import com.android.settings.network.ims.WifiCallingQueryImsState;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -48,12 +48,12 @@ import java.util.List;
public class WifiCallingPreferenceController extends TelephonyBasePreferenceController implements
        LifecycleObserver, OnStart, OnStop {

    private static final String TAG = "WifiCallingPreference";

    @VisibleForTesting
    Integer mCallState;
    @VisibleForTesting
    CarrierConfigManager mCarrierConfigManager;
    @VisibleForTesting
    ImsManager mImsManager;
    private ImsMmTelManager mImsMmTelManager;
    @VisibleForTesting
    PhoneAccountHandle mSimCallManager;
@@ -68,8 +68,8 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont

    @Override
    public int getAvailabilityStatus(int subId) {
        return subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID
                && MobileNetworkUtils.isWifiCallingEnabled(mContext, subId)
        return SubscriptionManager.isValidSubscriptionId(subId)
                && isWifiCallingEnabled(mContext, subId)
                ? AVAILABLE
                : UNSUPPORTED_ON_DEVICE;
    }
@@ -100,6 +100,7 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont
        if (mCallState == null) {
            return;
        }
        CharSequence summaryText = null;
        if (mSimCallManager != null) {
            final Intent intent = MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext,
                    mSimCallManager);
@@ -110,25 +111,31 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont
            final PackageManager pm = mContext.getPackageManager();
            final List<ResolveInfo> resolutions = pm.queryIntentActivities(intent, 0);
            preference.setTitle(resolutions.get(0).loadLabel(pm));
            preference.setSummary(null);
            preference.setIntent(intent);
        } else {
            final String title = SubscriptionManager.getResourcesForSubId(mContext, mSubId)
                    .getString(R.string.wifi_calling_settings_title);
            preference.setTitle(title);
            summaryText = getResourceIdForWfcMode(mSubId);
        }
        preference.setSummary(summaryText);
        preference.setEnabled(mCallState == TelephonyManager.CALL_STATE_IDLE);
    }

    private CharSequence getResourceIdForWfcMode(int subId) {
        int resId = com.android.internal.R.string.wifi_calling_off_summary;
            if (mImsManager.isWfcEnabledByUser()) {
        if (queryImsState(subId).isEnabledByUser()) {
            boolean useWfcHomeModeForRoaming = false;
            if (mCarrierConfigManager != null) {
                final PersistableBundle carrierConfig =
                            mCarrierConfigManager.getConfigForSubId(mSubId);
                        mCarrierConfigManager.getConfigForSubId(subId);
                if (carrierConfig != null) {
                    useWfcHomeModeForRoaming = carrierConfig.getBoolean(
                            CarrierConfigManager
                                    .KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL);
                }
            }
                final boolean isRoaming = getTelephonyManager(mContext, mSubId)
            final boolean isRoaming = getTelephonyManager(mContext, subId)
                    .isNetworkRoaming();
            final int wfcMode = (isRoaming && !useWfcHomeModeForRoaming)
                    ? mImsMmTelManager.getVoWiFiRoamingModeSetting() :
@@ -148,15 +155,11 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont
                    break;
            }
        }
            preference.setSummary(
                    SubscriptionManager.getResourcesForSubId(mContext, mSubId).getText(resId));
        }
        preference.setEnabled(mCallState == TelephonyManager.CALL_STATE_IDLE);
        return SubscriptionManager.getResourcesForSubId(mContext, subId).getText(resId);
    }

    public WifiCallingPreferenceController init(int subId) {
        mSubId = subId;
        mImsManager = ImsManager.getInstance(mContext, SubscriptionManager.getPhoneId(mSubId));
        mImsMmTelManager = getImsMmTelManager(mSubId);
        mSimCallManager = mContext.getSystemService(TelecomManager.class)
                .getSimCallManagerForSubscription(mSubId);
@@ -164,14 +167,22 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont
        return this;
    }

    @VisibleForTesting
    WifiCallingQueryImsState queryImsState(int subId) {
        return new WifiCallingQueryImsState(mContext, subId);
    }

    protected ImsMmTelManager getImsMmTelManager(int subId) {
        if (!SubscriptionManager.isValidSubscriptionId(subId)) {
            return null;
        }
        return ImsMmTelManager.createForSubscriptionId(subId);
    }

    @VisibleForTesting
    TelephonyManager getTelephonyManager(Context context, int subId) {
        final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
        if (!SubscriptionManager.isValidSubscriptionId(subId)) {
            return telephonyMgr;
        }
        final TelephonyManager subscriptionTelephonyMgr =
@@ -204,4 +215,23 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont
            mTelephonyManager.listen(this, PhoneStateListener.LISTEN_NONE);
        }
    }

    private boolean isWifiCallingEnabled(Context context, int subId) {
        final PhoneAccountHandle simCallManager =
                context.getSystemService(TelecomManager.class)
                       .getSimCallManagerForSubscription(subId);
        final int phoneId = SubscriptionManager.getSlotIndex(subId);

        boolean isWifiCallingEnabled;
        if (simCallManager != null) {
            final Intent intent = MobileNetworkUtils.buildPhoneAccountConfigureIntent(
                    context, simCallManager);

            isWifiCallingEnabled = intent != null;
        } else {
            isWifiCallingEnabled = queryImsState(subId).isReadyToWifiCalling();
        }

        return isWifiCallingEnabled;
    }
}
+8 −0
Original line number Diff line number Diff line
# Default reviewers for this and subdirectories.
allenwtsu@google.com
andychou@google.com
bonianchen@google.com
songferngwang@google.com
tomhsu@google.com

# Emergency approvers in case the above are not available
+7 −24
Original line number Diff line number Diff line
@@ -22,9 +22,6 @@ 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;
@@ -35,11 +32,11 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;

import com.android.ims.ImsManager;
import com.android.internal.util.CollectionUtils;
import com.android.settings.R;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.network.SubscriptionUtil;
import com.android.settings.network.ims.WifiCallingQueryImsState;
import com.android.settings.search.actionbar.SearchMenuController;
import com.android.settings.support.actionbar.HelpMenuController;
import com.android.settings.support.actionbar.HelpResourceProvider;
@@ -196,25 +193,6 @@ public class WifiCallingSettings extends InstrumentedFragment implements HelpRes
        }
    }

    @VisibleForTesting
    boolean isWfcEnabledByPlatform(SubscriptionInfo info) {
        final ImsManager imsManager = ImsManager.getInstance(getActivity(),
                info.getSimSlotIndex());
        return imsManager.isWfcEnabledByPlatform();
    }

    @VisibleForTesting
    boolean isWfcProvisionedOnDevice(SubscriptionInfo info) {
        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() {
        mSil = SubscriptionUtil.getActiveSubscriptions(
                getContext().getSystemService(SubscriptionManager.class));
@@ -225,7 +203,7 @@ public class WifiCallingSettings extends InstrumentedFragment implements HelpRes
        }
        for (int i = 0; i < mSil.size(); ) {
            final SubscriptionInfo info = mSil.get(i);
            if (!isWfcEnabledByPlatform(info) || !isWfcProvisionedOnDevice(info)) {
            if (!queryImsState(info.getSubscriptionId()).isWifiCallingProvisioned()) {
                mSil.remove(i);
            } else {
                i++;
@@ -241,4 +219,9 @@ public class WifiCallingSettings extends InstrumentedFragment implements HelpRes
            getActivity().getActionBar().setTitle(title);
        }
    }

    @VisibleForTesting
    WifiCallingQueryImsState queryImsState(int subId) {
        return new WifiCallingQueryImsState(getContext(), subId);
    }
}
+71 −44
Original line number Diff line number Diff line
@@ -30,10 +30,10 @@ import android.telephony.CarrierConfigManager;
import android.telephony.PhoneStateListener;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.ims.ImsManager;
import android.telephony.ims.ImsMmTelManager;
import android.telephony.ims.ProvisioningManager;
import android.text.TextUtils;
import android.text.util.Linkify;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -47,8 +47,6 @@ import androidx.preference.Preference.OnPreferenceClickListener;
import androidx.preference.PreferenceScreen;

import com.android.ims.ImsConfig;
import com.android.ims.ImsException;
import com.android.ims.ImsManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.Phone;
import com.android.settings.R;
@@ -56,7 +54,7 @@ import com.android.settings.SettingsActivity;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.network.telephony.MobileNetworkUtils;
import com.android.settings.network.ims.WifiCallingQueryImsState;
import com.android.settings.widget.SwitchBar;

/**
@@ -100,8 +98,8 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
    private boolean mUseWfcHomeModeForRoaming = false;

    private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
    private ImsManager mImsManager;
    private ImsMmTelManager mImsMmTelManager;
    private ProvisioningManager mProvisioningManager;
    private TelephonyManager mTelephonyManager;

    private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
@@ -114,11 +112,13 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            final SettingsActivity activity = (SettingsActivity) getActivity();
            final boolean isNonTtyOrTtyOnVolteEnabled = mImsManager.isNonTtyOrTtyOnVolteEnabled();
            final boolean isNonTtyOrTtyOnVolteEnabled =
                    queryImsState(WifiCallingSettingsForSub.this.mSubId).isAllowUserControl();
            final boolean isWfcEnabled = mSwitchBar.isChecked()
                    && isNonTtyOrTtyOnVolteEnabled;
            boolean isCallStateIdle =
                    mTelephonyManager.getCallState() == TelephonyManager.CALL_STATE_IDLE;
            boolean isCallStateIdle = getTelephonyManagerForSub(
                    WifiCallingSettingsForSub.this.mSubId).getCallState()
                    == TelephonyManager.CALL_STATE_IDLE;
            mSwitchBar.setEnabled(isCallStateIdle
                    && isNonTtyOrTtyOnVolteEnabled);

@@ -183,7 +183,6 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment

        mEmptyView = getView().findViewById(android.R.id.empty);
        setEmptyView(mEmptyView);
        mEmptyView.setAutoLinkMask(Linkify.WEB_URLS);
        final Resources res = getResourcesForSubId();
        final String emptyViewText = res.getString(R.string.wifi_calling_off_explanation,
                res.getString(R.string.wifi_calling_off_explanation_2));
@@ -200,7 +199,8 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
        mSwitchBar.hide();
    }

    private void showAlert(Intent intent) {
    @VisibleForTesting
    void showAlert(Intent intent) {
        final Context context = getActivity();

        final CharSequence title = intent.getCharSequenceExtra(Phone.EXTRA_KEY_ALERT_TITLE);
@@ -221,7 +221,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();
            if (action.equals(ImsManager.ACTION_IMS_REGISTRATION_ERROR)) {
            if (action.equals(ImsManager.ACTION_WFC_IMS_REGISTRATION_ERROR)) {
                // If this fragment is active then we are immediately
                // showing alert on screen. There is no need to add
                // notification in this case.
@@ -247,12 +247,31 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
    }

    @VisibleForTesting
    ImsManager getImsManager() {
        return ImsManager.getInstance(getActivity(), SubscriptionManager.getPhoneId(mSubId));
    TelephonyManager getTelephonyManagerForSub(int subId) {
        if (mTelephonyManager == null) {
            mTelephonyManager = getContext().getSystemService(TelephonyManager.class);
        }
        return mTelephonyManager.createForSubscriptionId(subId);
    }

    @VisibleForTesting
    WifiCallingQueryImsState queryImsState(int subId) {
        return new WifiCallingQueryImsState(getContext(), subId);
    }

    @VisibleForTesting
    ProvisioningManager getImsProvisioningManager() {
        if (!SubscriptionManager.isValidSubscriptionId(mSubId)) {
            return null;
        }
        return ProvisioningManager.createForSubscriptionId(mSubId);
    }

    @VisibleForTesting
    ImsMmTelManager getImsMmTelManager() {
        if (!SubscriptionManager.isValidSubscriptionId(mSubId)) {
            return null;
        }
        return ImsMmTelManager.createForSubscriptionId(mSubId);
    }

@@ -271,11 +290,9 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
                    FRAGMENT_BUNDLE_SUBID, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
        }

        mImsManager = getImsManager();
        mProvisioningManager = getImsProvisioningManager();
        mImsMmTelManager = getImsMmTelManager();

        mTelephonyManager = ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE));

        mButtonWfcMode = findPreference(BUTTON_WFC_MODE);
        mButtonWfcMode.setOnPreferenceChangeListener(this);

@@ -286,7 +303,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
        mUpdateAddress.setOnPreferenceClickListener(mUpdateAddressListener);

        mIntentFilter = new IntentFilter();
        mIntentFilter.addAction(ImsManager.ACTION_IMS_REGISTRATION_ERROR);
        mIntentFilter.addAction(ImsManager.ACTION_WFC_IMS_REGISTRATION_ERROR);
    }

    @Override
@@ -312,7 +329,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment

    @VisibleForTesting
    boolean isWfcProvisionedOnDevice() {
        return MobileNetworkUtils.isWfcProvisionedOnDevice(mSubId);
        return queryImsState(mSubId).isWifiCallingProvisioned();
    }

    private void updateBody() {
@@ -342,7 +359,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
            }
        }

        Resources res = getResourcesForSubId();
        final Resources res = getResourcesForSubId();
        mButtonWfcMode.setTitle(res.getString(R.string.wifi_calling_mode_title));
        mButtonWfcMode.setDialogTitle(res.getString(R.string.wifi_calling_mode_dialog_title));
        mButtonWfcRoamingMode.setTitle(res.getString(R.string.wifi_calling_roaming_mode_title));
@@ -383,8 +400,9 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
        }

        // NOTE: Buttons will be enabled/disabled in mPhoneStateListener
        final boolean wfcEnabled = mImsManager.isWfcEnabledByUser()
                && mImsManager.isNonTtyOrTtyOnVolteEnabled();
        final WifiCallingQueryImsState queryIms = queryImsState(mSubId);
        final boolean wfcEnabled = queryIms.isEnabledByUser()
                && queryIms.isAllowUserControl();
        mSwitch.setChecked(wfcEnabled);
        final int wfcMode = mImsMmTelManager.getVoWiFiModeSetting();
        final int wfcRoamingMode = mImsMmTelManager.getVoWiFiRoamingModeSetting();
@@ -397,18 +415,18 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
    public void onResume() {
        super.onResume();

        final Context context = getActivity();

        updateBody();

        if (mImsManager.isWfcEnabledByPlatform()) {
            mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
        if (queryImsState(mSubId).isWifiCallingSupported()) {
            getTelephonyManagerForSub(mSubId).listen(mPhoneStateListener,
                    PhoneStateListener.LISTEN_CALL_STATE);

            mSwitchBar.addOnSwitchChangeListener(this);

            mValidListener = true;
        }

        final Context context = getActivity();
        context.registerReceiver(mIntentReceiver, mIntentFilter);

        final Intent intent = getActivity().getIntent();
@@ -417,12 +435,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
        }

        // Register callback for provisioning changes.
        try {
            mImsManager.getConfigInterface().addConfigCallback(mProvisioningCallback);
        } catch (ImsException e) {
            Log.w(TAG, "onResume: Unable to register callback for provisioning changes.");
        }

        registerProvisioningChangedCallback();
    }

    @Override
@@ -434,7 +447,8 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
        if (mValidListener) {
            mValidListener = false;

            mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
            getTelephonyManagerForSub(mSubId).listen(mPhoneStateListener,
                    PhoneStateListener.LISTEN_NONE);

            mSwitchBar.removeOnSwitchChangeListener(this);
        }
@@ -442,13 +456,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
        context.unregisterReceiver(mIntentReceiver);

        // Remove callback for provisioning changes.
        try {
            mImsManager.getConfigInterface().removeConfigCallback(
                    mProvisioningCallback.getBinder());
        } catch (ImsException e) {
            Log.w(TAG, "onPause: Unable to remove callback for provisioning changes");
        }

        unregisterProvisioningChangedCallback();
    }

    /**
@@ -508,7 +516,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
     */
    private void updateWfcMode(boolean wfcEnabled) {
        Log.i(TAG, "updateWfcMode(" + wfcEnabled + ")");
        mImsManager.setWfcSetting(wfcEnabled);
        mImsMmTelManager.setVoWiFiSettingEnabled(wfcEnabled);

        final int wfcMode = mImsMmTelManager.getVoWiFiModeSetting();
        final int wfcRoamingMode = mImsMmTelManager.getVoWiFiRoamingModeSetting();
@@ -524,8 +532,6 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        final Context context = getActivity();

        Log.d(TAG, "WFC activity request = " + requestCode + " result = " + resultCode);

        switch (requestCode) {
@@ -619,7 +625,7 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment

    private CharSequence getWfcModeSummary(int wfcMode) {
        int resId = com.android.internal.R.string.wifi_calling_off_summary;
        if (mImsManager.isWfcEnabledByUser()) {
        if (queryImsState(mSubId).isEnabledByUser()) {
            switch (wfcMode) {
                case ImsMmTelManager.WIFI_MODE_WIFI_ONLY:
                    resId = com.android.internal.R.string.wfc_mode_wifi_only_summary;
@@ -639,6 +645,27 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment

    @VisibleForTesting
    Resources getResourcesForSubId() {
        return SubscriptionManager.getResourcesForSubId(getContext(), mSubId, false);
        return SubscriptionManager.getResourcesForSubId(getContext(), mSubId);
    }

    @VisibleForTesting
    void registerProvisioningChangedCallback() {
        if (mProvisioningManager == null) {
            return;
        }
        try {
            mProvisioningManager.registerProvisioningChangedCallback(getContext().getMainExecutor(),
                    mProvisioningCallback);
        } catch (Exception ex) {
            Log.w(TAG, "onResume: Unable to register callback for provisioning changes.");
        }
    }

    @VisibleForTesting
    void unregisterProvisioningChangedCallback() {
        if (mProvisioningManager == null) {
            return;
        }
        mProvisioningManager.unregisterProvisioningChangedCallback(mProvisioningCallback);
    }
}
+51 −77

File changed.

Preview size limit exceeded, changes collapsed.

Loading