Loading src/java/com/android/internal/telephony/ServiceStateTracker.java +28 −0 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ import com.android.internal.telephony.cdma.EriManager; import com.android.internal.telephony.cdnr.CarrierDisplayNameData; import com.android.internal.telephony.cdnr.CarrierDisplayNameResolver; import com.android.internal.telephony.data.AccessNetworksManager; import com.android.internal.telephony.data.AccessNetworksManager.AccessNetworksManagerCallback; import com.android.internal.telephony.data.DataNetwork; import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback; import com.android.internal.telephony.imsphone.ImsPhone; Loading Loading @@ -622,6 +623,12 @@ public class ServiceStateTracker extends Handler { */ private DataNetworkControllerCallback mDataDisconnectedCallback; /** * AccessNetworksManagerCallback is used for preferred on the IWLAN when preferred transport * type changed in AccessNetworksManager. */ private AccessNetworksManagerCallback mAccessNetworksManagerCallback = null; public ServiceStateTracker(GsmCdmaPhone phone, CommandsInterface ci) { mNitzState = TelephonyComponentFactory.getInstance() .inject(NitzStateMachine.class.getName()) Loading Loading @@ -734,6 +741,23 @@ public class ServiceStateTracker extends Handler { } } }; mAccessNetworksManagerCallback = new AccessNetworksManagerCallback(this::post) { @Override public void onPreferredTransportChanged(int networkCapability) { // Check if preferred on IWLAN was changed in ServiceState. boolean isIwlanPreferred = mAccessNetworksManager.isAnyApnOnIwlan(); if (mSS.isIwlanPreferred() != isIwlanPreferred) { log("onPreferredTransportChanged: IwlanPreferred is changed to " + isIwlanPreferred); mSS.setIwlanPreferred(isIwlanPreferred); mPhone.notifyServiceStateChanged(mPhone.getServiceState()); } } }; if (mAccessNetworksManagerCallback != null) { mAccessNetworksManager.registerCallback(mAccessNetworksManagerCallback); } } @VisibleForTesting Loading Loading @@ -872,6 +896,10 @@ public class ServiceStateTracker extends Handler { mCSST.dispose(); mCSST = null; } if (mAccessNetworksManagerCallback != null) { mAccessNetworksManager.unregisterCallback(mAccessNetworksManagerCallback); mAccessNetworksManagerCallback = null; } } @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) Loading tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +33 −0 Original line number Diff line number Diff line Loading @@ -93,6 +93,7 @@ import androidx.test.filters.FlakyTest; import com.android.internal.R; import com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager; import com.android.internal.telephony.data.AccessNetworksManager; import com.android.internal.telephony.data.DataNetworkController; import com.android.internal.telephony.metrics.ServiceStateStats; import com.android.internal.telephony.subscription.SubscriptionInfoInternal; Loading @@ -107,6 +108,7 @@ import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; Loading Loading @@ -3166,4 +3168,35 @@ public class ServiceStateTrackerTest extends TelephonyTest { doReturn(ServiceState.STATE_EMERGENCY_ONLY).when(mServiceState).getState(); assertEquals(ServiceState.STATE_EMERGENCY_ONLY, sst.getCombinedRegState(mServiceState)); } @Test public void testOnChangingPreferredOnIwlan() throws Exception { Field callbackField = ServiceStateTracker.class.getDeclaredField("mAccessNetworksManagerCallback"); callbackField.setAccessible(true); AccessNetworksManager.AccessNetworksManagerCallback accessNetworksManagerCallback = (AccessNetworksManager.AccessNetworksManagerCallback) callbackField.get(sst); when(mAccessNetworksManager.isAnyApnOnIwlan()).thenReturn(false); // Start state: Cell data only LTE + IWLAN CellIdentityLte cellIdentity = new CellIdentityLte(1, 1, 5, 1, new int[] {1, 2}, 5000, "001", "01", "test", "tst", Collections.emptyList(), null); changeRegStateWithIwlan( // WWAN NetworkRegistrationInfo.REGISTRATION_STATE_HOME, cellIdentity, TelephonyManager.NETWORK_TYPE_UNKNOWN, TelephonyManager.NETWORK_TYPE_LTE, // WLAN NetworkRegistrationInfo.REGISTRATION_STATE_HOME, TelephonyManager.NETWORK_TYPE_IWLAN); assertFalse(sst.mSS.isIwlanPreferred()); when(mAccessNetworksManager.isAnyApnOnIwlan()).thenReturn(true); accessNetworksManagerCallback.onPreferredTransportChanged(0); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); assertTrue(sst.mSS.isIwlanPreferred()); } } Loading
src/java/com/android/internal/telephony/ServiceStateTracker.java +28 −0 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ import com.android.internal.telephony.cdma.EriManager; import com.android.internal.telephony.cdnr.CarrierDisplayNameData; import com.android.internal.telephony.cdnr.CarrierDisplayNameResolver; import com.android.internal.telephony.data.AccessNetworksManager; import com.android.internal.telephony.data.AccessNetworksManager.AccessNetworksManagerCallback; import com.android.internal.telephony.data.DataNetwork; import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback; import com.android.internal.telephony.imsphone.ImsPhone; Loading Loading @@ -622,6 +623,12 @@ public class ServiceStateTracker extends Handler { */ private DataNetworkControllerCallback mDataDisconnectedCallback; /** * AccessNetworksManagerCallback is used for preferred on the IWLAN when preferred transport * type changed in AccessNetworksManager. */ private AccessNetworksManagerCallback mAccessNetworksManagerCallback = null; public ServiceStateTracker(GsmCdmaPhone phone, CommandsInterface ci) { mNitzState = TelephonyComponentFactory.getInstance() .inject(NitzStateMachine.class.getName()) Loading Loading @@ -734,6 +741,23 @@ public class ServiceStateTracker extends Handler { } } }; mAccessNetworksManagerCallback = new AccessNetworksManagerCallback(this::post) { @Override public void onPreferredTransportChanged(int networkCapability) { // Check if preferred on IWLAN was changed in ServiceState. boolean isIwlanPreferred = mAccessNetworksManager.isAnyApnOnIwlan(); if (mSS.isIwlanPreferred() != isIwlanPreferred) { log("onPreferredTransportChanged: IwlanPreferred is changed to " + isIwlanPreferred); mSS.setIwlanPreferred(isIwlanPreferred); mPhone.notifyServiceStateChanged(mPhone.getServiceState()); } } }; if (mAccessNetworksManagerCallback != null) { mAccessNetworksManager.registerCallback(mAccessNetworksManagerCallback); } } @VisibleForTesting Loading Loading @@ -872,6 +896,10 @@ public class ServiceStateTracker extends Handler { mCSST.dispose(); mCSST = null; } if (mAccessNetworksManagerCallback != null) { mAccessNetworksManager.unregisterCallback(mAccessNetworksManagerCallback); mAccessNetworksManagerCallback = null; } } @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) Loading
tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +33 −0 Original line number Diff line number Diff line Loading @@ -93,6 +93,7 @@ import androidx.test.filters.FlakyTest; import com.android.internal.R; import com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager; import com.android.internal.telephony.data.AccessNetworksManager; import com.android.internal.telephony.data.DataNetworkController; import com.android.internal.telephony.metrics.ServiceStateStats; import com.android.internal.telephony.subscription.SubscriptionInfoInternal; Loading @@ -107,6 +108,7 @@ import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; Loading Loading @@ -3166,4 +3168,35 @@ public class ServiceStateTrackerTest extends TelephonyTest { doReturn(ServiceState.STATE_EMERGENCY_ONLY).when(mServiceState).getState(); assertEquals(ServiceState.STATE_EMERGENCY_ONLY, sst.getCombinedRegState(mServiceState)); } @Test public void testOnChangingPreferredOnIwlan() throws Exception { Field callbackField = ServiceStateTracker.class.getDeclaredField("mAccessNetworksManagerCallback"); callbackField.setAccessible(true); AccessNetworksManager.AccessNetworksManagerCallback accessNetworksManagerCallback = (AccessNetworksManager.AccessNetworksManagerCallback) callbackField.get(sst); when(mAccessNetworksManager.isAnyApnOnIwlan()).thenReturn(false); // Start state: Cell data only LTE + IWLAN CellIdentityLte cellIdentity = new CellIdentityLte(1, 1, 5, 1, new int[] {1, 2}, 5000, "001", "01", "test", "tst", Collections.emptyList(), null); changeRegStateWithIwlan( // WWAN NetworkRegistrationInfo.REGISTRATION_STATE_HOME, cellIdentity, TelephonyManager.NETWORK_TYPE_UNKNOWN, TelephonyManager.NETWORK_TYPE_LTE, // WLAN NetworkRegistrationInfo.REGISTRATION_STATE_HOME, TelephonyManager.NETWORK_TYPE_IWLAN); assertFalse(sst.mSS.isIwlanPreferred()); when(mAccessNetworksManager.isAnyApnOnIwlan()).thenReturn(true); accessNetworksManagerCallback.onPreferredTransportChanged(0); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); assertTrue(sst.mSS.isIwlanPreferred()); } }