summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSungcheol Ahn <@google.com>2023-06-29 07:04:58 +0000
committerSungcheol Ahn <donaldahn@google.com>2023-07-13 22:39:28 +0000
commitde94b95a009647637b20e7436ec89999480c8f05 (patch)
treec3c55a7c3284683b23a3e3392ace06db561f8a5c
parent7c4f7e4a35b10ff39eeacead833dba9725fdad8c (diff)
downloadAlternativeNetworkAccess-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.xml3
-rw-r--r--src/com/android/ons/OpportunisticNetworkService.java60
-rw-r--r--tests/src/com/android/ons/OpportunisticNetworkServiceTest.java51
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