Merge "Return different disconnect reason and error strings for oem and carrier satellite" into 24D1-dev
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 4127de8..75385e7 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -538,7 +538,7 @@
     <string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"通話を発信するには、モバイル ネットワークを ON にし、機内モードまたはバッテリー セーバー モードを OFF にしてください。"</string>
     <string name="incall_error_power_off" product="default" msgid="8131672264311208673">"電話をかけるには機内モードをオフにしてください。"</string>
     <string name="incall_error_power_off_wfc" msgid="9125661184694727052">"電話をかけるには、機内モードをオフにするか無線ネットワークに接続してください。"</string>
-    <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"スマートフォンが熱くなりすぎています"</b>\n\n"この通話を完了できません。スマートフォンの熱が冷めてから、もう一度お試しください。\n\n緊急通報は通常どおり発信できます。"</string>
+    <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"スマートフォンが熱くなっています"</b>\n\n"この通話を完了できません。スマートフォンの熱が冷めてから、もう一度お試しください。\n\n緊急通報は通常どおり発信できます。"</string>
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"緊急通報以外の通話を発信するには、緊急通報待機モードを終了してください。"</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"ご加入の通信サービスがありません"</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"モバイルネットワークが利用できません。"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index da89764..f373f5b 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -485,7 +485,7 @@
     <string name="simContacts_title" msgid="2714029230160136647">"Contacten selecteren om te importeren"</string>
     <string name="simContacts_airplaneMode" msgid="4654884030631503808">"Zet de vliegtuigmodus uit om contacten van de simkaart te importeren."</string>
     <string name="enable_pin" msgid="967674051730845376">"SIM pincode aan-/uitzetten"</string>
-    <string name="change_pin" msgid="3657869530942905790">"Pincode simkaart wijzigen"</string>
+    <string name="change_pin" msgid="3657869530942905790">"Pincode van simkaart wijzigen"</string>
     <string name="enter_pin_text" msgid="3182311451978663356">"Pincode simkaart:"</string>
     <string name="oldPinLabel" msgid="8618515202411987721">"Oude pincode"</string>
     <string name="newPinLabel" msgid="3585899083055354732">"Nieuwe pincode"</string>
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index c382a44..4c8c836 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -13020,7 +13020,7 @@
                     }
                     if (isAllowed) {
                         mSatelliteController.requestSatelliteEnabled(
-                                subId, enableSatellite, enableDemoMode, callback);
+                                subId, enableSatellite, enableDemoMode, isEmergency, callback);
                     } else {
                         result.accept(SATELLITE_RESULT_ACCESS_BARRED);
                     }
@@ -13031,7 +13031,7 @@
         } else {
             // No need to check if satellite is allowed at current location when disabling satellite
             mSatelliteController.requestSatelliteEnabled(
-                    subId, enableSatellite, enableDemoMode, callback);
+                    subId, enableSatellite, enableDemoMode, isEmergency, callback);
         }
     }
 
diff --git a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementApi.java b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementApi.java
index 45482ec..6c55709 100644
--- a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementApi.java
+++ b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementApi.java
@@ -61,7 +61,8 @@
         SatelliteEntitlementResponse satelliteEntitlementResponse =
                 new SatelliteEntitlementResponse(response);
         return new SatelliteEntitlementResult(satelliteEntitlementResponse.getEntitlementStatus(),
-                satelliteEntitlementResponse.getPlmnAllowed());
+                satelliteEntitlementResponse.getPlmnAllowed(),
+                satelliteEntitlementResponse.getPlmnBarredList());
     }
 
     @NonNull
