summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorEtan Cohen <etancohen@google.com>2015-11-18 10:56:15 -0800
committerEtan Cohen <etancohen@google.com>2015-12-15 08:06:54 -0800
commitddb9ef0357e3ee609e188fb9e1e461f95aa601fa (patch)
treec633b8d293316ff15696af60f8b5328635b85bbc /core/java/android
parent9be302b47c81fb1d575b5019598984ed5d0cb24e (diff)
Allow NetworkFactories to match any network specifier on a request
Current usage of NetworkSpecifier: network factory will match a request if the request has either a (1) empty network specifier, or (2) a network specifier which is identical to that of the network factory. Note: 'matching' w.r.t. network specifier - all other matching rules are still in effect. Change: add rule (3) or the network specifier of the network factory is the special string (which is defined as "*" and which user-facing network requests aren't allowed to use). Rationale: allows on-demand network creation. Example: - Can specify a Wi-Fi NetworkRequest with NetworkSpecifier="ssid" - It will match a Wi-Fi network factory specifying NetworkSpecifier="*" - That network factory will bring up a Wi-Fi network, connecting to the specified SSID. - Once the network is created it will create a NetworkAgent which will now have a NetworkSpecifier matching that of the request (not the match-all special string!) That final step of making sure that the NetworkAgent matches the request and not the match-all is critical to delivering any subsequent callbacks correctly. I.e. your network will only get callbacks which match it. Bug: 26192833 Change-Id: I49e3b492e0bb48a3f6e9a34e3f94f0e1cf89741f
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/net/NetworkCapabilities.java16
-rw-r--r--core/java/android/net/NetworkRequest.java4
2 files changed, 19 insertions, 1 deletions
diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java
index 3bd12c060748..e27c0fb2ddea 100644
--- a/core/java/android/net/NetworkCapabilities.java
+++ b/core/java/android/net/NetworkCapabilities.java
@@ -197,6 +197,19 @@ public final class NetworkCapabilities implements Parcelable {
(1 << NET_CAPABILITY_CAPTIVE_PORTAL);
/**
+ * Network specifier for factories which want to match any network specifier
+ * (NS) in a request. Behavior:
+ * <li>Empty NS in request matches any network factory NS</li>
+ * <li>Empty NS in the network factory NS only matches a request with an
+ * empty NS</li>
+ * <li>"*" (this constant) NS in the network factory matches requests with
+ * any NS</li>
+ *
+ * @hide
+ */
+ public static final String MATCH_ALL_REQUESTS_NETWORK_SPECIFIER = "*";
+
+ /**
* Network capabilities that are not allowed in NetworkRequests. This exists because the
* NetworkFactory / NetworkAgent model does not deal well with the situation where a
* capability's presence cannot be known in advance. If such a capability is requested, then we
@@ -596,7 +609,8 @@ public final class NetworkCapabilities implements Parcelable {
}
private boolean satisfiedBySpecifier(NetworkCapabilities nc) {
return (TextUtils.isEmpty(mNetworkSpecifier) ||
- mNetworkSpecifier.equals(nc.mNetworkSpecifier));
+ mNetworkSpecifier.equals(nc.mNetworkSpecifier) ||
+ MATCH_ALL_REQUESTS_NETWORK_SPECIFIER.equals(nc.mNetworkSpecifier));
}
private boolean equalsSpecifier(NetworkCapabilities nc) {
if (TextUtils.isEmpty(mNetworkSpecifier)) {
diff --git a/core/java/android/net/NetworkRequest.java b/core/java/android/net/NetworkRequest.java
index 7da4818991b6..f1edcbe30df6 100644
--- a/core/java/android/net/NetworkRequest.java
+++ b/core/java/android/net/NetworkRequest.java
@@ -188,6 +188,10 @@ public class NetworkRequest implements Parcelable {
* networks.
*/
public Builder setNetworkSpecifier(String networkSpecifier) {
+ if (NetworkCapabilities.MATCH_ALL_REQUESTS_NETWORK_SPECIFIER.equals(networkSpecifier)) {
+ throw new IllegalArgumentException("Invalid network specifier - must not be '"
+ + NetworkCapabilities.MATCH_ALL_REQUESTS_NETWORK_SPECIFIER + "'");
+ }
mNetworkCapabilities.setNetworkSpecifier(networkSpecifier);
return this;
}