Merge "Annotate @SystemApi with required permissions." into oc-dev am: c1406978a4
am: 4786aec7cc
Change-Id: Ib629e25dbf047c110feaf03e4ff744b5c6df9aeb
diff --git a/core/java/android/net/NetworkTemplate.java b/core/java/android/net/NetworkTemplate.java
index caf7982..0d2fcd0 100644
--- a/core/java/android/net/NetworkTemplate.java
+++ b/core/java/android/net/NetworkTemplate.java
@@ -18,8 +18,8 @@
import static android.net.ConnectivityManager.TYPE_BLUETOOTH;
import static android.net.ConnectivityManager.TYPE_ETHERNET;
-import static android.net.ConnectivityManager.TYPE_PROXY;
import static android.net.ConnectivityManager.TYPE_MOBILE;
+import static android.net.ConnectivityManager.TYPE_PROXY;
import static android.net.ConnectivityManager.TYPE_WIFI;
import static android.net.ConnectivityManager.TYPE_WIFI_P2P;
import static android.net.ConnectivityManager.TYPE_WIMAX;
@@ -34,8 +34,8 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.util.BackupUtils;
+import android.util.Log;
-import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import java.io.ByteArrayOutputStream;
@@ -52,14 +52,18 @@
* @hide
*/
public class NetworkTemplate implements Parcelable {
+ private static final String TAG = "NetworkTemplate";
+
/**
* Current Version of the Backup Serializer.
*/
private static final int BACKUP_VERSION = 1;
public static final int MATCH_MOBILE_ALL = 1;
+ /** @deprecated don't use this any more */
@Deprecated
public static final int MATCH_MOBILE_3G_LOWER = 2;
+ /** @deprecated don't use this any more */
@Deprecated
public static final int MATCH_MOBILE_4G = 3;
public static final int MATCH_WIFI = 4;
@@ -69,9 +73,26 @@
public static final int MATCH_BLUETOOTH = 8;
public static final int MATCH_PROXY = 9;
+ private static boolean isKnownMatchRule(final int rule) {
+ switch (rule) {
+ case MATCH_MOBILE_ALL:
+ case MATCH_MOBILE_3G_LOWER:
+ case MATCH_MOBILE_4G:
+ case MATCH_WIFI:
+ case MATCH_ETHERNET:
+ case MATCH_MOBILE_WILDCARD:
+ case MATCH_WIFI_WILDCARD:
+ case MATCH_BLUETOOTH:
+ case MATCH_PROXY:
+ return true;
+
+ default:
+ return false;
+ }
+ }
+
private static boolean sForceAllNetworkTypes = false;
- @VisibleForTesting
public static void forceAllNetworkTypes() {
sForceAllNetworkTypes = true;
}
@@ -180,6 +201,11 @@
mSubscriberId = subscriberId;
mMatchSubscriberIds = matchSubscriberIds;
mNetworkId = networkId;
+
+ if (!isKnownMatchRule(matchRule)) {
+ Log.e(TAG, "Unknown network template rule " + matchRule
+ + " will not match any identity.");
+ }
}
private NetworkTemplate(Parcel in) {
@@ -294,7 +320,9 @@
case MATCH_PROXY:
return matchesProxy(ident);
default:
- throw new IllegalArgumentException("unknown network template");
+ // We have no idea what kind of network template we are, so we
+ // just claim not to match anything.
+ return false;
}
}
@@ -428,7 +456,7 @@
case MATCH_PROXY:
return "PROXY";
default:
- return "UNKNOWN";
+ return "UNKNOWN(" + matchRule + ")";
}
}
@@ -496,6 +524,11 @@
String subscriberId = BackupUtils.readString(in);
String networkId = BackupUtils.readString(in);
+ if (!isKnownMatchRule(matchRule)) {
+ throw new BackupUtils.BadVersionException(
+ "Restored network template contains unknown match rule " + matchRule);
+ }
+
return new NetworkTemplate(matchRule, subscriberId, networkId);
}
}
diff --git a/core/java/android/net/nsd/NsdManager.java b/core/java/android/net/nsd/NsdManager.java
index 1e41eea..ace3748 100644
--- a/core/java/android/net/nsd/NsdManager.java
+++ b/core/java/android/net/nsd/NsdManager.java
@@ -16,10 +16,6 @@
package android.net.nsd;
-import static com.android.internal.util.Preconditions.checkArgument;
-import static com.android.internal.util.Preconditions.checkNotNull;
-import static com.android.internal.util.Preconditions.checkStringNotEmpty;
-
import android.annotation.SdkConstant;
import android.annotation.SystemService;
import android.annotation.SdkConstant.SdkConstantType;
@@ -244,12 +240,12 @@
return name;
}
- private static int FIRST_LISTENER_KEY = 1;
-
private final INsdManager mService;
private final Context mContext;
- private int mListenerKey = FIRST_LISTENER_KEY;
+ private static final int INVALID_LISTENER_KEY = 0;
+ private static final int BUSY_LISTENER_KEY = -1;
+ private int mListenerKey = 1;
private final SparseArray mListenerMap = new SparseArray();
private final SparseArray<NsdServiceInfo> mServiceMap = new SparseArray<>();
private final Object mMapLock = new Object();
@@ -315,6 +311,7 @@
public void onServiceFound(NsdServiceInfo serviceInfo);
public void onServiceLost(NsdServiceInfo serviceInfo);
+
}
/** Interface for callback invocation for service registration */
@@ -345,9 +342,8 @@
@Override
public void handleMessage(Message message) {
- final int what = message.what;
- final int key = message.arg2;
- switch (what) {
+ if (DBG) Log.d(TAG, "received " + nameOf(message.what));
+ switch (message.what) {
case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED:
mAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION);
return;
@@ -360,26 +356,19 @@
default:
break;
}
- final Object listener;
- final NsdServiceInfo ns;
- synchronized (mMapLock) {
- listener = mListenerMap.get(key);
- ns = mServiceMap.get(key);
- }
+ Object listener = getListener(message.arg2);
if (listener == null) {
Log.d(TAG, "Stale key " + message.arg2);
return;
}
- if (DBG) {
- Log.d(TAG, "received " + nameOf(what) + " for key " + key + ", service " + ns);
- }
- switch (what) {
+ NsdServiceInfo ns = getNsdService(message.arg2);
+ switch (message.what) {
case DISCOVER_SERVICES_STARTED:
String s = getNsdServiceInfoType((NsdServiceInfo) message.obj);
((DiscoveryListener) listener).onDiscoveryStarted(s);
break;
case DISCOVER_SERVICES_FAILED:
- removeListener(key);
+ removeListener(message.arg2);
((DiscoveryListener) listener).onStartDiscoveryFailed(getNsdServiceInfoType(ns),
message.arg1);
break;
@@ -392,16 +381,16 @@
case STOP_DISCOVERY_FAILED:
// TODO: failure to stop discovery should be internal and retried internally, as
// the effect for the client is indistinguishable from STOP_DISCOVERY_SUCCEEDED
- removeListener(key);
+ removeListener(message.arg2);
((DiscoveryListener) listener).onStopDiscoveryFailed(getNsdServiceInfoType(ns),
message.arg1);
break;
case STOP_DISCOVERY_SUCCEEDED:
- removeListener(key);
+ removeListener(message.arg2);
((DiscoveryListener) listener).onDiscoveryStopped(getNsdServiceInfoType(ns));
break;
case REGISTER_SERVICE_FAILED:
- removeListener(key);
+ removeListener(message.arg2);
((RegistrationListener) listener).onRegistrationFailed(ns, message.arg1);
break;
case REGISTER_SERVICE_SUCCEEDED:
@@ -409,7 +398,7 @@
(NsdServiceInfo) message.obj);
break;
case UNREGISTER_SERVICE_FAILED:
- removeListener(key);
+ removeListener(message.arg2);
((RegistrationListener) listener).onUnregistrationFailed(ns, message.arg1);
break;
case UNREGISTER_SERVICE_SUCCEEDED:
@@ -419,11 +408,11 @@
((RegistrationListener) listener).onServiceUnregistered(ns);
break;
case RESOLVE_SERVICE_FAILED:
- removeListener(key);
+ removeListener(message.arg2);
((ResolveListener) listener).onResolveFailed(ns, message.arg1);
break;
case RESOLVE_SERVICE_SUCCEEDED:
- removeListener(key);
+ removeListener(message.arg2);
((ResolveListener) listener).onServiceResolved((NsdServiceInfo) message.obj);
break;
default:
@@ -433,27 +422,40 @@
}
}
- private int nextListenerKey() {
- // Ensure mListenerKey >= FIRST_LISTENER_KEY;
- mListenerKey = Math.max(FIRST_LISTENER_KEY, mListenerKey + 1);
- return mListenerKey;
- }
-
- // Assert that the listener is not in the map, then add it and returns its key
+ // if the listener is already in the map, reject it. Otherwise, add it and
+ // return its key.
private int putListener(Object listener, NsdServiceInfo s) {
- checkListener(listener);
- final int key;
+ if (listener == null) return INVALID_LISTENER_KEY;
+ int key;
synchronized (mMapLock) {
int valueIndex = mListenerMap.indexOfValue(listener);
- checkArgument(valueIndex == -1, "listener already in use");
- key = nextListenerKey();
+ if (valueIndex != -1) {
+ return BUSY_LISTENER_KEY;
+ }
+ do {
+ key = mListenerKey++;
+ } while (key == INVALID_LISTENER_KEY);
mListenerMap.put(key, listener);
mServiceMap.put(key, s);
}
return key;
}
+ private Object getListener(int key) {
+ if (key == INVALID_LISTENER_KEY) return null;
+ synchronized (mMapLock) {
+ return mListenerMap.get(key);
+ }
+ }
+
+ private NsdServiceInfo getNsdService(int key) {
+ synchronized (mMapLock) {
+ return mServiceMap.get(key);
+ }
+ }
+
private void removeListener(int key) {
+ if (key == INVALID_LISTENER_KEY) return;
synchronized (mMapLock) {
mListenerMap.remove(key);
mServiceMap.remove(key);
@@ -461,15 +463,16 @@
}
private int getListenerKey(Object listener) {
- checkListener(listener);
synchronized (mMapLock) {
int valueIndex = mListenerMap.indexOfValue(listener);
- checkArgument(valueIndex != -1, "listener not registered");
- return mListenerMap.keyAt(valueIndex);
+ if (valueIndex != -1) {
+ return mListenerMap.keyAt(valueIndex);
+ }
}
+ return INVALID_LISTENER_KEY;
}
- private static String getNsdServiceInfoType(NsdServiceInfo s) {
+ private String getNsdServiceInfoType(NsdServiceInfo s) {
if (s == null) return "?";
return s.getServiceType();
}
@@ -479,9 +482,7 @@
*/
private void init() {
final Messenger messenger = getMessenger();
- if (messenger == null) {
- fatal("Failed to obtain service Messenger");
- }
+ if (messenger == null) throw new RuntimeException("Failed to initialize");
HandlerThread t = new HandlerThread("NsdManager");
t.start();
mHandler = new ServiceHandler(t.getLooper());
@@ -489,15 +490,10 @@
try {
mConnected.await();
} catch (InterruptedException e) {
- fatal("Interrupted wait at init");
+ Log.e(TAG, "interrupted wait at init");
}
}
- private static void fatal(String msg) {
- Log.e(TAG, msg);
- throw new RuntimeException(msg);
- }
-
/**
* Register a service to be discovered by other services.
*
@@ -517,10 +513,23 @@
*/
public void registerService(NsdServiceInfo serviceInfo, int protocolType,
RegistrationListener listener) {
- checkArgument(serviceInfo.getPort() > 0, "Invalid port number");
- checkServiceInfo(serviceInfo);
- checkProtocol(protocolType);
+ if (TextUtils.isEmpty(serviceInfo.getServiceName()) ||
+ TextUtils.isEmpty(serviceInfo.getServiceType())) {
+ throw new IllegalArgumentException("Service name or type cannot be empty");
+ }
+ if (serviceInfo.getPort() <= 0) {
+ throw new IllegalArgumentException("Invalid port number");
+ }
+ if (listener == null) {
+ throw new IllegalArgumentException("listener cannot be null");
+ }
+ if (protocolType != PROTOCOL_DNS_SD) {
+ throw new IllegalArgumentException("Unsupported protocol");
+ }
int key = putListener(listener, serviceInfo);
+ if (key == BUSY_LISTENER_KEY) {
+ throw new IllegalArgumentException("listener already in use");
+ }
mAsyncChannel.sendMessage(REGISTER_SERVICE, 0, key, serviceInfo);
}
@@ -539,6 +548,12 @@
*/
public void unregisterService(RegistrationListener listener) {
int id = getListenerKey(listener);
+ if (id == INVALID_LISTENER_KEY) {
+ throw new IllegalArgumentException("listener not registered");
+ }
+ if (listener == null) {
+ throw new IllegalArgumentException("listener cannot be null");
+ }
mAsyncChannel.sendMessage(UNREGISTER_SERVICE, 0, id);
}
@@ -571,13 +586,25 @@
* Cannot be null. Cannot be in use for an active service discovery.
*/
public void discoverServices(String serviceType, int protocolType, DiscoveryListener listener) {
- checkStringNotEmpty(serviceType, "Service type cannot be empty");
- checkProtocol(protocolType);
+ if (listener == null) {
+ throw new IllegalArgumentException("listener cannot be null");
+ }
+ if (TextUtils.isEmpty(serviceType)) {
+ throw new IllegalArgumentException("Service type cannot be empty");
+ }
+
+ if (protocolType != PROTOCOL_DNS_SD) {
+ throw new IllegalArgumentException("Unsupported protocol");
+ }
NsdServiceInfo s = new NsdServiceInfo();
s.setServiceType(serviceType);
int key = putListener(listener, s);
+ if (key == BUSY_LISTENER_KEY) {
+ throw new IllegalArgumentException("listener already in use");
+ }
+
mAsyncChannel.sendMessage(DISCOVER_SERVICES, 0, key, s);
}
@@ -599,6 +626,12 @@
*/
public void stopServiceDiscovery(DiscoveryListener listener) {
int id = getListenerKey(listener);
+ if (id == INVALID_LISTENER_KEY) {
+ throw new IllegalArgumentException("service discovery not active on listener");
+ }
+ if (listener == null) {
+ throw new IllegalArgumentException("listener cannot be null");
+ }
mAsyncChannel.sendMessage(STOP_DISCOVERY, 0, id);
}
@@ -612,8 +645,19 @@
* Cannot be in use for an active service resolution.
*/
public void resolveService(NsdServiceInfo serviceInfo, ResolveListener listener) {
- checkServiceInfo(serviceInfo);
+ if (TextUtils.isEmpty(serviceInfo.getServiceName()) ||
+ TextUtils.isEmpty(serviceInfo.getServiceType())) {
+ throw new IllegalArgumentException("Service name or type cannot be empty");
+ }
+ if (listener == null) {
+ throw new IllegalArgumentException("listener cannot be null");
+ }
+
int key = putListener(listener, serviceInfo);
+
+ if (key == BUSY_LISTENER_KEY) {
+ throw new IllegalArgumentException("listener already in use");
+ }
mAsyncChannel.sendMessage(RESOLVE_SERVICE, 0, key, serviceInfo);
}
@@ -627,10 +671,10 @@
}
/**
- * Get a reference to NsdService handler. This is used to establish
+ * Get a reference to NetworkService handler. This is used to establish
* an AsyncChannel communication with the service
*
- * @return Messenger pointing to the NsdService handler
+ * @return Messenger pointing to the NetworkService handler
*/
private Messenger getMessenger() {
try {
@@ -639,18 +683,4 @@
throw e.rethrowFromSystemServer();
}
}
-
- private static void checkListener(Object listener) {
- checkNotNull(listener, "listener cannot be null");
- }
-
- private static void checkProtocol(int protocolType) {
- checkArgument(protocolType == PROTOCOL_DNS_SD, "Unsupported protocol");
- }
-
- private static void checkServiceInfo(NsdServiceInfo serviceInfo) {
- checkNotNull(serviceInfo, "NsdServiceInfo cannot be null");
- checkStringNotEmpty(serviceInfo.getServiceName(),"Service name cannot be empty");
- checkStringNotEmpty(serviceInfo.getServiceType(), "Service type cannot be empty");
- }
}
diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java
index 8d46351..ab685ca 100644
--- a/services/core/java/com/android/server/net/NetworkStatsService.java
+++ b/services/core/java/com/android/server/net/NetworkStatsService.java
@@ -18,7 +18,6 @@
import static android.Manifest.permission.ACCESS_NETWORK_STATE;
import static android.Manifest.permission.CONNECTIVITY_INTERNAL;
-import static android.Manifest.permission.DUMP;
import static android.Manifest.permission.MODIFY_NETWORK_ACCOUNTING;
import static android.Manifest.permission.READ_NETWORK_USAGE_HISTORY;
import static android.content.Intent.ACTION_SHUTDOWN;