1bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller/* 2bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * Copyright (C) 2017 The Android Open Source Project 3bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * 4bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * Licensed under the Apache License, Version 2.0 (the "License"); 5bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * you may not use this file except in compliance with the License. 6bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * You may obtain a copy of the License at 7bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * 8bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * http://www.apache.org/licenses/LICENSE-2.0 9bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * 10bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * Unless required by applicable law or agreed to in writing, software 11bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * distributed under the License is distributed on an "AS IS" BASIS, 12bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * See the License for the specific language governing permissions and 14bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * limitations under the License. 15bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller */ 16bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 17bede17c216815a849be0c43d5ce7daaf750a9facNeil Fullerpackage android.app.timezone; 18bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 19bede17c216815a849be0c43d5ce7daaf750a9facNeil Fullerimport static android.app.timezone.Utils.validateConditionalNull; 20bede17c216815a849be0c43d5ce7daaf750a9facNeil Fullerimport static android.app.timezone.Utils.validateNotNull; 21bede17c216815a849be0c43d5ce7daaf750a9facNeil Fullerimport static android.app.timezone.Utils.validateRulesVersion; 22bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 23bede17c216815a849be0c43d5ce7daaf750a9facNeil Fullerimport android.annotation.IntDef; 24bede17c216815a849be0c43d5ce7daaf750a9facNeil Fullerimport android.annotation.Nullable; 25bede17c216815a849be0c43d5ce7daaf750a9facNeil Fullerimport android.os.Parcel; 26bede17c216815a849be0c43d5ce7daaf750a9facNeil Fullerimport android.os.Parcelable; 27bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 28bede17c216815a849be0c43d5ce7daaf750a9facNeil Fullerimport java.lang.annotation.Retention; 29bede17c216815a849be0c43d5ce7daaf750a9facNeil Fullerimport java.lang.annotation.RetentionPolicy; 30bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 31bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller/** 32bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * Description of the state of time zone rules on a device. 33bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * 34bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * <p>The following properties are included: 35bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * <dl> 36bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * <dt>systemRulesVersion</dt> 37bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * <dd>the IANA rules version that shipped with the OS. Always present. e.g. "2017a".</dd> 38bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * <dt>distroFormatVersionSupported</dt> 39bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * <dd>the distro format version supported by this device. Always present.</dd> 40bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * <dt>operationInProgress</dt> 41bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * <dd>{@code true} if there is an install / uninstall operation currently happening.</dd> 42bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * <dt>stagedOperationType</dt> 43bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * <dd>one of {@link #STAGED_OPERATION_UNKNOWN}, {@link #STAGED_OPERATION_NONE}, 44bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * {@link #STAGED_OPERATION_UNINSTALL} and {@link #STAGED_OPERATION_INSTALL} indicating whether 45bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * there is a currently staged time zone distro operation. {@link #STAGED_OPERATION_UNKNOWN} is 46bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * used when {@link #isOperationInProgress()} is {@code true}. Staged operations currently 47bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * require a reboot to become active.</dd> 48bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * <dt>stagedDistroRulesVersion</dt> 49bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * <dd>[present if distroStagedState == STAGED_STATE_INSTALL], the rules version of the distro 50bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * currently staged for installation.</dd> 51bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * <dt>distroStatus</dt> 52bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * <dd>{@link #DISTRO_STATUS_INSTALLED} if there is a time zone distro installed and active, 53bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * {@link #DISTRO_STATUS_NONE} if there is no active installed distro. 54bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * {@link #DISTRO_STATUS_UNKNOWN} is used when {@link #isOperationInProgress()} is {@code true}. 55bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * </dd> 56bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * <dt>installedDistroRulesVersion</dt> 57bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * <dd>[present if distroStatus == {@link #DISTRO_STATUS_INSTALLED}], the rules version of the 58bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * installed and active distro.</dd> 59bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * </dl> 60bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * 61bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * @hide 62bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller */ 63bede17c216815a849be0c43d5ce7daaf750a9facNeil Fullerpublic final class RulesState implements Parcelable { 64bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 65bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller @Retention(RetentionPolicy.SOURCE) 66ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey @IntDef(prefix = { "STAGED_OPERATION_" }, value = { 67bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller STAGED_OPERATION_UNKNOWN, 68bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller STAGED_OPERATION_NONE, 69bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller STAGED_OPERATION_UNINSTALL, 70ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey STAGED_OPERATION_INSTALL 71ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey }) 72bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller private @interface StagedOperationType {} 73bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 74bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller /** Staged state could not be determined. */ 75bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public static final int STAGED_OPERATION_UNKNOWN = 0; 76bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller /** Nothing is staged. */ 77bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public static final int STAGED_OPERATION_NONE = 1; 78bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller /** An uninstall is staged. */ 79bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public static final int STAGED_OPERATION_UNINSTALL = 2; 80bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller /** An install is staged. */ 81bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public static final int STAGED_OPERATION_INSTALL = 3; 82bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 83bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller @Retention(RetentionPolicy.SOURCE) 84ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey @IntDef(prefix = { "DISTRO_STATUS_" }, value = { 85bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller DISTRO_STATUS_UNKNOWN, 86bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller DISTRO_STATUS_NONE, 87ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey DISTRO_STATUS_INSTALLED 88ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey }) 89bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller private @interface DistroStatus {} 90bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 91bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller /** The current distro status could not be determined. */ 92bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public static final int DISTRO_STATUS_UNKNOWN = 0; 93bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller /** There is no active installed time zone distro. */ 94bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public static final int DISTRO_STATUS_NONE = 1; 95bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller /** The is an active, installed time zone distro. */ 96bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public static final int DISTRO_STATUS_INSTALLED = 2; 97bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 98bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller private static final byte BYTE_FALSE = 0; 99bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller private static final byte BYTE_TRUE = 1; 100bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 101bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller private final String mSystemRulesVersion; 102bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller private final DistroFormatVersion mDistroFormatVersionSupported; 103bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller private final boolean mOperationInProgress; 104bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller @StagedOperationType private final int mStagedOperationType; 105bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller @Nullable private final DistroRulesVersion mStagedDistroRulesVersion; 106bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller @DistroStatus private final int mDistroStatus; 107bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller @Nullable private final DistroRulesVersion mInstalledDistroRulesVersion; 108bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 109bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public RulesState(String systemRulesVersion, DistroFormatVersion distroFormatVersionSupported, 110bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller boolean operationInProgress, 111bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller @StagedOperationType int stagedOperationType, 112bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller @Nullable DistroRulesVersion stagedDistroRulesVersion, 113bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller @DistroStatus int distroStatus, 114bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller @Nullable DistroRulesVersion installedDistroRulesVersion) { 115bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller this.mSystemRulesVersion = validateRulesVersion("systemRulesVersion", systemRulesVersion); 116bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller this.mDistroFormatVersionSupported = 117bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller validateNotNull("distroFormatVersionSupported", distroFormatVersionSupported); 118bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller this.mOperationInProgress = operationInProgress; 119bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 120bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller if (operationInProgress && stagedOperationType != STAGED_OPERATION_UNKNOWN) { 121bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller throw new IllegalArgumentException( 122bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller "stagedOperationType != STAGED_OPERATION_UNKNOWN"); 123bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 124bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller this.mStagedOperationType = validateStagedOperation(stagedOperationType); 125bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller this.mStagedDistroRulesVersion = validateConditionalNull( 126bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller mStagedOperationType == STAGED_OPERATION_INSTALL /* requireNotNull */, 127bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller "stagedDistroRulesVersion", stagedDistroRulesVersion); 128bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 129bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller this.mDistroStatus = validateDistroStatus(distroStatus); 130bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller this.mInstalledDistroRulesVersion = validateConditionalNull( 131bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller mDistroStatus == DISTRO_STATUS_INSTALLED/* requireNotNull */, 132bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller "installedDistroRulesVersion", installedDistroRulesVersion); 133bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 134bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 135bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public String getSystemRulesVersion() { 136bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return mSystemRulesVersion; 137bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 138bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 139bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public boolean isOperationInProgress() { 140bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return mOperationInProgress; 141bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 142bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 143bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public @StagedOperationType int getStagedOperationType() { 144bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return mStagedOperationType; 145bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 146bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 147bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller /** 148bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * Returns the staged rules version when {@link #getStagedOperationType()} is 149bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * {@link #STAGED_OPERATION_INSTALL}. 150bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller */ 151bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public @Nullable DistroRulesVersion getStagedDistroRulesVersion() { 152bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return mStagedDistroRulesVersion; 153bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 154bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 155bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public @DistroStatus int getDistroStatus() { 156bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return mDistroStatus; 157bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 158bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 159bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller /** 160bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * Returns the installed rules version when {@link #getDistroStatus()} is 161bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * {@link #DISTRO_STATUS_INSTALLED}. 162bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller */ 163bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public @Nullable DistroRulesVersion getInstalledDistroRulesVersion() { 164bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return mInstalledDistroRulesVersion; 165bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 166bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 167bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller /** 168bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller * Returns true if a distro in the specified format is supported on this device. 169bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller */ 170bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public boolean isDistroFormatVersionSupported(DistroFormatVersion distroFormatVersion) { 171bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return mDistroFormatVersionSupported.supports(distroFormatVersion); 172bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 173bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 174bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller /** 1750153481a22d679818d9eb5ea997bfd967be1c206Neil Fuller * Returns true if the system image data files contain IANA rules data that are newer than the 1760153481a22d679818d9eb5ea997bfd967be1c206Neil Fuller * distro IANA rules version supplied, i.e. true when the version specified would be "worse" 1770153481a22d679818d9eb5ea997bfd967be1c206Neil Fuller * than the one that is in the system image. Returns false if the system image version is the 1780153481a22d679818d9eb5ea997bfd967be1c206Neil Fuller * same or older, i.e. false when the version specified would be "better" than the one that is 1790153481a22d679818d9eb5ea997bfd967be1c206Neil Fuller * in the system image. 180bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller */ 1810153481a22d679818d9eb5ea997bfd967be1c206Neil Fuller public boolean isSystemVersionNewerThan(DistroRulesVersion distroRulesVersion) { 1820153481a22d679818d9eb5ea997bfd967be1c206Neil Fuller return mSystemRulesVersion.compareTo(distroRulesVersion.getRulesVersion()) > 0; 183bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 184bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 185bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public static final Parcelable.Creator<RulesState> CREATOR = 186bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller new Parcelable.Creator<RulesState>() { 187bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public RulesState createFromParcel(Parcel in) { 188bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return RulesState.createFromParcel(in); 189bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 190bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 191bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public RulesState[] newArray(int size) { 192bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return new RulesState[size]; 193bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 194bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller }; 195bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 196bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller private static RulesState createFromParcel(Parcel in) { 197bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller String systemRulesVersion = in.readString(); 198bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller DistroFormatVersion distroFormatVersionSupported = in.readParcelable(null); 199bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller boolean operationInProgress = in.readByte() == BYTE_TRUE; 200bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller int distroStagedState = in.readByte(); 201bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller DistroRulesVersion stagedDistroRulesVersion = in.readParcelable(null); 202bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller int installedDistroStatus = in.readByte(); 203bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller DistroRulesVersion installedDistroRulesVersion = in.readParcelable(null); 204bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return new RulesState(systemRulesVersion, distroFormatVersionSupported, operationInProgress, 205bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller distroStagedState, stagedDistroRulesVersion, 206bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller installedDistroStatus, installedDistroRulesVersion); 207bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 208bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 209bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller @Override 210bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public int describeContents() { 211bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return 0; 212bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 213bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 214bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller @Override 215bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public void writeToParcel(Parcel out, int flags) { 216bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller out.writeString(mSystemRulesVersion); 217bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller out.writeParcelable(mDistroFormatVersionSupported, 0); 218bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller out.writeByte(mOperationInProgress ? BYTE_TRUE : BYTE_FALSE); 219bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller out.writeByte((byte) mStagedOperationType); 220bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller out.writeParcelable(mStagedDistroRulesVersion, 0); 221bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller out.writeByte((byte) mDistroStatus); 222bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller out.writeParcelable(mInstalledDistroRulesVersion, 0); 223bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 224bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 225bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller @Override 226bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public boolean equals(Object o) { 227bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller if (this == o) { 228bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return true; 229bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 230bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller if (o == null || getClass() != o.getClass()) { 231bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return false; 232bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 233bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 234bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller RulesState that = (RulesState) o; 235bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 236bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller if (mOperationInProgress != that.mOperationInProgress) { 237bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return false; 238bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 239bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller if (mStagedOperationType != that.mStagedOperationType) { 240bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return false; 241bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 242bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller if (mDistroStatus != that.mDistroStatus) { 243bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return false; 244bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 245bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller if (!mSystemRulesVersion.equals(that.mSystemRulesVersion)) { 246bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return false; 247bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 248bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller if (!mDistroFormatVersionSupported.equals(that.mDistroFormatVersionSupported)) { 249bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return false; 250bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 251bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller if (mStagedDistroRulesVersion != null ? !mStagedDistroRulesVersion 252bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller .equals(that.mStagedDistroRulesVersion) : that.mStagedDistroRulesVersion != null) { 253bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return false; 254bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 255bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return mInstalledDistroRulesVersion != null ? mInstalledDistroRulesVersion 256bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller .equals(that.mInstalledDistroRulesVersion) 257bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller : that.mInstalledDistroRulesVersion == null; 258bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 259bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 260bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller @Override 261bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public int hashCode() { 262bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller int result = mSystemRulesVersion.hashCode(); 263bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller result = 31 * result + mDistroFormatVersionSupported.hashCode(); 264bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller result = 31 * result + (mOperationInProgress ? 1 : 0); 265bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller result = 31 * result + mStagedOperationType; 266bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller result = 31 * result + (mStagedDistroRulesVersion != null ? mStagedDistroRulesVersion 267bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller .hashCode() 268bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller : 0); 269bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller result = 31 * result + mDistroStatus; 270bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller result = 31 * result + (mInstalledDistroRulesVersion != null ? mInstalledDistroRulesVersion 271bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller .hashCode() : 0); 272bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return result; 273bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 274bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 275bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller @Override 276bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller public String toString() { 277bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return "RulesState{" 278bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller + "mSystemRulesVersion='" + mSystemRulesVersion + '\'' 279bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller + ", mDistroFormatVersionSupported=" + mDistroFormatVersionSupported 280bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller + ", mOperationInProgress=" + mOperationInProgress 281bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller + ", mStagedOperationType=" + mStagedOperationType 282bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller + ", mStagedDistroRulesVersion=" + mStagedDistroRulesVersion 283bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller + ", mDistroStatus=" + mDistroStatus 284bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller + ", mInstalledDistroRulesVersion=" + mInstalledDistroRulesVersion 285bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller + '}'; 286bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 287bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 288bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller private static int validateStagedOperation(int stagedOperationType) { 289bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller if (stagedOperationType < STAGED_OPERATION_UNKNOWN 290bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller || stagedOperationType > STAGED_OPERATION_INSTALL) { 291bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller throw new IllegalArgumentException("Unknown operation type=" + stagedOperationType); 292bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 293bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return stagedOperationType; 294bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 295bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller 296bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller private static int validateDistroStatus(int distroStatus) { 297bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller if (distroStatus < DISTRO_STATUS_UNKNOWN || distroStatus > DISTRO_STATUS_INSTALLED) { 298bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller throw new IllegalArgumentException("Unknown distro status=" + distroStatus); 299bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 300bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller return distroStatus; 301bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller } 302bede17c216815a849be0c43d5ce7daaf750a9facNeil Fuller} 303