Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0f799a09 authored by Sangyun Yun's avatar Sangyun Yun Committed by Android (Google) Code Review
Browse files

Merge "Check if preferred on IWLAN was changed in ServiceState." into udc-dev

parents e5033b77 6013308c
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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())
@@ -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
@@ -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)
+33 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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());
    }
}