Loading src/java/com/android/internal/telephony/CarrierServiceStateTracker.java +13 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,8 @@ public class CarrierServiceStateTracker extends Handler { protected static final int CARRIER_EVENT_VOICE_DEREGISTRATION = CARRIER_EVENT_BASE + 2; protected static final int CARRIER_EVENT_DATA_REGISTRATION = CARRIER_EVENT_BASE + 3; protected static final int CARRIER_EVENT_DATA_DEREGISTRATION = CARRIER_EVENT_BASE + 4; protected static final int CARRIER_EVENT_IMS_CAPABILITIES_CHANGED = CARRIER_EVENT_BASE + 5; private static final int UNINITIALIZED_DELAY_VALUE = -1; private Phone mPhone; private ServiceStateTracker mSST; Loading Loading @@ -139,6 +141,9 @@ public class CarrierServiceStateTracker extends Handler { case CARRIER_EVENT_DATA_DEREGISTRATION: handleConfigChanges(); break; case CARRIER_EVENT_IMS_CAPABILITIES_CHANGED: handleImsCapabilitiesChanged(); break; case NOTIFICATION_EMERGENCY_NETWORK: case NOTIFICATION_PREF_NETWORK: Rlog.d(LOG_TAG, "sending notification after delay: " + msg.what); Loading Loading @@ -219,6 +224,14 @@ public class CarrierServiceStateTracker extends Handler { } } private void handleImsCapabilitiesChanged() { NotificationType notificationType = mNotificationTypeMap .get(NOTIFICATION_EMERGENCY_NETWORK); if (notificationType != null) { evaluateSendingMessageOrCancelNotification(notificationType); } } private void evaluateSendingMessageOrCancelNotification(NotificationType notificationType) { if (evaluateSendingMessage(notificationType)) { Message notificationMsg = obtainMessage(notificationType.getTypeId(), null); Loading src/java/com/android/internal/telephony/ServiceStateTracker.java +23 −0 Original line number Diff line number Diff line Loading @@ -164,6 +164,7 @@ public class ServiceStateTracker extends Handler { private RegistrantList mNetworkDetachedRegistrants = new RegistrantList(); private RegistrantList mPsRestrictEnabledRegistrants = new RegistrantList(); private RegistrantList mPsRestrictDisabledRegistrants = new RegistrantList(); private RegistrantList mImsCapabilityChangedRegistrants = new RegistrantList(); /* Radio power off pending flag and tag counter */ private boolean mPendingRadioPowerOffAfterDataOff = false; Loading Loading @@ -565,6 +566,8 @@ public class ServiceStateTracker extends Handler { CarrierServiceStateTracker.CARRIER_EVENT_DATA_REGISTRATION, null); registerForDataConnectionDetached(mCSST, CarrierServiceStateTracker.CARRIER_EVENT_DATA_DEREGISTRATION, null); registerForImsCapabilityChanged(mCSST, CarrierServiceStateTracker.CARRIER_EVENT_IMS_CAPABILITIES_CHANGED, null); } @VisibleForTesting Loading Loading @@ -1303,6 +1306,7 @@ public class ServiceStateTracker extends Handler { case EVENT_IMS_CAPABILITY_CHANGED: if (DBG) log("EVENT_IMS_CAPABILITY_CHANGED"); updateSpnDisplay(); mImsCapabilityChangedRegistrants.notifyRegistrants(); break; case EVENT_IMS_SERVICE_STATE_CHANGED: Loading Loading @@ -3942,6 +3946,25 @@ public class ServiceStateTracker extends Handler { mPsRestrictDisabledRegistrants.remove(h); } /** * Registers for IMS capability changed. * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj */ public void registerForImsCapabilityChanged(Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mImsCapabilityChangedRegistrants.add(r); } /** * Unregisters for IMS capability changed. * @param h handler to notify */ public void unregisterForImsCapabilityChanged(Handler h) { mImsCapabilityChangedRegistrants.remove(h); } /** * Clean up existing voice and data connection then turn off radio power. * Loading tests/telephonytests/src/com/android/internal/telephony/CarrierServiceStateTrackerTest.java +37 −0 Original line number Diff line number Diff line Loading @@ -198,4 +198,41 @@ public class CarrierServiceStateTrackerTest extends TelephonyTest { verify(mNotificationManager, atLeast(1)).cancel( CarrierServiceStateTracker.NOTIFICATION_PREF_NETWORK); } @Test @SmallTest public void testSendEmergencyNetworkNotification() { logd(LOG_TAG + ":testSendEmergencyNetworkNotification()"); Intent intent = new Intent().setAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); mContext.sendBroadcast(intent); waitForMs(300); Map<Integer, CarrierServiceStateTracker.NotificationType> notificationTypeMap = mCarrierSST.getNotificationTypeMap(); CarrierServiceStateTracker.NotificationType emergencyNetworkNotification = notificationTypeMap.get(CarrierServiceStateTracker.NOTIFICATION_EMERGENCY_NETWORK); CarrierServiceStateTracker.NotificationType spyEmergencyNetworkNotification = spy( emergencyNetworkNotification); notificationTypeMap.put(CarrierServiceStateTracker.NOTIFICATION_EMERGENCY_NETWORK, spyEmergencyNetworkNotification); Notification.Builder mNotificationBuilder = new Notification.Builder(mContext); doReturn(ServiceState.STATE_OUT_OF_SERVICE).when(mSST.mSS).getVoiceRegState(); doReturn(mNotificationBuilder).when(spyEmergencyNetworkNotification) .getNotificationBuilder(); doReturn(true).when(mPhone).isWifiCallingEnabled(); Message notificationMsg = mSpyCarrierSST.obtainMessage( CarrierServiceStateTracker.CARRIER_EVENT_IMS_CAPABILITIES_CHANGED, null); mSpyCarrierSST.handleMessage(notificationMsg); waitForHandlerAction(mSpyCarrierSST, TEST_TIMEOUT); verify(mNotificationManager).notify( eq(CarrierServiceStateTracker.NOTIFICATION_EMERGENCY_NETWORK), isA(Notification.class)); doReturn(false).when(mPhone).isWifiCallingEnabled(); mSpyCarrierSST.handleMessage(notificationMsg); waitForHandlerAction(mSpyCarrierSST, TEST_TIMEOUT); verify(mNotificationManager, atLeast(2)).cancel( CarrierServiceStateTracker.NOTIFICATION_EMERGENCY_NETWORK); } } Loading
src/java/com/android/internal/telephony/CarrierServiceStateTracker.java +13 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,8 @@ public class CarrierServiceStateTracker extends Handler { protected static final int CARRIER_EVENT_VOICE_DEREGISTRATION = CARRIER_EVENT_BASE + 2; protected static final int CARRIER_EVENT_DATA_REGISTRATION = CARRIER_EVENT_BASE + 3; protected static final int CARRIER_EVENT_DATA_DEREGISTRATION = CARRIER_EVENT_BASE + 4; protected static final int CARRIER_EVENT_IMS_CAPABILITIES_CHANGED = CARRIER_EVENT_BASE + 5; private static final int UNINITIALIZED_DELAY_VALUE = -1; private Phone mPhone; private ServiceStateTracker mSST; Loading Loading @@ -139,6 +141,9 @@ public class CarrierServiceStateTracker extends Handler { case CARRIER_EVENT_DATA_DEREGISTRATION: handleConfigChanges(); break; case CARRIER_EVENT_IMS_CAPABILITIES_CHANGED: handleImsCapabilitiesChanged(); break; case NOTIFICATION_EMERGENCY_NETWORK: case NOTIFICATION_PREF_NETWORK: Rlog.d(LOG_TAG, "sending notification after delay: " + msg.what); Loading Loading @@ -219,6 +224,14 @@ public class CarrierServiceStateTracker extends Handler { } } private void handleImsCapabilitiesChanged() { NotificationType notificationType = mNotificationTypeMap .get(NOTIFICATION_EMERGENCY_NETWORK); if (notificationType != null) { evaluateSendingMessageOrCancelNotification(notificationType); } } private void evaluateSendingMessageOrCancelNotification(NotificationType notificationType) { if (evaluateSendingMessage(notificationType)) { Message notificationMsg = obtainMessage(notificationType.getTypeId(), null); Loading
src/java/com/android/internal/telephony/ServiceStateTracker.java +23 −0 Original line number Diff line number Diff line Loading @@ -164,6 +164,7 @@ public class ServiceStateTracker extends Handler { private RegistrantList mNetworkDetachedRegistrants = new RegistrantList(); private RegistrantList mPsRestrictEnabledRegistrants = new RegistrantList(); private RegistrantList mPsRestrictDisabledRegistrants = new RegistrantList(); private RegistrantList mImsCapabilityChangedRegistrants = new RegistrantList(); /* Radio power off pending flag and tag counter */ private boolean mPendingRadioPowerOffAfterDataOff = false; Loading Loading @@ -565,6 +566,8 @@ public class ServiceStateTracker extends Handler { CarrierServiceStateTracker.CARRIER_EVENT_DATA_REGISTRATION, null); registerForDataConnectionDetached(mCSST, CarrierServiceStateTracker.CARRIER_EVENT_DATA_DEREGISTRATION, null); registerForImsCapabilityChanged(mCSST, CarrierServiceStateTracker.CARRIER_EVENT_IMS_CAPABILITIES_CHANGED, null); } @VisibleForTesting Loading Loading @@ -1303,6 +1306,7 @@ public class ServiceStateTracker extends Handler { case EVENT_IMS_CAPABILITY_CHANGED: if (DBG) log("EVENT_IMS_CAPABILITY_CHANGED"); updateSpnDisplay(); mImsCapabilityChangedRegistrants.notifyRegistrants(); break; case EVENT_IMS_SERVICE_STATE_CHANGED: Loading Loading @@ -3942,6 +3946,25 @@ public class ServiceStateTracker extends Handler { mPsRestrictDisabledRegistrants.remove(h); } /** * Registers for IMS capability changed. * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj */ public void registerForImsCapabilityChanged(Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mImsCapabilityChangedRegistrants.add(r); } /** * Unregisters for IMS capability changed. * @param h handler to notify */ public void unregisterForImsCapabilityChanged(Handler h) { mImsCapabilityChangedRegistrants.remove(h); } /** * Clean up existing voice and data connection then turn off radio power. * Loading
tests/telephonytests/src/com/android/internal/telephony/CarrierServiceStateTrackerTest.java +37 −0 Original line number Diff line number Diff line Loading @@ -198,4 +198,41 @@ public class CarrierServiceStateTrackerTest extends TelephonyTest { verify(mNotificationManager, atLeast(1)).cancel( CarrierServiceStateTracker.NOTIFICATION_PREF_NETWORK); } @Test @SmallTest public void testSendEmergencyNetworkNotification() { logd(LOG_TAG + ":testSendEmergencyNetworkNotification()"); Intent intent = new Intent().setAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); mContext.sendBroadcast(intent); waitForMs(300); Map<Integer, CarrierServiceStateTracker.NotificationType> notificationTypeMap = mCarrierSST.getNotificationTypeMap(); CarrierServiceStateTracker.NotificationType emergencyNetworkNotification = notificationTypeMap.get(CarrierServiceStateTracker.NOTIFICATION_EMERGENCY_NETWORK); CarrierServiceStateTracker.NotificationType spyEmergencyNetworkNotification = spy( emergencyNetworkNotification); notificationTypeMap.put(CarrierServiceStateTracker.NOTIFICATION_EMERGENCY_NETWORK, spyEmergencyNetworkNotification); Notification.Builder mNotificationBuilder = new Notification.Builder(mContext); doReturn(ServiceState.STATE_OUT_OF_SERVICE).when(mSST.mSS).getVoiceRegState(); doReturn(mNotificationBuilder).when(spyEmergencyNetworkNotification) .getNotificationBuilder(); doReturn(true).when(mPhone).isWifiCallingEnabled(); Message notificationMsg = mSpyCarrierSST.obtainMessage( CarrierServiceStateTracker.CARRIER_EVENT_IMS_CAPABILITIES_CHANGED, null); mSpyCarrierSST.handleMessage(notificationMsg); waitForHandlerAction(mSpyCarrierSST, TEST_TIMEOUT); verify(mNotificationManager).notify( eq(CarrierServiceStateTracker.NOTIFICATION_EMERGENCY_NETWORK), isA(Notification.class)); doReturn(false).when(mPhone).isWifiCallingEnabled(); mSpyCarrierSST.handleMessage(notificationMsg); waitForHandlerAction(mSpyCarrierSST, TEST_TIMEOUT); verify(mNotificationManager, atLeast(2)).cancel( CarrierServiceStateTracker.NOTIFICATION_EMERGENCY_NETWORK); } }