1/* 2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import { BroadCastConstants } from '../../model/common/BroadCastConstants'; 17import { Constants } from '../../model/common/Constants'; 18import { AddMenuOperation } from './AddMenuOperation'; 19import { MenuContext } from './MenuContext'; 20import { MenuOperationFactory } from '../../interface/MenuOperationFactory'; 21import { MoveMenuOperation } from './MoveMenuOperation'; 22import { Log } from '../../utils/Log'; 23import router from '@ohos.router'; 24import { AlbumInfo } from '../../model/browser/album/AlbumInfo'; 25import { BroadCast } from '../../utils/BroadCast'; 26import { SelectManager } from '../../model/browser/SelectManager'; 27import { UserFileManagerAccess } from '../../access/UserFileManagerAccess'; 28import { AlbumDefine } from '../../model/browser/AlbumDefine'; 29 30const TAG: string = 'common_MoveOrCopyBroadCastProp'; 31 32interface ParamAlbumInfo { 33 item: string; 34 isFromFACard?: boolean; 35} 36 37export class MoveOrCopyBroadCastProp { 38 private broadCast: BroadCast | null = null; 39 40 private constructor() { 41 } 42 43 /** 44 * Get MoveOrCopyBroadCastProp instance 45 */ 46 public static getInstance(): MoveOrCopyBroadCastProp { 47 if (AppStorage.get<MoveOrCopyBroadCastProp>(Constants.INSTANCE_MOVE_OR_COPY_BROADCAST_PROP) == null) { 48 AppStorage.SetOrCreate(Constants.INSTANCE_MOVE_OR_COPY_BROADCAST_PROP, new MoveOrCopyBroadCastProp()); 49 } 50 return AppStorage.get<MoveOrCopyBroadCastProp>(Constants.INSTANCE_MOVE_OR_COPY_BROADCAST_PROP) as MoveOrCopyBroadCastProp; 51 } 52 53 /** 54 * sendMoveOrCopyBroadCast 55 * 56 * @param broadCast broadCast 57 */ 58 public sendMoveOrAddBroadCast(broadCast: BroadCast): void { 59 if (broadCast === null || broadCast === undefined) { 60 Log.error(TAG, 'sendMoveOrAddBroadCast error: null or undefined broadcast'); 61 return; 62 } 63 this.setBroadCast(broadCast); 64 65 /// 如果是系统相册,或者是新建相册从PickerPage界面添加图片的场景,直接添加到,而不是弹窗选择添加还是移动 66 let sourceAlbumUri = AppStorage.get<string>(Constants.APP_KEY_NEW_ALBUM_SOURCE); 67 let isOnlyAddAlbumSource: boolean = sourceAlbumUri === Constants.APP_NEW_ALBUM_SOURCE_PICKER; 68 if (!isOnlyAddAlbumSource) { 69 UserFileManagerAccess.getInstance().getSystemAlbumUriMap().forEach( 70 (value: string) => { 71 if (sourceAlbumUri === value) { 72 isOnlyAddAlbumSource = true; 73 return; 74 } 75 }); 76 } 77 if (isOnlyAddAlbumSource) { 78 this.addOperation(); 79 } else { 80 if (this.broadCast != null) { 81 this.broadCast.emit(BroadCastConstants.SHOW_COPY_OR_MOVE_DIALOG, 82 [async (): Promise<void> => await this.moveOperation(), async (): Promise<void> => await this.addOperation()]); 83 } 84 } 85 } 86 87 /** 88 * DoCopyOperation 89 * 90 * @param broadCast broadCast 91 */ 92 public doAddOperation(broadCast: BroadCast) { 93 if (broadCast === null || broadCast === undefined) { 94 Log.error(TAG, 'doCopyOperation error: null or undefined broadcast'); 95 return; 96 } 97 this.setBroadCast(broadCast); 98 this.addOperation(); 99 } 100 101 private setBroadCast(broadCast: BroadCast) { 102 this.broadCast = broadCast; 103 } 104 105 private async addOperation() { 106 let selectManager: SelectManager = AppStorage.get<SelectManager>(Constants.APP_KEY_NEW_ALBUM_SELECTED) as SelectManager;; 107 let targetAlbumName: string = AppStorage.get<string>(Constants.APP_KEY_NEW_ALBUM_TARGET) as string;; 108 let targetAlbumUri: string = AppStorage.get<string>(Constants.APP_KEY_NEW_ALBUM_TARGET_URI)as string; 109 if (this.broadCast === null || this.broadCast === undefined) { 110 Log.error(TAG, 'addOperation error: null or undefined broadcast'); 111 return; 112 } 113 114 let menuContext = new MenuContext(); 115 menuContext 116 .withSelectManager(selectManager) 117 .withOperationStartCallback((): void => this.onOperationStartBindImpl()) 118 .withOperationEndCallback(async (): Promise<void> => await this.onOperationEndBindImpl()) 119 .withBroadCast(this.broadCast) 120 menuContext.withTargetAlbumName(targetAlbumName).withAlbumUri(targetAlbumUri); 121 let menuOperation = MenuOperationFactory.getInstance().createMenuOperation(AddMenuOperation, menuContext); 122 menuOperation.doAction(); 123 } 124 125 private async moveOperation() { 126 let selectManager: SelectManager = AppStorage.get<SelectManager>(Constants.APP_KEY_NEW_ALBUM_SELECTED) as SelectManager; 127 let targetAlbumName: string = AppStorage.get<string>(Constants.APP_KEY_NEW_ALBUM_TARGET) as string; 128 let targetAlbumUri: string = AppStorage.get<string>(Constants.APP_KEY_NEW_ALBUM_TARGET_URI) as string; 129 if (this.broadCast === null || this.broadCast === undefined) { 130 Log.error(TAG, 'moveOperation error: null or undefined broadcast'); 131 return; 132 } 133 134 let menuContext = new MenuContext(); 135 menuContext 136 .withSelectManager(selectManager) 137 .withOperationStartCallback((): void => this.onOperationStartBindImpl()) 138 .withOperationEndCallback(async (): Promise<void> => await this.onOperationEndBindImpl()) 139 .withBroadCast(this.broadCast) 140 menuContext.withTargetAlbumName(targetAlbumName).withAlbumUri(targetAlbumUri); 141 let menuOperation = MenuOperationFactory.getInstance().createMenuOperation(MoveMenuOperation, menuContext); 142 menuOperation.doAction(); 143 } 144 145 private onOperationStart(): void { 146 this.onOperationStartBindImpl(); 147 } 148 149 private async onOperationEndBindImpl(): Promise<void> { 150 AppStorage.SetOrCreate(Constants.IS_DATA_FREEZE, false); 151 let isNewAlbum: boolean = AppStorage.get<boolean>(Constants.APP_KEY_NEW_ALBUM) as boolean; 152 let selectManager: SelectManager = AppStorage.get<SelectManager>(Constants.APP_KEY_NEW_ALBUM_SELECTED) as SelectManager; 153 let targetAlbumName: string = AppStorage.get<string>(Constants.APP_KEY_NEW_ALBUM_TARGET) as string; 154 155 let album = await UserFileManagerAccess.getInstance().getAlbumByName(targetAlbumName); 156 let albumInfo: AlbumInfo = new AlbumInfo(album); 157 albumInfo.setAlbumName(targetAlbumName); 158 let fetchOpt = AlbumDefine.getFileFetchOpt(); 159 let fetchResult = await album.getPhotoAssets(fetchOpt); 160 let count = fetchResult.getCount(); 161 fetchResult.close(); 162 albumInfo.setCount(count); 163 164 if (isNewAlbum) { 165 selectManager.onModeChange(false); 166 AppStorage.Delete(Constants.APP_KEY_NEW_ALBUM); 167 AppStorage.Delete(Constants.APP_KEY_NEW_ALBUM_TARGET); 168 AppStorage.Delete(Constants.APP_KEY_NEW_ALBUM_TARGET_URI); 169 AppStorage.Delete(Constants.APP_KEY_NEW_ALBUM_SELECTED); 170 router.pushUrl({ 171 url: 'pages/PhotoGridPage', 172 params: { 173 item: JSON.stringify(albumInfo), 174 } 175 }); 176 } else { 177 AppStorage.setOrCreate<ParamAlbumInfo>(Constants.KEY_OF_PHOTO_GRID_VIEW_ALBUM_ITEM, { 178 item: JSON.stringify(albumInfo) 179 }); 180 AppStorage.SetOrCreate(Constants.KEY_OF_ALBUM_URI, albumInfo.uri); 181 router.back({ 182 url: 'pages/index', 183 }); 184 } 185 } 186 187 private onOperationStartBindImpl(): void { 188 AppStorage.SetOrCreate(Constants.IS_DATA_FREEZE, true); 189 } 190 191 private async onOperationEnd(): Promise<void> { 192 await this.onOperationEndBindImpl(); 193 } 194}