[Provider Model] Move the Internet unavailable Wi-Fi down

- Check the Wifi network have both INTERNET and VALIDATED capabilities
to achieve effective network access

- Move the Internet unavailable Wi-Fi down to the top of Wi-Fi list

- Don't paint color for the Internet unavailable Wi-Fi

- Screenshot:
  https://screenshot.googleplex.com/w82kbALssdTZmg4

Bug: 178457619
Bug: 178926547
Bug: 178978070
Test: manual test on device
atest -c InternetUpdaterTest \
         NetworkProviderWorkerTest \
         ProviderModelSliceTest

Change-Id: Idf04e556ab5a87abc5bc96d1934f5e8fd91fbfaa
This commit is contained in:
Weng Su
2021-03-25 12:10:06 +08:00
parent fe042ac08e
commit 439cc64b1c
7 changed files with 101 additions and 58 deletions

View File

@@ -142,13 +142,13 @@ public class InternetUpdater implements AirplaneModeEnabler.OnAirplaneModeChange
private NetworkCallback mNetworkCallback = new NetworkCallback() { private NetworkCallback mNetworkCallback = new NetworkCallback() {
public void onCapabilitiesChanged(@NonNull Network network, public void onCapabilitiesChanged(@NonNull Network network,
@NonNull NetworkCapabilities networkCapabilities) { @NonNull NetworkCapabilities networkCapabilities) {
checkNetworkCapabilities(networkCapabilities); updateInternetAvailable(networkCapabilities);
} }
@Override @Override
public void onLost(@NonNull Network network) { public void onLost(@NonNull Network network) {
mInternetAvailable = false; mInternetAvailable = false;
update(); updateInternetType();
} }
}; };
@@ -203,7 +203,7 @@ public class InternetUpdater implements AirplaneModeEnabler.OnAirplaneModeChange
Network activeNetwork = mConnectivityManager.getActiveNetwork(); Network activeNetwork = mConnectivityManager.getActiveNetwork();
if (activeNetwork == null) { if (activeNetwork == null) {
mInternetAvailable = false; mInternetAvailable = false;
update(); updateInternetType();
return; return;
} }
@@ -211,36 +211,34 @@ public class InternetUpdater implements AirplaneModeEnabler.OnAirplaneModeChange
mConnectivityManager.getNetworkCapabilities(activeNetwork); mConnectivityManager.getNetworkCapabilities(activeNetwork);
if (activeNetworkCapabilities == null) { if (activeNetworkCapabilities == null) {
mInternetAvailable = false; mInternetAvailable = false;
update(); updateInternetType();
return; return;
} }
checkNetworkCapabilities(activeNetworkCapabilities); updateInternetAvailable(activeNetworkCapabilities);
}
private void checkNetworkCapabilities(@NonNull NetworkCapabilities networkCapabilities) {
if (!networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
mInternetAvailable = false;
update();
return;
} }
@VisibleForTesting
void updateInternetAvailable(@NonNull NetworkCapabilities capabilities) {
boolean internetAvailable = false; boolean internetAvailable = false;
for (int transport : networkCapabilities.getTransportTypes()) { if (capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
&& capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
for (int transport : capabilities.getTransportTypes()) {
if (sTransportMap.containsKey(transport)) { if (sTransportMap.containsKey(transport)) {
mTransport = transport; mTransport = transport;
internetAvailable = true; internetAvailable = true;
Log.i(TAG, "Detect an internet capability network with transport type: " Log.i(TAG, "Detect an internet available network with transport type: "
+ mTransport); + mTransport);
break; break;
} }
} }
}
mInternetAvailable = internetAvailable; mInternetAvailable = internetAvailable;
update(); updateInternetType();
} }
@VisibleForTesting @VisibleForTesting
void update() { void updateInternetType() {
@InternetType int internetType = INTERNET_NETWORKS_AVAILABLE; @InternetType int internetType = INTERNET_NETWORKS_AVAILABLE;
if (mInternetAvailable) { if (mInternetAvailable) {
internetType = sTransportMap.get(mTransport); internetType = sTransportMap.get(mTransport);

View File

@@ -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 static com.android.settings.slices.CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI;
import android.annotation.ColorInt;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -30,6 +31,7 @@ import android.telephony.SubscriptionManager;
import android.util.Log; import android.util.Log;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.core.graphics.drawable.IconCompat;
import androidx.slice.Slice; import androidx.slice.Slice;
import androidx.slice.builders.ListBuilder; import androidx.slice.builders.ListBuilder;
@@ -83,9 +85,10 @@ public class ProviderModelSlice extends WifiSlice {
// Second section: Add a carrier item. // Second section: Add a carrier item.
// Third section: Add the Wi-Fi items which are not connected. // 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. // 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()); 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."); log("Airplane mode is enabled.");
return listBuilder.build(); return listBuilder.build();
} }
@@ -105,15 +108,17 @@ public class ProviderModelSlice extends WifiSlice {
log("hasCarrier: " + hasCarrier); log("hasCarrier: " + hasCarrier);
// First section: Add a Ethernet or Wi-Fi item which state is connected. // First section: Add a Ethernet or Wi-Fi item which state is connected.
boolean isConnectedWifiAddedTop = false;
final WifiSliceItem connectedWifiItem = mHelper.getConnectedWifiItem(wifiList); final WifiSliceItem connectedWifiItem = mHelper.getConnectedWifiItem(wifiList);
if (hasEthernet) { if (internetType == InternetUpdater.INTERNET_ETHERNET) {
log("get Ethernet item which is connected"); log("get Ethernet item which is connected");
listBuilder.addRow(createEthernetRow()); listBuilder.addRow(createEthernetRow());
maxListSize--; maxListSize--;
} else { } else {
if (connectedWifiItem != null) { if (connectedWifiItem != null && internetType == InternetUpdater.INTERNET_WIFI) {
log("get Wi-Fi item which is connected"); log("get Wi-Fi item which is connected to internet");
listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem)); listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem));
isConnectedWifiAddedTop = true;
maxListSize--; 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. // 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"); log("get Wi-Fi item which is connected");
listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem)); listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem));
maxListSize--; maxListSize--;
@@ -222,12 +227,12 @@ public class ProviderModelSlice extends WifiSlice {
return SliceBackgroundWorker.getInstance(getUri()); return SliceBackgroundWorker.getInstance(getUri());
} }
private boolean isEthernetConnected() { private @InternetUpdater.InternetType int getInternetType() {
final NetworkProviderWorker worker = getWorker(); final NetworkProviderWorker worker = getWorker();
if (worker == null) { if (worker == null) {
return false; return InternetUpdater.INTERNET_NETWORKS_AVAILABLE;
} }
return worker.isEthernetConnected(); return worker.getInternetType();
} }
@VisibleForTesting @VisibleForTesting
@@ -243,6 +248,20 @@ public class ProviderModelSlice extends WifiSlice {
.setSubtitle(mContext.getText(R.string.to_switch_networks_disconnect_ethernet)); .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. * Wrap the subscriptionManager call for test mocking.
*/ */

View File

@@ -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() { public @InternetUpdater.InternetType int getInternetType() {
return mInternetType == INTERNET_ETHERNET; return mInternetType;
} }
} }

