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 { backBar } from '../common/components/backBar';
17c5c2eed7Sopenharmony_ciimport router from '@ohos.router';
18c5c2eed7Sopenharmony_ciimport common from '@ohos.app.ability.common';
19c5c2eed7Sopenharmony_ciimport abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
20c5c2eed7Sopenharmony_ciimport bundleManager from '@ohos.bundle.bundleManager';
21c5c2eed7Sopenharmony_ciimport { BusinessError } from '@ohos.base';
22c5c2eed7Sopenharmony_ciimport { groups, userGrantPermissions } from '../common/model/permissionGroup';
23c5c2eed7Sopenharmony_ciimport Constants from '../common/utils/constant';
24c5c2eed7Sopenharmony_ciimport { Log, verifyAccessToken, getGroupIdByPermission } from '../common/utils/utils';
25c5c2eed7Sopenharmony_ciimport { PermissionObj, AppInfo } from '../common/model/typedef';
26c5c2eed7Sopenharmony_ciimport { GlobalContext } from '../common/utils/globalContext';
27c5c2eed7Sopenharmony_ci
28c5c2eed7Sopenharmony_ciconst FUZZY_LOCATION_PERMISSION = 'ohos.permission.APPROXIMATELY_LOCATION';
29c5c2eed7Sopenharmony_ciconst PRECISE_LOCATION_PERMISSION = 'ohos.permission.LOCATION';
30c5c2eed7Sopenharmony_ciconst BACKGROUND_LOCATION_PERMISSION = 'ohos.permission.LOCATION_IN_BACKGROUND';
31c5c2eed7Sopenharmony_ciconst DOWNLOAD_PERMISSION = 'ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY';
32c5c2eed7Sopenharmony_ciconst DESKTOP_PERMISSION = 'ohos.permission.READ_WRITE_DESKTOP_DIRECTORY';
33c5c2eed7Sopenharmony_ciconst DOCUMENTS_PERMISSION = 'ohos.permission.READ_WRITE_DOCUMENTS_DIRECTORY';
34c5c2eed7Sopenharmony_ci
35c5c2eed7Sopenharmony_ci@Entry
36c5c2eed7Sopenharmony_ci@Component
37c5c2eed7Sopenharmony_cistruct appNamePlusPage {
38c5c2eed7Sopenharmony_ci  private context = getContext(this) as common.UIAbilityContext;
39c5c2eed7Sopenharmony_ci  @State allowedListItem: PermissionObj[] = []; // Array of allowed permissions
40c5c2eed7Sopenharmony_ci  @State bannedListItem: PermissionObj[] = []; // array of forbidden permissions
41c5c2eed7Sopenharmony_ci  @State applicationInfo: AppInfo = GlobalContext.load('applicationInfo'); // Routing jump data
42c5c2eed7Sopenharmony_ci  @State bundleName: string = GlobalContext.load('bundleName');
43c5c2eed7Sopenharmony_ci  @State label: string = '';
44c5c2eed7Sopenharmony_ci  @State isTouch: string = '';
45c5c2eed7Sopenharmony_ci  @State isGranted: number = Constants.PERMISSION_ALLOW;
46c5c2eed7Sopenharmony_ci  @State folderStatus: boolean[] = [false, false, false];
47c5c2eed7Sopenharmony_ci  @State reqUserPermissions: Permissions[] = [];
48c5c2eed7Sopenharmony_ci
49c5c2eed7Sopenharmony_ci  @Builder ListItemLayout(item: PermissionObj, status: number) {
50c5c2eed7Sopenharmony_ci    ListItem() {
51c5c2eed7Sopenharmony_ci      Row() {
52c5c2eed7Sopenharmony_ci        Column() {
53c5c2eed7Sopenharmony_ci          Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {
54c5c2eed7Sopenharmony_ci            Row() {
55c5c2eed7Sopenharmony_ci              Text(item.groupName)
56c5c2eed7Sopenharmony_ci                .fontSize(Constants.TEXT_MIDDLE_FONT_SIZE)
57c5c2eed7Sopenharmony_ci                .fontColor($r('sys.color.font_primary'))
58c5c2eed7Sopenharmony_ci                .fontWeight(FontWeight.Medium)
59c5c2eed7Sopenharmony_ci                .flexGrow(Constants.FLEX_GROW)
60c5c2eed7Sopenharmony_ci              SymbolGlyph($r('sys.symbol.chevron_forward'))
61c5c2eed7Sopenharmony_ci                .width(Constants.IMAGE_WIDTH)
62c5c2eed7Sopenharmony_ci                .height(Constants.IMAGE_HEIGHT)
63c5c2eed7Sopenharmony_ci                .fontSize(Constants.FONT_SIZE_18_vp)
64c5c2eed7Sopenharmony_ci                .fontColor([$r('sys.color.icon_tertiary')])
65c5c2eed7Sopenharmony_ci                .fontWeight(FontWeight.Medium)
66c5c2eed7Sopenharmony_ci            }
67c5c2eed7Sopenharmony_ci            .width(Constants.FULL_WIDTH)
68c5c2eed7Sopenharmony_ci            .height(Constants.LISTITEM_ROW_HEIGHT)
69c5c2eed7Sopenharmony_ci          }
70c5c2eed7Sopenharmony_ci        }.onClick(() => {
71c5c2eed7Sopenharmony_ci          GlobalContext.store('currentPermissionGroup', item.group);
72c5c2eed7Sopenharmony_ci          router.pushUrl({
73c5c2eed7Sopenharmony_ci            url: item.group == 'OTHER' ? 'pages/other-permissions' : 'pages/application-tertiary',
74c5c2eed7Sopenharmony_ci            params: {
75c5c2eed7Sopenharmony_ci              bundleName: this.applicationInfo.bundleName,
76c5c2eed7Sopenharmony_ci              backTitle: item.groupName,
77c5c2eed7Sopenharmony_ci              permission: item.permission,
78c5c2eed7Sopenharmony_ci              status,
79c5c2eed7Sopenharmony_ci              tokenId: this.applicationInfo.tokenId
80c5c2eed7Sopenharmony_ci            }
81c5c2eed7Sopenharmony_ci          });
82c5c2eed7Sopenharmony_ci        })
83c5c2eed7Sopenharmony_ci      }
84c5c2eed7Sopenharmony_ci    }.padding({ left: $r('sys.float.ohos_id_card_margin_start'), right: $r('sys.float.ohos_id_card_margin_end') })
85c5c2eed7Sopenharmony_ci    .borderRadius($r('sys.float.ohos_id_corner_radius_default_l'))
86c5c2eed7Sopenharmony_ci    .linearGradient((this.isTouch === item.group) ? {
87c5c2eed7Sopenharmony_ci        angle: 90,
88c5c2eed7Sopenharmony_ci        direction: GradientDirection.Right,
89c5c2eed7Sopenharmony_ci        colors: [['#DCEAF9', 0.0], ['#FAFAFA', 1.0]]
90c5c2eed7Sopenharmony_ci      } : {
91c5c2eed7Sopenharmony_ci        angle: 90,
92c5c2eed7Sopenharmony_ci        direction: GradientDirection.Right,
93c5c2eed7Sopenharmony_ci        colors: [[$r('sys.color.comp_background_list_card'), 1], [$r('sys.color.comp_background_list_card'), 1]]
94c5c2eed7Sopenharmony_ci      })
95c5c2eed7Sopenharmony_ci    .onTouch(event => {
96c5c2eed7Sopenharmony_ci      if (event === undefined) {
97c5c2eed7Sopenharmony_ci        return;
98c5c2eed7Sopenharmony_ci      }
99c5c2eed7Sopenharmony_ci      if (event.type === TouchType.Down) {
100c5c2eed7Sopenharmony_ci        this.isTouch = item.group;
101c5c2eed7Sopenharmony_ci      }
102c5c2eed7Sopenharmony_ci      if (event.type === TouchType.Up) {
103c5c2eed7Sopenharmony_ci        this.isTouch = '';
104c5c2eed7Sopenharmony_ci      }
105c5c2eed7Sopenharmony_ci    })
106c5c2eed7Sopenharmony_ci  }
107c5c2eed7Sopenharmony_ci
108c5c2eed7Sopenharmony_ci  async getReqUserPermissions(info: AppInfo) {
109c5c2eed7Sopenharmony_ci    let acManager = abilityAccessCtrl.createAtManager();
110c5c2eed7Sopenharmony_ci    if (info.permissions.length > 0) {
111c5c2eed7Sopenharmony_ci      for (let j = 0; j < info.permissions.length; j++) {
112c5c2eed7Sopenharmony_ci        let permission = info.permissions[j];
113c5c2eed7Sopenharmony_ci        if (userGrantPermissions.indexOf(permission) == -1) {
114c5c2eed7Sopenharmony_ci          continue;
115c5c2eed7Sopenharmony_ci        }
116c5c2eed7Sopenharmony_ci        try {
117c5c2eed7Sopenharmony_ci          let flag = await acManager.getPermissionFlags(info.tokenId, permission);
118c5c2eed7Sopenharmony_ci          if (flag == Constants.PERMISSION_SYSTEM_FIXED) {
119c5c2eed7Sopenharmony_ci            continue;
120c5c2eed7Sopenharmony_ci          }
121c5c2eed7Sopenharmony_ci        } catch (err) {
122c5c2eed7Sopenharmony_ci          Log.error('getPermissionFlags error: ' + JSON.stringify(err));
123c5c2eed7Sopenharmony_ci        }
124c5c2eed7Sopenharmony_ci        this.reqUserPermissions.push(permission);
125c5c2eed7Sopenharmony_ci      }
126c5c2eed7Sopenharmony_ci    }
127c5c2eed7Sopenharmony_ci  }
128c5c2eed7Sopenharmony_ci
129c5c2eed7Sopenharmony_ci  async initApplicationInfo(info: AppInfo) {
130c5c2eed7Sopenharmony_ci    Log.info(`labelResource: ` + JSON.stringify(info.labelResource));
131c5c2eed7Sopenharmony_ci    let resourceManager = this.context.createBundleContext(info.bundleName).resourceManager;
132c5c2eed7Sopenharmony_ci
133c5c2eed7Sopenharmony_ci    if (info.labelResource.id !== 0) {
134c5c2eed7Sopenharmony_ci      info.label = await this.context.resourceManager.getStringValue(info.labelResource);
135c5c2eed7Sopenharmony_ci    } else {
136c5c2eed7Sopenharmony_ci      info.label = await resourceManager.getStringValue(info.labelId);
137c5c2eed7Sopenharmony_ci    }
138c5c2eed7Sopenharmony_ci
139c5c2eed7Sopenharmony_ci    try {
140c5c2eed7Sopenharmony_ci      if (info.iconResource.id !== 0) {
141c5c2eed7Sopenharmony_ci        let iconDescriptor = this.context.resourceManager.getDrawableDescriptor(info.iconResource);
142c5c2eed7Sopenharmony_ci        info.icon = iconDescriptor?.getPixelMap();
143c5c2eed7Sopenharmony_ci      } else {
144c5c2eed7Sopenharmony_ci        let iconDescriptor = resourceManager.getDrawableDescriptor(info.iconId);
145c5c2eed7Sopenharmony_ci        info.icon = iconDescriptor?.getPixelMap();
146c5c2eed7Sopenharmony_ci      }
147c5c2eed7Sopenharmony_ci    } catch (error) {
148c5c2eed7Sopenharmony_ci      Log.error(`getDrawableDescriptor failed, error code: ${error.code}, message: ${error.message}.`);
149c5c2eed7Sopenharmony_ci    }
150c5c2eed7Sopenharmony_ci
151c5c2eed7Sopenharmony_ci    if (!info.icon) {
152c5c2eed7Sopenharmony_ci      info.icon = $r('app.media.icon');
153c5c2eed7Sopenharmony_ci    }
154c5c2eed7Sopenharmony_ci
155c5c2eed7Sopenharmony_ci    this.reqUserPermissions = [];
156c5c2eed7Sopenharmony_ci    await this.getReqUserPermissions(info);
157c5c2eed7Sopenharmony_ci    let groupIds: number[] = [];
158c5c2eed7Sopenharmony_ci    for (let i = 0; i < this.reqUserPermissions.length; i++) {
159c5c2eed7Sopenharmony_ci      let groupId = getGroupIdByPermission(this.reqUserPermissions[i])
160c5c2eed7Sopenharmony_ci      if (groupIds.indexOf(groupId) == -1) {
161c5c2eed7Sopenharmony_ci        groupIds.push(groupId);
162c5c2eed7Sopenharmony_ci      }
163c5c2eed7Sopenharmony_ci    }
164c5c2eed7Sopenharmony_ci    info.permissions = this.reqUserPermissions;
165c5c2eed7Sopenharmony_ci    info.groupId = groupIds;
166c5c2eed7Sopenharmony_ci  }
167c5c2eed7Sopenharmony_ci
168c5c2eed7Sopenharmony_ci  /**
169c5c2eed7Sopenharmony_ci   * Initialize permission status information and group permission information
170c5c2eed7Sopenharmony_ci   */
171c5c2eed7Sopenharmony_ci  async initialPermissions() {
172c5c2eed7Sopenharmony_ci    if (this.bundleName && !this.applicationInfo.groupId.length) {
173c5c2eed7Sopenharmony_ci      await this.initApplicationInfo(this.applicationInfo);
174c5c2eed7Sopenharmony_ci    }
175c5c2eed7Sopenharmony_ci    let reqPermissions = this.applicationInfo.permissions;
176c5c2eed7Sopenharmony_ci    let reqGroupIds = this.applicationInfo.groupId;
177c5c2eed7Sopenharmony_ci
178c5c2eed7Sopenharmony_ci    this.allowedListItem = [];
179c5c2eed7Sopenharmony_ci    this.bannedListItem = [];
180c5c2eed7Sopenharmony_ci
181c5c2eed7Sopenharmony_ci    for (let i = 0; i < reqGroupIds.length; i++) {
182c5c2eed7Sopenharmony_ci      let id = reqGroupIds[i];
183c5c2eed7Sopenharmony_ci      let groupName = groups[id].groupName;
184c5c2eed7Sopenharmony_ci      let group = groups[id].name;
185c5c2eed7Sopenharmony_ci      let groupReqPermissions: Permissions[] = [];
186c5c2eed7Sopenharmony_ci      for (let j = 0; j < reqPermissions.length; j++) {
187c5c2eed7Sopenharmony_ci        let permission = reqPermissions[j];
188c5c2eed7Sopenharmony_ci        if (groups[id].permissions.indexOf(permission) != -1) {
189c5c2eed7Sopenharmony_ci          groupReqPermissions.push(permission);
190c5c2eed7Sopenharmony_ci        }
191c5c2eed7Sopenharmony_ci      }
192c5c2eed7Sopenharmony_ci      this.isGranted = group === 'LOCATION' ? Constants.PERMISSION_BAN : Constants.PERMISSION_ALLOW;
193c5c2eed7Sopenharmony_ci      this.folderStatus = [false, false, false];
194c5c2eed7Sopenharmony_ci      await this.getStatus(groupReqPermissions, group);
195c5c2eed7Sopenharmony_ci
196c5c2eed7Sopenharmony_ci      if (
197c5c2eed7Sopenharmony_ci        this.isGranted === Constants.PERMISSION_ALLOW || this.isGranted === Constants.PERMISSION_ALLOWED_ONLY_DURING_USE
198c5c2eed7Sopenharmony_ci      ) {
199c5c2eed7Sopenharmony_ci        this.allowedListItem.push(new PermissionObj(groupName, groupReqPermissions, group));
200c5c2eed7Sopenharmony_ci      } else {
201c5c2eed7Sopenharmony_ci        if (group === 'FOLDER' && this.folderStatus.includes(true)) {
202c5c2eed7Sopenharmony_ci          this.allowedListItem.push(new PermissionObj(groupName, groupReqPermissions, group));
203c5c2eed7Sopenharmony_ci        } else {
204c5c2eed7Sopenharmony_ci          this.bannedListItem.push(new PermissionObj(groupName, groupReqPermissions, group));
205c5c2eed7Sopenharmony_ci        }
206c5c2eed7Sopenharmony_ci      }
207c5c2eed7Sopenharmony_ci
208c5c2eed7Sopenharmony_ci      GlobalContext.store('folderStatus', this.folderStatus);
209c5c2eed7Sopenharmony_ci    }
210c5c2eed7Sopenharmony_ci  }
211c5c2eed7Sopenharmony_ci
212c5c2eed7Sopenharmony_ci  async getStatus(groupReqPermissions: Permissions[], group: string) {
213c5c2eed7Sopenharmony_ci    if (group === 'LOCATION') {
214c5c2eed7Sopenharmony_ci      try {
215c5c2eed7Sopenharmony_ci        let acManager = abilityAccessCtrl.createAtManager();
216c5c2eed7Sopenharmony_ci        let fuzzyState = acManager.verifyAccessTokenSync(this.applicationInfo.tokenId, FUZZY_LOCATION_PERMISSION);
217c5c2eed7Sopenharmony_ci        fuzzyState === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED ?
218c5c2eed7Sopenharmony_ci          this.isGranted = Constants.PERMISSION_ALLOWED_ONLY_DURING_USE : null;
219c5c2eed7Sopenharmony_ci        let backgroundState =
220c5c2eed7Sopenharmony_ci          acManager.verifyAccessTokenSync(this.applicationInfo.tokenId, BACKGROUND_LOCATION_PERMISSION);
221c5c2eed7Sopenharmony_ci        backgroundState === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED ?
222c5c2eed7Sopenharmony_ci          this.isGranted = Constants.PERMISSION_ALLOW : null;
223c5c2eed7Sopenharmony_ci        await acManager.getPermissionFlags(this.applicationInfo.tokenId, FUZZY_LOCATION_PERMISSION ).then(flag => {
224c5c2eed7Sopenharmony_ci          flag === Constants.PERMISSION_ALLOW_THIS_TIME ? this.isGranted = Constants.PERMISSION_ONLY_THIS_TIME : null;
225c5c2eed7Sopenharmony_ci        })
226c5c2eed7Sopenharmony_ci      } catch (err) {
227c5c2eed7Sopenharmony_ci        Log.error('change location status error: ' + JSON.stringify(err));
228c5c2eed7Sopenharmony_ci      }
229c5c2eed7Sopenharmony_ci      GlobalContext.store('locationStatus', this.isGranted);
230c5c2eed7Sopenharmony_ci      return true;
231c5c2eed7Sopenharmony_ci    }
232c5c2eed7Sopenharmony_ci    for (let i = 0; i < groupReqPermissions.length; i++) {
233c5c2eed7Sopenharmony_ci      let permission = groupReqPermissions[i];
234c5c2eed7Sopenharmony_ci      let res = await verifyAccessToken(this.applicationInfo.tokenId, permission);
235c5c2eed7Sopenharmony_ci      if (res != abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
236c5c2eed7Sopenharmony_ci        this.isGranted = Constants.PERMISSION_BAN;
237c5c2eed7Sopenharmony_ci      }
238c5c2eed7Sopenharmony_ci      if (group === 'FOLDER' && res === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
239c5c2eed7Sopenharmony_ci        switch (permission) {
240c5c2eed7Sopenharmony_ci          case DOWNLOAD_PERMISSION:
241c5c2eed7Sopenharmony_ci            this.folderStatus[0] = true;
242c5c2eed7Sopenharmony_ci            break;
243c5c2eed7Sopenharmony_ci          case DESKTOP_PERMISSION:
244c5c2eed7Sopenharmony_ci            this.folderStatus[1] = true;
245c5c2eed7Sopenharmony_ci            break;
246c5c2eed7Sopenharmony_ci          case DOCUMENTS_PERMISSION:
247c5c2eed7Sopenharmony_ci            this.folderStatus[2] = true;
248c5c2eed7Sopenharmony_ci            break;
249c5c2eed7Sopenharmony_ci        }
250c5c2eed7Sopenharmony_ci      }
251c5c2eed7Sopenharmony_ci    }
252c5c2eed7Sopenharmony_ci    return true;
253c5c2eed7Sopenharmony_ci  }
254c5c2eed7Sopenharmony_ci
255c5c2eed7Sopenharmony_ci  /**
256c5c2eed7Sopenharmony_ci   * Lifecycle function, triggered once when this page is displayed
257c5c2eed7Sopenharmony_ci   */
258c5c2eed7Sopenharmony_ci  onPageShow() {
259c5c2eed7Sopenharmony_ci    this.initialPermissions();
260c5c2eed7Sopenharmony_ci    bundleManager.getApplicationInfo(
261c5c2eed7Sopenharmony_ci      this.applicationInfo.bundleName, bundleManager.ApplicationFlag.GET_APPLICATION_INFO_DEFAULT
262c5c2eed7Sopenharmony_ci    ).then(appInfo => {
263c5c2eed7Sopenharmony_ci      let bundleContext = this.context.createBundleContext(this.applicationInfo.bundleName)
264c5c2eed7Sopenharmony_ci      bundleContext.resourceManager.getStringValue(appInfo.labelId, (error, value) => {
265c5c2eed7Sopenharmony_ci        if (value) {
266c5c2eed7Sopenharmony_ci          this.applicationInfo.label = value;
267c5c2eed7Sopenharmony_ci          GlobalContext.store('applicationInfo', this.applicationInfo);
268c5c2eed7Sopenharmony_ci          this.label = value
269c5c2eed7Sopenharmony_ci        }
270c5c2eed7Sopenharmony_ci      })
271c5c2eed7Sopenharmony_ci    }).catch((error: BusinessError) => {
272c5c2eed7Sopenharmony_ci      Log.error('getApplicationInfo error: ' + JSON.stringify(error));
273c5c2eed7Sopenharmony_ci    })
274c5c2eed7Sopenharmony_ci  }
275c5c2eed7Sopenharmony_ci
276c5c2eed7Sopenharmony_ci  build() {
277c5c2eed7Sopenharmony_ci    Column() {
278c5c2eed7Sopenharmony_ci      GridRow({ gutter: Constants.GUTTER, columns: {
279c5c2eed7Sopenharmony_ci        xs: Constants.XS_COLUMNS, sm: Constants.SM_COLUMNS, md: Constants.MD_COLUMNS, lg: Constants.LG_COLUMNS } }) {
280c5c2eed7Sopenharmony_ci        GridCol({
281c5c2eed7Sopenharmony_ci          span: { xs: Constants.XS_SPAN, sm: Constants.SM_SPAN, md: Constants.MD_SPAN, lg: Constants.LG_SPAN },
282c5c2eed7Sopenharmony_ci          offset: { xs: Constants.XS_OFFSET, sm: Constants.SM_OFFSET, md: Constants.MD_OFFSET, lg: Constants.LG_OFFSET }
283c5c2eed7Sopenharmony_ci        }) {
284c5c2eed7Sopenharmony_ci          Row() {
285c5c2eed7Sopenharmony_ci            Column() {
286c5c2eed7Sopenharmony_ci              Row() {
287c5c2eed7Sopenharmony_ci                backBar({ title: JSON.stringify(this.label || this.applicationInfo.label), recordable: false })
288c5c2eed7Sopenharmony_ci              }
289c5c2eed7Sopenharmony_ci              Row() {
290c5c2eed7Sopenharmony_ci                Column() {
291c5c2eed7Sopenharmony_ci                  if (!this.allowedListItem.length && !this.bannedListItem.length) {
292c5c2eed7Sopenharmony_ci                    Row() {
293c5c2eed7Sopenharmony_ci                      List() {
294c5c2eed7Sopenharmony_ci                        ListItem() {
295c5c2eed7Sopenharmony_ci                          Row() {
296c5c2eed7Sopenharmony_ci                            Column() {
297c5c2eed7Sopenharmony_ci                              Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {
298c5c2eed7Sopenharmony_ci                                Row() {
299c5c2eed7Sopenharmony_ci                                  Column() {
300c5c2eed7Sopenharmony_ci                                    Row() {
301c5c2eed7Sopenharmony_ci                                      Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {
302c5c2eed7Sopenharmony_ci                                        Text($r('app.string.no_permission'))
303c5c2eed7Sopenharmony_ci                                          .fontSize(Constants.TEXT_MIDDLE_FONT_SIZE)
304c5c2eed7Sopenharmony_ci                                          .fontColor($r('sys.color.font_primary'))
305c5c2eed7Sopenharmony_ci                                      }.margin({ top: Constants.FLEX_MARGIN_TOP, bottom: Constants.FLEX_MARGIN_BOTTOM })
306c5c2eed7Sopenharmony_ci                                    }.height(Constants.FULL_HEIGHT)
307c5c2eed7Sopenharmony_ci                                  }.flexGrow(Constants.FLEX_GROW)
308c5c2eed7Sopenharmony_ci                                   .constraintSize({minHeight: Constants.CONSTRAINTSIZE_MINHEIGHT })
309c5c2eed7Sopenharmony_ci                                }
310c5c2eed7Sopenharmony_ci                                .width(Constants.FULL_WIDTH)
311c5c2eed7Sopenharmony_ci                                .height(Constants.LISTITEM_ROW_HEIGHT)
312c5c2eed7Sopenharmony_ci                              }
313c5c2eed7Sopenharmony_ci                            }
314c5c2eed7Sopenharmony_ci                          }
315c5c2eed7Sopenharmony_ci                        }.padding({ left: Constants.LISTITEM_PADDING_LEFT, right: Constants.LISTITEM_PADDING_RIGHT })
316c5c2eed7Sopenharmony_ci                      }
317c5c2eed7Sopenharmony_ci                      .backgroundColor($r('sys.color.comp_background_list_card'))
318c5c2eed7Sopenharmony_ci                      .borderRadius($r('sys.float.ohos_id_corner_radius_card'))
319c5c2eed7Sopenharmony_ci                      .padding({ top: Constants.LIST_PADDING_TOP, bottom: Constants.LIST_PADDING_BOTTOM })
320c5c2eed7Sopenharmony_ci                    }.margin({ top: Constants.ROW_MARGIN_TOP })
321c5c2eed7Sopenharmony_ci                     .padding({
322c5c2eed7Sopenharmony_ci                       left: Constants.SECONDARY_LIST_PADDING_LEFT,
323c5c2eed7Sopenharmony_ci                       right: Constants.SECONDARY_LIST_PADDING_RIGHT
324c5c2eed7Sopenharmony_ci                     })
325c5c2eed7Sopenharmony_ci                  } else {
326c5c2eed7Sopenharmony_ci                    Scroll() {
327c5c2eed7Sopenharmony_ci                      List() {
328c5c2eed7Sopenharmony_ci                        if (this.allowedListItem.length) {
329c5c2eed7Sopenharmony_ci                          ListItem() {
330c5c2eed7Sopenharmony_ci                            Row() {
331c5c2eed7Sopenharmony_ci                              Text($r('app.string.allowed'))
332c5c2eed7Sopenharmony_ci                                .fontSize(Constants.TEXT_SMALL_FONT_SIZE)
333c5c2eed7Sopenharmony_ci                                .fontColor($r('sys.color.font_secondary'))
334c5c2eed7Sopenharmony_ci                                .fontWeight(FontWeight.Medium)
335c5c2eed7Sopenharmony_ci                                .lineHeight(Constants.SUBTITLE_LINE_HEIGHT)
336c5c2eed7Sopenharmony_ci                            }.constraintSize({ minHeight: Constants.SUBTITLE_MIN_HEIGHT })
337c5c2eed7Sopenharmony_ci                            .width(Constants.FULL_WIDTH)
338c5c2eed7Sopenharmony_ci                            .padding({ top: Constants.SUBTITLE_PADDING_TOP, bottom: Constants.SUBTITLE_PADDING_BOTTOM,
339c5c2eed7Sopenharmony_ci                              left: Constants.SECONDARY_TEXT_MARGIN_LEFT})
340c5c2eed7Sopenharmony_ci                          }
341c5c2eed7Sopenharmony_ci
342c5c2eed7Sopenharmony_ci                          ListItem() {
343c5c2eed7Sopenharmony_ci                            Row() {
344c5c2eed7Sopenharmony_ci                              List() {
345c5c2eed7Sopenharmony_ci                                ForEach(this.allowedListItem, (item: PermissionObj) => {
346c5c2eed7Sopenharmony_ci                                  this.ListItemLayout(item, Constants.PERMISSION_ALLOW)
347c5c2eed7Sopenharmony_ci                                }, (item: PermissionObj) => JSON.stringify(item))
348c5c2eed7Sopenharmony_ci                              }
349c5c2eed7Sopenharmony_ci                              .backgroundColor($r('sys.color.comp_background_list_card'))
350c5c2eed7Sopenharmony_ci                              .borderRadius($r('sys.float.ohos_id_corner_radius_card'))
351c5c2eed7Sopenharmony_ci                              .padding(Constants.LIST_PADDING_TOP)
352c5c2eed7Sopenharmony_ci                              .divider({
353c5c2eed7Sopenharmony_ci                                strokeWidth: Constants.DIVIDER,
354c5c2eed7Sopenharmony_ci                                color: $r('sys.color.comp_divider'),
355c5c2eed7Sopenharmony_ci                                startMargin: Constants.DEFAULT_MARGIN_START,
356c5c2eed7Sopenharmony_ci                                endMargin: Constants.DEFAULT_MARGIN_END
357c5c2eed7Sopenharmony_ci                              })
358c5c2eed7Sopenharmony_ci                            }.margin({ top: Constants.ROW_MARGIN_TOP })
359c5c2eed7Sopenharmony_ci                            .padding({
360c5c2eed7Sopenharmony_ci                              left: Constants.SECONDARY_LIST_PADDING_LEFT,
361c5c2eed7Sopenharmony_ci                              right: Constants.SECONDARY_LIST_PADDING_RIGHT
362c5c2eed7Sopenharmony_ci                            })
363c5c2eed7Sopenharmony_ci                          }
364c5c2eed7Sopenharmony_ci                        }
365c5c2eed7Sopenharmony_ci                        if (this.bannedListItem.length) {
366c5c2eed7Sopenharmony_ci                          ListItem() {
367c5c2eed7Sopenharmony_ci                            Row() {
368c5c2eed7Sopenharmony_ci                              Text($r('app.string.banned'))
369c5c2eed7Sopenharmony_ci                                .fontSize(Constants.TEXT_SMALL_FONT_SIZE)
370c5c2eed7Sopenharmony_ci                                .fontColor($r('sys.color.font_secondary'))
371c5c2eed7Sopenharmony_ci                                .fontWeight(FontWeight.Medium)
372c5c2eed7Sopenharmony_ci                                .lineHeight(Constants.SUBTITLE_LINE_HEIGHT)
373c5c2eed7Sopenharmony_ci                            }.constraintSize({ minHeight: Constants.SUBTITLE_MIN_HEIGHT })
374c5c2eed7Sopenharmony_ci                            .width(Constants.FULL_WIDTH)
375c5c2eed7Sopenharmony_ci                            .padding({ top: Constants.SUBTITLE_PADDING_TOP, bottom: Constants.SUBTITLE_PADDING_BOTTOM,
376c5c2eed7Sopenharmony_ci                              left: Constants.SECONDARY_TEXT_MARGIN_LEFT})
377c5c2eed7Sopenharmony_ci                          }
378c5c2eed7Sopenharmony_ci
379c5c2eed7Sopenharmony_ci                          ListItem() {
380c5c2eed7Sopenharmony_ci                            Row() {
381c5c2eed7Sopenharmony_ci                              List() {
382c5c2eed7Sopenharmony_ci                                ForEach(this.bannedListItem, (item: PermissionObj) => {
383c5c2eed7Sopenharmony_ci                                  this.ListItemLayout(item, Constants.PERMISSION_BAN)
384c5c2eed7Sopenharmony_ci                                }, (item: PermissionObj) => JSON.stringify(item))
385c5c2eed7Sopenharmony_ci                              }
386c5c2eed7Sopenharmony_ci                              .backgroundColor($r('sys.color.comp_background_list_card'))
387c5c2eed7Sopenharmony_ci                              .borderRadius($r('sys.float.ohos_id_corner_radius_card'))
388c5c2eed7Sopenharmony_ci                              .padding(Constants.LIST_PADDING_TOP)
389c5c2eed7Sopenharmony_ci                              .divider({
390c5c2eed7Sopenharmony_ci                                strokeWidth: Constants.DIVIDER,
391c5c2eed7Sopenharmony_ci                                color: $r('sys.color.comp_divider'),
392c5c2eed7Sopenharmony_ci                                startMargin: Constants.DEFAULT_MARGIN_START,
393c5c2eed7Sopenharmony_ci                                endMargin: Constants.DEFAULT_MARGIN_END
394c5c2eed7Sopenharmony_ci                              })
395c5c2eed7Sopenharmony_ci                            }.margin({ top: Constants.ROW_MARGIN_TOP })
396c5c2eed7Sopenharmony_ci                            .padding({
397c5c2eed7Sopenharmony_ci                              left: Constants.SECONDARY_LIST_PADDING_LEFT,
398c5c2eed7Sopenharmony_ci                              right: Constants.SECONDARY_LIST_PADDING_RIGHT
399c5c2eed7Sopenharmony_ci                            })
400c5c2eed7Sopenharmony_ci                          }
401c5c2eed7Sopenharmony_ci                        }
402c5c2eed7Sopenharmony_ci                      }
403c5c2eed7Sopenharmony_ci                    }.scrollBar(BarState.Off)
404c5c2eed7Sopenharmony_ci                  }
405c5c2eed7Sopenharmony_ci                }
406c5c2eed7Sopenharmony_ci                .width(Constants.FULL_WIDTH)
407c5c2eed7Sopenharmony_ci                .height(Constants.FULL_HEIGHT)
408c5c2eed7Sopenharmony_ci              }
409c5c2eed7Sopenharmony_ci              .layoutWeight(Constants.LAYOUT_WEIGHT)
410c5c2eed7Sopenharmony_ci            }
411c5c2eed7Sopenharmony_ci          }
412c5c2eed7Sopenharmony_ci          .height(Constants.FULL_HEIGHT)
413c5c2eed7Sopenharmony_ci          .width(Constants.FULL_WIDTH)
414c5c2eed7Sopenharmony_ci          .backgroundColor($r('sys.color.background_secondary'))
415c5c2eed7Sopenharmony_ci        }
416c5c2eed7Sopenharmony_ci      }.backgroundColor($r('sys.color.background_secondary'))
417c5c2eed7Sopenharmony_ci    }
418c5c2eed7Sopenharmony_ci  }
419c5c2eed7Sopenharmony_ci}
420