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

Commit 62a2b2f3 authored by Libin.Tang@motorola.com's avatar Libin.Tang@motorola.com Committed by Etan Cohen
Browse files

IMS: add api to indicate the current availability of IMS call on IWLAN.

Also add the WIFI only handle.

Change-Id: Ia96d8a3a6e3146603b76760cec02593bf5f1e3b6
parent 64e02b05
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -2129,6 +2129,21 @@ public abstract class PhoneBase extends Handler implements Phone {
        mCi.unregisterForRadioCapabilityChanged(this);
    }

    /**
     * Determines if  IMS is enabled for call.
     *
     * @return {@code true} if IMS calling is enabled.
     */
    public boolean isImsUseEnabled() {
        boolean imsUseEnabled =
                ((ImsManager.isVolteEnabledByPlatform(mContext) &&
                ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mContext)) ||
                (ImsManager.isWfcEnabledByPlatform(mContext) &&
                ImsManager.isWfcEnabledByUser(mContext)) &&
                ImsManager.isNonTtyOrTtyOnVolteEnabled(mContext));
        return imsUseEnabled;
    }

    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
        pw.println("PhoneBase: subId=" + getSubId());
        pw.println(" mPhoneId=" + mPhoneId);
+21 −5
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import android.util.Log;

import android.telephony.TelephonyManager;

