Loading api/system-current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -3981,6 +3981,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); Loading core/java/android/net/ConnectivityManager.java +13 −0 Original line number Diff line number Diff line Loading @@ -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 Loading core/java/android/net/IConnectivityManager.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading services/core/java/com/android/server/ConnectivityService.java +9 −0 Original line number Diff line number Diff line Loading @@ -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()) { Loading services/net/java/android/net/ip/IpClient.java +7 −17 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -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)); Loading Loading @@ -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: // Loading Loading @@ -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. Loading Loading @@ -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); Loading @@ -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(); Loading Loading
api/system-current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -3981,6 +3981,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); Loading
core/java/android/net/ConnectivityManager.java +13 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
core/java/android/net/IConnectivityManager.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading
services/core/java/com/android/server/ConnectivityService.java +9 −0 Original line number Diff line number Diff line Loading @@ -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()) { Loading
services/net/java/android/net/ip/IpClient.java +7 −17 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -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)); Loading Loading @@ -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: // Loading Loading @@ -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. Loading Loading @@ -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); Loading @@ -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(); Loading