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>( 51 Constants.INSTANCE_MOVE_OR_COPY_BROADCAST_PROP) as MoveOrCopyBroadCastProp; 52 } 53 54 /** 55 * sendMoveOrCopyBroadCast 56 * 57 * @param broadCast broadCast 58 */ 59 public sendMoveOrAddBroadCast(broadCast: BroadCast): void { 60 if (broadCast === null || broadCast === undefined) { 61 Log.error(TAG, 'sendMoveOrAddBroadCast error: null or undefined broadcast'); 62 return; 63 } 64 this.setBroadCast(broadCast); 65 66 /// 如果是系统相册,或者是新建相册从PickerPage界面添加图片的场景,直接添加到,而不是弹窗选择添加还是移动 67 let sourceAlbumUri = AppStorage.get<string>(Constants.APP_KEY_NEW_ALBUM_SOURCE); 68 let isOnlyAddAlbumSource: boolean = sourceAlbumUri === Constants.APP_NEW_ALBUM_SOURCE_PICKER; 69 if (!isOnlyAddAlbumSource) { 70 UserFileManagerAccess.getInstance().getSystemAlbumUriMap().forEach( 71 (value: string) => { 72 if (sourceAlbumUri === value) { 73 isOnlyAddAlbumSource = true; 74 return; 75 } 76 }); 77 } 78 if (isOnlyAddAlbumSource) { 79 this.addOperation(); 80 } else { 81 if (this.broadCast != null) { 82 this.broadCast.emit(BroadCastConstants.SHOW_COPY_OR_MOVE_DIALOG, 83 [async (): Promise<void> => await this.moveOperation(), 84 async (): Promise<void> => await this.addOperation()]); 85 } 86 } 87 } 88 89 /** 90 * DoCopyOperation 91 * 92 * @param broadCast broadCast 93 */ 94 public doAddOperation(broadCast: BroadCast) { 95 if (broadCast === null || broadCast === undefined) { 96 Log.error(TAG, 'doCopyOperation error: null or undefined broadcast'); 97 return; 98 } 99 this.setBroadCast(broadCast); 100 this.addOperation(); 101 } 102 103 private setBroadCast(broadCast: BroadCast) { 104 this.broadCast = broadCast; 105 } 106 107 private async addOperation() { 108 let selectManager: SelectManager = 109 AppStorage.get<SelectManager>(Constants.APP_KEY_NEW_ALBUM_SELECTED) as SelectManager; 110 let targetAlbumName: string = AppStorage.get<string>(Constants.APP_KEY_NEW_ALBUM_TARGET) as string; 111 let targetAlbumUri: string = AppStorage.get<string>(Constants.APP_KEY_NEW_ALBUM_TARGET_URI) as string; 112 if (this.broadCast === null || this.broadCast === undefined) { 113 Log.error(TAG, 'addOperation error: null or undefined broadcast'); 114 return; 115 } 116 117 let menuContext = new MenuContext(); 118 menuContext 119 .withSelectManager(selectManager) 120 .withOperationStartCallback((): void => this.onOperationStartBindImpl()) 121 .withOperationEndCallback(async (): Promise<void> => await this.onOperationEndBindImpl()) 122 .withBroadCast(this.broadCast) 123 menuContext.withTargetAlbumName(targetAlbumName).withAlbumUri(targetAlbumUri); 124 let menuOperation = MenuOperationFactory.getInstance().createMenuOperation(AddMenuOperation, menuContext); 125 menuOperation.doAction(); 126 } 127 128 private async moveOperation() { 129 let selectManager: SelectManager = 130 AppStorage.get<SelectManager>(Constants.APP_KEY_NEW_ALBUM_SELECTED) as SelectManager; 131 let targetAlbumName: string = AppStorage.get<string>(Constants.APP_KEY_NEW_ALBUM_TARGET) as string; 132 let targetAlbumUri: string = AppStorage.get<string>(Constants.APP_KEY_NEW_ALBUM_TARGET_URI) as string; 133 if (this.broadCast === null || this.broadCast === undefined) { 134 Log.error(TAG, 'moveOperation error: null or undefined broadcast'); 135 return; 136 } 137 138 let menuContext = new MenuContext(); 139 menuContext 140 .withSelectManager(selectManager) 141 .withOperationStartCallback((): void => this.onOperationStartBindImpl()) 142 .withOperationEndCallback(async (): Promise<void> => await this.onOperationEndBindImpl()) 143 .withBroadCast(this.broadCast) 144 menuContext.withTargetAlbumName(targetAlbumName).withAlbumUri(targetAlbumUri); 145 let menuOperation = MenuOperationFactory.getInstance().createMenuOperation(MoveMenuOperation, menuContext); 146 menuOperation.doAction(); 147 } 148 149 private onOperationStart(): void { 150 this.onOperationStartBindImpl(); 151 } 152 153 private async onOperationEndBindImpl(): Promise<void> { 154 AppStorage.setOrCreate(Constants.IS_DATA_FREEZE, false); 155 let isNewAlbum: boolean = AppStorage.get<boolean>(Constants.APP_KEY_NEW_ALBUM) as boolean; 156 let selectManager: SelectManager = 157 AppStorage.get<SelectManager>(Constants.APP_KEY_NEW_ALBUM_SELECTED) as SelectManager; 158 let targetAlbumName: string = AppStorage.get<string>(Constants.APP_KEY_NEW_ALBUM_TARGET) as string; 159 160 let album = await UserFileManagerAccess.getInstance().getAlbumByName(targetAlbumName); 161 let albumInfo: AlbumInfo = new AlbumInfo(album); 162 albumInfo.setAlbumName(targetAlbumName); 163 let fetchOpt = AlbumDefine.getFileFetchOpt(); 164 let fetchResult = await album.getPhotoAssets(fetchOpt); 165 let count = fetchResult.getCount(); 166 fetchResult.close(); 167 albumInfo.setCount(count); 168 169 if (isNewAlbum) { 170 selectManager.onModeChange(false); 171 AppStorage.delete(Constants.APP_KEY_NEW_ALBUM); 172 AppStorage.delete(Constants.APP_KEY_NEW_ALBUM_TARGET); 173 AppStorage.delete(Constants.APP_KEY_NEW_ALBUM_TARGET_URI); 174 AppStorage.delete(Constants.APP_KEY_NEW_ALBUM_SELECTED); 175 router.pushUrl({ 176 url: 'pages/PhotoGridPage', 177 params: { 178 item: JSON.stringify(albumInfo), 179 } 180 }); 181 } else { 182 AppStorage.setOrCreate<ParamAlbumInfo>(Constants.KEY_OF_PHOTO_GRID_VIEW_ALBUM_ITEM, { 183 item: JSON.stringify(albumInfo) 184 }); 185 AppStorage.setOrCreate(Constants.KEY_OF_ALBUM_URI, albumInfo.uri); 186 router.back({ 187 url: 'pages/index', 188 }); 189 } 190 } 191 192 private onOperationStartBindImpl(): void { 193 AppStorage.setOrCreate(Constants.IS_DATA_FREEZE, true); 194 } 195 196 private async onOperationEnd(): Promise<void> { 197 await this.onOperationEndBindImpl(); 198 } 199}