import com.android.ims.ImsConfig;
import com.android.ims.ImsManager;
import com.android.internal.telephony.Call;
import com.android.internal.telephony.CallStateException;
@@ -409,10 +410,8 @@ public class CDMAPhone extends PhoneBase {
    dial (String dialString, int videoState) throws CallStateException {
        ImsPhone imsPhone = mImsPhone;

        boolean imsUseEnabled =
                ImsManager.isVolteEnabledByPlatform(mContext) &&
                ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mContext) &&
                ImsManager.isNonTtyOrTtyOnVolteEnabled(mContext);
        boolean imsUseEnabled = isImsUseEnabled();

        if (!imsUseEnabled) {
            Rlog.w(LOG_TAG, "IMS is disabled: forced to CS");
        }
@@ -421,11 +420,28 @@ public class CDMAPhone extends PhoneBase {
            Rlog.d(LOG_TAG, "imsUseEnabled=" + imsUseEnabled + ", imsPhone=" + imsPhone
                    + ", imsPhone.isVolteEnabled()="
                    + ((imsPhone != null) ? imsPhone.isVolteEnabled() : "N/A")
                    + ", imsPhone.isVowifiEnabled()="
                    + ((imsPhone != null) ? imsPhone.isVowifiEnabled() : "N/A")
                    + ", imsPhone.getServiceState().getState()="
                    + ((imsPhone != null) ? imsPhone.getServiceState().getState() : "N/A"));
        }

        if (imsUseEnabled && imsPhone != null && imsPhone.isVolteEnabled()
        if (imsPhone == null ||
                (imsPhone != null && !imsPhone.isVowifiEnabled())) {
            boolean wfcWiFiOnly = (ImsManager.isWfcEnabledByPlatform(mContext) &&
                    ImsManager.isWfcEnabledByUser(mContext) &&
                    (ImsManager.getWfcMode(mContext) ==
                    ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY));
            if (wfcWiFiOnly == true) {
                if (DBG) Rlog.d(LOG_TAG, "WIFI only mode, but no VoWIFI enabled");
                CallStateException ce = new CallStateException(
                        "WFC Wi-Fi Only Mode: IMS stack on WIFI not available");
                throw ce;
            }
        }

        if (imsUseEnabled && imsPhone != null
                && (imsPhone.isVolteEnabled() || imsPhone.isVowifiEnabled())
                && ((imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE
                && !PhoneNumberUtils.isEmergencyNumber(dialString))
                || (PhoneNumberUtils.isEmergencyNumber(dialString)
+21 −5
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;

import com.android.ims.ImsConfig;
import com.android.ims.ImsManager;
import com.android.internal.telephony.CallTracker;

@@ -805,10 +806,8 @@ public class GSMPhone extends PhoneBase {
    dial (String dialString, UUSInfo uusInfo, int videoState) throws CallStateException {
        ImsPhone imsPhone = mImsPhone;

        boolean imsUseEnabled =
                ImsManager.isVolteEnabledByPlatform(mContext) &&
                ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mContext) &&
                ImsManager.isNonTtyOrTtyOnVolteEnabled(mContext);
         boolean imsUseEnabled = isImsUseEnabled();

        if (!imsUseEnabled) {
            Rlog.w(LOG_TAG, "IMS is disabled: forced to CS");
        }
@@ -817,11 +816,28 @@ public class GSMPhone extends PhoneBase {
            Rlog.d(LOG_TAG, "imsUseEnabled=" + imsUseEnabled + ", imsPhone=" + imsPhone
                    + ", imsPhone.isVolteEnabled()="
                    + ((imsPhone != null) ? imsPhone.isVolteEnabled() : "N/A")
                    + ", imsPhone.isVowifiEnabled()="
                    + ((imsPhone != null) ? imsPhone.isVowifiEnabled() : "N/A")
                    + ", imsPhone.getServiceState().getState()="
                    + ((imsPhone != null) ? imsPhone.getServiceState().getState() : "N/A"));
        }

        if (imsUseEnabled && imsPhone != null && imsPhone.isVolteEnabled()
        if (imsPhone == null ||
                (imsPhone != null && !imsPhone.isVowifiEnabled())) {
            boolean wfcWiFiOnly = (ImsManager.isWfcEnabledByPlatform(mContext) &&
                    ImsManager.isWfcEnabledByUser(mContext) &&
                    (ImsManager.getWfcMode(mContext) ==
                    ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY));
            if (wfcWiFiOnly == true) {
                if (LOCAL_DEBUG) Rlog.d(LOG_TAG, "WIFI only mode, but no VoWIFI enabled");
                CallStateException ce = new CallStateException(
                        "WFC Wi-Fi Only Mode: IMS stack on WIFI not available");
                throw ce;
            }
        }

        if (imsUseEnabled && imsPhone != null
                && (imsPhone.isVolteEnabled() || imsPhone.isVowifiEnabled())
                && ((imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE
                && !PhoneNumberUtils.isEmergencyNumber(dialString))
                || (PhoneNumberUtils.isEmergencyNumber(dialString)
+4 −0
Original line number Diff line number Diff line
@@ -1238,6 +1238,10 @@ public class ImsPhone extends ImsPhoneBase {
        return mCT.isVolteEnabled();
    }

    public boolean isVowifiEnabled() {
        return mCT.isVowifiEnabled();
    }

    public boolean isVtEnabled() {
        return mCT.isVtEnabled();
    }
+17 −21
Original line number Diff line number Diff line
@@ -74,8 +74,7 @@ public final class ImsPhoneCallTracker extends CallTracker {

    private static final boolean DBG = true;

    private boolean mIsVolteEnabled = false;
    private boolean mIsVtEnabled = false;
    private boolean[] mImsFeatureEnabled = {false, false, false, false};

    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
@@ -1304,25 +1303,17 @@ public final class ImsPhoneCallTracker extends CallTracker {
        public void onFeatureCapabilityChanged(int serviceClass,
                int[] enabledFeatures, int[] disabledFeatures) {
            if (serviceClass == ImsServiceClass.MMTEL) {
                if (enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE] ==
                        ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE) {
                    mIsVolteEnabled = true;
                for (int  i = ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE;
                        i <= ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_WIFI; i++) {
                    if (enabledFeatures[i] == i) {
                        mImsFeatureEnabled[i] = true;
                    }
                if (enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE] ==
                        ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE) {
                    mIsVtEnabled = true;
                    if (disabledFeatures[i] == i) {
                        mImsFeatureEnabled[i] = false;
                    }
                if (disabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE] ==
                        ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE) {
                    mIsVolteEnabled = false;
                }
                if (disabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE] ==
                        ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE) {
                    mIsVtEnabled = false;
            }
            }
            if (DBG) log("onFeatureCapabilityChanged, mIsVolteEnabled = " +  mIsVolteEnabled
                    + " mIsVtEnabled = " + mIsVtEnabled);
            if (DBG) log("onFeatureCapabilityChanged,  mImsFeatureEnabled=" +  mImsFeatureEnabled);
        }
    };

@@ -1466,11 +1457,16 @@ public final class ImsPhoneCallTracker extends CallTracker {
    }

    public boolean isVolteEnabled() {
        return mIsVolteEnabled;
        return mImsFeatureEnabled[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE];
    }

    public boolean isVowifiEnabled() {
        return mImsFeatureEnabled[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_WIFI];
    }

    public boolean isVtEnabled() {
        return mIsVtEnabled;
        return (mImsFeatureEnabled[ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE]
                || mImsFeatureEnabled[ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_WIFI]);
    }
    @Override
    public PhoneConstants.State getState() {