View File

@@ -164,7 +164,7 @@ public class WifiSlice implements CustomSliceable {
return rowBuilder; return rowBuilder;
} }
private IconCompat getWifiSliceItemLevelIcon(WifiSliceItem wifiSliceItem) { protected IconCompat getWifiSliceItemLevelIcon(WifiSliceItem wifiSliceItem) {
final @ColorInt int tint; final @ColorInt int tint;
if (wifiSliceItem.getConnectedState() == WifiEntry.CONNECTED_STATE_CONNECTED) { if (wifiSliceItem.getConnectedState() == WifiEntry.CONNECTED_STATE_CONNECTED) {
tint = Utils.getColorAccentDefaultColor(mContext); tint = Utils.getColorAccentDefaultColor(mContext);

View File

@@ -38,6 +38,7 @@ import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import androidx.lifecycle.Lifecycle; import androidx.lifecycle.Lifecycle;
@@ -107,57 +108,80 @@ public class InternetUpdaterTest {
} }
@Test @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(true).when(mAirplaneModeEnabler).isAirplaneModeOn();
doReturn(WifiManager.WIFI_STATE_DISABLED).when(mWifiManager).getWifiState(); doReturn(WifiManager.WIFI_STATE_DISABLED).when(mWifiManager).getWifiState();
mInternetUpdater.mInternetAvailable = false; mInternetUpdater.mInternetAvailable = false;
mInternetUpdater.update(); mInternetUpdater.updateInternetType();
assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_OFF); assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_OFF);
} }
@Test @Test
public void update_apmOnWifiOnNotConnected_getInternetNetworksAvailable() { public void updateInternetType_apmOnWifiOnNotConnected_getInternetNetworksAvailable() {
doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn(); doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn();
doReturn(WifiManager.WIFI_STATE_ENABLED).when(mWifiManager).getWifiState(); doReturn(WifiManager.WIFI_STATE_ENABLED).when(mWifiManager).getWifiState();
mInternetUpdater.mInternetAvailable = false; mInternetUpdater.mInternetAvailable = false;
mInternetUpdater.update(); mInternetUpdater.updateInternetType();
assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_NETWORKS_AVAILABLE); assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_NETWORKS_AVAILABLE);
} }
@Test @Test
public void update_apmOnWifiConnected_getInternetWifi() { public void updateInternetType_apmOnWifiConnected_getInternetWifi() {
doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn(); doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn();
doReturn(true).when(mWifiManager).isWifiEnabled(); doReturn(true).when(mWifiManager).isWifiEnabled();
mInternetUpdater.mInternetAvailable = true; mInternetUpdater.mInternetAvailable = true;
mInternetUpdater.mTransport = TRANSPORT_WIFI; mInternetUpdater.mTransport = TRANSPORT_WIFI;
mInternetUpdater.update(); mInternetUpdater.updateInternetType();
assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_WIFI); assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_WIFI);
} }
@Test @Test
public void update_apmOnCellularConnected_getInternetCellular() { public void updateInternetType_apmOnCellularConnected_getInternetCellular() {
doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn(); doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn();
mInternetUpdater.mInternetAvailable = true; mInternetUpdater.mInternetAvailable = true;
mInternetUpdater.mTransport = TRANSPORT_CELLULAR; mInternetUpdater.mTransport = TRANSPORT_CELLULAR;
mInternetUpdater.update(); mInternetUpdater.updateInternetType();
assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_CELLULAR); assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_CELLULAR);
} }
@Test @Test
public void update_apmOnEthernetConnected_getInternetEthernet() { public void updateInternetType_apmOnEthernetConnected_getInternetEthernet() {
doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn(); doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn();
mInternetUpdater.mInternetAvailable = true; mInternetUpdater.mInternetAvailable = true;
mInternetUpdater.mTransport = TRANSPORT_ETHERNET; mInternetUpdater.mTransport = TRANSPORT_ETHERNET;
mInternetUpdater.update(); mInternetUpdater.updateInternetType();
assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_ETHERNET); assertThat(mInternetUpdater.getInternetType()).isEqualTo(INTERNET_ETHERNET);
} }

