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

Commit 013a98bb authored by Hunsuk Choi's avatar Hunsuk Choi Committed by Android (Google) Code Review
Browse files

Merge "Notifies IMS registration state to modem"

parents 06ad9752 ee0755ee
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