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