View File

@@ -236,7 +236,8 @@ public class ProviderModelSliceTest {
mWifiList.add(mMockWifiSliceItem2); mWifiList.add(mMockWifiSliceItem2);
mMockNetworkProviderWorker.updateSelfResults(mWifiList); mMockNetworkProviderWorker.updateSelfResults(mWifiList);
mockHelperCondition(false, true, true, null); mockHelperCondition(false, true, true, null);
when(mMockNetworkProviderWorker.isEthernetConnected()).thenReturn(true); when(mMockNetworkProviderWorker.getInternetType())
.thenReturn(InternetUpdater.INTERNET_ETHERNET);
final Slice slice = mMockProviderModelSlice.getSlice(); final Slice slice = mMockProviderModelSlice.getSlice();
@@ -258,7 +259,8 @@ public class ProviderModelSliceTest {
mWifiList.add(mMockWifiSliceItem2); mWifiList.add(mMockWifiSliceItem2);
mMockNetworkProviderWorker.updateSelfResults(mWifiList); mMockNetworkProviderWorker.updateSelfResults(mWifiList);
mockHelperCondition(false, true, true, mWifiList.get(0)); mockHelperCondition(false, true, true, mWifiList.get(0));
when(mMockNetworkProviderWorker.isEthernetConnected()).thenReturn(true); when(mMockNetworkProviderWorker.getInternetType())
.thenReturn(InternetUpdater.INTERNET_ETHERNET);
final Slice slice = mMockProviderModelSlice.getSlice(); final Slice slice = mMockProviderModelSlice.getSlice();

View File

@@ -261,24 +261,24 @@ public class NetworkProviderWorkerTest {
} }
@Test @Test
public void isEthernetConnected_connectedEthernet_shouldBeTrue() { public void getInternetType_connectedEthernet_returnInternetEthernet() {
mMockNetworkProviderWorker.onInternetTypeChanged(INTERNET_ETHERNET); mMockNetworkProviderWorker.onInternetTypeChanged(INTERNET_ETHERNET);
assertThat(mMockNetworkProviderWorker.isEthernetConnected()).isTrue(); assertThat(mMockNetworkProviderWorker.getInternetType()).isEqualTo(INTERNET_ETHERNET);
} }
@Test @Test
public void isEthernetConnected_connectedWifi_shouldBeFalse() { public void getInternetType_connectedWifi_returnInternetWifi() {
mMockNetworkProviderWorker.onInternetTypeChanged(INTERNET_WIFI); mMockNetworkProviderWorker.onInternetTypeChanged(INTERNET_WIFI);
assertThat(mMockNetworkProviderWorker.isEthernetConnected()).isFalse(); assertThat(mMockNetworkProviderWorker.getInternetType()).isEqualTo(INTERNET_WIFI);
} }
@Test @Test
public void isEthernetConnected_connectedCarrier_shouldBeFalse() { public void getInternetType__connectedCarrier_returnInternetCellular() {
mMockNetworkProviderWorker.onInternetTypeChanged(INTERNET_CELLULAR); mMockNetworkProviderWorker.onInternetTypeChanged(INTERNET_CELLULAR);
assertThat(mMockNetworkProviderWorker.isEthernetConnected()).isFalse(); assertThat(mMockNetworkProviderWorker.getInternetType()).isEqualTo(INTERNET_CELLULAR);
} }
public class MockNetworkProviderWorker extends NetworkProviderWorker { public class MockNetworkProviderWorker extends NetworkProviderWorker {