1c36cf2e9Sopenharmony_ci/*
2c36cf2e9Sopenharmony_ci * Copyright (c) 2023-2023 Huawei Device Co., Ltd.
3c36cf2e9Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c36cf2e9Sopenharmony_ci * you may not use this file except in compliance with the License.
5c36cf2e9Sopenharmony_ci * You may obtain a copy of the License at
6c36cf2e9Sopenharmony_ci *
7c36cf2e9Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8c36cf2e9Sopenharmony_ci *
9c36cf2e9Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c36cf2e9Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c36cf2e9Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c36cf2e9Sopenharmony_ci * See the License for the specific language governing permissions and
13c36cf2e9Sopenharmony_ci * limitations under the License.
14c36cf2e9Sopenharmony_ci */
15c36cf2e9Sopenharmony_ciimport print from '@ohos.print';
16c36cf2e9Sopenharmony_ciimport { cancelPrintJob, CustomPrintJobState, Log, PrintItemChangeListener, PrintJob, SingletonHelper } from '@ohos/common';
17c36cf2e9Sopenharmony_ciimport { printJobMgr } from '../../Controller/PrintJobManager';
18c36cf2e9Sopenharmony_ciimport { PageData, PrintJobItem, ShowTips } from './PrintPageModel';
19c36cf2e9Sopenharmony_ci
20c36cf2e9Sopenharmony_ciconst TAG: string = 'PrintJobViewModel';
21c36cf2e9Sopenharmony_ciconst COMPLETED_STATUS = 'completed';
22c36cf2e9Sopenharmony_ci/**
23c36cf2e9Sopenharmony_ci * 打印任务状态-任务状态描述字串id映射集合
24c36cf2e9Sopenharmony_ci */
25c36cf2e9Sopenharmony_ciconst JOB_STATUS_MAP: Map<number, string> = new Map([
26c36cf2e9Sopenharmony_ci  [print.PrintJobState.PRINT_JOB_PREPARE, 'print_job_created'],
27c36cf2e9Sopenharmony_ci  [print.PrintJobState.PRINT_JOB_QUEUED, 'print_job_created'],
28c36cf2e9Sopenharmony_ci  [print.PrintJobState.PRINT_JOB_RUNNING, 'print_job_printing'],
29c36cf2e9Sopenharmony_ci  [print.PrintJobState.PRINT_JOB_BLOCKED, 'print_job_blocked'],
30c36cf2e9Sopenharmony_ci  [CustomPrintJobState.PRINT_JOB_CANCELLING as number, 'print_job_cancelling'],
31c36cf2e9Sopenharmony_ci  [print.PrintJobState.PRINT_JOB_COMPLETED, COMPLETED_STATUS]
32c36cf2e9Sopenharmony_ci]);
33c36cf2e9Sopenharmony_ci/**
34c36cf2e9Sopenharmony_ci * 打印任务完成状态-任务状态描述字串id映射集合
35c36cf2e9Sopenharmony_ci */
36c36cf2e9Sopenharmony_ciconst JOB_COMPLETED_MAP: Map<number, string> = new Map([
37c36cf2e9Sopenharmony_ci  [print.PrintJobSubState.PRINT_JOB_COMPLETED_SUCCESS, 'print_job_completed'],
38c36cf2e9Sopenharmony_ci  [print.PrintJobSubState.PRINT_JOB_COMPLETED_FAILED, 'print_job_failed'],
39c36cf2e9Sopenharmony_ci  [print.PrintJobSubState.PRINT_JOB_COMPLETED_CANCELLED, 'print_job_cancelled']
40c36cf2e9Sopenharmony_ci]);
41c36cf2e9Sopenharmony_ci/**
42c36cf2e9Sopenharmony_ci * 横幅提示集合:
43c36cf2e9Sopenharmony_ci */
44c36cf2e9Sopenharmony_ciconst SHOW_TIPS_MAP: Map<number, string> = new Map([
45c36cf2e9Sopenharmony_ci  [print.PrintJobSubState.PRINT_JOB_BLOCK_DOOR_OPEN, 'printer_door_open'],
46c36cf2e9Sopenharmony_ci  [print.PrintJobSubState.PRINT_JOB_BLOCK_BUSY, 'printer_busy'],
47c36cf2e9Sopenharmony_ci  [print.PrintJobSubState.PRINT_JOB_BLOCK_JAMMED, 'printer_jammed'],
48c36cf2e9Sopenharmony_ci  [print.PrintJobSubState.PRINT_JOB_BLOCK_LOW_ON_INK, 'printer_low_on_ink'],
49c36cf2e9Sopenharmony_ci  [print.PrintJobSubState.PRINT_JOB_BLOCK_OFFLINE, 'printer_offline'],
50c36cf2e9Sopenharmony_ci  [print.PrintJobSubState.PRINT_JOB_BLOCK_LOW_ON_TONER, 'printer_low_on_toner'],
51c36cf2e9Sopenharmony_ci  [print.PrintJobSubState.PRINT_JOB_BLOCK_OUT_OF_INK, 'printer_out_of_ink'],
52c36cf2e9Sopenharmony_ci  [print.PrintJobSubState.PRINT_JOB_BLOCK_OUT_OF_PAPER, 'printer_out_of_paper'],
53c36cf2e9Sopenharmony_ci  [print.PrintJobSubState.PRINT_JOB_BLOCK_OUT_OF_TONER, 'printer_out_of_tone'],
54c36cf2e9Sopenharmony_ci  [print.PrintJobSubState.PRINT_JOB_BLOCK_REALLY_LOW_ON_INK, 'printer_out_of_ink'],
55c36cf2e9Sopenharmony_ci  [print.PrintJobSubState.PRINT_JOB_BLOCK_SERVICE_REQUEST, 'printer_check'],
56c36cf2e9Sopenharmony_ci  [print.PrintJobSubState.PRINT_JOB_BLOCK_BAD_CERTIFICATE, 'printer_bad_certificate'],
57c36cf2e9Sopenharmony_ci  [print.PrintJobSubState.PRINT_JOB_BLOCK_NETWORK_ERROR, 'print_block_reason_network_error']
58c36cf2e9Sopenharmony_ci]);
59c36cf2e9Sopenharmony_ci/**
60c36cf2e9Sopenharmony_ci * 打印任务管理界面基础数据模型
61c36cf2e9Sopenharmony_ci */
62c36cf2e9Sopenharmony_ciexport class PrintJobViewModel {
63c36cf2e9Sopenharmony_ci  private uiJobsMap: Map<string, PrintJobItem> = new Map();
64c36cf2e9Sopenharmony_ci  private listener: PrintItemChangeListener | null = null;
65c36cf2e9Sopenharmony_ci  private tips: ShowTips = new ShowTips();
66c36cf2e9Sopenharmony_ci  aboutToAppear(listener: PrintItemChangeListener): void {
67c36cf2e9Sopenharmony_ci    Log.info(TAG, 'aboutToAppear');
68c36cf2e9Sopenharmony_ci    this.listener = listener;
69c36cf2e9Sopenharmony_ci    printJobMgr.registerJobChangeListener(TAG, this);
70c36cf2e9Sopenharmony_ci  }
71c36cf2e9Sopenharmony_ci
72c36cf2e9Sopenharmony_ci  aboutToDisappear(): void {
73c36cf2e9Sopenharmony_ci    this.listener = null;
74c36cf2e9Sopenharmony_ci    printJobMgr.unregisterJobChangeListener(TAG);
75c36cf2e9Sopenharmony_ci    this.uiJobsMap.clear();
76c36cf2e9Sopenharmony_ci  }
77c36cf2e9Sopenharmony_ci
78c36cf2e9Sopenharmony_ci  getPrintJobQueue(): void {
79c36cf2e9Sopenharmony_ci    printJobMgr.getPrintJobQueue();
80c36cf2e9Sopenharmony_ci  }
81c36cf2e9Sopenharmony_ci
82c36cf2e9Sopenharmony_ci  private getJobStateStrName(jobState: number, jobSubState: print.PrintJobSubState): string {
83c36cf2e9Sopenharmony_ci    Log.debug(TAG, `getJobStateStrName enter jobState:${jobState}, jobSubState:${jobSubState}`);
84c36cf2e9Sopenharmony_ci    let jobStateStrName = JOB_STATUS_MAP.get(jobState)!;
85c36cf2e9Sopenharmony_ci    if (jobStateStrName === COMPLETED_STATUS) {
86c36cf2e9Sopenharmony_ci      jobStateStrName = JOB_COMPLETED_MAP.get(jobSubState)!;
87c36cf2e9Sopenharmony_ci    }
88c36cf2e9Sopenharmony_ci    Log.debug(TAG, `getJobStateStrName end jobStateStrName:${jobStateStrName}`);
89c36cf2e9Sopenharmony_ci    return jobStateStrName;
90c36cf2e9Sopenharmony_ci  }
91c36cf2e9Sopenharmony_ci
92c36cf2e9Sopenharmony_ci  private updateShowTips(blockedSubState: number): void {
93c36cf2e9Sopenharmony_ci    if (blockedSubState != -1) {
94c36cf2e9Sopenharmony_ci      this.tips.isShowTips = true;
95c36cf2e9Sopenharmony_ci      this.tips.showTipsText = SHOW_TIPS_MAP.get(blockedSubState)!;
96c36cf2e9Sopenharmony_ci      this.tips.fontColor = $r('sys.color.ohos_id_color_warning');
97c36cf2e9Sopenharmony_ci      this.tips.icon = $r('app.media.ic_print_warning_tips');
98c36cf2e9Sopenharmony_ci    } else {
99c36cf2e9Sopenharmony_ci      this.tips.isShowTips = false;
100c36cf2e9Sopenharmony_ci      this.tips.showTipsText = '';
101c36cf2e9Sopenharmony_ci    }
102c36cf2e9Sopenharmony_ci  }
103c36cf2e9Sopenharmony_ci
104c36cf2e9Sopenharmony_ci  private getJobStateFontColor(jobState: number, jobSubState?: print.PrintJobSubState): Resource {
105c36cf2e9Sopenharmony_ci    Log.debug(TAG, 'getJobStateFontColor enter jobState: ' + jobState + ' ,jobSubState:' + jobSubState);
106c36cf2e9Sopenharmony_ci    let color: Resource;
107c36cf2e9Sopenharmony_ci    if (jobState == print.PrintJobState.PRINT_JOB_BLOCKED) {
108c36cf2e9Sopenharmony_ci      color = $r('app.color.text_jobState_blocked');
109c36cf2e9Sopenharmony_ci    } else if (jobState == print.PrintJobState.PRINT_JOB_COMPLETED) {
110c36cf2e9Sopenharmony_ci      color = $r('app.color.text_jobState_completed');
111c36cf2e9Sopenharmony_ci    } else {
112c36cf2e9Sopenharmony_ci      color = $r('app.color.text_jobState_running');
113c36cf2e9Sopenharmony_ci    }
114c36cf2e9Sopenharmony_ci    return color;
115c36cf2e9Sopenharmony_ci  }
116c36cf2e9Sopenharmony_ci
117c36cf2e9Sopenharmony_ci  private isHideCancelBtn(jobState: number) : boolean {
118c36cf2e9Sopenharmony_ci    return jobState == print.PrintJobState.PRINT_JOB_COMPLETED;
119c36cf2e9Sopenharmony_ci  }
120c36cf2e9Sopenharmony_ci
121c36cf2e9Sopenharmony_ci  onAddPrintJob(job: PrintJob, blockedSubState: number) : void {
122c36cf2e9Sopenharmony_ci    Log.info(TAG, 'onAddPrintJob enter.');
123c36cf2e9Sopenharmony_ci    if (!this.uiJobsMap.has(job.jobId)) {
124c36cf2e9Sopenharmony_ci      Log.info(TAG, `onAddPrintJob jobId:${job.jobId}, blockedSubState:${blockedSubState}`);
125c36cf2e9Sopenharmony_ci      let jobStateStrName: string = this.getJobStateStrName(job.jobState as number, job.jobSubstate);
126c36cf2e9Sopenharmony_ci      let jobStateFontColor: Resource = this.getJobStateFontColor(job.jobState as number, job.jobSubstate);
127c36cf2e9Sopenharmony_ci      let jobItem: PrintJobItem = new PrintJobItem(job, this.isHideCancelBtn(job.jobState as number), jobStateFontColor, jobStateStrName);
128c36cf2e9Sopenharmony_ci      Log.debug(TAG, `onAddPrintJob ${jobItem.toString()}`);
129c36cf2e9Sopenharmony_ci      this.uiJobsMap.set(job.jobId, jobItem);
130c36cf2e9Sopenharmony_ci      // 刷新横幅提示状态
131c36cf2e9Sopenharmony_ci      this.updateShowTips(blockedSubState);
132c36cf2e9Sopenharmony_ci      this.refreshUi();
133c36cf2e9Sopenharmony_ci    }
134c36cf2e9Sopenharmony_ci    Log.info(TAG, 'onAddPrintJob end.');
135c36cf2e9Sopenharmony_ci  }
136c36cf2e9Sopenharmony_ci
137c36cf2e9Sopenharmony_ci  onUpdatePrintJob(job: PrintJob, blockedSubState: number): void {
138c36cf2e9Sopenharmony_ci    Log.info(TAG, 'onUpdatePrintJob enter.');
139c36cf2e9Sopenharmony_ci    let jobItem = this.uiJobsMap.get(job.jobId);
140c36cf2e9Sopenharmony_ci    if (jobItem) {
141c36cf2e9Sopenharmony_ci      Log.info(TAG, `onUpdatePrintJob jobId:${job.jobId}, blockedSubState:${blockedSubState}`);
142c36cf2e9Sopenharmony_ci      jobItem.jobStateStrName = this.getJobStateStrName(job.jobState, job.jobSubstate);
143c36cf2e9Sopenharmony_ci      jobItem.isHideCancelBtn = this.isHideCancelBtn(job.jobState as number);
144c36cf2e9Sopenharmony_ci      jobItem.jobStateColor = this.getJobStateFontColor(job.jobState as number, job.jobSubstate);
145c36cf2e9Sopenharmony_ci      Log.debug(TAG, `onUpdatePrintJob ${jobItem.toString()}`);
146c36cf2e9Sopenharmony_ci      this.uiJobsMap.set(job.jobId, jobItem);
147c36cf2e9Sopenharmony_ci      // 刷新横幅提示状态
148c36cf2e9Sopenharmony_ci      this.updateShowTips(blockedSubState);
149c36cf2e9Sopenharmony_ci      this.refreshUi();
150c36cf2e9Sopenharmony_ci    }
151c36cf2e9Sopenharmony_ci    Log.info(TAG, 'onUpdatePrintJob end.');
152c36cf2e9Sopenharmony_ci  }
153c36cf2e9Sopenharmony_ci
154c36cf2e9Sopenharmony_ci  onRemovePrintJob(jobId: string, blockedSubState: number): void {
155c36cf2e9Sopenharmony_ci    Log.info(TAG, 'onRemovePrintJob enter.');
156c36cf2e9Sopenharmony_ci    if (this.uiJobsMap.delete(jobId)) {
157c36cf2e9Sopenharmony_ci      Log.info(TAG, `onRemovePrintJob success, jobId:${jobId}, blockedSubState:${blockedSubState}`);
158c36cf2e9Sopenharmony_ci      // 刷新横幅提示状态
159c36cf2e9Sopenharmony_ci      this.updateShowTips(blockedSubState);
160c36cf2e9Sopenharmony_ci      this.refreshUi();
161c36cf2e9Sopenharmony_ci    }
162c36cf2e9Sopenharmony_ci    Log.info(TAG, 'onRemovePrintJob end.');
163c36cf2e9Sopenharmony_ci  }
164c36cf2e9Sopenharmony_ci
165c36cf2e9Sopenharmony_ci  onAllPrintJobsFinished(): void {
166c36cf2e9Sopenharmony_ci    Log.info(TAG, 'onAllPrintJobsFinished enter.');
167c36cf2e9Sopenharmony_ci    this.uiJobsMap.clear();
168c36cf2e9Sopenharmony_ci    // 刷新横幅提示状态
169c36cf2e9Sopenharmony_ci    this.updateShowTips(-1);
170c36cf2e9Sopenharmony_ci    this.refreshUi();
171c36cf2e9Sopenharmony_ci    Log.info(TAG, 'onAllPrintJobsFinished end.');
172c36cf2e9Sopenharmony_ci  }
173c36cf2e9Sopenharmony_ci
174c36cf2e9Sopenharmony_ci  cancelPrintJob(jobId: string): void {
175c36cf2e9Sopenharmony_ci    Log.debug(TAG, 'cancelPrintJob enter.');
176c36cf2e9Sopenharmony_ci    let jobItem = this.uiJobsMap.get(jobId);
177c36cf2e9Sopenharmony_ci    if (jobItem) {
178c36cf2e9Sopenharmony_ci      Log.info(TAG, `cancelPrintJob jobId:${jobId}`);
179c36cf2e9Sopenharmony_ci      jobItem.jobStateStrName = JOB_STATUS_MAP.get(CustomPrintJobState.PRINT_JOB_CANCELLING as number)!;
180c36cf2e9Sopenharmony_ci      jobItem.jobStateColor = this.getJobStateFontColor(CustomPrintJobState.PRINT_JOB_CANCELLING as number)!;
181c36cf2e9Sopenharmony_ci      Log.debug(TAG, `cancelPrintJob ${jobItem.toString()}`);
182c36cf2e9Sopenharmony_ci      this.uiJobsMap.set(jobId, jobItem);
183c36cf2e9Sopenharmony_ci      this.refreshUi();
184c36cf2e9Sopenharmony_ci    }
185c36cf2e9Sopenharmony_ci    cancelPrintJob(jobId);
186c36cf2e9Sopenharmony_ci    Log.info(TAG, 'cancelPrintJob end.');
187c36cf2e9Sopenharmony_ci  }
188c36cf2e9Sopenharmony_ci
189c36cf2e9Sopenharmony_ci  refreshUi(): void {
190c36cf2e9Sopenharmony_ci    Log.info(TAG, 'refreshUi enter.');
191c36cf2e9Sopenharmony_ci    if (this.listener == null) {
192c36cf2e9Sopenharmony_ci      return;
193c36cf2e9Sopenharmony_ci    }
194c36cf2e9Sopenharmony_ci    let jobList: Array<PrintJobItem> = new Array();
195c36cf2e9Sopenharmony_ci    this.uiJobsMap.forEach((value, key) => {
196c36cf2e9Sopenharmony_ci      jobList.push(value);
197c36cf2e9Sopenharmony_ci    })
198c36cf2e9Sopenharmony_ci    let pageData: PageData = new PageData(this.tips, jobList);
199c36cf2e9Sopenharmony_ci    Log.info(TAG, `refreshUi pageData: ${pageData.toString()}`);
200c36cf2e9Sopenharmony_ci    this.listener.onPrintItemsChanged(pageData);
201c36cf2e9Sopenharmony_ci    Log.info(TAG, 'refreshUi end.');
202c36cf2e9Sopenharmony_ci  }
203c36cf2e9Sopenharmony_ci}
204c36cf2e9Sopenharmony_ciexport let printJobMgrVM = SingletonHelper.getInstance(PrintJobViewModel, TAG);
205