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