1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.print;
18
19import android.os.Parcel;
20import android.os.Parcelable;
21import android.text.TextUtils;
22
23/**
24 * This class represents the description of a printer. Instances of
25 * this class are created by print services to report to the system
26 * the printers they manage. The information of this class has two
27 * major components, printer properties such as name, id, status,
28 * description and printer capabilities which describe the various
29 * print modes a printer supports such as media sizes, margins, etc.
30 */
31public final class PrinterInfo implements Parcelable {
32
33    /** Printer status: the printer is idle and ready to print. */
34    public static final int STATUS_IDLE = 1;
35
36    /** Printer status: the printer is busy printing. */
37    public static final int STATUS_BUSY = 2;
38
39    /** Printer status: the printer is not available. */
40    public static final int STATUS_UNAVAILABLE = 3;
41
42    private PrinterId mId;
43
44    private String mName;
45
46    private int mStatus;
47
48    private String mDescription;
49
50    private PrinterCapabilitiesInfo mCapabilities;
51
52    private PrinterInfo() {
53        /* do nothing */
54    }
55
56    private PrinterInfo(PrinterInfo prototype) {
57        copyFrom(prototype);
58    }
59
60    /**
61     * @hide
62     */
63    public void copyFrom(PrinterInfo other) {
64        if (this == other) {
65            return;
66        }
67        mId = other.mId;
68        mName = other.mName;
69        mStatus = other.mStatus;
70        mDescription = other.mDescription;
71        if (other.mCapabilities != null) {
72            if (mCapabilities != null) {
73                mCapabilities.copyFrom(other.mCapabilities);
74            } else {
75                mCapabilities = new PrinterCapabilitiesInfo(other.mCapabilities);
76            }
77        } else {
78            mCapabilities = null;
79        }
80    }
81
82    /**
83     * Get the globally unique printer id.
84     *
85     * @return The printer id.
86     */
87    public PrinterId getId() {
88        return mId;
89    }
90
91    /**
92     * Get the printer name.
93     *
94     * @return The printer name.
95     */
96    public String getName() {
97        return mName;
98    }
99
100    /**
101     * Gets the printer status.
102     *
103     * @return The status.
104     *
105     * @see #STATUS_BUSY
106     * @see #STATUS_IDLE
107     * @see #STATUS_UNAVAILABLE
108     */
109    public int getStatus() {
110        return mStatus;
111    }
112
113    /**
114     * Gets the  printer description.
115     *
116     * @return The description.
117     */
118    public String getDescription() {
119        return mDescription;
120    }
121
122    /**
123     * Gets the printer capabilities.
124     *
125     * @return The capabilities.
126     */
127    public PrinterCapabilitiesInfo getCapabilities() {
128        return mCapabilities;
129    }
130
131    private PrinterInfo(Parcel parcel) {
132        mId = parcel.readParcelable(null);
133        mName = parcel.readString();
134        mStatus = parcel.readInt();
135        mDescription = parcel.readString();
136        mCapabilities = parcel.readParcelable(null);
137    }
138
139    @Override
140    public int describeContents() {
141        return 0;
142    }
143
144    @Override
145    public void writeToParcel(Parcel parcel, int flags) {
146        parcel.writeParcelable(mId, flags);
147        parcel.writeString(mName);
148        parcel.writeInt(mStatus);
149        parcel.writeString(mDescription);
150        parcel.writeParcelable(mCapabilities, flags);
151    }
152
153    @Override
154    public int hashCode() {
155        final int prime = 31;
156        int result = 1;
157        result = prime * result + ((mId != null) ? mId.hashCode() : 0);
158        result = prime * result + ((mName != null) ? mName.hashCode() : 0);
159        result = prime * result + mStatus;
160        result = prime * result + ((mDescription != null) ? mDescription.hashCode() : 0);
161        result = prime * result + ((mCapabilities != null) ? mCapabilities.hashCode() : 0);
162        return result;
163    }
164
165    @Override
166    public boolean equals(Object obj) {
167        if (this == obj) {
168            return true;
169        }
170        if (obj == null) {
171            return false;
172        }
173        if (getClass() != obj.getClass()) {
174            return false;
175        }
176        PrinterInfo other = (PrinterInfo) obj;
177        if (mId == null) {
178            if (other.mId != null) {
179                return false;
180            }
181        } else if (!mId.equals(other.mId)) {
182            return false;
183        }
184        if (!TextUtils.equals(mName, other.mName)) {
185            return false;
186        }
187        if (mStatus != other.mStatus) {
188            return false;
189        }
190        if (!TextUtils.equals(mDescription, other.mDescription)) {
191            return false;
192        }
193        if (mCapabilities == null) {
194            if (other.mCapabilities != null) {
195                return false;
196            }
197        } else if (!mCapabilities.equals(other.mCapabilities)) {
198            return false;
199        }
200        return true;
201    }
202
203    @Override
204    public String toString() {
205        StringBuilder builder = new StringBuilder();
206        builder.append("PrinterInfo{");
207        builder.append("id=").append(mId);
208        builder.append(", name=").append(mName);
209        builder.append(", status=").append(mStatus);
210        builder.append(", description=").append(mDescription);
211        builder.append(", capabilities=").append(mCapabilities);
212        builder.append("\"}");
213        return builder.toString();
214    }
215
216    /**
217     * Builder for creating of a {@link PrinterInfo}.
218     */
219    public static final class Builder {
220        private final PrinterInfo mPrototype;
221
222        /**
223         * Constructor.
224         *
225         * @param printerId The printer id. Cannot be null.
226         * @param name The printer name. Cannot be empty.
227         * @param status The printer status. Must be a valid status.
228         * @throws IllegalArgumentException If the printer id is null, or the
229         * printer name is empty or the status is not a valid one.
230         */
231        public Builder(PrinterId printerId, String name, int status) {
232            if (printerId == null) {
233                throw new IllegalArgumentException("printerId cannot be null.");
234            }
235            if (TextUtils.isEmpty(name)) {
236                throw new IllegalArgumentException("name cannot be empty.");
237            }
238            if (!isValidStatus(status)) {
239                throw new IllegalArgumentException("status is invalid.");
240            }
241            mPrototype = new PrinterInfo();
242            mPrototype.mId = printerId;
243            mPrototype.mName = name;
244            mPrototype.mStatus = status;
245        }
246
247        /**
248         * Constructor.
249         *
250         * @param other Other info from which to start building.
251         */
252        public Builder(PrinterInfo other) {
253            mPrototype = new PrinterInfo();
254            mPrototype.copyFrom(other);
255        }
256
257        /**
258         * Sets the printer status.
259         *
260         * @param status The status.
261         * @return This builder.
262         *
263         * @see PrinterInfo#STATUS_IDLE
264         * @see PrinterInfo#STATUS_BUSY
265         * @see PrinterInfo#STATUS_UNAVAILABLE
266         */
267        public Builder setStatus(int status) {
268            mPrototype.mStatus = status;
269            return this;
270        }
271
272        /**
273         * Sets the <strong>localized</strong> printer name which
274         * is shown to the user
275         *
276         * @param name The name.
277         * @return This builder.
278         */
279        public Builder setName(String name) {
280            mPrototype.mName = name;
281            return this;
282        }
283
284        /**
285         * Sets the <strong>localized</strong> printer description
286         * which is shown to the user
287         *
288         * @param description The description.
289         * @return This builder.
290         */
291        public Builder setDescription(String description) {
292            mPrototype.mDescription = description;
293            return this;
294        }
295
296        /**
297         * Sets the printer capabilities.
298         *
299         * @param capabilities The capabilities.
300         * @return This builder.
301         */
302        public Builder setCapabilities(PrinterCapabilitiesInfo capabilities) {
303            mPrototype.mCapabilities = capabilities;
304            return this;
305        }
306
307        /**
308         * Creates a new {@link PrinterInfo}.
309         *
310         * @return A new {@link PrinterInfo}.
311         */
312        public PrinterInfo build() {
313            return mPrototype;
314        }
315
316        private boolean isValidStatus(int status) {
317            return (status == STATUS_IDLE
318                    || status == STATUS_BUSY
319                    || status == STATUS_UNAVAILABLE);
320        }
321    }
322
323    public static final Parcelable.Creator<PrinterInfo> CREATOR =
324            new Parcelable.Creator<PrinterInfo>() {
325        @Override
326        public PrinterInfo createFromParcel(Parcel parcel) {
327            return new PrinterInfo(parcel);
328        }
329
330        @Override
331        public PrinterInfo[] newArray(int size) {
332            return new PrinterInfo[size];
333        }
334    };
335}
336