diff --git a/core/java/android/app/usage/NetworkStatsManager.java b/core/java/android/app/usage/NetworkStatsManager.java index 4dc636b078..13aeef0058 100644 --- a/core/java/android/app/usage/NetworkStatsManager.java +++ b/core/java/android/app/usage/NetworkStatsManager.java @@ -16,12 +16,17 @@ package android.app.usage; +import static com.android.internal.util.Preconditions.checkNotNull; + +import android.annotation.Nullable; import android.app.usage.NetworkStats.Bucket; import android.content.Context; import android.net.ConnectivityManager; +import android.net.DataUsageRequest; import android.net.NetworkIdentity; import android.net.NetworkTemplate; import android.os.Build; +import android.os.Handler; import android.os.RemoteException; import android.util.Log; @@ -288,6 +293,62 @@ public class NetworkStatsManager { return result; } + /** + * Registers to receive notifications about data usage on specified networks and uids. + * The callbacks will continue to be called as long as the process is live or + * {@link #unregisterDataUsageCallback} is called. + * + * @param policy {@link DataUsagePolicy} describing this request. + * @param callback The {@link DataUsageCallback} that the system will call when data usage + * has exceeded the specified threshold. + */ + public void registerDataUsageCallback(DataUsagePolicy policy, DataUsageCallback callback) { + registerDataUsageCallback(policy, callback, null /* handler */); + } + + /** + * Registers to receive notifications about data usage on specified networks and uids. + * The callbacks will continue to be called as long as the process is live or + * {@link #unregisterDataUsageCallback} is called. + * + * @param policy {@link DataUsagePolicy} describing this request. + * @param callback The {@link DataUsageCallback} that the system will call when data usage + * has exceeded the specified threshold. + * @param handler to dispatch callback events through, otherwise if {@code null} it uses + * the calling thread. + */ + public void registerDataUsageCallback(DataUsagePolicy policy, DataUsageCallback callback, + @Nullable Handler handler) { + checkNotNull(policy, "DataUsagePolicy cannot be null"); + checkNotNull(callback, "DataUsageCallback cannot be null"); + + // TODO: Implement stub. + } + + /** + * Unregisters callbacks on data usage. + * + * @param callback The {@link DataUsageCallback} used when registering. + */ + public void unregisterDataUsageCallback(DataUsageCallback callback) { + checkNotNull(callback, "DataUsageCallback cannot be null"); + + // TODO: Implement stub. + } + + /** + * Base class for data usage callbacks. Should be extended by applications wanting + * notifications. + */ + public static class DataUsageCallback { + /** + * Called when data usage has reached the given policy threshold. + */ + public void onLimitReached() {} + + private DataUsageRequest request; + } + private static NetworkTemplate createTemplate(int networkType, String subscriberId) { NetworkTemplate template = null; switch (networkType) { diff --git a/core/java/android/net/DataUsageRequest.aidl b/core/java/android/net/DataUsageRequest.aidl new file mode 100644 index 0000000000..d1937c7b8c --- /dev/null +++ b/core/java/android/net/DataUsageRequest.aidl @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2016, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net; + +parcelable DataUsageRequest; diff --git a/core/java/android/net/DataUsageRequest.java b/core/java/android/net/DataUsageRequest.java new file mode 100644 index 0000000000..0e46f4c0cb --- /dev/null +++ b/core/java/android/net/DataUsageRequest.java @@ -0,0 +1,143 @@ +/** + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package android.net; + +import android.net.NetworkTemplate; +import android.os.Parcel; +import android.os.Parcelable; + +import java.util.Arrays; +import java.util.Objects; + +/** + * Defines a request to register a callbacks. Used to be notified on data usage via + * {@link android.app.usage.NetworkStatsManager#registerDataUsageCallback}. + * If no {@code uid}s are set, callbacks are restricted to device-owners, + * carrier-privileged apps, or system apps. + */ +public class DataUsageRequest implements Parcelable { + + /** + * @hide + */ + public static final int REQUEST_ID_UNSET = 0; + + /** + * Identifies the request. {@link DataUsageRequest}s should only be constructed by + * the Framework and it is used internally to identify the request. + * @hide + */ + public final int requestId; + + /** + * Set of {@link NetworkTemplate}s describing the networks to monitor. + * @hide + */ + public final NetworkTemplate[] templates; + + /** + * Set of UIDs of which to monitor data usage. + * + *
If not {@code null}, the caller will be notified when any of the uids exceed
+ * the given threshold. If {@code null} all uids for which the calling process has access
+ * to stats will be monitored.
+ * @hide
+ */
+ public final int[] uids;
+
+ /**
+ * Threshold in bytes to be notified on.
+ * @hide
+ */
+ public final long thresholdInBytes;
+
+ /**
+ * @hide
+ */
+ public DataUsageRequest(int requestId, NetworkTemplate[] templates, int[] uids,
+ long thresholdInBytes) {
+ this.requestId = requestId;
+ this.templates = templates;
+ this.uids = uids;
+ this.thresholdInBytes = thresholdInBytes;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(requestId);
+ dest.writeTypedArray(templates, flags);
+ dest.writeIntArray(uids);
+ dest.writeLong(thresholdInBytes);
+ }
+
+ public static final Creator