1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  * Copyright (C) 2016 Mopria Alliance, Inc.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 package com.android.bips.ipp;
19 
20 import android.text.TextUtils;
21 
22 import com.android.bips.R;
23 import com.android.bips.jni.BackendConstants;
24 
25 import java.util.HashMap;
26 import java.util.LinkedHashSet;
27 import java.util.Map;
28 import java.util.Set;
29 
30 public class JobStatus {
31     public static final int ID_UNKNOWN = -1;
32 
33     /** Maps backend blocked reason codes to string resource IDs */
34     private static final Map<String, Integer> sBlockReasonsMap = new HashMap<>();
35 
36     static {
sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__DOOR_OPEN, R.string.printer_door_open)37         sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__DOOR_OPEN,
38                 R.string.printer_door_open);
sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__JAMMED, R.string.printer_jammed)39         sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__JAMMED, R.string.printer_jammed);
sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__OUT_OF_PAPER, R.string.printer_out_of_paper)40         sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__OUT_OF_PAPER,
41                 R.string.printer_out_of_paper);
sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__SERVICE_REQUEST, R.string.printer_check)42         sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__SERVICE_REQUEST,
43                 R.string.printer_check);
sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__OUT_OF_INK, R.string.printer_out_of_ink)44         sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__OUT_OF_INK,
45                 R.string.printer_out_of_ink);
sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__OUT_OF_TONER, R.string.printer_out_of_toner)46         sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__OUT_OF_TONER,
47                 R.string.printer_out_of_toner);
sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__LOW_ON_INK, R.string.printer_low_on_ink)48         sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__LOW_ON_INK,
49                 R.string.printer_low_on_ink);
sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__REALLY_LOW_ON_INK, R.string.printer_low_on_ink)50         sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__REALLY_LOW_ON_INK,
51                 R.string.printer_low_on_ink);
sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__LOW_ON_TONER, R.string.printer_low_on_toner)52         sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__LOW_ON_TONER,
53                 R.string.printer_low_on_toner);
sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__BUSY, R.string.printer_busy)54         sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__BUSY, R.string.printer_busy);
sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__OFFLINE, R.string.printer_offline)55         sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__OFFLINE, R.string.printer_offline);
sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__BAD_CERTIFICATE, R.string.printer_bad_certificate)56         sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__BAD_CERTIFICATE,
57                 R.string.printer_bad_certificate);
58     }
59 
60     private int mId;
61     private String mJobState;
62     private String mJobResult;
63     private final Set<String> mBlockedReasons;
64     private byte[] mCertificate;
65 
66     /** Create a new, blank job status */
JobStatus()67     public JobStatus() {
68         mId = ID_UNKNOWN;
69         mBlockedReasons = new LinkedHashSet<>();
70     }
71 
72     /** Create a copy of another object */
JobStatus(JobStatus other)73     private JobStatus(JobStatus other) {
74         mId = other.mId;
75         mJobState = other.mJobState;
76         mJobResult = other.mJobResult;
77         mBlockedReasons = other.mBlockedReasons;
78         mCertificate = other.mCertificate;
79     }
80 
81     /** Returns a string resource ID corresponding to a blocked reason, or 0 if none found */
getBlockedReasonId()82     public int getBlockedReasonId() {
83         for (String reason : mBlockedReasons) {
84             if (sBlockReasonsMap.containsKey(reason)) {
85                 return sBlockReasonsMap.get(reason);
86             }
87         }
88         return 0;
89     }
90 
91     /** Returns a job state (see {@link BackendConstants} JOB_DONE_*}) or null if not known */
getJobState()92     public String getJobState() {
93         return mJobState;
94     }
95 
96     /** Returns a job result (see {@link BackendConstants} JOB_RESULT_*}) or null if not known */
getJobResult()97     public String getJobResult() {
98         return mJobResult;
99     }
100 
101     /** Return the job's identifier or ID_UNKNOWN */
getId()102     public int getId() {
103         return mId;
104     }
105 
106     /** Return true if the job is in a completion state */
isJobDone()107     boolean isJobDone() {
108         return !TextUtils.isEmpty(mJobResult);
109     }
110 
111     /** Return certificate if supplied as part of this status. */
getCertificate()112     public byte[] getCertificate() {
113         return mCertificate;
114     }
115 
116     @Override
toString()117     public String toString() {
118         return "JobStatus{id=" + mId
119                 + ", jobState=" + mJobState
120                 + ", jobResult=" + mJobResult
121                 + ", blockedReasons=" + mBlockedReasons
122                 + ", certificate=" + (mCertificate != null)
123                 + "}";
124     }
125 
126     static class Builder {
127         final JobStatus mPrototype;
128 
Builder()129         Builder() {
130             mPrototype = new JobStatus();
131         }
132 
Builder(JobStatus from)133         Builder(JobStatus from) {
134             mPrototype = new JobStatus(from);
135         }
136 
setId(int id)137         public Builder setId(int id) {
138             mPrototype.mId = id;
139             return this;
140         }
141 
setJobState(String jobState)142         Builder setJobState(String jobState) {
143             mPrototype.mJobState = jobState;
144             return this;
145         }
146 
setJobResult(String jobResult)147         Builder setJobResult(String jobResult) {
148             mPrototype.mJobResult = jobResult;
149             return this;
150         }
151 
setCertificate(byte[] certificate)152         Builder setCertificate(byte[] certificate) {
153             mPrototype.mCertificate = certificate;
154             return this;
155         }
156 
clearBlockedReasons()157         Builder clearBlockedReasons() {
158             mPrototype.mBlockedReasons.clear();
159             return this;
160         }
161 
addBlockedReason(String blockedReason)162         Builder addBlockedReason(String blockedReason) {
163             mPrototype.mBlockedReasons.add(blockedReason);
164             return this;
165         }
166 
build()167         public JobStatus build() {
168             return new JobStatus(mPrototype);
169         }
170     }
171 }
172