diff --git a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementController.java b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementController.java
index accae32..d193a7d 100644
--- a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementController.java
+++ b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementController.java
@@ -429,7 +429,8 @@
         updateSatelliteEntitlementStatus(subId,
                 mSatelliteEntitlementResultPerSub.get(subId).getEntitlementStatus()
                         == SATELLITE_ENTITLEMENT_STATUS_ENABLED,
-                mSatelliteEntitlementResultPerSub.get(subId).getAllowedPLMNList());
+                mSatelliteEntitlementResultPerSub.get(subId).getAllowedPLMNList(),
+                mSatelliteEntitlementResultPerSub.get(subId).getBarredPLMNList());
         stopExponentialBackoff(subId);
         mRetryCountPerSub.remove(subId);
     }
@@ -528,9 +529,9 @@
      */
     @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
     public void updateSatelliteEntitlementStatus(int subId, boolean enabled,
-            List<String> plmnAllowedList) {
+            List<String> plmnAllowedList, List<String> plmnBarredList) {
         SatelliteController.getInstance().onSatelliteEntitlementStatusUpdated(subId, enabled,
-                plmnAllowedList, null);
+                plmnAllowedList, plmnBarredList, null);
     }
 
     private static void logd(String log) {
diff --git a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResponse.java b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResponse.java
index b877bee..97cb355 100644
--- a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResponse.java
+++ b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResponse.java
@@ -97,7 +97,6 @@
      * Get the PLMNBarredList from the response
      * @return The PLMNs Barred List
      */
-    @VisibleForTesting
     public List<String> getPlmnBarredList() {
         return mPlmnBarredList.stream().map(String::new).collect(Collectors.toList());
     }
@@ -137,7 +136,10 @@
                 mPlmnBarredList = new ArrayList<>();
                 JSONArray jsonArray = jsonToken.getJSONArray(PLMN_BARRED_KEY);
                 for (int i = 0; i < jsonArray.length(); i++) {
-                    mPlmnBarredList.add(jsonArray.getJSONObject(i).getString(PLMN_KEY));
+                    String plmn = jsonArray.getJSONObject(i).getString(PLMN_KEY);
+                    if (!TextUtils.isEmpty(plmn)) {
+                        mPlmnBarredList.add(plmn);
+                    }
                 }
             }
         } catch (JSONException e) {
diff --git a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResult.java b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResult.java
index 3289232..014e28e 100644
--- a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResult.java
+++ b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResult.java
@@ -53,17 +53,25 @@
      * item of the satellite configuration received from the entitlement server.
      */
     private List<SatelliteNetworkInfo> mAllowedSatelliteNetworkInfoList;
+    /**
+     * List consisting of the PLMN in the PLMNBarred item of the satellite configuration received
+     * from the entitlement server
+     */
+    private List<String> mBarredPlmnList;
 
     /**
      * Store the result of the satellite entitlement response.
      *
      * @param entitlementStatus The entitlement status.
      * @param allowedSatelliteNetworkInfoList The allowedSatelliteNetworkInfoList
+     * @param barredPlmnList The barred plmn list
      */
     public SatelliteEntitlementResult(@SatelliteEntitlementStatus int entitlementStatus,
-            List<SatelliteNetworkInfo> allowedSatelliteNetworkInfoList) {
+            List<SatelliteNetworkInfo> allowedSatelliteNetworkInfoList,
+            List<String> barredPlmnList) {
         mEntitlementStatus = entitlementStatus;
         mAllowedSatelliteNetworkInfoList = allowedSatelliteNetworkInfoList;
+        mBarredPlmnList = barredPlmnList;
     }
 
     /**
@@ -86,6 +94,15 @@
     }
 
     /**
+     * Get the plmn barred list
+     *
+     * @return The plmn barred list.
+     */
+    public List<String> getBarredPLMNList() {
+        return mBarredPlmnList.stream().map(String::new).collect(Collectors.toList());
+    }
+
+    /**
      * Get the default SatelliteEntitlementResult. EntitlementStatus set to
      * `SATELLITE_ENTITLEMENT_STATUS_DISABLED` and SatelliteNetworkInfo list set to empty.
      *
@@ -93,6 +110,6 @@
      */
     public static SatelliteEntitlementResult getDefaultResult() {
         return new SatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_DISABLED,
-                new ArrayList<>());
+                new ArrayList<>(), new ArrayList<>());
     }
 }
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index f656d21..e539bac 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -2811,6 +2811,25 @@
                 .findFirst().orElse(null);
     }
 
