Make most of NetworkAgent @SystemApi. am: d60481ce20
Change-Id: Ie36bfb9a1bed114fe628ad6c1b935d587cc3160d
This commit is contained in:
@@ -17,6 +17,8 @@
|
|||||||
package android.net;
|
package android.net;
|
||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
|
import android.annotation.Nullable;
|
||||||
|
import android.annotation.SystemApi;
|
||||||
import android.compat.annotation.UnsupportedAppUsage;
|
import android.compat.annotation.UnsupportedAppUsage;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
@@ -43,7 +45,12 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
*
|
*
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
|
@SystemApi
|
||||||
public abstract class NetworkAgent {
|
public abstract class NetworkAgent {
|
||||||
|
/**
|
||||||
|
* The {@link Network} corresponding to this object.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
public final Network network;
|
public final Network network;
|
||||||
|
|
||||||
private final Handler mHandler;
|
private final Handler mHandler;
|
||||||
@@ -55,9 +62,14 @@ public abstract class NetworkAgent {
|
|||||||
private final ArrayList<Message>mPreConnectedQueue = new ArrayList<Message>();
|
private final ArrayList<Message>mPreConnectedQueue = new ArrayList<Message>();
|
||||||
private volatile long mLastBwRefreshTime = 0;
|
private volatile long mLastBwRefreshTime = 0;
|
||||||
private static final long BW_REFRESH_MIN_WIN_MS = 500;
|
private static final long BW_REFRESH_MIN_WIN_MS = 500;
|
||||||
private boolean mPollLceScheduled = false;
|
private boolean mBandwidthUpdateScheduled = false;
|
||||||
private AtomicBoolean mPollLcePending = new AtomicBoolean(false);
|
private AtomicBoolean mBandwidthUpdatePending = new AtomicBoolean(false);
|
||||||
public final int mProviderId;
|
|
||||||
|
/**
|
||||||
|
* The ID of the {@link NetworkProvider} that created this object, or
|
||||||
|
* {@link NetworkProvider#ID_NONE} if unknown.
|
||||||
|
*/
|
||||||
|
public final int providerId;
|
||||||
|
|
||||||
private static final int BASE = Protocol.BASE_NETWORK_AGENT;
|
private static final int BASE = Protocol.BASE_NETWORK_AGENT;
|
||||||
|
|
||||||
@@ -65,6 +77,7 @@ public abstract class NetworkAgent {
|
|||||||
* Sent by ConnectivityService to the NetworkAgent to inform it of
|
* Sent by ConnectivityService to the NetworkAgent to inform it of
|
||||||
* suspected connectivity problems on its network. The NetworkAgent
|
* suspected connectivity problems on its network. The NetworkAgent
|
||||||
* should take steps to verify and correct connectivity.
|
* should take steps to verify and correct connectivity.
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int CMD_SUSPECT_BAD = BASE;
|
public static final int CMD_SUSPECT_BAD = BASE;
|
||||||
|
|
||||||
@@ -73,6 +86,7 @@ public abstract class NetworkAgent {
|
|||||||
* ConnectivityService to pass the current NetworkInfo (connection state).
|
* ConnectivityService to pass the current NetworkInfo (connection state).
|
||||||
* Sent when the NetworkInfo changes, mainly due to change of state.
|
* Sent when the NetworkInfo changes, mainly due to change of state.
|
||||||
* obj = NetworkInfo
|
* obj = NetworkInfo
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int EVENT_NETWORK_INFO_CHANGED = BASE + 1;
|
public static final int EVENT_NETWORK_INFO_CHANGED = BASE + 1;
|
||||||
|
|
||||||
@@ -80,6 +94,7 @@ public abstract class NetworkAgent {
|
|||||||
* Sent by the NetworkAgent to ConnectivityService to pass the current
|
* Sent by the NetworkAgent to ConnectivityService to pass the current
|
||||||
* NetworkCapabilties.
|
* NetworkCapabilties.
|
||||||
* obj = NetworkCapabilities
|
* obj = NetworkCapabilities
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int EVENT_NETWORK_CAPABILITIES_CHANGED = BASE + 2;
|
public static final int EVENT_NETWORK_CAPABILITIES_CHANGED = BASE + 2;
|
||||||
|
|
||||||
@@ -87,11 +102,14 @@ public abstract class NetworkAgent {
|
|||||||
* Sent by the NetworkAgent to ConnectivityService to pass the current
|
* Sent by the NetworkAgent to ConnectivityService to pass the current
|
||||||
* NetworkProperties.
|
* NetworkProperties.
|
||||||
* obj = NetworkProperties
|
* obj = NetworkProperties
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int EVENT_NETWORK_PROPERTIES_CHANGED = BASE + 3;
|
public static final int EVENT_NETWORK_PROPERTIES_CHANGED = BASE + 3;
|
||||||
|
|
||||||
/* centralize place where base network score, and network score scaling, will be
|
/**
|
||||||
|
* Centralize the place where base network score, and network score scaling, will be
|
||||||
* stored, so as we can consistently compare apple and oranges, or wifi, ethernet and LTE
|
* stored, so as we can consistently compare apple and oranges, or wifi, ethernet and LTE
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int WIFI_BASE_SCORE = 60;
|
public static final int WIFI_BASE_SCORE = 60;
|
||||||
|
|
||||||
@@ -99,6 +117,7 @@ public abstract class NetworkAgent {
|
|||||||
* Sent by the NetworkAgent to ConnectivityService to pass the current
|
* Sent by the NetworkAgent to ConnectivityService to pass the current
|
||||||
* network score.
|
* network score.
|
||||||
* obj = network score Integer
|
* obj = network score Integer
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int EVENT_NETWORK_SCORE_CHANGED = BASE + 4;
|
public static final int EVENT_NETWORK_SCORE_CHANGED = BASE + 4;
|
||||||
|
|
||||||
@@ -111,12 +130,33 @@ public abstract class NetworkAgent {
|
|||||||
* obj = Bundle containing map from {@code REDIRECT_URL_KEY} to {@code String}
|
* obj = Bundle containing map from {@code REDIRECT_URL_KEY} to {@code String}
|
||||||
* representing URL that Internet probe was redirect to, if it was redirected,
|
* representing URL that Internet probe was redirect to, if it was redirected,
|
||||||
* or mapping to {@code null} otherwise.
|
* or mapping to {@code null} otherwise.
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int CMD_REPORT_NETWORK_STATUS = BASE + 7;
|
public static final int CMD_REPORT_NETWORK_STATUS = BASE + 7;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Network validation suceeded.
|
||||||
|
* Corresponds to {@link NetworkCapabilities.NET_CAPABILITY_VALIDATED}.
|
||||||
|
*/
|
||||||
|
public static final int VALIDATION_STATUS_VALID = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Network validation was attempted and failed. This may be received more than once as
|
||||||
|
* subsequent validation attempts are made.
|
||||||
|
*/
|
||||||
|
public static final int VALIDATION_STATUS_NOT_VALID = 2;
|
||||||
|
|
||||||
|
// TODO: remove.
|
||||||
|
/** @hide */
|
||||||
public static final int VALID_NETWORK = 1;
|
public static final int VALID_NETWORK = 1;
|
||||||
|
/** @hide */
|
||||||
public static final int INVALID_NETWORK = 2;
|
public static final int INVALID_NETWORK = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The key for the redirect URL in the Bundle argument of {@code CMD_REPORT_NETWORK_STATUS}.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
public static String REDIRECT_URL_KEY = "redirect URL";
|
public static String REDIRECT_URL_KEY = "redirect URL";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -125,6 +165,7 @@ public abstract class NetworkAgent {
|
|||||||
* CONNECTED so it can be given special treatment at that time.
|
* CONNECTED so it can be given special treatment at that time.
|
||||||
*
|
*
|
||||||
* obj = boolean indicating whether to use this network even if unvalidated
|
* obj = boolean indicating whether to use this network even if unvalidated
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int EVENT_SET_EXPLICITLY_SELECTED = BASE + 8;
|
public static final int EVENT_SET_EXPLICITLY_SELECTED = BASE + 8;
|
||||||
|
|
||||||
@@ -135,12 +176,14 @@ public abstract class NetworkAgent {
|
|||||||
* responsibility to remember it.
|
* responsibility to remember it.
|
||||||
*
|
*
|
||||||
* arg1 = 1 if true, 0 if false
|
* arg1 = 1 if true, 0 if false
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int CMD_SAVE_ACCEPT_UNVALIDATED = BASE + 9;
|
public static final int CMD_SAVE_ACCEPT_UNVALIDATED = BASE + 9;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sent by ConnectivityService to the NetworkAgent to inform the agent to pull
|
* Sent by ConnectivityService to the NetworkAgent to inform the agent to pull
|
||||||
* the underlying network connection for updated bandwidth information.
|
* the underlying network connection for updated bandwidth information.
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int CMD_REQUEST_BANDWIDTH_UPDATE = BASE + 10;
|
public static final int CMD_REQUEST_BANDWIDTH_UPDATE = BASE + 10;
|
||||||
|
|
||||||
@@ -153,6 +196,7 @@ public abstract class NetworkAgent {
|
|||||||
* obj = KeepalivePacketData object describing the data to be sent
|
* obj = KeepalivePacketData object describing the data to be sent
|
||||||
*
|
*
|
||||||
* Also used internally by ConnectivityService / KeepaliveTracker, with different semantics.
|
* Also used internally by ConnectivityService / KeepaliveTracker, with different semantics.
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int CMD_START_SOCKET_KEEPALIVE = BASE + 11;
|
public static final int CMD_START_SOCKET_KEEPALIVE = BASE + 11;
|
||||||
|
|
||||||
@@ -162,6 +206,7 @@ public abstract class NetworkAgent {
|
|||||||
* arg1 = slot number of the keepalive to stop.
|
* arg1 = slot number of the keepalive to stop.
|
||||||
*
|
*
|
||||||
* Also used internally by ConnectivityService / KeepaliveTracker, with different semantics.
|
* Also used internally by ConnectivityService / KeepaliveTracker, with different semantics.
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int CMD_STOP_SOCKET_KEEPALIVE = BASE + 12;
|
public static final int CMD_STOP_SOCKET_KEEPALIVE = BASE + 12;
|
||||||
|
|
||||||
@@ -175,6 +220,7 @@ public abstract class NetworkAgent {
|
|||||||
*
|
*
|
||||||
* arg1 = slot number of the keepalive
|
* arg1 = slot number of the keepalive
|
||||||
* arg2 = error code
|
* arg2 = error code
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int EVENT_SOCKET_KEEPALIVE = BASE + 13;
|
public static final int EVENT_SOCKET_KEEPALIVE = BASE + 13;
|
||||||
|
|
||||||
@@ -183,6 +229,7 @@ public abstract class NetworkAgent {
|
|||||||
* that when crossed should trigger a system wakeup and a NetworkCapabilities update.
|
* that when crossed should trigger a system wakeup and a NetworkCapabilities update.
|
||||||
*
|
*
|
||||||
* obj = int[] describing signal strength thresholds.
|
* obj = int[] describing signal strength thresholds.
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int CMD_SET_SIGNAL_STRENGTH_THRESHOLDS = BASE + 14;
|
public static final int CMD_SET_SIGNAL_STRENGTH_THRESHOLDS = BASE + 14;
|
||||||
|
|
||||||
@@ -190,6 +237,7 @@ public abstract class NetworkAgent {
|
|||||||
* Sent by ConnectivityService to the NeworkAgent to inform the agent to avoid
|
* Sent by ConnectivityService to the NeworkAgent to inform the agent to avoid
|
||||||
* automatically reconnecting to this network (e.g. via autojoin). Happens
|
* automatically reconnecting to this network (e.g. via autojoin). Happens
|
||||||
* when user selects "No" option on the "Stay connected?" dialog box.
|
* when user selects "No" option on the "Stay connected?" dialog box.
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int CMD_PREVENT_AUTOMATIC_RECONNECT = BASE + 15;
|
public static final int CMD_PREVENT_AUTOMATIC_RECONNECT = BASE + 15;
|
||||||
|
|
||||||
@@ -202,6 +250,7 @@ public abstract class NetworkAgent {
|
|||||||
* This does not happen with UDP, so this message is TCP-specific.
|
* This does not happen with UDP, so this message is TCP-specific.
|
||||||
* arg1 = slot number of the keepalive to filter for.
|
* arg1 = slot number of the keepalive to filter for.
|
||||||
* obj = the keepalive packet to send repeatedly.
|
* obj = the keepalive packet to send repeatedly.
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int CMD_ADD_KEEPALIVE_PACKET_FILTER = BASE + 16;
|
public static final int CMD_ADD_KEEPALIVE_PACKET_FILTER = BASE + 16;
|
||||||
|
|
||||||
@@ -209,6 +258,7 @@ public abstract class NetworkAgent {
|
|||||||
* Sent by the KeepaliveTracker to NetworkAgent to remove a packet filter. See
|
* Sent by the KeepaliveTracker to NetworkAgent to remove a packet filter. See
|
||||||
* {@link #CMD_ADD_KEEPALIVE_PACKET_FILTER}.
|
* {@link #CMD_ADD_KEEPALIVE_PACKET_FILTER}.
|
||||||
* arg1 = slot number of the keepalive packet filter to remove.
|
* arg1 = slot number of the keepalive packet filter to remove.
|
||||||
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int CMD_REMOVE_KEEPALIVE_PACKET_FILTER = BASE + 17;
|
public static final int CMD_REMOVE_KEEPALIVE_PACKET_FILTER = BASE + 17;
|
||||||
|
|
||||||
@@ -216,27 +266,32 @@ public abstract class NetworkAgent {
|
|||||||
// of dependent changes that would conflict throughout the automerger graph. Having these
|
// of dependent changes that would conflict throughout the automerger graph. Having these
|
||||||
// temporarily helps with the process of going through with all these dependent changes across
|
// temporarily helps with the process of going through with all these dependent changes across
|
||||||
// the entire tree.
|
// the entire tree.
|
||||||
|
/** @hide TODO: decide which of these to expose. */
|
||||||
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
|
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
|
||||||
NetworkCapabilities nc, LinkProperties lp, int score) {
|
NetworkCapabilities nc, LinkProperties lp, int score) {
|
||||||
this(looper, context, logTag, ni, nc, lp, score, null, NetworkProvider.ID_NONE);
|
this(looper, context, logTag, ni, nc, lp, score, null, NetworkProvider.ID_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @hide TODO: decide which of these to expose. */
|
||||||
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
|
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
|
||||||
NetworkCapabilities nc, LinkProperties lp, int score, NetworkAgentConfig config) {
|
NetworkCapabilities nc, LinkProperties lp, int score, NetworkAgentConfig config) {
|
||||||
this(looper, context, logTag, ni, nc, lp, score, config, NetworkProvider.ID_NONE);
|
this(looper, context, logTag, ni, nc, lp, score, config, NetworkProvider.ID_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @hide TODO: decide which of these to expose. */
|
||||||
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
|
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
|
||||||
NetworkCapabilities nc, LinkProperties lp, int score, int providerId) {
|
NetworkCapabilities nc, LinkProperties lp, int score, int providerId) {
|
||||||
this(looper, context, logTag, ni, nc, lp, score, null, providerId);
|
this(looper, context, logTag, ni, nc, lp, score, null, providerId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @hide TODO: decide which of these to expose. */
|
||||||
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
|
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
|
||||||
NetworkCapabilities nc, LinkProperties lp, int score, NetworkAgentConfig config,
|
NetworkCapabilities nc, LinkProperties lp, int score, NetworkAgentConfig config,
|
||||||
int providerId) {
|
int providerId) {
|
||||||
mHandler = new NetworkAgentHandler(looper);
|
mHandler = new NetworkAgentHandler(looper);
|
||||||
LOG_TAG = logTag;
|
LOG_TAG = logTag;
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mProviderId = providerId;
|
this.providerId = providerId;
|
||||||
if (ni == null || nc == null || lp == null) {
|
if (ni == null || nc == null || lp == null) {
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
}
|
}
|
||||||
@@ -284,7 +339,7 @@ public abstract class NetworkAgent {
|
|||||||
case AsyncChannel.CMD_CHANNEL_DISCONNECTED: {
|
case AsyncChannel.CMD_CHANNEL_DISCONNECTED: {
|
||||||
if (DBG) log("NetworkAgent channel lost");
|
if (DBG) log("NetworkAgent channel lost");
|
||||||
// let the client know CS is done with us.
|
// let the client know CS is done with us.
|
||||||
unwanted();
|
onNetworkUnwanted();
|
||||||
synchronized (mPreConnectedQueue) {
|
synchronized (mPreConnectedQueue) {
|
||||||
mAsyncChannel = null;
|
mAsyncChannel = null;
|
||||||
}
|
}
|
||||||
@@ -300,16 +355,16 @@ public abstract class NetworkAgent {
|
|||||||
log("CMD_REQUEST_BANDWIDTH_UPDATE request received.");
|
log("CMD_REQUEST_BANDWIDTH_UPDATE request received.");
|
||||||
}
|
}
|
||||||
if (currentTimeMs >= (mLastBwRefreshTime + BW_REFRESH_MIN_WIN_MS)) {
|
if (currentTimeMs >= (mLastBwRefreshTime + BW_REFRESH_MIN_WIN_MS)) {
|
||||||
mPollLceScheduled = false;
|
mBandwidthUpdateScheduled = false;
|
||||||
if (!mPollLcePending.getAndSet(true)) {
|
if (!mBandwidthUpdatePending.getAndSet(true)) {
|
||||||
pollLceData();
|
onBandwidthUpdateRequested();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// deliver the request at a later time rather than discard it completely.
|
// deliver the request at a later time rather than discard it completely.
|
||||||
if (!mPollLceScheduled) {
|
if (!mBandwidthUpdateScheduled) {
|
||||||
long waitTime = mLastBwRefreshTime + BW_REFRESH_MIN_WIN_MS
|
long waitTime = mLastBwRefreshTime + BW_REFRESH_MIN_WIN_MS
|
||||||
- currentTimeMs + 1;
|
- currentTimeMs + 1;
|
||||||
mPollLceScheduled = sendEmptyMessageDelayed(
|
mBandwidthUpdateScheduled = sendEmptyMessageDelayed(
|
||||||
CMD_REQUEST_BANDWIDTH_UPDATE, waitTime);
|
CMD_REQUEST_BANDWIDTH_UPDATE, waitTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -322,19 +377,20 @@ public abstract class NetworkAgent {
|
|||||||
+ (msg.arg1 == VALID_NETWORK ? "VALID, " : "INVALID, ")
|
+ (msg.arg1 == VALID_NETWORK ? "VALID, " : "INVALID, ")
|
||||||
+ redirectUrl);
|
+ redirectUrl);
|
||||||
}
|
}
|
||||||
networkStatus(msg.arg1, redirectUrl);
|
onValidationStatus(msg.arg1 /* status */, redirectUrl);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_SAVE_ACCEPT_UNVALIDATED: {
|
case CMD_SAVE_ACCEPT_UNVALIDATED: {
|
||||||
saveAcceptUnvalidated(msg.arg1 != 0);
|
onSaveAcceptUnvalidated(msg.arg1 != 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_START_SOCKET_KEEPALIVE: {
|
case CMD_START_SOCKET_KEEPALIVE: {
|
||||||
startSocketKeepalive(msg);
|
onStartSocketKeepalive(msg.arg1 /* slot */, msg.arg2 /* interval */,
|
||||||
|
(KeepalivePacketData) msg.obj /* packet */);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_STOP_SOCKET_KEEPALIVE: {
|
case CMD_STOP_SOCKET_KEEPALIVE: {
|
||||||
stopSocketKeepalive(msg);
|
onStopSocketKeepalive(msg.arg1 /* slot */);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -347,19 +403,20 @@ public abstract class NetworkAgent {
|
|||||||
for (int i = 0; i < intThresholds.length; i++) {
|
for (int i = 0; i < intThresholds.length; i++) {
|
||||||
intThresholds[i] = thresholds.get(i);
|
intThresholds[i] = thresholds.get(i);
|
||||||
}
|
}
|
||||||
setSignalStrengthThresholds(intThresholds);
|
onSignalStrengthThresholdsUpdated(intThresholds);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_PREVENT_AUTOMATIC_RECONNECT: {
|
case CMD_PREVENT_AUTOMATIC_RECONNECT: {
|
||||||
preventAutomaticReconnect();
|
onAutomaticReconnectDisabled();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_ADD_KEEPALIVE_PACKET_FILTER: {
|
case CMD_ADD_KEEPALIVE_PACKET_FILTER: {
|
||||||
addKeepalivePacketFilter(msg);
|
onAddKeepalivePacketFilter(msg.arg1 /* slot */,
|
||||||
|
(KeepalivePacketData) msg.obj /* packet */);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CMD_REMOVE_KEEPALIVE_PACKET_FILTER: {
|
case CMD_REMOVE_KEEPALIVE_PACKET_FILTER: {
|
||||||
removeKeepalivePacketFilter(msg);
|
onRemoveKeepalivePacketFilter(msg.arg1 /* slot */);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -394,14 +451,16 @@ public abstract class NetworkAgent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by the bearer code when it has new LinkProperties data.
|
* Must be called by the agent when the network's {@link LinkProperties} change.
|
||||||
|
* @param linkProperties the new LinkProperties.
|
||||||
*/
|
*/
|
||||||
public void sendLinkProperties(LinkProperties linkProperties) {
|
public void sendLinkProperties(@NonNull LinkProperties linkProperties) {
|
||||||
queueOrSendMessage(EVENT_NETWORK_PROPERTIES_CHANGED, new LinkProperties(linkProperties));
|
queueOrSendMessage(EVENT_NETWORK_PROPERTIES_CHANGED, new LinkProperties(linkProperties));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by the bearer code when it has new NetworkInfo data.
|
* Must be called by the agent when it has a new NetworkInfo object.
|
||||||
|
* @hide TODO: expose something better.
|
||||||
*/
|
*/
|
||||||
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
|
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
|
||||||
public void sendNetworkInfo(NetworkInfo networkInfo) {
|
public void sendNetworkInfo(NetworkInfo networkInfo) {
|
||||||
@@ -409,17 +468,19 @@ public abstract class NetworkAgent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by the bearer code when it has new NetworkCapabilities data.
|
* Must be called by the agent when the network's {@link NetworkCapabilities} change.
|
||||||
|
* @param networkCapabilities the new NetworkCapabilities.
|
||||||
*/
|
*/
|
||||||
public void sendNetworkCapabilities(NetworkCapabilities networkCapabilities) {
|
public void sendNetworkCapabilities(@NonNull NetworkCapabilities networkCapabilities) {
|
||||||
mPollLcePending.set(false);
|
mBandwidthUpdatePending.set(false);
|
||||||
mLastBwRefreshTime = System.currentTimeMillis();
|
mLastBwRefreshTime = System.currentTimeMillis();
|
||||||
queueOrSendMessage(EVENT_NETWORK_CAPABILITIES_CHANGED,
|
queueOrSendMessage(EVENT_NETWORK_CAPABILITIES_CHANGED,
|
||||||
new NetworkCapabilities(networkCapabilities));
|
new NetworkCapabilities(networkCapabilities));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by the bearer code when it has a new score for this network.
|
* Must be called by the agent to update the score of this network.
|
||||||
|
* @param score the new score.
|
||||||
*/
|
*/
|
||||||
public void sendNetworkScore(int score) {
|
public void sendNetworkScore(int score) {
|
||||||
if (score < 0) {
|
if (score < 0) {
|
||||||
@@ -431,14 +492,16 @@ public abstract class NetworkAgent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by the bearer code when it has a new NetworkScore for this network.
|
* Must be called by the agent when it has a new {@link NetworkScore} for this network.
|
||||||
|
* @param ns the new score.
|
||||||
|
* @hide TODO: unhide the NetworkScore class, and rename to sendNetworkScore.
|
||||||
*/
|
*/
|
||||||
public void updateScore(@NonNull NetworkScore ns) {
|
public void updateScore(@NonNull NetworkScore ns) {
|
||||||
queueOrSendMessage(EVENT_NETWORK_SCORE_CHANGED, new NetworkScore(ns));
|
queueOrSendMessage(EVENT_NETWORK_SCORE_CHANGED, new NetworkScore(ns));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by the bearer to indicate this network was manually selected by the user.
|
* Must be called by the agent to indicate this network was manually selected by the user.
|
||||||
* This should be called before the NetworkInfo is marked CONNECTED so that this
|
* This should be called before the NetworkInfo is marked CONNECTED so that this
|
||||||
* Network can be given special treatment at that time. If {@code acceptUnvalidated} is
|
* Network can be given special treatment at that time. If {@code acceptUnvalidated} is
|
||||||
* {@code true}, then the system will switch to this network. If it is {@code false} and the
|
* {@code true}, then the system will switch to this network. If it is {@code false} and the
|
||||||
@@ -447,15 +510,16 @@ public abstract class NetworkAgent {
|
|||||||
* {@link #saveAcceptUnvalidated} to persist the user's choice. Thus, if the transport ever
|
* {@link #saveAcceptUnvalidated} to persist the user's choice. Thus, if the transport ever
|
||||||
* calls this method with {@code acceptUnvalidated} set to {@code false}, it must also implement
|
* calls this method with {@code acceptUnvalidated} set to {@code false}, it must also implement
|
||||||
* {@link #saveAcceptUnvalidated} to respect the user's choice.
|
* {@link #saveAcceptUnvalidated} to respect the user's choice.
|
||||||
|
* @hide should move to NetworkAgentConfig.
|
||||||
*/
|
*/
|
||||||
public void explicitlySelected(boolean acceptUnvalidated) {
|
public void explicitlySelected(boolean acceptUnvalidated) {
|
||||||
explicitlySelected(true /* explicitlySelected */, acceptUnvalidated);
|
explicitlySelected(true /* explicitlySelected */, acceptUnvalidated);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by the bearer to indicate whether the network was manually selected by the user.
|
* Must be called by the agent to indicate whether the network was manually selected by the
|
||||||
* This should be called before the NetworkInfo is marked CONNECTED so that this
|
* user. This should be called before the network becomes connected, so it can be given
|
||||||
* Network can be given special treatment at that time.
|
* special treatment when it does.
|
||||||
*
|
*
|
||||||
* If {@code explicitlySelected} is {@code true}, and {@code acceptUnvalidated} is {@code true},
|
* If {@code explicitlySelected} is {@code true}, and {@code acceptUnvalidated} is {@code true},
|
||||||
* then the system will switch to this network. If {@code explicitlySelected} is {@code true}
|
* then the system will switch to this network. If {@code explicitlySelected} is {@code true}
|
||||||
@@ -470,6 +534,7 @@ public abstract class NetworkAgent {
|
|||||||
* {@code true}, the system will interpret this as the user having accepted partial connectivity
|
* {@code true}, the system will interpret this as the user having accepted partial connectivity
|
||||||
* on this network. Thus, the system will switch to the network and consider it validated even
|
* on this network. Thus, the system will switch to the network and consider it validated even
|
||||||
* if it only provides partial connectivity, but the network is not otherwise treated specially.
|
* if it only provides partial connectivity, but the network is not otherwise treated specially.
|
||||||
|
* @hide should move to NetworkAgentConfig.
|
||||||
*/
|
*/
|
||||||
public void explicitlySelected(boolean explicitlySelected, boolean acceptUnvalidated) {
|
public void explicitlySelected(boolean explicitlySelected, boolean acceptUnvalidated) {
|
||||||
queueOrSendMessage(EVENT_SET_EXPLICITLY_SELECTED,
|
queueOrSendMessage(EVENT_SET_EXPLICITLY_SELECTED,
|
||||||
@@ -483,73 +548,126 @@ public abstract class NetworkAgent {
|
|||||||
* as well, either canceling NetworkRequests or altering their score such that this
|
* as well, either canceling NetworkRequests or altering their score such that this
|
||||||
* network won't be immediately requested again.
|
* network won't be immediately requested again.
|
||||||
*/
|
*/
|
||||||
abstract protected void unwanted();
|
public void onNetworkUnwanted() {
|
||||||
|
unwanted();
|
||||||
|
}
|
||||||
|
/** @hide TODO delete once subclasses have moved to onNetworkUnwanted. */
|
||||||
|
protected void unwanted() {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when ConnectivityService request a bandwidth update. The parent factory
|
* Called when ConnectivityService request a bandwidth update. The parent factory
|
||||||
* shall try to overwrite this method and produce a bandwidth update if capable.
|
* shall try to overwrite this method and produce a bandwidth update if capable.
|
||||||
*/
|
*/
|
||||||
|
public void onBandwidthUpdateRequested() {
|
||||||
|
pollLceData();
|
||||||
|
}
|
||||||
|
/** @hide TODO delete once subclasses have moved to onBandwidthUpdateRequested. */
|
||||||
protected void pollLceData() {
|
protected void pollLceData() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the system determines the usefulness of this network.
|
* Called when the system determines the usefulness of this network.
|
||||||
*
|
*
|
||||||
* Networks claiming internet connectivity will have their internet
|
* The system attempts to validate Internet connectivity on networks that provide the
|
||||||
* connectivity verified.
|
* {@NetworkCapabilities#NET_CAPABILITY_INTERNET} capability.
|
||||||
*
|
*
|
||||||
* Currently there are two possible values:
|
* Currently there are two possible values:
|
||||||
* {@code VALID_NETWORK} if the system is happy with the connection,
|
* {@code VALIDATION_STATUS_VALID} if Internet connectivity was validated,
|
||||||
* {@code INVALID_NETWORK} if the system is not happy.
|
* {@code VALIDATION_STATUS_NOT_VALID} if Internet connectivity was not validated.
|
||||||
* TODO - add indications of captive portal-ness and related success/failure,
|
|
||||||
* ie, CAPTIVE_SUCCESS_NETWORK, CAPTIVE_NETWORK for successful login and detection
|
|
||||||
*
|
*
|
||||||
* This may be called multiple times as the network status changes and may
|
* This may be called multiple times as network status changes, or if there are multiple
|
||||||
* generate false negatives if we lose ip connectivity before the link is torn down.
|
* subsequent attempts to validate connectivity that fail.
|
||||||
*
|
*
|
||||||
* @param status one of {@code VALID_NETWORK} or {@code INVALID_NETWORK}.
|
* @param status one of {@code VALIDATION_STATUS_VALID} or {@code VALIDATION_STATUS_NOT_VALID}.
|
||||||
* @param redirectUrl If the Internet probe was redirected, this is the destination it was
|
* @param redirectUrl If Internet connectivity is being redirected (e.g., on a captive portal),
|
||||||
* redirected to, otherwise {@code null}.
|
* this is the destination the probes are being redirected to, otherwise {@code null}.
|
||||||
*/
|
*/
|
||||||
|
public void onValidationStatus(int status, @Nullable String redirectUrl) {
|
||||||
|
networkStatus(status, redirectUrl);
|
||||||
|
}
|
||||||
|
/** @hide TODO delete once subclasses have moved to onValidationStatus */
|
||||||
protected void networkStatus(int status, String redirectUrl) {
|
protected void networkStatus(int status, String redirectUrl) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the user asks to remember the choice to use this network even if unvalidated.
|
* Called when the user asks to remember the choice to use this network even if unvalidated.
|
||||||
* The transport is responsible for remembering the choice, and the next time the user connects
|
* The transport is responsible for remembering the choice, and the next time the user connects
|
||||||
* to the network, should explicitlySelected with {@code acceptUnvalidated} set to {@code true}.
|
* to the network, should explicitlySelected with {@code acceptUnvalidated} set to {@code true}.
|
||||||
* This method will only be called if {@link #explicitlySelected} was called with
|
* This method will only be called if {@link #explicitlySelected} was called with
|
||||||
* {@code acceptUnvalidated} set to {@code false}.
|
* {@code acceptUnvalidated} set to {@code false}.
|
||||||
|
* @param accept whether the user wants to use the network even if unvalidated.
|
||||||
*/
|
*/
|
||||||
|
public void onSaveAcceptUnvalidated(boolean accept) {
|
||||||
|
saveAcceptUnvalidated(accept);
|
||||||
|
}
|
||||||
|
/** @hide TODO delete once subclasses have moved to onSaveAcceptUnvalidated */
|
||||||
protected void saveAcceptUnvalidated(boolean accept) {
|
protected void saveAcceptUnvalidated(boolean accept) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Requests that the network hardware send the specified packet at the specified interval.
|
* Requests that the network hardware send the specified packet at the specified interval.
|
||||||
|
*
|
||||||
|
* @param slot the hardware slot on which to start the keepalive.
|
||||||
|
* @param intervalSeconds the interval between packets
|
||||||
|
* @param packet the packet to send.
|
||||||
*/
|
*/
|
||||||
|
public void onStartSocketKeepalive(int slot, int intervalSeconds,
|
||||||
|
@NonNull KeepalivePacketData packet) {
|
||||||
|
Message msg = mHandler.obtainMessage(CMD_START_SOCKET_KEEPALIVE, slot, intervalSeconds,
|
||||||
|
packet);
|
||||||
|
startSocketKeepalive(msg);
|
||||||
|
msg.recycle();
|
||||||
|
}
|
||||||
|
/** @hide TODO delete once subclasses have moved to onStartSocketKeepalive */
|
||||||
protected void startSocketKeepalive(Message msg) {
|
protected void startSocketKeepalive(Message msg) {
|
||||||
onSocketKeepaliveEvent(msg.arg1, SocketKeepalive.ERROR_UNSUPPORTED);
|
onSocketKeepaliveEvent(msg.arg1, SocketKeepalive.ERROR_UNSUPPORTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Requests that the network hardware send the specified packet at the specified interval.
|
* Requests that the network hardware stop a previously-started keepalive.
|
||||||
|
*
|
||||||
|
* @param slot the hardware slot on which to stop the keepalive.
|
||||||
*/
|
*/
|
||||||
|
public void onStopSocketKeepalive(int slot) {
|
||||||
|
Message msg = mHandler.obtainMessage(CMD_STOP_SOCKET_KEEPALIVE, slot, 0, null);
|
||||||
|
stopSocketKeepalive(msg);
|
||||||
|
msg.recycle();
|
||||||
|
}
|
||||||
|
/** @hide TODO delete once subclasses have moved to onStopSocketKeepalive */
|
||||||
protected void stopSocketKeepalive(Message msg) {
|
protected void stopSocketKeepalive(Message msg) {
|
||||||
onSocketKeepaliveEvent(msg.arg1, SocketKeepalive.ERROR_UNSUPPORTED);
|
onSocketKeepaliveEvent(msg.arg1, SocketKeepalive.ERROR_UNSUPPORTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by the network when a socket keepalive event occurs.
|
* Must be called by the agent when a socket keepalive event occurs.
|
||||||
|
*
|
||||||
|
* @param slot the hardware slot on which the event occurred.
|
||||||
|
* @param event the event that occurred.
|
||||||
*/
|
*/
|
||||||
|
public void sendSocketKeepaliveEvent(int slot, int event) {
|
||||||
|
queueOrSendMessage(EVENT_SOCKET_KEEPALIVE, slot, event);
|
||||||
|
}
|
||||||
|
/** @hide TODO delete once callers have moved to sendSocketKeepaliveEvent */
|
||||||
public void onSocketKeepaliveEvent(int slot, int reason) {
|
public void onSocketKeepaliveEvent(int slot, int reason) {
|
||||||
queueOrSendMessage(EVENT_SOCKET_KEEPALIVE, slot, reason);
|
sendSocketKeepaliveEvent(slot, reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by ConnectivityService to add specific packet filter to network hardware to block
|
* Called by ConnectivityService to add specific packet filter to network hardware to block
|
||||||
* ACKs matching the sent keepalive packets. Implementations that support this feature must
|
* replies (e.g., TCP ACKs) matching the sent keepalive packets. Implementations that support
|
||||||
* override this method.
|
* this feature must override this method.
|
||||||
|
*
|
||||||
|
* @param slot the hardware slot on which the keepalive should be sent.
|
||||||
|
* @param packet the packet that is being sent.
|
||||||
*/
|
*/
|
||||||
|
public void onAddKeepalivePacketFilter(int slot, @NonNull KeepalivePacketData packet) {
|
||||||
|
Message msg = mHandler.obtainMessage(CMD_ADD_KEEPALIVE_PACKET_FILTER, slot, 0, packet);
|
||||||
|
addKeepalivePacketFilter(msg);
|
||||||
|
msg.recycle();
|
||||||
|
}
|
||||||
|
/** @hide TODO delete once subclasses have moved to onAddKeepalivePacketFilter */
|
||||||
protected void addKeepalivePacketFilter(Message msg) {
|
protected void addKeepalivePacketFilter(Message msg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -557,14 +675,28 @@ public abstract class NetworkAgent {
|
|||||||
* Called by ConnectivityService to remove a packet filter installed with
|
* Called by ConnectivityService to remove a packet filter installed with
|
||||||
* {@link #addKeepalivePacketFilter(Message)}. Implementations that support this feature
|
* {@link #addKeepalivePacketFilter(Message)}. Implementations that support this feature
|
||||||
* must override this method.
|
* must override this method.
|
||||||
|
*
|
||||||
|
* @param slot the hardware slot on which the keepalive is being sent.
|
||||||
*/
|
*/
|
||||||
|
public void onRemoveKeepalivePacketFilter(int slot) {
|
||||||
|
Message msg = mHandler.obtainMessage(CMD_REMOVE_KEEPALIVE_PACKET_FILTER, slot, 0, null);
|
||||||
|
removeKeepalivePacketFilter(msg);
|
||||||
|
msg.recycle();
|
||||||
|
}
|
||||||
|
/** @hide TODO delete once subclasses have moved to onRemoveKeepalivePacketFilter */
|
||||||
protected void removeKeepalivePacketFilter(Message msg) {
|
protected void removeKeepalivePacketFilter(Message msg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by ConnectivityService to inform this network transport of signal strength thresholds
|
* Called by ConnectivityService to inform this network transport of signal strength thresholds
|
||||||
* that when crossed should trigger a system wakeup and a NetworkCapabilities update.
|
* that when crossed should trigger a system wakeup and a NetworkCapabilities update.
|
||||||
|
*
|
||||||
|
* @param thresholds the array of thresholds that should trigger wakeups.
|
||||||
*/
|
*/
|
||||||
|
public void onSignalStrengthThresholdsUpdated(@NonNull int[] thresholds) {
|
||||||
|
setSignalStrengthThresholds(thresholds);
|
||||||
|
}
|
||||||
|
/** @hide TODO delete once subclasses have moved to onSetSignalStrengthThresholds */
|
||||||
protected void setSignalStrengthThresholds(int[] thresholds) {
|
protected void setSignalStrengthThresholds(int[] thresholds) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -574,9 +706,14 @@ public abstract class NetworkAgent {
|
|||||||
* responsible for making sure the device does not automatically reconnect to the same network
|
* responsible for making sure the device does not automatically reconnect to the same network
|
||||||
* after the {@code unwanted} call.
|
* after the {@code unwanted} call.
|
||||||
*/
|
*/
|
||||||
|
public void onAutomaticReconnectDisabled() {
|
||||||
|
preventAutomaticReconnect();
|
||||||
|
}
|
||||||
|
/** @hide TODO delete once subclasses have moved to onAutomaticReconnectDisabled */
|
||||||
protected void preventAutomaticReconnect() {
|
protected void preventAutomaticReconnect() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @hide */
|
||||||
protected void log(String s) {
|
protected void log(String s) {
|
||||||
Log.d(LOG_TAG, "NetworkAgent: " + s);
|
Log.d(LOG_TAG, "NetworkAgent: " + s);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user