Try reconnecting to wifi if it doesn't automatically connect. am: 8bb9eb1912 am: bc0ca639a2

Original change: https://android-review.googlesource.com/c/platform/packages/modules/Connectivity/+/1648670

Change-Id: Ief4defadb6e4f5b45a7ef3d3022953244eca4788
This commit is contained in:
Sudheer Shanka
2021-03-22 21:14:50 +00:00
committed by Automerger Merge Worker

View File

@@ -22,12 +22,13 @@ import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELI
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI; import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.net.wifi.WifiConfiguration.METERED_OVERRIDE_METERED;
import static android.net.wifi.WifiConfiguration.METERED_OVERRIDE_NONE;
import static com.android.compatibility.common.util.SystemUtil.runShellCommand; import static com.android.compatibility.common.util.SystemUtil.runShellCommand;
import static com.android.cts.net.hostside.AbstractRestrictBackgroundNetworkTestCase.TAG; import static com.android.cts.net.hostside.AbstractRestrictBackgroundNetworkTestCase.TAG;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
@@ -35,19 +36,21 @@ import static org.junit.Assert.fail;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.app.Instrumentation; import android.app.Instrumentation;
import android.app.UiAutomation;
import android.content.Context; import android.content.Context;
import android.location.LocationManager; import android.location.LocationManager;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback; import android.net.ConnectivityManager.NetworkCallback;
import android.net.Network; import android.net.Network;
import android.net.NetworkCapabilities; import android.net.NetworkCapabilities;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.ActionListener;
import android.os.PersistableBundle; import android.os.PersistableBundle;
import android.os.Process; import android.os.Process;
import android.telephony.CarrierConfigManager; import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.data.ApnSetting; import android.telephony.data.ApnSetting;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.platform.app.InstrumentationRegistry;
@@ -57,7 +60,12 @@ import com.android.compatibility.common.util.BatteryUtils;
import com.android.compatibility.common.util.ShellIdentityUtils; import com.android.compatibility.common.util.ShellIdentityUtils;
import com.android.compatibility.common.util.ThrowingRunnable; import com.android.compatibility.common.util.ThrowingRunnable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class NetworkPolicyTestUtils { public class NetworkPolicyTestUtils {
@@ -182,19 +190,14 @@ public class NetworkPolicyTestUtils {
} }
private static String getWifiSsid() { private static String getWifiSsid() {
final boolean isLocationEnabled = isLocationEnabled(); final UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
try { try {
if (!isLocationEnabled) { uiAutomation.adoptShellPermissionIdentity();
setLocationEnabled(true); final String ssid = getWifiManager().getConnectionInfo().getSSID();
}
final String ssid = unquoteSSID(getWifiManager().getConnectionInfo().getSSID());
assertNotEquals(WifiManager.UNKNOWN_SSID, ssid); assertNotEquals(WifiManager.UNKNOWN_SSID, ssid);
return ssid; return ssid;
} finally { } finally {
// Reset the location enabled state uiAutomation.dropShellPermissionIdentity();
if (!isLocationEnabled) {
setLocationEnabled(false);
}
} }
} }
@@ -205,18 +208,71 @@ public class NetworkPolicyTestUtils {
} }
private static void setWifiMeteredStatus(String ssid, boolean metered) throws Exception { private static void setWifiMeteredStatus(String ssid, boolean metered) throws Exception {
assertFalse("SSID should not be empty", TextUtils.isEmpty(ssid)); final UiAutomation uiAutomation = getInstrumentation().getUiAutomation();
final String cmd = "cmd netpolicy set metered-network " + ssid + " " + metered; try {
executeShellCommand(cmd); uiAutomation.adoptShellPermissionIdentity();
assertWifiMeteredStatus(ssid, metered); final WifiConfiguration currentConfig = getWifiConfiguration(ssid);
assertActiveNetworkMetered(metered); currentConfig.meteredOverride = metered
? METERED_OVERRIDE_METERED : METERED_OVERRIDE_NONE;
BlockingQueue<Integer> blockingQueue = new LinkedBlockingQueue<>();
getWifiManager().save(currentConfig, createActionListener(
blockingQueue, Integer.MAX_VALUE));
Integer resultCode = blockingQueue.poll(TIMEOUT_CHANGE_METEREDNESS_MS,
TimeUnit.MILLISECONDS);
if (resultCode == null) {
fail("Timed out waiting for meteredness to change; ssid=" + ssid
+ ", metered=" + metered);
} else if (resultCode != Integer.MAX_VALUE) {
fail("Error overriding the meteredness; ssid=" + ssid
+ ", metered=" + metered + ", error=" + resultCode);
}
final boolean success = assertActiveNetworkMetered(metered, false /* throwOnFailure */);
if (!success) {
Log.i(TAG, "Retry connecting to wifi; ssid=" + ssid);
blockingQueue = new LinkedBlockingQueue<>();
getWifiManager().connect(currentConfig, createActionListener(
blockingQueue, Integer.MAX_VALUE));
resultCode = blockingQueue.poll(TIMEOUT_CHANGE_METEREDNESS_MS,
TimeUnit.MILLISECONDS);
if (resultCode == null) {
fail("Timed out waiting for wifi to connect; ssid=" + ssid);
} else if (resultCode != Integer.MAX_VALUE) {
fail("Error connecting to wifi; ssid=" + ssid
+ ", error=" + resultCode);
}
assertActiveNetworkMetered(metered, true /* throwOnFailure */);
}
} finally {
uiAutomation.dropShellPermissionIdentity();
}
} }
private static void assertWifiMeteredStatus(String ssid, boolean expectedMeteredStatus) { private static WifiConfiguration getWifiConfiguration(String ssid) {
final String result = executeShellCommand("cmd netpolicy list wifi-networks"); final List<String> ssids = new ArrayList<>();
final String expectedLine = ssid + ";" + expectedMeteredStatus; for (WifiConfiguration config : getWifiManager().getConfiguredNetworks()) {
assertTrue("Expected line: " + expectedLine + "; Actual result: " + result, if (config.SSID.equals(ssid)) {
result.contains(expectedLine)); return config;
}
ssids.add(config.SSID);
}
fail("Couldn't find the wifi config; ssid=" + ssid
+ ", all=" + Arrays.toString(ssids.toArray()));
return null;
}
private static ActionListener createActionListener(BlockingQueue<Integer> blockingQueue,
int successCode) {
return new ActionListener() {
@Override
public void onSuccess() {
blockingQueue.offer(successCode);
}
@Override
public void onFailure(int reason) {
blockingQueue.offer(reason);
}
};
} }
private static void setCellularMeteredStatus(int subId, boolean metered) throws Exception { private static void setCellularMeteredStatus(int subId, boolean metered) throws Exception {
@@ -225,11 +281,11 @@ public class NetworkPolicyTestUtils {
new String[] {ApnSetting.TYPE_MMS_STRING}); new String[] {ApnSetting.TYPE_MMS_STRING});
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(getCarrierConfigManager(), ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(getCarrierConfigManager(),
(cm) -> cm.overrideConfig(subId, metered ? null : bundle)); (cm) -> cm.overrideConfig(subId, metered ? null : bundle));
assertActiveNetworkMetered(metered); assertActiveNetworkMetered(metered, true /* throwOnFailure */);
} }
// Copied from cts/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java private static boolean assertActiveNetworkMetered(boolean expectedMeteredStatus,
private static void assertActiveNetworkMetered(boolean expectedMeteredStatus) throws Exception { boolean throwOnFailure) throws Exception {
final CountDownLatch latch = new CountDownLatch(1); final CountDownLatch latch = new CountDownLatch(1);
final NetworkCallback networkCallback = new NetworkCallback() { final NetworkCallback networkCallback = new NetworkCallback() {
@Override @Override
@@ -246,10 +302,16 @@ public class NetworkPolicyTestUtils {
getConnectivityManager().registerDefaultNetworkCallback(networkCallback); getConnectivityManager().registerDefaultNetworkCallback(networkCallback);
try { try {
if (!latch.await(TIMEOUT_CHANGE_METEREDNESS_MS, TimeUnit.MILLISECONDS)) { if (!latch.await(TIMEOUT_CHANGE_METEREDNESS_MS, TimeUnit.MILLISECONDS)) {
fail("Timed out waiting for active network metered status to change to " final String errorMsg = "Timed out waiting for active network metered status "
+ expectedMeteredStatus + "; network = " + "to change to " + expectedMeteredStatus + "; network = "
+ getConnectivityManager().getActiveNetwork()); + getConnectivityManager().getActiveNetwork();
if (throwOnFailure) {
fail(errorMsg);
} }
Log.w(TAG, errorMsg);
return false;
}
return true;
} finally { } finally {
getConnectivityManager().unregisterNetworkCallback(networkCallback); getConnectivityManager().unregisterNetworkCallback(networkCallback);
} }