+    /**
+     * Determines the phone with which emergency callback mode was set.
+     * @return The {@link Phone} with which emergency callback mode was set,
+     *         or {@code null} if none was found.
+     */
+    @VisibleForTesting
+    public Phone getPhoneInEmergencyCallbackMode() {
+        if (!mDomainSelectionResolver.isDomainSelectionSupported()) {
+            // This is applicable for the AP domain selection service.
+            return null;
+        }
+        if (mEmergencyStateTracker == null) {
+            mEmergencyStateTracker = EmergencyStateTracker.getInstance();
+        }
+        return Stream.of(mPhoneFactoryProxy.getPhones())
+                .filter(p -> mEmergencyStateTracker.isInEcm(p))
+                .findFirst().orElse(null);
+    }
+
     private boolean isVoiceInService(Phone phone, boolean imsVoiceCapable) {
         // Dialing normal call is available.
         if (phone.isWifiCallingEnabled()) {
@@ -3314,6 +3333,15 @@
             return normalRoutingPhone;
         }
 
+        if (mDomainSelectionResolver.isDomainSelectionSupported()) {
+            Phone phoneInEcm = getPhoneInEmergencyCallbackMode();
+            if (phoneInEcm != null) {
+                Log.i(this, "getPhoneForAccount: in ECBM, using phoneId=%d/subId=%d",
+                        phoneInEcm.getPhoneId(), phoneInEcm.getSubId());
+                return phoneInEcm;
+            }
+        }
+
         // Default emergency call phone selection logic:
         // This is an emergency call and the phone we originally planned to make this call
         // with is not in service or was invalid, try to find one that is in service, using the
diff --git a/testapps/TestSatelliteApp/res/layout/activity_SatelliteControl.xml b/testapps/TestSatelliteApp/res/layout/activity_SatelliteControl.xml
index 6a79412..6aec1da 100644
--- a/testapps/TestSatelliteApp/res/layout/activity_SatelliteControl.xml
+++ b/testapps/TestSatelliteApp/res/layout/activity_SatelliteControl.xml
@@ -119,6 +119,12 @@
             android:layout_height="wrap_content"
             android:paddingRight="4dp"
             android:text="@string/isRequestIsSatelliteEnabledForCarrier"/>
+        <Button
+            android:id="@+id/getIsEmergency"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/getIsEmergency"/>
          <Button
             android:id="@+id/Back"
             android:onClick="Back"
diff --git a/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml b/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml
index 20f5ca8..8ddfee1 100644
--- a/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml
+++ b/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml
@@ -30,6 +30,7 @@
     <string name="requestSatelliteCapabilities">requestSatelliteCapabilities</string>
     <string name="requestIsSatelliteCommunicationAllowedForCurrentLocation">requestIsSatelliteCommunicationAllowedForCurrentLocation</string>
     <string name="requestTimeForNextSatelliteVisibility">requestTimeForNextSatelliteVisibility</string>
+    <string name="getIsEmergency">getIsEmergency</string>
 
     <string name="pollPendingSatelliteDatagrams">pollPendingSatelliteDatagrams</string>
     <string name="sendSatelliteDatagram">sendSatelliteDatagram</string>
diff --git a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteControl.java b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteControl.java
index dd7b825..a03f04e 100644
--- a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteControl.java
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteControl.java
@@ -81,6 +81,8 @@
                 .setOnClickListener(this::isSatelliteEnabledForCarrierApp);
         findViewById(R.id.isRequestIsSatelliteEnabledForCarrier)
                 .setOnClickListener(this::isRequestIsSatelliteEnabledForCarrierApp);
+        findViewById(R.id.getIsEmergency)
+                .setOnClickListener(this::getIsEmergencyApp);
         findViewById(R.id.Back).setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View view) {
@@ -92,8 +94,8 @@
     private void enableSatelliteApp(View view) {
         LinkedBlockingQueue<Integer> error = new LinkedBlockingQueue<>(1);
         mSatelliteManager.requestEnabled(
-                new EnableRequestAttributes.Builder(true).setDemoMode(true).build(),
-                Runnable::run, error::offer);
+                new EnableRequestAttributes.Builder(true).setDemoMode(true).setEmergencyMode(true)
+                        .build(), Runnable::run, error::offer);
         TextView textView = findViewById(R.id.text_id);
         try {
             Integer value = error.poll(TIMEOUT, TimeUnit.MILLISECONDS);
@@ -374,4 +376,11 @@
                 + SatelliteTestApp.getTestSatelliteService()
                 .isRequestIsSatelliteEnabledForCarrier());
     }
