Merge "Reject incoming call for a normal routing emergency call" into 24D1-dev
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 0e865c5..ad75da9 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -879,7 +879,7 @@
     <string name="radio_info_dl_kbps" msgid="2382922659525318726">"Largura de banda de descarga (kbps):"</string>
     <string name="radio_info_ul_kbps" msgid="2102225400904799036">"Largura de banda de carga (kbps):"</string>
     <string name="radio_info_phy_chan_config" msgid="608045501232211303">"Configuración da canle física:"</string>
-    <string name="radio_info_cell_info_refresh_rate" msgid="670511448975997340">"Taxa de actualización da información para móbiles:"</string>
+    <string name="radio_info_cell_info_refresh_rate" msgid="670511448975997340">"Frecuencia de actualización da información para móbiles:"</string>
     <string name="radio_info_cellinfo_label" msgid="8199062974670377659">"Toda a información de medición para móbiles:"</string>
     <string name="radio_info_gprs_service_label" msgid="6819204246355412952">"Servizo de datos:"</string>
     <string name="radio_info_roaming_label" msgid="6636932886446857120">"Itinerancia:"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 3c7398e..254a91f 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -524,7 +524,7 @@
     <string name="card_title_dialing" msgid="8742182654254431781">"Терилүүдө"</string>
     <string name="card_title_redialing" msgid="18130232613559964">"Кайра терүү"</string>
     <string name="card_title_conf_call" msgid="901197309274457427">"Конференц-чалуу"</string>
-    <string name="card_title_incoming_call" msgid="881424648458792430">"Кирүүчү чалуу"</string>
+    <string name="card_title_incoming_call" msgid="881424648458792430">"Чалып жатат"</string>
     <string name="card_title_call_ended" msgid="650223980095026340">"Чалуу аяктады"</string>
     <string name="card_title_on_hold" msgid="9028319436626975207">"Күтүлүүдө"</string>
     <string name="card_title_hanging_up" msgid="814874106866647871">"Телефон коюлууда"</string>
@@ -770,19 +770,19 @@
     <string name="sum_call_barring_enabled" msgid="5184331188926370824">"Күйүк"</string>
     <string name="sum_call_barring_disabled" msgid="5699448000600153096">"Өчүк"</string>
     <string name="call_barring_baoc" msgid="7400892586336429326">"Чыгуучу чалуулардын баары"</string>
-    <string name="call_barring_baoc_enabled" msgid="3131509193386668182">"Чыгуучу чалуулардын баарын бөгөттөө функциясы өчүрүлсүнбү?"</string>
+    <string name="call_barring_baoc_enabled" msgid="3131509193386668182">"Чыгуучу чалуулардын баарын бөгөттөө функциясын өчүрөсүзбү?"</string>
     <string name="call_barring_baoc_disabled" msgid="8534224684091141509">"Чыгуучу чалуулардын баары бөгөттөлсүнбү?"</string>
     <string name="call_barring_baoic" msgid="8668125428666851665">"Эл аралык чыгуучу чалуу"</string>
-    <string name="call_barring_baoic_enabled" msgid="1203758092657630123">"Эл аралык чыгуучу чалууларды бөгөттөө функциясы өчүрүлсүнбү?"</string>
+    <string name="call_barring_baoic_enabled" msgid="1203758092657630123">"Эл аралык чыгуучу чалууларды бөгөттөө функциясын өчүрөсүзбү?"</string>
     <string name="call_barring_baoic_disabled" msgid="5656889339002997449">"Эл аралык чыгуучу чалуулар бөгөттөлсүнбү?"</string>
     <string name="call_barring_baoicr" msgid="8566167764432343487">"Роумингдеги эл аралык чыгуучу чалуулар"</string>
-    <string name="call_barring_baoicr_enabled" msgid="1615324165512798478">"Роумингдеги эларалык чыгуучу чалууларды бөгөттөө функциясы өчүрүлсүнбү?"</string>
+    <string name="call_barring_baoicr_enabled" msgid="1615324165512798478">"Роумингдеги эларалык чыгуучу чалууларды бөгөттөө функциясын өчүрөсүзбү?"</string>
     <string name="call_barring_baoicr_disabled" msgid="172010175248142831">"Роумингдеги эларалык чыгуучу чалуулар бөгөттөлсүнбү?"</string>
     <string name="call_barring_baic" msgid="7941393541678658566">"Кирүүчү чалуулардын баары"</string>
