Merge "Add getAvoidBadWifi system API" am: 58582a36fc

am: 656f2fa71a

Change-Id: Ide4ffc316c9301b795e8c0dabea3322aaf0b3184
This commit is contained in:
Remi NGUYEN VAN
2019-01-22 17:53:09 -08:00
committed by android-build-merger
8 changed files with 51 additions and 28 deletions

View File

@@ -3033,6 +3033,7 @@ package android.net {
}
public class ConnectivityManager {
method public boolean getAvoidBadWifi();
method @RequiresPermission(android.Manifest.permission.LOCAL_MAC_ADDRESS) public String getCaptivePortalServerUrl();
method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public boolean isTetheringSupported();
method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void setAirplaneMode(boolean);

View File

@@ -3698,6 +3698,19 @@ public class ConnectivityManager {
}
}
/**
* Determine whether the device is configured to avoid bad wifi.
* @hide
*/
@SystemApi
public boolean getAvoidBadWifi() {
try {
return mService.getAvoidBadWifi();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
* It is acceptable to briefly use multipath data to provide seamless connectivity for
* time-sensitive user-facing operations when the system default network is temporarily

View File

@@ -165,6 +165,7 @@ interface IConnectivityManager
void setAvoidUnvalidated(in Network network);
void startCaptivePortalApp(in Network network);
boolean getAvoidBadWifi();
int getMultipathPreference(in Network Network);
NetworkRequest getDefaultRequest();

View File

@@ -3183,6 +3183,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
return mMultinetworkPolicyTracker.getAvoidBadWifi();
}
@Override
public boolean getAvoidBadWifi() {
if (!checkNetworkStackPermission()) {
throw new SecurityException("avoidBadWifi requires NETWORK_STACK permission");
}
return avoidBadWifi();
}
private void rematchForAvoidBadWifiUpdate() {
rematchAllNetworksAndRequests(null, 0);
for (NetworkAgentInfo nai: mNetworkAgentInfos.values()) {

View File

@@ -19,6 +19,7 @@ package android.net.ip;
import static android.net.shared.LinkPropertiesParcelableUtil.fromStableParcelable;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.DhcpResults;
import android.net.INetd;
import android.net.IpPrefix;
@@ -37,7 +38,6 @@ import android.net.metrics.IpConnectivityLog;
import android.net.metrics.IpManagerEvent;
import android.net.shared.InitialConfiguration;
import android.net.util.InterfaceParams;
import android.net.util.MultinetworkPolicyTracker;
import android.net.util.NetdService;
import android.net.util.SharedLog;
import android.os.ConditionVariable;
@@ -391,6 +391,7 @@ public class IpClient extends StateMachine {
protected final IpClientCallbacks mCallback;
private final Dependencies mDependencies;
private final CountDownLatch mShutdownLatch;
private final ConnectivityManager mCm;
private final INetworkManagementService mNwService;
private final NetlinkTracker mNetlinkTracker;
private final WakeupMessage mProvisioningTimeoutAlarm;
@@ -408,7 +409,6 @@ public class IpClient extends StateMachine {
*/
private LinkProperties mLinkProperties;
private android.net.shared.ProvisioningConfiguration mConfiguration;
private MultinetworkPolicyTracker mMultinetworkPolicyTracker;
private IpReachabilityMonitor mIpReachabilityMonitor;
private DhcpClient mDhcpClient;
private DhcpResults mDhcpResults;
@@ -476,6 +476,7 @@ public class IpClient extends StateMachine {
mCallback = new LoggingCallbackWrapper(callback);
mDependencies = deps;
mShutdownLatch = new CountDownLatch(1);
mCm = mContext.getSystemService(ConnectivityManager.class);
mNwService = deps.getNMS();
sSmLogs.putIfAbsent(mInterfaceName, new SharedLog(MAX_LOG_RECORDS, mTag));
@@ -961,8 +962,9 @@ public class IpClient extends StateMachine {
// Note that we can still be disconnected by IpReachabilityMonitor
// if the IPv6 default gateway (but not the IPv6 DNS servers; see
// accompanying code in IpReachabilityMonitor) is unreachable.
final boolean ignoreIPv6ProvisioningLoss = (mMultinetworkPolicyTracker != null)
&& !mMultinetworkPolicyTracker.getAvoidBadWifi();
final boolean ignoreIPv6ProvisioningLoss =
mConfiguration != null && mConfiguration.mUsingMultinetworkPolicyTracker
&& mCm.getAvoidBadWifi();
// Additionally:
//
@@ -1253,7 +1255,7 @@ public class IpClient extends StateMachine {
mCallback.onReachabilityLost(logMsg);
}
},
mMultinetworkPolicyTracker);
mConfiguration.mUsingMultinetworkPolicyTracker);
} catch (IllegalArgumentException iae) {
// Failed to start IpReachabilityMonitor. Log it and call
// onProvisioningFailure() immediately.
@@ -1486,13 +1488,6 @@ public class IpClient extends StateMachine {
return;
}
if (mConfiguration.mUsingMultinetworkPolicyTracker) {
mMultinetworkPolicyTracker = new MultinetworkPolicyTracker(
mContext, getHandler(),
() -> mLog.log("OBSERVED AvoidBadWifi changed"));
mMultinetworkPolicyTracker.start();
}
if (mConfiguration.mUsingIpReachabilityMonitor && !startIpReachabilityMonitor()) {
doImmediateProvisioningFailure(
IpManagerEvent.ERROR_STARTING_IPREACHABILITYMONITOR);
@@ -1510,11 +1505,6 @@ public class IpClient extends StateMachine {
mIpReachabilityMonitor = null;
}
if (mMultinetworkPolicyTracker != null) {
mMultinetworkPolicyTracker.shutdown();
mMultinetworkPolicyTracker = null;
}
if (mDhcpClient != null) {
mDhcpClient.sendMessage(DhcpClient.CMD_STOP_DHCP);
mDhcpClient.doQuit();

View File

@@ -22,6 +22,7 @@ import static android.net.metrics.IpReachabilityEvent.PROVISIONING_LOST;
import static android.net.metrics.IpReachabilityEvent.PROVISIONING_LOST_ORGANIC;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.LinkProperties;
import android.net.RouteInfo;
import android.net.ip.IpNeighborMonitor.NeighborEvent;
@@ -29,7 +30,6 @@ import android.net.metrics.IpConnectivityLog;
import android.net.metrics.IpReachabilityEvent;
import android.net.netlink.StructNdMsg;
import android.net.util.InterfaceParams;
import android.net.util.MultinetworkPolicyTracker;
import android.net.util.SharedLog;
import android.os.Handler;
import android.os.PowerManager;
@@ -165,7 +165,8 @@ public class IpReachabilityMonitor {
private final SharedLog mLog;
private final Callback mCallback;
private final Dependencies mDependencies;
private final MultinetworkPolicyTracker mMultinetworkPolicyTracker;
private final boolean mUsingMultinetworkPolicyTracker;
private final ConnectivityManager mCm;
private final IpConnectivityLog mMetricsLog = new IpConnectivityLog();
private LinkProperties mLinkProperties = new LinkProperties();
private Map<InetAddress, NeighborEvent> mNeighborWatchList = new HashMap<>();
@@ -174,19 +175,21 @@ public class IpReachabilityMonitor {
public IpReachabilityMonitor(
Context context, InterfaceParams ifParams, Handler h, SharedLog log, Callback callback,
MultinetworkPolicyTracker tracker) {
this(ifParams, h, log, callback, tracker, Dependencies.makeDefault(context, ifParams.name));
boolean usingMultinetworkPolicyTracker) {
this(context, ifParams, h, log, callback, usingMultinetworkPolicyTracker,
Dependencies.makeDefault(context, ifParams.name));
}
@VisibleForTesting
IpReachabilityMonitor(InterfaceParams ifParams, Handler h, SharedLog log, Callback callback,
MultinetworkPolicyTracker tracker, Dependencies dependencies) {
IpReachabilityMonitor(Context context, InterfaceParams ifParams, Handler h, SharedLog log,
Callback callback, boolean usingMultinetworkPolicyTracker, Dependencies dependencies) {
if (ifParams == null) throw new IllegalArgumentException("null InterfaceParams");
mInterfaceParams = ifParams;
mLog = log.forSubComponent(TAG);
mCallback = callback;
mMultinetworkPolicyTracker = tracker;
mUsingMultinetworkPolicyTracker = usingMultinetworkPolicyTracker;
mCm = context.getSystemService(ConnectivityManager.class);
mDependencies = dependencies;
mIpNeighborMonitor = new IpNeighborMonitor(h, mLog,
@@ -324,7 +327,7 @@ public class IpReachabilityMonitor {
}
private boolean avoidingBadLinks() {
return (mMultinetworkPolicyTracker == null) || mMultinetworkPolicyTracker.getAvoidBadWifi();
return !mUsingMultinetworkPolicyTracker || mCm.getAvoidBadWifi();
}
public void probeAll() {

View File

@@ -33,6 +33,7 @@ import static org.mockito.Mockito.when;
import android.app.AlarmManager;
import android.content.Context;
import android.content.res.Resources;
import android.net.ConnectivityManager;
import android.net.INetd;
import android.net.IpPrefix;
import android.net.LinkAddress;
@@ -82,6 +83,7 @@ public class IpClientTest {
private static final int TEST_TIMEOUT_MS = 400;
@Mock private Context mContext;
@Mock private ConnectivityManager mCm;
@Mock private INetworkManagementService mNMService;
@Mock private INetd mNetd;
@Mock private Resources mResources;
@@ -98,6 +100,9 @@ public class IpClientTest {
MockitoAnnotations.initMocks(this);
when(mContext.getSystemService(eq(Context.ALARM_SERVICE))).thenReturn(mAlarm);
when(mContext.getSystemServiceName(ConnectivityManager.class))
.thenReturn(Context.CONNECTIVITY_SERVICE);
when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn(mCm);
when(mContext.getResources()).thenReturn(mResources);
when(mResources.getInteger(R.integer.config_networkAvoidBadWifi))
.thenReturn(DEFAULT_AVOIDBADWIFI_CONFIG_VALUE);

View File

@@ -16,11 +16,10 @@
package android.net.ip;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.net.util.InterfaceParams;
import android.net.util.SharedLog;
import android.os.Handler;
@@ -45,6 +44,7 @@ public class IpReachabilityMonitorTest {
@Mock IpReachabilityMonitor.Callback mCallback;
@Mock IpReachabilityMonitor.Dependencies mDependencies;
@Mock SharedLog mLog;
@Mock Context mContext;
Handler mHandler;
@Before
@@ -56,7 +56,8 @@ public class IpReachabilityMonitorTest {
IpReachabilityMonitor makeMonitor() {
final InterfaceParams ifParams = new InterfaceParams("fake0", 1, null);
return new IpReachabilityMonitor(ifParams, mHandler, mLog, mCallback, null, mDependencies);
return new IpReachabilityMonitor(
mContext, ifParams, mHandler, mLog, mCallback, false, mDependencies);
}
@Test