NetworkPolicy.java revision 50e7e51d68e3b01c3362fe9ab7b3448132e48b43
121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey/*
221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * Copyright (C) 2011 The Android Open Source Project
321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey *
421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * you may not use this file except in compliance with the License.
621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * You may obtain a copy of the License at
721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey *
821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey *
1021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
1121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
1221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * See the License for the specific language governing permissions and
1421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * limitations under the License.
1521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey */
1621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
1721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeypackage android.net;
1821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
191b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport static com.android.internal.util.Preconditions.checkNotNull;
201b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey
2121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport android.os.Parcel;
2221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport android.os.Parcelable;
2321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
2441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkeyimport com.android.internal.util.Objects;
2541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey
2621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey/**
271b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * Policy for networks matching a {@link NetworkTemplate}, including usage cycle
281b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * and limits to be enforced.
2921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey *
3021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * @hide
3121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey */
3221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeypublic class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> {
331b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey    public static final long WARNING_DISABLED = -1;
341b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey    public static final long LIMIT_DISABLED = -1;
3541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey    public static final long SNOOZE_NEVER = -1;
361b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey
371b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey    public final NetworkTemplate template;
3822c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey    public int cycleDay;
3922c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey    public long warningBytes;
4022c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey    public long limitBytes;
4141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey    public long lastSnooze;
4221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
4350e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey    private static final long DEFAULT_MTU = 1500;
4450e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey
4541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey    public NetworkPolicy(NetworkTemplate template, int cycleDay, long warningBytes, long limitBytes,
4641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey            long lastSnooze) {
471b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey        this.template = checkNotNull(template, "missing NetworkTemplate");
4821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        this.cycleDay = cycleDay;
4921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        this.warningBytes = warningBytes;
5021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        this.limitBytes = limitBytes;
5141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey        this.lastSnooze = lastSnooze;
5221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    }
5321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
5421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    public NetworkPolicy(Parcel in) {
551b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey        template = in.readParcelable(null);
5621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        cycleDay = in.readInt();
5721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        warningBytes = in.readLong();
5821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        limitBytes = in.readLong();
5941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey        lastSnooze = in.readLong();
6021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    }
6121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
6221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    /** {@inheritDoc} */
6321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    public void writeToParcel(Parcel dest, int flags) {
641b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey        dest.writeParcelable(template, flags);
6521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        dest.writeInt(cycleDay);
6621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        dest.writeLong(warningBytes);
6721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        dest.writeLong(limitBytes);
6841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey        dest.writeLong(lastSnooze);
6921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    }
7021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
7121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    /** {@inheritDoc} */
7221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    public int describeContents() {
7321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        return 0;
7421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    }
7521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
7650e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey    /**
7750e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey     * Test if given measurement is near enough to {@link #limitBytes} to be
7850e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey     * considered over-limit.
7950e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey     */
8050e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey    public boolean isOverLimit(long totalBytes) {
8150e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey        // over-estimate, since kernel will trigger limit once first packet
8250e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey        // trips over limit.
8350e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey        totalBytes += 2 * DEFAULT_MTU;
8450e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey        return limitBytes != LIMIT_DISABLED && totalBytes >= limitBytes;
8550e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey    }
8650e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey
8721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    /** {@inheritDoc} */
8821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    public int compareTo(NetworkPolicy another) {
8922c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey        if (another == null || another.limitBytes == LIMIT_DISABLED) {
9022c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey            // other value is missing or disabled; we win
9121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey            return -1;
9222c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey        }
9322c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey        if (limitBytes == LIMIT_DISABLED || another.limitBytes < limitBytes) {
9422c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey            // we're disabled or other limit is smaller; they win
9521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey            return 1;
9621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        }
9722c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey        return 0;
9821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    }
9921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
10021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    @Override
10141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey    public int hashCode() {
10241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey        return Objects.hashCode(template, cycleDay, warningBytes, limitBytes, lastSnooze);
10341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey    }
10441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey
10541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey    @Override
10641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey    public boolean equals(Object obj) {
10741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey        if (obj instanceof NetworkPolicy) {
10841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey            final NetworkPolicy other = (NetworkPolicy) obj;
10941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey            return Objects.equal(template, other.template) && cycleDay == other.cycleDay
11041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey                    && warningBytes == other.warningBytes && limitBytes == other.limitBytes
11141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey                    && lastSnooze == other.lastSnooze;
11241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey        }
11341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey        return false;
11441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey    }
11541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey
11641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey    @Override
11721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    public String toString() {
1181b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey        return "NetworkPolicy[" + template + "]: cycleDay=" + cycleDay + ", warningBytes="
11941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey                + warningBytes + ", limitBytes=" + limitBytes + ", lastSnooze=" + lastSnooze;
12021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    }
12121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
12221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    public static final Creator<NetworkPolicy> CREATOR = new Creator<NetworkPolicy>() {
12321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        public NetworkPolicy createFromParcel(Parcel in) {
12421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey            return new NetworkPolicy(in);
12521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        }
12621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
12721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        public NetworkPolicy[] newArray(int size) {
12821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey            return new NetworkPolicy[size];
12921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        }
13021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    };
13121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey}
132