From c0d0fefed8a4f5b5d7a43083ffaa87061f2effc9 Mon Sep 17 00:00:00 2001 From: li-li-wang Date: Mon, 30 Jun 2025 11:25:19 +0800 Subject: [PATCH] =?UTF-8?q?=E7=80=91=E5=B8=83=E6=B5=81=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: li-li-wang --- ...tyExtAbility.ts => SecurityExtAbility.ets} | 81 ++++++++++--------- .../src/main/ets/common/model/definition.ets | 5 ++ .../src/main/ets/common/model/typedef.ets | 7 ++ .../src/main/ets/pages/securityDialog.ets | 65 +++++---------- .../src/main/ets/pages/securityToast.ets | 66 +++++++++------ permissionmanager/src/main/module.json | 2 +- permissionmanager/src/main/module.json5 | 2 +- 7 files changed, 114 insertions(+), 114 deletions(-) rename permissionmanager/src/main/ets/SecurityExtAbility/{SecurityExtAbility.ts => SecurityExtAbility.ets} (59%) diff --git a/permissionmanager/src/main/ets/SecurityExtAbility/SecurityExtAbility.ts b/permissionmanager/src/main/ets/SecurityExtAbility/SecurityExtAbility.ets similarity index 59% rename from permissionmanager/src/main/ets/SecurityExtAbility/SecurityExtAbility.ts rename to permissionmanager/src/main/ets/SecurityExtAbility/SecurityExtAbility.ets index 3251809..6913152 100644 --- a/permissionmanager/src/main/ets/SecurityExtAbility/SecurityExtAbility.ts +++ b/permissionmanager/src/main/ets/SecurityExtAbility/SecurityExtAbility.ets @@ -17,55 +17,52 @@ import extension from '@ohos.app.ability.ServiceExtensionAbility'; import window from '@ohos.window'; import { GlobalContext } from '../common/utils/globalContext'; import { Configuration } from '@ohos.app.ability.Configuration'; +import Want from '@ohos.app.ability.Want'; +import { Property, NavigationBarRect } from '../common/model/typedef'; +import { NotifyType } from '../common/model/definition'; +import { Log } from '../common/utils/utils'; -const TAG = 'PermissionManager_Log:'; const BG_COLOR = '#00000000'; -enum NotifyType { - Toast = 1, - Dialog = 0 -} - export default class SecurityExtensionAbility extends extension { /** * Lifecycle function, called back when a service extension is started for initialization. */ - onCreate(want): void { - console.info(TAG + 'SecurityExtensionAbility onCreate, ability name is ' + want.abilityName); + onCreate(want: Want): void { + Log.info(`SecurityExtensionAbility onCreate, ability name is ${want.abilityName}.`); globalThis.windowNum = 0; - console.info(TAG + 'Set windowNum = 0'); + Log.info('Set windowNum = 0'); } /** * Lifecycle function, called back when a service extension is started or recall. */ - onRequest(want, startId): void { - console.info(TAG + 'SecurityExtensionAbility onRequest. start id is ' + startId); - console.info(TAG + 'want: ' + JSON.stringify(want)); + onRequest(want: Want, startId: number): void { + Log.info(`SecurityExtensionAbility onRequest. start id is ${startId}.`); try { - let width = want.parameters['ohos.display.width'] ?? 0; - let height = want.parameters['ohos.display.height'] ?? 0; - let top = want.parameters['ohos.display.top'] ?? 0; - let navigationBarRect = { + let width = want.parameters?.['ohos.display.width'] as number ?? 0; + let height = want.parameters?.['ohos.display.height'] as number ?? 0; + let top = want.parameters?.['ohos.display.top'] as number ?? 0; + let navigationBarRect: NavigationBarRect = { left: 0, top: top, width: width, height: height }; - let notifyType = want.parameters['ohos.ability.notify.type'] ?? 0; + let notifyType = want.parameters?.['ohos.ability.notify.type'] ?? 0; if (notifyType === NotifyType.Toast) { try { startId > 1 && window.findWindow(`SaveButtonTip${startId - 1}`).destroyWindow(); } catch (exception) { - console.error(`Failed to find the Window. Cause code: ${exception.code}, message: ${exception.message}`); - } + Log.error(`Failed to find the Window. Cause code: ${exception.code}, message: ${exception.message}.`); + }; this.createToast('SaveButtonTip' + startId, window.WindowType.TYPE_SYSTEM_TOAST, navigationBarRect, want); } else { this.createWindow('SecurityDialog' + startId, window.WindowType.TYPE_DIALOG, navigationBarRect, want); } } catch (exception) { - console.error(TAG + 'Failed to obtain the default display object. Code: ' + JSON.stringify(exception)); + Log.error(`Failed to obtain the default display object. Code: ${JSON.stringify(exception)}.`); }; } @@ -73,36 +70,39 @@ export default class SecurityExtensionAbility extends extension { * Lifecycle function, called back before a service extension is destroyed. */ onDestroy(): void { - console.info(TAG + 'SecurityExtensionAbility onDestroy.'); + Log.info('SecurityExtensionAbility onDestroy.'); } onConfigurationUpdate(newConfig: Configuration): void { - console.info(TAG + 'onConfigurationUpdate: ' + JSON.stringify(newConfig)); + Log.info(`onConfigurationUpdate: ${JSON.stringify(newConfig)}.`); } - private async createWindow(name: string, windowType, rect, want): Promise { - console.info(TAG + 'create securityWindow'); + private async createWindow(name: string, windowType: window.WindowType, rect: NavigationBarRect, + want: Want): Promise { + Log.info('create securityWindow.'); let dialogSet: Set = GlobalContext.load('dialogSet'); if (!dialogSet) { dialogSet = new Set(); - console.info(TAG + 'new dialogSet'); + Log.info('new dialogSet.'); GlobalContext.store('dialogSet', dialogSet); } - let callerToken: number = want.parameters['ohos.caller.uid']; - let windId: number = want.parameters['ohos.ability.params.windowId']; + let callerToken: number = want.parameters?.['ohos.caller.uid'] as number; + let windId: number = want.parameters?.['ohos.ability.params.windowId'] as number; let token: String = String(callerToken) + '_' + String(windId); if (dialogSet.has(token)) { - console.info(TAG + 'window already exists'); + Log.info('window already exists.'); return; } try { const win = await window.createWindow({ ctx: this.context, name, windowType }); - let storage: LocalStorage = new LocalStorage({ 'want': want, 'win': win }); - await win.bindDialogTarget(want.parameters['ohos.ability.params.token'].value, () => { + let property: Record = { 'want': want, 'win': win }; + let storage: LocalStorage = new LocalStorage(property); + let tokenValue = want.parameters?.['ohos.ability.params.token'] as Property; + await win.bindDialogTarget(tokenValue.value, () => { win.destroyWindow(); let dialogSet: Set = GlobalContext.load('dialogSet'); - let callerToken: number = want.parameters['ohos.caller.uid']; - let windId: number = want.parameters['ohos.ability.params.windowId']; + let callerToken: number = want.parameters?.['ohos.caller.uid'] as number; + let windId: number = want.parameters?.['ohos.ability.params.windowId'] as number; let token: String = String(callerToken) + '_' + String(windId); dialogSet.delete(token); GlobalContext.store('dialogSet', dialogSet); @@ -113,22 +113,23 @@ export default class SecurityExtensionAbility extends extension { try { await win.setFollowParentWindowLayoutEnabled(true); } catch (error) { - console.error(TAG + `setFollowParentWindowLayoutEnabled error: ${JSON.stringify(error)}.`); + Log.error(`setFollowParentWindowLayoutEnabled error: ${JSON.stringify(error)}.`); await win.moveWindowTo(rect.left, rect.top); await win.resize(rect.width, rect.height); }; await win.loadContent('pages/securityDialog', storage); win.setWindowBackgroundColor(BG_COLOR); await win.showWindow(); - console.info(TAG + 'showWindow end.'); + Log.info('showWindow end.'); dialogSet.add(token); GlobalContext.store('dialogSet', dialogSet); } catch (err) { - console.error(TAG + `window create failed! err: ${JSON.stringify(err)}`); - } + Log.error(`window create failed! err: ${JSON.stringify(err)}.`); + }; } - private async createToast(name: string, windowType, rect, want): Promise { + private async createToast(name: string, windowType: window.WindowType, rect: NavigationBarRect, + want: Want): Promise { try { const win = await window.createWindow({ ctx: this.context, name, windowType }); let property: Record = { 'want': want, 'win': win }; @@ -138,7 +139,7 @@ export default class SecurityExtensionAbility extends extension { try { await win.setSystemAvoidAreaEnabled(true); } catch (error) { - console.error(TAG + `setSystemAvoidAreaEnabled error: ${JSON.stringify(error)}.`); + Log.error(`setSystemAvoidAreaEnabled error: ${JSON.stringify(error)}.`); }; await win.loadContent('pages/securityToast', storage); win.setWindowBackgroundColor(BG_COLOR); @@ -146,7 +147,7 @@ export default class SecurityExtensionAbility extends extension { await win.setWindowFocusable(false); await win.showWindow(); } catch (error) { - console.error(TAG + `window create failed! err: ${JSON.stringify(error)} `); - } + Log.error(`window create failed! err: ${JSON.stringify(error)}.`); + }; } }; diff --git a/permissionmanager/src/main/ets/common/model/definition.ets b/permissionmanager/src/main/ets/common/model/definition.ets index 2de90c2..59f0c40 100644 --- a/permissionmanager/src/main/ets/common/model/definition.ets +++ b/permissionmanager/src/main/ets/common/model/definition.ets @@ -98,4 +98,9 @@ export enum PermissionOption { REVOKE = 'REVOKE', // 不操作 SKIP = 'SKIP' +} + +export enum NotifyType { + Toast = 1, + Dialog = 0 } \ No newline at end of file diff --git a/permissionmanager/src/main/ets/common/model/typedef.ets b/permissionmanager/src/main/ets/common/model/typedef.ets index a89c375..7ac00ea 100644 --- a/permissionmanager/src/main/ets/common/model/typedef.ets +++ b/permissionmanager/src/main/ets/common/model/typedef.ets @@ -531,4 +531,11 @@ export interface PermissionWithOption { export interface optionAndState { operationResult: number; permissionState: abilityAccessCtrl.GrantStatus; +} + +export interface NavigationBarRect { + left: number; + top: number; + width: number; + height: number; } \ No newline at end of file diff --git a/permissionmanager/src/main/ets/pages/securityDialog.ets b/permissionmanager/src/main/ets/pages/securityDialog.ets index 8b867d7..af977a9 100644 --- a/permissionmanager/src/main/ets/pages/securityDialog.ets +++ b/permissionmanager/src/main/ets/pages/securityDialog.ets @@ -183,7 +183,7 @@ struct CustomDialogWearable { .customizeButton() .backgroundColor('#1F71FF') .onClick(() => { - Log.info('allow click start'); + Log.info('allow click start.'); this.dialogControllerForWearable?.close(); if (this.confirm) { this.confirm(); @@ -197,7 +197,7 @@ struct CustomDialogWearable { .customizeButton() .backgroundColor('#405EA1FF') .onClick(() => { - Log.info('cancel click start'); + Log.info('cancel click start.'); this.dialogControllerForWearable?.close(); if (this.cancel) { this.cancel(); @@ -236,10 +236,10 @@ struct SecurityDialog { dialogControllerForWearable: CustomDialogController | null = new CustomDialogController({ builder: CustomDialogWearable({ cancel: () => { - this.onCancel() + this.onCancel(); }, confirm: () => { - this.onAccept() + this.onAccept(); }, index: $index, appName: $appName, @@ -265,16 +265,7 @@ struct SecurityDialog { buttonStyle: ButtonStyleMode.TEXTUAL, action: () => { this.dialogController?.close(); - this.win.destroyWindow(); - let dialogSet: Set = GlobalContext.load('dialogSet'); - let callerToken: number = this.want.parameters['ohos.caller.uid']; - let windId: number = this.want.parameters['ohos.ability.params.windowId']; - let token: String = String(callerToken) + '_' + String(windId); - dialogSet.delete(token); - GlobalContext.store('dialogSet', dialogSet); - if (dialogSet.size === 0) { - this.context.terminateSelf(); - } + this.onCancel(); } }, { @@ -289,16 +280,7 @@ struct SecurityDialog { }), autoCancel: false, cancel: () => { - this.win.destroyWindow(); - let dialogSet: Set = GlobalContext.load('dialogSet'); - let callerToken: number = this.want.parameters['ohos.caller.uid']; - let windId: number = this.want.parameters['ohos.ability.params.windowId']; - let token: String = String(callerToken) + '_' + String(windId); - dialogSet.delete(token); - GlobalContext.store('dialogSet', dialogSet); - if (dialogSet.size === 0) { - this.context.terminateSelf(); - } + this.onCancel(); }, }); @@ -349,8 +331,8 @@ struct SecurityDialog { } onCancel() { - Log.info('Callback when the first button is clicked'); - this.win.destroyWindow(); + Log.info('Callback when the first button is clicked.'); + this.win?.destroyWindow(); let dialogSet: Set = GlobalContext.load('dialogSet'); let callerToken: number = this.want.parameters['ohos.caller.uid']; let windId: number = this.want.parameters['ohos.ability.params.windowId']; @@ -363,7 +345,7 @@ struct SecurityDialog { } onAccept() { - Log.info('Callback when the second button is clicked'); + Log.info('Callback when the second button is clicked.'); this.destruction(); } @@ -371,15 +353,15 @@ struct SecurityDialog { let uid: number = this.want.parameters['ohos.caller.uid']; try { bundleManager.getAppCloneIdentity(uid).then(cloneInfo => { - Log.info(`getAppCloneIdentity: ${JSON.stringify(cloneInfo)}`); + Log.info(`getAppCloneIdentity: ${JSON.stringify(cloneInfo)}.`); this.appIndex = cloneInfo.appIndex; this.getSelfName(cloneInfo); }).catch((err: BusinessError) => { - Log.error(`getAppCloneIdentity failed: ${JSON.stringify(err)}`); + Log.error(`getAppCloneIdentity failed: ${JSON.stringify(err)}.`); }) } catch (err) { - Log.error(`get appName failed: ${JSON.stringify(err)}`); - } + Log.error(`get appName failed: ${JSON.stringify(err)}.`); + }; } getSelfName(cloneInfo: bundleManager.AppCloneIdentity) { @@ -390,11 +372,11 @@ struct SecurityDialog { data.labelResource.type = RESOURCE_TYPE; this.appName = data.labelResource; }).catch((error: BusinessError) => { - Log.error('getApplicationInfo failed. err is ' + JSON.stringify(error)); + Log.error(`getApplicationInfo failed. err is ${JSON.stringify(error)}.`); }); } catch (err) { - Log.error('getSelfName failed. err is ' + JSON.stringify(err)); - } + Log.error(`getSelfName failed. err is ${JSON.stringify(err)}.`); + }; } getCloneName(cloneInfo: bundleManager.AppCloneIdentity) { @@ -404,8 +386,8 @@ struct SecurityDialog { bundleResourceManager.getBundleResourceInfo(cloneInfo.bundleName, resourceFlag, cloneInfo.appIndex); this.appName = resourceInfo?.label; } catch (err) { - Log.error('getCloneName failed. err is ' + JSON.stringify(err)); - } + Log.error(`getCloneName failed. err is ${JSON.stringify(err)}.`); + }; } destruction() { @@ -425,16 +407,7 @@ struct SecurityDialog { }).finally(() => { data.reclaim(); reply.reclaim(); - this.win.destroyWindow(); - let dialogSet: Set = GlobalContext.load('dialogSet'); - let callerToken: number = this.want.parameters['ohos.caller.uid']; - let windId: number = this.want.parameters['ohos.ability.params.windowId']; - let token: String = String(callerToken) + '_' + String(windId); - dialogSet.delete(token); - GlobalContext.store('dialogSet', dialogSet); - if (dialogSet.size === 0) { - this.context.terminateSelf(); - } + this.onCancel(); }) } } diff --git a/permissionmanager/src/main/ets/pages/securityToast.ets b/permissionmanager/src/main/ets/pages/securityToast.ets index 0dd3eb3..bf5e9fc 100644 --- a/permissionmanager/src/main/ets/pages/securityToast.ets +++ b/permissionmanager/src/main/ets/pages/securityToast.ets @@ -21,9 +21,44 @@ import { DeviceUtil } from '../common/utils/deviceUtil'; import Constants from '../common/utils/constant'; import { WantInfo } from '../common/model/typedef'; +class MyFlexModifier implements AttributeModifier { + + applyNormalAttribute(instance: FlexAttribute): void { + if (DeviceUtil.isPC()) { + instance.padding($r('sys.float.padding_level4')) + instance.shadow({ + radius: Constants.TOAST_FLEX_SHADOW_RADIUS_40, + color: $r('app.color.outerDefaultSMColor'), + offsetX: Constants.TOAST_FLEX_SHADOW_OFFSET_X, + offsetY: Constants.TOAST_FLEX_SHADOW_OFFSET_Y + }) + instance.borderRadius($r('sys.float.corner_radius_level4')) + instance.backgroundBlurStyle(BlurStyle.COMPONENT_REGULAR) + instance.border({ width: '1px', color: '#33ffffff' }) + instance.outline({ width: '1px', color: $r('app.color.outline'), radius: $r('sys.float.corner_radius_level4') }) + } else { + instance.padding({ + top: Constants.PADDING_8, + right: Constants.PADDING_16, + bottom: Constants.PADDING_8, + left: Constants.PADDING_16 + }) + instance.shadow({ + radius: Constants.TOAST_FLEX_SHADOW_RADIUS_60, + color: $r('app.color.outerDefaultMDColor'), + offsetX: Constants.TOAST_FLEX_SHADOW_OFFSET_X, + offsetY: Constants.TOAST_FLEX_SHADOW_OFFSET_Y + }) + instance.borderRadius($r('sys.float.corner_radius_level9')) + instance.backgroundBlurStyle(BlurStyle.COMPONENT_ULTRA_THICK) + } + } +} + @Entry({ useSharedStorage: true }) @Component struct SecurityToast { + @State modifier: MyFlexModifier = new MyFlexModifier(); @LocalStorageLink('want') want: WantInfo = new WantInfo([]); @LocalStorageLink('win') win: window.Window = {} as window.Window; @State alpha: number = 0; @@ -54,7 +89,7 @@ struct SecurityToast { }); } catch (error) { Log.error(`sendAccessibilityEvent failed, error code: ${error.code}, message: ${error.message}.`); - } + }; } getWinAvoidArea() { @@ -103,7 +138,7 @@ struct SecurityToast { display.off('change'); } catch (exception) { Log.error(`Failed to unregister callback. Cause code: ${exception.code}, message: ${exception.message}`); - } + }; } screenMonitor() { @@ -114,7 +149,7 @@ struct SecurityToast { }); } catch (exception) { Log.error(`Failed to register callback. Code: ${JSON.stringify(exception)}`); - } + }; try { display.on('change', (data: number) => { @@ -133,7 +168,7 @@ struct SecurityToast { }); } catch (exception) { Log.error(`Failed to register callback. Code: ${JSON.stringify(exception)}`); - } + }; } build() { @@ -169,28 +204,7 @@ struct SecurityToast { minHeight: Constants.TOAST_CONSTRAINT_SIZE_MIN_HEIGHT }) .margin(this.setPosition ? { top: this.setOffset - px2vp(this.topRectHeight) } : { bottom: this.setOffset }) - .padding(DeviceUtil.isPC() ? $r('sys.float.padding_level4') : { - top: Constants.PADDING_8, - right: Constants.PADDING_16, - bottom: Constants.PADDING_8, - left: Constants.PADDING_16 - }) - .shadow(DeviceUtil.isPC() ? { - radius: Constants.TOAST_FLEX_SHADOW_RADIUS_40, - color: $r('app.color.outerDefaultSMColor'), - offsetX: Constants.TOAST_FLEX_SHADOW_OFFSET_X, - offsetY: Constants.TOAST_FLEX_SHADOW_OFFSET_Y - } : { - radius: Constants.TOAST_FLEX_SHADOW_RADIUS_60, - color: $r('app.color.outerDefaultMDColor'), - offsetX: Constants.TOAST_FLEX_SHADOW_OFFSET_X, - offsetY: Constants.TOAST_FLEX_SHADOW_OFFSET_Y - }) - .borderRadius(DeviceUtil.isPC() ? $r('sys.float.corner_radius_level4') : $r('sys.float.corner_radius_level9')) - .backgroundBlurStyle(DeviceUtil.isPC() ? BlurStyle.COMPONENT_REGULAR : BlurStyle.COMPONENT_ULTRA_THICK) - .border(DeviceUtil.isPC() ? { width: '1px', color: '#33ffffff' } : {}) - .outline(DeviceUtil.isPC() ? - { width: '1px', color: $r('app.color.outline'), radius: $r('sys.float.corner_radius_level4') } : {}) + .attributeModifier(this.modifier) } .width(Constants.TOAST_COLUMN_WIDTH) .height(Constants.TOAST_COLUMN_HEIGHT) diff --git a/permissionmanager/src/main/module.json b/permissionmanager/src/main/module.json index 2d19d18..1e54051 100644 --- a/permissionmanager/src/main/module.json +++ b/permissionmanager/src/main/module.json @@ -70,7 +70,7 @@ { "icon": "$media:icon", "name": "com.ohos.permissionmanager.SecurityExtAbility", - "srcEntry": "./ets/SecurityExtAbility/SecurityExtAbility.ts", + "srcEntry": "./ets/SecurityExtAbility/SecurityExtAbility.ets", "type": "service", "exported": true, "permissions": ["ohos.permission.GET_SENSITIVE_PERMISSIONS"] diff --git a/permissionmanager/src/main/module.json5 b/permissionmanager/src/main/module.json5 index 3f17053..2b4e1df 100644 --- a/permissionmanager/src/main/module.json5 +++ b/permissionmanager/src/main/module.json5 @@ -82,7 +82,7 @@ { "icon": "$media:icon", "name": "com.ohos.permissionmanager.SecurityExtAbility", - "srcEntry": "./ets/SecurityExtAbility/SecurityExtAbility.ts", + "srcEntry": "./ets/SecurityExtAbility/SecurityExtAbility.ets", "type": "service", "exported": true, "permissions": ["ohos.permission.GET_SENSITIVE_PERMISSIONS"] -- Gitee