diff --git a/src/com/android/settings/network/InternetUpdater.java b/src/com/android/settings/network/InternetUpdater.java index 39672765725..dd70cef62af 100644 --- a/src/com/android/settings/network/InternetUpdater.java +++ b/src/com/android/settings/network/InternetUpdater.java @@ -142,13 +142,13 @@ public class InternetUpdater implements AirplaneModeEnabler.OnAirplaneModeChange private NetworkCallback mNetworkCallback = new NetworkCallback() { public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) { - checkNetworkCapabilities(networkCapabilities); + updateInternetAvailable(networkCapabilities); } @Override public void onLost(@NonNull Network network) { mInternetAvailable = false; - update(); + updateInternetType(); } }; @@ -203,7 +203,7 @@ public class InternetUpdater implements AirplaneModeEnabler.OnAirplaneModeChange Network activeNetwork = mConnectivityManager.getActiveNetwork(); if (activeNetwork == null) { mInternetAvailable = false; - update(); + updateInternetType(); return; } @@ -211,36 +211,34 @@ public class InternetUpdater implements AirplaneModeEnabler.OnAirplaneModeChange mConnectivityManager.getNetworkCapabilities(activeNetwork); if (activeNetworkCapabilities == null) { mInternetAvailable = false; - update(); + updateInternetType(); return; } - checkNetworkCapabilities(activeNetworkCapabilities); - } - - private void checkNetworkCapabilities(@NonNull NetworkCapabilities networkCapabilities) { - if (!networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) { - mInternetAvailable = false; - update(); - return; - } - - boolean internetAvailable = false; - for (int transport : networkCapabilities.getTransportTypes()) { - if (sTransportMap.containsKey(transport)) { - mTransport = transport; - internetAvailable = true; - Log.i(TAG, "Detect an internet capability network with transport type: " - + mTransport); - break; - } - } - mInternetAvailable = internetAvailable; - update(); + updateInternetAvailable(activeNetworkCapabilities); } @VisibleForTesting - void update() { + void updateInternetAvailable(@NonNull NetworkCapabilities capabilities) { + boolean internetAvailable = false; + if (capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) { + for (int transport : capabilities.getTransportTypes()) { + if (sTransportMap.containsKey(transport)) { + mTransport = transport; + internetAvailable = true; + Log.i(TAG, "Detect an internet available network with transport type: " + + mTransport); + break; + } + } + } + mInternetAvailable = internetAvailable; + updateInternetType(); + } + + @VisibleForTesting + void updateInternetType() { @InternetType int internetType = INTERNET_NETWORKS_AVAILABLE; if (mInternetAvailable) { internetType = sTransportMap.get(mTransport); diff --git a/src/com/android/settings/network/ProviderModelSlice.java b/src/com/android/settings/network/ProviderModelSlice.java index 18765a8e2fe..beb74890d0b 100644 --- a/src/com/android/settings/network/ProviderModelSlice.java +++ b/src/com/android/settings/network/ProviderModelSlice.java @@ -21,6 +21,7 @@ import static android.app.slice.Slice.EXTRA_TOGGLE_STATE; import static com.android.settings.slices.CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI; +import android.annotation.ColorInt; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; @@ -30,6 +31,7 @@ import android.telephony.SubscriptionManager; import android.util.Log; import androidx.annotation.VisibleForTesting; +import androidx.core.graphics.drawable.IconCompat; import androidx.slice.Slice; import androidx.slice.builders.ListBuilder; @@ -83,9 +85,10 @@ public class ProviderModelSlice extends WifiSlice { // Second section: Add a carrier item. // Third section: Add the Wi-Fi items which are not connected. // Fourth section: If device has connection problem, this row show the message for user. - boolean hasEthernet = isEthernetConnected(); + @InternetUpdater.InternetType int internetType = getInternetType(); final ListBuilder listBuilder = mHelper.createListBuilder(getUri()); - if (mHelper.isAirplaneModeEnabled() && !mWifiManager.isWifiEnabled() && !hasEthernet) { + if (mHelper.isAirplaneModeEnabled() && !mWifiManager.isWifiEnabled() + && internetType != InternetUpdater.INTERNET_ETHERNET) { log("Airplane mode is enabled."); return listBuilder.build(); } @@ -105,15 +108,17 @@ public class ProviderModelSlice extends WifiSlice { log("hasCarrier: " + hasCarrier); // First section: Add a Ethernet or Wi-Fi item which state is connected. + boolean isConnectedWifiAddedTop = false; final WifiSliceItem connectedWifiItem = mHelper.getConnectedWifiItem(wifiList); - if (hasEthernet) { + if (internetType == InternetUpdater.INTERNET_ETHERNET) { log("get Ethernet item which is connected"); listBuilder.addRow(createEthernetRow()); maxListSize--; } else { - if (connectedWifiItem != null) { - log("get Wi-Fi item which is connected"); + if (connectedWifiItem != null && internetType == InternetUpdater.INTERNET_WIFI) { + log("get Wi-Fi item which is connected to internet"); listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem)); + isConnectedWifiAddedTop = true; maxListSize--; } } @@ -128,7 +133,7 @@ public class ProviderModelSlice extends WifiSlice { } // Third section: Add the connected Wi-Fi item to Wi-Fi list if the Ethernet is connected. - if (connectedWifiItem != null && hasEthernet) { + if (connectedWifiItem != null && !isConnectedWifiAddedTop) { log("get Wi-Fi item which is connected"); listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem)); maxListSize--; @@ -222,12 +227,12 @@ public class ProviderModelSlice extends WifiSlice { return SliceBackgroundWorker.getInstance(getUri()); } - private boolean isEthernetConnected() { + private @InternetUpdater.InternetType int getInternetType() { final NetworkProviderWorker worker = getWorker(); if (worker == null) { - return false; + return InternetUpdater.INTERNET_NETWORKS_AVAILABLE; } - return worker.isEthernetConnected(); + return worker.getInternetType(); } @VisibleForTesting @@ -243,6 +248,20 @@ public class ProviderModelSlice extends WifiSlice { .setSubtitle(mContext.getText(R.string.to_switch_networks_disconnect_ethernet)); } + @Override + protected IconCompat getWifiSliceItemLevelIcon(WifiSliceItem wifiSliceItem) { + if (wifiSliceItem.getConnectedState() == WifiEntry.CONNECTED_STATE_CONNECTED + && getInternetType() != InternetUpdater.INTERNET_WIFI) { + final @ColorInt int tint = Utils.getColorAttrDefaultColor(mContext, + android.R.attr.colorControlNormal); + final Drawable drawable = mContext.getDrawable( + Utils.getWifiIconResource(wifiSliceItem.getLevel())); + drawable.setTint(tint); + return Utils.createIconWithDrawable(drawable); + } + return super.getWifiSliceItemLevelIcon(wifiSliceItem); + } + /** * Wrap the subscriptionManager call for test mocking. */ diff --git a/src/com/android/settings/network/telephony/NetworkProviderWorker.java b/src/com/android/settings/network/telephony/NetworkProviderWorker.java index 57f17b59560..698e779d8e6 100644 --- a/src/com/android/settings/network/telephony/NetworkProviderWorker.java +++ b/src/com/android/settings/network/telephony/NetworkProviderWorker.java @@ -288,9 +288,9 @@ public class NetworkProviderWorker extends WifiScanWorker implements } /** - * Returns true, if the ethernet network is connected. + * Returns the internet type. */ - public boolean isEthernetConnected() { - return mInternetType == INTERNET_ETHERNET; + public @InternetUpdater.InternetType int getInternetType() { + return mInternetType; } } diff --git a/src/com/android/settings/wifi/slice/WifiSlice.java b/src/com/android/settings/wifi/slice/WifiSlice.java index 898de56c836..e4a571d13e2 100644 --- a/src/com/android/settings/wifi/slice/WifiSlice.java +++ b/src/com/android/settings/wifi/slice/WifiSlice.java @@ -164,7 +164,7 @@ public class WifiSlice implements CustomSliceable { return rowBuilder; } - private IconCompat getWifiSliceItemLevelIcon(WifiSliceItem wifiSliceItem) { + protected IconCompat getWifiSliceItemLevelIcon(WifiSliceItem wifiSliceItem) { final @ColorInt int tint; if (wifiSliceItem.getConnectedState() == WifiEntry.CONNECTED_STATE_CONNECTED) { tint = Utils.getColorAccentDefaultColor(mContext); diff --git a/tests/unit/src/com/android/settings/network/InternetUpdaterTest.java b/tests/unit/src/com/android/settings/network/InternetUpdaterTest.java index 94456fe3f1d..3e9cdc7a763 100644 --- a/tests/unit/src/com/android/settings/network/InternetUpdaterTest.java +++ b/tests/unit/src/com/android/settings/network/InternetUpdaterTest.java @@ -38,6 +38,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.IntentFilter; import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; import android.net.wifi.WifiManager; import androidx.lifecycle.Lifecycle; @@ -107,57 +108,80 @@ public class InternetUpdaterTest { } @Test - public void update_apmOnWifiOff_getInternetApm() { + public void updateInternetAvailable_wifiConnectedAndNoValidated_internetUnavailable() { + final NetworkCapabilities networkCapabilities = new NetworkCapabilities(); + networkCapabilities.addTransportType(TRANSPORT_WIFI); + networkCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); + + mInternetUpdater.updateInternetAvailable(networkCapabilities); + + assertThat(mInternetUpdater.mInternetAvailable).isEqualTo(false); + } + + @Test + public void updateInternetAvailable_wifiConnectedAndValidated_internetAvailable() { + final NetworkCapabilities networkCapabilities = new NetworkCapabilities(); + networkCapabilities.addTransportType(TRANSPORT_WIFI); + networkCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); + networkCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); + + mInternetUpdater.updateInternetAvailable(networkCapabilities); + + assertThat(mInternetUpdater.mInternetAvailable).isEqualTo(true); + } + + @Test + public void updateInternetType_apmOnWifiOff_getInternetApm() { doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn(); doReturn(WifiManager.WIFI_STATE_DISABLED).when(mWifiManager).getWifiState(); mInternetUpdater.mInternetAvailable = false; - mInternetUpdater.update(); + mInternetUpdater.updateInternetType(); assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_OFF); } @Test - public void update_apmOnWifiOnNotConnected_getInternetNetworksAvailable() { + public void updateInternetType_apmOnWifiOnNotConnected_getInternetNetworksAvailable() { doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn(); doReturn(WifiManager.WIFI_STATE_ENABLED).when(mWifiManager).getWifiState(); mInternetUpdater.mInternetAvailable = false; - mInternetUpdater.update(); + mInternetUpdater.updateInternetType(); assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_NETWORKS_AVAILABLE); } @Test - public void update_apmOnWifiConnected_getInternetWifi() { + public void updateInternetType_apmOnWifiConnected_getInternetWifi() { doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn(); doReturn(true).when(mWifiManager).isWifiEnabled(); mInternetUpdater.mInternetAvailable = true; mInternetUpdater.mTransport = TRANSPORT_WIFI; - mInternetUpdater.update(); + mInternetUpdater.updateInternetType(); assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_WIFI); } @Test - public void update_apmOnCellularConnected_getInternetCellular() { + public void updateInternetType_apmOnCellularConnected_getInternetCellular() { doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn(); mInternetUpdater.mInternetAvailable = true; mInternetUpdater.mTransport = TRANSPORT_CELLULAR; - mInternetUpdater.update(); + mInternetUpdater.updateInternetType(); assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_CELLULAR); } @Test - public void update_apmOnEthernetConnected_getInternetEthernet() { + public void updateInternetType_apmOnEthernetConnected_getInternetEthernet() { doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn(); mInternetUpdater.mInternetAvailable = true; mInternetUpdater.mTransport = TRANSPORT_ETHERNET; - mInternetUpdater.update(); + mInternetUpdater.updateInternetType(); assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_ETHERNET); } diff --git a/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java b/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java index 4760daacef8..a323ed6ebef 100644 --- a/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java +++ b/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java @@ -236,7 +236,8 @@ public class ProviderModelSliceTest { mWifiList.add(mMockWifiSliceItem2); mMockNetworkProviderWorker.updateSelfResults(mWifiList); mockHelperCondition(false, true, true, null); - when(mMockNetworkProviderWorker.isEthernetConnected()).thenReturn(true); + when(mMockNetworkProviderWorker.getInternetType()) + .thenReturn(InternetUpdater.INTERNET_ETHERNET); final Slice slice = mMockProviderModelSlice.getSlice(); @@ -258,7 +259,8 @@ public class ProviderModelSliceTest { mWifiList.add(mMockWifiSliceItem2); mMockNetworkProviderWorker.updateSelfResults(mWifiList); mockHelperCondition(false, true, true, mWifiList.get(0)); - when(mMockNetworkProviderWorker.isEthernetConnected()).thenReturn(true); + when(mMockNetworkProviderWorker.getInternetType()) + .thenReturn(InternetUpdater.INTERNET_ETHERNET); final Slice slice = mMockProviderModelSlice.getSlice(); diff --git a/tests/unit/src/com/android/settings/network/telephony/NetworkProviderWorkerTest.java b/tests/unit/src/com/android/settings/network/telephony/NetworkProviderWorkerTest.java index 97f8e11f796..d052f31c854 100644 --- a/tests/unit/src/com/android/settings/network/telephony/NetworkProviderWorkerTest.java +++ b/tests/unit/src/com/android/settings/network/telephony/NetworkProviderWorkerTest.java @@ -261,24 +261,24 @@ public class NetworkProviderWorkerTest { } @Test - public void isEthernetConnected_connectedEthernet_shouldBeTrue() { + public void getInternetType_connectedEthernet_returnInternetEthernet() { mMockNetworkProviderWorker.onInternetTypeChanged(INTERNET_ETHERNET); - assertThat(mMockNetworkProviderWorker.isEthernetConnected()).isTrue(); + assertThat(mMockNetworkProviderWorker.getInternetType()).isEqualTo(INTERNET_ETHERNET); } @Test - public void isEthernetConnected_connectedWifi_shouldBeFalse() { + public void getInternetType_connectedWifi_returnInternetWifi() { mMockNetworkProviderWorker.onInternetTypeChanged(INTERNET_WIFI); - assertThat(mMockNetworkProviderWorker.isEthernetConnected()).isFalse(); + assertThat(mMockNetworkProviderWorker.getInternetType()).isEqualTo(INTERNET_WIFI); } @Test - public void isEthernetConnected_connectedCarrier_shouldBeFalse() { + public void getInternetType__connectedCarrier_returnInternetCellular() { mMockNetworkProviderWorker.onInternetTypeChanged(INTERNET_CELLULAR); - assertThat(mMockNetworkProviderWorker.isEthernetConnected()).isFalse(); + assertThat(mMockNetworkProviderWorker.getInternetType()).isEqualTo(INTERNET_CELLULAR); } public class MockNetworkProviderWorker extends NetworkProviderWorker {