diff options
author | Sungcheol Ahn <@google.com> | 2023-06-29 07:04:58 +0000 |
---|---|---|
committer | Sungcheol Ahn <donaldahn@google.com> | 2023-07-13 22:39:28 +0000 |
commit | de94b95a009647637b20e7436ec89999480c8f05 (patch) | |
tree | c3c55a7c3284683b23a3e3392ace06db561f8a5c | |
parent | 7c4f7e4a35b10ff39eeacead833dba9725fdad8c (diff) | |
download | AlternativeNetworkAccess-de94b95a009647637b20e7436ec89999480c8f05.tar.gz |
AlternativeNetworkAccess: replace CarrierConfigChange broadcast
receiverwith new listener API
Bug: 264917992
Test: Manual test with direct boot, lock pattern or PIN lock/unlock,SIM remove/insert,etc
Test: atest OpportunisticNetworkServiceTest
Change-Id: I8ebd8d4b8cbb6751fd687db361a0aadd0b0d166e
-rw-r--r-- | AndroidManifest.xml | 3 | ||||
-rw-r--r-- | src/com/android/ons/OpportunisticNetworkService.java | 60 | ||||
-rw-r--r-- | tests/src/com/android/ons/OpportunisticNetworkServiceTest.java | 51 |
3 files changed, 106 insertions, 8 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index fb2346f..fb40082 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -56,9 +56,6 @@ <intent-filter> <action android:name="com.android.ons.action.ESIM_CONFIG"/> </intent-filter> - <intent-filter> - <action android:name="android.telephony.action.CARRIER_CONFIG_CHANGED"/> - </intent-filter> </receiver> </application> </manifest> diff --git a/src/com/android/ons/OpportunisticNetworkService.java b/src/com/android/ons/OpportunisticNetworkService.java index d41051c..3080943 100644 --- a/src/com/android/ons/OpportunisticNetworkService.java +++ b/src/com/android/ons/OpportunisticNetworkService.java @@ -34,6 +34,7 @@ import android.os.Looper; import android.os.Message; import android.os.RemoteException; import android.os.TelephonyServiceManager.ServiceRegisterer; +import android.os.UserManager; import android.telephony.AvailableNetworkInfo; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionInfo; @@ -62,7 +63,7 @@ public class OpportunisticNetworkService extends Service { @VisibleForTesting protected Context mContext; private TelephonyManager mTelephonyManager; @VisibleForTesting protected SubscriptionManager mSubscriptionManager; - private ONSProfileActivator mONSProfileActivator; + @VisibleForTesting protected ONSProfileActivator mONSProfileActivator; private ONSStats mONSStats; private Handler mHandler = null; @@ -80,6 +81,8 @@ public class OpportunisticNetworkService extends Service { private static final boolean DBG = true; /* message to indicate sim state update */ private static final int MSG_SIM_STATE_CHANGE = 1; + @VisibleForTesting protected CarrierConfigManager mCarrierConfigManager; + @VisibleForTesting protected UserManager mUserManager; /** * To expand the error codes for {@link TelephonyManager#updateAvailableNetworks} and @@ -431,10 +434,6 @@ public class OpportunisticNetworkService extends Service { ); } break; - - case CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED: - mONSProfileActivator.handleCarrierConfigChange(); - break; } } }.setIntent(intent)); @@ -447,6 +446,11 @@ public class OpportunisticNetworkService extends Service { super.onDestroy(); log("Destroyed Successfully..."); mHandler.getLooper().quitSafely(); + + if (mCarrierConfigManager != null && mCarrierConfigChangeListener != null) { + mCarrierConfigManager.unregisterCarrierConfigChangeListener( + mCarrierConfigChangeListener); + } } /** @@ -471,8 +475,54 @@ public class OpportunisticNetworkService extends Service { new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED)); enableOpportunisticNetwork(getPersistentEnableState()); mONSProfileActivator = new ONSProfileActivator(mContext, mONSStats); + mCarrierConfigManager = mContext.getSystemService(CarrierConfigManager.class); + // Registers for carrier config changes and runs on handler thread + mCarrierConfigManager.registerCarrierConfigChangeListener(mHandler::post, + mCarrierConfigChangeListener); + mUserManager = mContext.getSystemService(UserManager.class); } + /** + * This is only register CarrierConfigChangeListener for testing + */ + @VisibleForTesting + protected void registerCarrierConfigChangListener() { + mCarrierConfigManager.registerCarrierConfigChangeListener(mHandler::post, + mCarrierConfigChangeListener); + } + + private final CarrierConfigManager.CarrierConfigChangeListener mCarrierConfigChangeListener = + new CarrierConfigManager.CarrierConfigChangeListener() { + @Override + public void onCarrierConfigChanged(int logicalSlotIndex, int subscriptionId, + int carrierId, int specificCarrierId) { + + boolean isUserUnlocked = mUserManager.isUserUnlocked(); + if (isUserUnlocked) { + mONSProfileActivator.handleCarrierConfigChange(); + } else { + log("User is locked"); + // Register the UnlockReceiver for trigger after Unlocked. + mContext.registerReceiver(mUserUnlockedReceiver, new IntentFilter( + Intent.ACTION_USER_UNLOCKED)); + } + } + }; + + /** + * This is only sent to registered receivers, not manifest receivers. + * Note: The user's actual state might have changed by the time the broadcast is received. + */ + private final BroadcastReceiver mUserUnlockedReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (Intent.ACTION_USER_UNLOCKED.equals(intent.getAction())) { + log("Received UserUnlockedReceiver"); + mONSProfileActivator.handleCarrierConfigChange(); + } + } + }; + private void handleCarrierAppAvailableNetworks( ArrayList<AvailableNetworkInfo> availableNetworks, IUpdateAvailableNetworksCallback callbackStub, String callingPackage) { diff --git a/tests/src/com/android/ons/OpportunisticNetworkServiceTest.java b/tests/src/com/android/ons/OpportunisticNetworkServiceTest.java index 5b2d67c..52b50ee 100644 --- a/tests/src/com/android/ons/OpportunisticNetworkServiceTest.java +++ b/tests/src/com/android/ons/OpportunisticNetworkServiceTest.java @@ -20,11 +20,16 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; import android.os.Looper; import android.os.RemoteException; +import android.os.UserManager; import android.telephony.AvailableNetworkInfo; +import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyFrameworkInitializer; @@ -41,6 +46,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import java.util.ArrayList; @@ -62,6 +68,14 @@ public class OpportunisticNetworkServiceTest extends ONSBaseTest { private HashMap<String, ONSConfigInput> mockONSConfigInputHashMap; @Mock private ONSProfileSelector mockProfileSelector; + @Mock + private CarrierConfigManager mCarrierConfigManager; + @Mock + private ONSProfileActivator mONSProfileActivator; + @Mock + private UserManager mUserManager; + @Mock + private Context mMockContext; @Before public void setUp() throws Exception { @@ -364,6 +378,43 @@ public class OpportunisticNetworkServiceTest extends ONSBaseTest { verify(mockProfileSelector, times(1)).stopProfileSelection(any()); } + @Test + public void testCarrierConfigChangedUnlocked() { + mOpportunisticNetworkService.mUserManager = mUserManager; + mOpportunisticNetworkService.mONSProfileActivator = mONSProfileActivator; + mOpportunisticNetworkService.mCarrierConfigManager = mCarrierConfigManager; + mOpportunisticNetworkService.registerCarrierConfigChangListener(); + mOpportunisticNetworkService.mContext = mMockContext; + + CarrierConfigManager.CarrierConfigChangeListener CarrierConfigChangeListener; + + final ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> listenerCaptor = + ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class); + + verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(), + listenerCaptor.capture()); + CarrierConfigChangeListener = listenerCaptor.getAllValues().get(0); + + // CarrierConfigChange in lock state + when(mUserManager.isUserUnlocked()).thenReturn(false); + CarrierConfigChangeListener.onCarrierConfigChanged(0, 0, 0, 0); + verify(mONSProfileActivator, never()).handleCarrierConfigChange(); + + // handle CarrierConfigChange when state is changed from lock to unlock + final ArgumentCaptor<BroadcastReceiver> broadcastReceiverCaptor = + ArgumentCaptor.forClass(BroadcastReceiver.class); + + verify(mMockContext).registerReceiver(broadcastReceiverCaptor.capture(), any()); + broadcastReceiverCaptor.getValue().onReceive(mMockContext, + new Intent(Intent.ACTION_USER_UNLOCKED)); + verify(mONSProfileActivator, times(1)).handleCarrierConfigChange(); + + // CarrierConfigChange in Unlock state + when(mUserManager.isUserUnlocked()).thenReturn(true); + CarrierConfigChangeListener.onCarrierConfigChanged(0, 0, 0, 0); + verify(mONSProfileActivator, times(2)).handleCarrierConfigChange(); + } + private IOns getIOns() { return IOns.Stub.asInterface( TelephonyFrameworkInitializer |