14b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov/*
24b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * Copyright (C) 2013 The Android Open Source Project
34b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov *
44b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * Licensed under the Apache License, Version 2.0 (the "License");
54b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * you may not use this file except in compliance with the License.
64b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * You may obtain a copy of the License at
74b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov *
84b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov *      http://www.apache.org/licenses/LICENSE-2.0
94b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov *
104b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * Unless required by applicable law or agreed to in writing, software
114b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * distributed under the License is distributed on an "AS IS" BASIS,
124b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * See the License for the specific language governing permissions and
144b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * limitations under the License.
154b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov */
164b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
174b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovpackage android.print;
184b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
19c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmannimport android.annotation.IntDef;
20c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmannimport android.annotation.IntRange;
21c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmannimport android.annotation.NonNull;
22c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmannimport android.annotation.Nullable;
23aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmannimport android.annotation.StringRes;
244b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovimport android.content.pm.PackageManager;
254b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovimport android.content.pm.PackageManager.NameNotFoundException;
26773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslavimport android.content.res.Resources.NotFoundException;
274b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovimport android.os.Parcel;
284b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovimport android.os.Parcelable;
29c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.service.print.PrintAttributesProto;
304b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovimport android.text.TextUtils;
317be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganovimport android.util.ArrayMap;
324959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmannimport android.util.ArraySet;
33773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslavimport android.util.Log;
344b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
354b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovimport com.android.internal.R;
36aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmannimport com.android.internal.util.Preconditions;
374b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
38c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmannimport java.lang.annotation.Retention;
39c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmannimport java.lang.annotation.RetentionPolicy;
407be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganovimport java.util.Map;
417be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov
424b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov/**
434d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * This class represents the attributes of a print job. These attributes
444d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * describe how the printed content should be laid out. For example, the
454d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * print attributes may state that the content should be laid out on a
464d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * letter size with 300 DPI (dots per inch) resolution, have a margin of
474d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * 10 mills (thousand of an inch) on all sides, and be black and white.
484b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov */
494b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovpublic final class PrintAttributes implements Parcelable {
50c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    /** @hide */
51c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    @Retention(RetentionPolicy.SOURCE)
52ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey    @IntDef(flag = true, prefix = { "COLOR_MODE_" }, value = {
53ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey            COLOR_MODE_MONOCHROME,
54ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey            COLOR_MODE_COLOR
55c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    })
56aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann    @interface ColorMode {
57c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    }
5822cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov    /** Color mode: Monochrome color scheme, for example one color is used. */
59c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    public static final int COLOR_MODE_MONOCHROME = PrintAttributesProto.COLOR_MODE_MONOCHROME;
6022cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov    /** Color mode: Color color scheme, for example many colors are used. */
61c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    public static final int COLOR_MODE_COLOR = PrintAttributesProto.COLOR_MODE_COLOR;
624b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
634b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    private static final int VALID_COLOR_MODES =
644b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            COLOR_MODE_MONOCHROME | COLOR_MODE_COLOR;
654b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
66c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    /** @hide */
67c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    @Retention(RetentionPolicy.SOURCE)
68ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey    @IntDef(flag = true, prefix = { "DUPLEX_MODE_" }, value = {
69ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey            DUPLEX_MODE_NONE,
70ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey            DUPLEX_MODE_LONG_EDGE,
71ce8db9911494225fcd99711d7df85a130de5a6ceJeff Sharkey            DUPLEX_MODE_SHORT_EDGE
72c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    })
73aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann    @interface DuplexMode {
74c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    }
75948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav    /** Duplex mode: No duplexing. */
76c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    public static final int DUPLEX_MODE_NONE = PrintAttributesProto.DUPLEX_MODE_NONE;
77948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav    /** Duplex mode: Pages are turned sideways along the long edge - like a book. */
78c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    public static final int DUPLEX_MODE_LONG_EDGE = PrintAttributesProto.DUPLEX_MODE_LONG_EDGE;
79948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav    /** Duplex mode: Pages are turned upwards along the short edge - like a notpad. */
80c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    public static final int DUPLEX_MODE_SHORT_EDGE = PrintAttributesProto.DUPLEX_MODE_SHORT_EDGE;
81948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav
82948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav    private static final int VALID_DUPLEX_MODES =
83948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav            DUPLEX_MODE_NONE | DUPLEX_MODE_LONG_EDGE | DUPLEX_MODE_SHORT_EDGE;
84948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav
85aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann    private @Nullable MediaSize mMediaSize;
86aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann    private @Nullable Resolution mResolution;
87aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann    private @Nullable Margins mMinMargins;
884b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
89aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann    private @IntRange(from = 0) int mColorMode;
90aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann    private @IntRange(from = 0) int mDuplexMode;
914b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
924b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    PrintAttributes() {
934b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /* hide constructor */
944b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
954b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
96c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    private PrintAttributes(@NonNull Parcel parcel) {
97aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        mMediaSize = (parcel.readInt() == 1) ? MediaSize.createFromParcel(parcel) : null;
98aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        mResolution = (parcel.readInt() == 1) ? Resolution.createFromParcel(parcel) : null;
99aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        mMinMargins = (parcel.readInt() == 1) ? Margins.createFromParcel(parcel) : null;
1004b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        mColorMode = parcel.readInt();
101aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        if (mColorMode != 0) {
102aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann            enforceValidColorMode(mColorMode);
103aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        }
104948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        mDuplexMode = parcel.readInt();
105aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        if (mDuplexMode != 0) {
106aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann            enforceValidDuplexMode(mDuplexMode);
107aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        }
1084b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
1094b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
1104b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    /**
1114b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * Gets the media size.
1124b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
1134b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * @return The media size or <code>null</code> if not set.
1144b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     */
115c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    public @Nullable MediaSize getMediaSize() {
1164b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        return mMediaSize;
1174b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
1184b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
1194b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    /**
1204b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * Sets the media size.
1214b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
122948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     * @param mediaSize The media size.
1234b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
1244b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * @hide
1254b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     */
1264b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    public void setMediaSize(MediaSize mediaSize) {
1274b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        mMediaSize = mediaSize;
1284b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
1294b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
1304b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    /**
1314b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * Gets the resolution.
1324b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
1334b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * @return The resolution or <code>null</code> if not set.
1344b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     */
135c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    public @Nullable Resolution getResolution() {
1364b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        return mResolution;
1374b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
1384b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
1394b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    /**
1404b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * Sets the resolution.
1414b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
142948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     * @param resolution The resolution.
1434b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
1444b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * @hide
1454b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     */
1464b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    public void setResolution(Resolution resolution) {
1474b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        mResolution = resolution;
1484b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
1494b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
1504b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    /**
151651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav     * Gets the minimal margins. If the content does not fit
152651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav     * these margins it will be clipped.
153525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov     * <p>
154525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov     * <strong>These margins are physically imposed by the printer and they
155525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov     * are <em>not</em> rotated, i.e. they are the same for both portrait and
156525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov     * landscape. For example, a printer may not be able to print in a stripe
157525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov     * on both left and right sides of the page.
158525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov     * </strong>
159525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov     * </p>
1604b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
1614b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * @return The margins or <code>null</code> if not set.
1624b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     */
163c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    public @Nullable Margins getMinMargins() {
164651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav        return mMinMargins;
1654b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
1664b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
1674b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    /**
168651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav     * Sets the minimal margins. If the content does not fit
169651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav     * these margins it will be clipped.
170525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov     * <p>
171525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov     * <strong>These margins are physically imposed by the printer and they
172525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov     * are <em>not</em> rotated, i.e. they are the same for both portrait and
173525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov     * landscape. For example, a printer may not be able to print in a stripe
174525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov     * on both left and right sides of the page.
175525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov     * </strong>
176525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov     * </p>
1774b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
178948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     * @param margins The margins.
1794b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
1804b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * @hide
1814b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     */
182651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav    public void setMinMargins(Margins margins) {
183651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav        mMinMargins = margins;
1844b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
1854b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
1864b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    /**
1874b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * Gets the color mode.
1884b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
1894b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * @return The color mode or zero if not set.
1904b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
1914b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * @see #COLOR_MODE_COLOR
1924b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * @see #COLOR_MODE_MONOCHROME
1934b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     */
194aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann    public @IntRange(from = 0) int getColorMode() {
1954b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        return mColorMode;
1964b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
1974b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
1984b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    /**
1994b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * Sets the color mode.
2004b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
201948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     * @param colorMode The color mode.
2024b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
2034b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * @see #COLOR_MODE_MONOCHROME
2044b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * @see #COLOR_MODE_COLOR
2054b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
2064b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * @hide
2074b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     */
2084b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    public void setColorMode(int colorMode) {
2094b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        enforceValidColorMode(colorMode);
2104b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        mColorMode = colorMode;
2114b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
2124b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
213a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    /**
214a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     * Gets whether this print attributes are in portrait orientation,
215a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     * which is the media size is in portrait and all orientation dependent
216a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     * attributes such as resolution and margins are properly adjusted.
217a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     *
218a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     * @return Whether this print attributes are in portrait.
219a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     *
220a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     * @hide
221a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     */
222a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    public boolean isPortrait() {
223a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        return mMediaSize.isPortrait();
224a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
225a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
226a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    /**
227948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     * Gets the duplex mode.
228948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     *
229aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann     * @return The duplex mode or zero if not set.
230948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     *
231948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     * @see #DUPLEX_MODE_NONE
232948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     * @see #DUPLEX_MODE_LONG_EDGE
233948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     * @see #DUPLEX_MODE_SHORT_EDGE
234948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     */
235aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann    public @IntRange(from = 0) int getDuplexMode() {
236948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        return mDuplexMode;
237948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav    }
238948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav
239948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav    /**
240948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     * Sets the duplex mode.
241948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     *
242948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     * @param duplexMode The duplex mode.
243948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     *
244948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     * @see #DUPLEX_MODE_NONE
245948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     * @see #DUPLEX_MODE_LONG_EDGE
246948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     * @see #DUPLEX_MODE_SHORT_EDGE
247948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     *
248948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     * @hide
249948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav     */
250948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav    public void setDuplexMode(int duplexMode) {
251948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        enforceValidDuplexMode(duplexMode);
252948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        mDuplexMode = duplexMode;
253948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav    }
254948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav
255948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav    /**
256a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     * Gets a new print attributes instance which is in portrait orientation,
257a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     * which is the media size is in portrait and all orientation dependent
258a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     * attributes such as resolution and margins are properly adjusted.
259a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     *
260a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     * @return New instance in portrait orientation if this one is in
261a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     * landscape, otherwise this instance.
262a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     *
263a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     * @hide
264a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     */
265a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    public PrintAttributes asPortrait() {
266a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        if (isPortrait()) {
267a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            return this;
268a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
269a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
270a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        PrintAttributes attributes = new PrintAttributes();
271a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
272a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        // Rotate the media size.
273a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        attributes.setMediaSize(getMediaSize().asPortrait());
274a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
275a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        // Rotate the resolution.
276a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        Resolution oldResolution = getResolution();
277a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        Resolution newResolution = new Resolution(
278a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                oldResolution.getId(),
279a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                oldResolution.getLabel(),
280a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                oldResolution.getVerticalDpi(),
281a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                oldResolution.getHorizontalDpi());
282a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        attributes.setResolution(newResolution);
283a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
284525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov        // Do not rotate the physical margins.
285525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov        attributes.setMinMargins(getMinMargins());
286a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
287a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        attributes.setColorMode(getColorMode());
288948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        attributes.setDuplexMode(getDuplexMode());
289a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
290a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        return attributes;
291a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
292a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
293a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    /**
294a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     * Gets a new print attributes instance which is in landscape orientation,
295a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     * which is the media size is in landscape and all orientation dependent
296a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     * attributes such as resolution and margins are properly adjusted.
297a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     *
298a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     * @return New instance in landscape orientation if this one is in
299a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     * portrait, otherwise this instance.
300a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     *
301a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     * @hide
302a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav     */
303a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    public PrintAttributes asLandscape() {
304a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        if (!isPortrait()) {
305a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            return this;
306a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
307a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
308a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        PrintAttributes attributes = new PrintAttributes();
309a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
310a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        // Rotate the media size.
311a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        attributes.setMediaSize(getMediaSize().asLandscape());
312a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
313a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        // Rotate the resolution.
314a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        Resolution oldResolution = getResolution();
315a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        Resolution newResolution = new Resolution(
316a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                oldResolution.getId(),
317a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                oldResolution.getLabel(),
318a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                oldResolution.getVerticalDpi(),
319a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                oldResolution.getHorizontalDpi());
320a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        attributes.setResolution(newResolution);
321a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
322525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov        // Do not rotate the physical margins.
323525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov        attributes.setMinMargins(getMinMargins());
324a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
325a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        attributes.setColorMode(getColorMode());
326948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        attributes.setDuplexMode(getDuplexMode());
327a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
328a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        return attributes;
329a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
330a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
3314b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    @Override
3324b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    public void writeToParcel(Parcel parcel, int flags) {
3334b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        if (mMediaSize != null) {
3344b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            parcel.writeInt(1);
3354b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            mMediaSize.writeToParcel(parcel);
3364b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        } else {
3374b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            parcel.writeInt(0);
3384b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
3394b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        if (mResolution != null) {
3404b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            parcel.writeInt(1);
3414b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            mResolution.writeToParcel(parcel);
3424b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        } else {
3434b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            parcel.writeInt(0);
3444b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
345651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav        if (mMinMargins != null) {
3464b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            parcel.writeInt(1);
347651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav            mMinMargins.writeToParcel(parcel);
3484b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        } else {
3494b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            parcel.writeInt(0);
3504b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
3514b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        parcel.writeInt(mColorMode);
352948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        parcel.writeInt(mDuplexMode);
3534b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
3544b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
3554b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    @Override
3564b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    public int describeContents() {
3574b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        return 0;
3584b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
3594b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
36085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov    @Override
36185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov    public int hashCode() {
36285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        final int prime = 31;
36385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        int result = 1;
36485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        result = prime * result + mColorMode;
365948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        result = prime * result + mDuplexMode;
366651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav        result = prime * result + ((mMinMargins == null) ? 0 : mMinMargins.hashCode());
36785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        result = prime * result + ((mMediaSize == null) ? 0 : mMediaSize.hashCode());
36885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        result = prime * result + ((mResolution == null) ? 0 : mResolution.hashCode());
36985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        return result;
37085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov    }
37185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov
37285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov    @Override
37385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov    public boolean equals(Object obj) {
37485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        if (this == obj) {
37585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return true;
37685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
37785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        if (obj == null) {
37885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return false;
37985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
38085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        if (getClass() != obj.getClass()) {
38185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return false;
38285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
38385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        PrintAttributes other = (PrintAttributes) obj;
38485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        if (mColorMode != other.mColorMode) {
38585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return false;
38685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
387948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        if (mDuplexMode != other.mDuplexMode) {
388948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav            return false;
389948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        }
390651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav        if (mMinMargins == null) {
391651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav            if (other.mMinMargins != null) {
39285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return false;
39385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
394651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav        } else if (!mMinMargins.equals(other.mMinMargins)) {
39585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return false;
39685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
39785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        if (mMediaSize == null) {
39885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (other.mMediaSize != null) {
39985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return false;
40085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
40185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        } else if (!mMediaSize.equals(other.mMediaSize)) {
40285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return false;
40385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
40485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        if (mResolution == null) {
40585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (other.mResolution != null) {
40685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return false;
40785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
40885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        } else if (!mResolution.equals(other.mResolution)) {
40985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return false;
41085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
41185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        return true;
41285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov    }
41385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov
41485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov    @Override
41585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov    public String toString() {
41685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        StringBuilder builder = new StringBuilder();
41785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        builder.append("PrintAttributes{");
41885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        builder.append("mediaSize: ").append(mMediaSize);
419cc65b0c325b88c466763712f76148a6f5b8a5b3fSvetoslav        if (mMediaSize != null) {
420cc65b0c325b88c466763712f76148a6f5b8a5b3fSvetoslav            builder.append(", orientation: ").append(mMediaSize.isPortrait()
421cc65b0c325b88c466763712f76148a6f5b8a5b3fSvetoslav                    ? "portrait" : "landscape");
422cc65b0c325b88c466763712f76148a6f5b8a5b3fSvetoslav        } else {
423cc65b0c325b88c466763712f76148a6f5b8a5b3fSvetoslav            builder.append(", orientation: ").append("null");
424cc65b0c325b88c466763712f76148a6f5b8a5b3fSvetoslav        }
42585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        builder.append(", resolution: ").append(mResolution);
426651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav        builder.append(", minMargins: ").append(mMinMargins);
42785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        builder.append(", colorMode: ").append(colorModeToString(mColorMode));
428948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        builder.append(", duplexMode: ").append(duplexModeToString(mDuplexMode));
42985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        builder.append("}");
43085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        return builder.toString();
43185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov    }
43285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov
43381d4014c59d2c6cf23b0465e9b8c94b6bfe428e2Svetoslav    /** @hide */
4344b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    public void clear() {
4354b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        mMediaSize = null;
4364b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        mResolution = null;
437651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav        mMinMargins = null;
4384b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        mColorMode = 0;
439b4efdb4726a442eef38bb6417d5acb8eb68b912dPhilip P. Moltmann        mDuplexMode = 0;
4404b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
4414b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
4424b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    /**
4430d1daa50f6d180c57f92596501e2e5c0b5ef9997Svetoslav Ganov     * @hide
4440d1daa50f6d180c57f92596501e2e5c0b5ef9997Svetoslav Ganov     */
4450d1daa50f6d180c57f92596501e2e5c0b5ef9997Svetoslav Ganov    public void copyFrom(PrintAttributes other) {
4460d1daa50f6d180c57f92596501e2e5c0b5ef9997Svetoslav Ganov        mMediaSize = other.mMediaSize;
4470d1daa50f6d180c57f92596501e2e5c0b5ef9997Svetoslav Ganov        mResolution = other.mResolution;
448651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav        mMinMargins = other.mMinMargins;
4490d1daa50f6d180c57f92596501e2e5c0b5ef9997Svetoslav Ganov        mColorMode = other.mColorMode;
450948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        mDuplexMode = other.mDuplexMode;
4510d1daa50f6d180c57f92596501e2e5c0b5ef9997Svetoslav Ganov    }
4520d1daa50f6d180c57f92596501e2e5c0b5ef9997Svetoslav Ganov
4530d1daa50f6d180c57f92596501e2e5c0b5ef9997Svetoslav Ganov    /**
45422cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov     * This class specifies a supported media size. Media size is the
45522cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov     * dimension of the media on which the content is printed. For
45622cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov     * example, the {@link #NA_LETTER} media size designates a page
45722cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov     * with size 8.5" x 11".
4584b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     */
4594b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    public static final class MediaSize {
460773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        private static final String LOG_TAG = "MediaSize";
4614b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
4627be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov        private static final Map<String, MediaSize> sIdToMediaSizeMap =
463aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann                new ArrayMap<>();
4647be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov
465d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav        /**
466d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav         * Unknown media size in portrait mode.
467d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav         * <p>
468d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav         * <strong>Note: </strong>This is for specifying orientation without media
4694d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * size. You should not use the dimensions reported by this instance.
470d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav         * </p>
471d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav         */
472d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav        public static final MediaSize UNKNOWN_PORTRAIT =
473d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("UNKNOWN_PORTRAIT", "android",
474b2420c917bf4092f44a2270d7e88ee2380f72080Svetoslav Ganov                        R.string.mediasize_unknown_portrait, 1, Integer.MAX_VALUE);
475d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav
476d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav        /**
477d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav         * Unknown media size in landscape mode.
478d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav         * <p>
479d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav         * <strong>Note: </strong>This is for specifying orientation without media
4804d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * size. You should not use the dimensions reported by this instance.
481d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav         * </p>
482d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav         */
483d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav        public static final MediaSize UNKNOWN_LANDSCAPE =
484d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("UNKNOWN_LANDSCAPE", "android",
485b2420c917bf4092f44a2270d7e88ee2380f72080Svetoslav Ganov                        R.string.mediasize_unknown_landscape, Integer.MAX_VALUE, 1);
4864b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
4874b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        // ISO sizes
4884b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
489773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO A0 media size: 841mm x 1189mm (33.11" x 46.81") */
490773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_A0 =
491d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_A0", "android", R.string.mediasize_iso_a0, 33110, 46810);
492773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO A1 media size: 594mm x 841mm (23.39" x 33.11") */
493773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_A1 =
494d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_A1", "android", R.string.mediasize_iso_a1, 23390, 33110);
495773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO A2 media size: 420mm x 594mm (16.54" x 23.39") */
496773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_A2 =
497d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_A2", "android", R.string.mediasize_iso_a2, 16540, 23390);
498773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO A3 media size: 297mm x 420mm (11.69" x 16.54") */
499773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_A3 =
500d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_A3", "android", R.string.mediasize_iso_a3, 11690, 16540);
501773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO A4 media size: 210mm x 297mm (8.27" x 11.69") */
502773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_A4 =
503d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_A4", "android", R.string.mediasize_iso_a4, 8270, 11690);
504773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO A5 media size: 148mm x 210mm (5.83" x 8.27") */
505773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_A5 =
506d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_A5", "android", R.string.mediasize_iso_a5, 5830, 8270);
507773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO A6 media size: 105mm x 148mm (4.13" x 5.83") */
508773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_A6 =
509d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_A6", "android", R.string.mediasize_iso_a6, 4130, 5830);
510773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO A7 media size: 74mm x 105mm (2.91" x 4.13") */
511773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_A7 =
512d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_A7", "android", R.string.mediasize_iso_a7, 2910, 4130);
513773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO A8 media size: 52mm x 74mm (2.05" x 2.91") */
514773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_A8 =
515d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_A8", "android", R.string.mediasize_iso_a8, 2050, 2910);
516773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO A9 media size: 37mm x 52mm (1.46" x 2.05") */
517773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_A9 =
518d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_A9", "android", R.string.mediasize_iso_a9, 1460, 2050);
519773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO A10 media size: 26mm x 37mm (1.02" x 1.46") */
520773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_A10 =
521d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_A10", "android", R.string.mediasize_iso_a10, 1020, 1460);
522773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav
523773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO B0 media size: 1000mm x 1414mm (39.37" x 55.67") */
524773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_B0 =
525d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_B0", "android", R.string.mediasize_iso_b0, 39370, 55670);
526773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO B1 media size: 707mm x 1000mm (27.83" x 39.37") */
527773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_B1 =
528d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_B1", "android", R.string.mediasize_iso_b1, 27830, 39370);
529773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO B2 media size: 500mm x 707mm (19.69" x 27.83") */
530773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_B2 =
531d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_B2", "android", R.string.mediasize_iso_b2, 19690, 27830);
532773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO B3 media size: 353mm x 500mm (13.90" x 19.69") */
533773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_B3 =
534d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_B3", "android", R.string.mediasize_iso_b3, 13900, 19690);
535773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO B4 media size: 250mm x 353mm (9.84" x 13.90") */
536773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_B4 =
537d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_B4", "android", R.string.mediasize_iso_b4, 9840, 13900);
538773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO B5 media size: 176mm x 250mm (6.93" x 9.84") */
539773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_B5 =
540d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_B5", "android", R.string.mediasize_iso_b5, 6930, 9840);
541773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO B6 media size: 125mm x 176mm (4.92" x 6.93") */
542773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_B6 =
543d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_B6", "android", R.string.mediasize_iso_b6, 4920, 6930);
544773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO B7 media size: 88mm x 125mm (3.46" x 4.92") */
545773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_B7 =
546d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_B7", "android", R.string.mediasize_iso_b7, 3460, 4920);
547773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO B8 media size: 62mm x 88mm (2.44" x 3.46") */
548773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_B8 =
549d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_B8", "android", R.string.mediasize_iso_b8, 2440, 3460);
550773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO B9 media size: 44mm x 62mm (1.73" x 2.44") */
551773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_B9 =
552d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_B9", "android", R.string.mediasize_iso_b9, 1730, 2440);
553773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO B10 media size: 31mm x 44mm (1.22" x 1.73") */
554773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_B10 =
555d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_B10", "android", R.string.mediasize_iso_b10, 1220, 1730);
556773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav
557773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO C0 media size: 917mm x 1297mm (36.10" x 51.06") */
558773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_C0 =
559d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_C0", "android", R.string.mediasize_iso_c0, 36100, 51060);
560773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO C1 media size: 648mm x 917mm (25.51" x 36.10") */
561773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_C1 =
562d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_C1", "android", R.string.mediasize_iso_c1, 25510, 36100);
563773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO C2 media size: 458mm x 648mm (18.03" x 25.51") */
564773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_C2 =
565d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_C2", "android", R.string.mediasize_iso_c2, 18030, 25510);
566773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO C3 media size: 324mm x 458mm (12.76" x 18.03") */
567773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_C3 =
568d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_C3", "android", R.string.mediasize_iso_c3, 12760, 18030);
569773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO C4 media size: 229mm x 324mm (9.02" x 12.76") */
570773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_C4 =
571d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_C4", "android", R.string.mediasize_iso_c4, 9020, 12760);
572773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO C5 media size: 162mm x 229mm (6.38" x 9.02") */
573773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_C5 =
574d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_C5", "android", R.string.mediasize_iso_c5, 6380, 9020);
575773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO C6 media size: 114mm x 162mm (4.49" x 6.38") */
576773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_C6 =
577d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_C6", "android", R.string.mediasize_iso_c6, 4490, 6380);
578773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO C7 media size: 81mm x 114mm (3.19" x 4.49") */
579773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_C7 =
580d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_C7", "android", R.string.mediasize_iso_c7, 3190, 4490);
581773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO C8 media size: 57mm x 81mm (2.24" x 3.19") */
582773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_C8 =
583d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_C8", "android", R.string.mediasize_iso_c8, 2240, 3190);
584773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO C9 media size: 40mm x 57mm (1.57" x 2.24") */
585773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_C9 =
586d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_C9", "android", R.string.mediasize_iso_c9, 1570, 2240);
587773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /** ISO C10 media size: 28mm x 40mm (1.10" x 1.57") */
588773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize ISO_C10 =
589d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("ISO_C10", "android", R.string.mediasize_iso_c10, 1100, 1570);
5904b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
591773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        // North America
592773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav
593fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** North America Letter media size: 8.5" x 11" (279mm x 216mm) */
594773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize NA_LETTER =
595d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("NA_LETTER", "android", R.string.mediasize_na_letter, 8500, 11000);
596fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** North America Government-Letter media size: 8.0" x 10.5" (203mm x 267mm) */
597773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize NA_GOVT_LETTER =
598773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav                new MediaSize("NA_GOVT_LETTER", "android",
599d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_na_gvrnmt_letter, 8000, 10500);
600fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** North America Legal media size: 8.5" x 14" (216mm x 356mm) */
601773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize NA_LEGAL =
602d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("NA_LEGAL", "android", R.string.mediasize_na_legal, 8500, 14000);
603fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** North America Junior Legal media size: 8.0" x 5.0" (203mm × 127mm) */
604773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize NA_JUNIOR_LEGAL =
605773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav                new MediaSize("NA_JUNIOR_LEGAL", "android",
606d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_na_junior_legal, 8000, 5000);
607fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** North America Ledger media size: 17" x 11" (432mm × 279mm) */
608773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public static final MediaSize NA_LEDGER =
609d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                new MediaSize("NA_LEDGER", "android", R.string.mediasize_na_ledger, 17000, 11000);
610fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** North America Tabloid media size: 11" x 17" (279mm × 432mm) */
611013b816ac7d723a0116c039e6266d93d13851fe1Svetoslav        public static final MediaSize NA_TABLOID =
612773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav                new MediaSize("NA_TABLOID", "android",
613d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_na_tabloid, 11000, 17000);
614fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** North America Index Card 3x5 media size: 3" x 5" (76mm x 127mm) */
615fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize NA_INDEX_3X5 =
616fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("NA_INDEX_3X5", "android",
617d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_na_index_3x5, 3000, 5000);
618fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** North America Index Card 4x6 media size: 4" x 6" (102mm x 152mm) */
619fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize NA_INDEX_4X6 =
620fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("NA_INDEX_4X6", "android",
621d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_na_index_4x6, 4000, 6000);
622fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** North America Index Card 5x8 media size: 5" x 8" (127mm x 203mm) */
623fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize NA_INDEX_5X8 =
624fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("NA_INDEX_5X8", "android",
625d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_na_index_5x8, 5000, 8000);
626fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** North America Monarch media size: 7.25" x 10.5" (184mm x 267mm) */
627fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize NA_MONARCH =
628fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("NA_MONARCH", "android",
629d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_na_monarch, 7250, 10500);
630fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** North America Quarto media size: 8" x 10" (203mm x 254mm) */
631fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize NA_QUARTO =
632fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("NA_QUARTO", "android",
633d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_na_quarto, 8000, 10000);
634fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** North America Foolscap media size: 8" x 13" (203mm x 330mm) */
635fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize NA_FOOLSCAP =
636fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("NA_FOOLSCAP", "android",
637d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_na_foolscap, 8000, 13000);
638fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov
639fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        // Chinese
640fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov
641fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Chinese ROC 8K media size: 270mm x 390mm (10.629" x 15.3543") */
642fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize ROC_8K =
643fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("ROC_8K", "android",
644d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_chinese_roc_8k, 10629, 15354);
645fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Chinese ROC 16K media size: 195mm x 270mm (7.677" x 10.629") */
646fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize ROC_16K =
647fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("ROC_16K", "android",
648d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_chinese_roc_16k, 7677, 10629);
649fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov
650fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Chinese PRC 1 media size: 102mm x 165mm (4.015" x 6.496") */
651fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize PRC_1 =
652fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("PRC_1", "android",
653d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_chinese_prc_1, 4015, 6496);
654fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Chinese PRC 2 media size: 102mm x 176mm (4.015" x 6.929") */
655fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize PRC_2 =
656fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("PRC_2", "android",
657d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_chinese_prc_2, 4015, 6929);
658fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Chinese PRC 3 media size: 125mm x 176mm (4.921" x 6.929") */
659fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize PRC_3 =
660fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("PRC_3", "android",
661d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_chinese_prc_3, 4921, 6929);
662fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Chinese PRC 4 media size: 110mm x 208mm (4.330" x 8.189") */
663fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize PRC_4 =
664fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("PRC_4", "android",
665d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_chinese_prc_4, 4330, 8189);
666fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Chinese PRC 5 media size: 110mm x 220mm (4.330" x 8.661") */
667fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize PRC_5 =
668fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("PRC_5", "android",
669d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_chinese_prc_5, 4330, 8661);
670fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Chinese PRC 6 media size: 120mm x 320mm (4.724" x 12.599") */
671fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize PRC_6 =
672fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("PRC_6", "android",
673d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_chinese_prc_6, 4724, 12599);
674fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Chinese PRC 7 media size: 160mm x 230mm (6.299" x 9.055") */
675fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize PRC_7 =
676fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("PRC_7", "android",
677d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_chinese_prc_7, 6299, 9055);
678fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Chinese PRC 8 media size: 120mm x 309mm (4.724" x 12.165") */
679fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize PRC_8 =
680fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("PRC_8", "android",
681d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_chinese_prc_8, 4724, 12165);
682fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Chinese PRC 9 media size: 229mm x 324mm (9.016" x 12.756") */
683fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize PRC_9 =
684fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("PRC_9", "android",
685d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_chinese_prc_9, 9016, 12756);
686fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Chinese PRC 10 media size: 324mm x 458mm (12.756" x 18.032") */
687fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize PRC_10 =
688fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("PRC_10", "android",
689d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_chinese_prc_10, 12756, 18032);
690fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov
691fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Chinese PRC 16k media size: 146mm x 215mm (5.749" x 8.465") */
6927be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov        public static final MediaSize PRC_16K =
6937be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov                new MediaSize("PRC_16K", "android",
694d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_chinese_prc_16k, 5749, 8465);
695fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Chinese Pa Kai media size: 267mm x 389mm (10.512" x 15.315") */
696fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize OM_PA_KAI =
697fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("OM_PA_KAI", "android",
698d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_chinese_om_pa_kai, 10512, 15315);
699fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Chinese Dai Pa Kai media size: 275mm x 395mm (10.827" x 15.551") */
700fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize OM_DAI_PA_KAI =
701fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("OM_DAI_PA_KAI", "android",
702d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_chinese_om_dai_pa_kai, 10827, 15551);
703fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Chinese Jurro Ku Kai media size: 198mm x 275mm (7.796" x 10.827") */
704fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize OM_JUURO_KU_KAI =
705fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("OM_JUURO_KU_KAI", "android",
706d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_chinese_om_jurro_ku_kai, 7796, 10827);
707fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov
708fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        // Japanese
709fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov
710fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese JIS B10 media size: 32mm x 45mm (1.259" x 1.772") */
711fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JIS_B10 =
712fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JIS_B10", "android",
713d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_jis_b10, 1259, 1772);
714fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese JIS B9 media size: 45mm x 64mm (1.772" x 2.52") */
715fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JIS_B9 =
716fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JIS_B9", "android",
717d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_jis_b9, 1772, 2520);
718fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese JIS B8 media size: 64mm x 91mm (2.52" x 3.583") */
719fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JIS_B8 =
720fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JIS_B8", "android",
721d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_jis_b8, 2520, 3583);
722fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese JIS B7 media size: 91mm x 128mm (3.583" x 5.049") */
723fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JIS_B7 =
724fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JIS_B7", "android",
725d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_jis_b7, 3583, 5049);
726fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese JIS B6 media size: 128mm x 182mm (5.049" x 7.165") */
727fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JIS_B6 =
728fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JIS_B6", "android",
729d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_jis_b6, 5049, 7165);
730fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese JIS B5 media size: 182mm x 257mm (7.165" x 10.118") */
731fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JIS_B5 =
732fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JIS_B5", "android",
733d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_jis_b5, 7165, 10118);
734fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese JIS B4 media size: 257mm x 364mm (10.118" x 14.331") */
735fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JIS_B4 =
736fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JIS_B4", "android",
737d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_jis_b4, 10118, 14331);
738fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese JIS B3 media size: 364mm x 515mm (14.331" x 20.276") */
739fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JIS_B3 =
740fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JIS_B3", "android",
741d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_jis_b3, 14331, 20276);
742fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese JIS B2 media size: 515mm x 728mm (20.276" x 28.661") */
743fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JIS_B2 =
744fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JIS_B2", "android",
745d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_jis_b2, 20276, 28661);
746fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese JIS B1 media size: 728mm x 1030mm (28.661" x 40.551") */
747fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JIS_B1 =
748fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JIS_B1", "android",
749d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_jis_b1, 28661, 40551);
750fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese JIS B0 media size: 1030mm x 1456mm (40.551" x 57.323") */
751fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JIS_B0 =
752fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JIS_B0", "android",
753d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_jis_b0, 40551, 57323);
754fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov
755fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese JIS Exec media size: 216mm x 330mm (8.504" x 12.992") */
756fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JIS_EXEC =
757fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JIS_EXEC", "android",
758d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_jis_exec, 8504, 12992);
759fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov
760fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese Chou4 media size: 90mm x 205mm (3.543" x 8.071") */
761fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JPN_CHOU4 =
762fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JPN_CHOU4", "android",
763d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_chou4, 3543, 8071);
764fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese Chou3 media size: 120mm x 235mm (4.724" x 9.252") */
765fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JPN_CHOU3 =
766fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JPN_CHOU3", "android",
767d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_chou3, 4724, 9252);
768fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese Chou2 media size: 111.1mm x 146mm (4.374" x 5.748") */
769fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JPN_CHOU2 =
770fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JPN_CHOU2", "android",
771d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_chou2, 4374, 5748);
772fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov
773fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese Hagaki media size: 100mm x 148mm (3.937" x 5.827") */
774fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JPN_HAGAKI =
775fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JPN_HAGAKI", "android",
776d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_hagaki, 3937, 5827);
777fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese Oufuku media size: 148mm x 200mm (5.827" x 7.874") */
778fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JPN_OUFUKU =
779fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JPN_OUFUKU", "android",
780d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_oufuku, 5827, 7874);
781fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov
782fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese Kahu media size: 240mm x 322.1mm (9.449" x 12.681") */
783fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JPN_KAHU =
784fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JPN_KAHU", "android",
785d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_kahu, 9449, 12681);
786fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese Kaku2 media size: 240mm x 332mm (9.449" x 13.071") */
787fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JPN_KAKU2 =
788fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JPN_KAKU2", "android",
789d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_kaku2, 9449, 13071);
790fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov
791fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        /** Japanese You4 media size: 105mm x 235mm (4.134" x 9.252") */
792fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov        public static final MediaSize JPN_YOU4 =
793fa77ece25a98810b6f56130d4a83c62b2e34c4f5Svetoslav Ganov                new MediaSize("JPN_YOU4", "android",
794d8f391b4e0e8d876ec7216d34f86a9b3e8bab7e5Svetoslav                        R.string.mediasize_japanese_you4, 4134, 9252);
7954b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
796aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        private final @NonNull String mId;
797773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /**@hide */
798aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        public final @NonNull String mLabel;
799773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /**@hide */
800aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        public final @Nullable String mPackageName;
801773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /**@hide */
802aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        public final @StringRes int mLabelResId;
803aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        private final @IntRange(from = 1) int mWidthMils;
804aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        private final @IntRange(from = 1) int mHeightMils;
80517b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav
8064b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
8074d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * Creates a new instance.
808773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav         *
809773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav         * @param id The unique media size id.
810773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav         * @param packageName The name of the creating package.
811773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav         * @param labelResId The resource if of a human readable label.
812823715d656381a84b8c6c6d63769c663b417274dPhilip P. Moltmann         * @param widthMils The width in mils (thousandths of an inch).
813823715d656381a84b8c6c6d63769c663b417274dPhilip P. Moltmann         * @param heightMils The height in mils (thousandths of an inch).
814773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav         *
8154d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * @throws IllegalArgumentException If the id is empty or the label
8164d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * is empty or the widthMils is less than or equal to zero or the
8174d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * heightMils is less than or equal to zero.
818a76233ae845da4bc9e3bcd89821701a747215e7bSvetoslav         *
819a76233ae845da4bc9e3bcd89821701a747215e7bSvetoslav         * @hide
820773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav         */
821773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public MediaSize(String id, String packageName, int labelResId,
822773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav                int widthMils, int heightMils) {
823aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann            this(id, null, packageName, widthMils, heightMils, labelResId);
8247be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov
8257be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov            // Build this mapping only for predefined media sizes.
8267be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov            sIdToMediaSizeMap.put(mId, this);
827773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        }
828773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav
829773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /**
830a76233ae845da4bc9e3bcd89821701a747215e7bSvetoslav         * Creates a new instance.
8314b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
83222cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * @param id The unique media size id. It is unique amongst other media sizes
83322cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         *        supported by the printer.
8344d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * @param label The <strong>localized</strong> human readable label.
835823715d656381a84b8c6c6d63769c663b417274dPhilip P. Moltmann         * @param widthMils The width in mils (thousandths of an inch).
836823715d656381a84b8c6c6d63769c663b417274dPhilip P. Moltmann         * @param heightMils The height in mils (thousandths of an inch).
8374b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
8384d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * @throws IllegalArgumentException If the id is empty or the label is empty
8394d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * or the widthMils is less than or equal to zero or the heightMils is less
8404d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * than or equal to zero.
8414b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
842c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public MediaSize(@NonNull String id, @NonNull String label,
843c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann                @IntRange(from = 1) int widthMils, @IntRange(from = 1) int heightMils) {
844aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann            this(id, label, null, widthMils, heightMils, 0);
845773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        }
846773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav
8474959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmann        /**
8484959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmann         * Get the Id of all predefined media sizes beside the {@link #UNKNOWN_PORTRAIT} and
8494959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmann         * {@link #UNKNOWN_LANDSCAPE}.
8504959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmann         *
8514959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmann         * @return List of all predefined media sizes
8524959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmann         *
8534959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmann         * @hide
8544959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmann         */
8554959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmann        public static @NonNull ArraySet<MediaSize> getAllPredefinedSizes() {
8564959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmann            ArraySet<MediaSize> definedMediaSizes = new ArraySet<>(sIdToMediaSizeMap.values());
8574959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmann
8584959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmann            definedMediaSizes.remove(UNKNOWN_PORTRAIT);
8594959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmann            definedMediaSizes.remove(UNKNOWN_LANDSCAPE);
8604959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmann
8614959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmann            return definedMediaSizes;
8624959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmann        }
8634959caf149c49f0a58c6a89ec01b909baf3fa579Philip P. Moltmann
864aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        /**
865aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann         * Creates a new instance.
866aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann         *
867aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann         * @param id The unique media size id. It is unique amongst other media sizes
868aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann         *        supported by the printer.
869aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann         * @param label The <strong>localized</strong> human readable label.
870aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann         * @param packageName The name of the creating package.
871823715d656381a84b8c6c6d63769c663b417274dPhilip P. Moltmann         * @param widthMils The width in mils (thousandths of an inch).
872823715d656381a84b8c6c6d63769c663b417274dPhilip P. Moltmann         * @param heightMils The height in mils (thousandths of an inch).
873aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann         * @param labelResId The resource if of a human readable label.
874aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann         *
875aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann         * @throws IllegalArgumentException If the id is empty or the label is unset
876aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann         * or the widthMils is less than or equal to zero or the heightMils is less
877aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann         * than or equal to zero.
878aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann         *
879aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann         * @hide
880aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann         */
881aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        public MediaSize(String id, String label, String packageName, int widthMils, int heightMils,
882aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann                int labelResId) {
883773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav            mPackageName = packageName;
884aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann            mId = Preconditions.checkStringNotEmpty(id, "id cannot be empty.");
885773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav            mLabelResId = labelResId;
886aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann            mWidthMils = Preconditions.checkArgumentPositive(widthMils, "widthMils cannot be " +
887aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann                    "less than or equal to zero.");
888aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann            mHeightMils = Preconditions.checkArgumentPositive(heightMils, "heightMils cannot be " +
889aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann                    "less than or equal to zero.");
890773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav            mLabel = label;
891aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann
892aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann            // The label has to be either a string ot a StringRes
893aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann            Preconditions.checkArgument(!TextUtils.isEmpty(label) !=
894aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann                    (!TextUtils.isEmpty(packageName) && labelResId != 0), "label cannot be empty.");
8954b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
8964b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
89717b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav        /**
89822cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * Gets the unique media size id. It is unique amongst other media sizes
89922cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * supported by the printer.
90022cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * <p>
90122cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * This id is defined by the client that generated the media size
90222cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * instance and should not be interpreted by other parties.
90322cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * </p>
90417b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         *
90517b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         * @return The unique media size id.
90617b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         */
907c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull String getId() {
90817b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            return mId;
90917b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav        }
91017b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav
91117b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav        /**
91217b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         * Gets the human readable media size label.
91317b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         *
914773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav         * @param packageManager The package manager for loading the label.
91517b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         * @return The human readable label.
91617b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         */
917c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull String getLabel(@NonNull PackageManager packageManager) {
918773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav            if (!TextUtils.isEmpty(mPackageName) && mLabelResId > 0) {
919773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav                try {
920773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav                    return packageManager.getResourcesForApplication(
921773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav                            mPackageName).getString(mLabelResId);
922aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann                } catch (NotFoundException | NameNotFoundException e) {
923773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav                    Log.w(LOG_TAG, "Could not load resouce" + mLabelResId
924773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav                            + " from package " + mPackageName);
925773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav                }
926773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav            }
92717b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            return mLabel;
92817b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav        }
92917b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav
93017b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav        /**
931823715d656381a84b8c6c6d63769c663b417274dPhilip P. Moltmann         * Gets the media width in mils (thousandths of an inch).
93217b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         *
93317b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         * @return The media width.
93417b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         */
935c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @IntRange(from = 1) int getWidthMils() {
93617b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            return mWidthMils;
93717b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav        }
93817b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav
93917b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav        /**
940823715d656381a84b8c6c6d63769c663b417274dPhilip P. Moltmann         * Gets the media height in mils (thousandths of an inch).
94117b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         *
94217b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         * @return The media height.
94317b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         */
944c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @IntRange(from = 1) int getHeightMils() {
94517b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            return mHeightMils;
94617b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav        }
94717b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav
948773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /**
949773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav         * Gets whether this media size is in portrait which is the
950773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav         * height is greater or equal to the width.
951773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav         *
952773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav         * @return True if the media size is in portrait, false if
953773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav         * it is in landscape.
954773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav         */
955773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        public boolean isPortrait() {
956773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav            return mHeightMils >= mWidthMils;
957773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        }
958773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav
959773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /**
9604d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * Returns a new media size instance in a portrait orientation,
961a76233ae845da4bc9e3bcd89821701a747215e7bSvetoslav         * which is the height is the greater dimension.
962773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav         *
9634d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * @return New instance in landscape orientation if this one
9644d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * is in landscape, otherwise this instance.
965773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav         */
966c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull MediaSize asPortrait() {
9674d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov            if (isPortrait()) {
9684d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov                return this;
9694d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov            }
970a36285f3f2f74b1d2d5d0336ffe519ab9f6e062aSvetoslav            return new MediaSize(mId, mLabel, mPackageName,
971a76233ae845da4bc9e3bcd89821701a747215e7bSvetoslav                    Math.min(mWidthMils, mHeightMils),
972a76233ae845da4bc9e3bcd89821701a747215e7bSvetoslav                    Math.max(mWidthMils, mHeightMils),
973a76233ae845da4bc9e3bcd89821701a747215e7bSvetoslav                    mLabelResId);
974773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        }
975773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav
976773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        /**
9774d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * Returns a new media size instance in a landscape orientation,
978a76233ae845da4bc9e3bcd89821701a747215e7bSvetoslav         * which is the height is the lesser dimension.
979773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav         *
9804d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * @return New instance in landscape orientation if this one
9814d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * is in portrait, otherwise this instance.
982773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav         */
983c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull MediaSize asLandscape() {
9844d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov            if (!isPortrait()) {
9854d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov                return this;
9864d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov            }
987a36285f3f2f74b1d2d5d0336ffe519ab9f6e062aSvetoslav            return new MediaSize(mId, mLabel, mPackageName,
988773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav                    Math.max(mWidthMils, mHeightMils),
989a76233ae845da4bc9e3bcd89821701a747215e7bSvetoslav                    Math.min(mWidthMils, mHeightMils),
990a76233ae845da4bc9e3bcd89821701a747215e7bSvetoslav                    mLabelResId);
991773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav        }
992773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav
9934b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        void writeToParcel(Parcel parcel) {
9944b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            parcel.writeString(mId);
995798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov            parcel.writeString(mLabel);
996773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav            parcel.writeString(mPackageName);
9974b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            parcel.writeInt(mWidthMils);
9984b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            parcel.writeInt(mHeightMils);
999773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav            parcel.writeInt(mLabelResId);
10004b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
10014b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
10024b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        static MediaSize createFromParcel(Parcel parcel) {
10034b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return new MediaSize(
10044b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov                    parcel.readString(),
1005798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov                    parcel.readString(),
1006773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav                    parcel.readString(),
1007773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav                    parcel.readInt(),
10084b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov                    parcel.readInt(),
10094b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov                    parcel.readInt());
10104b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
10114b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
10124b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        @Override
101385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        public int hashCode() {
101485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            final int prime = 31;
101585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            int result = 1;
101685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            result = prime * result + mWidthMils;
101785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            result = prime * result + mHeightMils;
101885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return result;
101985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
102085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov
102185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        @Override
102285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        public boolean equals(Object obj) {
102385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (this == obj) {
102485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return true;
102585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
102685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (obj == null) {
102785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return false;
102885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
102985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (getClass() != obj.getClass()) {
103085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return false;
103185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
103285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            MediaSize other = (MediaSize) obj;
103385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (mWidthMils != other.mWidthMils) {
103485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return false;
103585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
103685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (mHeightMils != other.mHeightMils) {
103785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return false;
103885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
103985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return true;
104085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
104185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov
104285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        @Override
10434b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        public String toString() {
10444b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            StringBuilder builder = new StringBuilder();
10454b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            builder.append("MediaSize{");
10464b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            builder.append("id: ").append(mId);
104717b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            builder.append(", label: ").append(mLabel);
1048773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav            builder.append(", packageName: ").append(mPackageName);
10494b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            builder.append(", heightMils: ").append(mHeightMils);
10504b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            builder.append(", widthMils: ").append(mWidthMils);
1051773f54de3de9bce7b6f915aa47ed686b161d77aaSvetoslav            builder.append(", labelResId: ").append(mLabelResId);
10524b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            builder.append("}");
10534b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return builder.toString();
10544b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
10557be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov
10567be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov        /**
10577be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov         * Gets a standard media size given its id.
10587be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov         *
10597be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov         * @param id The media size id.
10607be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov         * @return The media size for the given id or null.
10617be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov         *
10627be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov         * @hide
10637be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov         */
10647be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov        public static MediaSize getStandardMediaSizeById(String id) {
10657be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov            return sIdToMediaSizeMap.get(id);
10667be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov        }
10674b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
10684b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
10694b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    /**
107022cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov     * This class specifies a supported resolution in DPI (dots per inch).
107122cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov     * Resolution defines how many points with different color can be placed
107222cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov     * on one inch in horizontal or vertical direction of the target media.
10734d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * For example, a printer with 600 DPI can produce higher quality images
10744d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * the one with 300 DPI resolution.
10754b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     */
10764b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    public static final class Resolution {
1077aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        private final @NonNull String mId;
1078aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        private final @NonNull String mLabel;
1079aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        private final @IntRange(from = 1) int mHorizontalDpi;
1080aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        private final @IntRange(from = 1) int mVerticalDpi;
10814b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
10824b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
1083a76233ae845da4bc9e3bcd89821701a747215e7bSvetoslav         * Creates a new instance.
108417b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         *
108522cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * @param id The unique resolution id. It is unique amongst other resolutions
108622cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         *        supported by the printer.
10874d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * @param label The <strong>localized</strong> human readable label.
108822cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * @param horizontalDpi The horizontal resolution in DPI (dots per inch).
108922cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * @param verticalDpi The vertical resolution in DPI (dots per inch).
109017b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         *
10914d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * @throws IllegalArgumentException If the id is empty or the label is empty
10924d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * or the horizontalDpi is less than or equal to zero or the verticalDpi is
10934d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * less than or equal to zero.
109417b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         */
1095c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public Resolution(@NonNull String id, @NonNull String label,
1096c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann                @IntRange(from = 1) int horizontalDpi, @IntRange(from = 1) int verticalDpi) {
109717b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            if (TextUtils.isEmpty(id)) {
109817b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav                throw new IllegalArgumentException("id cannot be empty.");
109917b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            }
110017b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            if (TextUtils.isEmpty(label)) {
110117b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav                throw new IllegalArgumentException("label cannot be empty.");
110217b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            }
110317b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            if (horizontalDpi <= 0) {
110417b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav                throw new IllegalArgumentException("horizontalDpi "
110517b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav                        + "cannot be less than or equal to zero.");
110617b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            }
110717b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            if (verticalDpi <= 0) {
110817b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav                throw new IllegalArgumentException("verticalDpi"
110917b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav                       + " cannot be less than or equal to zero.");
111017b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            }
111117b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            mId = id;
111217b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            mLabel = label;
111317b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            mHorizontalDpi = horizontalDpi;
111417b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            mVerticalDpi = verticalDpi;
111517b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav        }
111617b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav
111717b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav        /**
111822cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * Gets the unique resolution id. It is unique amongst other resolutions
111922cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * supported by the printer.
112022cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * <p>
112122cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * This id is defined by the client that generated the resolution
112222cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * instance and should not be interpreted by other parties.
112322cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * </p>
11244b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
11254b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @return The unique resolution id.
11264b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
1127c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull String getId() {
11284b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return mId;
11294b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
11304b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
11314b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
11324b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * Gets the resolution human readable label.
11334b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
11344b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @return The human readable label.
11354b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
1136c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull String getLabel() {
113717b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            return mLabel;
11384b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
11394b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
11404b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
114122cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * Gets the horizontal resolution in DPI (dots per inch).
11424b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
11434b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @return The horizontal resolution.
11444b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
1145c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @IntRange(from = 1) int getHorizontalDpi() {
11464b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return mHorizontalDpi;
11474b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
11484b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
11494b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
115022cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov         * Gets the vertical resolution in DPI (dots per inch).
11514b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
11524b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @return The vertical resolution.
11534b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
1154c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @IntRange(from = 1) int getVerticalDpi() {
11554b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return mVerticalDpi;
11564b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
11574b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
11584b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        void writeToParcel(Parcel parcel) {
11594b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            parcel.writeString(mId);
1160798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov            parcel.writeString(mLabel);
11614b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            parcel.writeInt(mHorizontalDpi);
11624b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            parcel.writeInt(mVerticalDpi);
11634b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
11644b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
11654b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        static Resolution createFromParcel(Parcel parcel) {
11664b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return new Resolution(
11674b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov                    parcel.readString(),
1168798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov                    parcel.readString(),
11694b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov                    parcel.readInt(),
11704b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov                    parcel.readInt());
11714b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
11724b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
11734b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        @Override
117485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        public int hashCode() {
117585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            final int prime = 31;
117685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            int result = 1;
117785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            result = prime * result + mHorizontalDpi;
117885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            result = prime * result + mVerticalDpi;
117985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return result;
118085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
118185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov
118285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        @Override
118385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        public boolean equals(Object obj) {
118485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (this == obj) {
118585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return true;
118685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
118785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (obj == null) {
118885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return false;
118985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
119085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (getClass() != obj.getClass()) {
119185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return false;
119285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
119385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            Resolution other = (Resolution) obj;
119485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (mHorizontalDpi != other.mHorizontalDpi) {
119585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return false;
119685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
119785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (mVerticalDpi != other.mVerticalDpi) {
119885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return false;
119985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
120085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return true;
120185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
120285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov
120385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        @Override
12044b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        public String toString() {
12054b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            StringBuilder builder = new StringBuilder();
12064b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            builder.append("Resolution{");
12074b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            builder.append("id: ").append(mId);
120817b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            builder.append(", label: ").append(mLabel);
12094b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            builder.append(", horizontalDpi: ").append(mHorizontalDpi);
12104b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            builder.append(", verticalDpi: ").append(mVerticalDpi);
12114b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            builder.append("}");
12124b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return builder.toString();
12134b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
12144b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
12154b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
12164b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    /**
121722cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov     * This class specifies content margins. Margins define the white space
121822cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov     * around the content where the left margin defines the amount of white
121922cb9170d33eb6da54fc36b783fcb93fd6057749Svetoslav Ganov     * space on the left of the content and so on.
12204b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     */
12214b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    public static final class Margins {
1222aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov        public static final Margins NO_MARGINS = new Margins(0,  0,  0,  0);
1223aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov
12244b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        private final int mLeftMils;
12254b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        private final int mTopMils;
12264b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        private final int mRightMils;
12274b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        private final int mBottomMils;
12284b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
12294b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
123017b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         * Creates a new instance.
123117b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         *
1232823715d656381a84b8c6c6d63769c663b417274dPhilip P. Moltmann         * @param leftMils The left margin in mils (thousandths of an inch).
1233823715d656381a84b8c6c6d63769c663b417274dPhilip P. Moltmann         * @param topMils The top margin in mils (thousandths of an inch).
1234823715d656381a84b8c6c6d63769c663b417274dPhilip P. Moltmann         * @param rightMils The right margin in mils (thousandths of an inch).
1235823715d656381a84b8c6c6d63769c663b417274dPhilip P. Moltmann         * @param bottomMils The bottom margin in mils (thousandths of an inch).
123617b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav         */
1237aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        public Margins(int leftMils, int topMils, int rightMils, int bottomMils) {
123817b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            mTopMils = topMils;
123917b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            mLeftMils = leftMils;
124017b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            mRightMils = rightMils;
124117b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav            mBottomMils = bottomMils;
124217b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav        }
124317b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav
124417b7f6e6d4ec9f5e9597bfd283f1c017b6c66275Svetoslav        /**
1245823715d656381a84b8c6c6d63769c663b417274dPhilip P. Moltmann         * Gets the left margin in mils (thousandths of an inch).
12464b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
12474b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @return The left margin.
12484b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
1249aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        public int getLeftMils() {
12504b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return mLeftMils;
12514b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
12524b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
12534b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
1254823715d656381a84b8c6c6d63769c663b417274dPhilip P. Moltmann         * Gets the top margin in mils (thousandths of an inch).
12554b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
12564b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @return The top margin.
12574b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
1258aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        public int getTopMils() {
12594b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return mTopMils;
12604b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
12614b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
12624b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
1263823715d656381a84b8c6c6d63769c663b417274dPhilip P. Moltmann         * Gets the right margin in mils (thousandths of an inch).
12644b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
12654b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @return The right margin.
12664b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
1267aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        public int getRightMils() {
12684b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return mRightMils;
12694b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
12704b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
12714b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
1272823715d656381a84b8c6c6d63769c663b417274dPhilip P. Moltmann         * Gets the bottom margin in mils (thousandths of an inch).
12734b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
12744b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @return The bottom margin.
12754b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
1276aa8a4fed075fdd9faa6c9d5b150fc28e1a834122Philip P. Moltmann        public int getBottomMils() {
12774b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return mBottomMils;
12784b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
12794b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
12804b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        void writeToParcel(Parcel parcel) {
12814b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            parcel.writeInt(mLeftMils);
12824b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            parcel.writeInt(mTopMils);
12834b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            parcel.writeInt(mRightMils);
12844b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            parcel.writeInt(mBottomMils);
12854b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
12864b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
12874b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        static Margins createFromParcel(Parcel parcel) {
12884b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return new Margins(
12894b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov                    parcel.readInt(),
12904b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov                    parcel.readInt(),
12914b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov                    parcel.readInt(),
12924b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov                    parcel.readInt());
12934b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
12944b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
12954b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        @Override
129685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        public int hashCode() {
129785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            final int prime = 31;
129885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            int result = 1;
129985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            result = prime * result + mBottomMils;
130085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            result = prime * result + mLeftMils;
130185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            result = prime * result + mRightMils;
130285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            result = prime * result + mTopMils;
130385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return result;
130485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
130585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov
130685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        @Override
130785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        public boolean equals(Object obj) {
130885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (this == obj) {
130985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return true;
131085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
131185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (obj == null) {
131285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return false;
131385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
131485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (getClass() != obj.getClass()) {
131585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return false;
131685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
131785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            Margins other = (Margins) obj;
131885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (mBottomMils != other.mBottomMils) {
131985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return false;
132085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
132185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (mLeftMils != other.mLeftMils) {
132285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return false;
132385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
132485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (mRightMils != other.mRightMils) {
132585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return false;
132685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
132785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            if (mTopMils != other.mTopMils) {
132885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov                return false;
132985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            }
133085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov            return true;
133185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        }
133285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov
133385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov        @Override
13344b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        public String toString() {
13354b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            StringBuilder builder = new StringBuilder();
13364b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            builder.append("Margins{");
13374b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            builder.append("leftMils: ").append(mLeftMils);
13384b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            builder.append(", topMils: ").append(mTopMils);
13394b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            builder.append(", rightMils: ").append(mRightMils);
13404b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            builder.append(", bottomMils: ").append(mBottomMils);
13414b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            builder.append("}");
13424b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return builder.toString();
13434b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
13444b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
13454b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
1346798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov    static String colorModeToString(int colorMode) {
13474b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        switch (colorMode) {
13484b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            case COLOR_MODE_MONOCHROME: {
13494b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov                return "COLOR_MODE_MONOCHROME";
13504b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            }
13514b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            case COLOR_MODE_COLOR: {
13524b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov                return "COLOR_MODE_COLOR";
13534b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            }
1354948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav            default: {
13554b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov                return "COLOR_MODE_UNKNOWN";
1356948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav            }
1357948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        }
1358948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav    }
1359948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav
1360948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav    static String duplexModeToString(int duplexMode) {
1361948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        switch (duplexMode) {
1362948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav            case DUPLEX_MODE_NONE: {
1363948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav                return "DUPLEX_MODE_NONE";
1364948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav            }
1365948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav            case DUPLEX_MODE_LONG_EDGE: {
1366948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav                return "DUPLEX_MODE_LONG_EDGE";
1367948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav            }
1368948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav            case DUPLEX_MODE_SHORT_EDGE: {
1369948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav                return "DUPLEX_MODE_SHORT_EDGE";
1370948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav            }
1371948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav            default: {
1372948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav                return "DUPLEX_MODE_UNKNOWN";
1373948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav            }
13744b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
13754b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
13764b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
13774b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    static void enforceValidColorMode(int colorMode) {
1378948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        if ((colorMode & VALID_COLOR_MODES) == 0 || Integer.bitCount(colorMode) != 1) {
13794b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            throw new IllegalArgumentException("invalid color mode: " + colorMode);
13804b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
13814b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
13824b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
1383948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav    static void enforceValidDuplexMode(int duplexMode) {
1384948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        if ((duplexMode & VALID_DUPLEX_MODES) == 0 || Integer.bitCount(duplexMode) != 1) {
1385948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav            throw new IllegalArgumentException("invalid duplex mode: " + duplexMode);
1386948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        }
1387948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav    }
1388948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav
13894b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    /**
13904b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * Builder for creating {@link PrintAttributes}.
13914b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     */
13924b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    public static final class Builder {
13934b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        private final PrintAttributes mAttributes = new PrintAttributes();
13944b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
13954b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
13964b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * Sets the media size.
13974b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
13984b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @param mediaSize The media size.
13994b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @return This builder.
14004b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
1401c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull Builder setMediaSize(@NonNull MediaSize mediaSize) {
14024b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            mAttributes.setMediaSize(mediaSize);
14034b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return this;
14044b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
14054b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
14064b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
14074b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * Sets the resolution.
14084b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
14094b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @param resolution The resolution.
14104b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @return This builder.
14114b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
1412c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull Builder setResolution(@NonNull Resolution resolution) {
14134b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            mAttributes.setResolution(resolution);
14144b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return this;
14154b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
14164b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
14174b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
1418651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav         * Sets the minimal margins. If the content does not fit
1419651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav         * these margins it will be clipped.
14204b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
14214b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @param margins The margins.
14224b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @return This builder.
14234b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
1424c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull Builder setMinMargins(@NonNull Margins margins) {
1425651dd4e6ee6510caf9f15c51094a11121af17ec2Svetoslav            mAttributes.setMinMargins(margins);
14264b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return this;
14274b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
14284b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
14294b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
14304b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * Sets the color mode.
14314b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
14324b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @param colorMode A valid color mode or zero.
14334b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @return This builder.
14344b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
14354b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @see PrintAttributes#COLOR_MODE_MONOCHROME
14364b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @see PrintAttributes#COLOR_MODE_COLOR
14374b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
1438c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull Builder setColorMode(@ColorMode int colorMode) {
14394b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            mAttributes.setColorMode(colorMode);
14404b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return this;
14414b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
14424b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
14434b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
1444948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav         * Sets the duplex mode.
1445948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav         *
1446948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav         * @param duplexMode A valid duplex mode or zero.
1447948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav         * @return This builder.
1448948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav         *
1449948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav         * @see PrintAttributes#DUPLEX_MODE_NONE
1450948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav         * @see PrintAttributes#DUPLEX_MODE_LONG_EDGE
1451948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav         * @see PrintAttributes#DUPLEX_MODE_SHORT_EDGE
1452948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav         */
1453c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull Builder setDuplexMode(@DuplexMode int duplexMode) {
1454948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav            mAttributes.setDuplexMode(duplexMode);
1455948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav            return this;
1456948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        }
1457948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav
1458948c9a6393e0995a4d988d5d164998aa0e12b25dSvetoslav        /**
14594b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * Creates a new {@link PrintAttributes} instance.
14604b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
14614b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @return The new instance.
14624b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
1463c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull PrintAttributes build() {
14644b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return mAttributes;
14654b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
14664b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
14674b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
14684b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    public static final Parcelable.Creator<PrintAttributes> CREATOR =
14694b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            new Creator<PrintAttributes>() {
14704b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        @Override
14714b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        public PrintAttributes createFromParcel(Parcel parcel) {
14724b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return new PrintAttributes(parcel);
14734b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
14744b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
14754b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        @Override
14764b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        public PrintAttributes[] newArray(int size) {
14774b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return new PrintAttributes[size];
14784b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
14794b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    };
14804b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov}
1481