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);
     }