diff options
| -rwxr-xr-x | api/system-current.txt | 21 | ||||
| -rw-r--r-- | core/java/android/net/NetworkAgent.java | 235 |
2 files changed, 207 insertions, 49 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 65b9b1fed9de..305d5713b975 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4538,6 +4538,27 @@ package android.net { field public final int netId; } + public abstract class NetworkAgent { + method public void onAddKeepalivePacketFilter(int, @NonNull android.net.KeepalivePacketData); + method public void onAutomaticReconnectDisabled(); + method public void onBandwidthUpdateRequested(); + method public void onNetworkUnwanted(); + method public void onRemoveKeepalivePacketFilter(int); + method public void onSaveAcceptUnvalidated(boolean); + method public void onSignalStrengthThresholdsUpdated(@NonNull int[]); + method public void onStartSocketKeepalive(int, int, @NonNull android.net.KeepalivePacketData); + method public void onStopSocketKeepalive(int); + method public void onValidationStatus(int, @Nullable String); + method public void sendLinkProperties(@NonNull android.net.LinkProperties); + method public void sendNetworkCapabilities(@NonNull android.net.NetworkCapabilities); + method public void sendNetworkScore(int); + method public void sendSocketKeepaliveEvent(int, int); + field public static final int VALIDATION_STATUS_NOT_VALID = 2; // 0x2 + field public static final int VALIDATION_STATUS_VALID = 1; // 0x1 + field @NonNull public final android.net.Network network; + field public final int providerId; + } + public final class NetworkAgentConfig implements android.os.Parcelable { method public int describeContents(); method @Nullable public String getSubscriberId(); diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java index 7316dfa5d1c6..aae9fd4725b4 100644 --- a/core/java/android/net/NetworkAgent.java +++ b/core/java/android/net/NetworkAgent.java @@ -17,6 +17,8 @@ package android.net; import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.SystemApi; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.os.Build; @@ -43,7 +45,12 @@ import java.util.concurrent.atomic.AtomicBoolean; * * @hide */ +@SystemApi public abstract class NetworkAgent { + /** + * The {@link Network} corresponding to this object. + */ + @NonNull public final Network network; private final Handler mHandler; @@ -55,9 +62,14 @@ public abstract class NetworkAgent { private final ArrayList<Message>mPreConnectedQueue = new ArrayList<Message>(); private volatile long mLastBwRefreshTime = 0; private static final long BW_REFRESH_MIN_WIN_MS = 500; - private boolean mPollLceScheduled = false; - private AtomicBoolean mPollLcePending = new AtomicBoolean(false); - public final int mProviderId; + private boolean mBandwidthUpdateScheduled = false; + private AtomicBoolean mBandwidthUpdatePending = new AtomicBoolean(false); + + /** + * 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; @@ -65,6 +77,7 @@ public abstract class NetworkAgent { * Sent by ConnectivityService to the NetworkAgent to inform it of * suspected connectivity problems on its network. The NetworkAgent * should take steps to verify and correct connectivity. + * @hide */ public static final int CMD_SUSPECT_BAD = BASE; @@ -73,6 +86,7 @@ public abstract class NetworkAgent { * ConnectivityService to pass the current NetworkInfo (connection state). * Sent when the NetworkInfo changes, mainly due to change of state. * obj = NetworkInfo + * @hide */ 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 * NetworkCapabilties. * obj = NetworkCapabilities + * @hide */ 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 * NetworkProperties. * obj = NetworkProperties + * @hide */ 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 + * @hide */ 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 * network score. * obj = network score Integer + * @hide */ 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} * representing URL that Internet probe was redirect to, if it was redirected, * or mapping to {@code null} otherwise. + * @hide */ 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; + /** @hide */ 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"; /** @@ -125,6 +165,7 @@ public abstract class NetworkAgent { * CONNECTED so it can be given special treatment at that time. * * obj = boolean indicating whether to use this network even if unvalidated + * @hide */ public static final int EVENT_SET_EXPLICITLY_SELECTED = BASE + 8; @@ -135,12 +176,14 @@ public abstract class NetworkAgent { * responsibility to remember it. * * arg1 = 1 if true, 0 if false + * @hide */ public static final int CMD_SAVE_ACCEPT_UNVALIDATED = BASE + 9; /** * Sent by ConnectivityService to the NetworkAgent to inform the agent to pull * the underlying network connection for updated bandwidth information. + * @hide */ 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 * * Also used internally by ConnectivityService / KeepaliveTracker, with different semantics. + * @hide */ 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. * * Also used internally by ConnectivityService / KeepaliveTracker, with different semantics. + * @hide */ public static final int CMD_STOP_SOCKET_KEEPALIVE = BASE + 12; @@ -175,6 +220,7 @@ public abstract class NetworkAgent { * * arg1 = slot number of the keepalive * arg2 = error code + * @hide */ 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. * * obj = int[] describing signal strength thresholds. + * @hide */ 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 * automatically reconnecting to this network (e.g. via autojoin). Happens * when user selects "No" option on the "Stay connected?" dialog box. + * @hide */ 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. * arg1 = slot number of the keepalive to filter for. * obj = the keepalive packet to send repeatedly. + * @hide */ 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 * {@link #CMD_ADD_KEEPALIVE_PACKET_FILTER}. * arg1 = slot number of the keepalive packet filter to remove. + * @hide */ 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 // temporarily helps with the process of going through with all these dependent changes across // the entire tree. + /** @hide TODO: decide which of these to expose. */ public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score) { 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, NetworkCapabilities nc, LinkProperties lp, int score, NetworkAgentConfig config) { 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, NetworkCapabilities nc, LinkProperties lp, int score, int 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, NetworkCapabilities nc, LinkProperties lp, int score, NetworkAgentConfig config, int providerId) { mHandler = new NetworkAgentHandler(looper); LOG_TAG = logTag; mContext = context; - mProviderId = providerId; + this.providerId = providerId; if (ni == null || nc == null || lp == null) { throw new IllegalArgumentException(); } @@ -284,7 +339,7 @@ public abstract class NetworkAgent { case AsyncChannel.CMD_CHANNEL_DISCONNECTED: { if (DBG) log("NetworkAgent channel lost"); // let the client know CS is done with us. - unwanted(); + onNetworkUnwanted(); synchronized (mPreConnectedQueue) { mAsyncChannel = null; } @@ -300,16 +355,16 @@ public abstract class NetworkAgent { log("CMD_REQUEST_BANDWIDTH_UPDATE request received."); } if (currentTimeMs >= (mLastBwRefreshTime + BW_REFRESH_MIN_WIN_MS)) { - mPollLceScheduled = false; - if (!mPollLcePending.getAndSet(true)) { - pollLceData(); + mBandwidthUpdateScheduled = false; + if (!mBandwidthUpdatePending.getAndSet(true)) { + onBandwidthUpdateRequested(); } } else { // deliver the request at a later time rather than discard it completely. - if (!mPollLceScheduled) { + if (!mBandwidthUpdateScheduled) { long waitTime = mLastBwRefreshTime + BW_REFRESH_MIN_WIN_MS - currentTimeMs + 1; - mPollLceScheduled = sendEmptyMessageDelayed( + mBandwidthUpdateScheduled = sendEmptyMessageDelayed( CMD_REQUEST_BANDWIDTH_UPDATE, waitTime); } } @@ -322,19 +377,20 @@ public abstract class NetworkAgent { + (msg.arg1 == VALID_NETWORK ? "VALID, " : "INVALID, ") + redirectUrl); } - networkStatus(msg.arg1, redirectUrl); + onValidationStatus(msg.arg1 /* status */, redirectUrl); break; } case CMD_SAVE_ACCEPT_UNVALIDATED: { - saveAcceptUnvalidated(msg.arg1 != 0); + onSaveAcceptUnvalidated(msg.arg1 != 0); break; } case CMD_START_SOCKET_KEEPALIVE: { - startSocketKeepalive(msg); + onStartSocketKeepalive(msg.arg1 /* slot */, msg.arg2 /* interval */, + (KeepalivePacketData) msg.obj /* packet */); break; } case CMD_STOP_SOCKET_KEEPALIVE: { - stopSocketKeepalive(msg); + onStopSocketKeepalive(msg.arg1 /* slot */); break; } @@ -347,19 +403,20 @@ public abstract class NetworkAgent { for (int i = 0; i < intThresholds.length; i++) { intThresholds[i] = thresholds.get(i); } - setSignalStrengthThresholds(intThresholds); + onSignalStrengthThresholdsUpdated(intThresholds); break; } case CMD_PREVENT_AUTOMATIC_RECONNECT: { - preventAutomaticReconnect(); + onAutomaticReconnectDisabled(); break; } case CMD_ADD_KEEPALIVE_PACKET_FILTER: { - addKeepalivePacketFilter(msg); + onAddKeepalivePacketFilter(msg.arg1 /* slot */, + (KeepalivePacketData) msg.obj /* packet */); break; } case CMD_REMOVE_KEEPALIVE_PACKET_FILTER: { - removeKeepalivePacketFilter(msg); + onRemoveKeepalivePacketFilter(msg.arg1 /* slot */); 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)); } /** - * 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) 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) { - mPollLcePending.set(false); + public void sendNetworkCapabilities(@NonNull NetworkCapabilities networkCapabilities) { + mBandwidthUpdatePending.set(false); mLastBwRefreshTime = System.currentTimeMillis(); queueOrSendMessage(EVENT_NETWORK_CAPABILITIES_CHANGED, 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) { 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) { 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 * 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 @@ -447,15 +510,16 @@ public abstract class NetworkAgent { * {@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 * {@link #saveAcceptUnvalidated} to respect the user's choice. + * @hide should move to NetworkAgentConfig. */ public void explicitlySelected(boolean acceptUnvalidated) { explicitlySelected(true /* explicitlySelected */, acceptUnvalidated); } /** - * Called by the bearer to indicate whether the network was manually selected by the user. - * This should be called before the NetworkInfo is marked CONNECTED so that this - * Network can be given special treatment at that time. + * Must be called by the agent to indicate whether the network was manually selected by the + * user. This should be called before the network becomes connected, so it can be given + * special treatment when it does. * * 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} @@ -470,6 +534,7 @@ public abstract class NetworkAgent { * {@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 * 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) { 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 * 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 * 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() { } /** * Called when the system determines the usefulness of this network. * - * Networks claiming internet connectivity will have their internet - * connectivity verified. + * The system attempts to validate Internet connectivity on networks that provide the + * {@link NetworkCapabilities#NET_CAPABILITY_INTERNET} capability. * * Currently there are two possible values: - * {@code VALID_NETWORK} if the system is happy with the connection, - * {@code INVALID_NETWORK} if the system is not happy. - * TODO - add indications of captive portal-ness and related success/failure, - * ie, CAPTIVE_SUCCESS_NETWORK, CAPTIVE_NETWORK for successful login and detection + * {@code VALIDATION_STATUS_VALID} if Internet connectivity was validated, + * {@code VALIDATION_STATUS_NOT_VALID} if Internet connectivity was not validated. * - * This may be called multiple times as the network status changes and may - * generate false negatives if we lose ip connectivity before the link is torn down. + * This may be called multiple times as network status changes, or if there are multiple + * subsequent attempts to validate connectivity that fail. * - * @param status one of {@code VALID_NETWORK} or {@code INVALID_NETWORK}. - * @param redirectUrl If the Internet probe was redirected, this is the destination it was - * redirected to, otherwise {@code null}. + * @param status one of {@code VALIDATION_STATUS_VALID} or {@code VALIDATION_STATUS_NOT_VALID}. + * @param redirectUrl If Internet connectivity is being redirected (e.g., on a captive portal), + * 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) { } + /** * 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 * to the network, should explicitlySelected with {@code acceptUnvalidated} set to {@code true}. * This method will only be called if {@link #explicitlySelected} was called with * {@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) { } /** * 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) { 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) { 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) { - queueOrSendMessage(EVENT_SOCKET_KEEPALIVE, slot, reason); + sendSocketKeepaliveEvent(slot, reason); } /** * 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 - * override this method. + * replies (e.g., TCP ACKs) matching the sent keepalive packets. Implementations that support + * 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) { } @@ -557,14 +675,28 @@ public abstract class NetworkAgent { * Called by ConnectivityService to remove a packet filter installed with * {@link #addKeepalivePacketFilter(Message)}. Implementations that support this feature * 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) { } /** * Called by ConnectivityService to inform this network transport of signal strength thresholds * 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) { } @@ -574,9 +706,14 @@ public abstract class NetworkAgent { * responsible for making sure the device does not automatically reconnect to the same network * after the {@code unwanted} call. */ + public void onAutomaticReconnectDisabled() { + preventAutomaticReconnect(); + } + /** @hide TODO delete once subclasses have moved to onAutomaticReconnectDisabled */ protected void preventAutomaticReconnect() { } + /** @hide */ protected void log(String s) { Log.d(LOG_TAG, "NetworkAgent: " + s); } |