Loading src/java/com/android/internal/telephony/ImsSmsDispatcher.java +45 −24 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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; } Loading @@ -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; } Loading @@ -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. Loading Loading @@ -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) { Loading @@ -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, Loading @@ -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) { Loading @@ -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: Loading @@ -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); } Loading @@ -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; Loading @@ -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; } Loading Loading @@ -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; } Loading @@ -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); Loading @@ -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; } Loading @@ -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; } } Loading Loading @@ -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()); Loading Loading @@ -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); Loading @@ -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()) : "?"; } } src/java/com/android/internal/telephony/Phone.java +27 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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>) Loading Loading @@ -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)) { Loading src/java/com/android/internal/telephony/ims/ImsResolver.java +14 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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()); Loading Loading @@ -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); } Loading Loading @@ -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"); Loading src/java/com/android/internal/telephony/imsphone/ImsPhone.java +23 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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} Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -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 Loading Loading @@ -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(); Loading src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java +26 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; /** Loading Loading @@ -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) { Loading @@ -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); } Loading @@ -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); } Loading @@ -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); Loading Loading @@ -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()) { Loading Loading @@ -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 Loading
src/java/com/android/internal/telephony/ImsSmsDispatcher.java +45 −24 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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; } Loading @@ -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; } Loading @@ -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. Loading Loading @@ -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) { Loading @@ -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, Loading @@ -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) { Loading @@ -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: Loading @@ -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); } Loading @@ -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; Loading @@ -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; } Loading Loading @@ -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; } Loading @@ -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); Loading @@ -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; } Loading @@ -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; } } Loading Loading @@ -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()); Loading Loading @@ -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); Loading @@ -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()) : "?"; } }
src/java/com/android/internal/telephony/Phone.java +27 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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>) Loading Loading @@ -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)) { Loading
src/java/com/android/internal/telephony/ims/ImsResolver.java +14 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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()); Loading Loading @@ -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); } Loading Loading @@ -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"); Loading
src/java/com/android/internal/telephony/imsphone/ImsPhone.java +23 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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} Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -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 Loading Loading @@ -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(); Loading
src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java +26 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; /** Loading Loading @@ -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) { Loading @@ -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); } Loading @@ -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); } Loading @@ -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); Loading Loading @@ -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()) { Loading Loading @@ -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