Make most of NetworkAgent @SystemApi. am: d60481ce20

Change-Id: Ie36bfb9a1bed114fe628ad6c1b935d587cc3160d
This commit is contained in:
Automerger Merge Worker
2020-01-31 16:25:20 +00:00

View File

@@ -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);
} }