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}