-    <string name="call_barring_baic_enabled" msgid="4357332358020337470">"Кирүүчү чалуулардын баарын бөгөттөө функциясы өчүрүлсүнбү?"</string>
+    <string name="call_barring_baic_enabled" msgid="4357332358020337470">"Кирүүчү чалуулардын баарын бөгөттөө функциясын өчүрөсүзбү?"</string>
     <string name="call_barring_baic_disabled" msgid="2355945245938240958">"Кирүүчү чалуулардын баары бөгөттөлсүнбү?"</string>
     <string name="call_barring_baicr" msgid="8712249337313034226">"Роумингдеги эл аралык кирүүчү чалуу"</string>
-    <string name="call_barring_baicr_enabled" msgid="64774270234828175">"Роумингдеги эл аралык кирүүчү чалууларды бөгөттөө функциясы өчүрүлсүнбү?"</string>
+    <string name="call_barring_baicr_enabled" msgid="64774270234828175">"Роумингдеги эл аралык кирүүчү чалууларды бөгөттөө функциясын өчүрөсүзбү?"</string>
     <string name="call_barring_baicr_disabled" msgid="3488129262744027262">"Роумингдеги эл аралык кирүүчү чалуу бөгөттөлсүнбү?"</string>
     <string name="call_barring_deactivate_all" msgid="7837931580047157328">"Баары өчүрүлсүн"</string>
     <string name="call_barring_deactivate_all_description" msgid="4474119585042121604">"Чалууларга тыюу салуу функциясынын параметрлерин өчүрүү"</string>
diff --git a/src/com/android/phone/CallWaitingSwitchPreference.java b/src/com/android/phone/CallWaitingSwitchPreference.java
index 00407f3..a5bc92e 100644
--- a/src/com/android/phone/CallWaitingSwitchPreference.java
+++ b/src/com/android/phone/CallWaitingSwitchPreference.java
@@ -35,6 +35,8 @@
     private int mUpdateStatus = TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR;
     private int mQueryStatus = TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR;
     private boolean mUssdMode = false;
+    private boolean mCwEnabled = false;
+    private boolean mCwClicked = false;
 
     public CallWaitingSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
@@ -60,6 +62,7 @@
         PersistableBundle bundle = configManager.getConfigForSubId(phone.getSubId());
         mUssdMode = (bundle != null) ? bundle.getBoolean(
                 CarrierConfigManager.KEY_USE_CALL_WAITING_USSD_BOOL, false) : false;
+        mCwEnabled = false;
 
         if (!skipReading) {
             Log.d(LOG_TAG, "init getCallWaitingStatus");
@@ -101,7 +104,9 @@
     @Override
     protected void onClick() {
         super.onClick();
-        mTelephonyManager.setCallWaitingEnabled(isChecked(), mExecutor, this::updateStatusCallBack);
+        mCwEnabled = isChecked();
+        mCwClicked = true;
+        mTelephonyManager.setCallWaitingEnabled(mCwEnabled, mExecutor, this::updateStatusCallBack);
         if (mTcpListener != null) {
             mIsDuringUpdateProcess = true;
             mTcpListener.onStarted(this, false);
@@ -145,6 +150,8 @@
                 if (mTcpListener != null) {
                     mTcpListener.onError(CallWaitingSwitchPreference.this, error);
                 }
+                handleCwFallbackOnError();
+                setChecked(mCwEnabled);
             } else if (mQueryStatus == TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR
                     || (mIsDuringUpdateProcess && (
                     mUpdateStatus != TelephonyManager.CALL_WAITING_STATUS_ENABLED
@@ -153,14 +160,21 @@
                 if (mTcpListener != null) {
                     mTcpListener.onError(CallWaitingSwitchPreference.this, RESPONSE_ERROR);
                 }
+                handleCwFallbackOnError();
+                setChecked(mCwEnabled);
             } else {
-                if (mQueryStatus == TelephonyManager.CALL_WAITING_STATUS_ENABLED) {
-                    setChecked(true);
-                } else {
-                    setChecked(false);
-                }
+                mCwEnabled = mQueryStatus == TelephonyManager.CALL_WAITING_STATUS_ENABLED;
+                setChecked(mCwEnabled);
             }
             mIsDuringUpdateProcess = false;
+            mCwClicked = false;
+        }
+    }
+
+    private void handleCwFallbackOnError() {
+        // Recover initial state before onClick.
+        if (mCwClicked) {
+            mCwEnabled = !mCwEnabled;
         }
     }
 }
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
index e992de2..3fb6ae8 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
@@ -342,6 +342,15 @@
                             logi("requestScan-onComplete");
                             sendMessage(obtainMessage(MSG_NETWORK_SCAN_RESULT, regResult));
                         });
