Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c8059fb9 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "More correct startup and shutdown procedures." into nyc-mr2-dev

parents d9eb4fce 6c0782f1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -864,6 +864,7 @@ public class ConnectivityService extends IConnectivityManager.Stub

        mAvoidBadWifiTracker = createAvoidBadWifiTracker(
                mContext, mHandler, () -> rematchForAvoidBadWifiUpdate());
        mAvoidBadWifiTracker.start();
    }

    private NetworkRequest createInternetRequestForTransport(
+46 −11
Original line number Diff line number Diff line
@@ -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();
    }

+27 −11
Original line number Diff line number Diff line
@@ -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,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() {
@@ -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