1706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings/*
2706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings * Copyright (C) 2012 The Android Open Source Project
3706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings *
4706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings * Licensed under the Apache License, Version 2.0 (the "License");
5706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings * you may not use this file except in compliance with the License.
6706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings * You may obtain a copy of the License at
7706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings *
8706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings *      http://www.apache.org/licenses/LICENSE-2.0
9706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings *
10706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings * Unless required by applicable law or agreed to in writing, software
11706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings * distributed under the License is distributed on an "AS IS" BASIS,
12706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings * See the License for the specific language governing permissions and
14706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings * limitations under the License.
15706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings */
16706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
17706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich canningspackage android.content.pm;
18706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
19706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich canningsimport android.content.pm.ManifestDigest;
20706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich canningsimport android.net.Uri;
21706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich canningsimport android.os.Parcel;
22706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich canningsimport android.os.Parcelable;
23706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
24706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings/**
25706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings * Represents verification parameters used to verify packages to be installed.
26706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings *
27706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings * @hide
28706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings */
29706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich canningspublic class VerificationParams implements Parcelable {
3037d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver    /** A constant used to indicate that a uid value is not present. */
3137d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver    public static final int NO_UID = -1;
3237d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver
33706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    /** What we print out first when toString() is called. */
34706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    private static final String TO_STRING_PREFIX = "VerificationParams{";
35706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
36706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    /** The location of the supplementary verification file. */
37706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    private final Uri mVerificationURI;
38706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
39706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    /** URI referencing where the package was downloaded from. */
40706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    private final Uri mOriginatingURI;
41706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
42706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    /** HTTP referrer URI associated with the originatingURI. */
43706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    private final Uri mReferrer;
44706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
4537d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver    /** UID of the application that the install request originated from. */
4637d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver    private final int mOriginatingUid;
4737d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver
4813d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings    /** UID of application requesting the install */
4913d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings    private int mInstallerUid;
5013d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings
51706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    /**
52706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings     * An object that holds the digest of the package which can be used to
53706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings     * verify ownership.
54706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings     */
55706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    private final ManifestDigest mManifestDigest;
56706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
57706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    /**
58706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings     * Creates verification specifications for installing with application verification.
59706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings     *
60706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings     * @param verificationURI The location of the supplementary verification
61706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings     *            file. This can be a 'file:' or a 'content:' URI. May be {@code null}.
62706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings     * @param originatingURI URI referencing where the package was downloaded
63706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings     *            from. May be {@code null}.
64706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings     * @param referrer HTTP referrer URI associated with the originatingURI.
65706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings     *            May be {@code null}.
6637d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver     * @param originatingUid UID of the application that the install request originated
6737d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver     *            from, or NO_UID if not present
68706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings     * @param manifestDigest an object that holds the digest of the package
69706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings     *            which can be used to verify ownership. May be {@code null}.
70706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings     */
71706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    public VerificationParams(Uri verificationURI, Uri originatingURI, Uri referrer,
7237d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver            int originatingUid, ManifestDigest manifestDigest) {
73706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        mVerificationURI = verificationURI;
74706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        mOriginatingURI = originatingURI;
75706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        mReferrer = referrer;
7637d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        mOriginatingUid = originatingUid;
77706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        mManifestDigest = manifestDigest;
7837d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        mInstallerUid = NO_UID;
79706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    }
80706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
81706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    public Uri getVerificationURI() {
82706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        return mVerificationURI;
83706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    }
84706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
85706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    public Uri getOriginatingURI() {
86706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        return mOriginatingURI;
87706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    }
88706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
89706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    public Uri getReferrer() {
90706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        return mReferrer;
91706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    }
92706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
9337d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver    /** return NO_UID if not available */
9437d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver    public int getOriginatingUid() {
9537d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        return mOriginatingUid;
9637d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver    }
9737d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver
98706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    public ManifestDigest getManifestDigest() {
99706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        return mManifestDigest;
100706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    }
101706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
10237d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver    /** @return NO_UID when not set */
10313d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings    public int getInstallerUid() {
10413d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings        return mInstallerUid;
10513d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings    }
10613d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings
10713d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings    public void setInstallerUid(int uid) {
10813d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings        mInstallerUid = uid;
10913d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings    }
11013d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings
111706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    @Override
112706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    public int describeContents() {
113706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        return 0;
114706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    }
115706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
116706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    @Override
117706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    public boolean equals(Object o) {
118706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        if (this == o) {
119706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings            return true;
120706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        }
121706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
122706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        if (!(o instanceof VerificationParams)) {
123706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings            return false;
124706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        }
125706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
126706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        final VerificationParams other = (VerificationParams) o;
127706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
12837d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        if (mVerificationURI == null) {
12937d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver            if (other.mVerificationURI != null) {
13037d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver                return false;
13137d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver            }
13237d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        } else if (!mVerificationURI.equals(other.mVerificationURI)) {
133706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings            return false;
134706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        }
135706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
13637d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        if (mOriginatingURI == null) {
13737d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver            if (other.mOriginatingURI != null) {
13837d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver                return false;
13937d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver            }
14037d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        } else if (!mOriginatingURI.equals(other.mOriginatingURI)) {
141706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings            return false;
142706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        }
143706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
14437d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        if (mReferrer == null) {
14537d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver            if (other.mReferrer != null) {
14637d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver                return false;
14737d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver            }
14837d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        } else if (!mReferrer.equals(other.mReferrer)) {
149706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings            return false;
150706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        }
151706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
15237d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        if (mOriginatingUid != other.mOriginatingUid) {
153706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings            return false;
154706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        }
15537d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver
15637d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        if (mManifestDigest == null) {
15737d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver            if (other.mManifestDigest != null) {
15837d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver                return false;
15937d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver            }
16037d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        } else if (!mManifestDigest.equals(other.mManifestDigest)) {
161706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings            return false;
162706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        }
163706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
16413d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings        if (mInstallerUid != other.mInstallerUid) {
16513d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings            return false;
16613d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings        }
16713d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings
168706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        return true;
169706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    }
170706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
171706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    @Override
172706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    public int hashCode() {
173706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        int hash = 3;
174706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
17537d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        hash += 5 * (mVerificationURI == null ? 1 : mVerificationURI.hashCode());
17637d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        hash += 7 * (mOriginatingURI == null ? 1 : mOriginatingURI.hashCode());
17737d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        hash += 11 * (mReferrer == null ? 1 : mReferrer.hashCode());
17837d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        hash += 13 * mOriginatingUid;
17937d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        hash += 17 * (mManifestDigest == null ? 1 : mManifestDigest.hashCode());
18037d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        hash += 19 * mInstallerUid;
181706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
182706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        return hash;
183706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    }
184706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
185706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    @Override
186706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    public String toString() {
187706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        final StringBuilder sb = new StringBuilder(TO_STRING_PREFIX);
188706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
189706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        sb.append("mVerificationURI=");
190706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        sb.append(mVerificationURI.toString());
191706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        sb.append(",mOriginatingURI=");
192706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        sb.append(mOriginatingURI.toString());
193706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        sb.append(",mReferrer=");
194706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        sb.append(mReferrer.toString());
19537d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        sb.append(",mOriginatingUid=");
19637d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        sb.append(mOriginatingUid);
197706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        sb.append(",mManifestDigest=");
198706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        sb.append(mManifestDigest.toString());
19913d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings        sb.append(",mInstallerUid=");
20013d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings        sb.append(mInstallerUid);
201706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        sb.append('}');
202706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
203706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        return sb.toString();
204706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    }
205706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
206706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    @Override
207706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    public void writeToParcel(Parcel dest, int flags) {
208706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        dest.writeParcelable(mVerificationURI, 0);
209706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        dest.writeParcelable(mOriginatingURI, 0);
210706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        dest.writeParcelable(mReferrer, 0);
21137d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        dest.writeInt(mOriginatingUid);
212706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        dest.writeParcelable(mManifestDigest, 0);
21313d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings        dest.writeInt(mInstallerUid);
214706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    }
215706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
216706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
217706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    private VerificationParams(Parcel source) {
218706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        mVerificationURI = source.readParcelable(Uri.class.getClassLoader());
219706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        mOriginatingURI = source.readParcelable(Uri.class.getClassLoader());
220706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        mReferrer = source.readParcelable(Uri.class.getClassLoader());
22137d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver        mOriginatingUid = source.readInt();
222706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        mManifestDigest = source.readParcelable(ManifestDigest.class.getClassLoader());
22313d428e8306d1bb1a3017045bc5d2f76edec32dfrich cannings        mInstallerUid = source.readInt();
224706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    }
225706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
226706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    public static final Parcelable.Creator<VerificationParams> CREATOR =
227706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings            new Parcelable.Creator<VerificationParams>() {
228706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        public VerificationParams createFromParcel(Parcel source) {
229706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings                return new VerificationParams(source);
230706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        }
231706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
232706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        public VerificationParams[] newArray(int size) {
233706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings            return new VerificationParams[size];
234706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        }
235706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings    };
236706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings}
237