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

Commit ee0755ee authored by Hunsuk Choi's avatar Hunsuk Choi
Browse files

Notifies IMS registration state to modem

Bug: 219242990
Test: atest FrameworksTelephonyTests:ImsPhoneCallTrackerTest#testUpdateImsRegistrationInfo

Change-Id: If83a9dbd87ef0a00346e1348affb3aac11347084
parent 1e794f1a
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -41,6 +41,8 @@ import android.telephony.data.DataProfile;
import android.telephony.data.NetworkSliceInfo;
import android.telephony.data.TrafficDescriptor;
import android.telephony.emergency.EmergencyNumber;
import android.telephony.ims.RegistrationManager;
import android.telephony.ims.stub.ImsRegistrationImplBase;

import com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo;
import com.android.internal.telephony.emergency.EmergencyConstants;
@@ -2900,13 +2902,14 @@ public interface CommandsInterface {
     * Updates the IMS registration information to the radio.
     *
     * @param state The current IMS registration state.
     * @param accessNetworkType The type of underlying radio access network used.
     * @param suggestedAction The expected action that modem should perform.
     * @param imsRadioTech The type of underlying radio access network used.
     * @param suggestedAction The suggested action for the radio to perform.
     * @param capabilities IMS capabilities such as VOICE, VIDEO and SMS.
     */
    default void updateImsRegistrationInfo(int state,
            @AccessNetworkConstants.RadioAccessNetworkType int accessNetworkType,
            int suggestedAction, int capabilities, Message result) {}
            @ImsRegistrationImplBase.ImsRegistrationTech int imsRadioTech,
            @RegistrationManager.SuggestedAction int suggestedAction,
            int capabilities, Message result) {}

    /**
     * Notifies the NAS and RRC layers of the radio the type of upcoming IMS traffic.
+11 −5
Original line number Diff line number Diff line
@@ -84,6 +84,8 @@ import android.telephony.data.DataProfile;
import android.telephony.data.NetworkSliceInfo;
import android.telephony.data.TrafficDescriptor;
import android.telephony.emergency.EmergencyNumber;
import android.telephony.ims.RegistrationManager;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.text.TextUtils;
import android.util.SparseArray;

@@ -5257,8 +5259,11 @@ public class RIL extends BaseCommands implements CommandsInterface {
    }

    @Override
    public void updateImsRegistrationInfo(int state,
            int accessNetworkType, int suggestedAction, int capabilities, Message result) {
    public void updateImsRegistrationInfo(
            @RegistrationManager.ImsRegistrationState int state,
            @ImsRegistrationImplBase.ImsRegistrationTech int imsRadioTech,
            @RegistrationManager.SuggestedAction int suggestedAction,
            int capabilities, Message result) {
        RadioImsProxy imsProxy = getRadioServiceProxy(RadioImsProxy.class, result);
        if (imsProxy.isEmpty()) return;
        if (mHalVersion.get(HAL_SERVICE_IMS).greaterOrEqual(RADIO_HAL_VERSION_2_0)) {
@@ -5266,14 +5271,15 @@ public class RIL extends BaseCommands implements CommandsInterface {
                    mRILDefaultWorkSource);

            if (RILJ_LOGD) {
                // Do not log function arg for privacy
                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                        + " state=" + state + ", radioTech=" + imsRadioTech
                        + ", suggested=" + suggestedAction + ", cap=" + capabilities);
            }

            android.hardware.radio.ims.ImsRegistration registrationInfo =
                    new android.hardware.radio.ims.ImsRegistration();
            registrationInfo.regState = RILUtils.convertImsRegistrationState(state);
            registrationInfo.accessNetworkType = accessNetworkType;
            registrationInfo.accessNetworkType = RILUtils.convertImsRegistrationTech(imsRadioTech);
            registrationInfo.suggestedAction = suggestedAction;
            registrationInfo.capabilities = RILUtils.convertImsCapability(capabilities);

+35 −2
Original line number Diff line number Diff line
@@ -5616,7 +5616,12 @@ public class RILUtils {
        }
    }

    /** Convert IMS registration state */
    /**
     * Converts IMS registration state.
     *
     * @param state The IMS registration state.
     * @return The converted HAL IMS registration state.
     */
    public static int convertImsRegistrationState(int state) {
        switch (state) {
            case RegistrationManager.REGISTRATION_STATE_NOT_REGISTERED:
@@ -5628,7 +5633,35 @@ public class RILUtils {
        }
    }

    /** Convert IMS capability */
    /**
     * Converts IMS service radio technology.
     *
     * @param imsRadioTech The IMS service radio technology.
     * @return The converted HAL access network type.
     */

    public static int convertImsRegistrationTech(
            @ImsRegistrationImplBase.ImsRegistrationTech int imsRadioTech) {
        switch (imsRadioTech) {
            case ImsRegistrationImplBase.REGISTRATION_TECH_LTE:
                return android.hardware.radio.AccessNetwork.EUTRAN;
            case ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN:
                return android.hardware.radio.AccessNetwork.IWLAN;
            case ImsRegistrationImplBase.REGISTRATION_TECH_NR:
                return android.hardware.radio.AccessNetwork.NGRAN;
            case ImsRegistrationImplBase.REGISTRATION_TECH_3G:
                return android.hardware.radio.AccessNetwork.UTRAN;
            default:
                return android.hardware.radio.AccessNetwork.UNKNOWN;
        }
    }

    /**
     * Converts IMS capabilities.
     *
     * @param capabilities The IMS capabilities.
     * @return The converted HAL IMS capabilities.
     */
    public static int convertImsCapability(int capabilities) {
        int halCapabilities = android.hardware.radio.ims.ImsRegistration.IMS_MMTEL_CAPABILITY_NONE;
        if ((capabilities & CommandsInterface.IMS_MMTEL_CAPABILITY_VOICE) > 0) {
+107 −3
Original line number Diff line number Diff line
@@ -19,6 +19,12 @@ package com.android.internal.telephony.imsphone;
import static android.provider.Telephony.SimInfo.COLUMN_PHONE_NUMBER_SOURCE_IMS;
import static android.telephony.ims.ImsManager.EXTRA_WFC_REGISTRATION_FAILURE_MESSAGE;
import static android.telephony.ims.ImsManager.EXTRA_WFC_REGISTRATION_FAILURE_TITLE;
import static android.telephony.ims.RegistrationManager.REGISTRATION_STATE_NOT_REGISTERED;
import static android.telephony.ims.RegistrationManager.REGISTRATION_STATE_REGISTERED;
import static android.telephony.ims.RegistrationManager.SUGGESTED_ACTION_NONE;
import static android.telephony.ims.RegistrationManager.SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK;
import static android.telephony.ims.RegistrationManager.SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK_WITH_TIMEOUT;
import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_NONE;

import static com.android.internal.telephony.CommandsInterface.CB_FACILITY_BAIC;
import static com.android.internal.telephony.CommandsInterface.CB_FACILITY_BAICr;
@@ -42,6 +48,7 @@ import static com.android.internal.telephony.CommandsInterface.CF_REASON_UNCONDI
import static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_NONE;
import static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_VOICE;

import android.annotation.NonNull;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
@@ -79,6 +86,7 @@ import android.telephony.emergency.EmergencyNumber;
import android.telephony.ims.ImsCallForwardInfo;
import android.telephony.ims.ImsCallProfile;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.ImsRegistrationAttributes;
import android.telephony.ims.ImsSsData;
import android.telephony.ims.ImsSsInfo;
import android.telephony.ims.RegistrationManager;
@@ -290,6 +298,14 @@ public class ImsPhone extends ImsPhoneBase {

    private ImsStats mImsStats;

    private int mImsRegistrationState;
    // The access network type where IMS is registered
    private @ImsRegistrationImplBase.ImsRegistrationTech int mImsRegistrationTech =
            REGISTRATION_TECH_NONE;
    private @RegistrationManager.SuggestedAction int mImsRegistrationSuggestedAction;
    private int mImsRegistrationCapabilities;
    private boolean mNotifiedRegisteredState;

    // A runnable which is used to automatically exit from Ecm after a period of time.
    private Runnable mExitEcmRunnable = new Runnable() {
        @Override
@@ -2454,12 +2470,18 @@ public class ImsPhone extends ImsPhoneBase {
    public void resetImsRegistrationState() {
        if (DBG) logd("resetImsRegistrationState");
        mImsMmTelRegistrationHelper.reset();
        int subId = getSubId();
        if (SubscriptionManager.isValidSubscriptionId(subId)) {
            updateImsRegistrationInfo(REGISTRATION_STATE_NOT_REGISTERED,
                    REGISTRATION_TECH_NONE, SUGGESTED_ACTION_NONE);
        }
    }

    private ImsRegistrationCallbackHelper.ImsRegistrationUpdate mMmTelRegistrationUpdate = new
            ImsRegistrationCallbackHelper.ImsRegistrationUpdate() {
        @Override
        public void handleImsRegistered(int imsRadioTech) {
        public void handleImsRegistered(@NonNull ImsRegistrationAttributes attributes) {
            int imsRadioTech = attributes.getTransportType();
            if (DBG) {
                logd("handleImsRegistered: onImsMmTelConnected imsRadioTech="
                        + AccessNetworkConstants.transportTypeToString(imsRadioTech));
@@ -2470,6 +2492,8 @@ public class ImsPhone extends ImsPhoneBase {
            getDefaultPhone().setImsRegistrationState(true);
            mMetrics.writeOnImsConnectionState(mPhoneId, ImsConnectionState.State.CONNECTED, null);
            mImsStats.onImsRegistered(imsRadioTech);
            updateImsRegistrationInfo(REGISTRATION_STATE_REGISTERED,
                    attributes.getRegistrationTechnology(), SUGGESTED_ACTION_NONE);
        }

        @Override
@@ -2488,10 +2512,11 @@ public class ImsPhone extends ImsPhoneBase {
        }

        @Override
        public void handleImsUnregistered(ImsReasonInfo imsReasonInfo) {
        public void handleImsUnregistered(ImsReasonInfo imsReasonInfo,
                @RegistrationManager.SuggestedAction int suggestedAction) {
            if (DBG) {
                logd("handleImsUnregistered: onImsMmTelDisconnected imsReasonInfo="
                        + imsReasonInfo);
                        + imsReasonInfo + ", suggestedAction=" + suggestedAction);
            }
            mRegLocalLog.log("handleImsUnregistered: onImsMmTelDisconnected imsRadioTech="
                    + imsReasonInfo);
@@ -2501,6 +2526,16 @@ public class ImsPhone extends ImsPhoneBase {
            mMetrics.writeOnImsConnectionState(mPhoneId, ImsConnectionState.State.DISCONNECTED,
                    imsReasonInfo);
            mImsStats.onImsUnregistered(imsReasonInfo);
            mImsRegistrationTech = REGISTRATION_TECH_NONE;
            int suggestedModemAction = SUGGESTED_ACTION_NONE;
            if (imsReasonInfo.getCode() == ImsReasonInfo.CODE_REGISTRATION_ERROR) {
                if ((suggestedAction == SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK)
                        || (suggestedAction == SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK_WITH_TIMEOUT)) {
                    suggestedModemAction = suggestedAction;
                }
            }
            updateImsRegistrationInfo(REGISTRATION_STATE_NOT_REGISTERED,
                    REGISTRATION_TECH_NONE, suggestedModemAction);
        }

        @Override
@@ -2633,6 +2668,75 @@ public class ImsPhone extends ImsPhoneBase {
        return mLastKnownRoamingState;
    }

    /**
     * Update IMS registration information to modem.
     *
     * @param capabilities indicate MMTEL capability such as VOICE, VIDEO and SMS.
     */
    public void updateImsRegistrationInfo(int capabilities) {
        if (mImsRegistrationState == REGISTRATION_STATE_REGISTERED) {
            if (mNotifiedRegisteredState && (capabilities == mImsRegistrationCapabilities)) {
                // Duplicated notification, no change in capabilities.
                return;
            }

            mImsRegistrationCapabilities = capabilities;
            if (capabilities == 0) {
                // Ignore this as this usually happens just before onUnregistered callback.
                // We can notify modem when onUnregistered() flow occurs.
                return;
            }

            mDefaultPhone.mCi.updateImsRegistrationInfo(mImsRegistrationState,
                    mImsRegistrationTech, 0, capabilities, null);
            mNotifiedRegisteredState = true;
        }
    }

    /**
     * Update IMS registration info
     *
     * @param regState indicates IMS registration state.
     * @param imsRadioTech indicates the type of the radio access network where IMS is registered.
     * @param suggestedAction indicates the suggested action for the radio to perform.
     */
    private void updateImsRegistrationInfo(
            @RegistrationManager.ImsRegistrationState int regState,
            @ImsRegistrationImplBase.ImsRegistrationTech int imsRadioTech,
            @RegistrationManager.SuggestedAction int suggestedAction) {

        if (regState == mImsRegistrationState) {
            if ((regState == REGISTRATION_STATE_REGISTERED && imsRadioTech == mImsRegistrationTech)
                    || (regState == REGISTRATION_STATE_NOT_REGISTERED
                            && suggestedAction == mImsRegistrationSuggestedAction)) {
                // Filter duplicate notification.
                return;
            }
        }

        if (regState == REGISTRATION_STATE_NOT_REGISTERED) {
            mDefaultPhone.mCi.updateImsRegistrationInfo(regState,
                    imsRadioTech, suggestedAction, 0, null);
        } else if (mImsRegistrationState == REGISTRATION_STATE_REGISTERED) {
            // This happens when radio tech is changed while in REGISTERED state.
            if (mImsRegistrationCapabilities > 0) {
                // Capability has been updated. Notify REGISTRATION_STATE_REGISTERED.
                mDefaultPhone.mCi.updateImsRegistrationInfo(regState, imsRadioTech, 0,
                        mImsRegistrationCapabilities, null);
                mImsRegistrationTech = imsRadioTech;
                mNotifiedRegisteredState = true;
                return;
            }
        }

        mImsRegistrationState = regState;
        mImsRegistrationTech = imsRadioTech;
        mImsRegistrationSuggestedAction = suggestedAction;
        mImsRegistrationCapabilities = 0;
        // REGISTRATION_STATE_REGISTERED will be notified when the capability is updated.
        mNotifiedRegisteredState = false;
    }

    @Override
    public void setTerminalBasedCallWaitingStatus(int state) {
        mCT.setTerminalBasedCallWaitingStatus(state);
+23 −0
Original line number Diff line number Diff line
@@ -34,6 +34,9 @@ import static android.telephony.ims.ImsService.CAPABILITY_TERMINAL_BASED_CALL_WA
import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE;
import static com.android.internal.telephony.CallWaitingController.TERMINAL_BASED_ACTIVATED;
import static com.android.internal.telephony.CallWaitingController.TERMINAL_BASED_NOT_SUPPORTED;
import static com.android.internal.telephony.CommandsInterface.IMS_MMTEL_CAPABILITY_SMS;
import static com.android.internal.telephony.CommandsInterface.IMS_MMTEL_CAPABILITY_VIDEO;
import static com.android.internal.telephony.CommandsInterface.IMS_MMTEL_CAPABILITY_VOICE;
import static com.android.internal.telephony.Phone.CS_FALLBACK;

import android.Manifest;
@@ -4551,6 +4554,7 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
                try {
                    ImsFeature.Capabilities capabilities = (ImsFeature.Capabilities) args.arg1;
                    handleFeatureCapabilityChanged(capabilities);
                    updateImsRegistrationInfo();
                } finally {
                    args.recycle();
                }
@@ -5747,4 +5751,23 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
            loge("triggerImsDeregistration: exception " + e);
        }
    }

    private void updateImsRegistrationInfo() {
        int capabilities = 0;

        if (mMmTelCapabilities.isCapable(
                MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE)) {
            capabilities |= IMS_MMTEL_CAPABILITY_VOICE;
        }
        if (mMmTelCapabilities.isCapable(
                MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO)) {
            capabilities |= IMS_MMTEL_CAPABILITY_VIDEO;
        }
        if (mMmTelCapabilities.isCapable(
                MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_SMS)) {
            capabilities |= IMS_MMTEL_CAPABILITY_SMS;
        }

        mPhone.updateImsRegistrationInfo(capabilities);
    }
}
Loading