NetworkPolicy.java revision 837f9242ae2e8f5f380d0b30b8fffbc68494914f
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; 399bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey public String cycleTimezone; 4022c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey public long warningBytes; 4122c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey public long limitBytes; 420e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey public long lastWarningSnooze; 430e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey public long lastLimitSnooze; 44f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey public boolean metered; 45837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey public boolean inferred; 4621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 4750e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey private static final long DEFAULT_MTU = 1500; 4850e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey 49837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey @Deprecated 509bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey public NetworkPolicy(NetworkTemplate template, int cycleDay, String cycleTimezone, 519bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey long warningBytes, long limitBytes, boolean metered) { 529bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey this(template, cycleDay, cycleTimezone, warningBytes, limitBytes, SNOOZE_NEVER, 53837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey SNOOZE_NEVER, metered, false); 540e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey } 550e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey 569bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey public NetworkPolicy(NetworkTemplate template, int cycleDay, String cycleTimezone, 579bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey long warningBytes, long limitBytes, long lastWarningSnooze, long lastLimitSnooze, 58837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey boolean metered, boolean inferred) { 591b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey this.template = checkNotNull(template, "missing NetworkTemplate"); 6021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey this.cycleDay = cycleDay; 619bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey this.cycleTimezone = checkNotNull(cycleTimezone, "missing cycleTimezone"); 6221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey this.warningBytes = warningBytes; 6321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey this.limitBytes = limitBytes; 640e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey this.lastWarningSnooze = lastWarningSnooze; 650e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey this.lastLimitSnooze = lastLimitSnooze; 66f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey this.metered = metered; 67837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey this.inferred = inferred; 6821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 6921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 7021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public NetworkPolicy(Parcel in) { 711b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey template = in.readParcelable(null); 7221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey cycleDay = in.readInt(); 739bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey cycleTimezone = in.readString(); 7421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey warningBytes = in.readLong(); 7521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey limitBytes = in.readLong(); 760e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey lastWarningSnooze = in.readLong(); 770e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey lastLimitSnooze = in.readLong(); 78f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey metered = in.readInt() != 0; 79837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey inferred = in.readInt() != 0; 8021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 8121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 829bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey @Override 8321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public void writeToParcel(Parcel dest, int flags) { 841b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey dest.writeParcelable(template, flags); 8521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey dest.writeInt(cycleDay); 869bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey dest.writeString(cycleTimezone); 8721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey dest.writeLong(warningBytes); 8821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey dest.writeLong(limitBytes); 890e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey dest.writeLong(lastWarningSnooze); 900e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey dest.writeLong(lastLimitSnooze); 91f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey dest.writeInt(metered ? 1 : 0); 92837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey dest.writeInt(inferred ? 1 : 0); 9321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 9421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 959bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey @Override 9621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public int describeContents() { 9721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return 0; 9821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 9921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 10050e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey /** 1010e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey * Test if given measurement is over {@link #warningBytes}. 1020e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey */ 1030e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey public boolean isOverWarning(long totalBytes) { 1040e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey return warningBytes != WARNING_DISABLED && totalBytes >= warningBytes; 1050e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey } 1060e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey 1070e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey /** 10850e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey * Test if given measurement is near enough to {@link #limitBytes} to be 10950e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey * considered over-limit. 11050e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey */ 11150e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey public boolean isOverLimit(long totalBytes) { 11250e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey // over-estimate, since kernel will trigger limit once first packet 11350e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey // trips over limit. 11450e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey totalBytes += 2 * DEFAULT_MTU; 11550e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey return limitBytes != LIMIT_DISABLED && totalBytes >= limitBytes; 11650e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey } 11750e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey 1180e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey /** 1190e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey * Clear any existing snooze values, setting to {@link #SNOOZE_NEVER}. 1200e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey */ 1210e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey public void clearSnooze() { 1220e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey lastWarningSnooze = SNOOZE_NEVER; 1230e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey lastLimitSnooze = SNOOZE_NEVER; 1240e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey } 1250e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey 1269bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey @Override 12721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public int compareTo(NetworkPolicy another) { 12822c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey if (another == null || another.limitBytes == LIMIT_DISABLED) { 12922c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey // other value is missing or disabled; we win 13021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return -1; 13122c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey } 13222c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey if (limitBytes == LIMIT_DISABLED || another.limitBytes < limitBytes) { 13322c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey // we're disabled or other limit is smaller; they win 13421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return 1; 13521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 13622c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey return 0; 13721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 13821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 13921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey @Override 14041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public int hashCode() { 1419bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey return Objects.hashCode(template, cycleDay, cycleTimezone, warningBytes, limitBytes, 142837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey lastWarningSnooze, lastLimitSnooze, metered, inferred); 14341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 14441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 14541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey @Override 14641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public boolean equals(Object obj) { 14741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey if (obj instanceof NetworkPolicy) { 14841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey final NetworkPolicy other = (NetworkPolicy) obj; 149f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey return cycleDay == other.cycleDay && warningBytes == other.warningBytes 1500e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey && limitBytes == other.limitBytes 1510e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey && lastWarningSnooze == other.lastWarningSnooze 1520e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey && lastLimitSnooze == other.lastLimitSnooze && metered == other.metered 153837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey && inferred == other.inferred 1549bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey && Objects.equal(cycleTimezone, other.cycleTimezone) 1550e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey && Objects.equal(template, other.template); 15641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 15741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey return false; 15841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 15941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 16041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey @Override 16121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public String toString() { 1629bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey return "NetworkPolicy[" + template + "]: cycleDay=" + cycleDay + ", cycleTimezone=" 1639bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey + cycleTimezone + ", warningBytes=" + warningBytes + ", limitBytes=" + limitBytes 1649bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey + ", lastWarningSnooze=" + lastWarningSnooze + ", lastLimitSnooze=" 165837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey + lastLimitSnooze + ", metered=" + metered + ", inferred=" + inferred; 16621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 16721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 16821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public static final Creator<NetworkPolicy> CREATOR = new Creator<NetworkPolicy>() { 1699bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey @Override 17021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public NetworkPolicy createFromParcel(Parcel in) { 17121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return new NetworkPolicy(in); 17221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 17321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 1749bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey @Override 17521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public NetworkPolicy[] newArray(int size) { 17621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return new NetworkPolicy[size]; 17721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 17821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey }; 17921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey} 180