+            } else if ((mPreferredNetworkScanType
+                    == CarrierConfigManager.ImsEmergency.SCAN_TYPE_FULL_SERVICE)
+                    && (mScanType == DomainSelectionService.SCAN_TYPE_FULL_SERVICE)) {
+                mWwanSelectorCallback.onRequestEmergencyNetworkScan(
+                        mLastPreferredNetworks, mScanType, true, mCancelSignal,
+                        (regResult) -> {
+                            logi("requestScan-onComplete");
+                            sendMessage(obtainMessage(MSG_NETWORK_SCAN_RESULT, regResult));
+                        });
             } else {
                 // Continuous scan, do not start a new timer.
                 requestScan(false);
@@ -367,11 +376,10 @@
         if (accessNetworkType != EUTRAN) return accessNetworkType;
 
         int regState = result.getRegState();
-        int domain = result.getDomain();
 
         // Emergency is not supported with LTE, but CSFB is possible.
         if ((regState == REGISTRATION_STATE_HOME || regState == REGISTRATION_STATE_ROAMING)
-                && (domain == NetworkRegistrationInfo.DOMAIN_CS)) {
+                && isCsDomainOnlyAvailable(result)) {
             logi("getAccessNetworkType emergency not supported but CSFB is possible");
             accessNetworkType = UTRAN;
         }
@@ -379,6 +387,15 @@
         return accessNetworkType;
     }
 
+    private boolean isCsDomainOnlyAvailable(EmergencyRegistrationResult result) {
+        int domain = result.getDomain();
+        if (domain == NetworkRegistrationInfo.DOMAIN_CS) return true;
+        if ((domain & NetworkRegistrationInfo.DOMAIN_CS) > 0) {
+            return (!result.isEmcBearerSupported() || !result.isVopsSupported());
+        }
+        return false;
+    }
+
     @Override
     public void reselectDomain(SelectionAttributes attr) {
         logi("reselectDomain attr=" + attr);
diff --git a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
index 7c5a82c..4690d6e 100644
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
@@ -1893,6 +1893,32 @@
     }
 
     @Test
+    public void testEutranVopsNotSupported() throws Exception {
+        setupForHandleScanResult();
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_HOME,
+                DOMAIN_CS | DOMAIN_PS, false, true, 0, 0, "", "");
+        mResultConsumer.accept(regResult);
+        processAllMessages();
+
+        verifyCsDialed();
+    }
+
+    @Test
+    public void testEutranEmcBearerNotSupported() throws Exception {
+        setupForHandleScanResult();
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_HOME,
+                DOMAIN_CS | DOMAIN_PS, true, false, 0, 0, "", "");
+        mResultConsumer.accept(regResult);
+        processAllMessages();
+
+        verifyCsDialed();
+    }
+
+    @Test
     public void testEutranWithPsDomainOnly() throws Exception {
         setupForHandleScanResult();
 
@@ -1945,8 +1971,10 @@
         mResultConsumer.accept(regResult);
         processAllMessages();
 
-        verify(mWwanSelectorCallback, times(2)).onRequestEmergencyNetworkScan(
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
                 any(), eq(DomainSelectionService.SCAN_TYPE_FULL_SERVICE), eq(false), any(), any());
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), eq(DomainSelectionService.SCAN_TYPE_FULL_SERVICE), eq(true), any(), any());
     }
 
     @Test