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

Commit f5d75988 authored by Brad Ebinger's avatar Brad Ebinger Committed by android-build-merger
Browse files

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

am: 7bc44233

Change-Id: Idb517104275adb0f9df9f5ab4000be646ad112c9
parents 9f79a881 7bc44233
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;

/**
@@ -3154,8 +3156,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) {
@@ -3166,7 +3168,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);
                }
@@ -3180,7 +3183,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);
                }
@@ -3190,7 +3194,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);
@@ -3759,6 +3764,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()) {
@@ -4150,7 +4166,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