Merge "Call SST#setImsRegState on ImsPhone set reg state"
diff --git a/src/java/com/android/internal/telephony/ServiceStateTracker.java b/src/java/com/android/internal/telephony/ServiceStateTracker.java
index ce72bd6..8815124 100755
--- a/src/java/com/android/internal/telephony/ServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/ServiceStateTracker.java
@@ -1318,8 +1318,10 @@
             case EVENT_IMS_STATE_DONE:
                 ar = (AsyncResult) msg.obj;
                 if (ar.exception == null) {
-                    int[] responseArray = (int[])ar.result;
-                    mImsRegistered = (responseArray[0] == 1) ? true : false;
+                    final int[] responseArray = (int[]) ar.result;
+                    final boolean imsRegistered = responseArray[0] == 1;
+                    mPhone.setImsRegistrationState(imsRegistered);
+                    mImsRegistered = imsRegistered;
                 }
                 break;
 
@@ -2970,7 +2972,7 @@
             mRadioPowerLog.log(tmpLog);
         }
 
-        if (mPhone.isPhoneTypeGsm() && mAlarmSwitch) {
+        if (mAlarmSwitch) {
             if(DBG) log("mAlarmSwitch == true");
             Context context = mPhone.getContext();
             AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
@@ -2985,7 +2987,7 @@
         } else if ((!mDesiredPowerState || mRadioDisabledByCarrier) && mCi.getRadioState()
                 == TelephonyManager.RADIO_POWER_ON) {
             // If it's on and available and we want it off gracefully
-            if (mPhone.isPhoneTypeGsm() && mPowerOffDelayNeed) {
+            if (mPowerOffDelayNeed) {
                 if (mImsRegistrationOnOff && !mAlarmSwitch) {
                     if(DBG) log("mImsRegistrationOnOff == true");
                     Context context = mPhone.getContext();
@@ -3122,15 +3124,25 @@
         sendMessage(obtainMessage(EVENT_IMS_SERVICE_STATE_CHANGED));
     }
 
-    public void setImsRegistrationState(boolean registered) {
-        log("ImsRegistrationState - registered : " + registered);
+    /**
+     * Sets the Ims registration state.  If the 3 second shut down timer has begun and the state
+     * is set to unregistered, the timer is cancelled and the radio is shutdown immediately.
+     *
+     * @param registered whether ims is registered
+     */
+    public void setImsRegistrationState(final boolean registered) {
+        log("setImsRegistrationState: {registered=" + registered
+                + " mImsRegistrationOnOff=" + mImsRegistrationOnOff
+                + " mAlarmSwitch=" + mAlarmSwitch
+                + "}");
 
         if (mImsRegistrationOnOff && !registered) {
             if (mAlarmSwitch) {
                 mImsRegistrationOnOff = registered;
 
-                Context context = mPhone.getContext();
-                AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+                final Context context = mPhone.getContext();
+                final AlarmManager am =
+                        (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
                 am.cancel(mRadioOffIntent);
                 mAlarmSwitch = false;
 
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhone.java b/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
index dca68a0..b9f4a64 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
@@ -2100,11 +2100,6 @@
                         RegistrationManager.REGISTRATION_STATE_NOT_REGISTERED);
     }
 
-    public void setImsRegistrationState(@RegistrationManager.ImsRegistrationState int value) {
-        if (DBG) logd("setImsRegistrationState: " + value);
-        mImsMmTelRegistrationHelper.updateRegistrationState(value);
-    }
-
     @Override
     public void callEndCleanupHandOverCallIfAny() {
         mCT.callEndCleanupHandOverCallIfAny();
@@ -2387,12 +2382,13 @@
         @Override
         public void handleImsRegistered(int imsRadioTech) {
             if (DBG) {
-                logd("onImsMmTelConnected imsRadioTech="
+                logd("handleImsRegistered: onImsMmTelConnected imsRadioTech="
                         + AccessNetworkConstants.transportTypeToString(imsRadioTech));
             }
-            mRegLocalLog.log("onImsMmTelConnected imsRadioTech="
+            mRegLocalLog.log("handleImsRegistered: onImsMmTelConnected imsRadioTech="
                     + AccessNetworkConstants.transportTypeToString(imsRadioTech));
             setServiceState(ServiceState.STATE_IN_SERVICE);
+            getDefaultPhone().setImsRegistrationState(true);
             mMetrics.writeOnImsConnectionState(mPhoneId, ImsConnectionState.State.CONNECTED, null);
             mImsStats.onImsRegistered(imsRadioTech);
         }
@@ -2400,12 +2396,13 @@
         @Override
         public void handleImsRegistering(int imsRadioTech) {
             if (DBG) {
-                logd("onImsMmTelProgressing imsRadioTech="
+                logd("handleImsRegistering: onImsMmTelProgressing imsRadioTech="
                         + AccessNetworkConstants.transportTypeToString(imsRadioTech));
             }
-            mRegLocalLog.log("onImsMmTelProgressing imsRadioTech="
+            mRegLocalLog.log("handleImsRegistering: onImsMmTelProgressing imsRadioTech="
                     + AccessNetworkConstants.transportTypeToString(imsRadioTech));
             setServiceState(ServiceState.STATE_OUT_OF_SERVICE);
+            getDefaultPhone().setImsRegistrationState(false);
             mMetrics.writeOnImsConnectionState(mPhoneId, ImsConnectionState.State.PROGRESSING,
                     null);
             mImsStats.onImsRegistering(imsRadioTech);
@@ -2413,10 +2410,15 @@
 
         @Override
         public void handleImsUnregistered(ImsReasonInfo imsReasonInfo) {
-            if (DBG) logd("onImsMmTelDisconnected imsReasonInfo=" + imsReasonInfo);
-            mRegLocalLog.log("onImsMmTelDisconnected imsRadioTech=" + imsReasonInfo);
+            if (DBG) {
+                logd("handleImsUnregistered: onImsMmTelDisconnected imsReasonInfo="
+                        + imsReasonInfo);
+            }
+            mRegLocalLog.log("handleImsUnregistered: onImsMmTelDisconnected imsRadioTech="
+                    + imsReasonInfo);
             setServiceState(ServiceState.STATE_OUT_OF_SERVICE);
             processDisconnectReason(imsReasonInfo);
+            getDefaultPhone().setImsRegistrationState(false);
             mMetrics.writeOnImsConnectionState(mPhoneId, ImsConnectionState.State.DISCONNECTED,
                     imsReasonInfo);
             mImsStats.onImsUnregistered(imsReasonInfo);
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsRegistrationCallbackHelper.java b/src/java/com/android/internal/telephony/imsphone/ImsRegistrationCallbackHelper.java
index 33c16e2..115f6fe 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsRegistrationCallbackHelper.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsRegistrationCallbackHelper.java
@@ -109,8 +109,9 @@
     public synchronized void updateRegistrationState(
             @RegistrationManager.ImsRegistrationState int newState) {
         synchronized (mLock) {
-            Log.d(TAG, "updateRegistrationState: registration state from " + mRegistrationState
-                    + " to " + newState);
+            Log.d(TAG, "updateRegistrationState: registration state from "
+                    + RegistrationManager.registrationStateToString(mRegistrationState)
+                    + " to " + RegistrationManager.registrationStateToString(newState));
             mRegistrationState = newState;
         }
     }
diff --git a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
index 583eb82..339e0cf 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
@@ -36,9 +36,10 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.app.IAlarmManager;
+import android.app.AlarmManager;
 import android.app.Notification;
 import android.app.NotificationManager;
+import android.app.PendingIntent;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -125,7 +126,7 @@
     @Mock
     private Handler mTestHandler;
     @Mock
-    protected IAlarmManager mAlarmManager;
+    protected AlarmManager mAlarmManager;
 
     private CellularNetworkService mCellularNetworkService;
 
@@ -231,6 +232,8 @@
         logd("ServiceStateTrackerTest +Setup!");
         super.setUp("ServiceStateTrackerTest");
 
+        doReturn(mAlarmManager).when(mContext).getSystemService(eq(Context.ALARM_SERVICE));
+
         mContextFixture.putResource(R.string.config_wwan_network_service_package,
                 "com.android.phone");
         mContextFixture.putResource(R.string.config_wlan_network_service_package,
@@ -1919,6 +1922,25 @@
 
     @Test
     @SmallTest
+    public void testSetImsRegisteredStateRunsShutdownImmediately() throws Exception {
+        doReturn(true).when(mPhone).isPhoneTypeGsm();
+        sst.setImsRegistrationState(true);
+        mSimulatedCommands.setRadioPowerFailResponse(false);
+        sst.setRadioPower(true);
+        waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());
+
+        assertEquals(TelephonyManager.RADIO_POWER_ON, mSimulatedCommands.getRadioState());
+        sst.requestShutdown();
+        waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());
+
+        sst.setImsRegistrationState(false);
+        verify(mAlarmManager).cancel(any(PendingIntent.class));
+        waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());
+        assertEquals(TelephonyManager.RADIO_POWER_UNAVAILABLE, mSimulatedCommands.getRadioState());
+    }
+
+    @Test
+    @SmallTest
     public void testSetTimeFromNITZStr() throws Exception {
         {
             // Mock sending incorrect nitz str from RIL
diff --git a/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java b/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java
index 921a78b..f9885a5 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java
@@ -668,7 +668,7 @@
     @SmallTest
     public void testImsRegistered() throws Exception {
         mImsPhoneUT.setServiceState(ServiceState.STATE_IN_SERVICE);
-        mImsPhoneUT.setImsRegistrationState(RegistrationManager.REGISTRATION_STATE_REGISTERED);
+        mImsPhoneUT.setImsRegistered(true);
         assertTrue(mImsPhoneUT.isImsRegistered());
 
         LinkedBlockingQueue<Integer> result = new LinkedBlockingQueue<>(1);
@@ -680,23 +680,9 @@
 
     @Test
     @SmallTest
-    public void testImsRegistering() throws Exception {
-        mImsPhoneUT.setServiceState(ServiceState.STATE_OUT_OF_SERVICE);
-        mImsPhoneUT.setImsRegistrationState(RegistrationManager.REGISTRATION_STATE_REGISTERING);
-        assertFalse(mImsPhoneUT.isImsRegistered());
-
-        LinkedBlockingQueue<Integer> result = new LinkedBlockingQueue<>(1);
-        mImsPhoneUT.getImsRegistrationState(result::offer);
-        Integer regResult = result.poll(1000, TimeUnit.MILLISECONDS);
-        assertNotNull(regResult);
-        assertEquals(RegistrationManager.REGISTRATION_STATE_REGISTERING, regResult.intValue());
-    }
-
-    @Test
-    @SmallTest
     public void testImsDeregistered() throws Exception {
         mImsPhoneUT.setServiceState(ServiceState.STATE_OUT_OF_SERVICE);
-        mImsPhoneUT.setImsRegistrationState(RegistrationManager.REGISTRATION_STATE_NOT_REGISTERED);
+        mImsPhoneUT.setImsRegistered(false);
         assertFalse(mImsPhoneUT.isImsRegistered());
 
         LinkedBlockingQueue<Integer> result = new LinkedBlockingQueue<>(1);