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

Commit 7074b562 authored by Erik Kline's avatar Erik Kline Committed by android-build-merger
Browse files

Merge "More correct startup and shutdown procedures." am: 618d4215

am: b6588f9a

Change-Id: I8a2bcab3b9373d2573601fa3bffa123020b3fbae
parents 85785b55 b6588f9a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -856,6 +856,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