Loading services/core/java/com/android/server/ConnectivityService.java +1 −0 Original line number Diff line number Diff line Loading @@ -856,6 +856,7 @@ public class ConnectivityService extends IConnectivityManager.Stub mAvoidBadWifiTracker = createAvoidBadWifiTracker( mContext, mHandler, () -> rematchForAvoidBadWifiUpdate()); mAvoidBadWifiTracker.start(); } private NetworkRequest createInternetRequestForTransport( Loading services/net/java/android/net/ip/IpManager.java +46 −11 Original line number Diff line number Diff line Loading @@ -438,6 +438,9 @@ public class IpManager extends StateMachine { mCallback = new LoggingCallbackWrapper(callback); mNwService = nwService; mLocalLog = new LocalLog(MAX_LOG_RECORDS); mMsgStateLogger = new MessageHandlingLogger(); mNetlinkTracker = new NetlinkTracker( mInterfaceName, new NetlinkTracker.Callback() { Loading @@ -451,48 +454,79 @@ public class IpManager extends StateMachine { super.interfaceAdded(iface); if (mClatInterfaceName.equals(iface)) { mCallback.setNeighborDiscoveryOffload(false); } else if (!mInterfaceName.equals(iface)) { return; } final String msg = "interfaceAdded(" + iface +")"; logMsg(msg); } @Override public void interfaceRemoved(String iface) { super.interfaceRemoved(iface); // TODO: Also observe mInterfaceName going down and take some // kind of appropriate action. if (mClatInterfaceName.equals(iface)) { // TODO: consider sending a message to the IpManager main // StateMachine thread, in case "NDO enabled" state becomes // tied to more things that 464xlat operation. mCallback.setNeighborDiscoveryOffload(true); } else if (!mInterfaceName.equals(iface)) { return; } final String msg = "interfaceRemoved(" + iface +")"; logMsg(msg); } }; try { mNwService.registerObserver(mNetlinkTracker); } catch (RemoteException e) { Log.e(mTag, "Couldn't register NetlinkTracker: " + e.toString()); private void logMsg(String msg) { Log.d(mTag, msg); getHandler().post(() -> { mLocalLog.log("OBSERVED " + msg); }); } }; mAvoidBadWifiTracker = new AvoidBadWifiTracker(mContext, getHandler()); mLinkProperties = new LinkProperties(); mLinkProperties.setInterfaceName(mInterfaceName); resetLinkProperties(); mAvoidBadWifiTracker = new AvoidBadWifiTracker(mContext, getHandler(), () -> { mLocalLog.log("OBSERVED AvoidBadWifi changed"); }); mProvisioningTimeoutAlarm = new WakeupMessage(mContext, getHandler(), mTag + ".EVENT_PROVISIONING_TIMEOUT", EVENT_PROVISIONING_TIMEOUT); mDhcpActionTimeoutAlarm = new WakeupMessage(mContext, getHandler(), mTag + ".EVENT_DHCPACTION_TIMEOUT", EVENT_DHCPACTION_TIMEOUT); // Super simple StateMachine. // Anything the StateMachine may access must have been instantiated // before this point. configureAndStartStateMachine(); // Anything that may send messages to the StateMachine must only be // configured to do so after the StateMachine has started (above). startStateMachineUpdaters(); } private void configureAndStartStateMachine() { addState(mStoppedState); addState(mStartedState); addState(mRunningState, mStartedState); addState(mStoppingState); setInitialState(mStoppedState); mLocalLog = new LocalLog(MAX_LOG_RECORDS); mMsgStateLogger = new MessageHandlingLogger(); super.start(); } private void startStateMachineUpdaters() { try { mNwService.registerObserver(mNetlinkTracker); } catch (RemoteException e) { Log.e(mTag, "Couldn't register NetlinkTracker: " + e.toString()); } mAvoidBadWifiTracker.start(); } @Override protected void onQuitting() { mCallback.onQuit(); Loading @@ -501,6 +535,7 @@ public class IpManager extends StateMachine { // Shut down this IpManager instance altogether. public void shutdown() { stop(); mAvoidBadWifiTracker.shutdown(); quit(); } Loading services/net/java/android/net/util/AvoidBadWifiTracker.java +27 −11 Original line number Diff line number Diff line Loading @@ -57,7 +57,11 @@ public class AvoidBadWifiTracker { private final Context mContext; private final Handler mHandler; private final Runnable mReevaluateRunnable; private final Uri mUri; private final ContentResolver mResolver; private final SettingObserver mSettingObserver; private final BroadcastReceiver mBroadcastReceiver; private volatile boolean mAvoidBadWifi = true; public AvoidBadWifiTracker(Context ctx, Handler handler) { Loading @@ -68,17 +72,34 @@ public class AvoidBadWifiTracker { mContext = ctx; mHandler = handler; mReevaluateRunnable = () -> { if (update() && cb != null) cb.run(); }; mUri = Settings.Global.getUriFor(NETWORK_AVOID_BAD_WIFI); mResolver = mContext.getContentResolver(); mSettingObserver = new SettingObserver(); mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { reevaluate(); } }; update(); } public void start() { mResolver.registerContentObserver(mUri, false, mSettingObserver); final IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); mContext.registerReceiverAsUser(new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { mContext.registerReceiverAsUser( mBroadcastReceiver, UserHandle.ALL, intentFilter, null, null); reevaluate(); } }, UserHandle.ALL, intentFilter, null, null); update(); public void shutdown() { mResolver.unregisterContentObserver(mSettingObserver); mContext.unregisterReceiver(mBroadcastReceiver); } public boolean currentValue() { Loading @@ -100,8 +121,7 @@ public class AvoidBadWifiTracker { } public String getSettingsValue() { final ContentResolver resolver = mContext.getContentResolver(); return Settings.Global.getString(resolver, NETWORK_AVOID_BAD_WIFI); return Settings.Global.getString(mResolver, NETWORK_AVOID_BAD_WIFI); } @VisibleForTesting Loading @@ -117,12 +137,8 @@ public class AvoidBadWifiTracker { } private class SettingObserver extends ContentObserver { private final Uri mUri = Settings.Global.getUriFor(NETWORK_AVOID_BAD_WIFI); public SettingObserver() { super(null); final ContentResolver resolver = mContext.getContentResolver(); resolver.registerContentObserver(mUri, false, this); } @Override Loading Loading
services/core/java/com/android/server/ConnectivityService.java +1 −0 Original line number Diff line number Diff line Loading @@ -856,6 +856,7 @@ public class ConnectivityService extends IConnectivityManager.Stub mAvoidBadWifiTracker = createAvoidBadWifiTracker( mContext, mHandler, () -> rematchForAvoidBadWifiUpdate()); mAvoidBadWifiTracker.start(); } private NetworkRequest createInternetRequestForTransport( Loading
services/net/java/android/net/ip/IpManager.java +46 −11 Original line number Diff line number Diff line Loading @@ -438,6 +438,9 @@ public class IpManager extends StateMachine { mCallback = new LoggingCallbackWrapper(callback); mNwService = nwService; mLocalLog = new LocalLog(MAX_LOG_RECORDS); mMsgStateLogger = new MessageHandlingLogger(); mNetlinkTracker = new NetlinkTracker( mInterfaceName, new NetlinkTracker.Callback() { Loading @@ -451,48 +454,79 @@ public class IpManager extends StateMachine { super.interfaceAdded(iface); if (mClatInterfaceName.equals(iface)) { mCallback.setNeighborDiscoveryOffload(false); } else if (!mInterfaceName.equals(iface)) { return; } final String msg = "interfaceAdded(" + iface +")"; logMsg(msg); } @Override public void interfaceRemoved(String iface) { super.interfaceRemoved(iface); // TODO: Also observe mInterfaceName going down and take some // kind of appropriate action. if (mClatInterfaceName.equals(iface)) { // TODO: consider sending a message to the IpManager main // StateMachine thread, in case "NDO enabled" state becomes // tied to more things that 464xlat operation. mCallback.setNeighborDiscoveryOffload(true); } else if (!mInterfaceName.equals(iface)) { return; } final String msg = "interfaceRemoved(" + iface +")"; logMsg(msg); } }; try { mNwService.registerObserver(mNetlinkTracker); } catch (RemoteException e) { Log.e(mTag, "Couldn't register NetlinkTracker: " + e.toString()); private void logMsg(String msg) { Log.d(mTag, msg); getHandler().post(() -> { mLocalLog.log("OBSERVED " + msg); }); } }; mAvoidBadWifiTracker = new AvoidBadWifiTracker(mContext, getHandler()); mLinkProperties = new LinkProperties(); mLinkProperties.setInterfaceName(mInterfaceName); resetLinkProperties(); mAvoidBadWifiTracker = new AvoidBadWifiTracker(mContext, getHandler(), () -> { mLocalLog.log("OBSERVED AvoidBadWifi changed"); }); mProvisioningTimeoutAlarm = new WakeupMessage(mContext, getHandler(), mTag + ".EVENT_PROVISIONING_TIMEOUT", EVENT_PROVISIONING_TIMEOUT); mDhcpActionTimeoutAlarm = new WakeupMessage(mContext, getHandler(), mTag + ".EVENT_DHCPACTION_TIMEOUT", EVENT_DHCPACTION_TIMEOUT); // Super simple StateMachine. // Anything the StateMachine may access must have been instantiated // before this point. configureAndStartStateMachine(); // Anything that may send messages to the StateMachine must only be // configured to do so after the StateMachine has started (above). startStateMachineUpdaters(); } private void configureAndStartStateMachine() { addState(mStoppedState); addState(mStartedState); addState(mRunningState, mStartedState); addState(mStoppingState); setInitialState(mStoppedState); mLocalLog = new LocalLog(MAX_LOG_RECORDS); mMsgStateLogger = new MessageHandlingLogger(); super.start(); } private void startStateMachineUpdaters() { try { mNwService.registerObserver(mNetlinkTracker); } catch (RemoteException e) { Log.e(mTag, "Couldn't register NetlinkTracker: " + e.toString()); } mAvoidBadWifiTracker.start(); } @Override protected void onQuitting() { mCallback.onQuit(); Loading @@ -501,6 +535,7 @@ public class IpManager extends StateMachine { // Shut down this IpManager instance altogether. public void shutdown() { stop(); mAvoidBadWifiTracker.shutdown(); quit(); } Loading
services/net/java/android/net/util/AvoidBadWifiTracker.java +27 −11 Original line number Diff line number Diff line Loading @@ -57,7 +57,11 @@ public class AvoidBadWifiTracker { private final Context mContext; private final Handler mHandler; private final Runnable mReevaluateRunnable; private final Uri mUri; private final ContentResolver mResolver; private final SettingObserver mSettingObserver; private final BroadcastReceiver mBroadcastReceiver; private volatile boolean mAvoidBadWifi = true; public AvoidBadWifiTracker(Context ctx, Handler handler) { Loading @@ -68,17 +72,34 @@ public class AvoidBadWifiTracker { mContext = ctx; mHandler = handler; mReevaluateRunnable = () -> { if (update() && cb != null) cb.run(); }; mUri = Settings.Global.getUriFor(NETWORK_AVOID_BAD_WIFI); mResolver = mContext.getContentResolver(); mSettingObserver = new SettingObserver(); mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { reevaluate(); } }; update(); } public void start() { mResolver.registerContentObserver(mUri, false, mSettingObserver); final IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); mContext.registerReceiverAsUser(new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { mContext.registerReceiverAsUser( mBroadcastReceiver, UserHandle.ALL, intentFilter, null, null); reevaluate(); } }, UserHandle.ALL, intentFilter, null, null); update(); public void shutdown() { mResolver.unregisterContentObserver(mSettingObserver); mContext.unregisterReceiver(mBroadcastReceiver); } public boolean currentValue() { Loading @@ -100,8 +121,7 @@ public class AvoidBadWifiTracker { } public String getSettingsValue() { final ContentResolver resolver = mContext.getContentResolver(); return Settings.Global.getString(resolver, NETWORK_AVOID_BAD_WIFI); return Settings.Global.getString(mResolver, NETWORK_AVOID_BAD_WIFI); } @VisibleForTesting Loading @@ -117,12 +137,8 @@ public class AvoidBadWifiTracker { } private class SettingObserver extends ContentObserver { private final Uri mUri = Settings.Global.getUriFor(NETWORK_AVOID_BAD_WIFI); public SettingObserver() { super(null); final ContentResolver resolver = mContext.getContentResolver(); resolver.registerContentObserver(mUri, false, this); } @Override Loading