17b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt/*
27b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Copyright (C) 2014 The Android Open Source Project
37b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt *
47b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Licensed under the Apache License, Version 2.0 (the "License");
57b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * you may not use this file except in compliance with the License.
67b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * You may obtain a copy of the License at
77b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt *
87b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt *      http://www.apache.org/licenses/LICENSE-2.0
97b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt *
107b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * Unless required by applicable law or agreed to in writing, software
117b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * distributed under the License is distributed on an "AS IS" BASIS,
127b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * See the License for the specific language governing permissions and
147b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * limitations under the License.
157b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */
167b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
177b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltpackage android.net;
187b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
197b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.content.Context;
209d598e115f306e4f0860638c5647a959ac1320c5Erik Klineimport android.os.Bundle;
217b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.os.Handler;
227b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.os.Looper;
237b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.os.Message;
247b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.os.Messenger;
257b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport android.util.Log;
267b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
277b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport com.android.internal.util.AsyncChannel;
287b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltimport com.android.internal.util.Protocol;
298bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colittiimport android.net.ConnectivityManager.PacketKeepalive;
307b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
313192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwaltimport java.util.ArrayList;
3295ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fengluimport java.util.concurrent.atomic.AtomicBoolean;
337b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
347b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt/**
353192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt * A Utility class for handling for communicating between bearer-specific
363192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt * code and ConnectivityService.
377b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt *
387b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * A bearer may have more than one NetworkAgent if it can simultaneously
397b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * support separate networks (IMS / Internet / MMS Apns on cellular, or
403192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt * perhaps connections with different SSID or P2P for Wi-Fi).
417b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt *
427b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt * @hide
437b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt */
447b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwaltpublic abstract class NetworkAgent extends Handler {
4531a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen    // Guaranteed to be valid (not NETID_UNSET), otherwise registerNetworkAgent() would have thrown
4631a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen    // an exception.
4731a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen    public final int netId;
4831a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen
493192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt    private volatile AsyncChannel mAsyncChannel;
507b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    private final String LOG_TAG;
517b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    private static final boolean DBG = true;
52fc0c6890c675494b15cd847b20c5a5ede491fc3cRobert Greenwalt    private static final boolean VDBG = false;
537b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    private final Context mContext;
543192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt    private final ArrayList<Message>mPreConnectedQueue = new ArrayList<Message>();
55b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu    private volatile long mLastBwRefreshTime = 0;
56b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu    private static final long BW_REFRESH_MIN_WIN_MS = 500;
5795ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu    private boolean mPollLceScheduled = false;
5895ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu    private AtomicBoolean mPollLcePending = new AtomicBoolean(false);
597b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
607b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    private static final int BASE = Protocol.BASE_NETWORK_AGENT;
617b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
627b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    /**
637b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * Sent by ConnectivityService to the NetworkAgent to inform it of
647b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * suspected connectivity problems on its network.  The NetworkAgent
657b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * should take steps to verify and correct connectivity.
667b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     */
673192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt    public static final int CMD_SUSPECT_BAD = BASE;
687b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
697b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    /**
707b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * Sent by the NetworkAgent (note the EVENT vs CMD prefix) to
717b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * ConnectivityService to pass the current NetworkInfo (connection state).
727b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * Sent when the NetworkInfo changes, mainly due to change of state.
737b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * obj = NetworkInfo
747b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     */
753192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt    public static final int EVENT_NETWORK_INFO_CHANGED = BASE + 1;
767b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
777b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    /**
787b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * Sent by the NetworkAgent to ConnectivityService to pass the current
797b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * NetworkCapabilties.
807b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * obj = NetworkCapabilities
817b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     */
823192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt    public static final int EVENT_NETWORK_CAPABILITIES_CHANGED = BASE + 2;
837b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
847b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    /**
857b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * Sent by the NetworkAgent to ConnectivityService to pass the current
867b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * NetworkProperties.
877b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * obj = NetworkProperties
887b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     */
893192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt    public static final int EVENT_NETWORK_PROPERTIES_CHANGED = BASE + 3;
907b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
912ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    /* centralize place where base network score, and network score scaling, will be
922ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     * stored, so as we can consistently compare apple and oranges, or wifi, ethernet and LTE
932ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle     */
942ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle    public static final int WIFI_BASE_SCORE = 60;
952ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle
967b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    /**
977b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * Sent by the NetworkAgent to ConnectivityService to pass the current
987b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * network score.
993192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt     * obj = network score Integer
1007b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     */
1013192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt    public static final int EVENT_NETWORK_SCORE_CHANGED = BASE + 4;
1027b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
1036bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    /**
1046bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen     * Sent by the NetworkAgent to ConnectivityService to add new UID ranges
1056bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen     * to be forced into this Network.  For VPNs only.
1066bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen     * obj = UidRange[] to forward
1076bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen     */
1086bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    public static final int EVENT_UID_RANGES_ADDED = BASE + 5;
1096bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
1106bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    /**
1116bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen     * Sent by the NetworkAgent to ConnectivityService to remove UID ranges
1126bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen     * from being forced into this Network.  For VPNs only.
1136bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen     * obj = UidRange[] to stop forwarding
1146bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen     */
1156bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    public static final int EVENT_UID_RANGES_REMOVED = BASE + 6;
1166bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
11742065ac64cba166dc0fe602957ea8fe80bf406e2Sreeram Ramachandran    /**
118e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * Sent by ConnectivityService to the NetworkAgent to inform the agent of the
11949f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     * networks status - whether we could use the network or could not, due to
12049f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     * either a bad network configuration (no internet link) or captive portal.
12149f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     *
12249f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     * arg1 = either {@code VALID_NETWORK} or {@code INVALID_NETWORK}
1232324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen     * obj = Bundle containing map from {@code REDIRECT_URL_KEY} to {@code String}
1242324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen     *       representing URL that Internet probe was redirect to, if it was redirected,
1252324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen     *       or mapping to {@code null} otherwise.
12649f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     */
12760446165d8bd44f72cec8d0c5583a688369fa660Lorenzo Colitti    public static final int CMD_REPORT_NETWORK_STATUS = BASE + 7;
12849f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt
12949f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt    public static final int VALID_NETWORK = 1;
13049f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt    public static final int INVALID_NETWORK = 2;
13149f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt
1322324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen    public static String REDIRECT_URL_KEY = "redirect URL";
1332324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen
134e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt     /**
135e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt     * Sent by the NetworkAgent to ConnectivityService to indicate this network was
136e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt     * explicitly selected.  This should be sent before the NetworkInfo is marked
137e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt     * CONNECTED so it can be given special treatment at that time.
138e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     *
139e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * obj = boolean indicating whether to use this network even if unvalidated
140e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt     */
14160446165d8bd44f72cec8d0c5583a688369fa660Lorenzo Colitti    public static final int EVENT_SET_EXPLICITLY_SELECTED = BASE + 8;
142e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt
143e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti    /**
144e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * Sent by ConnectivityService to the NetworkAgent to inform the agent of
145e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * whether the network should in the future be used even if not validated.
146e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * This decision is made by the user, but it is the network transport's
147e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * responsibility to remember it.
148e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     *
149e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * arg1 = 1 if true, 0 if false
150e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     */
151e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti    public static final int CMD_SAVE_ACCEPT_UNVALIDATED = BASE + 9;
152e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti
1538bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    /**
1548bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     * Sent by ConnectivityService to the NetworkAgent to inform the agent to pull
155b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu     * the underlying network connection for updated bandwidth information.
156b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu     */
157b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu    public static final int CMD_REQUEST_BANDWIDTH_UPDATE = BASE + 10;
158b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu
1598bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    /**
1608bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     * Sent by ConnectivityService to the NetworkAgent to request that the specified packet be sent
1618bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     * periodically on the given interval.
1628bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     *
1638bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     *   arg1 = the slot number of the keepalive to start
1648bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     *   arg2 = interval in seconds
1658bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     *   obj = KeepalivePacketData object describing the data to be sent
1668bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     *
1678bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     * Also used internally by ConnectivityService / KeepaliveTracker, with different semantics.
1688bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     */
1698bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    public static final int CMD_START_PACKET_KEEPALIVE = BASE + 11;
1708bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti
1718bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    /**
1728bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     * Requests that the specified keepalive packet be stopped.
1738bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     *
1748bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     * arg1 = slot number of the keepalive to stop.
1758bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     *
1768bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     * Also used internally by ConnectivityService / KeepaliveTracker, with different semantics.
1778bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     */
1788bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    public static final int CMD_STOP_PACKET_KEEPALIVE = BASE + 12;
1798bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti
1808bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    /**
1818bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     * Sent by the NetworkAgent to ConnectivityService to provide status on a packet keepalive
1828bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     * request. This may either be the reply to a CMD_START_PACKET_KEEPALIVE, or an asynchronous
1838bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     * error notification.
1848bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     *
1858bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     * This is also sent by KeepaliveTracker to the app's ConnectivityManager.PacketKeepalive to
1868bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     * so that the app's PacketKeepaliveCallback methods can be called.
1878bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     *
1888bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     * arg1 = slot number of the keepalive
1898bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     * arg2 = error code
1908bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     */
1918bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    public static final int EVENT_PACKET_KEEPALIVE = BASE + 13;
1928bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti
193c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti    /**
194c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti     * Sent by ConnectivityService to inform this network transport of signal strength thresholds
195c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti     * that when crossed should trigger a system wakeup and a NetworkCapabilities update.
196c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti     *
197c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti     *   obj = int[] describing signal strength thresholds.
198c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti     */
199c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti    public static final int CMD_SET_SIGNAL_STRENGTH_THRESHOLDS = BASE + 14;
200c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti
201bf10991d76ce6674726a668939be300cae150130Paul Jensen    /**
202f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen     * Sent by ConnectivityService to the NeworkAgent to inform the agent to avoid
203f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen     * automatically reconnecting to this network (e.g. via autojoin).  Happens
204f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen     * when user selects "No" option on the "Stay connected?" dialog box.
205f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen     */
206bf10991d76ce6674726a668939be300cae150130Paul Jensen    public static final int CMD_PREVENT_AUTOMATIC_RECONNECT = BASE + 15;
207f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen
2083192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt    public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
2093192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt            NetworkCapabilities nc, LinkProperties lp, int score) {
2108cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran        this(looper, context, logTag, ni, nc, lp, score, null);
2118cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran    }
2128cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran
2138cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran    public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
2148cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran            NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) {
2157b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        super(looper);
2167b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        LOG_TAG = logTag;
2177b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        mContext = context;
2183192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt        if (ni == null || nc == null || lp == null) {
2193192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt            throw new IllegalArgumentException();
2207b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        }
2213192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt
222fc0c6890c675494b15cd847b20c5a5ede491fc3cRobert Greenwalt        if (VDBG) log("Registering NetworkAgent");
2233192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt        ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(
2243192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                Context.CONNECTIVITY_SERVICE);
22531a94f48bf8014cf6a1127bd23cf9a8541a9abedPaul Jensen        netId = cm.registerNetworkAgent(new Messenger(this), new NetworkInfo(ni),
2268cd33ed84e94036a5e1201485af7603dc6fb0d9bSreeram Ramachandran                new LinkProperties(lp), new NetworkCapabilities(nc), score, misc);
2277b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    }
2287b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
2297b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    @Override
2307b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public void handleMessage(Message msg) {
2317b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        switch (msg.what) {
2327b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt            case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION: {
2333192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                if (mAsyncChannel != null) {
2343192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                    log("Received new connection while already connected!");
2353192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                } else {
236fc0c6890c675494b15cd847b20c5a5ede491fc3cRobert Greenwalt                    if (VDBG) log("NetworkAgent fully connected");
2373192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                    AsyncChannel ac = new AsyncChannel();
2383192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                    ac.connected(null, this, msg.replyTo);
2393192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                    ac.replyToMessage(msg, AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED,
2403192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                            AsyncChannel.STATUS_SUCCESSFUL);
2413192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                    synchronized (mPreConnectedQueue) {
2423192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                        mAsyncChannel = ac;
2433192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                        for (Message m : mPreConnectedQueue) {
2443192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                            ac.sendMessage(m);
2453192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                        }
2463192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                        mPreConnectedQueue.clear();
2477b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt                    }
2487b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt                }
2497b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt                break;
2507b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt            }
2517b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt            case AsyncChannel.CMD_CHANNEL_DISCONNECT: {
252fc0c6890c675494b15cd847b20c5a5ede491fc3cRobert Greenwalt                if (VDBG) log("CMD_CHANNEL_DISCONNECT");
2537b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt                if (mAsyncChannel != null) mAsyncChannel.disconnect();
2547b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt                break;
2557b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt            }
2567b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt            case AsyncChannel.CMD_CHANNEL_DISCONNECTED: {
2577b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt                if (DBG) log("NetworkAgent channel lost");
2583192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                // let the client know CS is done with us.
2593192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                unwanted();
2603192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                synchronized (mPreConnectedQueue) {
2613192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                    mAsyncChannel = null;
2623192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                }
2637b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt                break;
2647b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt            }
2657b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt            case CMD_SUSPECT_BAD: {
2667b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt                log("Unhandled Message " + msg);
2677b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt                break;
2687b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt            }
269b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu            case CMD_REQUEST_BANDWIDTH_UPDATE: {
27095ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu                long currentTimeMs = System.currentTimeMillis();
271b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu                if (VDBG) {
272b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu                    log("CMD_REQUEST_BANDWIDTH_UPDATE request received.");
273b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu                }
27495ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu                if (currentTimeMs >= (mLastBwRefreshTime + BW_REFRESH_MIN_WIN_MS)) {
27595ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu                    mPollLceScheduled = false;
27695ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu                    if (mPollLcePending.getAndSet(true) == false) {
27795ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu                        pollLceData();
27895ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu                    }
27995ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu                } else {
28095ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu                    // deliver the request at a later time rather than discard it completely.
28195ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu                    if (!mPollLceScheduled) {
28295ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu                        long waitTime = mLastBwRefreshTime + BW_REFRESH_MIN_WIN_MS -
28395ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu                                currentTimeMs + 1;
28495ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu                        mPollLceScheduled = sendEmptyMessageDelayed(
28595ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu                                CMD_REQUEST_BANDWIDTH_UPDATE, waitTime);
28695ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu                    }
287b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu                }
288b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu                break;
289b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu            }
29049f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt            case CMD_REPORT_NETWORK_STATUS: {
2912324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen                String redirectUrl = ((Bundle)msg.obj).getString(REDIRECT_URL_KEY);
29249f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt                if (VDBG) {
29349f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt                    log("CMD_REPORT_NETWORK_STATUS(" +
2942324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen                            (msg.arg1 == VALID_NETWORK ? "VALID, " : "INVALID, ") + redirectUrl);
29549f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt                }
2962324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen                networkStatus(msg.arg1, redirectUrl);
29749f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt                break;
29849f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt            }
299e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti            case CMD_SAVE_ACCEPT_UNVALIDATED: {
300e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti                saveAcceptUnvalidated(msg.arg1 != 0);
3018bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti                break;
3028bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti            }
3038bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti            case CMD_START_PACKET_KEEPALIVE: {
3048bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti                startPacketKeepalive(msg);
3058bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti                break;
3068bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti            }
3078bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti            case CMD_STOP_PACKET_KEEPALIVE: {
3088bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti                stopPacketKeepalive(msg);
3098bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti                break;
310e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti            }
311c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti
312c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti            case CMD_SET_SIGNAL_STRENGTH_THRESHOLDS: {
3139d598e115f306e4f0860638c5647a959ac1320c5Erik Kline                ArrayList<Integer> thresholds =
3149d598e115f306e4f0860638c5647a959ac1320c5Erik Kline                        ((Bundle) msg.obj).getIntegerArrayList("thresholds");
3159d598e115f306e4f0860638c5647a959ac1320c5Erik Kline                // TODO: Change signal strength thresholds API to use an ArrayList<Integer>
3169d598e115f306e4f0860638c5647a959ac1320c5Erik Kline                // rather than convert to int[].
3179d598e115f306e4f0860638c5647a959ac1320c5Erik Kline                int[] intThresholds = new int[(thresholds != null) ? thresholds.size() : 0];
3189d598e115f306e4f0860638c5647a959ac1320c5Erik Kline                for (int i = 0; i < intThresholds.length; i++) {
3199d598e115f306e4f0860638c5647a959ac1320c5Erik Kline                    intThresholds[i] = thresholds.get(i);
3209d598e115f306e4f0860638c5647a959ac1320c5Erik Kline                }
3219d598e115f306e4f0860638c5647a959ac1320c5Erik Kline                setSignalStrengthThresholds(intThresholds);
322c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti                break;
323c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti            }
324f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen            case CMD_PREVENT_AUTOMATIC_RECONNECT: {
325f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen                preventAutomaticReconnect();
326f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen                break;
327e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti            }
3287b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        }
3297b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    }
3307b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
3313192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt    private void queueOrSendMessage(int what, Object obj) {
3328bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti        queueOrSendMessage(what, 0, 0, obj);
3338bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    }
3348bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti
3358bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    private void queueOrSendMessage(int what, int arg1, int arg2) {
3368bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti        queueOrSendMessage(what, arg1, arg2, null);
3378bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    }
3388bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti
3398bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    private void queueOrSendMessage(int what, int arg1, int arg2, Object obj) {
3408bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti        Message msg = Message.obtain();
3418bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti        msg.what = what;
3428bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti        msg.arg1 = arg1;
3438bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti        msg.arg2 = arg2;
3448bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti        msg.obj = obj;
3458bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti        queueOrSendMessage(msg);
3468bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    }
3478bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti
3488bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    private void queueOrSendMessage(Message msg) {
3493192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt        synchronized (mPreConnectedQueue) {
3503192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt            if (mAsyncChannel != null) {
3518bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti                mAsyncChannel.sendMessage(msg);
3523192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt            } else {
3533192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                mPreConnectedQueue.add(msg);
3549a6a11ae1edc9ee883022345c167eb4b4641402bLorenzo Colitti            }
3557b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        }
3567b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    }
3577b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
3587b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    /**
3597b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * Called by the bearer code when it has new LinkProperties data.
3607b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     */
3617b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public void sendLinkProperties(LinkProperties linkProperties) {
3623192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt        queueOrSendMessage(EVENT_NETWORK_PROPERTIES_CHANGED, new LinkProperties(linkProperties));
3637b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    }
3647b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
3657b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    /**
3667b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * Called by the bearer code when it has new NetworkInfo data.
3677b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     */
3687b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public void sendNetworkInfo(NetworkInfo networkInfo) {
3693192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt        queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, new NetworkInfo(networkInfo));
3707b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    }
3717b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
3727b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    /**
3737b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * Called by the bearer code when it has new NetworkCapabilities data.
3747b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     */
3757b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    public void sendNetworkCapabilities(NetworkCapabilities networkCapabilities) {
37695ce803da7f3b9cc9e0f4c1d67d783e4fc9187c9fenglu        mPollLcePending.set(false);
377b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu        mLastBwRefreshTime = System.currentTimeMillis();
3783192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt        queueOrSendMessage(EVENT_NETWORK_CAPABILITIES_CHANGED,
3793192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt                new NetworkCapabilities(networkCapabilities));
3807b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    }
3817b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
3827b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    /**
3837b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     * Called by the bearer code when it has a new score for this network.
3847b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt     */
3853192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt    public void sendNetworkScore(int score) {
38635f7a94c846cfdaa75ed6bc58ec37bdef7a09be8Robert Greenwalt        if (score < 0) {
38735f7a94c846cfdaa75ed6bc58ec37bdef7a09be8Robert Greenwalt            throw new IllegalArgumentException("Score must be >= 0");
38835f7a94c846cfdaa75ed6bc58ec37bdef7a09be8Robert Greenwalt        }
3893192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt        queueOrSendMessage(EVENT_NETWORK_SCORE_CHANGED, new Integer(score));
3907b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    }
3917b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
3923192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt    /**
3936bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen     * Called by the VPN code when it wants to add ranges of UIDs to be routed
3946bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen     * through the VPN network.
3956bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen     */
3966bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    public void addUidRanges(UidRange[] ranges) {
3976bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        queueOrSendMessage(EVENT_UID_RANGES_ADDED, ranges);
3986bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    }
3996bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
4006bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    /**
4016bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen     * Called by the VPN code when it wants to remove ranges of UIDs from being routed
4026bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen     * through the VPN network.
4036bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen     */
4046bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    public void removeUidRanges(UidRange[] ranges) {
4056bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen        queueOrSendMessage(EVENT_UID_RANGES_REMOVED, ranges);
4066bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    }
4076bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
4086bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    /**
409e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt     * Called by the bearer to indicate this network was manually selected by the user.
410e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt     * This should be called before the NetworkInfo is marked CONNECTED so that this
411e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * Network can be given special treatment at that time. If {@code acceptUnvalidated} is
412e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * {@code true}, then the system will switch to this network. If it is {@code false} and the
413e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * network cannot be validated, the system will ask the user whether to switch to this network.
414e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * If the user confirms and selects "don't ask again", then the system will call
415e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * {@link #saveAcceptUnvalidated} to persist the user's choice. Thus, if the transport ever
416e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * calls this method with {@code acceptUnvalidated} set to {@code false}, it must also implement
417e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * {@link #saveAcceptUnvalidated} to respect the user's choice.
418e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt     */
419e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti    public void explicitlySelected(boolean acceptUnvalidated) {
420e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti        queueOrSendMessage(EVENT_SET_EXPLICITLY_SELECTED, acceptUnvalidated);
421e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt    }
422e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt
423e73cc4646bed3926024c9f54ca59e3a82a97b56cRobert Greenwalt    /**
4243192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt     * Called when ConnectivityService has indicated they no longer want this network.
4253192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt     * The parent factory should (previously) have received indication of the change
4263192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt     * as well, either canceling NetworkRequests or altering their score such that this
4273192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt     * network won't be immediately requested again.
4283192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt     */
4293192dec32180f56733e631c2d9ec62fa1359283dRobert Greenwalt    abstract protected void unwanted();
4307b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt
43149f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt    /**
432b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu     * Called when ConnectivityService request a bandwidth update. The parent factory
433b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu     * shall try to overwrite this method and produce a bandwidth update if capable.
434b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu     */
435b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu    protected void pollLceData() {
436b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu    }
437b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu
438b15e72b83c56d771f0fb1453b73e2fca6b09cce8fenglu    /**
43949f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     * Called when the system determines the usefulness of this network.
44049f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     *
44149f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     * Networks claiming internet connectivity will have their internet
44249f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     * connectivity verified.
44349f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     *
44449f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     * Currently there are two possible values:
44549f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     * {@code VALID_NETWORK} if the system is happy with the connection,
44649f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     * {@code INVALID_NETWORK} if the system is not happy.
44749f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     * TODO - add indications of captive portal-ness and related success/failure,
44849f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     * ie, CAPTIVE_SUCCESS_NETWORK, CAPTIVE_NETWORK for successful login and detection
44949f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     *
45049f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     * This may be called multiple times as the network status changes and may
45149f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     * generate false negatives if we lose ip connectivity before the link is torn down.
4522324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen     *
4532324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen     * @param status one of {@code VALID_NETWORK} or {@code INVALID_NETWORK}.
4542324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen     * @param redirectUrl If the Internet probe was redirected, this is the destination it was
4552324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen     *         redirected to, otherwise {@code null}.
45649f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt     */
4572324373124f0ba4e59ba6d3de9e274f2fa28cff0Paul Jensen    protected void networkStatus(int status, String redirectUrl) {
45849f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt    }
45949f63fbed4cd84f5da182c85e8b999037dc64f3bRobert Greenwalt
460e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti    /**
461e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * Called when the user asks to remember the choice to use this network even if unvalidated.
462e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * The transport is responsible for remembering the choice, and the next time the user connects
463e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * to the network, should explicitlySelected with {@code acceptUnvalidated} set to {@code true}.
464e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * This method will only be called if {@link #explicitlySelected} was called with
465e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     * {@code acceptUnvalidated} set to {@code false}.
466e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti     */
467e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti    protected void saveAcceptUnvalidated(boolean accept) {
468e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti    }
469e03c3c7edf54854ed22adf1e55b27b2408c4c66aLorenzo Colitti
4708bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    /**
4718bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     * Requests that the network hardware send the specified packet at the specified interval.
4728bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     */
4738bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    protected void startPacketKeepalive(Message msg) {
4748bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti        onPacketKeepaliveEvent(msg.arg1, PacketKeepalive.ERROR_HARDWARE_UNSUPPORTED);
4758bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    }
4768bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti
4778bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    /**
4788bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     * Requests that the network hardware send the specified packet at the specified interval.
4798bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     */
4808bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    protected void stopPacketKeepalive(Message msg) {
4818bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti        onPacketKeepaliveEvent(msg.arg1, PacketKeepalive.ERROR_HARDWARE_UNSUPPORTED);
4828bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    }
4838bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti
4848bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    /**
4858bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     * Called by the network when a packet keepalive event occurs.
4868bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti     */
4878bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    public void onPacketKeepaliveEvent(int slot, int reason) {
4888bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti        queueOrSendMessage(EVENT_PACKET_KEEPALIVE, slot, reason);
4898bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti    }
4908bf977d562b8f7261cf964bdf045b22bdbd92b7dLorenzo Colitti
491c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti    /**
492c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti     * Called by ConnectivityService to inform this network transport of signal strength thresholds
493c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti     * that when crossed should trigger a system wakeup and a NetworkCapabilities update.
494c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti     */
495c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti    protected void setSignalStrengthThresholds(int[] thresholds) {
496c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti    }
497c3f21f3b8b01508f5dc01b2e5fa4c3d652bb67bbLorenzo Colitti
498bf10991d76ce6674726a668939be300cae150130Paul Jensen    /**
499f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen     * Called when the user asks to not stay connected to this network because it was found to not
500f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen     * provide Internet access.  Usually followed by call to {@code unwanted}.  The transport is
501f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen     * responsible for making sure the device does not automatically reconnect to the same network
502f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen     * after the {@code unwanted} call.
503f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen     */
504f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen    protected void preventAutomaticReconnect() {
505f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen    }
506f95d220308492550b7bd6c019e4c725a810cd050Paul Jensen
5077b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    protected void log(String s) {
5087b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt        Log.d(LOG_TAG, "NetworkAgent: " + s);
5097b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt    }
5107b81602f3c18df8a4ca0342c514af8f7e394c0d7Robert Greenwalt}
511