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
19bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmannimport android.annotation.DrawableRes;
20bb36206f08797156caed236671d36b5a34682f95Philip P. Moltmannimport android.annotation.IntDef;
21bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmannimport android.annotation.NonNull;
22bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmannimport android.annotation.Nullable;
23bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmannimport android.annotation.TestApi;
24bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmannimport android.app.PendingIntent;
25bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmannimport android.content.Context;
26bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmannimport android.content.pm.ApplicationInfo;
27bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmannimport android.content.pm.PackageInfo;
28bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmannimport android.content.pm.PackageManager;
29bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmannimport android.content.pm.PackageManager.NameNotFoundException;
30bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmannimport android.graphics.drawable.Drawable;
31bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmannimport android.graphics.drawable.Icon;
324b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovimport android.os.Parcel;
334b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovimport android.os.Parcelable;
34798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganovimport android.text.TextUtils;
354b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
36c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmannimport com.android.internal.util.Preconditions;
37c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann
38c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmannimport java.lang.annotation.Retention;
39c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmannimport java.lang.annotation.RetentionPolicy;
40c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann
414b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov/**
424d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * This class represents the description of a printer. Instances of
434d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * this class are created by print services to report to the system
444d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * the printers they manage. The information of this class has two
454d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * major components, printer properties such as name, id, status,
464d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * description and printer capabilities which describe the various
474d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * print modes a printer supports such as media sizes, margins, etc.
48c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann * <p>
49c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann * Once {@link PrinterInfo.Builder#build() built} the objects are immutable.
50c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann * </p>
514b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov */
524b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovpublic final class PrinterInfo implements Parcelable {
534b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
54c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    /** @hide */
55c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    @IntDef({
56c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann            STATUS_IDLE, STATUS_BUSY, STATUS_UNAVAILABLE
57c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    })
58c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    @Retention(RetentionPolicy.SOURCE)
59c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    public @interface Status {
60c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    }
61aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov    /** Printer status: the printer is idle and ready to print. */
62aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov    public static final int STATUS_IDLE = 1;
634b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
64aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov    /** Printer status: the printer is busy printing. */
65aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov    public static final int STATUS_BUSY = 2;
66aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov
67aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov    /** Printer status: the printer is not available. */
68aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov    public static final int STATUS_UNAVAILABLE = 3;
694b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
70c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    private final @NonNull PrinterId mId;
714b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
72bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann    /** Resource inside the printer's services's package to be used as an icon */
73c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    private final int mIconResourceId;
74bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann
75bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann    /** If a custom icon can be loaded for the printer */
76c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    private final boolean mHasCustomPrinterIcon;
77bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann
78bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann    /** The generation of the icon in the cache. */
79c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    private final int mCustomPrinterIconGen;
80bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann
81bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann    /** Intent that launches the activity showing more information about the printer. */
82c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    private final @Nullable PendingIntent mInfoIntent;
834b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
84c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    private final @NonNull String mName;
854b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
86c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    private final @Status int mStatus;
874b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
88c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    private final @Nullable String mDescription;
89798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov
90c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    private final @Nullable PrinterCapabilitiesInfo mCapabilities;
914b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
92c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    private PrinterInfo(@NonNull PrinterId printerId, @NonNull String name, @Status int status,
93c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            int iconResourceId, boolean hasCustomPrinterIcon, String description,
94c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            PendingIntent infoIntent, PrinterCapabilitiesInfo capabilities,
95c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            int customPrinterIconGen) {
96c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        mId = printerId;
97c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        mName = name;
98c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        mStatus = status;
99c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        mIconResourceId = iconResourceId;
100c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        mHasCustomPrinterIcon = hasCustomPrinterIcon;
101c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        mDescription = description;
102c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        mInfoIntent = infoIntent;
103c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        mCapabilities = capabilities;
104c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        mCustomPrinterIconGen = customPrinterIconGen;
105a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov    }
106a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov
1074b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    /**
1084b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * Get the globally unique printer id.
1094b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
1104b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     * @return The printer id.
1114b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     */
112c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    public @NonNull PrinterId getId() {
1134b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        return mId;
1144b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
1154b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
1164b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    /**
117bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     * Get the icon to be used for this printer. If no per printer icon is available, the printer's
118bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     * service's icon is returned. If the printer has a custom icon this icon might get requested
119bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     * asynchronously. Once the icon is loaded the discovery sessions will be notified that the
120bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     * printer changed.
121bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     *
122bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     * @param context The context that will be using the icons
123bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     * @return The icon to be used for the printer or null if no icon could be found.
124bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     * @hide
125bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     */
126bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann    @TestApi
127bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann    public @Nullable Drawable loadIcon(@NonNull Context context) {
128bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        Drawable drawable = null;
129bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        PackageManager packageManager = context.getPackageManager();
130bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann
131bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        if (mHasCustomPrinterIcon) {
132bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            PrintManager printManager = (PrintManager) context
133bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann                    .getSystemService(Context.PRINT_SERVICE);
134bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann
135bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            Icon icon = printManager.getCustomPrinterIcon(mId);
136bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann
137bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            if (icon != null) {
138bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann                drawable = icon.loadDrawable(context);
139bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            }
140bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        }
141bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann
142bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        if (drawable == null) {
143bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            try {
144bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann                String packageName = mId.getServiceName().getPackageName();
145bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann                PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0);
146bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann                ApplicationInfo appInfo = packageInfo.applicationInfo;
147bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann
148bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann                // If no custom icon is available, try the icon from the resources
149bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann                if (mIconResourceId != 0) {
150bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann                    drawable = packageManager.getDrawable(packageName, mIconResourceId, appInfo);
151bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann                }
152bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann
153bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann                // Fall back to the printer's service's icon if no per printer icon could be found
154bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann                if (drawable == null) {
155bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann                    drawable = appInfo.loadIcon(packageManager);
156bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann                }
157bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            } catch (NameNotFoundException e) {
158bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            }
159bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        }
160bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann
161bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        return drawable;
162bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann    }
163bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann
164bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann    /**
1652e3012624b703a653fed44d4dc1b8904406c0d99Philip P. Moltmann     * Check if the printer has a custom printer icon.
1662e3012624b703a653fed44d4dc1b8904406c0d99Philip P. Moltmann     *
1672e3012624b703a653fed44d4dc1b8904406c0d99Philip P. Moltmann     * @return {@code true} iff the printer has a custom printer icon.
1682e3012624b703a653fed44d4dc1b8904406c0d99Philip P. Moltmann     *
1692e3012624b703a653fed44d4dc1b8904406c0d99Philip P. Moltmann     * @hide
1702e3012624b703a653fed44d4dc1b8904406c0d99Philip P. Moltmann     */
1712e3012624b703a653fed44d4dc1b8904406c0d99Philip P. Moltmann    public boolean getHasCustomPrinterIcon() {
1722e3012624b703a653fed44d4dc1b8904406c0d99Philip P. Moltmann        return mHasCustomPrinterIcon;
1732e3012624b703a653fed44d4dc1b8904406c0d99Philip P. Moltmann    }
1742e3012624b703a653fed44d4dc1b8904406c0d99Philip P. Moltmann
1752e3012624b703a653fed44d4dc1b8904406c0d99Philip P. Moltmann    /**
176798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov     * Get the printer name.
1774b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
178798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov     * @return The printer name.
1794b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     */
180c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    public @NonNull String getName() {
181798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        return mName;
1824b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
1834b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
1844b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    /**
185798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov     * Gets the printer status.
1864b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
187798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov     * @return The status.
1884d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     *
1894d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * @see #STATUS_BUSY
1904d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * @see #STATUS_IDLE
1914d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov     * @see #STATUS_UNAVAILABLE
1924b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     */
193c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    public @Status int getStatus() {
194798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        return mStatus;
1954b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
1964b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
1974b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    /**
198798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov     * Gets the  printer description.
1994b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     *
200798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov     * @return The description.
2014b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     */
202c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    public @Nullable String getDescription() {
203798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        return mDescription;
2044b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
2054b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
20655b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov    /**
207bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     * Get the {@link PendingIntent} that launches the activity showing more information about the
208bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     * printer.
209bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     *
210bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     * @return the {@link PendingIntent} that launches the activity showing more information about
211bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     *         the printer or null if it is not configured
212bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     * @hide
213bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     */
214bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann    public @Nullable PendingIntent getInfoIntent() {
215bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        return mInfoIntent;
216bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann    }
217bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann
218bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann    /**
219798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov     * Gets the printer capabilities.
22055b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov     *
221798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov     * @return The capabilities.
22255b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov     */
223c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann    public @Nullable PrinterCapabilitiesInfo getCapabilities() {
224798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        return mCapabilities;
22555b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov    }
22655b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov
227c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    /**
228c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     * Check if printerId is valid.
229c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     *
230c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     * @param printerId The printerId that might be valid
231c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     * @return The valid printerId
232c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     * @throws IllegalArgumentException if printerId is not valid.
233c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     */
234c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    private static @NonNull PrinterId checkPrinterId(PrinterId printerId) {
235c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        return Preconditions.checkNotNull(printerId, "printerId cannot be null.");
236c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    }
237c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann
238c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    /**
239c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     * Check if status is valid.
240c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     *
241c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     * @param status The status that might be valid
242c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     * @return The valid status
243c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     * @throws IllegalArgumentException if status is not valid.
244c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     */
245c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    private static @Status int checkStatus(int status) {
246c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        if (!(status == STATUS_IDLE
247c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann                || status == STATUS_BUSY
248c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann                || status == STATUS_UNAVAILABLE)) {
249c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            throw new IllegalArgumentException("status is invalid.");
250c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        }
251c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann
252c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        return status;
253c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    }
254c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann
255c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    /**
256c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     * Check if name is valid.
257c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     *
258c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     * @param name The name that might be valid
259c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     * @return The valid name
260c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     * @throws IllegalArgumentException if name is not valid.
261c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     */
262c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    private static @NonNull String checkName(String name) {
263c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        return Preconditions.checkStringNotEmpty(name, "name cannot be empty.");
264c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    }
265c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann
2664b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    private PrinterInfo(Parcel parcel) {
267c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        // mName can be null due to unchecked set in Builder.setName and status can be invalid
268c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        // due to unchecked set in Builder.setStatus, hence we can only check mId for a valid state
269c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        mId = checkPrinterId((PrinterId) parcel.readParcelable(null));
270c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        mName = checkName(parcel.readString());
271c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        mStatus = checkStatus(parcel.readInt());
272798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        mDescription = parcel.readString();
273798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        mCapabilities = parcel.readParcelable(null);
274bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        mIconResourceId = parcel.readInt();
275bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        mHasCustomPrinterIcon = parcel.readByte() != 0;
276bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        mCustomPrinterIconGen = parcel.readInt();
277bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        mInfoIntent = parcel.readParcelable(null);
2784b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
2794b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
2804b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    @Override
2814b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    public int describeContents() {
2824b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        return 0;
2834b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
2844b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
2854b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    @Override
2864b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    public void writeToParcel(Parcel parcel, int flags) {
2874b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        parcel.writeParcelable(mId, flags);
288798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        parcel.writeString(mName);
2894b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        parcel.writeInt(mStatus);
290798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        parcel.writeString(mDescription);
291798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        parcel.writeParcelable(mCapabilities, flags);
292bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        parcel.writeInt(mIconResourceId);
293bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        parcel.writeByte((byte) (mHasCustomPrinterIcon ? 1 : 0));
294bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        parcel.writeInt(mCustomPrinterIconGen);
295bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        parcel.writeParcelable(mInfoIntent, flags);
2964b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
2974b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
2984b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    @Override
29955b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov    public int hashCode() {
30055b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov        final int prime = 31;
30155b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov        int result = 1;
302c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        result = prime * result + mId.hashCode();
303c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        result = prime * result + mName.hashCode();
30455b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov        result = prime * result + mStatus;
305798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        result = prime * result + ((mDescription != null) ? mDescription.hashCode() : 0);
306798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        result = prime * result + ((mCapabilities != null) ? mCapabilities.hashCode() : 0);
307bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        result = prime * result + mIconResourceId;
308bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        result = prime * result + (mHasCustomPrinterIcon ? 1 : 0);
309bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        result = prime * result + mCustomPrinterIconGen;
310bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        result = prime * result + ((mInfoIntent != null) ? mInfoIntent.hashCode() : 0);
31155b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov        return result;
31255b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov    }
31355b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov
314bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann    /**
315bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     * Compare two {@link PrinterInfo printerInfos} in all aspects beside being null and the
316bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     * {@link #mStatus}.
317bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     *
318bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     * @param other the other {@link PrinterInfo}
319bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     * @return true iff the infos are equivalent
320bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     * @hide
321bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann     */
322bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann    public boolean equalsIgnoringStatus(PrinterInfo other) {
323c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        if (!mId.equals(other.mId)) {
32455b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov            return false;
32555b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov        }
326c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        if (!mName.equals(other.mName)) {
327c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann           return false;
32855b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov        }
329798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        if (!TextUtils.equals(mDescription, other.mDescription)) {
33055b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov            return false;
33155b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov        }
332798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        if (mCapabilities == null) {
333798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov            if (other.mCapabilities != null) {
33455b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov                return false;
33555b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov            }
336798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        } else if (!mCapabilities.equals(other.mCapabilities)) {
33755b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov            return false;
33855b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov        }
339bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        if (mIconResourceId != other.mIconResourceId) {
340bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            return false;
341bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        }
342bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        if (mHasCustomPrinterIcon != other.mHasCustomPrinterIcon) {
343bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            return false;
344bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        }
345bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        if (mCustomPrinterIconGen != other.mCustomPrinterIconGen) {
346bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            return false;
347bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        }
348bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        if (mInfoIntent == null) {
349bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            if (other.mInfoIntent != null) {
350bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann                return false;
351bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            }
352bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        } else if (!mInfoIntent.equals(other.mInfoIntent)) {
353bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            return false;
354bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        }
355bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        return true;
356bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann    }
357bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann
358bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann    @Override
359bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann    public boolean equals(Object obj) {
360bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        if (this == obj) {
361bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            return true;
362bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        }
363bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        if (obj == null) {
364bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            return false;
365bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        }
366bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        if (getClass() != obj.getClass()) {
367bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            return false;
368bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        }
369bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        PrinterInfo other = (PrinterInfo) obj;
370bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        if (!equalsIgnoringStatus(other)) {
371bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            return false;
372bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        }
373bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        if (mStatus != other.mStatus) {
374bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            return false;
375bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        }
37655b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov        return true;
37755b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov    }
37855b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov
37955b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov    @Override
3804b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    public String toString() {
3814b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        StringBuilder builder = new StringBuilder();
3824b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        builder.append("PrinterInfo{");
383798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        builder.append("id=").append(mId);
384798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        builder.append(", name=").append(mName);
385798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        builder.append(", status=").append(mStatus);
386798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        builder.append(", description=").append(mDescription);
387798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov        builder.append(", capabilities=").append(mCapabilities);
388bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        builder.append(", iconResId=").append(mIconResourceId);
389bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        builder.append(", hasCustomPrinterIcon=").append(mHasCustomPrinterIcon);
390bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        builder.append(", customPrinterIconGen=").append(mCustomPrinterIconGen);
391bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        builder.append(", infoIntent=").append(mInfoIntent);
3924b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        builder.append("\"}");
3934b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        return builder.toString();
3944b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
3954b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
3964b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    /**
397798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov     * Builder for creating of a {@link PrinterInfo}.
3984b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov     */
3994b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    public static final class Builder {
400c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        private @NonNull PrinterId mPrinterId;
401c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        private @NonNull String mName;
402c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        private @Status int mStatus;
403c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        private int mIconResourceId;
404c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        private boolean mHasCustomPrinterIcon;
405c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        private String mDescription;
406c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        private PendingIntent mInfoIntent;
407c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        private PrinterCapabilitiesInfo mCapabilities;
408c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        private int mCustomPrinterIconGen;
4094b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
4104b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
411798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov         * Constructor.
4124b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
41355b409a97cf6376399a0940313ea852368727d6fSvetoslav Ganov         * @param printerId The printer id. Cannot be null.
414798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov         * @param name The printer name. Cannot be empty.
415798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov         * @param status The printer status. Must be a valid status.
4164d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * @throws IllegalArgumentException If the printer id is null, or the
4174d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * printer name is empty or the status is not a valid one.
4184b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
419c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public Builder(@NonNull PrinterId printerId, @NonNull String name, @Status int status) {
420c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mPrinterId = checkPrinterId(printerId);
421c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mName = checkName(name);
422c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mStatus = checkStatus(status);
4234b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
4244b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
4254b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
426798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov         * Constructor.
4274b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
428269403b032f965ff3847eb982c2f697229dc5a92Svetoslav         * @param other Other info from which to start building.
4294b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
430c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public Builder(@NonNull PrinterInfo other) {
431c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mPrinterId = other.mId;
432c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mName = other.mName;
433c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mStatus = other.mStatus;
434c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mIconResourceId = other.mIconResourceId;
435c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mHasCustomPrinterIcon = other.mHasCustomPrinterIcon;
436c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mDescription = other.mDescription;
437c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mInfoIntent = other.mInfoIntent;
438c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mCapabilities = other.mCapabilities;
439c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mCustomPrinterIconGen = other.mCustomPrinterIconGen;
4404b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
4414b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
4424b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
443aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov         * Sets the printer status.
444aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov         *
445aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov         * @param status The status.
446aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov         * @return This builder.
447aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov         * @see PrinterInfo#STATUS_IDLE
448aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov         * @see PrinterInfo#STATUS_BUSY
449aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov         * @see PrinterInfo#STATUS_UNAVAILABLE
450aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov         */
451b8c1a02adb1e55bae04bde3f5046fe324abed9e9Philip P. Moltmann        public @NonNull Builder setStatus(@Status int status) {
452c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mStatus = checkStatus(status);
453aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov            return this;
454aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov        }
455aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov
456aec1417ca9eb63209668ac17da90cf8a07c6076cSvetoslav Ganov        /**
457bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * Set a drawable resource as icon for this printer. If no icon is set the printer's
458bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * service's icon is used for the printer.
459bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         *
460bb36206f08797156caed236671d36b5a34682f95Philip P. Moltmann         * @param iconResourceId The resource ID of the icon.
461bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * @return This builder.
462bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * @see PrinterInfo.Builder#setHasCustomPrinterIcon
463bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         */
464bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        public @NonNull Builder setIconResourceId(@DrawableRes int iconResourceId) {
465c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mIconResourceId = Preconditions.checkArgumentNonnegative(iconResourceId,
466c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann                    "iconResourceId can't be negative");
467bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            return this;
468bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        }
469bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann
470bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        /**
471bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * Declares that the print service can load a custom per printer's icon. If both
472bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * {@link PrinterInfo.Builder#setIconResourceId} and a custom icon are set the resource icon
473bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * is shown while the custom icon loads but then the custom icon is used. If
474bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * {@link PrinterInfo.Builder#setIconResourceId} is not set the printer's service's icon is
475bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * shown while loading.
476bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * <p>
477bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * The icon is requested asynchronously and only when needed via
478bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * {@link android.printservice.PrinterDiscoverySession#onRequestCustomPrinterIcon}.
479bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * </p>
480bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         *
481d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann         * @param hasCustomPrinterIcon If the printer has a custom icon or not.
482d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann         *
483bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * @return This builder.
484bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         */
485d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann        public @NonNull Builder setHasCustomPrinterIcon(boolean hasCustomPrinterIcon) {
486d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann            mHasCustomPrinterIcon = hasCustomPrinterIcon;
487bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            return this;
488bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        }
489bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann
490bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        /**
4914d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * Sets the <strong>localized</strong> printer name which
4924d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * is shown to the user
4934b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
494798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov         * @param name The name.
4954b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @return This builder.
4964b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
497c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull Builder setName(@NonNull String name) {
498c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mName = checkName(name);
4994b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return this;
5004b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
5014b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
5024b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
5034d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * Sets the <strong>localized</strong> printer description
5044d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * which is shown to the user
5054b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
506798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov         * @param description The description.
5074b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @return This builder.
5084b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
509c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull Builder setDescription(@NonNull String description) {
510c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mDescription = description;
5114b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return this;
5124b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
5134b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
5144b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
515bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * Sets the {@link PendingIntent} that launches an activity showing more information about
516bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * the printer.
517bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         *
518bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * @param infoIntent The {@link PendingIntent intent}.
519bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * @return This builder.
520bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         */
521bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        public @NonNull Builder setInfoIntent(@NonNull PendingIntent infoIntent) {
522c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mInfoIntent = infoIntent;
523bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            return this;
524bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        }
525bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann
526bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        /**
527798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov         * Sets the printer capabilities.
5284b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
529798bed6cc7d273e72b0253288605db9cd2b57740Svetoslav Ganov         * @param capabilities The capabilities.
5304b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @return This builder.
5314b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
532c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull Builder setCapabilities(@NonNull PrinterCapabilitiesInfo capabilities) {
533c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mCapabilities = capabilities;
5344b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return this;
5354b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
5364b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
5374b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        /**
5384d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov         * Creates a new {@link PrinterInfo}.
5394b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         *
5404b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         * @return A new {@link PrinterInfo}.
5414b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov         */
542c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann        public @NonNull PrinterInfo build() {
543c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            return new PrinterInfo(mPrinterId, mName, mStatus, mIconResourceId,
544c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann                    mHasCustomPrinterIcon, mDescription, mInfoIntent, mCapabilities,
545c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann                    mCustomPrinterIconGen);
5464b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
547bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann
548bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        /**
549bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * Increments the generation number of the custom printer icon. As the {@link PrinterInfo}
550bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * does not match the previous one anymore, users of the {@link PrinterInfo} will reload the
551bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * icon if needed.
552bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         *
553bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * @return This builder.
554bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         * @hide
555bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann         */
556bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        public @NonNull Builder incCustomPrinterIconGen() {
557c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            mCustomPrinterIconGen++;
558bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann            return this;
559bb9f686b40743df2642b7d3b7778dbf7284ae665Philip P. Moltmann        }
5604b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    }
5614b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
5624b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    public static final Parcelable.Creator<PrinterInfo> CREATOR =
5634b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            new Parcelable.Creator<PrinterInfo>() {
5644b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        @Override
5654b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        public PrinterInfo createFromParcel(Parcel parcel) {
5664b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return new PrinterInfo(parcel);
5674b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
5684b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov
5694b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        @Override
5704b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        public PrinterInfo[] newArray(int size) {
5714b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov            return new PrinterInfo[size];
5724b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov        }
5734b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov    };
5744b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov}
575