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

Commit 6013308c authored by sangyun's avatar sangyun
Browse files

Check if preferred on IWLAN was changed in ServiceState.

The IwlanPreferred was obtained in the process of polling in SST.
but there was no changes notify even when the IwlanPreferred is
changed by alone.

Bug: 268446053
Test: atest FrameworksTelephonyTests
Change-Id: I09522dc8ddc48123a22eeeb50a50faa6a384c78f
parent b7b74a20
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;
@@ -625,6 +626,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())
@@ -737,6 +744,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
@@ -875,6 +899,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());
    }
}