diff options
author | Hui Wang <huiwang@google.com> | 2022-01-12 20:11:46 +0000 |
---|---|---|
committer | Hui Wang <huiwang@google.com> | 2022-02-01 19:36:01 +0000 |
commit | 9beb2691d9507aff2e6eab2f1fcb9fafe12be070 (patch) | |
tree | 2b55a761a8085106f22cbe2dbd21a216a77cfee3 | |
parent | 612b3e1a1f5a6c59798dbfe9480de7144932608d (diff) | |
download | CellBroadcastReceiver-9beb2691d9507aff2e6eab2f1fcb9fafe12be070.tar.gz |
Cache the resources when the mnc of the configuration is not zero
Checking the sim loaded is not used properly for the resources caching.
The resources per the mcc and mnc can also be ready before sim loaded.
In this case, the mnc of the configuration from the resource is not 0.
Bug: 214250834
Test: atest CellBroadcastReceiverUnitTests
Change-Id: I15d6fe9d2e50c06d17fd8602b67bc9ddc5affb9c
6 files changed, 63 insertions, 61 deletions
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java b/src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java index dd6291f03..f4fe98d17 100644 --- a/src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java +++ b/src/com/android/cellbroadcastreceiver/CellBroadcastSettings.java @@ -33,7 +33,6 @@ import android.os.Bundle; import android.os.UserManager; import android.os.Vibrator; import android.telephony.SubscriptionManager; -import android.telephony.TelephonyManager; import android.util.Log; import android.view.MenuItem; import android.widget.Switch; @@ -881,17 +880,8 @@ public class CellBroadcastSettings extends CollapsingToolbarBaseActivity { */ public static @NonNull Resources getResources(@NonNull Context context, int subId) { - 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); + if (subId == SubscriptionManager.DEFAULT_SUBSCRIPTION_ID + || !SubscriptionManager.isValidSubscriptionId(subId)) { return context.getResources(); } @@ -902,7 +892,11 @@ public class CellBroadcastSettings extends CollapsingToolbarBaseActivity { Resources res = SubscriptionManager.getResourcesForSubId(context, subId); - sResourcesCache.put(subId, res); + if (res.getConfiguration().mnc != 0) { + Log.d(TAG, "Cache resource for sub: " + subId + ", mcc: " + + res.getConfiguration().mcc + ", mnc:" + res.getConfiguration().mnc); + sResourcesCache.put(subId, res); + } return res; } diff --git a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastActivityTestCase.java b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastActivityTestCase.java index 4af6cc2f0..db5a270cd 100644 --- a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastActivityTestCase.java +++ b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastActivityTestCase.java @@ -16,11 +16,14 @@ package com.android.cellbroadcastreceiver.unit; +import static org.mockito.Mockito.spy; + import android.app.Activity; import android.app.ResourcesManager; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; +import android.content.res.Configuration; import android.content.res.Resources; import android.os.Handler; import android.test.ActivityUnitTestCase; @@ -114,8 +117,11 @@ public class CellBroadcastActivityTestCase<T extends Activity> extends ActivityU private HashMap<String, Object> mInjectedSystemServices = new HashMap<>(); + private Resources mResources; + public TestContext(Context base) { super(base); + mResources = spy(super.getResources()); } public <S> void injectSystemService(Class<S> cls, S service) { @@ -144,17 +150,14 @@ public class CellBroadcastActivityTestCase<T extends Activity> extends ActivityU return super.getSystemService(name); } - Resources mResources; @Override public Resources getResources() { - if (mResources != null) { - return mResources; - } - return super.getResources(); + return mResources; } - public void setResources(Resources resources) { - mResources = resources; + @Override + public Context createConfigurationContext(Configuration overrideConfiguration) { + return this; } } } diff --git a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastAlertDialogTest.java b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastAlertDialogTest.java index acca9afe1..dd651e513 100644 --- a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastAlertDialogTest.java +++ b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastAlertDialogTest.java @@ -36,7 +36,6 @@ import android.os.Looper; import android.os.Message; import android.os.PowerManager; import android.telephony.SmsCbMessage; -import android.telephony.TelephonyManager; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; @@ -45,6 +44,7 @@ import android.widget.TextView; import com.android.cellbroadcastreceiver.CellBroadcastAlertDialog; import com.android.cellbroadcastreceiver.CellBroadcastAlertService; +import com.android.cellbroadcastreceiver.CellBroadcastSettings; import com.android.cellbroadcastreceiver.R; import com.android.internal.telephony.gsm.SmsCbConstants; @@ -69,9 +69,6 @@ public class CellBroadcastAlertDialogTest extends @Mock private IThermalService.Stub mMockedThermalService; - @Mock - TelephonyManager mTelephonyManager; - @Captor private ArgumentCaptor<Integer> mInt; @@ -90,9 +87,6 @@ public class CellBroadcastAlertDialogTest extends private ArrayList<SmsCbMessage> mMessageList; - @Mock - Resources mMockResources; - @Override protected Intent createActivityIntent() { mMessageList = new ArrayList<>(1); @@ -118,9 +112,7 @@ public class CellBroadcastAlertDialogTest extends mPowerManager = new PowerManager(mContext, mMockedPowerManagerService, mMockedThermalService, null); injectSystemService(PowerManager.class, mPowerManager); - doReturn(TelephonyManager.SIM_STATE_UNKNOWN).when(mTelephonyManager) - .getSimApplicationState(anyInt()); - injectSystemService(TelephonyManager.class, mTelephonyManager); + CellBroadcastSettings.resetResourcesCache(); } @After @@ -184,9 +176,10 @@ public class CellBroadcastAlertDialogTest extends public void testGetNewMessageListIfNeeded() throws Throwable { CellBroadcastAlertDialog activity = startActivity(); - mContext.setResources(mMockResources); - doReturn(false).when(mMockResources).getBoolean( + Resources spyRes = mContext.getResources(); + doReturn(false).when(spyRes).getBoolean( R.bool.show_cmas_messages_in_priority_order); + SmsCbMessage testMessage1 = CellBroadcastAlertServiceTest .createMessageForCmasMessageClass(12412, SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL, @@ -215,13 +208,12 @@ public class CellBroadcastAlertDialogTest extends assertTrue(messageList.size() == 2); assertEquals(testMessage2.getReceivedTime(), messageList.get(1).getReceivedTime()); - doReturn(true).when(mMockResources).getBoolean( + doReturn(true).when(spyRes).getBoolean( R.bool.show_cmas_messages_in_priority_order); + messageList = activity.getNewMessageListIfNeeded(inputList1, inputList2); assertTrue(messageList.size() == 2); assertEquals(testMessage1.getReceivedTime(), messageList.get(1).getReceivedTime()); - - mContext.setResources(null); } @InstrumentationTest diff --git a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastServiceTestCase.java b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastServiceTestCase.java index 2e767feaa..67251d910 100644 --- a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastServiceTestCase.java +++ b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastServiceTestCase.java @@ -27,6 +27,7 @@ import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.content.SharedPreferences; +import android.content.res.Configuration; import android.content.res.Resources; import android.media.AudioManager; import android.os.SystemClock; @@ -38,6 +39,7 @@ import android.telephony.TelephonyManager; import android.test.ServiceTestCase; import com.android.cellbroadcastreceiver.CellBroadcastChannelManager; +import com.android.cellbroadcastreceiver.CellBroadcastSettings; import com.android.internal.telephony.ISub; import org.junit.After; @@ -69,6 +71,8 @@ public abstract class CellBroadcastServiceTestCase<T extends Service> extends Se @Mock protected SharedPreferences mMockedSharedPreferences; + protected Configuration mConfiguration; + MockedServiceManager mMockedServiceManager; Intent mServiceIntentToVerify; @@ -145,6 +149,11 @@ public abstract class CellBroadcastServiceTestCase<T extends Service> extends Se public SharedPreferences getSharedPreferences(String name, int mode) { return mMockedSharedPreferences; } + + @Override + public Context createConfigurationContext(Configuration overrideConfiguration) { + return this; + } } @Before @@ -159,20 +168,22 @@ public abstract class CellBroadcastServiceTestCase<T extends Service> extends Se doReturn(new String[]{""}).when(mResources).getStringArray(anyInt()); + mConfiguration = new Configuration(); + doReturn(mConfiguration).when(mResources).getConfiguration(); + doReturn(1).when(mMockSubscriptionInfo).getSubscriptionId(); doReturn(Arrays.asList(mMockSubscriptionInfo)).when(mMockedSubscriptionManager) .getActiveSubscriptionInfoList(); doReturn(mMockedTelephonyManager).when(mMockedTelephonyManager) .createForSubscriptionId(anyInt()); - doReturn(TelephonyManager.SIM_STATE_UNKNOWN).when(mMockedTelephonyManager) - .getSimApplicationState(anyInt()); mMockedServiceManager = new MockedServiceManager(); mMockedServiceManager.replaceService("isub", mSubService); mContext = new TestContextWrapper(getContext()); setContext(mContext); + CellBroadcastSettings.resetResourcesCache(); CellBroadcastChannelManager.clearAllCellBroadcastChannelRanges(); } diff --git a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastSettingsTest.java b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastSettingsTest.java index c20d36560..16a5e8ea1 100644 --- a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastSettingsTest.java +++ b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastSettingsTest.java @@ -24,7 +24,6 @@ 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; @@ -41,8 +40,8 @@ import android.os.Looper; import android.os.RemoteException; import android.os.UserManager; import android.support.test.uiautomator.UiDevice; +import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; -import android.telephony.TelephonyManager; import androidx.preference.Preference; import androidx.preference.PreferenceManager; @@ -204,43 +203,48 @@ public class CellBroadcastSettingsTest extends Context mockContext2 = mock(Context.class); doReturn(mockResources).when(mockContext2).getResources(); + Configuration config = new Configuration(); + doReturn(config).when(mockResources).getConfiguration(); 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()); + SubscriptionInfo mockSubInfo = mock(SubscriptionInfo.class); + doReturn(mockSubInfo).when(mockSubManager).getActiveSubscriptionInfo(anyInt()); + doReturn(0).when(mockSubInfo).getMcc(); + doReturn(0).when(mockSubInfo).getMnc(); doReturn(mockContext2).when(mockContext).createConfigurationContext(any()); + + // The resource will not be cached for the sub CellBroadcastSettings.getResources( mockContext, SubscriptionManager.DEFAULT_SUBSCRIPTION_ID - 1); - verify(mockContext, times(1)).getSystemService(anyString()); - verify(mockContext, times(3)).getResources(); + verify(mockContext, times(2)).getResources(); + verify(mockContext2, times(1)).getResources(); + // The resources will be cached for ths sub + config.mcc = 123; + config.mnc = 456; - doReturn(TelephonyManager.SIM_STATE_LOADED).when(mockTelephonyManager) - .getSimApplicationState(anyInt()); CellBroadcastSettings.getResources( - mockContext, SubscriptionManager.DEFAULT_SUBSCRIPTION_ID - 2); + mockContext, SubscriptionManager.DEFAULT_SUBSCRIPTION_ID - 1); - verify(mockContext, times(3)).getResources(); - verify(mockSubManager, times(1)).getActiveSubscriptionInfo(anyInt()); - verify(mockContext2, times(1)).getResources(); + verify(mockContext, times(2)).getResources(); + verify(mockContext2, times(2)).getResources(); + + // The resources should be read from the cached directly + CellBroadcastSettings.getResources( + mockContext, SubscriptionManager.DEFAULT_SUBSCRIPTION_ID - 1); + + verify(mockContext, times(2)).getResources(); + verify(mockContext2, times(2)).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(); + verify(mockContext, times(2)).getResources(); + verify(mockContext2, times(3)).getResources(); } @Test diff --git a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastTest.java b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastTest.java index e4c80a32b..9447047a2 100644 --- a/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastTest.java +++ b/tests/unit/src/com/android/cellbroadcastreceiver/unit/CellBroadcastTest.java @@ -88,8 +88,6 @@ public abstract class CellBroadcastTest { doReturn(mResources).when(mContext).getResources(); doReturn(mContext).when(mContext).getApplicationContext(); doReturn(new String[]{""}).when(mResources).getStringArray(anyInt()); - doReturn(TelephonyManager.SIM_STATE_LOADED).when(mTelephonyManager) - .getSimApplicationState(anyInt()); } void carrierConfigSetStringArray(int subId, String key, String[] values) { |