NetworkPolicy.java revision 8fc27e8b87bd1def854a03d84009143b315d4176
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> {
338fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey    public static final int CYCLE_NONE = -1;
341b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey    public static final long WARNING_DISABLED = -1;
351b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey    public static final long LIMIT_DISABLED = -1;
3641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey    public static final long SNOOZE_NEVER = -1;
371b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey
381b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey    public final NetworkTemplate template;
3922c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey    public int cycleDay;
409bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey    public String cycleTimezone;
4122c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey    public long warningBytes;
4222c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey    public long limitBytes;
430e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey    public long lastWarningSnooze;
440e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey    public long lastLimitSnooze;
45f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey    public boolean metered;
46837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey    public boolean inferred;
4721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
4850e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey    private static final long DEFAULT_MTU = 1500;
4950e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey
50837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey    @Deprecated
519bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey    public NetworkPolicy(NetworkTemplate template, int cycleDay, String cycleTimezone,
529bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey            long warningBytes, long limitBytes, boolean metered) {
539bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey        this(template, cycleDay, cycleTimezone, warningBytes, limitBytes, SNOOZE_NEVER,
54837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey                SNOOZE_NEVER, metered, false);
550e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey    }
560e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey
579bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey    public NetworkPolicy(NetworkTemplate template, int cycleDay, String cycleTimezone,
589bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey            long warningBytes, long limitBytes, long lastWarningSnooze, long lastLimitSnooze,
59837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey            boolean metered, boolean inferred) {
601b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey        this.template = checkNotNull(template, "missing NetworkTemplate");
6121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        this.cycleDay = cycleDay;
629bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey        this.cycleTimezone = checkNotNull(cycleTimezone, "missing cycleTimezone");
6321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        this.warningBytes = warningBytes;
6421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        this.limitBytes = limitBytes;
650e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey        this.lastWarningSnooze = lastWarningSnooze;
660e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey        this.lastLimitSnooze = lastLimitSnooze;
67f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey        this.metered = metered;
68837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey        this.inferred = inferred;
6921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    }
7021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
7121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    public NetworkPolicy(Parcel in) {
721b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey        template = in.readParcelable(null);
7321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        cycleDay = in.readInt();
749bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey        cycleTimezone = in.readString();
7521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        warningBytes = in.readLong();
7621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        limitBytes = in.readLong();
770e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey        lastWarningSnooze = in.readLong();
780e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey        lastLimitSnooze = in.readLong();
79f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey        metered = in.readInt() != 0;
80837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey        inferred = in.readInt() != 0;
8121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    }
8221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
839bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey    @Override
8421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    public void writeToParcel(Parcel dest, int flags) {
851b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey        dest.writeParcelable(template, flags);
8621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        dest.writeInt(cycleDay);
879bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey        dest.writeString(cycleTimezone);
8821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        dest.writeLong(warningBytes);
8921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        dest.writeLong(limitBytes);
900e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey        dest.writeLong(lastWarningSnooze);
910e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey        dest.writeLong(lastLimitSnooze);
92f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey        dest.writeInt(metered ? 1 : 0);
93837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey        dest.writeInt(inferred ? 1 : 0);
9421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    }
9521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
969bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey    @Override
9721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    public int describeContents() {
9821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        return 0;
9921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    }
10021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
10150e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey    /**
1020e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey     * Test if given measurement is over {@link #warningBytes}.
1030e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey     */
1040e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey    public boolean isOverWarning(long totalBytes) {
1050e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey        return warningBytes != WARNING_DISABLED && totalBytes >= warningBytes;
1060e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey    }
1070e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey
1080e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey    /**
10950e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey     * Test if given measurement is near enough to {@link #limitBytes} to be
11050e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey     * considered over-limit.
11150e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey     */
11250e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey    public boolean isOverLimit(long totalBytes) {
11350e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey        // over-estimate, since kernel will trigger limit once first packet
11450e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey        // trips over limit.
11550e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey        totalBytes += 2 * DEFAULT_MTU;
11650e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey        return limitBytes != LIMIT_DISABLED && totalBytes >= limitBytes;
11750e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey    }
11850e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey
1190e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey    /**
1200e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey     * Clear any existing snooze values, setting to {@link #SNOOZE_NEVER}.
1210e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey     */
1220e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey    public void clearSnooze() {
1230e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey        lastWarningSnooze = SNOOZE_NEVER;
1240e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey        lastLimitSnooze = SNOOZE_NEVER;
1250e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey    }
1260e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey
1278fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey    /**
1288fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey     * Test if this policy has a cycle defined, after which usage should reset.
1298fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey     */
1308fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey    public boolean hasCycle() {
1318fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        return cycleDay != CYCLE_NONE;
1328fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey    }
1338fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey
1349bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey    @Override
13521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    public int compareTo(NetworkPolicy another) {
13622c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey        if (another == null || another.limitBytes == LIMIT_DISABLED) {
13722c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey            // other value is missing or disabled; we win
13821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey            return -1;
13922c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey        }
14022c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey        if (limitBytes == LIMIT_DISABLED || another.limitBytes < limitBytes) {
14122c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey            // we're disabled or other limit is smaller; they win
14221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey            return 1;
14321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        }
14422c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey        return 0;
14521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    }
14621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
14721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    @Override
14841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey    public int hashCode() {
1499bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey        return Objects.hashCode(template, cycleDay, cycleTimezone, warningBytes, limitBytes,
150837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey                lastWarningSnooze, lastLimitSnooze, metered, inferred);
15141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey    }
15241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey
15341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey    @Override
15441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey    public boolean equals(Object obj) {
15541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey        if (obj instanceof NetworkPolicy) {
15641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey            final NetworkPolicy other = (NetworkPolicy) obj;
157f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey            return cycleDay == other.cycleDay && warningBytes == other.warningBytes
1580e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey                    && limitBytes == other.limitBytes
1590e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey                    && lastWarningSnooze == other.lastWarningSnooze
1600e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey                    && lastLimitSnooze == other.lastLimitSnooze && metered == other.metered
161837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey                    && inferred == other.inferred
1629bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey                    && Objects.equal(cycleTimezone, other.cycleTimezone)
1630e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey                    && Objects.equal(template, other.template);
16441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey        }
16541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey        return false;
16641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey    }
16741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey
16841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey    @Override
16921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    public String toString() {
1708fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        final StringBuilder builder = new StringBuilder("NetworkPolicy");
1718fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        builder.append("[").append(template).append("]:");
1728fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        builder.append(" cycleDay=").append(cycleDay);
1738fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        builder.append(", cycleTimezone=").append(cycleTimezone);
1748fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        builder.append(", warningBytes=").append(warningBytes);
1758fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        builder.append(", limitBytes=").append(limitBytes);
1768fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        builder.append(", lastWarningSnooze=").append(lastWarningSnooze);
1778fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        builder.append(", lastLimitSnooze=").append(lastLimitSnooze);
1788fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        builder.append(", metered=").append(metered);
1798fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        builder.append(", inferred=").append(inferred);
1808fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        return builder.toString();
18121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    }
18221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
18321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    public static final Creator<NetworkPolicy> CREATOR = new Creator<NetworkPolicy>() {
1849bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey        @Override
18521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        public NetworkPolicy createFromParcel(Parcel in) {
18621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey            return new NetworkPolicy(in);
18721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        }
18821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
1899bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey        @Override
19021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        public NetworkPolicy[] newArray(int size) {
19121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey            return new NetworkPolicy[size];
19221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        }
19321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    };
19421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey}
195