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}