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 
17 package android.print;
18 
19 /**
20  * This class represents a print job from the perspective of an
21  * application. It contains behavior methods for performing operations
22  * on it as well as methods for querying its state. A snapshot of the
23  * print job state is represented by the {@link PrintJobInfo} class.
24  * The state of a print job may change over time. An application receives
25  * instances of this class when creating a print job or querying for
26  * its print jobs.
27  */
28 public final class PrintJob {
29 
30     private final PrintManager mPrintManager;
31 
32     private PrintJobInfo mCachedInfo;
33 
PrintJob(PrintJobInfo info, PrintManager printManager)34     PrintJob(PrintJobInfo info, PrintManager printManager) {
35         mCachedInfo = info;
36         mPrintManager = printManager;
37     }
38 
39     /**
40      * Gets the unique print job id.
41      *
42      * @return The id.
43      */
getId()44     public PrintJobId getId() {
45         return mCachedInfo.getId();
46     }
47 
48     /**
49      * Gets the {@link PrintJobInfo} that describes this job.
50      * <p>
51      * <strong>Node:</strong>The returned info object is a snapshot of the
52      * current print job state. Every call to this method returns a fresh
53      * info object that reflects the current print job state.
54      * </p>
55      *
56      * @return The print job info.
57      */
getInfo()58     public PrintJobInfo getInfo() {
59         if (isInImmutableState()) {
60             return mCachedInfo;
61         }
62         PrintJobInfo info = mPrintManager.getPrintJobInfo(mCachedInfo.getId());
63         if (info != null) {
64             mCachedInfo = info;
65         }
66         return mCachedInfo;
67     }
68 
69     /**
70      * Cancels this print job. You can request cancellation of a
71      * queued, started, blocked, or failed print job.
72      *
73      * @see #isQueued()
74      * @see #isStarted()
75      * @see #isBlocked()
76      * @see #isFailed()
77      */
cancel()78     public void cancel() {
79         final int state = getInfo().getState();
80         if (state == PrintJobInfo.STATE_QUEUED
81                 || state == PrintJobInfo.STATE_STARTED
82                 || state == PrintJobInfo.STATE_BLOCKED
83                 || state == PrintJobInfo.STATE_FAILED) {
84             mPrintManager.cancelPrintJob(mCachedInfo.getId());
85         }
86     }
87 
88     /**
89      * Restarts this print job. You can request restart of a failed
90      * print job.
91      *
92      * @see #isFailed()
93      */
restart()94     public void restart() {
95         if (isFailed()) {
96             mPrintManager.restartPrintJob(mCachedInfo.getId());
97         }
98     }
99 
100     /**
101      * Gets whether this print job is queued. Such a print job is
102      * ready to be printed. You can request a cancellation via
103      * {@link #cancel()}.
104      *
105      * @return Whether the print job is queued.
106      *
107      * @see #cancel()
108      */
isQueued()109     public boolean isQueued() {
110         return getInfo().getState() == PrintJobInfo.STATE_QUEUED;
111     }
112 
113     /**
114      * Gets whether this print job is started. Such a print job is
115      * being printed. You can request a cancellation via
116      * {@link #cancel()}.
117      *
118      * @return Whether the print job is started.
119      *
120      * @see #cancel()
121      */
isStarted()122     public boolean isStarted() {
123         return getInfo().getState() == PrintJobInfo.STATE_STARTED;
124     }
125 
126     /**
127      * Gets whether this print job is blocked. Such a print job is halted
128      * due to an abnormal condition. You can request a cancellation via
129      * {@link #cancel()}.
130      *
131      * @return Whether the print job is blocked.
132      *
133      * @see #cancel()
134      */
isBlocked()135     public boolean isBlocked() {
136         return getInfo().getState() == PrintJobInfo.STATE_BLOCKED;
137     }
138 
139     /**
140      * Gets whether this print job is completed. Such a print job
141      * is successfully printed. You can neither cancel nor restart
142      * such a print job.
143      *
144      * @return Whether the print job is completed.
145      */
isCompleted()146     public boolean isCompleted() {
147         return getInfo().getState() == PrintJobInfo.STATE_COMPLETED;
148     }
149 
150     /**
151      * Gets whether this print job is failed. Such a print job is
152      * not successfully printed due to an error. You can request
153      * a restart via {@link #restart()} or cancel via {@link #cancel()}.
154      *
155      * @return Whether the print job is failed.
156      *
157      * @see #restart()
158      * @see #cancel()
159      */
isFailed()160     public boolean isFailed() {
161         return getInfo().getState() == PrintJobInfo.STATE_FAILED;
162     }
163 
164     /**
165      * Gets whether this print job is cancelled. Such a print job was
166      * cancelled as a result of a user request. This is a final state.
167      * You cannot restart such a print job.
168      *
169      * @return Whether the print job is cancelled.
170      */
isCancelled()171     public boolean isCancelled() {
172         return getInfo().getState() == PrintJobInfo.STATE_CANCELED;
173     }
174 
isInImmutableState()175     private boolean isInImmutableState() {
176         final int state = mCachedInfo.getState();
177         return state == PrintJobInfo.STATE_COMPLETED
178                 || state == PrintJobInfo.STATE_CANCELED;
179     }
180 
181     @Override
equals(Object obj)182     public boolean equals(Object obj) {
183         if (this == obj) {
184             return true;
185         }
186         if (obj == null) {
187             return false;
188         }
189         if (getClass() != obj.getClass()) {
190             return false;
191         }
192         PrintJob other = (PrintJob) obj;
193         return mCachedInfo.getId().equals(other.mCachedInfo.getId());
194     }
195 
196     @Override
hashCode()197     public int hashCode() {
198         return mCachedInfo.getId().hashCode();
199     }
200 }
201