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

Commit 61c50cbe authored by Sewook Seo's avatar Sewook Seo Committed by Android (Google) Code Review
Browse files

Merge "Guide transport type for emergency data network."

parents 0d6178db f4610d5f
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();