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
18package com.android.bips.ipp;
19
20import android.text.TextUtils;
21
22import com.android.bips.R;
23import com.android.bips.jni.BackendConstants;
24
25import java.util.HashMap;
26import java.util.LinkedHashSet;
27import java.util.Map;
28import java.util.Set;
29
30public 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 {
37        sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__DOOR_OPEN,
38                R.string.printer_door_open);
39        sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__JAMMED, R.string.printer_jammed);
40        sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__OUT_OF_PAPER,
41                R.string.printer_out_of_paper);
42        sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__SERVICE_REQUEST,
43                R.string.printer_check);
44        sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__OUT_OF_INK,
45                R.string.printer_out_of_ink);
46        sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__OUT_OF_TONER,
47                R.string.printer_out_of_toner);
48        sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__LOW_ON_INK,
49                R.string.printer_low_on_ink);
50        sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__REALLY_LOW_ON_INK,
51                R.string.printer_low_on_ink);
52        sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__LOW_ON_TONER,
53                R.string.printer_low_on_toner);
54        sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__BUSY, R.string.printer_busy);
55        sBlockReasonsMap.put(BackendConstants.BLOCKED_REASON__OFFLINE, R.string.printer_offline);
56    }
57
58    private int mId;
59    private String mJobState;
60    private String mJobResult;
61    private final Set<String> mBlockedReasons;
62
63    /** Create a new, blank job status */
64    public JobStatus() {
65        mId = ID_UNKNOWN;
66        mBlockedReasons = new LinkedHashSet<>();
67    }
68
69    /** Create a copy of another object */
70    private JobStatus(JobStatus other) {
71        mId = other.mId;
72        mJobState = other.mJobState;
73        mJobResult = other.mJobResult;
74        mBlockedReasons = other.mBlockedReasons;
75    }
76
77    /** Returns a string resource ID corresponding to a blocked reason, or 0 if none found */
78    public int getBlockedReasonId() {
79        for (String reason : mBlockedReasons) {
80            if (sBlockReasonsMap.containsKey(reason)) {
81                return sBlockReasonsMap.get(reason);
82            }
83        }
84        return 0;
85    }
86
87    /** Returns a job state (see {@link BackendConstants} JOB_DONE_*}) or null if not known */
88    public String getJobState() {
89        return mJobState;
90    }
91
92    /** Returns a job result (see {@link BackendConstants} JOB_RESULT_*}) or null if not known */
93    public String getJobResult() {
94        return mJobResult;
95    }
96
97    /** Return the job's identifier or ID_UNKNOWN */
98    public int getId() {
99        return mId;
100    }
101
102    /** Return true if the job is in a completion state */
103    boolean isJobDone() {
104        return !TextUtils.isEmpty(mJobResult);
105    }
106
107    @Override
108    public String toString() {
109        return "JobStatus{id=" + mId +
110                ", jobState=" + mJobState +
111                ", jobResult=" + mJobResult +
112                ", blockedReasons=" + mBlockedReasons +
113                "}";
114    }
115
116    static class Builder {
117        final JobStatus mPrototype;
118
119        Builder() {
120            mPrototype = new JobStatus();
121        }
122
123        Builder(JobStatus from) {
124            mPrototype = new JobStatus(from);
125        }
126
127        public Builder setId(int id) {
128            mPrototype.mId = id;
129            return this;
130        }
131
132        Builder setJobState(String jobState) {
133            mPrototype.mJobState = jobState;
134            return this;
135        }
136
137        Builder setJobResult(String jobResult) {
138            mPrototype.mJobResult = jobResult;
139            return this;
140        }
141
142        Builder clearBlockedReasons() {
143            mPrototype.mBlockedReasons.clear();
144            return this;
145        }
146
147        Builder addBlockedReason(String blockedReason) {
148            mPrototype.mBlockedReasons.add(blockedReason);
149            return this;
150        }
151
152        public JobStatus build() {
153            return new JobStatus(mPrototype);
154        }
155    }
156}