• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2022 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 deviceInfo from '@ohos.deviceInfo';
17import window from '@ohos.window';
18import Ability from '@ohos.app.ability.UIAbility';
19import wantConstant from '@ohos.ability.wantConstant';
20import { Log } from '@ohos/base/src/main/ets/utils/Log';
21import screenManager from '@ohos/base/src/main/ets/manager/ScreenManager';
22import { Constants } from '../common/model/common/Constants';
23import broadcastManager from '@ohos/base/src/main/ets/manager/BroadcastManager';
24import { startTrace, finishTrace } from '@ohos/base/src/main/ets/utils/TraceControllerUtils';
25import { BroadcastConstants } from '@ohos/base/src/main/ets/constants/BroadcastConstants';
26import mediaModel from '@ohos/base/src/main/ets/model/MediaModel';
27import router from '@system.router';
28import { GroupItemDataSource } from '@ohos/base/src/main/ets/vm/GroupItemDataSource';
29import atManager from '@ohos.abilityAccessCtrl';
30import bundleManager from '@ohos.bundle.bundleManager';
31import { MediaConstants } from '@ohos/base/src/main/ets/constants/MediaConstants';
32import { getResourceString } from '@ohos/base/src/main/ets/utils/ResourceUtils';
33
34let isFromCard = false;
35let mCallerUid: number = 0;
36let mMaxSelectCount: number = 0;
37let mFilterMediaType: number = MediaConstants.SELECT_TYPE_ALL;
38let appBroadcast = broadcastManager.getBroadcast();
39var pagePath: string = deviceInfo.deviceType == 'phone' || deviceInfo.deviceType == 'default' ? 'product/phone/view/index' : 'product/pad/view/index';
40
41export default class MainAbility extends Ability {
42    private TAG: string = 'MainAbility';
43    private static readonly RETRY_MAX_TIMES = 100;
44    private static readonly ACTION_URI_SINGLE_SELECT = 'singleselect';
45    private static readonly ACTION_URI_MULTIPLE_SELECT = 'multipleselect';
46    private static readonly ACTION_URI_PHOTO_DETAIL = 'photodetail';
47    private browserDataSource : GroupItemDataSource = new GroupItemDataSource();
48
49    onCreate(want, launchParam) {
50        Log.info(this.TAG, 'Application onCreate');
51        startTrace('onCreate');
52        // Ability is creating, initialize resources for this ability
53        globalThis.appContext = this.context;
54        mediaModel.onCreate(this.context);
55        let action = want.parameters;
56        if (action != null && action != undefined && action?.filterMediaType == MediaConstants.FILTER_MEDIA_TYPE_IMAGE) {
57            mFilterMediaType = MediaConstants.SELECT_TYPE_IMAGE;
58        } else if (action?.filterMediaType == MediaConstants.FILTER_MEDIA_TYPE_VIDEO) {
59            mFilterMediaType = MediaConstants.SELECT_TYPE_VIDEO;
60        } else {
61            mFilterMediaType = MediaConstants.SELECT_TYPE_ALL;
62        }
63        if (action != null && action != undefined && action.uri == MainAbility.ACTION_URI_PHOTO_DETAIL) {
64            AppStorage.SetOrCreate(Constants.ENTRY_FROM_HAP, Constants.ENTRY_FROM_CAMERA);
65            this.browserDataSource.reloadGroupItemData(false).then(()=> {
66                if (this.browserDataSource.groupDataItem.length == 0) {
67                    this.onDestroy();
68                }
69            })
70        } else if (action != null && action != undefined && action.uri == MainAbility.ACTION_URI_SINGLE_SELECT) {
71            mCallerUid = action[Constants.KEY_WANT_PARAMETERS_CALLERUID];
72            mMaxSelectCount = action?.maxSelectCount;
73            AppStorage.SetOrCreate(Constants.ENTRY_FROM_HAP, Constants.ENTRY_FROM_SINGLE_SELECT);
74        } else if (action != null && action != undefined && action.uri == MainAbility.ACTION_URI_MULTIPLE_SELECT) {
75            mCallerUid = action[Constants.KEY_WANT_PARAMETERS_CALLERUID];
76            mMaxSelectCount = action?.maxSelectCount;
77            AppStorage.SetOrCreate(Constants.ENTRY_FROM_HAP, Constants.ENTRY_FROM_MULTIPLE_SELECT);
78        } else if (action != null && action != undefined && action.uri == Constants.ACTION_URI_FORM_ABILITY) {
79            isFromCard = true;
80            AppStorage.SetOrCreate(Constants.ENTRY_FROM_HAP, Constants.ENTRY_FROM_FORM_ABILITY);
81            AppStorage.SetOrCreate(Constants.FROM_ALBUM_ID, action.albumId);
82            AppStorage.SetOrCreate(Constants.FROM_CURRENT_INDEX, action.currentIndex);
83        } else if (action != null && action != undefined && action.uri == Constants.ACTION_URI_FORM_ABILITY_NONE) {
84            AppStorage.SetOrCreate(Constants.ENTRY_FROM_HAP, Constants.ENTRY_FROM_FORM_ABILITY_NONE);
85        } else if (action != null && action != undefined && action['formId'] != null) {
86            AppStorage.SetOrCreate(Constants.FA_SETTING_FROM_ID, action['formId']);
87            AppStorage.SetOrCreate(Constants.ENTRY_FROM_HAP, Constants.ENTRY_FROM_FORM_FORM_EDITOR);
88        } else if (want.action == wantConstant.Action.ACTION_VIEW_DATA) {
89            AppStorage.SetOrCreate(Constants.ENTRY_FROM_HAP, Constants.ENTRY_FROM_VIEW_DATA);
90            AppStorage.SetOrCreate(Constants.VIEW_DATA_URI, want.uri);
91            action && AppStorage.SetOrCreate(Constants.VIEW_DATA_POS, action.index);
92        } else {
93            AppStorage.SetOrCreate(Constants.ENTRY_FROM_HAP, Constants.ENTRY_FROM_NONE);
94        }
95        bundleManager.getApplicationInfo(Constants.BUNDLE_NAME, 0, (error, appInfo) => {
96           if (error) {
97                Log.error(this.TAG, `getApplicationInfo error: ${error}`);
98                return;
99            }
100           let requestPermissionList: Array<string> = [
101               "ohos.permission.READ_MEDIA",
102               "ohos.permission.WRITE_MEDIA",
103               "ohos.permission.MEDIA_LOCATION",
104               "ohos.permission.DISTRIBUTED_DATASYNC"
105           ];
106           for (let permission of requestPermissionList) {
107               // @ts-ignore
108               atManager.createAtManager().checkAccessToken(appInfo.accessTokenId, permission).then((status) => {
109                   if (status == atManager.GrantStatus.PERMISSION_DENIED) {
110                       Log.error(this.TAG, `Failed to checkAccessToken permission = ${permission}`);
111                   }
112               })
113           }
114       })
115        finishTrace('onCreate');
116        appBroadcast.on(BroadcastConstants.THIRD_ROUTE_PAGE, this.thirdRouterPage.bind(this));
117        Log.info(this.TAG, 'Application onCreate end');
118    }
119
120    onNewWant(want) {
121        startTrace('onNewWant');
122        let action = want.parameters;
123        if (action != null && action != undefined && action.uri == MainAbility.ACTION_URI_PHOTO_DETAIL) {
124            AppStorage.SetOrCreate(Constants.ENTRY_FROM_HAP, Constants.ENTRY_FROM_CAMERA);
125        } else if (action != null && action != undefined && action.uri == MainAbility.ACTION_URI_SINGLE_SELECT) {
126            mCallerUid = action[Constants.KEY_WANT_PARAMETERS_CALLERUID];
127            mMaxSelectCount = action?.maxSelectCount;
128            mFilterMediaType = action?.filterMediaType;
129            AppStorage.SetOrCreate(Constants.ENTRY_FROM_HAP, Constants.ENTRY_FROM_SINGLE_SELECT);
130        } else if (action != null && action != undefined && action.uri == MainAbility.ACTION_URI_MULTIPLE_SELECT) {
131            mCallerUid = action[Constants.KEY_WANT_PARAMETERS_CALLERUID];
132            mMaxSelectCount = action?.maxSelectCount;
133            mFilterMediaType = action?.filterMediaType;
134            AppStorage.SetOrCreate(Constants.ENTRY_FROM_HAP, Constants.ENTRY_FROM_MULTIPLE_SELECT);
135        } else if (action != null && action != undefined && action.uri == Constants.ACTION_URI_FORM_ABILITY) {
136            AppStorage.SetOrCreate(Constants.ENTRY_FROM_HAP, Constants.ENTRY_FROM_FORM_ABILITY);
137            AppStorage.SetOrCreate(Constants.FROM_ALBUM_ID, action.albumId);
138            AppStorage.SetOrCreate(Constants.FROM_CURRENT_INDEX, action.currentIndex);
139        } else if (action != null && action != undefined && action.uri == Constants.ACTION_URI_FORM_ABILITY_NONE) {
140            AppStorage.SetOrCreate(Constants.ENTRY_FROM_HAP, Constants.ENTRY_FROM_FORM_ABILITY_NONE);
141        } else if (action != null && action != undefined && action['formId'] != null) {
142            AppStorage.SetOrCreate(Constants.FA_SETTING_FROM_ID, action['formId']);
143            AppStorage.SetOrCreate(Constants.ENTRY_FROM_HAP, Constants.ENTRY_FROM_FORM_FORM_EDITOR);
144        } else if (want.action == wantConstant.Action.ACTION_VIEW_DATA) {
145            AppStorage.SetOrCreate(Constants.ENTRY_FROM_HAP, Constants.ENTRY_FROM_VIEW_DATA);
146            AppStorage.SetOrCreate(Constants.VIEW_DATA_URI, want.uri);
147            action && AppStorage.SetOrCreate(Constants.VIEW_DATA_POS, action.index);
148        } else {
149            AppStorage.SetOrCreate(Constants.ENTRY_FROM_HAP, Constants.ENTRY_FROM_NONE);
150        }
151        finishTrace('onNewWant');
152    }
153
154    onDestroy() {
155        // Ability is creating, release resources for this ability
156        Log.info(this.TAG, 'Application onDestroy');
157        AppStorage.Delete(Constants.ENTRY_FROM_HAP);
158    }
159
160    onWindowStageCreate(windowStage) {
161        startTrace('onWindowStageCreate');
162        // Main window is created, set main page for this ability
163        Log.info(this.TAG, 'Application onWindowStageCreate');
164        globalThis.photosWindowStage = windowStage;
165        startTrace('getMainWindow');
166        windowStage.getMainWindow().then((win: window.Window) => {
167            AppStorage.SetOrCreate(Constants.MAIN_WINDOW, win);
168            finishTrace('getMainWindow');
169            startTrace('initializationSize');
170            screenManager.initializationSize(win).then(() => {
171                finishTrace('initializationSize');
172                if (isFromCard) {
173                    windowStage.setUIContent(this.context, 'feature/browser/view/PhotoBrowser', null);
174                } else {
175                    windowStage.setUIContent(this.context, pagePath, null);
176                }
177                finishTrace('onWindowStageCreate');
178            }).catch(() => {
179                Log.error(this.TAG, `get device screen info failed.`);
180            });
181        });
182    }
183
184    onWindowStageDestroy() {
185    }
186
187    onForeground() {
188    }
189
190    onBackground() {
191    }
192
193    async thirdRouterPage() {
194        let entryFrom = AppStorage.Get(Constants.ENTRY_FROM_HAP);
195        Log.info(this.TAG, `thirdRouterPage entryFromHap: ${entryFrom}`);
196        if (entryFrom == Constants.ENTRY_FROM_NONE) {
197            return;
198        }
199        if (entryFrom == Constants.ENTRY_FROM_CAMERA) {
200            let options = {
201                uri: 'feature/browser/view/PhotoBrowser',
202                params: {
203                    pageFrom: Constants.ENTRY_FROM.CAMERA
204                }
205            };
206            router.replace(options);
207        } else if (entryFrom == Constants.ENTRY_FROM_SINGLE_SELECT || entryFrom == Constants.ENTRY_FROM_MULTIPLE_SELECT) {
208            let bundleName: string = await bundleManager.getBundleNameByUid(mCallerUid);
209            let displayName = await getResourceString($r('app.string.album_all'));
210            let options = {
211                uri: 'feature/thirdSelect/view/ThirdSelectPhotoGridPage',
212                params: {
213                    itemCoverUri: '',
214                    itemId: MediaConstants.ALBUM_ID_ALL,
215                    itemCount: 0,
216                    isMultiPick: entryFrom == Constants.ENTRY_FROM_MULTIPLE_SELECT ? true : false,
217                    isFromWallpaper: false,
218                    maxSelectCount: mMaxSelectCount,
219                    itemDisplayName: displayName,
220                    isFromFa: false,
221                    bundleName: bundleName,
222                    filterMediaType: mFilterMediaType
223                }
224            };
225            router.replace(options);
226        } else if (entryFrom == Constants.ENTRY_FROM_FORM_ABILITY) {
227            let options = {
228                uri: 'feature/browser/view/PhotoBrowser',
229            };
230            router.replace(options);
231        } else if (entryFrom == Constants.ENTRY_FROM_FORM_ABILITY_NONE) {
232            let options = {
233                uri: pagePath
234            }
235            router.replace(options);
236        } else if (entryFrom == Constants.ENTRY_FROM_FORM_FORM_EDITOR) {
237            let options = {
238                uri: 'feature/formEditor/view/FormEditorPage'
239            }
240            router.replace(options);
241        } else if (entryFrom == Constants.ENTRY_FROM_VIEW_DATA) {
242            let options = {
243                uri: 'feature/browser/view/PhotoBrowser',
244                params: {
245                    pageFrom: Constants.ENTRY_FROM.VIEW_DATA,
246                    viewData: AppStorage.Get(Constants.VIEW_DATA_URI),
247                    position: AppStorage.Get(Constants.VIEW_DATA_POS),
248                }
249            };
250            router.replace(options);
251        }
252
253        //router.clear()需要等页面跳转完成后调用,如果不延时调用会发生崩溃。
254        setTimeout(() => {
255            router.clear();
256            AppStorage.SetOrCreate(Constants.ENTRY_FROM_HAP, 0)
257        }, 10);
258    }
259}