diff options
| author | Etan Cohen <etancohen@google.com> | 2015-11-18 10:56:15 -0800 |
|---|---|---|
| committer | Etan Cohen <etancohen@google.com> | 2015-12-15 08:06:54 -0800 |
| commit | ddb9ef0357e3ee609e188fb9e1e461f95aa601fa (patch) | |
| tree | c633b8d293316ff15696af60f8b5328635b85bbc /core/java/android | |
| parent | 9be302b47c81fb1d575b5019598984ed5d0cb24e (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.java | 16 | ||||
| -rw-r--r-- | core/java/android/net/NetworkRequest.java | 4 |
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; } |
