• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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}