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

Commit d5e9743b authored by Hakjun Choi's avatar Hakjun Choi Committed by Android (Google) Code Review
Browse files

Merge "Modify the way of obtaining get Wi-Fi connectivity status to asynchronous API" into main

parents 0577d7d5 7493a5ba
Loading
Loading
Loading
Loading
+35 −22
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.internal.telephony;


import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
@@ -111,6 +110,7 @@ public class TelephonyCountryDetector extends Handler {
    @GuardedBy("mLock")
    private boolean mIsCountryCodesOverridden = false;
    private final RegistrantList mCountryCodeChangedRegistrants = new RegistrantList();
    private boolean mIsWifiNetworkConnected = false;

    private FeatureFlags mFeatureFlags = null;

@@ -298,7 +298,7 @@ public class TelephonyCountryDetector extends Handler {
                handleNetworkCountryCodeChangedEvent((NetworkCountryCodeInfo) msg.obj);
                break;
            case EVENT_WIFI_CONNECTIVITY_STATE_CHANGED:
                handleEventWifiConnectivityStateChanged();
                handleEventWifiConnectivityStateChanged((boolean) msg.obj);
                break;
            case EVENT_LOCATION_UPDATE_REQUEST_QUOTA_RESET:
                evaluateRequestingLocationUpdates();
@@ -490,11 +490,21 @@ public class TelephonyCountryDetector extends Handler {
        }
    }

    private void handleEventWifiConnectivityStateChanged() {
        mWifiConnectivityStateChangedRegistrantList.notifyResult(isWifiNetworkConnected());
    private void handleEventWifiConnectivityStateChanged(boolean connected) {
        logd("handleEventWifiConnectivityStateChanged: " + connected);
        evaluateNotifyWifiConnectivityStateChangedEvent(connected);
        evaluateRequestingLocationUpdates();
    }

    private void evaluateNotifyWifiConnectivityStateChangedEvent(boolean connected) {
        if (connected != mIsWifiNetworkConnected) {
            mIsWifiNetworkConnected = connected;
            mWifiConnectivityStateChangedRegistrantList.notifyResult(mIsWifiNetworkConnected);
            logd("evaluateNotifyWifiConnectivityStateChangedEvent: wifi connectivity state has "
                    + "changed to " + connected);
        }
    }

    private void setLocationCountryCode(@NonNull Pair<String, Long> countryCodeInfo) {
        logd("Set location country code to: " + countryCodeInfo.first);
        if (!isValid(countryCodeInfo.first)) {
@@ -526,25 +536,23 @@ public class TelephonyCountryDetector extends Handler {
    private void registerForWifiConnectivityStateChanged() {
        logd("registerForWifiConnectivityStateChanged");
        NetworkRequest.Builder builder = new NetworkRequest.Builder();
        builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
        builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);

        ConnectivityManager.NetworkCallback networkCallback =
                new ConnectivityManager.NetworkCallback() {
                    @Override
                    public void onAvailable(Network network) {
                        logd("Wifi network available: " + network);
                        sendRequestAsync(EVENT_WIFI_CONNECTIVITY_STATE_CHANGED, null);
                    public void onCapabilitiesChanged(Network network,
                            NetworkCapabilities networkCapabilities) {
                        logd("onCapabilitiesChanged: " + networkCapabilities);
                        sendRequestAsync(EVENT_WIFI_CONNECTIVITY_STATE_CHANGED,
                                isInternetAvailable(networkCapabilities));
                    }

                    @Override
                    public void onLost(Network network) {
                        logd("Wifi network lost: " + network);
                        sendRequestAsync(EVENT_WIFI_CONNECTIVITY_STATE_CHANGED, null);
                    }

                    @Override
                    public void onUnavailable() {
                        logd("Wifi network unavailable");
                        sendRequestAsync(EVENT_WIFI_CONNECTIVITY_STATE_CHANGED, null);
                        sendRequestAsync(EVENT_WIFI_CONNECTIVITY_STATE_CHANGED, false);
                    }
                };
        mConnectivityManager.registerNetworkCallback(builder.build(), networkCallback);
@@ -560,15 +568,20 @@ public class TelephonyCountryDetector extends Handler {

    /**
     * Check whether Wi-Fi network is connected or not.
     * @return {@code true} is Wi-Fi is connected, {@code false} otherwise.
     * @return {@code true} is Wi-Fi is connected, and internet is available, {@code false}
     * otherwise.
     */
    public boolean isWifiNetworkConnected() {
        Network activeNetwork = mConnectivityManager.getActiveNetwork();
        NetworkCapabilities networkCapabilities =
                mConnectivityManager.getNetworkCapabilities(activeNetwork);
        return networkCapabilities != null
                && networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
        logd("isWifiNetworkConnected: " + mIsWifiNetworkConnected);
        return mIsWifiNetworkConnected;
    }

    private boolean isInternetAvailable(NetworkCapabilities networkCapabilities) {
        boolean isWifiConnected =
                networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
        logd("isWifiConnected: " + isWifiConnected);
        return isWifiConnected;
    }

    /**
+71 −13
Original line number Diff line number Diff line
@@ -112,26 +112,27 @@ public class TelephonyCountryDetectorTest extends TelephonyTest {
        when(mSST2.getLocaleTracker()).thenReturn(mMockLocaleTracker2);
        when(mMockLocaleTracker2.getCurrentCountry()).thenReturn("");

        when(mConnectivityManager.getActiveNetwork()).thenReturn(mMockNetwork);
        mNetworkCapabilities = new NetworkCapabilities();
        mNetworkCapabilities.setTransportType(NetworkCapabilities.TRANSPORT_WIFI, true);
        mNetworkCapabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET, true);
        when(mConnectivityManager.getNetworkCapabilities(any(Network.class)))
                .thenReturn(mNetworkCapabilities);
        mNetworkCapabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED, true);

        when(mLocationManager.getProviders(true)).thenReturn(Arrays.asList("TEST_PROVIDER"));

        when(mMockFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
        mCountryDetectorUT = new TestTelephonyCountryDetector(
                mLooper, mContext, mLocationManager, mConnectivityManager, mMockFeatureFlags);
        verify(mConnectivityManager).registerNetworkCallback(
                any(NetworkRequest.class), mNetworkCallbackCaptor.capture());
        mNetworkCallbackCaptor.getValue().onAvailable(mMockNetwork);
        mNetworkCallbackCaptor.getValue().onCapabilitiesChanged(mMockNetwork, mNetworkCapabilities);
        mTestableLooper.processAllMessages();
        if (isGeoCoderImplemented()) {
            verify(mLocationManager).requestLocationUpdates(anyString(), anyLong(), anyFloat(),
                    mLocationListenerCaptor.capture());
            verify(mLocationManager).getProviders(true);
            verify(mLocationManager).getLastKnownLocation(anyString());
        }
        verify(mConnectivityManager).registerNetworkCallback(
                any(NetworkRequest.class), mNetworkCallbackCaptor.capture());
    }

    @After
@@ -285,7 +286,7 @@ public class TelephonyCountryDetectorTest extends TelephonyTest {

        // Wi-fi is not available
        clearInvocations(mLocationManager);
        mNetworkCapabilities.setTransportType(NetworkCapabilities.TRANSPORT_WIFI, false);
        mNetworkCapabilities.setTransportType(NetworkCapabilities.TRANSPORT_WIFI, true);
        mNetworkCallbackCaptor.getValue().onLost(mMockNetwork);
        mTestableLooper.processAllMessages();
        verify(mLocationManager, never()).removeUpdates(any(LocationListener.class));
@@ -294,6 +295,9 @@ public class TelephonyCountryDetectorTest extends TelephonyTest {
        clearInvocations(mLocationManager);
        mNetworkCapabilities.setTransportType(NetworkCapabilities.TRANSPORT_WIFI, true);
        mNetworkCallbackCaptor.getValue().onAvailable(mMockNetwork);
        mNetworkCapabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET, true);
        mNetworkCapabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED, true);
        mNetworkCallbackCaptor.getValue().onCapabilitiesChanged(mMockNetwork, mNetworkCapabilities);
        mTestableLooper.processAllMessages();
        // Location updates were already requested
        verify(mLocationManager, never()).requestLocationUpdates(anyString(), anyLong(), anyFloat(),
@@ -301,7 +305,10 @@ public class TelephonyCountryDetectorTest extends TelephonyTest {

        // Make Wi-fi not available and reset the quota
        clearInvocations(mLocationManager);
        mNetworkCapabilities.setTransportType(NetworkCapabilities.TRANSPORT_WIFI, false);
        mNetworkCapabilities.setTransportType(NetworkCapabilities.TRANSPORT_WIFI, true);
        mNetworkCapabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET, true);
        mNetworkCapabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED, false);
        mNetworkCallbackCaptor.getValue().onCapabilitiesChanged(mMockNetwork, mNetworkCapabilities);
        mTestableLooper.moveTimeForward(
                TestTelephonyCountryDetector.getLocationUpdateRequestQuotaResetTimeoutMillis());
        mTestableLooper.processAllMessages();
@@ -311,6 +318,9 @@ public class TelephonyCountryDetectorTest extends TelephonyTest {
        clearInvocations(mLocationManager);
        mNetworkCapabilities.setTransportType(NetworkCapabilities.TRANSPORT_WIFI, true);
        mNetworkCallbackCaptor.getValue().onAvailable(mMockNetwork);
        mNetworkCapabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET, true);
        mNetworkCapabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED, true);
        mNetworkCallbackCaptor.getValue().onCapabilitiesChanged(mMockNetwork, mNetworkCapabilities);
        mTestableLooper.processAllMessages();
        verify(mLocationManager).requestLocationUpdates(anyString(), anyLong(), anyFloat(),
                any(LocationListener.class));
@@ -324,16 +334,20 @@ public class TelephonyCountryDetectorTest extends TelephonyTest {
        verify(mLocationManager, never()).requestLocationUpdates(anyString(), anyLong(), anyFloat(),
                any(LocationListener.class));

        // Wi-fi becomes not available
        // Wi-fi lost
        clearInvocations(mLocationManager);
        mNetworkCapabilities.setTransportType(NetworkCapabilities.TRANSPORT_WIFI, false);
        mNetworkCallbackCaptor.getValue().onUnavailable();
        mNetworkCapabilities.setTransportType(NetworkCapabilities.TRANSPORT_WIFI, true);
        mNetworkCallbackCaptor.getValue().onLost(mMockNetwork);
        mTestableLooper.processAllMessages();
        verify(mLocationManager).removeUpdates(any(LocationListener.class));
    }

    @Test
    public void testRegisterUnregisterForWifiConnectivityStateChanged() {
        // Set Wi-Fi unavailable.
        mNetworkCallbackCaptor.getValue().onLost(mMockNetwork);
        mTestableLooper.processAllMessages();

        WifiConnectivityStateChangedListener listener = new WifiConnectivityStateChangedListener(
                mLooper);

@@ -344,19 +358,63 @@ public class TelephonyCountryDetectorTest extends TelephonyTest {
        clearInvocations(mLocationManager);
        mNetworkCapabilities.setTransportType(NetworkCapabilities.TRANSPORT_WIFI, true);
        mNetworkCallbackCaptor.getValue().onAvailable(mMockNetwork);
        mNetworkCapabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET, true);
        mNetworkCapabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED, true);
        mNetworkCallbackCaptor.getValue().onCapabilitiesChanged(mMockNetwork, mNetworkCapabilities);
        mTestableLooper.processAllMessages();
        assertTrue(listener.getIsWifiConnected());

        // Wi-fi becomes not available
        // Wi-fi lost
        clearInvocations(mLocationManager);
        mNetworkCapabilities.setTransportType(NetworkCapabilities.TRANSPORT_WIFI, false);
        mNetworkCallbackCaptor.getValue().onUnavailable();
        mNetworkCapabilities.setTransportType(NetworkCapabilities.TRANSPORT_WIFI, true);
        mNetworkCallbackCaptor.getValue().onLost(mMockNetwork);
        mTestableLooper.processAllMessages();
        assertFalse(listener.getIsWifiConnected());

        mCountryDetectorUT.unregisterForWifiConnectivityStateChanged(listener);
    }

    @Test
    public void testReflectWifiConnectedStatusChanged() {
        // 1. Wi-Fi is turned off, network capability is not available.
        mNetworkCallbackCaptor.getValue().onLost(mMockNetwork);
        mNetworkCapabilities = new NetworkCapabilities();
        mNetworkCapabilities.setTransportType(NetworkCapabilities.TRANSPORT_WIFI, true);
        mNetworkCapabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET, false);
        mNetworkCapabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED, false);
        mNetworkCallbackCaptor.getValue().onCapabilitiesChanged(mMockNetwork, mNetworkCapabilities);
        mTestableLooper.processAllMessages();
        assertFalse(mCountryDetectorUT.isWifiNetworkConnected());

        // 2. Wi-Fi is turned on, but network capability has not been updated.
        mNetworkCallbackCaptor.getValue().onAvailable(mMockNetwork);
        mTestableLooper.processAllMessages();
        assertFalse(mCountryDetectorUT.isWifiNetworkConnected());

        // 3. Network capability has been updated, not some of them still false.
        mNetworkCapabilities = new NetworkCapabilities();
        mNetworkCapabilities.setTransportType(NetworkCapabilities.TRANSPORT_WIFI, true);
        mNetworkCapabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET, true);
        mNetworkCapabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED, false);
        mNetworkCallbackCaptor.getValue().onCapabilitiesChanged(mMockNetwork, mNetworkCapabilities);
        mTestableLooper.processAllMessages();
        assertFalse(mCountryDetectorUT.isWifiNetworkConnected());

        // 4. Network capability has been updated to validated.
        mNetworkCapabilities = new NetworkCapabilities();
        mNetworkCapabilities.setTransportType(NetworkCapabilities.TRANSPORT_WIFI, true);
        mNetworkCapabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET, true);
        mNetworkCapabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED, true);
        mNetworkCallbackCaptor.getValue().onCapabilitiesChanged(mMockNetwork, mNetworkCapabilities);
        mTestableLooper.processAllMessages();
        assertTrue(mCountryDetectorUT.isWifiNetworkConnected());

        // 5. Wi-Fi is turned off.
        mNetworkCallbackCaptor.getValue().onLost(mMockNetwork);
        mTestableLooper.processAllMessages();
        assertFalse(mCountryDetectorUT.isWifiNetworkConnected());
    }

    private static boolean isGeoCoderImplemented() {
        return Geocoder.isPresent();
    }