1a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov/*
2a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov * Copyright (C) 2013 The Android Open Source Project
3a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov *
4a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov * Licensed under the Apache License, Version 2.0 (the "License");
5a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov * you may not use this file except in compliance with the License.
6a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov * You may obtain a copy of the License at
7a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov *
8a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov *      http://www.apache.org/licenses/LICENSE-2.0
9a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov *
10a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov * Unless required by applicable law or agreed to in writing, software
11a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov * distributed under the License is distributed on an "AS IS" BASIS,
12a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov * See the License for the specific language governing permissions and
14a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov * limitations under the License.
15a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov */
16a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
17a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganovpackage android.print;
18a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
19c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmannimport android.annotation.IntDef;
20c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmannimport android.annotation.IntRange;
21c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmannimport android.annotation.NonNull;
22a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganovimport android.os.Parcel;
23a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganovimport android.os.Parcelable;
24798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganovimport android.text.TextUtils;
254723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmannimport com.android.internal.util.Preconditions;
26a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
27c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmannimport java.lang.annotation.Retention;
28c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmannimport java.lang.annotation.RetentionPolicy;
29c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann
30a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov/**
314d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * This class encapsulates information about a document for printing
324d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * purposes. This meta-data is used by the platform and print services,
334d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * components that interact with printers. For example, this class
344d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * contains the number of pages contained in the document it describes and
354d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * this number of pages is shown to the user allowing him/her to select
364d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * the range to print. Also a print service may optimize the printing
374d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * process based on the content type, such as document or photo.
384d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * <p>
394d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * Instances of this class are created by the printing application and
404d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * passed to the {@link PrintDocumentAdapter.LayoutResultCallback#onLayoutFinished(
414d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * PrintDocumentInfo, boolean) PrintDocumentAdapter.LayoutResultCallback.onLayoutFinished(
424d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * PrintDocumentInfo, boolean)} callback after successfully laying out the
434d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * content which is performed in {@link PrintDocumentAdapter#onLayout(PrintAttributes,
444d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * PrintAttributes, android.os.CancellationSignal, PrintDocumentAdapter.LayoutResultCallback,
454d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * android.os.Bundle) PrintDocumentAdapter.onLayout(PrintAttributes,
464d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * PrintAttributes, android.os.CancellationSignal,
474d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * PrintDocumentAdapter.LayoutResultCallback, android.os.Bundle)}.
484d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * </p>
494d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * <p>
504d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * An example usage looks like this:
514d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * <pre>
524d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *
534d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * . . .
544d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *
554d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes,
564d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *         CancellationSignal cancellationSignal, LayoutResultCallback callback,
574d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *         Bundle metadata) {
584d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *
594d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *        // Assume the app defined a LayoutResult class which contains
604d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *        // the layout result data and that the content is a document.
614d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *        LayoutResult result = doSomeLayoutWork();
624d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *
634d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *        PrintDocumentInfo info = new PrintDocumentInfo
644d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *                .Builder("printed_file.pdf")
654d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *                .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
664d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *                .setPageCount(result.getPageCount())
674d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *                .build();
684d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *
694d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *       callback.onLayoutFinished(info, result.getContentChanged());
704d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *   }
714d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *
724d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *   . . .
734d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov *
744d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * </pre>
754d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * </p>
76a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov */
77a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganovpublic final class PrintDocumentInfo implements Parcelable {
78a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
79a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    /**
804d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * Constant for unknown page count.
81a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     */
82a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    public static final int PAGE_COUNT_UNKNOWN = -1;
83a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
84c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    /** @hide */
85c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    @Retention(RetentionPolicy.SOURCE)
86ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey    @IntDef(prefix = { "CONTENT_TYPE_" }, value = {
87ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey            CONTENT_TYPE_UNKNOWN,
88ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey            CONTENT_TYPE_DOCUMENT,
89ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey            CONTENT_TYPE_PHOTO
90c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    })
91c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    public @interface ContentType {
92c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    }
93ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey
94a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    /**
95aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov     * Content type: unknown.
96a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     */
97a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    public static final int CONTENT_TYPE_UNKNOWN = -1;
98a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
99a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    /**
100a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     * Content type: document.
1014d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * <p>
1024d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * A print service may use normal paper to print the content instead
1034d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * of dedicated photo paper. Also it may use a lower quality printing
1044d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * process as the content is not as sensitive to print quality variation
1054d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * as a photo is.
1064d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * </p>
107a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     */
108a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    public static final int CONTENT_TYPE_DOCUMENT = 0;
109a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
110a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    /**
111a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     * Content type: photo.
1124d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * <p>
1134d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * A print service may use dedicated photo paper to print the content
1144d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * instead of normal paper. Also it may use a higher quality printing
1154d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * process as the content is more sensitive to print quality variation
1164d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * than a document.
1174d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * </p>
118a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     */
119a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    public static final int CONTENT_TYPE_PHOTO = 1;
120a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
1214723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann    private @NonNull String mName;
1224723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann    private @IntRange(from = -1) int mPageCount;
123a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    private int mContentType;
124d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov    private long mDataSize;
125a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
126a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    /**
127a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     * Creates a new instance.
128a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     */
129a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    private PrintDocumentInfo() {
130aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov        /* do nothing */
131a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    }
132a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
133a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    /**
134a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     * Creates a new instance.
135a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     *
136c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann     * @param prototype from which to clone.
137a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     */
138c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    private PrintDocumentInfo(@NonNull PrintDocumentInfo prototype) {
139798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        mName = prototype.mName;
140a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        mPageCount = prototype.mPageCount;
141a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        mContentType = prototype.mContentType;
142d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov        mDataSize = prototype.mDataSize;
143a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    }
144a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
145a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    /**
146a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     * Creates a new instance.
147a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     *
148a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     * @param parcel Data from which to initialize.
149a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     */
150a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    private PrintDocumentInfo(Parcel parcel) {
1514723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann        mName = Preconditions.checkStringNotEmpty(parcel.readString());
152a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        mPageCount = parcel.readInt();
1534723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann        Preconditions.checkArgument(mPageCount == PAGE_COUNT_UNKNOWN || mPageCount > 0);
154a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        mContentType = parcel.readInt();
1554723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann        mDataSize = Preconditions.checkArgumentNonnegative(parcel.readLong());
156a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    }
157a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
158a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    /**
1594d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * Gets the document name. This name may be shown to
1604d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * the user.
161798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov     *
162798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov     * @return The document name.
163798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov     */
164c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    public @NonNull String getName() {
165798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        return mName;
166798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov    }
167798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov
168798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov    /**
169a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     * Gets the total number of pages.
170a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     *
171a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     * @return The number of pages.
172a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     *
173a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     * @see #PAGE_COUNT_UNKNOWN
174a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     */
175c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    public @IntRange(from = -1) int getPageCount() {
176a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        return mPageCount;
177a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    }
178a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
179a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    /**
180a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     * Gets the content type.
181a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     *
182a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     * @return The content type.
183a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     *
184a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     * @see #CONTENT_TYPE_UNKNOWN
185a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     * @see #CONTENT_TYPE_DOCUMENT
186a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     * @see #CONTENT_TYPE_PHOTO
187a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     */
1884723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann    public int getContentType() {
189a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        return mContentType;
190a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    }
191a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
192aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov    /**
193d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov     * Gets the document data size in bytes.
194d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov     *
195d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov     * @return The data size.
196d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov     */
197c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    public @IntRange(from = 0) long getDataSize() {
198d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov        return mDataSize;
199d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov    }
200d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov
201d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov    /**
202d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov     * Sets the document data size in bytes.
203d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov     *
204d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov     * @param dataSize The data size.
205d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov     *
206d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov     * @hide
207d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov     */
208c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    public void setDataSize(@IntRange(from = 0) long dataSize) {
209d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov        mDataSize = dataSize;
210d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov    }
211d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov
212a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    @Override
213a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    public int describeContents() {
214a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        return 0;
215a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    }
216a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
217a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    @Override
218a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    public void writeToParcel(Parcel parcel, int flags) {
219798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        parcel.writeString(mName);
220a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        parcel.writeInt(mPageCount);
221a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        parcel.writeInt(mContentType);
222d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov        parcel.writeLong(mDataSize);
223a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    }
224a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
22588d199130d44c6bacb383a7757e782cf97483c68Svetoslav Ganov    @Override
22685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov    public int hashCode() {
22785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        final int prime = 31;
22885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        int result = 1;
229798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        result = prime * result + ((mName != null) ? mName.hashCode() : 0);
23085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        result = prime * result + mContentType;
23185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        result = prime * result + mPageCount;
232d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov        result = prime * result + (int) mDataSize;
233869d26fda0d612c15eac64f7d7bc6d7a28073498Andreas Gampe        result = prime * result + (int) (mDataSize >> 32);
23485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        return result;
23585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov    }
23685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov
23785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov    @Override
23885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov    public boolean equals(Object obj) {
23985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        if (this == obj) {
24085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return true;
24185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
24285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        if (obj == null) {
24385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return false;
24485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
24585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        if (getClass() != obj.getClass()) {
24685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return false;
24785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
24885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        PrintDocumentInfo other = (PrintDocumentInfo) obj;
249798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        if (!TextUtils.equals(mName, other.mName)) {
250798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov            return false;
251798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        }
25285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        if (mContentType != other.mContentType) {
25385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return false;
25485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
25585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        if (mPageCount != other.mPageCount) {
25685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return false;
25785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
258d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov        if (mDataSize != other.mDataSize) {
259d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov            return false;
260d26d4898fcc9b78f4b66118895c375384098205eSvetoslav Ganov        }
26185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        return true;
26285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov    }
26385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov
26485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov    @Override
26588d199130d44c6bacb383a7757e782cf97483c68Svetoslav Ganov    public String toString() {
26688d199130d44c6bacb383a7757e782cf97483c68Svetoslav Ganov        StringBuilder builder = new StringBuilder();
26788d199130d44c6bacb383a7757e782cf97483c68Svetoslav Ganov        builder.append("PrintDocumentInfo{");
268798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        builder.append("name=").append(mName);
269798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        builder.append(", pageCount=").append(mPageCount);
2704723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann        builder.append(", contentType=").append(contentTypeToString(mContentType));
2717d7888d1c7daa78ee0ad24a24c8dd54b01749259Svetoslav Ganov        builder.append(", dataSize=").append(mDataSize);
27288d199130d44c6bacb383a7757e782cf97483c68Svetoslav Ganov        builder.append("}");
27388d199130d44c6bacb383a7757e782cf97483c68Svetoslav Ganov        return builder.toString();
27488d199130d44c6bacb383a7757e782cf97483c68Svetoslav Ganov    }
27588d199130d44c6bacb383a7757e782cf97483c68Svetoslav Ganov
2764723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann    private String contentTypeToString(int contentType) {
277798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        switch (contentType) {
278798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov            case CONTENT_TYPE_DOCUMENT: {
279798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov                return "CONTENT_TYPE_DOCUMENT";
280798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov            }
281798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov            case CONTENT_TYPE_PHOTO: {
282798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov                return "CONTENT_TYPE_PHOTO";
283798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov            }
284798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov            default: {
285798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov                return "CONTENT_TYPE_UNKNOWN";
286798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov            }
287798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        }
288798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov    }
289798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov
290a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    /**
2914d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * Builder for creating a {@link PrintDocumentInfo}.
292a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov     */
293a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    public static final class Builder {
294798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        private final PrintDocumentInfo mPrototype;
295798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov
296798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        /**
297798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov         * Constructor.
2984d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         *
299aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov         * <p>
3004d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * The values of the relevant properties are initialized with defaults.
3014d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * Please refer to the documentation of the individual setters for
3024d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * information about the default values.
303aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov         * </p>
304aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov         *
3054d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * @param name The document name which may be shown to the user and
3064d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * is the file name if the content it describes is saved as a PDF.
3074d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * Cannot be empty.
308aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov         */
309c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public Builder(@NonNull String name) {
310798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov            if (TextUtils.isEmpty(name)) {
311798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov                throw new IllegalArgumentException("name cannot be empty");
312798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov            }
313798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov            mPrototype = new PrintDocumentInfo();
314798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov            mPrototype.mName = name;
315798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        }
316a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
317a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        /**
318a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov         * Sets the total number of pages.
319aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov         * <p>
320aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov         * <strong>Default: </strong> {@link #PAGE_COUNT_UNKNOWN}
321aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov         * </p>
322a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov         *
323c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann         * @param pageCount The number of pages. Must be greater than or equal to zero or
324c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann         *            {@link PrintDocumentInfo#PAGE_COUNT_UNKNOWN}.
325c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann         * @return This builder.
326a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov         */
327c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull Builder setPageCount(@IntRange(from = -1) int pageCount) {
328a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov            if (pageCount < 0 && pageCount != PAGE_COUNT_UNKNOWN) {
329a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov                throw new IllegalArgumentException("pageCount"
3300c126a478b4b1891b275fe424c9f7e37adcdb758Svetoslav                        + " must be greater than or equal to zero or"
331a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov                        + " DocumentInfo#PAGE_COUNT_UNKNOWN");
332a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov            }
333a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov            mPrototype.mPageCount = pageCount;
334a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov            return this;
335a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        }
336a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
337a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        /**
338a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov         * Sets the content type.
339aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov         * <p>
340c49bf6a63b52ca74a6b3b517e209808037eb04dfPhilip P. Moltmann         * <strong>Default: </strong> {@link #CONTENT_TYPE_DOCUMENT}
341aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov         * </p>
342a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov         *
343a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov         * @param type The content type.
344c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann         * @return This builder.
345a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov         * @see #CONTENT_TYPE_UNKNOWN
346a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov         * @see #CONTENT_TYPE_DOCUMENT
347a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov         * @see #CONTENT_TYPE_PHOTO
348a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov         */
349c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull Builder setContentType(@ContentType int type) {
350a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov            mPrototype.mContentType = type;
351a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov            return this;
352a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        }
353a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
354a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        /**
355a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov         * Creates a new {@link PrintDocumentInfo} instance.
356a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov         *
357a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov         * @return The new instance.
358a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov         */
359c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull PrintDocumentInfo build() {
3600c126a478b4b1891b275fe424c9f7e37adcdb758Svetoslav            // Zero pages is the same as unknown as in this case
3610c126a478b4b1891b275fe424c9f7e37adcdb758Svetoslav            // we will have to ask for all pages and look a the
3620c126a478b4b1891b275fe424c9f7e37adcdb758Svetoslav            // wiritten PDF file for the page count.
3630c126a478b4b1891b275fe424c9f7e37adcdb758Svetoslav            if (mPrototype.mPageCount == 0) {
3640c126a478b4b1891b275fe424c9f7e37adcdb758Svetoslav                mPrototype.mPageCount = PAGE_COUNT_UNKNOWN;
3650c126a478b4b1891b275fe424c9f7e37adcdb758Svetoslav            }
366a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov            return new PrintDocumentInfo(mPrototype);
367a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        }
368a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    }
369a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
370a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    public static final Parcelable.Creator<PrintDocumentInfo> CREATOR =
371a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov            new Creator<PrintDocumentInfo>() {
372a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        @Override
373a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        public PrintDocumentInfo createFromParcel(Parcel parcel) {
374a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov            return new PrintDocumentInfo(parcel);
375a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        }
376a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
377a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        @Override
378a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        public PrintDocumentInfo[] newArray(int size) {
379a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov            return new PrintDocumentInfo[size];
380a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov        }
381a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    };
382a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov}
383