diff options
| author | 2016-12-14 11:39:36 +0000 | |
|---|---|---|
| committer | 2016-12-14 11:39:36 +0000 | |
| commit | 20cad0821d1e8202af7ab97307b2bc6f86a7137c (patch) | |
| tree | cbb925b746648593f1f04fec3765b487a099efcc | |
| parent | 25946b8d6983cf92a1745ef935823c8d71ad3b0d (diff) | |
| parent | 6c0782f1ae2d752debc344c6fecfae8b99f41974 (diff) | |
More correct startup and shutdown procedures.
am: 6c0782f1ae
Change-Id: Ib488e0cb49da2d3f655e189600f839721ea73358
3 files changed, 74 insertions, 22 deletions
| diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 8ad9875bfd42..750b8417e5ea 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -856,6 +856,7 @@ public class ConnectivityService extends IConnectivityManager.Stub          mAvoidBadWifiTracker = createAvoidBadWifiTracker(                  mContext, mHandler, () -> rematchForAvoidBadWifiUpdate()); +        mAvoidBadWifiTracker.start();      }      private NetworkRequest createInternetRequestForTransport( diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java index 39f14e5ee287..58b2dec578fe 100644 --- a/services/net/java/android/net/ip/IpManager.java +++ b/services/net/java/android/net/ip/IpManager.java @@ -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);              } -        }; -        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(); @@ -501,6 +535,7 @@ public class IpManager extends StateMachine {      // Shut down this IpManager instance altogether.      public void shutdown() {          stop(); +        mAvoidBadWifiTracker.shutdown();          quit();      } diff --git a/services/net/java/android/net/util/AvoidBadWifiTracker.java b/services/net/java/android/net/util/AvoidBadWifiTracker.java index c14e811e0584..2abaeb1ae35b 100644 --- a/services/net/java/android/net/util/AvoidBadWifiTracker.java +++ b/services/net/java/android/net/util/AvoidBadWifiTracker.java @@ -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 |