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

Commit 7bc44233 authored by Brad Ebinger's avatar Brad Ebinger Committed by Gerrit Code Review
Browse files

Merge "Support query of IMS registrations status and transport type"

parents de110840 d5b2e344
Loading
Loading
Loading
Loading
+45 −24
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.telephony.PhoneNumberUtils;
import android.telephony.Rlog;
import android.telephony.ServiceState;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.RegistrationManager;
import android.telephony.ims.aidl.IImsSmsListener;
import android.telephony.ims.feature.MmTelFeature;
import android.telephony.ims.stub.ImsRegistrationImplBase;
@@ -71,12 +72,12 @@ public class ImsSmsDispatcher extends SMSDispatcher {
     * Listen to the IMS service state change
     *
     */
    private android.telephony.ims.ImsMmTelManager.RegistrationCallback mRegistrationCallback =
            new android.telephony.ims.ImsMmTelManager.RegistrationCallback() {
    private RegistrationManager.RegistrationCallback mRegistrationCallback =
            new RegistrationManager.RegistrationCallback() {
                @Override
                public void onRegistered(
                        @ImsRegistrationImplBase.ImsRegistrationTech int imsRadioTech) {
                    Rlog.d(TAG, "onImsConnected imsRadioTech=" + imsRadioTech);
                    logd("onImsConnected imsRadioTech=" + imsRadioTech);
                    synchronized (mLock) {
                        mIsRegistered = true;
                    }
@@ -85,7 +86,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {
                @Override
                public void onRegistering(
                        @ImsRegistrationImplBase.ImsRegistrationTech int imsRadioTech) {
                    Rlog.d(TAG, "onImsProgressing imsRadioTech=" + imsRadioTech);
                    logd("onImsProgressing imsRadioTech=" + imsRadioTech);
                    synchronized (mLock) {
                        mIsRegistered = false;
                    }
@@ -93,7 +94,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {

                @Override
                public void onUnregistered(ImsReasonInfo info) {
                    Rlog.d(TAG, "onImsDisconnected imsReasonInfo=" + info);
                    logd("onImsDisconnected imsReasonInfo=" + info);
                    synchronized (mLock) {
                        mIsRegistered = false;
                    }
@@ -116,7 +117,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {
        @Override
        public void onSendSmsResult(int token, int messageRef, @SendStatusResult int status,
                int reason, int networkReasonCode) {
            Rlog.d(TAG, "onSendSmsResult token=" + token + " messageRef=" + messageRef
            logd("onSendSmsResult token=" + token + " messageRef=" + messageRef
                    + " status=" + status + " reason=" + reason + " networkReasonCode="
                    + networkReasonCode);
            // TODO integrate networkReasonCode into IMS SMS metrics.
@@ -154,7 +155,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {
        @Override
        public void onSmsStatusReportReceived(int token, String format, byte[] pdu)
                throws RemoteException {
            Rlog.d(TAG, "Status report received.");
            logd("Status report received.");
            android.telephony.SmsMessage message =
                    android.telephony.SmsMessage.createFromPdu(pdu, format);
            if (message == null || message.mWrappedSmsMessage == null) {
@@ -177,8 +178,8 @@ public class ImsSmsDispatcher extends SMSDispatcher {
            }
            Pair<Boolean, Boolean> result = mSmsDispatchersController.handleSmsStatusReport(
                    tracker, format, pdu);
            Rlog.d(TAG, "Status report handle result, success: " + result.first +
                    "complete: " + result.second);
            logd("Status report handle result, success: " + result.first
                    + " complete: " + result.second);
            try {
                getImsManager().acknowledgeSmsReport(
                        token,
@@ -186,7 +187,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {
                        result.first ? ImsSmsImplBase.STATUS_REPORT_STATUS_OK
                                : ImsSmsImplBase.STATUS_REPORT_STATUS_ERROR);
            } catch (ImsException e) {
                Rlog.e(TAG, "Failed to acknowledgeSmsReport(). Error: "
                loge("Failed to acknowledgeSmsReport(). Error: "
                        + e.getMessage());
            }
            if (result.second) {
@@ -196,11 +197,11 @@ public class ImsSmsDispatcher extends SMSDispatcher {

        @Override
        public void onSmsReceived(int token, String format, byte[] pdu) {
            Rlog.d(TAG, "SMS received.");
            logd("SMS received.");
            android.telephony.SmsMessage message =
                    android.telephony.SmsMessage.createFromPdu(pdu, format);
            mSmsDispatchersController.injectSmsPdu(message, format, result -> {
                Rlog.d(TAG, "SMS handled result: " + result);
                logd("SMS handled result: " + result);
                int mappedResult;
                switch (result) {
                    case Intents.RESULT_SMS_HANDLED:
@@ -221,11 +222,11 @@ public class ImsSmsDispatcher extends SMSDispatcher {
                        getImsManager().acknowledgeSms(token,
                                message.mWrappedSmsMessage.mMessageRef, mappedResult);
                    } else {
                        Rlog.w(TAG, "SMS Received with a PDU that could not be parsed.");
                        logw("SMS Received with a PDU that could not be parsed.");
                        getImsManager().acknowledgeSms(token, 0, mappedResult);
                    }
                } catch (ImsException e) {
                    Rlog.e(TAG, "Failed to acknowledgeSms(). Error: " + e.getMessage());
                    loge("Failed to acknowledgeSms(). Error: " + e.getMessage());
                }
            }, true);
        }
@@ -248,7 +249,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {

                    @Override
                    public void connectionReady(ImsManager manager) throws ImsException {
                        Rlog.d(TAG, "ImsManager: connection ready.");
                        logd("ImsManager: connection ready.");
                        synchronized (mLock) {
                            setListeners();
                            mIsImsServiceUp = true;
@@ -257,7 +258,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {

                    @Override
                    public void connectionUnavailable() {
                        Rlog.d(TAG, "ImsManager: connection unavailable.");
                        logd("ImsManager: connection unavailable.");
                        synchronized (mLock) {
                            mIsImsServiceUp = false;
                        }
@@ -292,7 +293,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {
        PersistableBundle b;
        boolean eSmsCarrierSupport = false;
        if (!PhoneNumberUtils.isLocalEmergencyNumber(mContext, mPhone.getSubId(), destAddr)) {
            Rlog.e(TAG, "Emergency Sms is not supported for: " + Rlog.pii(TAG, destAddr));
            loge("Emergency Sms is not supported for: " + Rlog.pii(TAG, destAddr));
            return false;
        }

@@ -301,18 +302,18 @@ public class ImsSmsDispatcher extends SMSDispatcher {
            CarrierConfigManager configManager = (CarrierConfigManager) mPhone.getContext()
                    .getSystemService(Context.CARRIER_CONFIG_SERVICE);
            if (configManager == null) {
                Rlog.e(TAG, "configManager is null");
                loge("configManager is null");
                return false;
            }
            b = configManager.getConfigForSubId(getSubId());
            if (b == null) {
                Rlog.e(TAG, "PersistableBundle is null");
                loge("PersistableBundle is null");
                return false;
            }
            eSmsCarrierSupport = b.getBoolean(
                    CarrierConfigManager.KEY_SUPPORT_EMERGENCY_SMS_OVER_IMS_BOOL);
            boolean lteOrLimitedLte = isEmergencySmsPossible();
            Rlog.i(TAG, "isEmergencySmsSupport emergencySmsCarrierSupport: "
            logi("isEmergencySmsSupport emergencySmsCarrierSupport: "
                    + eSmsCarrierSupport + " destAddr: " + Rlog.pii(TAG, destAddr)
                    + " mIsImsServiceUp: " + mIsImsServiceUp + " lteOrLimitedLte: "
                    + lteOrLimitedLte);
@@ -325,7 +326,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {

    public boolean isAvailable() {
        synchronized (mLock) {
            Rlog.d(TAG, "isAvailable: up=" + mIsImsServiceUp + ", reg= " + mIsRegistered
            logd("isAvailable: up=" + mIsImsServiceUp + ", reg= " + mIsRegistered
                    + ", cap= " + mIsSmsCapable);
            return mIsImsServiceUp && mIsRegistered && mIsSmsCapable;
        }
@@ -336,7 +337,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {
        try {
            return getImsManager().getSmsFormat();
        } catch (ImsException e) {
            Rlog.e(TAG, "Failed to get sms format. Error: " + e.getMessage());
            loge("Failed to get sms format. Error: " + e.getMessage());
            return SmsConstants.FORMAT_UNKNOWN;
        }
    }
@@ -370,7 +371,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {

    @Override
    public void sendSms(SmsTracker tracker) {
        Rlog.d(TAG, "sendSms: "
        logd("sendSms: "
                + " mRetryCount=" + tracker.mRetryCount
                + " mMessageRef=" + tracker.mMessageRef
                + " SS=" + mPhone.getServiceState().getState());
@@ -409,7 +410,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {
            mMetrics.writeImsServiceSendSms(mPhone.getPhoneId(), format,
                    ImsSmsImplBase.SEND_STATUS_OK);
        } catch (ImsException e) {
            Rlog.e(TAG, "sendSms failed. Falling back to PSTN. Error: " + e.getMessage());
            loge("sendSms failed. Falling back to PSTN. Error: " + e.getMessage());
            fallbackToPstn(token, tracker);
            mMetrics.writeImsServiceSendSms(mPhone.getPhoneId(), format,
                    ImsSmsImplBase.SEND_STATUS_ERROR_FALLBACK);
@@ -435,4 +436,24 @@ public class ImsSmsDispatcher extends SMSDispatcher {
    public IImsSmsListener getSmsListener() {
        return mImsSmsListener;
    }

    private void logd(String s) {
        Rlog.d(TAG + " [" + getPhoneId(mPhone) + "]", s);
    }

    private void logi(String s) {
        Rlog.i(TAG + " [" + getPhoneId(mPhone) + "]", s);
    }

    private void logw(String s) {
        Rlog.w(TAG + " [" + getPhoneId(mPhone) + "]", s);
    }

    private void loge(String s) {
        Rlog.e(TAG + " [" + getPhoneId(mPhone) + "]", s);
    }

    private static String getPhoneId(Phone phone) {
        return (phone != null) ? Integer.toString(phone.getPhoneId()) : "?";
    }
}
+27 −0
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.telephony.data.ApnSetting.ApnType;
import android.telephony.emergency.EmergencyNumber;
import android.telephony.ims.RegistrationManager;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.text.TextUtils;
import android.util.LocalLog;
@@ -94,6 +95,7 @@ import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;

/**
 * (<em>Not for SDK use</em>)
@@ -3655,6 +3657,31 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
        return regTech;
    }

    /**
     * Get the IMS MmTel Registration technology for this Phone, defined in
     * {@link ImsRegistrationImplBase}.
     */
    public void getImsRegistrationTech(Consumer<Integer> callback) {
        Phone imsPhone = mImsPhone;
        if (imsPhone != null) {
            imsPhone.getImsRegistrationTech(callback);
        } else {
            callback.accept(ImsRegistrationImplBase.REGISTRATION_TECH_NONE);
        }
    }

    /**
     * Asynchronously get the IMS MmTel Registration state for this Phone.
     */
    public void getImsRegistrationState(Consumer<Integer> callback) {
        Phone imsPhone = mImsPhone;
        if (imsPhone != null) {
            imsPhone.getImsRegistrationState(callback);
        }
        callback.accept(RegistrationManager.REGISTRATION_STATE_NOT_REGISTERED);
    }


    private boolean getRoamingOverrideHelper(String prefix, String key) {
        String iccId = getIccSerialNumber();
        if (TextUtils.isEmpty(iccId) || TextUtils.isEmpty(key)) {
+14 −0
Original line number Diff line number Diff line
@@ -495,6 +495,9 @@ public class ImsResolver implements ImsServiceController.ImsServiceControllerCal
                }
            };

    // Used during testing, overrides the carrier services while non-empty.
    // Array index corresponds to slot Id associated with the service package name.
    private String[] mOverrideServices;
    // Array index corresponds to slot Id associated with the service package name.
    private String[] mCarrierServices;
    // List index corresponds to Slot Id, Maps ImsFeature.FEATURE->bound ImsServiceController
@@ -522,6 +525,7 @@ public class ImsResolver implements ImsServiceController.ImsServiceControllerCal
        mCarrierConfigManager = (CarrierConfigManager) mContext.getSystemService(
                Context.CARRIER_CONFIG_SERVICE);
        mCarrierServices = new String[numSlots];
        mOverrideServices = new String[numSlots];
        mBoundImsServicesByFeature = Stream.generate(SparseArray<ImsServiceController>::new)
                .limit(mNumSlots).collect(Collectors.toList());

@@ -1127,9 +1131,11 @@ public class ImsResolver implements ImsServiceController.ImsServiceControllerCal
        if (slotId <= SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
            // not specified, replace package on all slots.
            for (int i = 0; i < mNumSlots; i++) {
                mOverrideServices[i] = newPackageName;
                updateBoundCarrierServices(i, newPackageName);
            }
        } else {
            mOverrideServices[slotId] = newPackageName;
            updateBoundCarrierServices(slotId, newPackageName);
        }

@@ -1160,7 +1166,15 @@ public class ImsResolver implements ImsServiceController.ImsServiceControllerCal
     */
    private void updateBoundCarrierServices(int slotId, String newPackageName) {
        if (slotId > SubscriptionManager.INVALID_SIM_SLOT_INDEX && slotId < mNumSlots) {
            String overridePackageName = mOverrideServices[slotId];
            String oldPackageName = mCarrierServices[slotId];
            if (!TextUtils.isEmpty(overridePackageName)) {
                // Do not allow carrier config changes to change the override package while it is
                // in effect.
                Log.i(TAG, "CarrierConfig change ignored for " + newPackageName + " while override"
                        + " is in effect for " + overridePackageName);
                newPackageName = overridePackageName;
            }
            mCarrierServices[slotId] = newPackageName;
            if (!TextUtils.equals(newPackageName, oldPackageName)) {
                Log.i(TAG, "Carrier Config updated, binding new ImsService");
+23 −5
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ import android.telephony.ims.ImsCallForwardInfo;
import android.telephony.ims.ImsCallProfile;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.ImsSsInfo;
import android.telephony.ims.RegistrationManager;
import android.text.TextUtils;

import com.android.ims.FeatureConnector;
@@ -110,6 +111,7 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

/**
 * {@hide}
@@ -213,7 +215,7 @@ public class ImsPhone extends ImsPhoneBase {

    private final RegistrantList mSilentRedialRegistrants = new RegistrantList();

    private boolean mImsRegistered = false;
    private int mImsRegistrationState = RegistrationManager.REGISTRATION_STATE_NOT_REGISTERED;

    private boolean mRoaming = false;

@@ -1741,6 +1743,16 @@ public class ImsPhone extends ImsPhoneBase {
        return mCT.getImsRegistrationTech();
    }

    @Override
    public void getImsRegistrationTech(Consumer<Integer> callback) {
        mCT.getImsRegistrationTech(callback);
    }

    @Override
    public void getImsRegistrationState(Consumer<Integer> callback) {
        callback.accept(mImsRegistrationState);
    }

    @Override
    public Phone getDefaultPhone() {
        return mDefaultPhone;
@@ -1748,12 +1760,18 @@ public class ImsPhone extends ImsPhoneBase {

    @Override
    public boolean isImsRegistered() {
        return mImsRegistered;
        return mImsRegistrationState == RegistrationManager.REGISTRATION_STATE_REGISTERED;
    }

    // Not used, but not removed due to UnsupportedAppUsage tag.
    @UnsupportedAppUsage
    public void setImsRegistered(boolean value) {
        mImsRegistered = value;
    public void setImsRegistered(boolean isRegistered) {
        mImsRegistrationState = isRegistered ? RegistrationManager.REGISTRATION_STATE_REGISTERED :
                RegistrationManager.REGISTRATION_STATE_NOT_REGISTERED;
    }

    public void setImsRegistrationState(@RegistrationManager.ImsRegistrationState int value) {
        mImsRegistrationState = value;
    }

    @Override
@@ -2025,7 +2043,7 @@ public class ImsPhone extends ImsPhoneBase {
        pw.println("  mIsPhoneInEcmState = " + isInEcm());
        pw.println("  mEcmExitRespRegistrant = " + mEcmExitRespRegistrant);
        pw.println("  mSilentRedialRegistrants = " + mSilentRedialRegistrants);
        pw.println("  mImsRegistered = " + mImsRegistered);
        pw.println("  mImsRegistrationState = " + mImsRegistrationState);
        pw.println("  mRoaming = " + mRoaming);
        pw.println("  mSsnRegistrants = " + mSsnRegistrants);
        pw.flush();
+26 −6
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.ImsStreamMediaProfile;
import android.telephony.ims.ImsSuppServiceNotification;
import android.telephony.ims.ProvisioningManager;
import android.telephony.ims.RegistrationManager;
import android.telephony.ims.feature.ImsFeature;
import android.telephony.ims.feature.MmTelFeature;
import android.telephony.ims.stub.ImsRegistrationImplBase;
@@ -125,6 +126,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
import java.util.regex.Pattern;

/**
@@ -3149,8 +3151,8 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
        }
    };

    private final ImsMmTelManager.RegistrationCallback mImsRegistrationCallback =
            new ImsMmTelManager.RegistrationCallback() {
    private final RegistrationManager.RegistrationCallback mImsRegistrationCallback =
            new RegistrationManager.RegistrationCallback() {

                @Override
                public void onRegistered(int imsRadioTech) {
@@ -3161,7 +3163,8 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
                    mRegLocalLog.log("onImsConnected imsRadioTech="
                            + AccessNetworkConstants.transportTypeToString(imsRadioTech));
                    mPhone.setServiceState(ServiceState.STATE_IN_SERVICE);
                    mPhone.setImsRegistered(true);
                    mPhone.setImsRegistrationState(
                            RegistrationManager.REGISTRATION_STATE_REGISTERED);
                    mMetrics.writeOnImsConnectionState(mPhone.getPhoneId(),
                            ImsConnectionState.State.CONNECTED, null);
                }
@@ -3175,7 +3178,8 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
                    mRegLocalLog.log("onImsProgressing imsRadioTech="
                            + AccessNetworkConstants.transportTypeToString(imsRadioTech));
                    mPhone.setServiceState(ServiceState.STATE_OUT_OF_SERVICE);
                    mPhone.setImsRegistered(false);
                    mPhone.setImsRegistrationState(
                            RegistrationManager.REGISTRATION_STATE_REGISTERING);
                    mMetrics.writeOnImsConnectionState(mPhone.getPhoneId(),
                            ImsConnectionState.State.PROGRESSING, null);
                }
@@ -3185,7 +3189,8 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
                    if (DBG) log("onImsDisconnected imsReasonInfo=" + imsReasonInfo);
                    mRegLocalLog.log("onImsDisconnected imsRadioTech=" + imsReasonInfo);
                    mPhone.setServiceState(ServiceState.STATE_OUT_OF_SERVICE);
                    mPhone.setImsRegistered(false);
                    mPhone.setImsRegistrationState(
                            RegistrationManager.REGISTRATION_STATE_NOT_REGISTERED);
                    mPhone.processDisconnectReason(imsReasonInfo);
                    mMetrics.writeOnImsConnectionState(mPhone.getPhoneId(),
                            ImsConnectionState.State.DISCONNECTED, imsReasonInfo);
@@ -3754,6 +3759,17 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
        return ImsRegistrationImplBase.REGISTRATION_TECH_NONE;
    }

    /**
     * Asynchronously gets the IMS registration technology for MMTEL.
     */
    public void getImsRegistrationTech(Consumer<Integer> callback) {
        if (mImsManager != null) {
            mImsManager.getRegistrationTech(callback);
        } else {
            callback.accept(ImsRegistrationImplBase.REGISTRATION_TECH_NONE);
        }
    }

    private void retryGetImsService() {
        // The binder connection is already up. Do not try to get it again.
        if (mImsManager.isServiceAvailable()) {
@@ -4145,7 +4161,11 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
        log("Resetting Capabilities...");
        boolean tmpIsVideoCallEnabled = isVideoCallEnabled();
        mMmTelCapabilities = new MmTelFeature.MmTelCapabilities();

        mPhone.setServiceState(ServiceState.STATE_OUT_OF_SERVICE);
        mPhone.setImsRegistrationState(
                RegistrationManager.REGISTRATION_STATE_NOT_REGISTERED);
        mPhone.processDisconnectReason(new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN,
                ImsReasonInfo.CODE_UNSPECIFIED));
        boolean isVideoEnabled = isVideoCallEnabled();
        if (tmpIsVideoCallEnabled != isVideoEnabled) {
            mPhone.notifyForVideoCapabilityChanged(isVideoEnabled);
Loading