From 4af9b015823059b92ee296ec5c948d50dcd01adf Mon Sep 17 00:00:00 2001 From: DCloud_LXH <283700113@qq.com> Date: Wed, 14 Aug 2024 11:47:29 +0800 Subject: [PATCH] feat(harmony): uni-usercapturescreen --- .../utssdk/app-harmony/index.uts | 87 +++++ .../utssdk/interface.uts | 300 +++++++++--------- 2 files changed, 237 insertions(+), 150 deletions(-) create mode 100644 uni_modules/uni-usercapturescreen/utssdk/app-harmony/index.uts diff --git a/uni_modules/uni-usercapturescreen/utssdk/app-harmony/index.uts b/uni_modules/uni-usercapturescreen/utssdk/app-harmony/index.uts new file mode 100644 index 0000000..5e41523 --- /dev/null +++ b/uni_modules/uni-usercapturescreen/utssdk/app-harmony/index.uts @@ -0,0 +1,87 @@ +import { display } from '@kit.ArkUI'; +import { window } from '@kit.ArkUI'; +import { Callback, BusinessError } from '@kit.BasicServicesKit'; + +import { getAbilityContext, UTSHarmony } from '@dcloudio/uni-runtime'; + +import { + OnUserCaptureScreen, UserCaptureScreenCallback, + OffUserCaptureScreen, + SetUserCaptureScreen, SetUserCaptureScreenOptions, SetUserCaptureScreenSuccess +} from '../interface.uts'; + +const onUserCaptureScreenCallbacks: Function[] = [] + +const harmonyCaptureStatusChange: Callback = (captureStatus: boolean) => { + if (captureStatus) { + onUserCaptureScreenCallbacks.forEach(cb => { + typeof cb === 'function' && cb() + }) + } +} + +display.on('captureStatusChange', harmonyCaptureStatusChange) + +export const onUserCaptureScreen: OnUserCaptureScreen = function (callback: UserCaptureScreenCallback | null) { + if (callback) { + onUserCaptureScreenCallbacks.push(callback) + } +} + +export const offUserCaptureScreen: OffUserCaptureScreen = function (callback: UserCaptureScreenCallback | null) { + if (callback) { + const index = onUserCaptureScreenCallbacks.indexOf(callback) + if (index > -1) { + onUserCaptureScreenCallbacks.splice(index, 1) + } + } +} + +export const setUserCaptureScreen: SetUserCaptureScreen = function (options: SetUserCaptureScreenOptions) { + const errSubject = 'uni-usercapturescreen' + const setUserCaptureScreenSuccess: SetUserCaptureScreenSuccess = {} + window.getLastWindow(getAbilityContext()!, (err, window) => { + const errCode: number = err.code; + if (errCode) { + options.fail?.({ + errCode: (err as BusinessError).code, + errSubject, + errMsg: `setUserCaptureScreen:fail ${(err as BusinessError).message}` + } as IUniError) + options.complete?.(setUserCaptureScreenSuccess); + return; + } else { + try { + UTSHarmony.requestSystemPermission(['ohos.permission.PRIVACY_WINDOW'], (allRight: boolean) => { + if (allRight) { + window.setWindowPrivacyMode(!options.enable, (err: BusinessError) => { + const errCode: number = err.code; + if (errCode) { + options.fail?.({ + errCode: err.code, + errSubject, + errMsg: `setUserCaptureScreen:fail ${err.message}` + } as IUniError) + options.complete?.(setUserCaptureScreenSuccess); + return; + } + options.success?.(setUserCaptureScreenSuccess); + options.complete?.(setUserCaptureScreenSuccess); + }); + } else { + throw new Error('permission denied') + } + }, () => { + throw new Error('permission denied') + }) + } catch (err) { + options.fail?.({ + errCode: (err as BusinessError).code, + errSubject, + errMsg: `setUserCaptureScreen:fail ${(err as BusinessError).message}` + } as IUniError) + options.complete?.(setUserCaptureScreenSuccess); + } + } + }) +} diff --git a/uni_modules/uni-usercapturescreen/utssdk/interface.uts b/uni_modules/uni-usercapturescreen/utssdk/interface.uts index 90b89cf..e8a3611 100644 --- a/uni_modules/uni-usercapturescreen/utssdk/interface.uts +++ b/uni_modules/uni-usercapturescreen/utssdk/interface.uts @@ -1,170 +1,170 @@ /** * uni.onUserCaptureScreen/uni.offUserCaptureScreen回调参数 */ -export type OnUserCaptureScreenCallbackResult = { + export type OnUserCaptureScreenCallbackResult = { + /** + * 截屏文件路径(仅Android返回) + */ + path ?: string + } + /** - * 截屏文件路径(仅Android返回) + * uni.onUserCaptureScreen/uni.offUserCaptureScreen回调函数定义 */ - path ?: string -} - -/** - * uni.onUserCaptureScreen/uni.offUserCaptureScreen回调函数定义 - */ -export type UserCaptureScreenCallback = (res : OnUserCaptureScreenCallbackResult) => void - -export type OnUserCaptureScreen = (callback : UserCaptureScreenCallback | null) => void + export type UserCaptureScreenCallback = (res : OnUserCaptureScreenCallbackResult) => void -export type OffUserCaptureScreen = (callback : UserCaptureScreenCallback | null) => void + export type OnUserCaptureScreen = (callback : UserCaptureScreenCallback | null) => void -/** - * uni.setUserCaptureScreen成功回调参数 - */ -export type SetUserCaptureScreenSuccess = { -} - - -/** - * uni.setUserCaptureScreen成功回调函数定义 - */ -export type SetUserCaptureScreenSuccessCallback = (res : SetUserCaptureScreenSuccess) => void + export type OffUserCaptureScreen = (callback : UserCaptureScreenCallback | null) => void -/** - * uni.setUserCaptureScreen失败回调函数定义 - */ -export type SetUserCaptureScreenFailCallback = (res : UniError) => void - -/** - * uni.setUserCaptureScreen完成回调函数定义 - */ -export type SetUserCaptureScreenCompleteCallback = (res : any) => void + /** + * uni.setUserCaptureScreen成功回调参数 + */ + export type SetUserCaptureScreenSuccess = { + } -/** - * uni.setUserCaptureScreen参数 - */ -export type SetUserCaptureScreenOptions = { - /** - * true: 允许用户截屏 false: 不允许用户截屏,防止用户截屏到应用页面内容 - */ - enable : boolean; /** - * 接口调用成功的回调函数 - */ - // success : SetUserCaptureScreenSuccessCallback | null, - success ?: SetUserCaptureScreenSuccessCallback, + * uni.setUserCaptureScreen成功回调函数定义 + */ + export type SetUserCaptureScreenSuccessCallback = (res : SetUserCaptureScreenSuccess) => void + /** - * 接口调用失败的回调函数 - */ - // fail : SetUserCaptureScreenFailCallback | null, - fail ?: SetUserCaptureScreenFailCallback, + * uni.setUserCaptureScreen失败回调函数定义 + */ + export type SetUserCaptureScreenFailCallback = (res : IUniError) => void + /** - * 接口调用结束的回调函数(调用成功、失败都会执行) - */ - // complete : SetUserCaptureScreenSuccessCallback | SetUserCaptureScreenFailCallback | null - complete ?: SetUserCaptureScreenCompleteCallback -} + * uni.setUserCaptureScreen完成回调函数定义 + */ + export type SetUserCaptureScreenCompleteCallback = (res : any) => void -/** - * 错误码 - * - 12001 "setUserCaptureScreen:system not support" - * - 12010 "setUserCaptureScreen:system internal error" - */ -export type SetUserCaptureScreenErrorCode = 12001 | 12010; -/** - * SetUserCaptureScreen 的错误回调参数 - */ -export interface SetUserCaptureScreenFail extends IUniError { - errCode : SetUserCaptureScreenErrorCode -}; + /** + * uni.setUserCaptureScreen参数 + */ -export type SetUserCaptureScreen = (options : SetUserCaptureScreenOptions) => void + export type SetUserCaptureScreenOptions = { + /** + * true: 允许用户截屏 false: 不允许用户截屏,防止用户截屏到应用页面内容 + */ + enable : boolean; + /** + * 接口调用成功的回调函数 + */ + // success : SetUserCaptureScreenSuccessCallback | null, + success ?: SetUserCaptureScreenSuccessCallback, + /** + * 接口调用失败的回调函数 + */ + // fail : SetUserCaptureScreenFailCallback | null, + fail ?: SetUserCaptureScreenFailCallback, + /** + * 接口调用结束的回调函数(调用成功、失败都会执行) + */ + // complete : SetUserCaptureScreenSuccessCallback | SetUserCaptureScreenFailCallback | null + complete ?: SetUserCaptureScreenCompleteCallback + } -export interface Uni { - /** - * 开启截屏监听 - * - * @param {UserCaptureScreenCallback} callback - * @tutorial https://uniapp.dcloud.net.cn/api/system/capture-screen.html#onusercapturescreen - * @uniPlatform { - * "app": { - * "android": { - * "osVer": "4.4.4", - * "uniVer": "3.7.7", - * "unixVer": "3.9.0" - * }, - * "ios": { - * "osVer": "12.0", - * "uniVer": "3.7.7", - * "unixVer": "4.11" - * }, - * "harmony": { - * "osVer": "x", - * "uniVer": "x", - * "unixVer": "x" - * } - * } - * } - * @uniVersion 3.7.7 - * @uniVueVersion 2,3 //支持的vue版本 - * @autotest { expectCallback: true } - */ - onUserCaptureScreen(callback : UserCaptureScreenCallback | null) : void, /** - * 关闭截屏监听 - * - * @param {UserCaptureScreenCallback} callback - * @tutorial https://uniapp.dcloud.net.cn/api/system/capture-screen.html#offusercapturescreen - * @uniPlatform { - * "app": { - * "android": { - * "osVer": "4.4.4", - * "uniVer": "3.7.7", - * "unixVer": "3.9.0" - * }, - * "ios": { - * "osVer": "12.0", - * "uniVer": "3.7.7", - * "unixVer": "4.11" - * }, - * "harmony": { - * "osVer": "x", - * "uniVer": "x", - * "unixVer": "x" - * } - * } - * } - * @uniVersion 3.7.7 - * @uniVueVersion 2,3 //支持的vue版本 - * @autotest { expectCallback: true } + * 错误码 + * - 12001 "setUserCaptureScreen:system not support" + * - 12010 "setUserCaptureScreen:system internal error" */ - offUserCaptureScreen(callback : UserCaptureScreenCallback | null) : void, + export type SetUserCaptureScreenErrorCode = 12001 | 12010; /** - * 设置防截屏 - * - * @param {SetUserCaptureScreenOptions} options - * @tutorial https://uniapp.dcloud.net.cn/api/system/capture-screen.html#setusercapturescreen - * @uniPlatform { - * "app": { - * "android": { - * "osVer": "4.4.4", - * "uniVer": "3.7.7", - * "unixVer": "3.9.0" - * }, - * "ios": { - * "osVer": "13.0", - * "uniVer": "3.7.7", - * "unixVer": "4.11" - * }, - * "harmony": { - * "osVer": "x", - * "uniVer": "x", - * "unixVer": "x" - * } - * } - * } - * @uniVersion 3.7.7 - * @uniVueVersion 2,3 //支持的vue版本 + * SetUserCaptureScreen 的错误回调参数 */ - setUserCaptureScreen(options : SetUserCaptureScreenOptions) : void -} + export interface SetUserCaptureScreenFail extends IUniError { + errCode : SetUserCaptureScreenErrorCode + }; + + export type SetUserCaptureScreen = (options : SetUserCaptureScreenOptions) => void + + export interface Uni { + /** + * 开启截屏监听 + * + * @param {UserCaptureScreenCallback} callback + * @tutorial https://uniapp.dcloud.net.cn/api/system/capture-screen.html#onusercapturescreen + * @uniPlatform { + * "app": { + * "android": { + * "osVer": "4.4.4", + * "uniVer": "3.7.7", + * "unixVer": "3.9.0" + * }, + * "ios": { + * "osVer": "12.0", + * "uniVer": "3.7.7", + * "unixVer": "4.11" + * }, + * "harmony": { + * "osVer": "3.0", + * "uniVer": "4.25", + * "unixVer": "x" + * } + * } + * } + * @uniVersion 3.7.7 + * @uniVueVersion 2,3 //支持的vue版本 + * @autotest { expectCallback: true } + */ + onUserCaptureScreen(callback : UserCaptureScreenCallback | null) : void, + /** + * 关闭截屏监听 + * + * @param {UserCaptureScreenCallback} callback + * @tutorial https://uniapp.dcloud.net.cn/api/system/capture-screen.html#offusercapturescreen + * @uniPlatform { + * "app": { + * "android": { + * "osVer": "4.4.4", + * "uniVer": "3.7.7", + * "unixVer": "3.9.0" + * }, + * "ios": { + * "osVer": "12.0", + * "uniVer": "3.7.7", + * "unixVer": "4.11" + * }, + * "harmony": { + * "osVer": "3.0", + * "uniVer": "4.25",, + * "unixVer": "x" + * } + * } + * } + * @uniVersion 3.7.7 + * @uniVueVersion 2,3 //支持的vue版本 + * @autotest { expectCallback: true } + */ + offUserCaptureScreen(callback : UserCaptureScreenCallback | null) : void, + /** + * 设置防截屏 + * + * @param {SetUserCaptureScreenOptions} options + * @tutorial https://uniapp.dcloud.net.cn/api/system/capture-screen.html#setusercapturescreen + * @uniPlatform { + * "app": { + * "android": { + * "osVer": "4.4.4", + * "uniVer": "3.7.7", + * "unixVer": "3.9.0" + * }, + * "ios": { + * "osVer": "13.0", + * "uniVer": "3.7.7", + * "unixVer": "4.11" + * }, + * "harmony": { + * "osVer": "3.0", + * "uniVer": "4.25", + * "unixVer": "x" + * } + * } + * } + * @uniVersion 3.7.7 + * @uniVueVersion 2,3 //支持的vue版本 + */ + setUserCaptureScreen(options : SetUserCaptureScreenOptions) : void + } -- GitLab