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