diff options
-rw-r--r-- | src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java | 18 | ||||
-rw-r--r-- | tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastSettingsTest.java | 71 |
2 files changed, 83 insertions, 6 deletions
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java b/src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java index 355c5775d..a5c9caaca 100644 --- a/src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java +++ b/src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java @@ -836,12 +836,18 @@ public class CellBroadcastSettings extends CollapsingToolbarBaseActivity { * @return The resource */ public static @NonNull Resources getResources(@NonNull Context context, int subId) { - if (subId == SubscriptionManager.DEFAULT_SUBSCRIPTION_ID - || !SubscriptionManager.isValidSubscriptionId(subId) - // based on the latest design, subId can be valid earlier than mcc mnc is known to - // telephony. check if sim is loaded to avoid caching the wrong resources. - || context.getSystemService(TelephonyManager.class).getSimApplicationState( - SubscriptionManager.getSlotIndex(subId)) != TelephonyManager.SIM_STATE_LOADED) { + + try { + if (subId == SubscriptionManager.DEFAULT_SUBSCRIPTION_ID + || !SubscriptionManager.isValidSubscriptionId(subId) + // per the latest design, subId can be valid earlier than mcc mnc is known to + // telephony. check if sim is loaded to avoid caching the wrong resources. + || context.getSystemService(TelephonyManager.class).getSimApplicationState( + SubscriptionManager.getSlotIndex(subId)) != TelephonyManager.SIM_STATE_LOADED) { + return context.getResources(); + } + } catch (Exception e) { + Log.d(TAG, "Fail to getSimApplicationState due to " + e); return context.getResources(); } diff --git a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastSettingsTest.java b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastSettingsTest.java index b3237aa60..ca34ac650 100644 --- a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastSettingsTest.java +++ b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastSettingsTest.java @@ -19,12 +19,26 @@ import static androidx.test.espresso.Espresso.onView; import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.matcher.ViewMatchers.withText; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + import android.app.Instrumentation; import android.content.Context; import android.content.Intent; +import android.content.res.Resources; import android.os.Looper; import android.os.RemoteException; import android.support.test.uiautomator.UiDevice; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; import androidx.preference.PreferenceManager; import androidx.test.InstrumentationRegistry; @@ -130,6 +144,63 @@ public class CellBroadcastSettingsTest extends assertTrue(CellBroadcastSettings.hasAnyPreferenceChanged(mContext)); } + @Test + public void testGetResources() { + Context mockContext = mock(Context.class); + Resources mockResources = mock(Resources.class); + doReturn(mockResources).when(mockContext).getResources(); + + CellBroadcastSettings.getResources( + mockContext, SubscriptionManager.DEFAULT_SUBSCRIPTION_ID); + verify(mockContext, never()).getSystemService(anyString()); + verify(mockContext, times(1)).getResources(); + + CellBroadcastSettings.getResources( + mockContext, SubscriptionManager.INVALID_SUBSCRIPTION_ID); + verify(mockContext, never()).getSystemService(anyString()); + verify(mockContext, times(2)).getResources(); + + Context mockContext2 = mock(Context.class); + doReturn(mockResources).when(mockContext2).getResources(); + SubscriptionManager mockSubManager = mock(SubscriptionManager.class); + TelephonyManager mockTelephonyManager = mock(TelephonyManager.class); + doReturn(Context.TELEPHONY_SUBSCRIPTION_SERVICE).when(mockContext) + .getSystemServiceName(eq(SubscriptionManager.class)); + doReturn(mockSubManager).when(mockContext).getSystemService( + eq(Context.TELEPHONY_SUBSCRIPTION_SERVICE)); + doReturn(Context.TELEPHONY_SERVICE).when(mockContext) + .getSystemServiceName(eq(TelephonyManager.class)); + doReturn(mockTelephonyManager).when(mockContext) + .getSystemService(eq(Context.TELEPHONY_SERVICE)); + doReturn(TelephonyManager.SIM_STATE_UNKNOWN).when(mockTelephonyManager) + .getSimApplicationState(anyInt()); + doReturn(mockContext2).when(mockContext).createConfigurationContext(any()); + CellBroadcastSettings.getResources( + mockContext, SubscriptionManager.DEFAULT_SUBSCRIPTION_ID - 1); + + verify(mockContext, times(1)).getSystemService(anyString()); + verify(mockContext, times(3)).getResources(); + + + doReturn(TelephonyManager.SIM_STATE_LOADED).when(mockTelephonyManager) + .getSimApplicationState(anyInt()); + CellBroadcastSettings.getResources( + mockContext, SubscriptionManager.DEFAULT_SUBSCRIPTION_ID - 2); + + verify(mockContext, times(3)).getResources(); + verify(mockSubManager, times(1)).getActiveSubscriptionInfo(anyInt()); + verify(mockContext2, times(1)).getResources(); + + doThrow(NullPointerException.class).when(mockTelephonyManager) + .getSimApplicationState(anyInt()); + CellBroadcastSettings.getResources( + mockContext, SubscriptionManager.DEFAULT_SUBSCRIPTION_ID - 2); + + verify(mockContext, times(4)).getResources(); + verify(mockSubManager, times(1)).getActiveSubscriptionInfo(anyInt()); + verify(mockContext2, times(1)).getResources(); + } + public void waitUntilDialogOpens(Runnable r, long maxWaitMs) { long waitTime = 0; while (waitTime < maxWaitMs) { |