1c5c2eed7Sopenharmony_ci/*
2c5c2eed7Sopenharmony_ci * Copyright (c) 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_ciimport bundleManager from '@ohos.bundle.bundleManager';
16c5c2eed7Sopenharmony_ciimport Constants from '../common/utils/constant';
17c5c2eed7Sopenharmony_ciimport rpc from '@ohos.rpc';
18c5c2eed7Sopenharmony_ciimport window from '@ohos.window';
19c5c2eed7Sopenharmony_ciimport common from '@ohos.app.ability.common';
20c5c2eed7Sopenharmony_ciimport { BusinessError } from '@ohos.base';
21c5c2eed7Sopenharmony_ciimport { CustomContentDialog } from '@ohos.arkui.advanced.Dialog';
22c5c2eed7Sopenharmony_ciimport {
23c5c2eed7Sopenharmony_ci  Log,
24c5c2eed7Sopenharmony_ci  getFontSizeScale,
25c5c2eed7Sopenharmony_ci  getLimitFontSize
26c5c2eed7Sopenharmony_ci} from '../common/utils/utils';
27c5c2eed7Sopenharmony_ciimport { Param, WantInfo } from '../common/model/typedef';
28c5c2eed7Sopenharmony_ciimport { GlobalContext } from '../common/utils/globalContext';
29c5c2eed7Sopenharmony_ci
30c5c2eed7Sopenharmony_cilet storage = LocalStorage.getShared();
31c5c2eed7Sopenharmony_ciconst TAG = 'PermissionManager_Log:';
32c5c2eed7Sopenharmony_ciconst RESOURCE_TYPE: number = 10003;
33c5c2eed7Sopenharmony_ci
34c5c2eed7Sopenharmony_ci@Entry(storage)
35c5c2eed7Sopenharmony_ci@Component
36c5c2eed7Sopenharmony_cistruct SecurityDialog {
37c5c2eed7Sopenharmony_ci  private context = getContext(this) as common.ServiceExtensionContext;
38c5c2eed7Sopenharmony_ci  @LocalStorageLink('want') want: WantInfo = new WantInfo([]);
39c5c2eed7Sopenharmony_ci  @LocalStorageLink('win') win: window.Window = {} as window.Window;
40c5c2eed7Sopenharmony_ci  @State appName: ResourceStr = 'ToBeInstead';
41c5c2eed7Sopenharmony_ci  @State index: number = 0;
42c5c2eed7Sopenharmony_ci  @State scrollBarWidth: number = Constants.SCROLL_BAR_WIDTH_DEFAULT;
43c5c2eed7Sopenharmony_ci
44c5c2eed7Sopenharmony_ci  securityParams : Array<Param> = [
45c5c2eed7Sopenharmony_ci    new Param(
46c5c2eed7Sopenharmony_ci      $r('app.media.ic_location'), $r('app.string.SecurityTitle_location'), 'app.string.SecurityDescription_location'
47c5c2eed7Sopenharmony_ci    ),
48c5c2eed7Sopenharmony_ci    new Param(
49c5c2eed7Sopenharmony_ci      $r('app.media.rawfile'), $r('app.string.SecurityTitle_mediaFiles'), 'app.string.SecurityDescription_mediaFiles'
50c5c2eed7Sopenharmony_ci    )
51c5c2eed7Sopenharmony_ci  ]
52c5c2eed7Sopenharmony_ci
53c5c2eed7Sopenharmony_ci  dialogController: CustomDialogController | null = new CustomDialogController({
54c5c2eed7Sopenharmony_ci    builder: CustomContentDialog({
55c5c2eed7Sopenharmony_ci      contentBuilder: () => {
56c5c2eed7Sopenharmony_ci        this.buildContent();
57c5c2eed7Sopenharmony_ci      },
58c5c2eed7Sopenharmony_ci      contentAreaPadding: { right: 0 },
59c5c2eed7Sopenharmony_ci      buttons: [
60c5c2eed7Sopenharmony_ci        {
61c5c2eed7Sopenharmony_ci          value: $r('app.string.cancel'),
62c5c2eed7Sopenharmony_ci          buttonStyle: ButtonStyleMode.TEXTUAL,
63c5c2eed7Sopenharmony_ci          action: () => {
64c5c2eed7Sopenharmony_ci            this.dialogController?.close();
65c5c2eed7Sopenharmony_ci            this.win.destroyWindow();
66c5c2eed7Sopenharmony_ci            let dialogSet: Set<string> = GlobalContext.load('dialogSet');
67c5c2eed7Sopenharmony_ci            let callerToken: string = this.want.parameters['ohos.aafwk.param.callerBundleName'];
68c5c2eed7Sopenharmony_ci            dialogSet.delete(callerToken);
69c5c2eed7Sopenharmony_ci            GlobalContext.store('dialogSet', dialogSet);
70c5c2eed7Sopenharmony_ci            if (dialogSet.size === 0) {
71c5c2eed7Sopenharmony_ci              this.context.terminateSelf();
72c5c2eed7Sopenharmony_ci            }
73c5c2eed7Sopenharmony_ci          }
74c5c2eed7Sopenharmony_ci        },
75c5c2eed7Sopenharmony_ci        {
76c5c2eed7Sopenharmony_ci          value: $r('app.string.allow'),
77c5c2eed7Sopenharmony_ci          buttonStyle: ButtonStyleMode.TEXTUAL,
78c5c2eed7Sopenharmony_ci          action: () => {
79c5c2eed7Sopenharmony_ci            this.dialogController?.close();
80c5c2eed7Sopenharmony_ci            this.destruction();
81c5c2eed7Sopenharmony_ci          }
82c5c2eed7Sopenharmony_ci        }
83c5c2eed7Sopenharmony_ci      ],
84c5c2eed7Sopenharmony_ci    }),
85c5c2eed7Sopenharmony_ci    autoCancel: false,
86c5c2eed7Sopenharmony_ci    cancel: () => {
87c5c2eed7Sopenharmony_ci      this.win.destroyWindow();
88c5c2eed7Sopenharmony_ci      let dialogSet: Set<string> = GlobalContext.load('dialogSet');
89c5c2eed7Sopenharmony_ci      let callerToken: string = this.want.parameters['ohos.aafwk.param.callerBundleName'];
90c5c2eed7Sopenharmony_ci      dialogSet.delete(callerToken);
91c5c2eed7Sopenharmony_ci      GlobalContext.store('dialogSet', dialogSet);
92c5c2eed7Sopenharmony_ci      if (dialogSet.size === 0) {
93c5c2eed7Sopenharmony_ci        this.context.terminateSelf();
94c5c2eed7Sopenharmony_ci      }
95c5c2eed7Sopenharmony_ci    }
96c5c2eed7Sopenharmony_ci  });
97c5c2eed7Sopenharmony_ci
98c5c2eed7Sopenharmony_ci  @Builder
99c5c2eed7Sopenharmony_ci  buildContent(): void {
100c5c2eed7Sopenharmony_ci    Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) {
101c5c2eed7Sopenharmony_ci      Scroll() {
102c5c2eed7Sopenharmony_ci        Column() {
103c5c2eed7Sopenharmony_ci          Column() {
104c5c2eed7Sopenharmony_ci            SymbolGlyph($r('sys.symbol.person_shield_fill'))
105c5c2eed7Sopenharmony_ci              .width(Constants.SECURITY_ICON_WIDTH)
106c5c2eed7Sopenharmony_ci              .height(Constants.SECURITY_ICON_HEIGHT)
107c5c2eed7Sopenharmony_ci              .fontSize(Constants.FONT_SIZE_28)
108c5c2eed7Sopenharmony_ci              .fontColor([$r('sys.color.brand')])
109c5c2eed7Sopenharmony_ci              .border({
110c5c2eed7Sopenharmony_ci                width: Constants.BORDER_WIDTH_1,
111c5c2eed7Sopenharmony_ci                color: $r('app.color.icon_border'),
112c5c2eed7Sopenharmony_ci                radius: Constants.SECURITY_ICON_WIDTH * 14 / 54
113c5c2eed7Sopenharmony_ci              })
114c5c2eed7Sopenharmony_ci              .padding(Constants.PADDING_10)
115c5c2eed7Sopenharmony_ci            if (this.index === 1) {
116c5c2eed7Sopenharmony_ci              Image(this.securityParams[this.index].icon)
117c5c2eed7Sopenharmony_ci                .width(Constants.IMAGE_LENGTH_20)
118c5c2eed7Sopenharmony_ci                .height(Constants.IMAGE_LENGTH_20)
119c5c2eed7Sopenharmony_ci                .syncLoad(true)
120c5c2eed7Sopenharmony_ci                .position({ x: Constants.IMAGE_POSITION_28, y: Constants.IMAGE_POSITION_28 })
121c5c2eed7Sopenharmony_ci                .border({
122c5c2eed7Sopenharmony_ci                  width: Constants.BORDER_WIDTH_1,
123c5c2eed7Sopenharmony_ci                  color: $r('app.color.icon_border'),
124c5c2eed7Sopenharmony_ci                  radius: Constants.IMAGE_LENGTH_20 * 14 / 54
125c5c2eed7Sopenharmony_ci                })
126c5c2eed7Sopenharmony_ci            } else {
127c5c2eed7Sopenharmony_ci              SymbolGlyph($r('sys.symbol.local_fill'))
128c5c2eed7Sopenharmony_ci                .width(Constants.IMAGE_LENGTH_20)
129c5c2eed7Sopenharmony_ci                .height(Constants.IMAGE_LENGTH_20)
130c5c2eed7Sopenharmony_ci                .fontSize(Constants.FONT_SIZE_12)
131c5c2eed7Sopenharmony_ci                .fontColor([Color.White])
132c5c2eed7Sopenharmony_ci                .backgroundColor($r('app.color.local_background_color'))
133c5c2eed7Sopenharmony_ci                .padding(Constants.PADDING_4)
134c5c2eed7Sopenharmony_ci                .position({ x: Constants.IMAGE_POSITION_28, y: Constants.IMAGE_POSITION_28 })
135c5c2eed7Sopenharmony_ci                .border({
136c5c2eed7Sopenharmony_ci                  width: Constants.BORDER_WIDTH_1,
137c5c2eed7Sopenharmony_ci                  color: $r('app.color.icon_border'),
138c5c2eed7Sopenharmony_ci                  radius: Constants.IMAGE_LENGTH_20 * 14 / 54
139c5c2eed7Sopenharmony_ci                })
140c5c2eed7Sopenharmony_ci            }
141c5c2eed7Sopenharmony_ci          }
142c5c2eed7Sopenharmony_ci          .backgroundColor($r('app.color.icon_bg'))
143c5c2eed7Sopenharmony_ci          .borderRadius(Constants.SECURITY_ICON_WIDTH * 14 / 54)
144c5c2eed7Sopenharmony_ci          Column() { // content
145c5c2eed7Sopenharmony_ci            Column() {
146c5c2eed7Sopenharmony_ci              Text(this.securityParams[this.index].label)
147c5c2eed7Sopenharmony_ci                .textAlign(TextAlign.Center)
148c5c2eed7Sopenharmony_ci                .fontColor($r('sys.color.font_primary'))
149c5c2eed7Sopenharmony_ci                .fontSize($r('sys.float.Title_S'))
150c5c2eed7Sopenharmony_ci                .fontWeight(FontWeight.Bold)
151c5c2eed7Sopenharmony_ci                .textOverflow({ overflow: TextOverflow.Ellipsis })
152c5c2eed7Sopenharmony_ci                .maxLines(Constants.SECURITY_HEADER_MAX_LINES)
153c5c2eed7Sopenharmony_ci                .minFontSize(
154c5c2eed7Sopenharmony_ci                  getLimitFontSize(getFontSizeScale(),
155c5c2eed7Sopenharmony_ci                  Constants.SECURITY_HEADER_MAX_SCALE,
156c5c2eed7Sopenharmony_ci                  $r('sys.float.Subtitle_M'),
157c5c2eed7Sopenharmony_ci                  $r('sys.float.Title_S'))
158c5c2eed7Sopenharmony_ci                )
159c5c2eed7Sopenharmony_ci                .maxFontSize(
160c5c2eed7Sopenharmony_ci                  getLimitFontSize(getFontSizeScale(),
161c5c2eed7Sopenharmony_ci                  Constants.SECURITY_HEADER_MAX_SCALE,
162c5c2eed7Sopenharmony_ci                  $r('sys.float.Title_S'),
163c5c2eed7Sopenharmony_ci                  $r('sys.float.Title_S'))
164c5c2eed7Sopenharmony_ci                )
165c5c2eed7Sopenharmony_ci                .heightAdaptivePolicy(TextHeightAdaptivePolicy.MIN_FONT_SIZE_FIRST)
166c5c2eed7Sopenharmony_ci            }
167c5c2eed7Sopenharmony_ci            .constraintSize({ minHeight: Constants.HEADLINE_HEIGHT })
168c5c2eed7Sopenharmony_ci            .justifyContent(FlexAlign.Center)
169c5c2eed7Sopenharmony_ci            .padding({
170c5c2eed7Sopenharmony_ci              top: Constants.DEFAULT_PADDING_TOP,
171c5c2eed7Sopenharmony_ci              bottom: Constants.DEFAULT_PADDING_BOTTOM,
172c5c2eed7Sopenharmony_ci            })
173c5c2eed7Sopenharmony_ci
174c5c2eed7Sopenharmony_ci            Text($r(this.securityParams[this.index].description, this.appName))
175c5c2eed7Sopenharmony_ci              .textAlign(TextAlign.Start)
176c5c2eed7Sopenharmony_ci              .fontColor($r('sys.color.font_primary'))
177c5c2eed7Sopenharmony_ci              .fontSize($r('sys.float.Body_L'))
178c5c2eed7Sopenharmony_ci              .lineHeight(Constants.TEXT_SMALL_LINE_HEIGHT)
179c5c2eed7Sopenharmony_ci              .maxFontScale(Constants.DIALOG_TEXT_MAX_SCALE)
180c5c2eed7Sopenharmony_ci          }
181c5c2eed7Sopenharmony_ci        }
182c5c2eed7Sopenharmony_ci        .clip(true)
183c5c2eed7Sopenharmony_ci      }
184c5c2eed7Sopenharmony_ci      .padding({ left: Constants.PADDING_24, right: Constants.PADDING_24 })
185c5c2eed7Sopenharmony_ci      .margin({ top: Constants.MARGIN_24 })
186c5c2eed7Sopenharmony_ci      .edgeEffect(EdgeEffect.Spring, { alwaysEnabled: false })
187c5c2eed7Sopenharmony_ci      .scrollBarWidth(this.scrollBarWidth)
188c5c2eed7Sopenharmony_ci      .onScrollStart(() => {
189c5c2eed7Sopenharmony_ci        this.scrollBarWidth = Constants.SCROLL_BAR_WIDTH_ACTIVE;
190c5c2eed7Sopenharmony_ci      })
191c5c2eed7Sopenharmony_ci      .onScrollStop(() => {
192c5c2eed7Sopenharmony_ci        this.scrollBarWidth = Constants.SCROLL_BAR_WIDTH_DEFAULT;
193c5c2eed7Sopenharmony_ci      })
194c5c2eed7Sopenharmony_ci    }
195c5c2eed7Sopenharmony_ci  }
196c5c2eed7Sopenharmony_ci
197c5c2eed7Sopenharmony_ci  build() {}
198c5c2eed7Sopenharmony_ci
199c5c2eed7Sopenharmony_ci  aboutToAppear() {
200c5c2eed7Sopenharmony_ci    Log.info('onAboutToAppear.');
201c5c2eed7Sopenharmony_ci    this.GetAppName();
202c5c2eed7Sopenharmony_ci    this.index = this.want.parameters['ohos.user.security.type'];
203c5c2eed7Sopenharmony_ci    this.dialogController?.open();
204c5c2eed7Sopenharmony_ci  }
205c5c2eed7Sopenharmony_ci
206c5c2eed7Sopenharmony_ci  aboutToDisappear() {
207c5c2eed7Sopenharmony_ci    this.dialogController = null;
208c5c2eed7Sopenharmony_ci  }
209c5c2eed7Sopenharmony_ci
210c5c2eed7Sopenharmony_ci  GetAppName() {
211c5c2eed7Sopenharmony_ci    let bundleName: string = this.want.parameters['ohos.aafwk.param.callerBundleName'];
212c5c2eed7Sopenharmony_ci    bundleManager.getApplicationInfo(bundleName, bundleManager.ApplicationFlag.GET_APPLICATION_INFO_DEFAULT)
213c5c2eed7Sopenharmony_ci      .then(data => {
214c5c2eed7Sopenharmony_ci        data.labelResource.params = [];
215c5c2eed7Sopenharmony_ci        data.labelResource.type = RESOURCE_TYPE;
216c5c2eed7Sopenharmony_ci        this.appName = data.labelResource;
217c5c2eed7Sopenharmony_ci      })
218c5c2eed7Sopenharmony_ci      .catch((error: BusinessError) => {
219c5c2eed7Sopenharmony_ci        Log.error('getApplicationInfo failed. err is ' + JSON.stringify(error));
220c5c2eed7Sopenharmony_ci      });
221c5c2eed7Sopenharmony_ci  }
222c5c2eed7Sopenharmony_ci
223c5c2eed7Sopenharmony_ci  destruction() {
224c5c2eed7Sopenharmony_ci    let option = new rpc.MessageOption();
225c5c2eed7Sopenharmony_ci    let data = new rpc.MessageSequence();
226c5c2eed7Sopenharmony_ci    let reply = new rpc.MessageSequence();
227c5c2eed7Sopenharmony_ci    Promise.all([
228c5c2eed7Sopenharmony_ci      data.writeInterfaceToken(Constants.SEC_COMP_DIALOG_CALLBACK),
229c5c2eed7Sopenharmony_ci      data.writeInt(0)
230c5c2eed7Sopenharmony_ci    ]).then(() => {
231c5c2eed7Sopenharmony_ci      let proxy = this.want.parameters['ohos.ability.params.callback'].value as rpc.RemoteObject;
232c5c2eed7Sopenharmony_ci      if (proxy != undefined) {
233c5c2eed7Sopenharmony_ci        proxy.sendMessageRequest(Constants.RESULT_CODE, data, reply, option);
234c5c2eed7Sopenharmony_ci      }
235c5c2eed7Sopenharmony_ci    }).catch(() => {
236c5c2eed7Sopenharmony_ci      Log.error('write result failed!');
237c5c2eed7Sopenharmony_ci    }).finally(() => {
238c5c2eed7Sopenharmony_ci      data.reclaim();
239c5c2eed7Sopenharmony_ci      reply.reclaim();
240c5c2eed7Sopenharmony_ci      this.win.destroyWindow();
241c5c2eed7Sopenharmony_ci      let dialogSet: Set<string> = GlobalContext.load('dialogSet');
242c5c2eed7Sopenharmony_ci      let callerToken: string = this.want.parameters['ohos.aafwk.param.callerBundleName'];
243c5c2eed7Sopenharmony_ci      dialogSet.delete(callerToken);
244c5c2eed7Sopenharmony_ci      GlobalContext.store('dialogSet', dialogSet);
245c5c2eed7Sopenharmony_ci      if (dialogSet.size === 0) {
246c5c2eed7Sopenharmony_ci        this.context.terminateSelf();
247c5c2eed7Sopenharmony_ci      }
248c5c2eed7Sopenharmony_ci    })
249c5c2eed7Sopenharmony_ci  }
250c5c2eed7Sopenharmony_ci}
251