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

Commit f4610d5f authored by Sewook Seo's avatar Sewook Seo
Browse files

Guide transport type for emergency data network.

Bug: 265017237
Test: atest FrameworksTelephonyTests
Change-Id: I8778f00a9511eaf9a3b19d25b0b41ff88568dbb3
parent 3631da71
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
@@ -26,9 +26,11 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.os.AsyncResult;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.PersistableBundle;
import android.os.Registrant;
import android.os.RegistrantList;
@@ -77,6 +79,9 @@ import java.util.stream.Collectors;
public class AccessNetworksManager extends Handler {
    private static final boolean DBG = false;

    /** Event to guide a transport type for initial data connection of emergency data network. */
    private static final int EVENT_GUIDE_TRANSPORT_TYPE_FOR_EMERGENCY = 1;

    /**
     * The counters to detect frequent QNS attempt to change preferred network transport by ApnType.
     */
@@ -176,6 +181,19 @@ public class AccessNetworksManager extends Handler {
        }
    }

    @Override
    public void handleMessage(@NonNull Message msg) {
        switch (msg.what) {
            case EVENT_GUIDE_TRANSPORT_TYPE_FOR_EMERGENCY:
                AsyncResult ar = (AsyncResult) msg.obj;
                int transport = (int) ar.result;
                onEmergencyDataNetworkPreferredTransportChanged(transport);
                break;
            default:
                loge("Unexpected event " + msg.what);
        }
    }

    private class AccessNetworksManagerDeathRecipient implements IBinder.DeathRecipient {
        @Override
        public void binderDied() {
@@ -298,6 +316,20 @@ public class AccessNetworksManager extends Handler {
        }
    }

    private void onEmergencyDataNetworkPreferredTransportChanged(
            @AccessNetworkConstants.TransportType int transportType) {
        try {
            logl("onEmergencyDataNetworkPreferredTransportChanged: "
                    + AccessNetworkConstants.transportTypeToString(transportType));
            if (mIQualifiedNetworksService != null) {
                mIQualifiedNetworksService.reportEmergencyDataNetworkPreferredTransportChanged(
                        mPhone.getPhoneId(), transportType);
            }
        } catch (Exception ex) {
            loge("onEmergencyDataNetworkPreferredTransportChanged: ", ex);
        }
    }

    /**
     * Access networks manager callback. This should be only used by {@link DataNetworkController}.
     */
@@ -372,6 +404,8 @@ public class AccessNetworksManager extends Handler {
                            mApnTypeToQnsChangeNetworkCounter.clear();
                        }
                    });
            mPhone.registerForEmergencyDomainSelected(
                    this, EVENT_GUIDE_TRANSPORT_TYPE_FOR_EMERGENCY, null);
        });
    }

+28 −0
Original line number Diff line number Diff line
@@ -31,8 +31,10 @@ import android.content.ComponentName;
import android.content.IntentFilter;
import android.content.pm.ServiceInfo;
import android.net.NetworkCapabilities;
import android.os.AsyncResult;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.telephony.AccessNetworkConstants;
import android.telephony.AccessNetworkConstants.AccessNetworkType;
import android.telephony.NetworkService;
@@ -148,6 +150,32 @@ public class AccessNetworksManagerTest extends TelephonyTest {
        assertThat(mAccessNetworksManager.isAnyApnOnIwlan()).isTrue();
    }

    @Test
    public void testGuideTransportTypeForEmergencyDataNetwork() throws Exception {
        doAnswer(invocation -> {
            int accessNetwork = AccessNetworkType.UNKNOWN;
            if (invocation.getArguments()[1].equals(AccessNetworkConstants.TRANSPORT_TYPE_WLAN)) {
                accessNetwork = AccessNetworkType.IWLAN;
            } else if (invocation.getArguments()[1]
                    .equals(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)) {
                accessNetwork = AccessNetworkType.EUTRAN;
            }
            mQnsCallback.onQualifiedNetworkTypesChanged(ApnSetting.TYPE_EMERGENCY,
                    new int[]{accessNetwork});
            return null;
        }).when(mMockedQns).reportEmergencyDataNetworkPreferredTransportChanged(anyInt(), anyInt());

        AsyncResult asyncResult =
                new AsyncResult(null, AccessNetworkConstants.TRANSPORT_TYPE_WLAN, null);
        Message msg = this.mAccessNetworksManager
                .obtainMessage(1 /* EVENT_GUIDE_TRANSPORT_TYPE_FOR_EMERGENCY */, asyncResult);
        mAccessNetworksManager.sendMessage(msg);
        processAllMessages();

        assertThat(mAccessNetworksManager.getPreferredTransport(ApnSetting.TYPE_EMERGENCY))
                .isEqualTo(AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
    }

    @Test
    public void testEmptyNetworkTypes() throws Exception {
        testQualifiedNetworkTypesChanged();