diff options
| -rw-r--r-- | api/current.txt | 1 | ||||
| -rw-r--r-- | api/system-current.txt | 1 | ||||
| -rw-r--r-- | core/java/android/net/ConnectivityManager.java | 40 | ||||
| -rw-r--r-- | services/core/java/com/android/server/ConnectivityService.java | 23 |
4 files changed, 62 insertions, 3 deletions
diff --git a/api/current.txt b/api/current.txt index 3a319cbadc48..02b278604e23 100644 --- a/api/current.txt +++ b/api/current.txt @@ -18166,6 +18166,7 @@ package android.net { method public boolean isDefaultNetworkActive(); method public static deprecated boolean isNetworkTypeValid(int); method public void registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback); + method public void registerNetworkCallback(android.net.NetworkRequest, android.app.PendingIntent); method public void releaseNetworkRequest(android.app.PendingIntent); method public void removeDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener); method public deprecated void reportBadNetwork(android.net.Network); diff --git a/api/system-current.txt b/api/system-current.txt index 95e685e28970..dd232c380da9 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -19667,6 +19667,7 @@ package android.net { method public boolean isDefaultNetworkActive(); method public static deprecated boolean isNetworkTypeValid(int); method public void registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback); + method public void registerNetworkCallback(android.net.NetworkRequest, android.app.PendingIntent); method public void releaseNetworkRequest(android.app.PendingIntent); method public void removeDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener); method public deprecated void reportBadNetwork(android.net.Network); diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index a2ca41ca3788..b9f7365d8ce5 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -2461,7 +2461,7 @@ public class ConnectivityManager { * Intent to reserve the network or it will be released shortly after the Intent * is processed. * <p> - * If there is already an request for this Intent registered (with the equality of + * If there is already a request for this Intent registered (with the equality of * two Intents defined by {@link Intent#filterEquals}), then it will be removed and * replaced by this one, effectively releasing the previous {@link NetworkRequest}. * <p> @@ -2521,6 +2521,44 @@ public class ConnectivityManager { } /** + * Registers a PendingIntent to be sent when a network is available which satisfies the given + * {@link NetworkRequest}. + * + * This function behaves identically to the version that takes a NetworkCallback, but instead + * of {@link NetworkCallback} a {@link PendingIntent} is used. This means + * the request may outlive the calling application and get called back when a suitable + * network is found. + * <p> + * The operation is an Intent broadcast that goes to a broadcast receiver that + * you registered with {@link Context#registerReceiver} or through the + * <receiver> tag in an AndroidManifest.xml file + * <p> + * The operation Intent is delivered with two extras, a {@link Network} typed + * extra called {@link #EXTRA_NETWORK} and a {@link NetworkRequest} + * typed extra called {@link #EXTRA_NETWORK_REQUEST} containing + * the original requests parameters. + * <p> + * If there is already a request for this Intent registered (with the equality of + * two Intents defined by {@link Intent#filterEquals}), then it will be removed and + * replaced by this one, effectively releasing the previous {@link NetworkRequest}. + * <p> + * The request may be released normally by calling + * {@link #releaseNetworkRequest(android.app.PendingIntent)}. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. + * @param request {@link NetworkRequest} describing this request. + * @param operation Action to perform when the network is available (corresponds + * to the {@link NetworkCallback#onAvailable} call. Typically + * comes from {@link PendingIntent#getBroadcast}. Cannot be null. + */ + public void registerNetworkCallback(NetworkRequest request, PendingIntent operation) { + checkPendingIntent(operation); + try { + mService.pendingListenForNetwork(request.networkCapabilities, operation); + } catch (RemoteException e) {} + } + + /** * Requests bandwidth update for a given {@link Network} and returns whether the update request * is accepted by ConnectivityService. Once accepted, ConnectivityService will poll underlying * network connection for updated bandwidth information. The caller will be notified via diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 08b718417660..5aae7134e5d6 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -326,7 +326,7 @@ public class ConnectivityService extends IConnectivityManager.Stub /** * used to add a network request with a pending intent - * includes a NetworkRequestInfo + * obj = NetworkRequestInfo */ private static final int EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT = 26; @@ -356,6 +356,12 @@ public class ConnectivityService extends IConnectivityManager.Stub */ private static final int EVENT_CONFIGURE_MOBILE_DATA_ALWAYS_ON = 30; + /** + * used to add a network listener with a pending intent + * obj = NetworkRequestInfo + */ + private static final int EVENT_REGISTER_NETWORK_LISTENER_WITH_INTENT = 31; + /** Handler used for internal events. */ final private InternalHandler mHandler; /** Handler used for incoming {@link NetworkStateTracker} events. */ @@ -2484,7 +2490,8 @@ public class ConnectivityService extends IConnectivityManager.Stub handleRegisterNetworkRequest((NetworkRequestInfo) msg.obj); break; } - case EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT: { + case EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT: + case EVENT_REGISTER_NETWORK_LISTENER_WITH_INTENT: { handleRegisterNetworkRequestWithIntent(msg); break; } @@ -3693,6 +3700,18 @@ public class ConnectivityService extends IConnectivityManager.Stub @Override public void pendingListenForNetwork(NetworkCapabilities networkCapabilities, PendingIntent operation) { + checkNotNull(operation, "PendingIntent cannot be null."); + if (!hasWifiNetworkListenPermission(networkCapabilities)) { + enforceAccessPermission(); + } + + NetworkRequest networkRequest = new NetworkRequest(new NetworkCapabilities( + networkCapabilities), TYPE_NONE, nextNetworkRequestId()); + if (DBG) log("pendingListenForNetwork for " + networkRequest + " to trigger " + operation); + NetworkRequestInfo nri = new NetworkRequestInfo(networkRequest, operation, + NetworkRequestInfo.LISTEN); + + mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_LISTENER, nri)); } @Override |