From 4b03c1f66a4de257a4046784a0199c003db39156 Mon Sep 17 00:00:00 2001 From: baoyang Date: Sat, 24 Aug 2024 09:52:52 +0000 Subject: [PATCH] fix the problem of multiple dialogs Signed-off-by: baoyang Change-Id: I662dd0074633fc11a640b59a23412a40564868e4 --- AppScope/app.json | 4 +-- AppScope/app.json5 | 4 +-- .../SecurityExtAbility/SecurityExtAbility.ts | 29 +++++++++++----- .../main/ets/common/utils/globalContext.ts | 1 + .../src/main/ets/pages/securityDialog.ets | 33 ++++++++++--------- 5 files changed, 44 insertions(+), 27 deletions(-) diff --git a/AppScope/app.json b/AppScope/app.json index 48a6165..b84bde7 100644 --- a/AppScope/app.json +++ b/AppScope/app.json @@ -4,8 +4,8 @@ "app": { "bundleName": "com.ohos.permissionmanager", "vendor": "example", - "versionCode": 1000067, - "versionName": "1.6.7", + "versionCode": 1000068, + "versionName": "1.6.8", "icon": "$media:app_icon", "label": "$string:app_name", "minAPIVersion": 12, diff --git a/AppScope/app.json5 b/AppScope/app.json5 index e5a7249..2079465 100644 --- a/AppScope/app.json5 +++ b/AppScope/app.json5 @@ -16,8 +16,8 @@ "app": { "bundleName": "com.ohos.permissionmanager", "vendor": "example", - "versionCode": 1000067, - "versionName": "1.6.7", + "versionCode": 1000068, + "versionName": "1.6.8", "icon": "$media:app_icon", "label": "$string:app_name", "minAPIVersion": 12, diff --git a/permissionmanager/src/main/ets/SecurityExtAbility/SecurityExtAbility.ts b/permissionmanager/src/main/ets/SecurityExtAbility/SecurityExtAbility.ts index 14af9bc..983f1bd 100644 --- a/permissionmanager/src/main/ets/SecurityExtAbility/SecurityExtAbility.ts +++ b/permissionmanager/src/main/ets/SecurityExtAbility/SecurityExtAbility.ts @@ -68,16 +68,29 @@ export default class SecurityExtensionAbility extends extension { private async createWindow(name: string, windowType, rect, want): Promise { console.info(TAG + 'create securityWindow'); + let dialogSet: Set = GlobalContext.load('dialogSet'); + if (!dialogSet) { + dialogSet = new Set; + console.info(TAG + 'new dialogSet'); + GlobalContext.store('dialogSet', dialogSet); + } + let callerToken: string = want.parameters['ohos.aafwk.param.callerBundleName']; + console.info(TAG + 'callerToken = ' + callerToken); + if (dialogSet.has(callerToken)) { + console.info(TAG + 'window of ' + callerToken + ' 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, () => { win.destroyWindow(); - let windowNum: number = GlobalContext.load('windowNum'); - windowNum --; - GlobalContext.store('windowNum', windowNum); - console.info(TAG + 'windowNum:' + windowNum); - if (windowNum === 0) { + let dialogSet: Set = GlobalContext.load('dialogSet'); + let callerToken: string = want.parameters['ohos.aafwk.param.callerBundleName']; + dialogSet.delete(callerToken); + console.info(TAG + 'window of ' + callerToken + ' is destroyed'); + GlobalContext.store('dialogSet', dialogSet); + if (dialogSet.size === 0) { this.context.terminateSelf(); } }); @@ -87,9 +100,9 @@ export default class SecurityExtensionAbility extends extension { win.setWindowBackgroundColor(BG_COLOR); await win.showWindow(); console.info(TAG + 'showWindow end.'); - globalThis.windowNum ++; - console.info(TAG + 'windowNum:' + globalThis.windowNum); - GlobalContext.store('windowNum', globalThis.windowNum); + dialogSet.add(callerToken); + console.info(TAG + 'window of ' + callerToken + ' is created'); + GlobalContext.store('dialogSet', dialogSet); this.monitorFold(win); } catch (err) { console.error(TAG + `window create failed! err: ${JSON.stringify(err)}`); diff --git a/permissionmanager/src/main/ets/common/utils/globalContext.ts b/permissionmanager/src/main/ets/common/utils/globalContext.ts index 6ee3088..edb3b59 100644 --- a/permissionmanager/src/main/ets/common/utils/globalContext.ts +++ b/permissionmanager/src/main/ets/common/utils/globalContext.ts @@ -20,6 +20,7 @@ export class GlobalContext { bundleName: string; globalState: string; windowNum: number; + dialogSet: Set; public static getContext(): GlobalContext { if (!GlobalContext.instance) { diff --git a/permissionmanager/src/main/ets/pages/securityDialog.ets b/permissionmanager/src/main/ets/pages/securityDialog.ets index b028008..81ae3a5 100644 --- a/permissionmanager/src/main/ets/pages/securityDialog.ets +++ b/permissionmanager/src/main/ets/pages/securityDialog.ets @@ -63,11 +63,12 @@ struct SecurityDialog { action: () => { this.dialogController?.close(); this.win.destroyWindow(); - let windowNum: number = GlobalContext.load('windowNum'); - windowNum --; - Log.info(TAG + 'windowNum:' + windowNum); - GlobalContext.store('windowNum', windowNum); - if (windowNum === 0) { + let dialogSet: Set = GlobalContext.load('dialogSet'); + let callerToken: string = this.want.parameters['ohos.aafwk.param.callerBundleName']; + dialogSet.delete(callerToken); + Log.info(TAG + 'window of ' + callerToken + ' is destroyed'); + GlobalContext.store('dialogSet', dialogSet); + if (dialogSet.size === 0) { this.context.terminateSelf(); } } @@ -85,11 +86,12 @@ struct SecurityDialog { autoCancel: false, cancel: () => { this.win.destroyWindow(); - let windowNum: number = GlobalContext.load('windowNum'); - windowNum --; - Log.info(TAG + 'windowNum:' + windowNum); - GlobalContext.store('windowNum', windowNum); - if (windowNum === 0) { + let dialogSet: Set = GlobalContext.load('dialogSet'); + let callerToken: string = this.want.parameters['ohos.aafwk.param.callerBundleName']; + dialogSet.delete(callerToken); + Log.info(TAG + 'window of ' + callerToken + ' is destroyed'); + GlobalContext.store('dialogSet', dialogSet); + if (dialogSet.size === 0) { this.context.terminateSelf(); } } @@ -216,11 +218,12 @@ struct SecurityDialog { data.reclaim(); reply.reclaim(); this.win.destroyWindow(); - let windowNum: number = GlobalContext.load('windowNum'); - windowNum --; - Log.info(TAG + 'windowNum:' + windowNum); - GlobalContext.store('windowNum', windowNum); - if (windowNum === 0) { + let dialogSet: Set = GlobalContext.load('dialogSet'); + let callerToken: string = this.want.parameters['ohos.aafwk.param.callerBundleName']; + dialogSet.delete(callerToken); + Log.info(TAG + 'window of ' + callerToken + ' is destroyed'); + GlobalContext.store('dialogSet', dialogSet); + if (dialogSet.size === 0) { this.context.terminateSelf(); } }) -- Gitee