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}