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 1921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport android.os.Parcel; 2021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport android.os.Parcelable; 21adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddyimport android.util.BackupUtils; 2217bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkeyimport android.util.Pair; 2317bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkeyimport android.util.RecurrenceRule; 2417bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey 2517bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkeyimport com.android.internal.util.Preconditions; 2621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 27adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddyimport java.io.ByteArrayOutputStream; 28adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddyimport java.io.DataInputStream; 29adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddyimport java.io.DataOutputStream; 30adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddyimport java.io.IOException; 3117bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkeyimport java.time.ZoneId; 3217bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkeyimport java.time.ZonedDateTime; 3317bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkeyimport java.util.Iterator; 34e6585b32ea586743258a5457e2184ffc087f2d2fKenny Rootimport java.util.Objects; 3541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 3621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey/** 371b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * Policy for networks matching a {@link NetworkTemplate}, including usage cycle 381b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * and limits to be enforced. 3921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * 4021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey * @hide 4121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey */ 4221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeypublic class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { 4317bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey private static final int VERSION_INIT = 1; 4417bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey private static final int VERSION_RULE = 2; 45adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy 468fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey public static final int CYCLE_NONE = -1; 471b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public static final long WARNING_DISABLED = -1; 481b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey public static final long LIMIT_DISABLED = -1; 4941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public static final long SNOOZE_NEVER = -1; 501b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 513256601f5e4d94713f59e97b9d4912875c1bdcafJeff Sharkey public NetworkTemplate template; 5217bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey public RecurrenceRule cycleRule; 5353313d7e8153982f842910118371e1dc061248cdJeff Sharkey public long warningBytes = WARNING_DISABLED; 5453313d7e8153982f842910118371e1dc061248cdJeff Sharkey public long limitBytes = LIMIT_DISABLED; 5553313d7e8153982f842910118371e1dc061248cdJeff Sharkey public long lastWarningSnooze = SNOOZE_NEVER; 5653313d7e8153982f842910118371e1dc061248cdJeff Sharkey public long lastLimitSnooze = SNOOZE_NEVER; 5753313d7e8153982f842910118371e1dc061248cdJeff Sharkey @Deprecated public boolean metered = true; 5853313d7e8153982f842910118371e1dc061248cdJeff Sharkey public boolean inferred = false; 5921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 6050e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey private static final long DEFAULT_MTU = 1500; 6150e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey 6217bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey public static RecurrenceRule buildRule(int cycleDay, ZoneId cycleTimezone) { 6317bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey if (cycleDay != NetworkPolicy.CYCLE_NONE) { 6417bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey return RecurrenceRule.buildRecurringMonthly(cycleDay, cycleTimezone); 6517bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey } else { 6617bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey return RecurrenceRule.buildNever(); 6717bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey } 6853313d7e8153982f842910118371e1dc061248cdJeff Sharkey } 6953313d7e8153982f842910118371e1dc061248cdJeff Sharkey 70837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey @Deprecated 719bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey public NetworkPolicy(NetworkTemplate template, int cycleDay, String cycleTimezone, 729bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey long warningBytes, long limitBytes, boolean metered) { 739bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey this(template, cycleDay, cycleTimezone, warningBytes, limitBytes, SNOOZE_NEVER, 74837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey SNOOZE_NEVER, metered, false); 750e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey } 760e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey 7717bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey @Deprecated 789bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey public NetworkPolicy(NetworkTemplate template, int cycleDay, String cycleTimezone, 799bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey long warningBytes, long limitBytes, long lastWarningSnooze, long lastLimitSnooze, 80837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey boolean metered, boolean inferred) { 8117bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey this(template, buildRule(cycleDay, ZoneId.of(cycleTimezone)), warningBytes, 8217bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey limitBytes, lastWarningSnooze, lastLimitSnooze, metered, inferred); 8317bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey } 8417bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey 8517bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey public NetworkPolicy(NetworkTemplate template, RecurrenceRule cycleRule, long warningBytes, 8617bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey long limitBytes, long lastWarningSnooze, long lastLimitSnooze, boolean metered, 8717bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey boolean inferred) { 8817bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey this.template = Preconditions.checkNotNull(template, "missing NetworkTemplate"); 8917bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey this.cycleRule = Preconditions.checkNotNull(cycleRule, "missing RecurrenceRule"); 9021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey this.warningBytes = warningBytes; 9121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey this.limitBytes = limitBytes; 920e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey this.lastWarningSnooze = lastWarningSnooze; 930e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey this.lastLimitSnooze = lastLimitSnooze; 94f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey this.metered = metered; 95837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey this.inferred = inferred; 9621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 9721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 9817bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey private NetworkPolicy(Parcel source) { 9917bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey template = source.readParcelable(null); 10017bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey cycleRule = source.readParcelable(null); 10117bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey warningBytes = source.readLong(); 10217bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey limitBytes = source.readLong(); 10317bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey lastWarningSnooze = source.readLong(); 10417bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey lastLimitSnooze = source.readLong(); 10517bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey metered = source.readInt() != 0; 10617bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey inferred = source.readInt() != 0; 10721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 10821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 1099bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey @Override 11021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public void writeToParcel(Parcel dest, int flags) { 1111b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey dest.writeParcelable(template, flags); 11217bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey dest.writeParcelable(cycleRule, flags); 11321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey dest.writeLong(warningBytes); 11421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey dest.writeLong(limitBytes); 1150e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey dest.writeLong(lastWarningSnooze); 1160e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey dest.writeLong(lastLimitSnooze); 117f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey dest.writeInt(metered ? 1 : 0); 118837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey dest.writeInt(inferred ? 1 : 0); 11921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 12021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 1219bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey @Override 12221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public int describeContents() { 12321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return 0; 12421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 12521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 12617bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey public Iterator<Pair<ZonedDateTime, ZonedDateTime>> cycleIterator() { 12717bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey return cycleRule.cycleIterator(); 12817bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey } 12917bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey 13050e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey /** 1310e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey * Test if given measurement is over {@link #warningBytes}. 1320e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey */ 1330e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey public boolean isOverWarning(long totalBytes) { 1340e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey return warningBytes != WARNING_DISABLED && totalBytes >= warningBytes; 1350e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey } 1360e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey 1370e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey /** 13850e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey * Test if given measurement is near enough to {@link #limitBytes} to be 13950e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey * considered over-limit. 14050e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey */ 14150e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey public boolean isOverLimit(long totalBytes) { 14250e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey // over-estimate, since kernel will trigger limit once first packet 14350e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey // trips over limit. 14450e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey totalBytes += 2 * DEFAULT_MTU; 14550e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey return limitBytes != LIMIT_DISABLED && totalBytes >= limitBytes; 14650e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey } 14750e7e51d68e3b01c3362fe9ab7b3448132e48b43Jeff Sharkey 1480e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey /** 1490e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey * Clear any existing snooze values, setting to {@link #SNOOZE_NEVER}. 1500e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey */ 1510e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey public void clearSnooze() { 1520e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey lastWarningSnooze = SNOOZE_NEVER; 1530e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey lastLimitSnooze = SNOOZE_NEVER; 1540e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey } 1550e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey 1568fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey /** 1578fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey * Test if this policy has a cycle defined, after which usage should reset. 1588fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey */ 1598fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey public boolean hasCycle() { 16017bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey return cycleRule.cycleIterator().hasNext(); 1618fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey } 1628fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey 1639bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey @Override 16421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public int compareTo(NetworkPolicy another) { 16522c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey if (another == null || another.limitBytes == LIMIT_DISABLED) { 16622c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey // other value is missing or disabled; we win 16721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return -1; 16822c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey } 16922c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey if (limitBytes == LIMIT_DISABLED || another.limitBytes < limitBytes) { 17022c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey // we're disabled or other limit is smaller; they win 17121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return 1; 17221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 17322c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey return 0; 17421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 17521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 17621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey @Override 17741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public int hashCode() { 17817bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey return Objects.hash(template, cycleRule, warningBytes, limitBytes, 179837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey lastWarningSnooze, lastLimitSnooze, metered, inferred); 18041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 18141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 18241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey @Override 18341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public boolean equals(Object obj) { 18441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey if (obj instanceof NetworkPolicy) { 18541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey final NetworkPolicy other = (NetworkPolicy) obj; 18617bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey return warningBytes == other.warningBytes 1870e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey && limitBytes == other.limitBytes 1880e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey && lastWarningSnooze == other.lastWarningSnooze 1890e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey && lastLimitSnooze == other.lastLimitSnooze && metered == other.metered 190837f9242ae2e8f5f380d0b30b8fffbc68494914fJeff Sharkey && inferred == other.inferred 19117bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey && Objects.equals(template, other.template) 19217bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey && Objects.equals(cycleRule, other.cycleRule); 19341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 19441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey return false; 19541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 19641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 19741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey @Override 19821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public String toString() { 19917bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey return new StringBuilder("NetworkPolicy{") 20017bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey .append("template=").append(template) 20117bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey .append(" cycleRule=").append(cycleRule) 20217bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey .append(" warningBytes=").append(warningBytes) 20317bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey .append(" limitBytes=").append(limitBytes) 20417bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey .append(" lastWarningSnooze=").append(lastWarningSnooze) 20517bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey .append(" lastLimitSnooze=").append(lastLimitSnooze) 20617bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey .append(" metered=").append(metered) 20717bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey .append(" inferred=").append(inferred) 20817bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey .append("}").toString(); 20921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 21021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 21121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public static final Creator<NetworkPolicy> CREATOR = new Creator<NetworkPolicy>() { 2129bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey @Override 21321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public NetworkPolicy createFromParcel(Parcel in) { 21421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return new NetworkPolicy(in); 21521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 21621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 2179bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey @Override 21821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public NetworkPolicy[] newArray(int size) { 21921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return new NetworkPolicy[size]; 22021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 22121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey }; 222adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy 223adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy public byte[] getBytesForBackup() throws IOException { 224adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy ByteArrayOutputStream baos = new ByteArrayOutputStream(); 225adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy DataOutputStream out = new DataOutputStream(baos); 226adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy 22717bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey out.writeInt(VERSION_RULE); 228adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy out.write(template.getBytesForBackup()); 22917bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey cycleRule.writeToStream(out); 230adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy out.writeLong(warningBytes); 231adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy out.writeLong(limitBytes); 232adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy out.writeLong(lastWarningSnooze); 233adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy out.writeLong(lastLimitSnooze); 234adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy out.writeInt(metered ? 1 : 0); 235adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy out.writeInt(inferred ? 1 : 0); 236adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy return baos.toByteArray(); 237adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy } 238adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy 239adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy public static NetworkPolicy getNetworkPolicyFromBackup(DataInputStream in) throws IOException, 240adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy BackupUtils.BadVersionException { 24117bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey final int version = in.readInt(); 24217bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey switch (version) { 24317bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey case VERSION_INIT: { 24417bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey NetworkTemplate template = NetworkTemplate.getNetworkTemplateFromBackup(in); 24517bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey int cycleDay = in.readInt(); 24617bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey String cycleTimeZone = BackupUtils.readString(in); 24717bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey long warningBytes = in.readLong(); 24817bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey long limitBytes = in.readLong(); 24917bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey long lastWarningSnooze = in.readLong(); 25017bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey long lastLimitSnooze = in.readLong(); 25117bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey boolean metered = in.readInt() == 1; 25217bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey boolean inferred = in.readInt() == 1; 25317bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey return new NetworkPolicy(template, cycleDay, cycleTimeZone, warningBytes, 25417bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey limitBytes, lastWarningSnooze, lastLimitSnooze, metered, inferred); 25517bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey } 25617bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey case VERSION_RULE: { 25717bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey NetworkTemplate template = NetworkTemplate.getNetworkTemplateFromBackup(in); 25817bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey RecurrenceRule cycleRule = new RecurrenceRule(in); 25917bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey long warningBytes = in.readLong(); 26017bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey long limitBytes = in.readLong(); 26117bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey long lastWarningSnooze = in.readLong(); 26217bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey long lastLimitSnooze = in.readLong(); 26317bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey boolean metered = in.readInt() == 1; 26417bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey boolean inferred = in.readInt() == 1; 26517bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey return new NetworkPolicy(template, cycleRule, warningBytes, 26617bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey limitBytes, lastWarningSnooze, lastLimitSnooze, metered, inferred); 26717bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey } 26817bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey default: { 26917bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey throw new BackupUtils.BadVersionException("Unknown backup version: " + version); 27017bebd2fd7d3af0bc648172da6ae36f8b55ad7afJeff Sharkey } 271adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy } 272adca34a0d6b5955f0cbc931dd0834b25fe3759b9Ritesh Reddy } 27321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey} 274