1c5c2eed7Sopenharmony_ci/* 2c5c2eed7Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd. 3c5c2eed7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c5c2eed7Sopenharmony_ci * you may not use this file except in compliance with the License. 5c5c2eed7Sopenharmony_ci * You may obtain a copy of the License at 6c5c2eed7Sopenharmony_ci * 7c5c2eed7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c5c2eed7Sopenharmony_ci * 9c5c2eed7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c5c2eed7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c5c2eed7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c5c2eed7Sopenharmony_ci * See the License for the specific language governing permissions and 13c5c2eed7Sopenharmony_ci * limitations under the License. 14c5c2eed7Sopenharmony_ci */ 15c5c2eed7Sopenharmony_ci 16c5c2eed7Sopenharmony_ciimport abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl'; 17c5c2eed7Sopenharmony_ciimport bundleManager from '@ohos.bundle.bundleManager'; 18c5c2eed7Sopenharmony_ciimport rpc from '@ohos.rpc'; 19c5c2eed7Sopenharmony_ciimport window from '@ohos.window'; 20c5c2eed7Sopenharmony_ciimport common from '@ohos.app.ability.common'; 21c5c2eed7Sopenharmony_ciimport pasteboard from '@ohos.pasteboard'; 22c5c2eed7Sopenharmony_ciimport { BusinessError } from '@ohos.base'; 23c5c2eed7Sopenharmony_ciimport { CustomContentDialog } from '@ohos.arkui.advanced.Dialog'; 24c5c2eed7Sopenharmony_ciimport { 25c5c2eed7Sopenharmony_ci Log, 26c5c2eed7Sopenharmony_ci getPermissionGroup, 27c5c2eed7Sopenharmony_ci titleTrim, 28c5c2eed7Sopenharmony_ci getPermissionLabel, 29c5c2eed7Sopenharmony_ci getFontSizeScale, 30c5c2eed7Sopenharmony_ci getLimitFontSize 31c5c2eed7Sopenharmony_ci} from '../common/utils/utils'; 32c5c2eed7Sopenharmony_ciimport { GroupInfo, WantInfo } from '../common/model/typedef'; 33c5c2eed7Sopenharmony_ciimport { GlobalContext } from '../common/utils/globalContext'; 34c5c2eed7Sopenharmony_ciimport Constants from '../common/utils/constant'; 35c5c2eed7Sopenharmony_ciimport { showSubPermissionsGroup, userGrantPermissions } from '../common/model/permissionGroup'; 36c5c2eed7Sopenharmony_ciimport { LocationCanvas } from '../common/components/location'; 37c5c2eed7Sopenharmony_ci 38c5c2eed7Sopenharmony_ci@Extend(Button)function customizeButton() { 39c5c2eed7Sopenharmony_ci .buttonStyle(ButtonStyleMode.TEXTUAL) 40c5c2eed7Sopenharmony_ci .fontColor($r('sys.color.font_emphasize')) 41c5c2eed7Sopenharmony_ci .width(Constants.HALF_LENGTH) 42c5c2eed7Sopenharmony_ci} 43c5c2eed7Sopenharmony_ci 44c5c2eed7Sopenharmony_ciconst FUZZY_LOCATION_PERMISSION = 'ohos.permission.APPROXIMATELY_LOCATION'; 45c5c2eed7Sopenharmony_ciconst PRECISE_LOCATION_PERMISSION = 'ohos.permission.LOCATION'; 46c5c2eed7Sopenharmony_ciconst PASTE = 'ohos.permission.READ_PASTEBOARD'; 47c5c2eed7Sopenharmony_ciconst APP_TRACKING_CONSENT = 'ohos.permission.APP_TRACKING_CONSENT'; 48c5c2eed7Sopenharmony_ciconst DOWNLOAD_PERMISSION = 'ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY'; 49c5c2eed7Sopenharmony_ciconst DESKTOP_PERMISSION = 'ohos.permission.READ_WRITE_DESKTOP_DIRECTORY'; 50c5c2eed7Sopenharmony_ciconst DOCUMENTS_PERMISSION = 'ohos.permission.READ_WRITE_DOCUMENTS_DIRECTORY'; 51c5c2eed7Sopenharmony_ciconst fuzzyMarks = [Constants.LOCATION_FUZZY, Constants.LOCATION_BOTH_FUZZY, Constants.LOCATION_BOTH_PRECISE]; 52c5c2eed7Sopenharmony_ciconst preciseMarks = [Constants.LOCATION_UPGRADE, Constants.LOCATION_BOTH_PRECISE]; 53c5c2eed7Sopenharmony_cilet storage = LocalStorage.getShared(); 54c5c2eed7Sopenharmony_ci 55c5c2eed7Sopenharmony_ci@Entry(storage) 56c5c2eed7Sopenharmony_ci@Component 57c5c2eed7Sopenharmony_cistruct dialogPlusPage { 58c5c2eed7Sopenharmony_ci @LocalStorageLink('want') want: WantInfo = new WantInfo([]); 59c5c2eed7Sopenharmony_ci @LocalStorageLink('win') win: window.Window = {} as window.Window; 60c5c2eed7Sopenharmony_ci private context = getContext(this) as common.ServiceExtensionContext; 61c5c2eed7Sopenharmony_ci @State count: number = 0; 62c5c2eed7Sopenharmony_ci @State result: Array<number> = []; 63c5c2eed7Sopenharmony_ci @State accessTokenId: number = 0; 64c5c2eed7Sopenharmony_ci @State initStatus: number = Constants.INIT_NEED_TO_WAIT; 65c5c2eed7Sopenharmony_ci @State reqPerms: Array<string> = []; 66c5c2eed7Sopenharmony_ci @State grantGroups: Array<GroupInfo> = []; 67c5c2eed7Sopenharmony_ci @State userFixedFlag: number = 2; // means user fixed 68c5c2eed7Sopenharmony_ci @State grantStatus: number = -1; 69c5c2eed7Sopenharmony_ci @State appName: string = ''; 70c5c2eed7Sopenharmony_ci @State locationFlag: number = Constants.LOCATION_NONE; 71c5c2eed7Sopenharmony_ci @State reqPermissionDetails: bundleManager.ReqPermissionDetail[] = []; 72c5c2eed7Sopenharmony_ci @State refresh: number = 0; 73c5c2eed7Sopenharmony_ci @State pasteBoardName: string = ''; 74c5c2eed7Sopenharmony_ci @State isUpdate: number = -1; 75c5c2eed7Sopenharmony_ci 76c5c2eed7Sopenharmony_ci dialogController: CustomDialogController | null = new CustomDialogController({ 77c5c2eed7Sopenharmony_ci builder: CustomContentDialog({ 78c5c2eed7Sopenharmony_ci contentBuilder: () => { 79c5c2eed7Sopenharmony_ci this.buildContent(); 80c5c2eed7Sopenharmony_ci }, 81c5c2eed7Sopenharmony_ci contentAreaPadding: { right: 0 } 82c5c2eed7Sopenharmony_ci }), 83c5c2eed7Sopenharmony_ci autoCancel: false 84c5c2eed7Sopenharmony_ci }); 85c5c2eed7Sopenharmony_ci 86c5c2eed7Sopenharmony_ci @Builder 87c5c2eed7Sopenharmony_ci buildContent(): void { 88c5c2eed7Sopenharmony_ci Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { 89c5c2eed7Sopenharmony_ci Column() { 90c5c2eed7Sopenharmony_ci if ((this.initStatus != Constants.INIT_NEED_TO_WAIT) && this.verify()) { 91c5c2eed7Sopenharmony_ci Image(this.currentGroup().icon) 92c5c2eed7Sopenharmony_ci .width(Constants.DIALOG_ICON_WIDTH) 93c5c2eed7Sopenharmony_ci .height(Constants.DIALOG_ICON_HEIGHT) 94c5c2eed7Sopenharmony_ci .fillColor($r('sys.color.font_primary')) 95c5c2eed7Sopenharmony_ci .margin({ top: Constants.DIALOG_ICON_MARGIN_TOP }) 96c5c2eed7Sopenharmony_ci if (this.grantGroups.length > 1) { 97c5c2eed7Sopenharmony_ci Text(`${this.count + 1} / ${this.grantGroups.length}`) 98c5c2eed7Sopenharmony_ci .fontSize(Constants.DIALOG_LABEL_FONT_SIZE) 99c5c2eed7Sopenharmony_ci .fontColor($r('sys.color.font_secondary')) 100c5c2eed7Sopenharmony_ci .lineHeight(Constants.DIALOG_LABEL_LINE_HEIGHT) 101c5c2eed7Sopenharmony_ci .margin({ top: Constants.DIALOG_LABEL_MARGIN_TOP }) 102c5c2eed7Sopenharmony_ci } 103c5c2eed7Sopenharmony_ci Scroll() { 104c5c2eed7Sopenharmony_ci Column() { 105c5c2eed7Sopenharmony_ci Row() { 106c5c2eed7Sopenharmony_ci Column() { 107c5c2eed7Sopenharmony_ci Text($r(this.showTitle(), this.appName)) 108c5c2eed7Sopenharmony_ci .textAlign(TextAlign.Center) 109c5c2eed7Sopenharmony_ci .fontSize($r('sys.float.Title_S')) 110c5c2eed7Sopenharmony_ci .fontColor($r('sys.color.font_primary')) 111c5c2eed7Sopenharmony_ci .fontWeight(FontWeight.Bold) 112c5c2eed7Sopenharmony_ci .textOverflow({ overflow: TextOverflow.Ellipsis }) 113c5c2eed7Sopenharmony_ci .maxLines(Constants.SECURITY_HEADER_MAX_LINES) 114c5c2eed7Sopenharmony_ci .minFontSize( 115c5c2eed7Sopenharmony_ci getLimitFontSize(getFontSizeScale(), 116c5c2eed7Sopenharmony_ci Constants.DIALOG_TITLE_MAX_SCALE, 117c5c2eed7Sopenharmony_ci $r('sys.float.Subtitle_M'), 118c5c2eed7Sopenharmony_ci $r('sys.float.Title_S')) 119c5c2eed7Sopenharmony_ci ) 120c5c2eed7Sopenharmony_ci .maxFontSize( 121c5c2eed7Sopenharmony_ci getLimitFontSize(getFontSizeScale(), 122c5c2eed7Sopenharmony_ci Constants.DIALOG_TITLE_MAX_SCALE, 123c5c2eed7Sopenharmony_ci $r('sys.float.Title_S'), 124c5c2eed7Sopenharmony_ci $r('sys.float.Title_S')) 125c5c2eed7Sopenharmony_ci ) 126c5c2eed7Sopenharmony_ci .heightAdaptivePolicy(TextHeightAdaptivePolicy.MIN_FONT_SIZE_FIRST) 127c5c2eed7Sopenharmony_ci } 128c5c2eed7Sopenharmony_ci .constraintSize({ minHeight: Constants.HEADLINE_HEIGHT }) 129c5c2eed7Sopenharmony_ci .justifyContent(FlexAlign.Center) 130c5c2eed7Sopenharmony_ci .padding({ 131c5c2eed7Sopenharmony_ci top: Constants.DEFAULT_PADDING_TOP, 132c5c2eed7Sopenharmony_ci bottom: Constants.DEFAULT_PADDING_BOTTOM, 133c5c2eed7Sopenharmony_ci left: Constants.PADDING_24, 134c5c2eed7Sopenharmony_ci right: Constants.PADDING_24 135c5c2eed7Sopenharmony_ci }) 136c5c2eed7Sopenharmony_ci } 137c5c2eed7Sopenharmony_ci 138c5c2eed7Sopenharmony_ci Row() { 139c5c2eed7Sopenharmony_ci Flex({ justifyContent: FlexAlign.Center }) { 140c5c2eed7Sopenharmony_ci Text() { 141c5c2eed7Sopenharmony_ci if ( 142c5c2eed7Sopenharmony_ci this.currentGroup().name === 'LOCATION' && 143c5c2eed7Sopenharmony_ci ((this.locationFlag == Constants.LOCATION_FUZZY) || 144c5c2eed7Sopenharmony_ci (this.locationFlag == Constants.LOCATION_BOTH_FUZZY)) 145c5c2eed7Sopenharmony_ci ) { 146c5c2eed7Sopenharmony_ci Span($r('app.string.close_exact_position')) 147c5c2eed7Sopenharmony_ci } else if (this.currentGroup().name === 'PASTEBOARD') { 148c5c2eed7Sopenharmony_ci if (this.pasteBoardName) { 149c5c2eed7Sopenharmony_ci Span($r('app.string.pasteBoard_app', this.pasteBoardName)) 150c5c2eed7Sopenharmony_ci } else { 151c5c2eed7Sopenharmony_ci Span($r('app.string.pasteBoard_desc')) 152c5c2eed7Sopenharmony_ci } 153c5c2eed7Sopenharmony_ci } else { 154c5c2eed7Sopenharmony_ci if (this.currentGroup().description.length > 0) { 155c5c2eed7Sopenharmony_ci ForEach(this.currentGroup().description, (item: ResourceStr) => { 156c5c2eed7Sopenharmony_ci Span(item) 157c5c2eed7Sopenharmony_ci }) 158c5c2eed7Sopenharmony_ci Span(this.currentGroup().reason ? $r('app.string.comma') : $r('app.string.period')) 159c5c2eed7Sopenharmony_ci } 160c5c2eed7Sopenharmony_ci Span(this.refresh >= 0 ? this.currentGroup().reason : '') 161c5c2eed7Sopenharmony_ci } 162c5c2eed7Sopenharmony_ci } 163c5c2eed7Sopenharmony_ci .textAlign(TextAlign.Start) 164c5c2eed7Sopenharmony_ci .fontColor($r('sys.color.font_primary')) 165c5c2eed7Sopenharmony_ci .fontSize($r('sys.float.Body_L')) 166c5c2eed7Sopenharmony_ci .maxFontScale(Constants.DIALOG_TEXT_MAX_SCALE) 167c5c2eed7Sopenharmony_ci .margin({ 168c5c2eed7Sopenharmony_ci left: Constants.DIALOG_DESP_MARGIN_LEFT, 169c5c2eed7Sopenharmony_ci right: Constants.DIALOG_DESP_MARGIN_RIGHT, 170c5c2eed7Sopenharmony_ci bottom: Constants.DIALOG_DESP_MARGIN_BOTTOM 171c5c2eed7Sopenharmony_ci }) 172c5c2eed7Sopenharmony_ci } 173c5c2eed7Sopenharmony_ci } 174c5c2eed7Sopenharmony_ci 175c5c2eed7Sopenharmony_ci if (this.locationFlag > Constants.LOCATION_NONE && this.currentGroup().name === 'LOCATION') { 176c5c2eed7Sopenharmony_ci LocationCanvas({ locationFlag: $locationFlag }) 177c5c2eed7Sopenharmony_ci } 178c5c2eed7Sopenharmony_ci } 179c5c2eed7Sopenharmony_ci }.constraintSize({ maxHeight: Constants.MAXIMUM_HEADER_HEIGHT }) 180c5c2eed7Sopenharmony_ci if (this.currentGroup().name === 'LOCATION') { 181c5c2eed7Sopenharmony_ci Column() { 182c5c2eed7Sopenharmony_ci Button($r('app.string.allowed_only_during_use')) 183c5c2eed7Sopenharmony_ci .customizeButton() 184c5c2eed7Sopenharmony_ci .width(Constants.FULL_WIDTH) 185c5c2eed7Sopenharmony_ci .margin({ bottom: Constants.MARGIN_4 }) 186c5c2eed7Sopenharmony_ci .onClick(() => { 187c5c2eed7Sopenharmony_ci this.privacyAccept( 188c5c2eed7Sopenharmony_ci this.grantGroups[this.count], this.accessTokenId, this.reqPerms, this.userFixedFlag 189c5c2eed7Sopenharmony_ci ) 190c5c2eed7Sopenharmony_ci }) 191c5c2eed7Sopenharmony_ci Button($r('app.string.allow_this_time')) 192c5c2eed7Sopenharmony_ci .customizeButton() 193c5c2eed7Sopenharmony_ci .width(Constants.FULL_WIDTH) 194c5c2eed7Sopenharmony_ci .margin({ bottom: Constants.MARGIN_4 }) 195c5c2eed7Sopenharmony_ci .onClick(() => { 196c5c2eed7Sopenharmony_ci this.privacyAccept( 197c5c2eed7Sopenharmony_ci this.grantGroups[this.count], 198c5c2eed7Sopenharmony_ci this.accessTokenId, 199c5c2eed7Sopenharmony_ci this.reqPerms, 200c5c2eed7Sopenharmony_ci Constants.PERMISSION_ALLOW_THIS_TIME 201c5c2eed7Sopenharmony_ci ) 202c5c2eed7Sopenharmony_ci }) 203c5c2eed7Sopenharmony_ci Button($r('app.string.cancel')) 204c5c2eed7Sopenharmony_ci .customizeButton() 205c5c2eed7Sopenharmony_ci .width(Constants.FULL_WIDTH) 206c5c2eed7Sopenharmony_ci .onClick(() => { 207c5c2eed7Sopenharmony_ci this.count ++; 208c5c2eed7Sopenharmony_ci }) 209c5c2eed7Sopenharmony_ci } 210c5c2eed7Sopenharmony_ci .padding({ left: Constants.PADDING_16, right: Constants.PADDING_16 }) 211c5c2eed7Sopenharmony_ci } else { 212c5c2eed7Sopenharmony_ci Row() { 213c5c2eed7Sopenharmony_ci Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) { 214c5c2eed7Sopenharmony_ci Button($r('app.string.ban')) 215c5c2eed7Sopenharmony_ci .onClick(() => { 216c5c2eed7Sopenharmony_ci this.privacyCancel( 217c5c2eed7Sopenharmony_ci this.grantGroups[this.count], this.accessTokenId, this.reqPerms, this.userFixedFlag 218c5c2eed7Sopenharmony_ci ) 219c5c2eed7Sopenharmony_ci }).customizeButton() 220c5c2eed7Sopenharmony_ci Divider() 221c5c2eed7Sopenharmony_ci .color($r('sys.color.comp_divider')) 222c5c2eed7Sopenharmony_ci .vertical(true) 223c5c2eed7Sopenharmony_ci .strokeWidth(Constants.DIALOG_DIVIDER) 224c5c2eed7Sopenharmony_ci .height(Constants.DIVIDER_HEIGHT) 225c5c2eed7Sopenharmony_ci .opacity(0.2) 226c5c2eed7Sopenharmony_ci .margin({ left: Constants.MARGIN_8, right: Constants.MARGIN_8 }) 227c5c2eed7Sopenharmony_ci Button( 228c5c2eed7Sopenharmony_ci this.currentGroup().name === 'PASTEBOARD' ? $r('app.string.This_time_only') : $r('app.string.allow') 229c5c2eed7Sopenharmony_ci ) 230c5c2eed7Sopenharmony_ci .onClick(() => { 231c5c2eed7Sopenharmony_ci this.privacyAccept( 232c5c2eed7Sopenharmony_ci this.grantGroups[this.count], 233c5c2eed7Sopenharmony_ci this.accessTokenId, 234c5c2eed7Sopenharmony_ci this.reqPerms, 235c5c2eed7Sopenharmony_ci this.currentGroup().name === 'PASTEBOARD' ? 236c5c2eed7Sopenharmony_ci Constants.PERMISSION_ALLOW_THIS_TIME : this.userFixedFlag 237c5c2eed7Sopenharmony_ci ) 238c5c2eed7Sopenharmony_ci }).customizeButton() 239c5c2eed7Sopenharmony_ci }.margin({ 240c5c2eed7Sopenharmony_ci left: Constants.BUTTON_MARGIN_LEFT, 241c5c2eed7Sopenharmony_ci right: Constants.BUTTON_MARGIN_RIGHT, 242c5c2eed7Sopenharmony_ci bottom: Constants.MARGIN_8 243c5c2eed7Sopenharmony_ci }) 244c5c2eed7Sopenharmony_ci } 245c5c2eed7Sopenharmony_ci } 246c5c2eed7Sopenharmony_ci } 247c5c2eed7Sopenharmony_ci } 248c5c2eed7Sopenharmony_ci .padding({ bottom: Constants.PADDING_8 }) 249c5c2eed7Sopenharmony_ci .clip(true) 250c5c2eed7Sopenharmony_ci } 251c5c2eed7Sopenharmony_ci } 252c5c2eed7Sopenharmony_ci 253c5c2eed7Sopenharmony_ci build() {} 254c5c2eed7Sopenharmony_ci 255c5c2eed7Sopenharmony_ci showTitle(): string { 256c5c2eed7Sopenharmony_ci let index = this.count >= this.grantGroups.length ? this.grantGroups.length - 1 : this.count; 257c5c2eed7Sopenharmony_ci if (this.grantGroups[index].name == 'LOCATION') { 258c5c2eed7Sopenharmony_ci if (this.locationFlag == Constants.LOCATION_FUZZY) { 259c5c2eed7Sopenharmony_ci return 'app.string.access_general_location'; 260c5c2eed7Sopenharmony_ci } 261c5c2eed7Sopenharmony_ci if (this.locationFlag == Constants.LOCATION_UPGRADE) { 262c5c2eed7Sopenharmony_ci return 'app.string.fuzzy_to_exact'; 263c5c2eed7Sopenharmony_ci } 264c5c2eed7Sopenharmony_ci } 265c5c2eed7Sopenharmony_ci return this.grantGroups[index].label; 266c5c2eed7Sopenharmony_ci } 267c5c2eed7Sopenharmony_ci 268c5c2eed7Sopenharmony_ci currentGroup(): GroupInfo { 269c5c2eed7Sopenharmony_ci let index = this.count >= this.grantGroups.length ? this.grantGroups.length - 1 : this.count; 270c5c2eed7Sopenharmony_ci return this.grantGroups[index]; 271c5c2eed7Sopenharmony_ci } 272c5c2eed7Sopenharmony_ci 273c5c2eed7Sopenharmony_ci async privacyAccept(group: GroupInfo, accessTokenId: number, permissionList: string[], userFixedFlag: number) { 274c5c2eed7Sopenharmony_ci let num = 0; 275c5c2eed7Sopenharmony_ci group.permissions.forEach(async permission => { 276c5c2eed7Sopenharmony_ci this.grantStatus = -1; 277c5c2eed7Sopenharmony_ci if (showSubPermissionsGroup.indexOf(group.name) == -1) { 278c5c2eed7Sopenharmony_ci if (group.name == 'LOCATION') { 279c5c2eed7Sopenharmony_ci if (fuzzyMarks.includes(this.locationFlag) && permission === FUZZY_LOCATION_PERMISSION) { 280c5c2eed7Sopenharmony_ci await this.operationPermission(true, accessTokenId, permission, userFixedFlag); 281c5c2eed7Sopenharmony_ci } 282c5c2eed7Sopenharmony_ci if (preciseMarks.includes(this.locationFlag) && permission === PRECISE_LOCATION_PERMISSION) { 283c5c2eed7Sopenharmony_ci await this.operationPermission(true, accessTokenId, permission, userFixedFlag); 284c5c2eed7Sopenharmony_ci } 285c5c2eed7Sopenharmony_ci } else { 286c5c2eed7Sopenharmony_ci await this.operationPermission(true, accessTokenId, permission, userFixedFlag); 287c5c2eed7Sopenharmony_ci } 288c5c2eed7Sopenharmony_ci } else { 289c5c2eed7Sopenharmony_ci if (permissionList.includes(permission)) { 290c5c2eed7Sopenharmony_ci await this.operationPermission(true, accessTokenId, permission, userFixedFlag); 291c5c2eed7Sopenharmony_ci } 292c5c2eed7Sopenharmony_ci } 293c5c2eed7Sopenharmony_ci if (this.grantStatus == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) { 294c5c2eed7Sopenharmony_ci permissionList.forEach((req, idx) => { 295c5c2eed7Sopenharmony_ci if (req == permission) { 296c5c2eed7Sopenharmony_ci this.result[idx] = abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED; 297c5c2eed7Sopenharmony_ci } 298c5c2eed7Sopenharmony_ci }) 299c5c2eed7Sopenharmony_ci } 300c5c2eed7Sopenharmony_ci num ++; 301c5c2eed7Sopenharmony_ci if (num == group.permissions.length) { 302c5c2eed7Sopenharmony_ci this.count ++; 303c5c2eed7Sopenharmony_ci } 304c5c2eed7Sopenharmony_ci }) 305c5c2eed7Sopenharmony_ci } 306c5c2eed7Sopenharmony_ci 307c5c2eed7Sopenharmony_ci async privacyCancel(group: GroupInfo, accessTokenId: number, permissionList: string[], userFixedFlag: number) { 308c5c2eed7Sopenharmony_ci group.permissions.forEach(async permission => { 309c5c2eed7Sopenharmony_ci if (showSubPermissionsGroup.indexOf(group.name) == -1) { 310c5c2eed7Sopenharmony_ci await this.operationPermission(false, accessTokenId, permission, userFixedFlag); 311c5c2eed7Sopenharmony_ci } else { 312c5c2eed7Sopenharmony_ci if (permissionList.includes(permission)) { 313c5c2eed7Sopenharmony_ci await this.operationPermission(false, accessTokenId, permission, userFixedFlag); 314c5c2eed7Sopenharmony_ci } 315c5c2eed7Sopenharmony_ci } 316c5c2eed7Sopenharmony_ci }) 317c5c2eed7Sopenharmony_ci this.count ++; 318c5c2eed7Sopenharmony_ci } 319c5c2eed7Sopenharmony_ci 320c5c2eed7Sopenharmony_ci async operationPermission(status: boolean, token: number, permission: Permissions, flag: number) { 321c5c2eed7Sopenharmony_ci if (status) { 322c5c2eed7Sopenharmony_ci try { 323c5c2eed7Sopenharmony_ci Log.info('grantUserGrantedPermission: ' + permission); 324c5c2eed7Sopenharmony_ci await abilityAccessCtrl.createAtManager().grantUserGrantedPermission(token, permission, flag).then(() => { 325c5c2eed7Sopenharmony_ci this.grantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED; 326c5c2eed7Sopenharmony_ci }) 327c5c2eed7Sopenharmony_ci } catch (err) { 328c5c2eed7Sopenharmony_ci Log.error('failed to grant permission: ' + permission); 329c5c2eed7Sopenharmony_ci } 330c5c2eed7Sopenharmony_ci } else { 331c5c2eed7Sopenharmony_ci try { 332c5c2eed7Sopenharmony_ci Log.info('revokeUserGrantedPermission: ' + permission) 333c5c2eed7Sopenharmony_ci await abilityAccessCtrl.createAtManager().revokeUserGrantedPermission(token, permission, flag); 334c5c2eed7Sopenharmony_ci } catch (err) { 335c5c2eed7Sopenharmony_ci Log.error('failed to revoke permission:' + permission); 336c5c2eed7Sopenharmony_ci } 337c5c2eed7Sopenharmony_ci } 338c5c2eed7Sopenharmony_ci } 339c5c2eed7Sopenharmony_ci 340c5c2eed7Sopenharmony_ci aboutToAppear() { 341c5c2eed7Sopenharmony_ci this.count = 0; 342c5c2eed7Sopenharmony_ci this.initStatus = Constants.INIT_NEED_TO_WAIT; 343c5c2eed7Sopenharmony_ci this.result = []; 344c5c2eed7Sopenharmony_ci this.reqPerms = this.want.parameters['ohos.user.grant.permission']; 345c5c2eed7Sopenharmony_ci this.accessTokenId = this.want.parameters['ohos.aafwk.param.callerToken']; 346c5c2eed7Sopenharmony_ci if (this.reqPerms == undefined || this.accessTokenId == undefined || this.reqPerms.length == 0) { 347c5c2eed7Sopenharmony_ci Log.info('invalid parameters'); 348c5c2eed7Sopenharmony_ci this.initStatus = Constants.INIT_NEED_TO_TERMINATED; 349c5c2eed7Sopenharmony_ci return; 350c5c2eed7Sopenharmony_ci } 351c5c2eed7Sopenharmony_ci Log.info('request permission=' + JSON.stringify(this.reqPerms) + ', tokenId = ' + this.accessTokenId); 352c5c2eed7Sopenharmony_ci Log.info('permission state=' + JSON.stringify(this.want.parameters['ohos.user.grant.permission.state'])); 353c5c2eed7Sopenharmony_ci this.result = new Array(this.reqPerms.length).fill(-1); 354c5c2eed7Sopenharmony_ci this.getPasteBoardInfo(); 355c5c2eed7Sopenharmony_ci let bundleName: string = this.want.parameters['ohos.aafwk.param.callerBundleName']; 356c5c2eed7Sopenharmony_ci bundleManager.getBundleInfo(bundleName, bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION) 357c5c2eed7Sopenharmony_ci .then(bundleInfo => { 358c5c2eed7Sopenharmony_ci this.reqPermissionDetails = bundleInfo.reqPermissionDetails; 359c5c2eed7Sopenharmony_ci this.getGrantGroups(this.want.parameters['ohos.user.grant.permission.state']); 360c5c2eed7Sopenharmony_ci this.getApplicationName(bundleName); 361c5c2eed7Sopenharmony_ci this.dialogController?.open(); 362c5c2eed7Sopenharmony_ci }).catch((err: BusinessError) => { 363c5c2eed7Sopenharmony_ci Log.error('getBundleInfo error :' + JSON.stringify(err)); 364c5c2eed7Sopenharmony_ci this.initStatus = Constants.INIT_NEED_TO_TERMINATED; 365c5c2eed7Sopenharmony_ci }) 366c5c2eed7Sopenharmony_ci } 367c5c2eed7Sopenharmony_ci 368c5c2eed7Sopenharmony_ci aboutToDisappear() { 369c5c2eed7Sopenharmony_ci this.dialogController = null; 370c5c2eed7Sopenharmony_ci } 371c5c2eed7Sopenharmony_ci 372c5c2eed7Sopenharmony_ci onPageShow() { 373c5c2eed7Sopenharmony_ci if (this.isUpdate > 0) { 374c5c2eed7Sopenharmony_ci this.getApplicationName(this.want.parameters['ohos.aafwk.param.callerBundleName']) 375c5c2eed7Sopenharmony_ci } 376c5c2eed7Sopenharmony_ci this.isUpdate ++; 377c5c2eed7Sopenharmony_ci } 378c5c2eed7Sopenharmony_ci 379c5c2eed7Sopenharmony_ci getPasteBoardInfo() { 380c5c2eed7Sopenharmony_ci if (this.reqPerms.includes(PASTE)) { 381c5c2eed7Sopenharmony_ci let systemPasteboard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard(); 382c5c2eed7Sopenharmony_ci this.pasteBoardName = systemPasteboard.getDataSource(); 383c5c2eed7Sopenharmony_ci } 384c5c2eed7Sopenharmony_ci } 385c5c2eed7Sopenharmony_ci 386c5c2eed7Sopenharmony_ci getGrantGroups(stateGroup: number[]) { 387c5c2eed7Sopenharmony_ci if (this.reqPerms.includes(FUZZY_LOCATION_PERMISSION)) { 388c5c2eed7Sopenharmony_ci this.locationFlag = Constants.LOCATION_FUZZY; 389c5c2eed7Sopenharmony_ci if (this.reqPerms.includes(PRECISE_LOCATION_PERMISSION)) { 390c5c2eed7Sopenharmony_ci this.locationFlag = Constants.LOCATION_BOTH_PRECISE; 391c5c2eed7Sopenharmony_ci let fuzzyIndex = this.reqPerms.indexOf(FUZZY_LOCATION_PERMISSION); 392c5c2eed7Sopenharmony_ci if (stateGroup[fuzzyIndex] == Constants.PASS_OPER) { 393c5c2eed7Sopenharmony_ci this.locationFlag = Constants.LOCATION_UPGRADE; 394c5c2eed7Sopenharmony_ci } 395c5c2eed7Sopenharmony_ci } 396c5c2eed7Sopenharmony_ci } else if (this.reqPerms.includes(PRECISE_LOCATION_PERMISSION)) { 397c5c2eed7Sopenharmony_ci this.locationFlag = Constants.LOCATION_UPGRADE; 398c5c2eed7Sopenharmony_ci } 399c5c2eed7Sopenharmony_ci 400c5c2eed7Sopenharmony_ci this.reqPerms.forEach(async (permission, idx) => { 401c5c2eed7Sopenharmony_ci if (permission === APP_TRACKING_CONSENT) { 402c5c2eed7Sopenharmony_ci let toggleStatus = await this.appTrackHandle(idx); 403c5c2eed7Sopenharmony_ci if (toggleStatus === abilityAccessCtrl.PermissionRequestToggleStatus.CLOSED) { 404c5c2eed7Sopenharmony_ci return; 405c5c2eed7Sopenharmony_ci } 406c5c2eed7Sopenharmony_ci } 407c5c2eed7Sopenharmony_ci if (stateGroup[idx] == Constants.PASS_OPER) { 408c5c2eed7Sopenharmony_ci Log.info('permission has been fixed:' + permission); 409c5c2eed7Sopenharmony_ci this.result[idx] = abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED; 410c5c2eed7Sopenharmony_ci } else if (stateGroup[idx] == Constants.DYNAMIC_OPER) { 411c5c2eed7Sopenharmony_ci if (!userGrantPermissions.includes(permission)) { 412c5c2eed7Sopenharmony_ci Log.info('permission not find:' + permission); 413c5c2eed7Sopenharmony_ci } else { 414c5c2eed7Sopenharmony_ci this.addGroup(permission); 415c5c2eed7Sopenharmony_ci } 416c5c2eed7Sopenharmony_ci } 417c5c2eed7Sopenharmony_ci }) 418c5c2eed7Sopenharmony_ci this.initStatus = Constants.INIT_NEED_TO_VERIFY; 419c5c2eed7Sopenharmony_ci } 420c5c2eed7Sopenharmony_ci 421c5c2eed7Sopenharmony_ci async appTrackHandle(index: number): Promise<abilityAccessCtrl.PermissionRequestToggleStatus> { 422c5c2eed7Sopenharmony_ci try { 423c5c2eed7Sopenharmony_ci let acManager = abilityAccessCtrl.createAtManager(); 424c5c2eed7Sopenharmony_ci let toggleStatus = await acManager.getPermissionRequestToggleStatus(APP_TRACKING_CONSENT); 425c5c2eed7Sopenharmony_ci Log.info(`APP_TRACKING_CONSENT toggleStatus: ${toggleStatus}.`); 426c5c2eed7Sopenharmony_ci if (toggleStatus === abilityAccessCtrl.PermissionRequestToggleStatus.CLOSED) { 427c5c2eed7Sopenharmony_ci await acManager.grantUserGrantedPermission(this.accessTokenId, APP_TRACKING_CONSENT, this.userFixedFlag); 428c5c2eed7Sopenharmony_ci this.result[index] = abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED; 429c5c2eed7Sopenharmony_ci Log.info('APP_TRACKING_CONSENT grant success.'); 430c5c2eed7Sopenharmony_ci } 431c5c2eed7Sopenharmony_ci return toggleStatus; 432c5c2eed7Sopenharmony_ci } catch (err) { 433c5c2eed7Sopenharmony_ci Log.error(`APP_TRACKING_CONSENT getToggleStatus or grant fail: ${JSON.stringify(err)}`); 434c5c2eed7Sopenharmony_ci return abilityAccessCtrl.PermissionRequestToggleStatus.OPEN; 435c5c2eed7Sopenharmony_ci } 436c5c2eed7Sopenharmony_ci } 437c5c2eed7Sopenharmony_ci 438c5c2eed7Sopenharmony_ci addGroup(permission: string) { 439c5c2eed7Sopenharmony_ci let group = getPermissionGroup(permission); 440c5c2eed7Sopenharmony_ci if (group.name === 'FOLDER') { 441c5c2eed7Sopenharmony_ci switch (permission) { 442c5c2eed7Sopenharmony_ci case DOWNLOAD_PERMISSION: 443c5c2eed7Sopenharmony_ci let downloadGroup = new GroupInfo(group.name, group.groupName, 'app.string.group_label_download_folder', 444c5c2eed7Sopenharmony_ci group.icon, group.description, group.reason, [DOWNLOAD_PERMISSION], group.isShow) 445c5c2eed7Sopenharmony_ci this.grantGroups.push(downloadGroup); 446c5c2eed7Sopenharmony_ci break; 447c5c2eed7Sopenharmony_ci case DESKTOP_PERMISSION: 448c5c2eed7Sopenharmony_ci let desktopGroup = new GroupInfo(group.name, group.groupName, 'app.string.group_label_desktop_folder', 449c5c2eed7Sopenharmony_ci group.icon, group.description, group.reason, [DESKTOP_PERMISSION], group.isShow) 450c5c2eed7Sopenharmony_ci this.grantGroups.push(desktopGroup); 451c5c2eed7Sopenharmony_ci break; 452c5c2eed7Sopenharmony_ci case DOCUMENTS_PERMISSION: 453c5c2eed7Sopenharmony_ci let documentGroup = new GroupInfo(group.name, group.groupName, 'app.string.group_label_document_folder', 454c5c2eed7Sopenharmony_ci group.icon, group.description, group.reason, [DOCUMENTS_PERMISSION], group.isShow) 455c5c2eed7Sopenharmony_ci this.grantGroups.push(documentGroup); 456c5c2eed7Sopenharmony_ci break; 457c5c2eed7Sopenharmony_ci } 458c5c2eed7Sopenharmony_ci return 459c5c2eed7Sopenharmony_ci } 460c5c2eed7Sopenharmony_ci let exist = this.grantGroups.find(grantGroup => grantGroup.name == group.name); 461c5c2eed7Sopenharmony_ci if (showSubPermissionsGroup.indexOf(group.name) != -1) { 462c5c2eed7Sopenharmony_ci let label = getPermissionLabel(permission) 463c5c2eed7Sopenharmony_ci if (!exist) { 464c5c2eed7Sopenharmony_ci group.description.push(label); 465c5c2eed7Sopenharmony_ci this.grantGroups.push(group); 466c5c2eed7Sopenharmony_ci } else { 467c5c2eed7Sopenharmony_ci if (exist.description.indexOf(label) == -1) { 468c5c2eed7Sopenharmony_ci exist.description.push($r('app.string.and')); 469c5c2eed7Sopenharmony_ci exist.description.push(label); 470c5c2eed7Sopenharmony_ci } 471c5c2eed7Sopenharmony_ci } 472c5c2eed7Sopenharmony_ci } else { 473c5c2eed7Sopenharmony_ci if (!exist) { 474c5c2eed7Sopenharmony_ci this.grantGroups.push(group); 475c5c2eed7Sopenharmony_ci } 476c5c2eed7Sopenharmony_ci } 477c5c2eed7Sopenharmony_ci } 478c5c2eed7Sopenharmony_ci 479c5c2eed7Sopenharmony_ci getApplicationName(bundleName: string) { 480c5c2eed7Sopenharmony_ci Log.info('getApplicationName bundleName:' + bundleName); 481c5c2eed7Sopenharmony_ci bundleManager.getApplicationInfo(bundleName, bundleManager.ApplicationFlag.GET_APPLICATION_INFO_DEFAULT) 482c5c2eed7Sopenharmony_ci .then(applicationInfo => { 483c5c2eed7Sopenharmony_ci let context = this.context.createBundleContext(bundleName); 484c5c2eed7Sopenharmony_ci context.resourceManager.getStringValue(applicationInfo.labelId, (err, value) => { 485c5c2eed7Sopenharmony_ci if (value == undefined) { 486c5c2eed7Sopenharmony_ci this.appName = titleTrim(applicationInfo.label); 487c5c2eed7Sopenharmony_ci } else { 488c5c2eed7Sopenharmony_ci this.appName = titleTrim(value); 489c5c2eed7Sopenharmony_ci } 490c5c2eed7Sopenharmony_ci Log.info('hap label:' + applicationInfo.label + ', value:' + this.appName); 491c5c2eed7Sopenharmony_ci }) 492c5c2eed7Sopenharmony_ci }).catch((err: BusinessError) => { 493c5c2eed7Sopenharmony_ci Log.error('applicationInfo error :' + err); 494c5c2eed7Sopenharmony_ci this.initStatus = Constants.INIT_NEED_TO_TERMINATED; 495c5c2eed7Sopenharmony_ci }) 496c5c2eed7Sopenharmony_ci this.grantGroups.forEach((group) => { 497c5c2eed7Sopenharmony_ci group.reason = ''; 498c5c2eed7Sopenharmony_ci this.getReason(group, bundleName); 499c5c2eed7Sopenharmony_ci }) 500c5c2eed7Sopenharmony_ci } 501c5c2eed7Sopenharmony_ci 502c5c2eed7Sopenharmony_ci getReason(group: GroupInfo, bundleName: string) { 503c5c2eed7Sopenharmony_ci group.permissions.forEach(permission => { 504c5c2eed7Sopenharmony_ci if (this.reqPerms.indexOf(permission) != -1) { 505c5c2eed7Sopenharmony_ci this.reqPermissionDetails.forEach(reqPermissionDetail => { 506c5c2eed7Sopenharmony_ci if (reqPermissionDetail.name == permission) { 507c5c2eed7Sopenharmony_ci Log.info('reqPermissionDetail: ' + JSON.stringify(reqPermissionDetail)); 508c5c2eed7Sopenharmony_ci let context = this.context.createModuleContext(bundleName, reqPermissionDetail.moduleName); 509c5c2eed7Sopenharmony_ci context.resourceManager.getStringValue(reqPermissionDetail.reasonId, (err, value) => { 510c5c2eed7Sopenharmony_ci if (value !== undefined && group.reason === '') { 511c5c2eed7Sopenharmony_ci group.reason = value.slice(Constants.START_SUBSCRIPT, Constants.END_SUBSCRIPT); 512c5c2eed7Sopenharmony_ci this.refresh ++; 513c5c2eed7Sopenharmony_ci } 514c5c2eed7Sopenharmony_ci this.initStatus = Constants.INIT_NEED_TO_REFRESH; 515c5c2eed7Sopenharmony_ci }) 516c5c2eed7Sopenharmony_ci } 517c5c2eed7Sopenharmony_ci }) 518c5c2eed7Sopenharmony_ci } 519c5c2eed7Sopenharmony_ci }) 520c5c2eed7Sopenharmony_ci } 521c5c2eed7Sopenharmony_ci 522c5c2eed7Sopenharmony_ci verify() { 523c5c2eed7Sopenharmony_ci if ((this.initStatus == Constants.INIT_NEED_TO_TERMINATED) || (this.count >= this.grantGroups.length)) { 524c5c2eed7Sopenharmony_ci this.answerRequest(); 525c5c2eed7Sopenharmony_ci this.initStatus = Constants.INIT_NEED_TO_WAIT; 526c5c2eed7Sopenharmony_ci return false; 527c5c2eed7Sopenharmony_ci } 528c5c2eed7Sopenharmony_ci return true; 529c5c2eed7Sopenharmony_ci } 530c5c2eed7Sopenharmony_ci 531c5c2eed7Sopenharmony_ci answerRequest() { 532c5c2eed7Sopenharmony_ci let ret: number = Constants.RESULT_SUCCESS; 533c5c2eed7Sopenharmony_ci if (this.initStatus == Constants.INIT_NEED_TO_TERMINATED) { 534c5c2eed7Sopenharmony_ci ret = Constants.RESULT_FAILURE; 535c5c2eed7Sopenharmony_ci } 536c5c2eed7Sopenharmony_ci this.answer(ret, this.reqPerms); 537c5c2eed7Sopenharmony_ci } 538c5c2eed7Sopenharmony_ci 539c5c2eed7Sopenharmony_ci answer(ret: number, reqPerms: string[]) { 540c5c2eed7Sopenharmony_ci Log.info('code:' + ret + ', perms=' + JSON.stringify(reqPerms) + ', result=' + JSON.stringify(this.result)); 541c5c2eed7Sopenharmony_ci let perms: string[] = []; 542c5c2eed7Sopenharmony_ci let results: number[] = []; 543c5c2eed7Sopenharmony_ci reqPerms.forEach(perm => { 544c5c2eed7Sopenharmony_ci perms.push(perm); 545c5c2eed7Sopenharmony_ci }) 546c5c2eed7Sopenharmony_ci this.result.forEach(result => { 547c5c2eed7Sopenharmony_ci results.push(result); 548c5c2eed7Sopenharmony_ci }) 549c5c2eed7Sopenharmony_ci let option = new rpc.MessageOption(); 550c5c2eed7Sopenharmony_ci let data = new rpc.MessageSequence(); 551c5c2eed7Sopenharmony_ci let setDialogData = new rpc.MessageSequence(); 552c5c2eed7Sopenharmony_ci let reply = new rpc.MessageSequence(); 553c5c2eed7Sopenharmony_ci Promise.all([ 554c5c2eed7Sopenharmony_ci data.writeInterfaceToken(Constants.ACCESS_TOKEN), 555c5c2eed7Sopenharmony_ci data.writeStringArray(perms), 556c5c2eed7Sopenharmony_ci data.writeIntArray(results), 557c5c2eed7Sopenharmony_ci setDialogData.writeInterfaceToken(Constants.ACCESS_TOKEN), 558c5c2eed7Sopenharmony_ci ]).then(() => { 559c5c2eed7Sopenharmony_ci let proxy = this.want.parameters['ohos.ability.params.callback'].value as rpc.RemoteObject; 560c5c2eed7Sopenharmony_ci proxy.sendMessageRequest(Constants.RESULT_CODE, data, reply, option); 561c5c2eed7Sopenharmony_ci proxy.sendMessageRequest(Constants.RESULT_CODE_1, setDialogData, reply, option); 562c5c2eed7Sopenharmony_ci }).catch(() => { 563c5c2eed7Sopenharmony_ci Log.error('write result failed!'); 564c5c2eed7Sopenharmony_ci }).finally(() => { 565c5c2eed7Sopenharmony_ci data.reclaim(); 566c5c2eed7Sopenharmony_ci reply.reclaim(); 567c5c2eed7Sopenharmony_ci setDialogData.reclaim(); 568c5c2eed7Sopenharmony_ci this.destruction(); 569c5c2eed7Sopenharmony_ci }) 570c5c2eed7Sopenharmony_ci } 571c5c2eed7Sopenharmony_ci 572c5c2eed7Sopenharmony_ci destruction() { 573c5c2eed7Sopenharmony_ci let windowNum: number = GlobalContext.load('windowNum'); 574c5c2eed7Sopenharmony_ci windowNum --; 575c5c2eed7Sopenharmony_ci Log.info('windowNum:' + windowNum); 576c5c2eed7Sopenharmony_ci GlobalContext.store('windowNum', windowNum); 577c5c2eed7Sopenharmony_ci this.win.destroyWindow(); 578c5c2eed7Sopenharmony_ci if (windowNum == 0) { 579c5c2eed7Sopenharmony_ci this.context.terminateSelf(); 580c5c2eed7Sopenharmony_ci } 581c5c2eed7Sopenharmony_ci } 582c5c2eed7Sopenharmony_ci}