feat(release): close handler and microphone gaps

This commit is contained in:
key
2026-07-30 12:01:45 +08:00
parent 8934f13811
commit c16a3e83d7
30 changed files with 830 additions and 49 deletions
@@ -54,6 +54,7 @@ test('Android 运行时主动申请 RECORD_AUDIO 并区分拒绝与永久拒绝'
const requested = [];
globalThis.plus = {
android: {
runtimeMainActivity: () => ({ hasWindowFocus: () => true }),
requestPermissions: (permissions, success) => {
requested.push(...permissions);
success(pendingResult);
@@ -75,6 +76,42 @@ test('Android 运行时主动申请 RECORD_AUDIO 并区分拒绝与永久拒绝'
delete globalThis.plus;
});
test('权限 Activity 未归还窗口焦点前不结束授权流程,避免文件选择器被系统吞掉', async () => {
let focused = false;
let importedActivity = false;
const activity = { hasWindowFocus: () => focused };
globalThis.plus = {
android: {
importClass: (target) => {
assert.equal(target, activity);
importedActivity = true;
},
runtimeMainActivity: () => activity,
requestPermissions: (_permissions, success) => {
success({ deniedAlways: ['android.permission.RECORD_AUDIO'] });
}
}
};
const { requestMicrophonePermission } = await load();
const lifecycle = await vite.ssrLoadModule('/src/services/file-selection-lifecycle.ts');
let resolved = false;
const permission = requestMicrophonePermission().then((result) => {
resolved = true;
return result;
});
await new Promise((resolve) => setTimeout(resolve, 20));
assert.equal(importedActivity, true);
assert.equal(lifecycle.isPlatformNativeActivityActive(), true);
assert.equal(lifecycle.isPlatformFileSelectionActive(), false);
assert.equal(resolved, false);
focused = true;
assert.equal(await permission, 'denied-always');
assert.equal(resolved, true);
assert.equal(lifecycle.isPlatformNativeActivityActive(), false);
});
test('非 App 运行时返回 unsupported,交由平台原生授权流程处理', async () => {
delete globalThis.plus;
const { requestMicrophonePermission } = await load();