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 194b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov/** 204d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * This class represents a print job from the perspective of an 214d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * application. It contains behavior methods for performing operations 224d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * on it as well as methods for querying its state. A snapshot of the 234d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * print job state is represented by the {@link PrintJobInfo} class. 244d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * The state of a print job may change over time. An application receives 254d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * instances of this class when creating a print job or querying for 264d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * its print jobs. 274b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov */ 284b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovpublic final class PrintJob { 294b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 304b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov private final PrintManager mPrintManager; 314b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 324b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov private PrintJobInfo mCachedInfo; 334b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 344b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov PrintJob(PrintJobInfo info, PrintManager printManager) { 354b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov mCachedInfo = info; 364b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov mPrintManager = printManager; 374b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 384b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 394b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov /** 404b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * Gets the unique print job id. 414b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * 424b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * @return The id. 434b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov */ 442fbd2a7f070f246ddafd9de94efa9a98861e9136Svetoslav public PrintJobId getId() { 452fbd2a7f070f246ddafd9de94efa9a98861e9136Svetoslav return mCachedInfo.getId(); 464b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 474b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 484b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov /** 494b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * Gets the {@link PrintJobInfo} that describes this job. 504b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * <p> 514b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * <strong>Node:</strong>The returned info object is a snapshot of the 524b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * current print job state. Every call to this method returns a fresh 534b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * info object that reflects the current print job state. 544b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * </p> 554b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * 564b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * @return The print job info. 574b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov */ 584b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov public PrintJobInfo getInfo() { 5985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov if (isInImmutableState()) { 6085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov return mCachedInfo; 6185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov } 622fbd2a7f070f246ddafd9de94efa9a98861e9136Svetoslav PrintJobInfo info = mPrintManager.getPrintJobInfo(mCachedInfo.getId()); 634b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov if (info != null) { 644b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov mCachedInfo = info; 654b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 664b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov return mCachedInfo; 674b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 684b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 694b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov /** 70704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * Cancels this print job. You can request cancellation of a 71704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * queued, started, blocked, or failed print job. 72704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * 73704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * @see #isQueued() 74704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * @see #isStarted() 75704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * @see #isBlocked() 76704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * @see #isFailed() 774b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov */ 784b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov public void cancel() { 79704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov final int state = getInfo().getState(); 80704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov if (state == PrintJobInfo.STATE_QUEUED 81704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov || state == PrintJobInfo.STATE_STARTED 82704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov || state == PrintJobInfo.STATE_BLOCKED 83704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov || state == PrintJobInfo.STATE_FAILED) { 842fbd2a7f070f246ddafd9de94efa9a98861e9136Svetoslav mPrintManager.cancelPrintJob(mCachedInfo.getId()); 8585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov } 8685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov } 8785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov 88704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov /** 89704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * Restarts this print job. You can request restart of a failed 90704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * print job. 91704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * 92704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * @see #isFailed() 93704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov */ 94704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov public void restart() { 95704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov if (isFailed()) { 96704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov mPrintManager.restartPrintJob(mCachedInfo.getId()); 97704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov } 98704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov } 99704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov 100704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov /** 101704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * Gets whether this print job is queued. Such a print job is 102704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * ready to be printed. You can request a cancellation via 103704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * {@link #cancel()}. 104704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * 105704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * @return Whether the print job is queued. 106704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * 107704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * @see #cancel() 108704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov */ 109704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov public boolean isQueued() { 110704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov return getInfo().getState() == PrintJobInfo.STATE_QUEUED; 111704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov } 112704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov 113704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov /** 114704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * Gets whether this print job is started. Such a print job is 115704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * being printed. You can request a cancellation via 116704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * {@link #cancel()}. 117704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * 118704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * @return Whether the print job is started. 119704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * 120704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * @see #cancel() 121704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov */ 122704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov public boolean isStarted() { 123704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov return getInfo().getState() == PrintJobInfo.STATE_STARTED; 124704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov } 125704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov 126704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov /** 127704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * Gets whether this print job is blocked. Such a print job is halted 128704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * due to an abnormal condition. You can request a cancellation via 129704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * {@link #cancel()}. 130704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * 131704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * @return Whether the print job is blocked. 132704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * 133704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * @see #cancel() 134704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov */ 135704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov public boolean isBlocked() { 136704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov return getInfo().getState() == PrintJobInfo.STATE_BLOCKED; 137704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov } 138704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov 139704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov /** 140704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * Gets whether this print job is completed. Such a print job 141704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * is successfully printed. You can neither cancel nor restart 142704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * such a print job. 143704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * 144704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * @return Whether the print job is completed. 145704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov */ 146704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov public boolean isCompleted() { 147704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov return getInfo().getState() == PrintJobInfo.STATE_COMPLETED; 148704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov } 149704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov 150704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov /** 151704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * Gets whether this print job is failed. Such a print job is 152704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * not successfully printed due to an error. You can request 1534d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * a restart via {@link #restart()} or cancel via {@link #cancel()}. 154704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * 155704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * @return Whether the print job is failed. 156704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * 157704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * @see #restart() 1584d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * @see #cancel() 159704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov */ 160704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov public boolean isFailed() { 161704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov return getInfo().getState() == PrintJobInfo.STATE_FAILED; 162704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov } 163704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov 164704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov /** 165704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * Gets whether this print job is cancelled. Such a print job was 166704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * cancelled as a result of a user request. This is a final state. 167704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * You cannot restart such a print job. 168704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * 169704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov * @return Whether the print job is cancelled. 170704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov */ 171704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov public boolean isCancelled() { 172704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov return getInfo().getState() == PrintJobInfo.STATE_CANCELED; 173704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov } 174704697b6197262678e930daa831a1916ddee4dcfSvetoslav Ganov 17585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov private boolean isInImmutableState() { 17685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov final int state = mCachedInfo.getState(); 17785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov return state == PrintJobInfo.STATE_COMPLETED 17885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov || state == PrintJobInfo.STATE_CANCELED; 1794b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 1804b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 1814b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov @Override 1824b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov public boolean equals(Object obj) { 1834b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov if (this == obj) { 1844b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov return true; 1854b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 1864b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov if (obj == null) { 1874b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov return false; 1884b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 1894b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov if (getClass() != obj.getClass()) { 1904b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov return false; 1914b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 1924b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov PrintJob other = (PrintJob) obj; 1932fbd2a7f070f246ddafd9de94efa9a98861e9136Svetoslav return mCachedInfo.getId().equals(other.mCachedInfo.getId()); 1944b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 1954b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 1964b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov @Override 1974b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov public int hashCode() { 1982fbd2a7f070f246ddafd9de94efa9a98861e9136Svetoslav return mCachedInfo.getId().hashCode(); 1994b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 2004b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov} 201