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

Commit 1559d51f authored by Erik Kline's avatar Erik Kline Committed by android-build-merger
Browse files

Merge "Prepare UpstreamNetworkMonitor for extraction" am: f84e5e8f am: d48902d3

am: 30579627

Change-Id: Iba225c91bb8b27887805cdba29493c817a969f98
parents 27e121f2 30579627
Loading
Loading
Loading
Loading
+67 −53
Original line number Diff line number Diff line
@@ -198,7 +198,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
        mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper);
        mTetherMasterSM.start();

        mUpstreamNetworkMonitor = new UpstreamNetworkMonitor();
        mUpstreamNetworkMonitor = new UpstreamNetworkMonitor(
                mContext, mTetherMasterSM, TetherMasterSM.EVENT_UPSTREAM_CALLBACK);

        mStateReceiver = new StateReceiver();
        IntentFilter filter = new IntentFilter();
@@ -1025,38 +1026,6 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
        }
    }

    /**
     * A NetworkCallback class that relays information of interest to the
     * tethering master state machine thread for subsequent processing.
     */
    class UpstreamNetworkCallback extends NetworkCallback {
        @Override
        public void onAvailable(Network network) {
            mTetherMasterSM.sendMessage(TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
                    UpstreamNetworkMonitor.EVENT_ON_AVAILABLE, 0, network);
        }

        @Override
        public void onCapabilitiesChanged(Network network, NetworkCapabilities newNc) {
            mTetherMasterSM.sendMessage(TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
                    UpstreamNetworkMonitor.EVENT_ON_CAPABILITIES, 0,
                    new NetworkState(null, null, newNc, network, null, null));
        }

        @Override
        public void onLinkPropertiesChanged(Network network, LinkProperties newLp) {
            mTetherMasterSM.sendMessage(TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
                    UpstreamNetworkMonitor.EVENT_ON_LINKPROPERTIES, 0,
                    new NetworkState(null, newLp, null, network, null, null));
        }

        @Override
        public void onLost(Network network) {
            mTetherMasterSM.sendMessage(TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
                    UpstreamNetworkMonitor.EVENT_ON_LOST, 0, network);
        }
    }

    /**
     * A class to centralize all the network and link properties information
     * pertaining to the current and any potential upstream network.
@@ -1071,21 +1040,31 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
     * TODO: Investigate whether more "upstream-specific" logic/functionality
     * could/should be moved here.
     */
    class UpstreamNetworkMonitor {
        static final int EVENT_ON_AVAILABLE      = 1;
        static final int EVENT_ON_CAPABILITIES   = 2;
        static final int EVENT_ON_LINKPROPERTIES = 3;
        static final int EVENT_ON_LOST           = 4;
    public class UpstreamNetworkMonitor {
        public static final int EVENT_ON_AVAILABLE      = 1;
        public static final int EVENT_ON_CAPABILITIES   = 2;
        public static final int EVENT_ON_LINKPROPERTIES = 3;
        public static final int EVENT_ON_LOST           = 4;

        private final Context mContext;
        private final StateMachine mTarget;
        private final int mWhat;
        private final HashMap<Network, NetworkState> mNetworkMap = new HashMap<>();
        private ConnectivityManager mCM;
        private NetworkCallback mDefaultNetworkCallback;
        private NetworkCallback mDunTetheringCallback;

        final HashMap<Network, NetworkState> mNetworkMap = new HashMap<>();
        NetworkCallback mDefaultNetworkCallback;
        NetworkCallback mDunTetheringCallback;
        public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, int what) {
            mContext = ctx;
            mTarget = tgt;
            mWhat = what;
        }

        void start() {
        public void start() {
            stop();

            mDefaultNetworkCallback = new UpstreamNetworkCallback();
            getConnectivityManager().registerDefaultNetworkCallback(mDefaultNetworkCallback);
            cm().registerDefaultNetworkCallback(mDefaultNetworkCallback);

            final NetworkRequest dunTetheringRequest = new NetworkRequest.Builder()
                    .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
@@ -1093,29 +1072,28 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
                    .addCapability(NetworkCapabilities.NET_CAPABILITY_DUN)
                    .build();
            mDunTetheringCallback = new UpstreamNetworkCallback();
            getConnectivityManager().registerNetworkCallback(
                    dunTetheringRequest, mDunTetheringCallback);
            cm().registerNetworkCallback(dunTetheringRequest, mDunTetheringCallback);
        }

        void stop() {
        public void stop() {
            if (mDefaultNetworkCallback != null) {
                getConnectivityManager().unregisterNetworkCallback(mDefaultNetworkCallback);
                cm().unregisterNetworkCallback(mDefaultNetworkCallback);
                mDefaultNetworkCallback = null;
            }

            if (mDunTetheringCallback != null) {
                getConnectivityManager().unregisterNetworkCallback(mDunTetheringCallback);
                cm().unregisterNetworkCallback(mDunTetheringCallback);
                mDunTetheringCallback = null;
            }

            mNetworkMap.clear();
        }

        NetworkState lookup(Network network) {
        public NetworkState lookup(Network network) {
            return (network != null) ? mNetworkMap.get(network) : null;
        }

        NetworkState processCallback(int arg1, Object obj) {
        public NetworkState processCallback(int arg1, Object obj) {
            switch (arg1) {
                case EVENT_ON_AVAILABLE: {
                    final Network network = (Network) obj;
@@ -1127,7 +1105,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
                                new NetworkState(null, null, null, network, null, null));
                    }

                    final ConnectivityManager cm = getConnectivityManager();
                    final ConnectivityManager cm = cm();

                    if (mDefaultNetworkCallback != null) {
                        cm.requestNetworkCapabilities(mDefaultNetworkCallback);
@@ -1198,6 +1176,42 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
                    return null;
            }
        }

        // Fetch (and cache) a ConnectivityManager only if and when we need one.
        private ConnectivityManager cm() {
            if (mCM == null) {
                mCM = mContext.getSystemService(ConnectivityManager.class);
            }
            return mCM;
        }

        /**
         * A NetworkCallback class that relays information of interest to the
         * tethering master state machine thread for subsequent processing.
         */
        private class UpstreamNetworkCallback extends NetworkCallback {
            @Override
            public void onAvailable(Network network) {
                mTarget.sendMessage(mWhat, EVENT_ON_AVAILABLE, 0, network);
            }

            @Override
            public void onCapabilitiesChanged(Network network, NetworkCapabilities newNc) {
                mTarget.sendMessage(mWhat, EVENT_ON_CAPABILITIES, 0,
                        new NetworkState(null, null, newNc, network, null, null));
            }

            @Override
            public void onLinkPropertiesChanged(Network network, LinkProperties newLp) {
                mTarget.sendMessage(mWhat, EVENT_ON_LINKPROPERTIES, 0,
                        new NetworkState(null, newLp, null, network, null, null));
            }

            @Override
            public void onLost(Network network) {
                mTarget.sendMessage(mWhat, EVENT_ON_LOST, 0, network);
            }
        }
    }

    // Needed because the canonical source of upstream truth is just the