blob: e10c507723e7632ca53c22c1eaa52b4c3b1d883e [file] [log] [blame]
Svetoslav Ganova0027152013-06-25 14:59:53 -07001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.print;
18
Philip P. Moltmannc43639c2015-12-18 13:58:40 -080019import android.annotation.IntDef;
20import android.annotation.IntRange;
21import android.annotation.NonNull;
Svetoslav Ganova0027152013-06-25 14:59:53 -070022import android.os.Parcel;
23import android.os.Parcelable;
Svetoslav Ganov798bed62013-08-11 12:29:39 -070024import android.text.TextUtils;
Philip P. Moltmann4723f362016-03-30 13:48:38 -070025import com.android.internal.util.Preconditions;
Svetoslav Ganova0027152013-06-25 14:59:53 -070026
Philip P. Moltmannc43639c2015-12-18 13:58:40 -080027import java.lang.annotation.Retention;
28import java.lang.annotation.RetentionPolicy;
29
Svetoslav Ganova0027152013-06-25 14:59:53 -070030/**
Svetoslav Ganov4d4c66d2013-10-24 18:04:39 -070031 * This class encapsulates information about a document for printing
32 * purposes. This meta-data is used by the platform and print services,
33 * components that interact with printers. For example, this class
34 * contains the number of pages contained in the document it describes and
35 * this number of pages is shown to the user allowing him/her to select
36 * the range to print. Also a print service may optimize the printing
37 * process based on the content type, such as document or photo.
38 * <p>
39 * Instances of this class are created by the printing application and
40 * passed to the {@link PrintDocumentAdapter.LayoutResultCallback#onLayoutFinished(
41 * PrintDocumentInfo, boolean) PrintDocumentAdapter.LayoutResultCallback.onLayoutFinished(
42 * PrintDocumentInfo, boolean)} callback after successfully laying out the
43 * content which is performed in {@link PrintDocumentAdapter#onLayout(PrintAttributes,
44 * PrintAttributes, android.os.CancellationSignal, PrintDocumentAdapter.LayoutResultCallback,
45 * android.os.Bundle) PrintDocumentAdapter.onLayout(PrintAttributes,
46 * PrintAttributes, android.os.CancellationSignal,
47 * PrintDocumentAdapter.LayoutResultCallback, android.os.Bundle)}.
48 * </p>
49 * <p>
50 * An example usage looks like this:
51 * <pre>
52 *
53 * . . .
54 *
55 * public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes,
56 * CancellationSignal cancellationSignal, LayoutResultCallback callback,
57 * Bundle metadata) {
58 *
59 * // Assume the app defined a LayoutResult class which contains
60 * // the layout result data and that the content is a document.
61 * LayoutResult result = doSomeLayoutWork();
62 *
63 * PrintDocumentInfo info = new PrintDocumentInfo
64 * .Builder("printed_file.pdf")
65 * .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
66 * .setPageCount(result.getPageCount())
67 * .build();
68 *
69 * callback.onLayoutFinished(info, result.getContentChanged());
70 * }
71 *
72 * . . .
73 *
74 * </pre>
75 * </p>
Svetoslav Ganova0027152013-06-25 14:59:53 -070076 */
77public final class PrintDocumentInfo implements Parcelable {
78
79 /**
Svetoslav Ganov4d4c66d2013-10-24 18:04:39 -070080 * Constant for unknown page count.
Svetoslav Ganova0027152013-06-25 14:59:53 -070081 */
82 public static final int PAGE_COUNT_UNKNOWN = -1;
83
Philip P. Moltmannc43639c2015-12-18 13:58:40 -080084 /** @hide */
85 @Retention(RetentionPolicy.SOURCE)
Jeff Sharkeyce8db992017-12-13 20:05:05 -070086 @IntDef(prefix = { "CONTENT_TYPE_" }, value = {
87 CONTENT_TYPE_UNKNOWN,
88 CONTENT_TYPE_DOCUMENT,
89 CONTENT_TYPE_PHOTO
Philip P. Moltmannc43639c2015-12-18 13:58:40 -080090 })
91 public @interface ContentType {
92 }
Jeff Sharkeyce8db992017-12-13 20:05:05 -070093
Svetoslav Ganova0027152013-06-25 14:59:53 -070094 /**
Svetoslav Ganovaec14172013-08-27 00:30:54 -070095 * Content type: unknown.
Svetoslav Ganova0027152013-06-25 14:59:53 -070096 */
97 public static final int CONTENT_TYPE_UNKNOWN = -1;
98
99 /**
100 * Content type: document.
Svetoslav Ganov4d4c66d2013-10-24 18:04:39 -0700101 * <p>
102 * A print service may use normal paper to print the content instead
103 * of dedicated photo paper. Also it may use a lower quality printing
104 * process as the content is not as sensitive to print quality variation
105 * as a photo is.
106 * </p>
Svetoslav Ganova0027152013-06-25 14:59:53 -0700107 */
108 public static final int CONTENT_TYPE_DOCUMENT = 0;
109
110 /**
111 * Content type: photo.
Svetoslav Ganov4d4c66d2013-10-24 18:04:39 -0700112 * <p>
113 * A print service may use dedicated photo paper to print the content
114 * instead of normal paper. Also it may use a higher quality printing
115 * process as the content is more sensitive to print quality variation
116 * than a document.
117 * </p>
Svetoslav Ganova0027152013-06-25 14:59:53 -0700118 */
119 public static final int CONTENT_TYPE_PHOTO = 1;
120
Philip P. Moltmann4723f362016-03-30 13:48:38 -0700121 private @NonNull String mName;
122 private @IntRange(from = -1) int mPageCount;
Svetoslav Ganova0027152013-06-25 14:59:53 -0700123 private int mContentType;
Svetoslav Ganovd26d4892013-08-28 14:37:54 -0700124 private long mDataSize;
Svetoslav Ganova0027152013-06-25 14:59:53 -0700125
126 /**
127 * Creates a new instance.
128 */
129 private PrintDocumentInfo() {
Svetoslav Ganovaec14172013-08-27 00:30:54 -0700130 /* do nothing */
Svetoslav Ganova0027152013-06-25 14:59:53 -0700131 }
132
133 /**
134 * Creates a new instance.
135 *
Philip P. Moltmannc43639c2015-12-18 13:58:40 -0800136 * @param prototype from which to clone.
Svetoslav Ganova0027152013-06-25 14:59:53 -0700137 */
Philip P. Moltmannc43639c2015-12-18 13:58:40 -0800138 private PrintDocumentInfo(@NonNull PrintDocumentInfo prototype) {
Svetoslav Ganov798bed62013-08-11 12:29:39 -0700139 mName = prototype.mName;
Svetoslav Ganova0027152013-06-25 14:59:53 -0700140 mPageCount = prototype.mPageCount;
141 mContentType = prototype.mContentType;
Svetoslav Ganovd26d4892013-08-28 14:37:54 -0700142 mDataSize = prototype.mDataSize;
Svetoslav Ganova0027152013-06-25 14:59:53 -0700143 }
144
145 /**
146 * Creates a new instance.
147 *
148 * @param parcel Data from which to initialize.
149 */
150 private PrintDocumentInfo(Parcel parcel) {
Philip P. Moltmann4723f362016-03-30 13:48:38 -0700151 mName = Preconditions.checkStringNotEmpty(parcel.readString());
Svetoslav Ganova0027152013-06-25 14:59:53 -0700152 mPageCount = parcel.readInt();
Philip P. Moltmann4723f362016-03-30 13:48:38 -0700153 Preconditions.checkArgument(mPageCount == PAGE_COUNT_UNKNOWN || mPageCount > 0);
Svetoslav Ganova0027152013-06-25 14:59:53 -0700154 mContentType = parcel.readInt();
Philip P. Moltmann4723f362016-03-30 13:48:38 -0700155 mDataSize = Preconditions.checkArgumentNonnegative(parcel.readLong());
Svetoslav Ganova0027152013-06-25 14:59:53 -0700156 }
157
158 /**
Svetoslav Ganov4d4c66d2013-10-24 18:04:39 -0700159 * Gets the document name. This name may be shown to
160 * the user.
Svetoslav Ganov798bed62013-08-11 12:29:39 -0700161 *
162 * @return The document name.
163 */
Philip P. Moltmannc43639c2015-12-18 13:58:40 -0800164 public @NonNull String getName() {
Svetoslav Ganov798bed62013-08-11 12:29:39 -0700165 return mName;
166 }
167
168 /**
Svetoslav Ganova0027152013-06-25 14:59:53 -0700169 * Gets the total number of pages.
170 *
171 * @return The number of pages.
172 *
173 * @see #PAGE_COUNT_UNKNOWN
174 */
Philip P. Moltmannc43639c2015-12-18 13:58:40 -0800175 public @IntRange(from = -1) int getPageCount() {
Svetoslav Ganova0027152013-06-25 14:59:53 -0700176 return mPageCount;
177 }
178
179 /**
180 * Gets the content type.
181 *
182 * @return The content type.
183 *
184 * @see #CONTENT_TYPE_UNKNOWN
185 * @see #CONTENT_TYPE_DOCUMENT
186 * @see #CONTENT_TYPE_PHOTO
187 */
Philip P. Moltmann4723f362016-03-30 13:48:38 -0700188 public int getContentType() {
Svetoslav Ganova0027152013-06-25 14:59:53 -0700189 return mContentType;
190 }
191
Svetoslav Ganovaec14172013-08-27 00:30:54 -0700192 /**
Svetoslav Ganovd26d4892013-08-28 14:37:54 -0700193 * Gets the document data size in bytes.
194 *
195 * @return The data size.
196 */
Philip P. Moltmannc43639c2015-12-18 13:58:40 -0800197 public @IntRange(from = 0) long getDataSize() {
Svetoslav Ganovd26d4892013-08-28 14:37:54 -0700198 return mDataSize;
199 }
200
201 /**
202 * Sets the document data size in bytes.
203 *
204 * @param dataSize The data size.
205 *
206 * @hide
207 */
Philip P. Moltmannc43639c2015-12-18 13:58:40 -0800208 public void setDataSize(@IntRange(from = 0) long dataSize) {
Svetoslav Ganovd26d4892013-08-28 14:37:54 -0700209 mDataSize = dataSize;
210 }
211
Svetoslav Ganova0027152013-06-25 14:59:53 -0700212 @Override
213 public int describeContents() {
214 return 0;
215 }
216
217 @Override
218 public void writeToParcel(Parcel parcel, int flags) {
Svetoslav Ganov798bed62013-08-11 12:29:39 -0700219 parcel.writeString(mName);
Svetoslav Ganova0027152013-06-25 14:59:53 -0700220 parcel.writeInt(mPageCount);
221 parcel.writeInt(mContentType);
Svetoslav Ganovd26d4892013-08-28 14:37:54 -0700222 parcel.writeLong(mDataSize);
Svetoslav Ganova0027152013-06-25 14:59:53 -0700223 }
224
Svetoslav Ganov88d19912013-07-22 12:32:03 -0700225 @Override
Svetoslav Ganov85b1f882013-07-24 17:00:06 -0700226 public int hashCode() {
227 final int prime = 31;
228 int result = 1;
Svetoslav Ganov798bed62013-08-11 12:29:39 -0700229 result = prime * result + ((mName != null) ? mName.hashCode() : 0);
Svetoslav Ganov85b1f882013-07-24 17:00:06 -0700230 result = prime * result + mContentType;
231 result = prime * result + mPageCount;
Svetoslav Ganovd26d4892013-08-28 14:37:54 -0700232 result = prime * result + (int) mDataSize;
Andreas Gampe869d26f2015-03-15 13:59:50 -0700233 result = prime * result + (int) (mDataSize >> 32);
Svetoslav Ganov85b1f882013-07-24 17:00:06 -0700234 return result;
235 }
236
237 @Override
238 public boolean equals(Object obj) {
239 if (this == obj) {
240 return true;
241 }
242 if (obj == null) {
243 return false;
244 }
245 if (getClass() != obj.getClass()) {
246 return false;
247 }
248 PrintDocumentInfo other = (PrintDocumentInfo) obj;
Svetoslav Ganov798bed62013-08-11 12:29:39 -0700249 if (!TextUtils.equals(mName, other.mName)) {
250 return false;
251 }
Svetoslav Ganov85b1f882013-07-24 17:00:06 -0700252 if (mContentType != other.mContentType) {
253 return false;
254 }
255 if (mPageCount != other.mPageCount) {
256 return false;
257 }
Svetoslav Ganovd26d4892013-08-28 14:37:54 -0700258 if (mDataSize != other.mDataSize) {
259 return false;
260 }
Svetoslav Ganov85b1f882013-07-24 17:00:06 -0700261 return true;
262 }
263
264 @Override
Svetoslav Ganov88d19912013-07-22 12:32:03 -0700265 public String toString() {
266 StringBuilder builder = new StringBuilder();
267 builder.append("PrintDocumentInfo{");
Svetoslav Ganov798bed62013-08-11 12:29:39 -0700268 builder.append("name=").append(mName);
269 builder.append(", pageCount=").append(mPageCount);
Philip P. Moltmann4723f362016-03-30 13:48:38 -0700270 builder.append(", contentType=").append(contentTypeToString(mContentType));
Svetoslav Ganov7d7888d2013-10-12 13:18:12 -0700271 builder.append(", dataSize=").append(mDataSize);
Svetoslav Ganov88d19912013-07-22 12:32:03 -0700272 builder.append("}");
273 return builder.toString();
274 }
275
Philip P. Moltmann4723f362016-03-30 13:48:38 -0700276 private String contentTypeToString(int contentType) {
Svetoslav Ganov798bed62013-08-11 12:29:39 -0700277 switch (contentType) {
278 case CONTENT_TYPE_DOCUMENT: {
279 return "CONTENT_TYPE_DOCUMENT";
280 }
281 case CONTENT_TYPE_PHOTO: {
282 return "CONTENT_TYPE_PHOTO";
283 }
284 default: {
285 return "CONTENT_TYPE_UNKNOWN";
286 }
287 }
288 }
289
Svetoslav Ganova0027152013-06-25 14:59:53 -0700290 /**
Svetoslav Ganov4d4c66d2013-10-24 18:04:39 -0700291 * Builder for creating a {@link PrintDocumentInfo}.
Svetoslav Ganova0027152013-06-25 14:59:53 -0700292 */
293 public static final class Builder {
Svetoslav Ganov798bed62013-08-11 12:29:39 -0700294 private final PrintDocumentInfo mPrototype;
295
296 /**
297 * Constructor.
Svetoslav Ganov4d4c66d2013-10-24 18:04:39 -0700298 *
Svetoslav Ganovaec14172013-08-27 00:30:54 -0700299 * <p>
Svetoslav Ganov4d4c66d2013-10-24 18:04:39 -0700300 * The values of the relevant properties are initialized with defaults.
301 * Please refer to the documentation of the individual setters for
302 * information about the default values.
Svetoslav Ganovaec14172013-08-27 00:30:54 -0700303 * </p>
304 *
Svetoslav Ganov4d4c66d2013-10-24 18:04:39 -0700305 * @param name The document name which may be shown to the user and
306 * is the file name if the content it describes is saved as a PDF.
307 * Cannot be empty.
Svetoslav Ganovaec14172013-08-27 00:30:54 -0700308 */
Philip P. Moltmannc43639c2015-12-18 13:58:40 -0800309 public Builder(@NonNull String name) {
Svetoslav Ganov798bed62013-08-11 12:29:39 -0700310 if (TextUtils.isEmpty(name)) {
311 throw new IllegalArgumentException("name cannot be empty");
312 }
313 mPrototype = new PrintDocumentInfo();
314 mPrototype.mName = name;
315 }
Svetoslav Ganova0027152013-06-25 14:59:53 -0700316
317 /**
318 * Sets the total number of pages.
Svetoslav Ganovaec14172013-08-27 00:30:54 -0700319 * <p>
320 * <strong>Default: </strong> {@link #PAGE_COUNT_UNKNOWN}
321 * </p>
Svetoslav Ganova0027152013-06-25 14:59:53 -0700322 *
Philip P. Moltmannc43639c2015-12-18 13:58:40 -0800323 * @param pageCount The number of pages. Must be greater than or equal to zero or
324 * {@link PrintDocumentInfo#PAGE_COUNT_UNKNOWN}.
325 * @return This builder.
Svetoslav Ganova0027152013-06-25 14:59:53 -0700326 */
Philip P. Moltmannc43639c2015-12-18 13:58:40 -0800327 public @NonNull Builder setPageCount(@IntRange(from = -1) int pageCount) {
Svetoslav Ganova0027152013-06-25 14:59:53 -0700328 if (pageCount < 0 && pageCount != PAGE_COUNT_UNKNOWN) {
329 throw new IllegalArgumentException("pageCount"
Svetoslav0c126a42014-07-10 17:36:27 -0700330 + " must be greater than or equal to zero or"
Svetoslav Ganova0027152013-06-25 14:59:53 -0700331 + " DocumentInfo#PAGE_COUNT_UNKNOWN");
332 }
333 mPrototype.mPageCount = pageCount;
334 return this;
335 }
336
337 /**
338 * Sets the content type.
Svetoslav Ganovaec14172013-08-27 00:30:54 -0700339 * <p>
Philip P. Moltmannc49bf6a2016-07-06 17:18:44 -0700340 * <strong>Default: </strong> {@link #CONTENT_TYPE_DOCUMENT}
Svetoslav Ganovaec14172013-08-27 00:30:54 -0700341 * </p>
Svetoslav Ganova0027152013-06-25 14:59:53 -0700342 *
343 * @param type The content type.
Philip P. Moltmannc43639c2015-12-18 13:58:40 -0800344 * @return This builder.
Svetoslav Ganova0027152013-06-25 14:59:53 -0700345 * @see #CONTENT_TYPE_UNKNOWN
346 * @see #CONTENT_TYPE_DOCUMENT
347 * @see #CONTENT_TYPE_PHOTO
348 */
Philip P. Moltmannc43639c2015-12-18 13:58:40 -0800349 public @NonNull Builder setContentType(@ContentType int type) {
Svetoslav Ganova0027152013-06-25 14:59:53 -0700350 mPrototype.mContentType = type;
351 return this;
352 }
353
354 /**
Svetoslav Ganova0027152013-06-25 14:59:53 -0700355 * Creates a new {@link PrintDocumentInfo} instance.
356 *
357 * @return The new instance.
358 */
Philip P. Moltmannc43639c2015-12-18 13:58:40 -0800359 public @NonNull PrintDocumentInfo build() {
Svetoslav0c126a42014-07-10 17:36:27 -0700360 // Zero pages is the same as unknown as in this case
361 // we will have to ask for all pages and look a the
362 // wiritten PDF file for the page count.
363 if (mPrototype.mPageCount == 0) {
364 mPrototype.mPageCount = PAGE_COUNT_UNKNOWN;
365 }
Svetoslav Ganova0027152013-06-25 14:59:53 -0700366 return new PrintDocumentInfo(mPrototype);
367 }
368 }
369
Jeff Sharkey9e8f83d2019-02-28 12:06:45 -0700370 public static final @android.annotation.NonNull Parcelable.Creator<PrintDocumentInfo> CREATOR =
Svetoslav Ganova0027152013-06-25 14:59:53 -0700371 new Creator<PrintDocumentInfo>() {
372 @Override
373 public PrintDocumentInfo createFromParcel(Parcel parcel) {
374 return new PrintDocumentInfo(parcel);
375 }
376
377 @Override
378 public PrintDocumentInfo[] newArray(int size) {
379 return new PrintDocumentInfo[size];
380 }
381 };
382}