Merge "More correct startup and shutdown procedures."

am: 618d4215a2

Change-Id: I4844130b04ded0fc913593081d07a6052bdc0e42
This commit is contained in:
Erik Kline
2016-12-15 05:25:48 +00:00
committed by android-build-merger
3 changed files with 74 additions and 22 deletions

View File

@ -856,6 +856,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
mAvoidBadWifiTracker = createAvoidBadWifiTracker(
mContext, mHandler, () -> rematchForAvoidBadWifiUpdate());
mAvoidBadWifiTracker.start();
}
private NetworkRequest createInternetRequestForTransport(

View File

@ -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();
}

View File

@ -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