From 9241a87d5aa40a8f1b5bd56395560db54879d645 Mon Sep 17 00:00:00 2001 From: baoyang Date: Wed, 3 Sep 2025 21:01:05 +0800 Subject: [PATCH] add userCancelEvent Signed-off-by: baoyang Change-Id: I8ce2544bddd3bc13e28f834bb8c2185b1449e5a5 --- .../SecurityExtAbility/SecurityExtAbility.ets | 4 +- .../src/main/ets/common/model/definition.ets | 9 ++++ .../src/main/ets/common/utils/utils.ets | 28 ++++++++++ .../src/main/ets/pages/securityDialog.ets | 51 ++++++------------- 4 files changed, 55 insertions(+), 37 deletions(-) diff --git a/permissionmanager/src/main/ets/SecurityExtAbility/SecurityExtAbility.ets b/permissionmanager/src/main/ets/SecurityExtAbility/SecurityExtAbility.ets index 4d20ecc..0db74f6 100644 --- a/permissionmanager/src/main/ets/SecurityExtAbility/SecurityExtAbility.ets +++ b/permissionmanager/src/main/ets/SecurityExtAbility/SecurityExtAbility.ets @@ -19,7 +19,8 @@ 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 { Log } from '../common/utils/utils'; +import { Log, destruction } from '../common/utils/utils'; +import { PermissionType } from '../common/model/definition'; const BG_COLOR = '#00000000'; @@ -112,6 +113,7 @@ export default class SecurityExtensionAbility extends extension { GlobalContext.store('dialogSet', dialogSet); } catch (err) { Log.error(`window create failed! err: ${JSON.stringify(err)}.`); + destruction(want, PermissionType.FAILED); }; } }; diff --git a/permissionmanager/src/main/ets/common/model/definition.ets b/permissionmanager/src/main/ets/common/model/definition.ets index c3b50f8..4d2534f 100644 --- a/permissionmanager/src/main/ets/common/model/definition.ets +++ b/permissionmanager/src/main/ets/common/model/definition.ets @@ -99,3 +99,12 @@ export enum PermissionOption { // 不操作 SKIP = 'SKIP' } + +export enum PermissionType { + // 允许 + GRANT = 0, + // 弹窗失败 + FAILED = 1, + // 取消 + CANCELED = 2, +} \ No newline at end of file diff --git a/permissionmanager/src/main/ets/common/utils/utils.ets b/permissionmanager/src/main/ets/common/utils/utils.ets index 1662469..0654b58 100644 --- a/permissionmanager/src/main/ets/common/utils/utils.ets +++ b/permissionmanager/src/main/ets/common/utils/utils.ets @@ -31,6 +31,7 @@ import systemParameterEnhance from '@ohos.systemParameterEnhance'; import UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession'; import uiExtensionHost from '@ohos.uiExtensionHost'; import window from '@ohos.window'; +import rpc from '@ohos.rpc'; import { deviceInfo } from '@kit.BasicServicesKit'; import { GlobalContext } from './globalContext'; @@ -305,6 +306,33 @@ export function supportPermission(): Permission[] { return supportGroup; } +export function destruction(want: Want | null, typeData: number) { + let option = new rpc.MessageOption(); + let data = new rpc.MessageSequence(); + let reply = new rpc.MessageSequence(); + Promise.all([ + data.writeInterfaceToken(Constants.SEC_COMP_DIALOG_CALLBACK), + data.writeInt(typeData) + ]).then(() => { + let proxyValue = want?.parameters?.['ohos.ability.params.callback'] as Record; + if (proxyValue != undefined) { + let proxy = proxyValue.value as rpc.RemoteObject; + if (proxy != undefined) { + proxy.sendMessageRequest(Constants.RESULT_CODE, data, reply, option) + } else { + Log.error('Write result failed! Proxy is undefined.'); + } + } else { + Log.error('Write result failed! ProxyValue is undefined.'); + } + }).catch(() => { + Log.error('Write result failed!'); + }).finally(() => { + data.reclaim(); + reply.reclaim(); + }) +} + export class Log { public static domain: number = 0x8214; public static tag: string = 'PermissionManager_Log'; diff --git a/permissionmanager/src/main/ets/pages/securityDialog.ets b/permissionmanager/src/main/ets/pages/securityDialog.ets index 815de76..13a0a6d 100644 --- a/permissionmanager/src/main/ets/pages/securityDialog.ets +++ b/permissionmanager/src/main/ets/pages/securityDialog.ets @@ -14,14 +14,14 @@ */ import bundleManager from '@ohos.bundle.bundleManager'; import Constants from '../common/utils/constant'; -import rpc from '@ohos.rpc'; import window from '@ohos.window'; import common from '@ohos.app.ability.common'; import { BusinessError } from '@ohos.base'; import { CustomContentDialog } from '@ohos.arkui.advanced.Dialog'; -import { Log, getFontSizeScale } from '../common/utils/utils'; -import { Param, WantInfo, DialogInfo } from '../common/model/typedef'; +import { Log, getFontSizeScale, destruction } from '../common/utils/utils'; +import { Param, DialogInfo } from '../common/model/typedef'; import { GlobalContext } from '../common/utils/globalContext'; +import { PermissionType } from '../common/model/definition'; import bundleResourceManager from '@ohos.bundle.bundleResourceManager'; import deviceInfo from '@ohos.deviceInfo'; @@ -219,7 +219,7 @@ struct CustomDialogWearable { @Component struct SecurityDialog { private context = this.getUIContext().getHostContext() as common.ServiceExtensionContext; - @LocalStorageLink('want') want: WantInfo = new WantInfo([]); + @LocalStorageLink('want') want: Want | null = null; @LocalStorageLink('win') win: window.Window = {} as window.Window; @State appName: ResourceStr = 'Application'; @State appIndex: number = 0; @@ -237,10 +237,13 @@ struct SecurityDialog { dialogControllerForWearable: CustomDialogController | null = new CustomDialogController({ builder: CustomDialogWearable({ cancel: () => { + destruction(this.want, PermissionType.CANCELED); this.loadCancel(); }, confirm: () => { - this.onAccept(); + this.dialogControllerForWearable?.close(); + destruction(this.want, PermissionType.GRANT); + this.loadCancel(); }, index: $index, appName: $appName, @@ -265,6 +268,7 @@ struct SecurityDialog { buttonStyle: ButtonStyleMode.TEXTUAL, action: () => { this.dialogController?.close(); + destruction(this.want, PermissionType.CANCELED); this.loadCancel(); } }, @@ -273,7 +277,8 @@ struct SecurityDialog { buttonStyle: ButtonStyleMode.TEXTUAL, action: () => { this.dialogController?.close(); - this.destruction(); + destruction(this.want, PermissionType.GRANT); + this.loadCancel(); } } ], @@ -315,7 +320,7 @@ struct SecurityDialog { async aboutToAppear() { Log.info('onAboutToAppear.'); await this.GetAppName(); - this.index = this.want.parameters['ohos.user.security.type']; + this.index = this.want?.parameters?.['ohos.user.security.type'] as number; if (deviceInfo.deviceType === 'wearable') { this.dialogControllerForWearable?.open(); this.isWearable = true; @@ -335,8 +340,8 @@ struct SecurityDialog { 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']; + let callerToken: number = this.want?.parameters?.['ohos.caller.uid'] as number; + let windId: number = this.want?.parameters?.['ohos.ability.params.windowId'] as number; let token: String = String(callerToken) + '_' + String(windId); dialogSet.delete(token); GlobalContext.store('dialogSet', dialogSet); @@ -345,13 +350,8 @@ struct SecurityDialog { } } - onAccept() { - Log.info('Callback when the second button is clicked.'); - this.destruction(); - } - async GetAppName() { - let uid: number = this.want.parameters['ohos.caller.uid']; + let uid: number = this.want?.parameters?.['ohos.caller.uid'] as number; try { const cloneInfo = await bundleManager.getAppCloneIdentity(uid); Log.info(`getAppCloneIdentity: ${JSON.stringify(cloneInfo)}.`); @@ -384,25 +384,4 @@ struct SecurityDialog { Log.error(`getCloneName failed. err is ${JSON.stringify(err)}.`); }; } - - destruction() { - let option = new rpc.MessageOption(); - let data = new rpc.MessageSequence(); - let reply = new rpc.MessageSequence(); - Promise.all([ - data.writeInterfaceToken(Constants.SEC_COMP_DIALOG_CALLBACK), - data.writeInt(0) - ]).then(() => { - let proxy = this.want.parameters['ohos.ability.params.callback'].value as rpc.RemoteObject; - if (proxy != undefined) { - proxy.sendMessageRequest(Constants.RESULT_CODE, data, reply, option); - } - }).catch(() => { - Log.error('write result failed!'); - }).finally(() => { - data.reclaim(); - reply.reclaim(); - this.loadCancel(); - }) - } }