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