Loading src/java/com/android/internal/telephony/ServiceStateTracker.java +49 −14 Original line number Diff line number Diff line Loading @@ -246,7 +246,9 @@ public class ServiceStateTracker extends Handler { private String mCurPlmn = null; private boolean mCurShowPlmn = false; private boolean mCurShowSpn = false; private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; @VisibleForTesting public int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private int mPrevSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private boolean mImsRegistered = false; Loading Loading @@ -3488,6 +3490,12 @@ public class ServiceStateTracker extends Handler { public void setNotification(int notifyType) { if (DBG) log("setNotification: create notification " + notifyType); if (!SubscriptionManager.isValidSubscriptionId(mSubId)) { // notifications are posted per-sub-id, so return if current sub-id is invalid loge("cannot setNotification on invalid subid mSubId=" + mSubId); return; } // Needed because sprout RIL sends these when they shouldn't? boolean isSetNotification = mPhone.getContext().getResources().getBoolean( com.android.internal.R.bool.config_user_notification_of_restrictied_mobile_access); Loading Loading @@ -3519,6 +3527,10 @@ public class ServiceStateTracker extends Handler { int notificationId = CS_NOTIFICATION; int icon = com.android.internal.R.drawable.stat_sys_warning; final boolean multipleSubscriptions = (((TelephonyManager) mPhone.getContext() .getSystemService(Context.TELEPHONY_SERVICE)).getPhoneCount() > 1); final int simNumber = mSubscriptionController.getSlotIndex(mSubId) + 1; switch (notifyType) { case PS_ENABLED: long dataSubId = SubscriptionManager.getDefaultDataSubscriptionId(); Loading @@ -3527,37 +3539,52 @@ public class ServiceStateTracker extends Handler { } notificationId = PS_NOTIFICATION; title = context.getText(com.android.internal.R.string.RestrictedOnDataTitle); details = context.getText(com.android.internal.R.string.RestrictedStateContent); details = multipleSubscriptions ? context.getString( com.android.internal.R.string.RestrictedStateContentMsimTemplate, simNumber) : context.getText(com.android.internal.R.string.RestrictedStateContent); break; case PS_DISABLED: notificationId = PS_NOTIFICATION; break; case CS_ENABLED: title = context.getText(com.android.internal.R.string.RestrictedOnAllVoiceTitle); details = context.getText( com.android.internal.R.string.RestrictedStateContent); details = multipleSubscriptions ? context.getString( com.android.internal.R.string.RestrictedStateContentMsimTemplate, simNumber) : context.getText(com.android.internal.R.string.RestrictedStateContent); break; case CS_NORMAL_ENABLED: title = context.getText(com.android.internal.R.string.RestrictedOnNormalTitle); details = context.getText(com.android.internal.R.string.RestrictedStateContent); details = multipleSubscriptions ? context.getString( com.android.internal.R.string.RestrictedStateContentMsimTemplate, simNumber) : context.getText(com.android.internal.R.string.RestrictedStateContent); break; case CS_EMERGENCY_ENABLED: title = context.getText(com.android.internal.R.string.RestrictedOnEmergencyTitle); details = context.getText( com.android.internal.R.string.RestrictedStateContent); details = multipleSubscriptions ? context.getString( com.android.internal.R.string.RestrictedStateContentMsimTemplate, simNumber) : context.getText(com.android.internal.R.string.RestrictedStateContent); break; case CS_DISABLED: // do nothing and cancel the notification later break; case CS_REJECT_CAUSE_ENABLED: notificationId = CS_REJECT_CAUSE_NOTIFICATION; int resId = selectResourceForRejectCode(mRejectCode); int resId = selectResourceForRejectCode(mRejectCode, multipleSubscriptions); if (0 == resId) { loge("setNotification: mRejectCode=" + mRejectCode + " is not handled."); return; } else { icon = com.android.internal.R.drawable.stat_notify_mmcc_indication_icn; title = Resources.getSystem().getString(resId); // if using the single SIM resource, mSubId will be ignored title = context.getString(resId, mSubId); details = null; } break; Loading Loading @@ -3614,20 +3641,28 @@ public class ServiceStateTracker extends Handler { * * @param rejCode should be compatible with TS 24.008. */ private int selectResourceForRejectCode(int rejCode) { private int selectResourceForRejectCode(int rejCode, boolean multipleSubscriptions) { int rejResourceId = 0; switch (rejCode) { case 1:// Authentication reject rejResourceId = com.android.internal.R.string.mmcc_authentication_reject; rejResourceId = multipleSubscriptions ? com.android.internal.R.string.mmcc_authentication_reject_msim_template : com.android.internal.R.string.mmcc_authentication_reject; break; case 2:// IMSI unknown in HLR rejResourceId = com.android.internal.R.string.mmcc_imsi_unknown_in_hlr; rejResourceId = multipleSubscriptions ? com.android.internal.R.string.mmcc_imsi_unknown_in_hlr_msim_template : com.android.internal.R.string.mmcc_imsi_unknown_in_hlr; break; case 3:// Illegal MS rejResourceId = com.android.internal.R.string.mmcc_illegal_ms; rejResourceId = multipleSubscriptions ? com.android.internal.R.string.mmcc_illegal_ms_msim_template : com.android.internal.R.string.mmcc_illegal_ms; break; case 6:// Illegal ME rejResourceId = com.android.internal.R.string.mmcc_illegal_me; rejResourceId = multipleSubscriptions ? com.android.internal.R.string.mmcc_illegal_me_msim_template : com.android.internal.R.string.mmcc_illegal_me; break; default: // The other codes are not defined or not required by operators till now. Loading tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java +5 −0 Original line number Diff line number Diff line Loading @@ -287,6 +287,11 @@ public class ContextFixture implements TestFixture<Context> { return mContentResolver; } @Override public Resources.Theme getTheme() { return null; } @Override public void unregisterReceiver(BroadcastReceiver receiver) { } Loading tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +128 −0 Original line number Diff line number Diff line Loading @@ -25,19 +25,26 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.nullable; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.IAlarmManager; import android.app.Notification; import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.ServiceInfo; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.AsyncResult; import android.os.Bundle; import android.os.Handler; Loading Loading @@ -1203,6 +1210,127 @@ public class ServiceStateTrackerTest extends TelephonyTest { assertEquals(intArgumentCaptor.getValue().intValue(), restrictedState[1]); } private boolean notificationHasTitleSet(Notification n) { // Notification has no methods to check the actual title, but #toString() includes the // word "tick" if the title is set so we check this as a workaround return n.toString().contains("tick"); } private String getNotificationTitle(Notification n) { return n.extras.getString(Notification.EXTRA_TITLE); } @Test @SmallTest public void testSetPsNotifications() { sst.mSubId = 1; final NotificationManager nm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); mContextFixture.putBooleanResource( R.bool.config_user_notification_of_restrictied_mobile_access, true); doReturn(new ApplicationInfo()).when(mContext).getApplicationInfo(); Drawable mockDrawable = mock(Drawable.class); Resources mockResources = mContext.getResources(); when(mockResources.getDrawable(anyInt(), any())).thenReturn(mockDrawable); mContextFixture.putResource(com.android.internal.R.string.RestrictedOnDataTitle, "test1"); sst.setNotification(ServiceStateTracker.PS_ENABLED); ArgumentCaptor<Notification> notificationArgumentCaptor = ArgumentCaptor.forClass(Notification.class); verify(nm).notify(anyString(), anyInt(), notificationArgumentCaptor.capture()); // if the postedNotification has title set then it must have been the correct notification Notification postedNotification = notificationArgumentCaptor.getValue(); assertTrue(notificationHasTitleSet(postedNotification)); assertEquals("test1", getNotificationTitle(postedNotification)); sst.setNotification(ServiceStateTracker.PS_DISABLED); verify(nm).cancel(anyString(), anyInt()); } @Test @SmallTest public void testSetCsNotifications() { sst.mSubId = 1; final NotificationManager nm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); mContextFixture.putBooleanResource( R.bool.config_user_notification_of_restrictied_mobile_access, true); doReturn(new ApplicationInfo()).when(mContext).getApplicationInfo(); Drawable mockDrawable = mock(Drawable.class); Resources mockResources = mContext.getResources(); when(mockResources.getDrawable(anyInt(), any())).thenReturn(mockDrawable); mContextFixture.putResource(com.android.internal.R.string.RestrictedOnAllVoiceTitle, "test2"); sst.setNotification(ServiceStateTracker.CS_ENABLED); ArgumentCaptor<Notification> notificationArgumentCaptor = ArgumentCaptor.forClass(Notification.class); verify(nm).notify(anyString(), anyInt(), notificationArgumentCaptor.capture()); // if the postedNotification has title set then it must have been the correct notification Notification postedNotification = notificationArgumentCaptor.getValue(); assertTrue(notificationHasTitleSet(postedNotification)); assertEquals("test2", getNotificationTitle(postedNotification)); sst.setNotification(ServiceStateTracker.CS_DISABLED); verify(nm).cancel(anyString(), anyInt()); } @Test @SmallTest public void testSetCsNormalNotifications() { sst.mSubId = 1; final NotificationManager nm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); mContextFixture.putBooleanResource( R.bool.config_user_notification_of_restrictied_mobile_access, true); doReturn(new ApplicationInfo()).when(mContext).getApplicationInfo(); Drawable mockDrawable = mock(Drawable.class); Resources mockResources = mContext.getResources(); when(mockResources.getDrawable(anyInt(), any())).thenReturn(mockDrawable); mContextFixture.putResource(com.android.internal.R.string.RestrictedOnNormalTitle, "test3"); sst.setNotification(ServiceStateTracker.CS_NORMAL_ENABLED); ArgumentCaptor<Notification> notificationArgumentCaptor = ArgumentCaptor.forClass(Notification.class); verify(nm).notify(anyString(), anyInt(), notificationArgumentCaptor.capture()); // if the postedNotification has title set then it must have been the correct notification Notification postedNotification = notificationArgumentCaptor.getValue(); assertTrue(notificationHasTitleSet(postedNotification)); assertEquals("test3", getNotificationTitle(postedNotification)); sst.setNotification(ServiceStateTracker.CS_DISABLED); verify(nm).cancel(anyString(), anyInt()); } @Test @SmallTest public void testSetCsEmergencyNotifications() { sst.mSubId = 1; final NotificationManager nm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); mContextFixture.putBooleanResource( R.bool.config_user_notification_of_restrictied_mobile_access, true); doReturn(new ApplicationInfo()).when(mContext).getApplicationInfo(); Drawable mockDrawable = mock(Drawable.class); Resources mockResources = mContext.getResources(); when(mockResources.getDrawable(anyInt(), any())).thenReturn(mockDrawable); mContextFixture.putResource(com.android.internal.R.string.RestrictedOnEmergencyTitle, "test4"); sst.setNotification(ServiceStateTracker.CS_EMERGENCY_ENABLED); ArgumentCaptor<Notification> notificationArgumentCaptor = ArgumentCaptor.forClass(Notification.class); verify(nm).notify(anyString(), anyInt(), notificationArgumentCaptor.capture()); // if the postedNotification has title set then it must have been the correct notification Notification postedNotification = notificationArgumentCaptor.getValue(); assertTrue(notificationHasTitleSet(postedNotification)); assertEquals("test4", getNotificationTitle(postedNotification)); sst.setNotification(ServiceStateTracker.CS_DISABLED); verify(nm).cancel(anyString(), anyInt()); sst.setNotification(ServiceStateTracker.CS_REJECT_CAUSE_ENABLED); } @Test @MediumTest public void testRegisterForSubscriptionInfoReady() { Loading Loading
src/java/com/android/internal/telephony/ServiceStateTracker.java +49 −14 Original line number Diff line number Diff line Loading @@ -246,7 +246,9 @@ public class ServiceStateTracker extends Handler { private String mCurPlmn = null; private boolean mCurShowPlmn = false; private boolean mCurShowSpn = false; private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; @VisibleForTesting public int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private int mPrevSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private boolean mImsRegistered = false; Loading Loading @@ -3488,6 +3490,12 @@ public class ServiceStateTracker extends Handler { public void setNotification(int notifyType) { if (DBG) log("setNotification: create notification " + notifyType); if (!SubscriptionManager.isValidSubscriptionId(mSubId)) { // notifications are posted per-sub-id, so return if current sub-id is invalid loge("cannot setNotification on invalid subid mSubId=" + mSubId); return; } // Needed because sprout RIL sends these when they shouldn't? boolean isSetNotification = mPhone.getContext().getResources().getBoolean( com.android.internal.R.bool.config_user_notification_of_restrictied_mobile_access); Loading Loading @@ -3519,6 +3527,10 @@ public class ServiceStateTracker extends Handler { int notificationId = CS_NOTIFICATION; int icon = com.android.internal.R.drawable.stat_sys_warning; final boolean multipleSubscriptions = (((TelephonyManager) mPhone.getContext() .getSystemService(Context.TELEPHONY_SERVICE)).getPhoneCount() > 1); final int simNumber = mSubscriptionController.getSlotIndex(mSubId) + 1; switch (notifyType) { case PS_ENABLED: long dataSubId = SubscriptionManager.getDefaultDataSubscriptionId(); Loading @@ -3527,37 +3539,52 @@ public class ServiceStateTracker extends Handler { } notificationId = PS_NOTIFICATION; title = context.getText(com.android.internal.R.string.RestrictedOnDataTitle); details = context.getText(com.android.internal.R.string.RestrictedStateContent); details = multipleSubscriptions ? context.getString( com.android.internal.R.string.RestrictedStateContentMsimTemplate, simNumber) : context.getText(com.android.internal.R.string.RestrictedStateContent); break; case PS_DISABLED: notificationId = PS_NOTIFICATION; break; case CS_ENABLED: title = context.getText(com.android.internal.R.string.RestrictedOnAllVoiceTitle); details = context.getText( com.android.internal.R.string.RestrictedStateContent); details = multipleSubscriptions ? context.getString( com.android.internal.R.string.RestrictedStateContentMsimTemplate, simNumber) : context.getText(com.android.internal.R.string.RestrictedStateContent); break; case CS_NORMAL_ENABLED: title = context.getText(com.android.internal.R.string.RestrictedOnNormalTitle); details = context.getText(com.android.internal.R.string.RestrictedStateContent); details = multipleSubscriptions ? context.getString( com.android.internal.R.string.RestrictedStateContentMsimTemplate, simNumber) : context.getText(com.android.internal.R.string.RestrictedStateContent); break; case CS_EMERGENCY_ENABLED: title = context.getText(com.android.internal.R.string.RestrictedOnEmergencyTitle); details = context.getText( com.android.internal.R.string.RestrictedStateContent); details = multipleSubscriptions ? context.getString( com.android.internal.R.string.RestrictedStateContentMsimTemplate, simNumber) : context.getText(com.android.internal.R.string.RestrictedStateContent); break; case CS_DISABLED: // do nothing and cancel the notification later break; case CS_REJECT_CAUSE_ENABLED: notificationId = CS_REJECT_CAUSE_NOTIFICATION; int resId = selectResourceForRejectCode(mRejectCode); int resId = selectResourceForRejectCode(mRejectCode, multipleSubscriptions); if (0 == resId) { loge("setNotification: mRejectCode=" + mRejectCode + " is not handled."); return; } else { icon = com.android.internal.R.drawable.stat_notify_mmcc_indication_icn; title = Resources.getSystem().getString(resId); // if using the single SIM resource, mSubId will be ignored title = context.getString(resId, mSubId); details = null; } break; Loading Loading @@ -3614,20 +3641,28 @@ public class ServiceStateTracker extends Handler { * * @param rejCode should be compatible with TS 24.008. */ private int selectResourceForRejectCode(int rejCode) { private int selectResourceForRejectCode(int rejCode, boolean multipleSubscriptions) { int rejResourceId = 0; switch (rejCode) { case 1:// Authentication reject rejResourceId = com.android.internal.R.string.mmcc_authentication_reject; rejResourceId = multipleSubscriptions ? com.android.internal.R.string.mmcc_authentication_reject_msim_template : com.android.internal.R.string.mmcc_authentication_reject; break; case 2:// IMSI unknown in HLR rejResourceId = com.android.internal.R.string.mmcc_imsi_unknown_in_hlr; rejResourceId = multipleSubscriptions ? com.android.internal.R.string.mmcc_imsi_unknown_in_hlr_msim_template : com.android.internal.R.string.mmcc_imsi_unknown_in_hlr; break; case 3:// Illegal MS rejResourceId = com.android.internal.R.string.mmcc_illegal_ms; rejResourceId = multipleSubscriptions ? com.android.internal.R.string.mmcc_illegal_ms_msim_template : com.android.internal.R.string.mmcc_illegal_ms; break; case 6:// Illegal ME rejResourceId = com.android.internal.R.string.mmcc_illegal_me; rejResourceId = multipleSubscriptions ? com.android.internal.R.string.mmcc_illegal_me_msim_template : com.android.internal.R.string.mmcc_illegal_me; break; default: // The other codes are not defined or not required by operators till now. Loading
tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java +5 −0 Original line number Diff line number Diff line Loading @@ -287,6 +287,11 @@ public class ContextFixture implements TestFixture<Context> { return mContentResolver; } @Override public Resources.Theme getTheme() { return null; } @Override public void unregisterReceiver(BroadcastReceiver receiver) { } Loading
tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +128 −0 Original line number Diff line number Diff line Loading @@ -25,19 +25,26 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.nullable; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.IAlarmManager; import android.app.Notification; import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.ServiceInfo; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.AsyncResult; import android.os.Bundle; import android.os.Handler; Loading Loading @@ -1203,6 +1210,127 @@ public class ServiceStateTrackerTest extends TelephonyTest { assertEquals(intArgumentCaptor.getValue().intValue(), restrictedState[1]); } private boolean notificationHasTitleSet(Notification n) { // Notification has no methods to check the actual title, but #toString() includes the // word "tick" if the title is set so we check this as a workaround return n.toString().contains("tick"); } private String getNotificationTitle(Notification n) { return n.extras.getString(Notification.EXTRA_TITLE); } @Test @SmallTest public void testSetPsNotifications() { sst.mSubId = 1; final NotificationManager nm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); mContextFixture.putBooleanResource( R.bool.config_user_notification_of_restrictied_mobile_access, true); doReturn(new ApplicationInfo()).when(mContext).getApplicationInfo(); Drawable mockDrawable = mock(Drawable.class); Resources mockResources = mContext.getResources(); when(mockResources.getDrawable(anyInt(), any())).thenReturn(mockDrawable); mContextFixture.putResource(com.android.internal.R.string.RestrictedOnDataTitle, "test1"); sst.setNotification(ServiceStateTracker.PS_ENABLED); ArgumentCaptor<Notification> notificationArgumentCaptor = ArgumentCaptor.forClass(Notification.class); verify(nm).notify(anyString(), anyInt(), notificationArgumentCaptor.capture()); // if the postedNotification has title set then it must have been the correct notification Notification postedNotification = notificationArgumentCaptor.getValue(); assertTrue(notificationHasTitleSet(postedNotification)); assertEquals("test1", getNotificationTitle(postedNotification)); sst.setNotification(ServiceStateTracker.PS_DISABLED); verify(nm).cancel(anyString(), anyInt()); } @Test @SmallTest public void testSetCsNotifications() { sst.mSubId = 1; final NotificationManager nm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); mContextFixture.putBooleanResource( R.bool.config_user_notification_of_restrictied_mobile_access, true); doReturn(new ApplicationInfo()).when(mContext).getApplicationInfo(); Drawable mockDrawable = mock(Drawable.class); Resources mockResources = mContext.getResources(); when(mockResources.getDrawable(anyInt(), any())).thenReturn(mockDrawable); mContextFixture.putResource(com.android.internal.R.string.RestrictedOnAllVoiceTitle, "test2"); sst.setNotification(ServiceStateTracker.CS_ENABLED); ArgumentCaptor<Notification> notificationArgumentCaptor = ArgumentCaptor.forClass(Notification.class); verify(nm).notify(anyString(), anyInt(), notificationArgumentCaptor.capture()); // if the postedNotification has title set then it must have been the correct notification Notification postedNotification = notificationArgumentCaptor.getValue(); assertTrue(notificationHasTitleSet(postedNotification)); assertEquals("test2", getNotificationTitle(postedNotification)); sst.setNotification(ServiceStateTracker.CS_DISABLED); verify(nm).cancel(anyString(), anyInt()); } @Test @SmallTest public void testSetCsNormalNotifications() { sst.mSubId = 1; final NotificationManager nm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); mContextFixture.putBooleanResource( R.bool.config_user_notification_of_restrictied_mobile_access, true); doReturn(new ApplicationInfo()).when(mContext).getApplicationInfo(); Drawable mockDrawable = mock(Drawable.class); Resources mockResources = mContext.getResources(); when(mockResources.getDrawable(anyInt(), any())).thenReturn(mockDrawable); mContextFixture.putResource(com.android.internal.R.string.RestrictedOnNormalTitle, "test3"); sst.setNotification(ServiceStateTracker.CS_NORMAL_ENABLED); ArgumentCaptor<Notification> notificationArgumentCaptor = ArgumentCaptor.forClass(Notification.class); verify(nm).notify(anyString(), anyInt(), notificationArgumentCaptor.capture()); // if the postedNotification has title set then it must have been the correct notification Notification postedNotification = notificationArgumentCaptor.getValue(); assertTrue(notificationHasTitleSet(postedNotification)); assertEquals("test3", getNotificationTitle(postedNotification)); sst.setNotification(ServiceStateTracker.CS_DISABLED); verify(nm).cancel(anyString(), anyInt()); } @Test @SmallTest public void testSetCsEmergencyNotifications() { sst.mSubId = 1; final NotificationManager nm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); mContextFixture.putBooleanResource( R.bool.config_user_notification_of_restrictied_mobile_access, true); doReturn(new ApplicationInfo()).when(mContext).getApplicationInfo(); Drawable mockDrawable = mock(Drawable.class); Resources mockResources = mContext.getResources(); when(mockResources.getDrawable(anyInt(), any())).thenReturn(mockDrawable); mContextFixture.putResource(com.android.internal.R.string.RestrictedOnEmergencyTitle, "test4"); sst.setNotification(ServiceStateTracker.CS_EMERGENCY_ENABLED); ArgumentCaptor<Notification> notificationArgumentCaptor = ArgumentCaptor.forClass(Notification.class); verify(nm).notify(anyString(), anyInt(), notificationArgumentCaptor.capture()); // if the postedNotification has title set then it must have been the correct notification Notification postedNotification = notificationArgumentCaptor.getValue(); assertTrue(notificationHasTitleSet(postedNotification)); assertEquals("test4", getNotificationTitle(postedNotification)); sst.setNotification(ServiceStateTracker.CS_DISABLED); verify(nm).cancel(anyString(), anyInt()); sst.setNotification(ServiceStateTracker.CS_REJECT_CAUSE_ENABLED); } @Test @MediumTest public void testRegisterForSubscriptionInfoReady() { Loading