blob: ee6b60c371f6d413de7dcd46652dc265581d1063 [file] [log] [blame]
/**
* 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.app.usage;
import android.net.ConnectivityManager;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.IntArray;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* Defines a policy for data usage callbacks, made through {@link DataUsagePolicy.Builder} and used
* to be notified on data usage via {@link NetworkStatsManager#registerDataUsageCallback}.
* @removed
*/
public class DataUsagePolicy {
/**
* Network type to be monitored, as defined in {@link ConnectivityManager}, e.g.
* {@link ConnectivityManager#TYPE_MOBILE}, {@link ConnectivityManager#TYPE_WIFI} etc.
*/
public final int networkType;
/**
* Set of subscriber ids to be monitored for the given network type. May be empty if not
* applicable.
* <p>Should not be modified once created.
*/
public final String[] subscriberIds;
/**
* Set of UIDs of which to monitor data usage.
*
* <p>If not {@code null}, the caller will be notified when any of the uids exceed
* the given threshold. If empty all uids for which the calling process has access
* to stats will be monitored.
* <p>Should not be modified once created.
*/
public final int[] uids;
/**
* Threshold in bytes to be notified on.
*/
public final long thresholdInBytes;
/**
* @hide
*/
DataUsagePolicy(int networkType, String[] subscriberIds, int[] uids,
long thresholdInBytes) {
this.networkType = networkType;
this.subscriberIds = subscriberIds;
this.uids = uids;
this.thresholdInBytes = thresholdInBytes;
}
/**
* Builder used to create {@link DataUsagePolicy} objects.
*/
public static class Builder {
private static final int INVALID_NETWORK_TYPE = -1;
private int mNetworkType = INVALID_NETWORK_TYPE;
private List<String> mSubscriberList = new ArrayList<>();
private IntArray mUids = new IntArray();
private long mThresholdInBytes;
/**
* Default constructor for Builder.
*/
public Builder() {}
/**
* Build {@link DataUsagePolicy} given the current policies.
*/
public DataUsagePolicy build() {
if (mNetworkType == INVALID_NETWORK_TYPE) {
throw new IllegalArgumentException(
"DataUsagePolicy requires a valid network type to be set");
}
return new DataUsagePolicy(mNetworkType,
mSubscriberList.toArray(new String[mSubscriberList.size()]),
mUids.toArray(), mThresholdInBytes);
}
/**
* Specifies that the given {@code subscriberId} should be monitored.
*
* @param subscriberId the subscriber id of the network interface.
*/
public Builder addSubscriberId(String subscriberId) {
mSubscriberList.add(subscriberId);
return this;
}
/**
* Specifies that the given {@code uid} should be monitored.
*/
public Builder addUid(int uid) {
mUids.add(uid);
return this;
}
/**
* Specifies that the callback should monitor the given network. It is mandatory
* to set one.
*
* @param networkType As defined in {@link ConnectivityManager}, e.g.
* {@link ConnectivityManager#TYPE_MOBILE},
* {@link ConnectivityManager#TYPE_WIFI}, etc.
*/
public Builder setNetworkType(int networkType) {
mNetworkType = networkType;
return this;
}
/**
* Sets the threshold in bytes on which the listener should be called. The framework may
* impose a minimum threshold to avoid too many notifications to be triggered.
*/
public Builder setThreshold(long thresholdInBytes) {
mThresholdInBytes = thresholdInBytes;
return this;
}
}
@Override
public String toString() {
return "DataUsagePolicy [ networkType=" + networkType
+ ", subscriberIds=" + Arrays.toString(subscriberIds)
+ ", uids=" + Arrays.toString(uids)
+ ", thresholdInBytes=" + thresholdInBytes + " ]";
}
@Override
public boolean equals(Object obj) {
if (obj instanceof DataUsagePolicy == false) return false;
DataUsagePolicy that = (DataUsagePolicy) obj;
return that.networkType == this.networkType
&& Arrays.deepEquals(that.subscriberIds, this.subscriberIds)
&& Arrays.equals(that.uids, this.uids)
&& that.thresholdInBytes == this.thresholdInBytes;
}
@Override
public int hashCode() {
// Start with a non-zero constant.
int result = 17;
// Include a hash for each field.
result = 31 * result + networkType;
result = 31 * result + Arrays.deepHashCode(subscriberIds);
result = 31 * result + Arrays.hashCode(uids);
result = 31 * result + (int) (thresholdInBytes ^ (thresholdInBytes >>> 32));
return result;
}
}