Merge "Get the Phone to use for an emergency call of the emergency number address"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 6138c9b..88ed3b8 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -258,39 +258,6 @@
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:exported="false"/>
- <!-- "Mobile network settings" screen, used on both
- non-voice-capable tablets and regular phone devices. -->
- <activity android:name="MobileNetworkSettings"
- android:label="@string/network_settings_title"
- android:theme="@style/NetworkOperatorsSettingsTheme">
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <action android:name="android.intent.action.MAIN" />
- <action android:name="android.settings.NETWORK_OPERATOR_SETTINGS" />
- <action android:name="android.settings.DATA_ROAMING_SETTINGS" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
-
- <activity-alias android:name="Settings"
- android:targetActivity="MobileNetworkSettings" />
-
- <!-- networks setting -->
- <!-- "Choose network" screen. Used only when the Automatically
- select network turned off-->
- <activity android:name="NetworkSelectSettingActivity"
- android:label="@string/choose_network_title"
- android:theme="@style/NetworkOperatorsSettingsTheme"
- android:configChanges="orientation|screenSize">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
-
- <!-- service to handle network query requests sent to RIL -->
- <service android:name="NetworkQueryService" />
-
<activity android:name="GsmUmtsCallOptions"
android:label="@string/gsm_umts_options"
android:theme="@style/DialerSettingsLight">
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index a0e5530..228eed1 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -46,6 +46,9 @@
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.TelephonyManager;
+import android.telephony.ims.ImsMmTelManager;
+import android.telephony.ims.feature.MmTelFeature;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.text.TextUtils;
import com.android.ims.ImsManager;
@@ -78,7 +81,10 @@
private final PstnIncomingCallNotifier mIncomingCallNotifier;
private final PstnPhoneCapabilitiesNotifier mPhoneCapabilitiesNotifier;
private boolean mIsEmergency;
- private boolean mIsDummy;
+ private boolean mIsRttCapable;
+ private MmTelFeature.MmTelCapabilities mMmTelCapabilities;
+ private ImsMmTelManager.CapabilityCallback mMmtelCapabilityCallback;
+ private final boolean mIsDummy;
private boolean mIsVideoCapable;
private boolean mIsVideoPresenceSupported;
private boolean mIsVideoPauseSupported;
@@ -99,11 +105,53 @@
mIncomingCallNotifier = new PstnIncomingCallNotifier((Phone) mPhone);
mPhoneCapabilitiesNotifier = new PstnPhoneCapabilitiesNotifier((Phone) mPhone,
this);
+
+ if (!mIsDummy) {
+ ImsMmTelManager manager;
+ try {
+ manager = ImsMmTelManager.createForSubscriptionId(mContext, getSubId());
+ } catch (IllegalArgumentException e) {
+ Log.i(this, "Not registering Mmtel listener because the subid is invalid");
+ return;
+ }
+
+ boolean isImsVoiceCapable = manager.isCapable(
+ ImsRegistrationImplBase.REGISTRATION_TECH_LTE,
+ MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE)
+ || manager.isCapable(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN,
+ MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE);
+
+ if (!isImsVoiceCapable) {
+ Log.i(this, "Not registering MmTel listener because"
+ + " voice over IMS isn't supported");
+ return;
+ }
+
+ mMmtelCapabilityCallback =
+ new ImsMmTelManager.CapabilityCallback() {
+ @Override
+ public void onCapabilitiesStatusChanged(
+ MmTelFeature.MmTelCapabilities capabilities) {
+ mMmTelCapabilities = capabilities;
+ updateRttCapability();
+ }
+ };
+ manager.registerMmTelCapabilityCallback(mContext.getMainExecutor(),
+ mMmtelCapabilityCallback);
+ }
}
void teardown() {
mIncomingCallNotifier.teardown();
mPhoneCapabilitiesNotifier.teardown();
+ if (mMmtelCapabilityCallback != null) {
+ try {
+ ImsMmTelManager.createForSubscriptionId(mContext, getSubId())
+ .unregisterMmTelCapabilityCallback(mMmtelCapabilityCallback);
+ } catch (IllegalArgumentException e) {
+ // TODO (breadley): Tearing down may fail if the sim has been removed.
+ }
+ }
}
/**
@@ -260,8 +308,10 @@
extras.putBoolean(PhoneAccount.EXTRA_PLAY_CALL_RECORDING_TONE, true);
}
- if (PhoneGlobals.getInstance().phoneMgr.isRttEnabled(subId)) {
+ if (PhoneGlobals.getInstance().phoneMgr.isRttEnabled(subId)
+ && isImsVoiceAvailable()) {
capabilities |= PhoneAccount.CAPABILITY_RTT;
+ mIsRttCapable = true;
}
extras.putBoolean(PhoneAccount.EXTRA_SUPPORTS_VIDEO_CALLING_FALLBACK,
@@ -525,10 +575,21 @@
}
public void updateRttCapability() {
- boolean isRttEnabled = PhoneGlobals.getInstance().phoneMgr
+ // In the rare case that mMmTelCapabilities hasn't been set yet, try fetching it
+ // directly.
+ boolean hasVoiceAvailability;
+ if (mMmTelCapabilities != null) {
+ hasVoiceAvailability = mMmTelCapabilities.isCapable(
+ MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE);
+ } else {
+ hasVoiceAvailability = isImsVoiceAvailable();
+ }
+
+ boolean isRttSupported = PhoneGlobals.getInstance().phoneMgr
.isRttEnabled(mPhone.getSubId());
- boolean oldRttEnabled = mAccount.hasCapabilities(PhoneAccount.CAPABILITY_RTT);
- if (isRttEnabled != oldRttEnabled) {
+
+ boolean isRttEnabled = hasVoiceAvailability && isRttSupported;
+ if (isRttEnabled != mIsRttCapable) {
mAccount = registerPstnPhoneAccount(mIsEmergency, mIsDummy);
}
}
@@ -591,6 +652,20 @@
public boolean isShowPreciseFailedCause() {
return mIsShowPreciseFailedCause;
}
+
+ private boolean isImsVoiceAvailable() {
+ if (mMmTelCapabilities != null) {
+ return mMmTelCapabilities.isCapable(
+ MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE);
+ }
+
+ ImsMmTelManager manager = ImsMmTelManager.createForSubscriptionId(
+ mContext, getSubId());
+ return manager.isAvailable(ImsRegistrationImplBase.REGISTRATION_TECH_LTE,
+ MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE)
+ || manager.isAvailable(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN,
+ MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE);
+ }
}
private OnSubscriptionsChangedListener mOnSubscriptionsChangedListener =
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 8f46ecf..d2ba8f1 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -2266,6 +2266,8 @@
android.telecom.Connection.EXTRA_CHILD_ADDRESS);
result.put(ImsCallProfile.EXTRA_DISPLAY_TEXT,
android.telecom.Connection.EXTRA_CALL_SUBJECT);
+ result.put(ImsCallProfile.EXTRA_ADDITIONAL_SIP_INVITE_FIELDS,
+ android.telecom.Connection.EXTRA_SIP_INVITE);
return Collections.unmodifiableMap(result);
}