Merge "Add exception handling for radio power off during emergency call" into main
diff --git a/src/java/com/android/internal/telephony/emergency/EmergencyStateTracker.java b/src/java/com/android/internal/telephony/emergency/EmergencyStateTracker.java
index b3e8095..957b427 100644
--- a/src/java/com/android/internal/telephony/emergency/EmergencyStateTracker.java
+++ b/src/java/com/android/internal/telephony/emergency/EmergencyStateTracker.java
@@ -1251,9 +1251,14 @@
             exitEmergencyMode(gsmCdmaPhone, EMERGENCY_TYPE_CALL);
         }
 
-        mEmergencyCallDomain = NetworkRegistrationInfo.DOMAIN_UNKNOWN;
-        mIsTestEmergencyNumber = false;
-        mPhone = null;
+        // If an emergency call is in progress, even if this method is called for any reason,
+        // we should not initialize the Phone object so that the application can normally end
+        // the emergency call.
+        if (mOngoingConnection == null) {
+            mEmergencyCallDomain = NetworkRegistrationInfo.DOMAIN_UNKNOWN;
+            mIsTestEmergencyNumber = false;
+            mPhone = null;
+        }
     }
 
     private void releaseWakeLock() {
diff --git a/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyStateTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyStateTrackerTest.java
index 9253fbf..fe586f9 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyStateTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyStateTrackerTest.java
@@ -1115,6 +1115,32 @@
 
     @Test
     @SmallTest
+    public void testEndCallAfterExitEmergencyCallbackModeIsCalledInNonEcbm() throws Exception {
+        // Setup EmergencyStateTracker
+        EmergencyStateTracker emergencyStateTracker = setupEmergencyStateTracker(
+                /* isSuplDdsSwitchRequiredForEmergencyCall= */ true);
+        // Create test Phone
+        GsmCdmaPhone testPhone = (GsmCdmaPhone) setupTestPhoneForEmergencyCall(
+                /* isRoaming= */ true, /* isRadioOn= */ true);
+        setUpAsyncResultForSetEmergencyMode(testPhone, E_REG_RESULT);
+        setUpAsyncResultForExitEmergencyMode(testPhone);
+        // Start emergency call then enter ECM
+        CompletableFuture<Integer> unused = emergencyStateTracker.startEmergencyCall(testPhone,
+                mTestConnection1, false);
+        processAllMessages();
+
+        // Exit emergency mode explicitly
+        emergencyStateTracker.exitEmergencyCallbackMode();
+
+        emergencyStateTracker.endCall(mTestConnection1);
+        processAllMessages();
+
+        // Verify exitEmergencyMode() is called.
+        verify(testPhone).exitEmergencyMode(any(Message.class));
+    }
+
+    @Test
+    @SmallTest
     public void testRecoverNormalInCellularWhenVoWiFiConnected() {
         EmergencyStateTracker emergencyStateTracker = setupEmergencyStateTracker(
                 /* isSuplDdsSwitchRequiredForEmergencyCall= */ true);