Merge "More correct startup and shutdown procedures."
am: 618d4215a2
Change-Id: I4844130b04ded0fc913593081d07a6052bdc0e42
This commit is contained in:
@ -856,6 +856,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
|
||||
mAvoidBadWifiTracker = createAvoidBadWifiTracker(
|
||||
mContext, mHandler, () -> rematchForAvoidBadWifiUpdate());
|
||||
mAvoidBadWifiTracker.start();
|
||||
}
|
||||
|
||||
private NetworkRequest createInternetRequestForTransport(
|
||||
|
@ -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() {
|
||||
@ -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);
|
||||
}
|
||||
|
||||
private void logMsg(String msg) {
|
||||
Log.d(mTag, msg);
|
||||
getHandler().post(() -> { mLocalLog.log("OBSERVED " + msg); });
|
||||
}
|
||||
};
|
||||
|
||||
try {
|
||||
mNwService.registerObserver(mNetlinkTracker);
|
||||
} catch (RemoteException e) {
|
||||
Log.e(mTag, "Couldn't register NetlinkTracker: " + e.toString());
|
||||
}
|
||||
mLinkProperties = new LinkProperties();
|
||||
mLinkProperties.setInterfaceName(mInterfaceName);
|
||||
|
||||
mAvoidBadWifiTracker = new AvoidBadWifiTracker(mContext, getHandler());
|
||||
|
||||
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();
|
||||
@ -501,6 +535,7 @@ public class IpManager extends StateMachine {
|
||||
// Shut down this IpManager instance altogether.
|
||||
public void shutdown() {
|
||||
stop();
|
||||
mAvoidBadWifiTracker.shutdown();
|
||||
quit();
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
@ -68,19 +72,36 @@ 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();
|
||||
|
||||
final IntentFilter intentFilter = new IntentFilter();
|
||||
intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
|
||||
mContext.registerReceiverAsUser(new BroadcastReceiver() {
|
||||
mBroadcastReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
reevaluate();
|
||||
}
|
||||
}, UserHandle.ALL, intentFilter, null, null);
|
||||
};
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
public void start() {
|
||||
mResolver.registerContentObserver(mUri, false, mSettingObserver);
|
||||
|
||||
final IntentFilter intentFilter = new IntentFilter();
|
||||
intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
|
||||
mContext.registerReceiverAsUser(
|
||||
mBroadcastReceiver, UserHandle.ALL, intentFilter, null, null);
|
||||
|
||||
reevaluate();
|
||||
}
|
||||
|
||||
public void shutdown() {
|
||||
mResolver.unregisterContentObserver(mSettingObserver);
|
||||
|
||||
mContext.unregisterReceiver(mBroadcastReceiver);
|
||||
}
|
||||
|
||||
public boolean currentValue() {
|
||||
return mAvoidBadWifi;
|
||||
}
|
||||
@ -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
|
||||
@ -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
|
||||
|
Reference in New Issue
Block a user