+
+    private void getIsEmergencyApp(View view) {
+        TextView textView = findViewById(R.id.text_id);
+        textView.setText("[SatelliteService] getIsEmergencyApp= "
+                + SatelliteTestApp.getTestSatelliteService()
+                .getIsEmergency());
+    }
 }
diff --git a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java
index ed9fa10..afa20bc 100644
--- a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java
@@ -100,6 +100,7 @@
     private List<String> mAllPlmnList = new ArrayList<>();
     private boolean mIsSatelliteEnabledForCarrier;
     private boolean mIsRequestIsSatelliteEnabledForCarrier;
+    private boolean mIsEmergnecy;
 
     /**
      * Create TestSatelliteService using the Executor specified for methods being called from
@@ -117,6 +118,7 @@
         mIsCellularModemEnabledMode = false;
         mIsSatelliteEnabledForCarrier = false;
         mIsRequestIsSatelliteEnabledForCarrier = false;
+        mIsEmergnecy = false;
     }
 
     /**
@@ -184,8 +186,9 @@
 
     @Override
     public void requestSatelliteEnabled(boolean enableSatellite, boolean enableDemoMode,
-            @NonNull IIntegerConsumer errorCallback) {
-        logd("requestSatelliteEnabled: mErrorCode=" + mErrorCode + " enable = " + enableSatellite);
+            boolean isEmergency, @NonNull IIntegerConsumer errorCallback) {
+        logd("requestSatelliteEnabled: mErrorCode=" + mErrorCode + " enable = " + enableSatellite
+                + " isEmergency=" + isEmergency);
         if (mErrorCode != SatelliteResult.SATELLITE_RESULT_SUCCESS) {
             runWithExecutor(() -> errorCallback.accept(mErrorCode));
             return;
@@ -196,6 +199,7 @@
         } else {
             disableSatellite(errorCallback);
         }
+        mIsEmergnecy = isEmergency;
     }
 
     private void enableSatellite(@NonNull IIntegerConsumer errorCallback) {
@@ -565,6 +569,10 @@
         return mIsRequestIsSatelliteEnabledForCarrier;
     }
 
+    public boolean getIsEmergency() {
+        return mIsEmergnecy;
+    }
+
     /**
      * Log the message to the radio buffer with {@code DEBUG} priority.
      *
diff --git a/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementControllerTest.java b/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementControllerTest.java
index 18a0284..dd9ea65 100644
--- a/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementControllerTest.java
+++ b/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementControllerTest.java
@@ -79,6 +79,7 @@
     private static final int[] ACTIVE_SUB_ID = {SUB_ID};
     private static final int DEFAULT_QUERY_REFRESH_DAY = 30;
     private static final List<String> PLMN_ALLOWED_LIST = Arrays.asList("31026", "302820");
+    private static final List<String> PLMN_BARRED_LIST = Arrays.asList("12345", "98765");
     @Mock
     CarrierConfigManager mCarrierConfigManager;
     @Mock
@@ -166,7 +167,7 @@
 
         verify(mSatelliteEntitlementApi, never()).checkEntitlementStatus();
         verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
-                anyBoolean(), anyList(), any());
+                anyBoolean(), anyList(), anyList(), any());
 
         mCarrierConfigBundle.putBoolean(
                 CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, true);
@@ -177,7 +178,7 @@
 
         verify(mSatelliteEntitlementApi, never()).checkEntitlementStatus();
         verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
-                anyBoolean(), anyList(), any());
+                anyBoolean(), anyList(), anyList(), any());
 
         replaceInstance(SatelliteEntitlementController.class, "mExponentialBackoffPerSub",
                 mSatelliteEntitlementController, new HashMap<>());
@@ -188,7 +189,7 @@
 
         verify(mSatelliteEntitlementApi, never()).checkEntitlementStatus();
         verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
-                anyBoolean(), anyList(), any());
+                anyBoolean(), anyList(), anyList(), any());
 
         setInternetConnected(true);
         // Verify don't start the query when last query refresh time is not expired.
@@ -197,18 +198,19 @@
 
         verify(mSatelliteEntitlementApi, never()).checkEntitlementStatus();
         verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
-                anyBoolean(), anyList(), any());
+                anyBoolean(), anyList(), anyList(), any());
 
         // Verify start the query when isQueryAvailable return true
         setLastQueryTime(0L);
         doReturn(mSatelliteEntitlementResult).when(
                 mSatelliteEntitlementApi).checkEntitlementStatus();
-        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST);
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST,
+                PLMN_BARRED_LIST);
         mSatelliteEntitlementController.handleCmdStartQueryEntitlement();
 
         verify(mSatelliteEntitlementApi).checkEntitlementStatus();
         verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(anyInt(),
-                anyBoolean(), anyList(), any());
+                anyBoolean(), anyList(), anyList(), any());
     }
 
     @Test
@@ -221,7 +223,7 @@
         verify(mSatelliteEntitlementApi, never()).checkEntitlementStatus();
         // Verify don't call the updateSatelliteEntitlementStatus.
         verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
-                anyBoolean(), anyList(), any());
+                anyBoolean(), anyList(), anyList(), any());
 
         // Verify call the checkSatelliteEntitlementStatus with invalid response.
         setIsQueryAvailableTrue();
@@ -234,26 +236,27 @@
 
         verify(mSatelliteEntitlementApi).checkEntitlementStatus();
         // Verify call the updateSatelliteEntitlementStatus with satellite service is disabled
-        // and empty PLMNAllowed
+        // , empty PLMNAllowed and empty PLMNBarred.
         verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID),
-                eq(false), eq(new ArrayList<>()), any());
+                eq(false), eq(new ArrayList<>()), eq(new ArrayList<>()), any());
 
         // Verify call the checkSatelliteEntitlementStatus with the subscribed result.
         clearInvocationsForMock();
         setIsQueryAvailableTrue();
         doReturn(mSatelliteEntitlementResult).when(
                 mSatelliteEntitlementApi).checkEntitlementStatus();
-        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST);
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST,
+                PLMN_BARRED_LIST);
         mSatelliteEntitlementController.handleCmdStartQueryEntitlement();
 
         verify(mSatelliteEntitlementApi).checkEntitlementStatus();
-        // Verify call the updateSatelliteEntitlementStatus with satellite service is enable and
-        // availablePLMNAllowedList
+        // Verify call the updateSatelliteEntitlementStatus with satellite service is enable,
+        // availablePLMNAllowedList and availablePLMNBarredList.
         verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID), eq(true),
-                eq(PLMN_ALLOWED_LIST), any());
+                eq(PLMN_ALLOWED_LIST), eq(PLMN_BARRED_LIST), any());
 
-        // Change subId and verify call the updateSatelliteEntitlementStatus with  satellite
-        // service is enable and availablePLMNAllowedList
+        // Change subId and verify call the updateSatelliteEntitlementStatus with satellite
+        // service is enable, availablePLMNAllowedList and availablePLMNBarredList
         clearInvocationsForMock();
         doReturn(new int[]{SUB_ID_2}).when(mMockSubscriptionManagerService).getActiveSubIdList(
                 true);
@@ -261,7 +264,43 @@
 
         verify(mSatelliteEntitlementApi).checkEntitlementStatus();
         verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID_2), eq(true),
-                eq(PLMN_ALLOWED_LIST), any());
+                eq(PLMN_ALLOWED_LIST), eq(PLMN_BARRED_LIST), any());
+
+        // Verify call the updateSatelliteEntitlementStatus with satellite service is enable,
+        // availablePLMNAllowedList and empty plmn barred list.
+        clearInvocationsForMock();
+        setIsQueryAvailableTrue();
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST,
+                new ArrayList<>());
+        mSatelliteEntitlementController.handleCmdStartQueryEntitlement();
+
+        verify(mSatelliteEntitlementApi).checkEntitlementStatus();
+        verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID), eq(true),
+                eq(PLMN_ALLOWED_LIST), eq(new ArrayList<>()), any());
+
+        // Verify call the updateSatelliteEntitlementStatus with satellite service is enable,
+        // empty PLMNAllowedList and PLMNBarredList.
+        clearInvocationsForMock();
+        setIsQueryAvailableTrue();
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, new ArrayList<>(),
+                new ArrayList<>());
+        mSatelliteEntitlementController.handleCmdStartQueryEntitlement();
+
+        verify(mSatelliteEntitlementApi).checkEntitlementStatus();
+        verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID), eq(true),
+                eq(new ArrayList<>()), eq(new ArrayList<>()), any());
+
+        // Verify call the updateSatelliteEntitlementStatus with satellite service is enable,
+        // empty PLMNAllowedList and availablePLMNBarredList.
+        clearInvocationsForMock();
+        setIsQueryAvailableTrue();
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, new ArrayList<>(),
+                PLMN_BARRED_LIST);
+        mSatelliteEntitlementController.handleCmdStartQueryEntitlement();
+
+        verify(mSatelliteEntitlementApi).checkEntitlementStatus();
+        verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID), eq(true),
+                eq(new ArrayList<>()), eq(PLMN_BARRED_LIST), any());
     }
 
     @Test
@@ -277,7 +316,8 @@
         // Verify the called the checkSatelliteEntitlementStatus when Internet is connected.
         setInternetConnected(true);
         setLastQueryTime(0L);
-        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST);
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST,
+                PLMN_BARRED_LIST);
 
         networkCallback.onAvailable(mockNetwork);
         mTestableLooper.processAllMessages();
@@ -285,7 +325,7 @@
         verify(mSatelliteEntitlementApi).checkEntitlementStatus();
         // Verify call the updateSatelliteEntitlementStatus with satellite service is available.
         verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID), eq(true),
-                eq(PLMN_ALLOWED_LIST), any());
+                eq(PLMN_ALLOWED_LIST), eq(PLMN_BARRED_LIST), any());
     }
 
     @Test
@@ -294,13 +334,14 @@
         // occurred and Internet is connected.
         setInternetConnected(true);
         setLastQueryTime(0L);
-        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST);
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST,
+                PLMN_BARRED_LIST);
         triggerCarrierConfigChanged();
 
         verify(mSatelliteEntitlementApi).checkEntitlementStatus();
         // Verify call the updateSatelliteEntitlementStatus with satellite service is available.
         verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID), eq(true),
-                eq(PLMN_ALLOWED_LIST), any());
+                eq(PLMN_ALLOWED_LIST), eq(PLMN_BARRED_LIST), any());
     }
 
     private void triggerCarrierConfigChanged() {
@@ -344,9 +385,10 @@
     }
 
     private void setSatelliteEntitlementResult(int entitlementStatus,
-            List<String> plmnAllowedList) {
+            List<String> plmnAllowedList, List<String> plmnBarredList) {
         doReturn(entitlementStatus).when(mSatelliteEntitlementResult).getEntitlementStatus();
         doReturn(plmnAllowedList).when(mSatelliteEntitlementResult).getAllowedPLMNList();
+        doReturn(plmnBarredList).when(mSatelliteEntitlementResult).getBarredPLMNList();
     }
 
     private void setLastQueryTime(Long lastQueryTime) throws Exception {
diff --git a/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResponseTest.java b/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResponseTest.java
index 13d43c8..8e45a73 100644
--- a/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResponseTest.java
+++ b/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResponseTest.java
@@ -136,27 +136,55 @@
         assertTrue(response.getPlmnBarredList().size() == 2);
         assertEquals(TEST_PLMN_BARRED_LIST, response.getPlmnBarredList());
 
+        // Received the body without plmn barred key.
+        response = new SatelliteEntitlementResponse(
+                getChangedAllowedPLMNListResponse(TEST_PLMN_DATA_PLAN_TYPE_LIST.get(0).mPlmn,
+                        TEST_PLMN_DATA_PLAN_TYPE_LIST.get(1).mPlmn));
+        assertEquals(SATELLITE_ENTITLEMENT_STATUS_ENABLED, response.getEntitlementStatus());
+        assertTrue(response.getPlmnAllowed().size() == 2);
+        assertTrue(response.getPlmnBarredList().size() == 0);
+
         String plmn = "123456";
-        // Received 123456 and empty string list
+        // Received the allowed plmn list set as 123456, empty string
         response = new SatelliteEntitlementResponse(
-                getChangedPLMNListResponse(plmn, ""));
+                getChangedAllowedPLMNListResponse(plmn, ""));
         assertEquals(SATELLITE_ENTITLEMENT_STATUS_ENABLED, response.getEntitlementStatus());
         assertTrue(response.getPlmnAllowed().size() == 1);
         assertEquals(plmn, response.getPlmnAllowed().get(0).mPlmn);
 
-        // Received empty string and 123456 list
+        // Received the allowed plmn list set as 123456, empty string
         response = new SatelliteEntitlementResponse(
-                getChangedPLMNListResponse("", plmn));
+                getChangedAllowedPLMNListResponse("", plmn));
         assertEquals(SATELLITE_ENTITLEMENT_STATUS_ENABLED, response.getEntitlementStatus());
         assertTrue(response.getPlmnAllowed().size() == 1);
         assertEquals(plmn, response.getPlmnAllowed().get(0).mPlmn);
 
-        // Received all empty strings list
+        // RReceived the allowed plmn list set as empty strings
         response = new SatelliteEntitlementResponse(
-                getChangedPLMNListResponse("", ""));
+                getChangedAllowedPLMNListResponse("", ""));
         assertEquals(SATELLITE_ENTITLEMENT_STATUS_ENABLED, response.getEntitlementStatus());
         assertTrue(response.getPlmnAllowed().size() == 0);
 
+        // Received the barred plmn list set as 123456, empty string
+        response = new SatelliteEntitlementResponse(
+                getChangedBarredPLMNListResponse(plmn, ""));
+        assertEquals(SATELLITE_ENTITLEMENT_STATUS_ENABLED, response.getEntitlementStatus());
+        assertTrue(response.getPlmnBarredList().size() == 1);
+        assertEquals(plmn, response.getPlmnBarredList().get(0));
+
+        // Received the barred plmn list set as empty string, 123456
+        response = new SatelliteEntitlementResponse(
+                getChangedBarredPLMNListResponse("", plmn));
+        assertEquals(SATELLITE_ENTITLEMENT_STATUS_ENABLED, response.getEntitlementStatus());
+        assertTrue(response.getPlmnBarredList().size() == 1);
+        assertEquals(plmn, response.getPlmnBarredList().get(0));
+
+        // Received the barred plmn list set as empty strings
+        response = new SatelliteEntitlementResponse(
+                getChangedBarredPLMNListResponse("", ""));
+        assertEquals(SATELLITE_ENTITLEMENT_STATUS_ENABLED, response.getEntitlementStatus());
+        assertTrue(response.getPlmnBarredList().size() == 0);
+
         // Received null
         response = new SatelliteEntitlementResponse(null);
         assertEquals(SATELLITE_ENTITLEMENT_STATUS_DISABLED, response.getEntitlementStatus());
@@ -190,7 +218,12 @@
                 + "{\"PLMN\":\"" + secondPlmn + "\",\"DataPlanType\":\"metered\"}]";
     }
 
-    private String getChangedPLMNListResponse(String firstPlmn, String secondPlmn) {
+    private String getBarredPlmns(String firstPlmn, String secondPlmn) {
+        return ",\"PLMNBarred\":[{\"PLMN\":\"" + firstPlmn + "\"}," + "{\"PLMN\":\"" + secondPlmn
+                + "\"}]";
+    }
+
+    private String getChangedAllowedPLMNListResponse(String firstPlmn, String secondPlmn) {
         return "{\"VERS\":{\"version\":\"1\",\"validity\":\"172800\"},"
                 + "\"TOKEN\":{\"token\":\"ASH127AHHA88SF\"},\""
                 + ServiceEntitlement.APP_SATELLITE_ENTITLEMENT + "\":{"
@@ -198,4 +231,15 @@
                 + getAllowedPlmns(firstPlmn, secondPlmn)
                 + "}}";
     }
+
+    private String getChangedBarredPLMNListResponse(String firstPlmn, String secondPlmn) {
+        return "{\"VERS\":{\"version\":\"1\",\"validity\":\"172800\"},"
+                + "\"TOKEN\":{\"token\":\"ASH127AHHA88SF\"},\""
+                + ServiceEntitlement.APP_SATELLITE_ENTITLEMENT + "\":{"
+                + "\"EntitlementStatus\":\"" + SATELLITE_ENTITLEMENT_STATUS_ENABLED + "\""
+                + ",\"PLMNAllowed\":[{\"PLMN\":\"31026\",\"DataPlanType\":\"unmetered\"},"
+                + "{\"PLMN\":\"302820\",\"DataPlanType\":\"metered\"}]"
+                + getBarredPlmns(firstPlmn, secondPlmn)
+                + "}}";
+    }
 }
diff --git a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
index e87c14d..2b805c3 100644
--- a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
+++ b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
@@ -3741,6 +3741,30 @@
                         NORMAL_ROUTED_EMERGENCY_NUMBER));
     }
 
+    /**
+     * Verify where there are two sims, we choose the sim in emergency callback mode for the
+     * next emergency call.
+     */
+    @Test
+    public void testGetPhoneInEmergencyCallbackModeMultiSim() {
+        Phone mockPhone1 = Mockito.mock(Phone.class);
+        Phone mockPhone2 = Mockito.mock(Phone.class);
+
+        when(mPhoneFactoryProxy.getPhones()).thenReturn(
+                new Phone[] {mockPhone1, mockPhone2});
+
+        doReturn(false).when(mEmergencyStateTracker).isInEcm(eq(mockPhone1));
+        doReturn(true).when(mEmergencyStateTracker).isInEcm(eq(mockPhone2));
+
+        // Only applicable for AP domain seleciton service
+        assertNull(mTestConnectionService.getPhoneInEmergencyCallbackMode());
+
+        doReturn(true).when(mDomainSelectionResolver).isDomainSelectionSupported();
+
+        assertEquals(mockPhone2,
+                mTestConnectionService.getPhoneInEmergencyCallbackMode());
+    }
+
     private void setupMockEmergencyNumbers(Phone mockPhone, List<EmergencyNumber> numbers) {
         EmergencyNumberTracker emergencyNumberTracker = Mockito.mock(EmergencyNumberTracker.class);
         // Yuck.  There should really be a fake emergency number class which makes it easy to inject