diff --git a/frameworks/ets/ani/privacy/ets/@ohos.privacyManager.ets b/frameworks/ets/ani/privacy/ets/@ohos.privacyManager.ets index b53beac7730cb971234d006f7e934afccd61bfd3..a1e685a225bd8a9d6ddae049c0505bbe1bf1f926 100644 --- a/frameworks/ets/ani/privacy/ets/@ohos.privacyManager.ets +++ b/frameworks/ets/ani/privacy/ets/@ohos.privacyManager.ets @@ -23,6 +23,7 @@ function PARAM_ERROR_MSG(param: string, type: string): string { export { Permissions } export default namespace privacyManager { + loadLibrary("privacy_ani.z"); enum PermissionUsedType { @@ -38,11 +39,17 @@ export default namespace privacyManager { } enum STSErrorCode { + STS_OK = 0, + STS_ERROR_PERMISSION_DENIED = 201, + STS_ERROR_NOT_SYSTEM_APP = 202, + STS_ERROR_PARAM_ILLEGAL = 401, + STS_ERROR_SYSTEM_CAPABILITY_NOT_SUPPORT = 801, + } ; interface AddPermissionUsedRecordOptions { @@ -56,6 +63,12 @@ export default namespace privacyManager { class PrivacyManagerInner { native addPermissionUsedRecordSync(tokenID: int, permissionName: Permissions, successCount: int, failCount: int, options: AddPermissionUsedRecordOptionsInner): void; + + native stopUsingPermissionExecute(tokenID: int, permissionName: Permissions, pid: int): void; + + native startUsingPermissionExecute(tokenID: int, permissionName: Permissions, pid: int, + usedType: int): void; + } interface UsedRecordDetail { @@ -96,7 +109,7 @@ export default namespace privacyManager { if (typeof permissionName !== "string") { let err = new BusinessError(); err.code = STSErrorCode.STS_ERROR_PARAM_ILLEGAL; - err.data = PARAM_ERROR_MSG("permissionName", "Permissions"); + err.data = PARAM_ERROR_MSG("permissionName", "string"); throw err; } @@ -119,7 +132,7 @@ export default namespace privacyManager { if (typeof permissionName !== "string") { let err = new BusinessError(); err.code = STSErrorCode.STS_ERROR_PARAM_ILLEGAL; - err.data = PARAM_ERROR_MSG("permissionName", "Permissions"); + err.data = PARAM_ERROR_MSG("permissionName", "string"); throw err; } let optionsLocal: AddPermissionUsedRecordOptionsInner = { usedType: PermissionUsedType.NORMAL_TYPE }; @@ -134,6 +147,132 @@ export default namespace privacyManager { }) } + function stopUsingPermission(tokenID: int, permissionName: Permissions): Promise { + if (typeof permissionName !== "string") { + let err = new BusinessError(); + err.code = STSErrorCode.STS_ERROR_PARAM_ILLEGAL; + err.data = PARAM_ERROR_MSG("permissionName", "string"); + throw err; + } + let pid = -1; + let p = new Promise((resolve: (v: undefined) => void, reject: (error: BusinessError) => void): void => { + let p1 = taskpool.execute((): void => { return new PrivacyManagerInner().stopUsingPermissionExecute( + tokenID, permissionName, pid) }); + p1.then(() => { + resolve(undefined); + }).catch((err: BusinessError): void => { + reject(err); + }); + }); + return p; + } + + function stopUsingPermission(tokenID: int, permissionName: Permissions, callback: AsyncCallback): void { + if (typeof permissionName !== "string") { + let err = new BusinessError(); + err.code = STSErrorCode.STS_ERROR_PARAM_ILLEGAL; + err.data = PARAM_ERROR_MSG("permissionName", "string"); + throw err; + } + let pid = -1; + let p2 = taskpool.execute((): void => { + return new PrivacyManagerInner().stopUsingPermissionExecute(tokenID, permissionName, pid) }); + p2.then(() => { + let err = new BusinessError(); + callback(err, undefined); + },(err: BusinessError): void=> { + callback(err, undefined); + }) + } + + function stopUsingPermission(tokenID: int, permissionName: Permissions, pid?: int): Promise { + if (typeof permissionName !== "string") { + let err = new BusinessError(); + err.code = STSErrorCode.STS_ERROR_PARAM_ILLEGAL; + err.data = PARAM_ERROR_MSG("permissionName", "string"); + throw err; + } + let Pid: int = pid ?? -1; + let p = new Promise((resolve: (v: undefined) => void, reject: (error: BusinessError) => void): void => { + let p1 = taskpool.execute((): void => { return new PrivacyManagerInner().stopUsingPermissionExecute( + tokenID, permissionName, Pid) }); + p1.then(() => { + resolve(undefined); + }).catch((err: BusinessError): void => { + reject(err); + }); + }); + return p; + } + + function startUsingPermission(tokenID: int, permissionName: Permissions): Promise { + if (typeof permissionName !== "string") { + let err = new BusinessError(); + err.code = STSErrorCode.STS_ERROR_PARAM_ILLEGAL; + err.data = PARAM_ERROR_MSG("permissionName", "string"); + throw err; + } + let pid = -1; + let usedType = 0; + let p = new Promise((resolve: (v: undefined) => void, reject: (error: BusinessError) => void): void => { + let p1 = taskpool.execute((): void => { return new PrivacyManagerInner().startUsingPermissionExecute( + tokenID, permissionName, pid, usedType) }); + p1.then(() => { + resolve(undefined); + }).catch((err: BusinessError): void => { + reject(err); + }); + }); + return p; + } + + function startUsingPermission(tokenID: int, permissionName: Permissions, callback: AsyncCallback): void { + if (typeof permissionName !== "string") { + let err = new BusinessError(); + err.code = STSErrorCode.STS_ERROR_PARAM_ILLEGAL; + err.data = PARAM_ERROR_MSG("permissionName", "string"); + throw err; + } + let pid = -1; + let usedType = 0; + let p2 = taskpool.execute((): void => { + return new PrivacyManagerInner().startUsingPermissionExecute(tokenID, permissionName, pid, + usedType) }); + p2.then(() => { + let err = new BusinessError(); + callback(err, undefined); + },(err: BusinessError): void=> { + callback(err, undefined); + }) + } + + function startUsingPermission(tokenID: int, permissionName: Permissions, pid?: int, usedType?: PermissionUsedType): Promise { + if (typeof permissionName !== "string") { + let err = new BusinessError(); + err.code = STSErrorCode.STS_ERROR_PARAM_ILLEGAL; + err.data = PARAM_ERROR_MSG("permissionName", "string"); + throw err; + } + let Pid: int = pid ?? -1; + let UsedType = 0; + if(usedType == PermissionUsedType.PICKER_TYPE) { + UsedType = 1; + } + if(usedType == PermissionUsedType.SECURITY_COMPONENT_TYPE) { + UsedType = 2; + } + let p = new Promise((resolve: (v: undefined) => void, reject: (error: BusinessError) => void): void => { + let p1 = taskpool.execute((): void => { return new PrivacyManagerInner().startUsingPermissionExecute( + tokenID, permissionName, Pid, UsedType) }); + p1.then(() => { + resolve(undefined); + }).catch((err: BusinessError): void => { + reject(err); + }); + }); + return p; + } + export native function on(type: 'activeStateChange', permissionList: Array, callback: Callback): void; diff --git a/frameworks/ets/ani/privacy/src/privacy_manager.cpp b/frameworks/ets/ani/privacy/src/privacy_manager.cpp index 3528b7caa0350e3278addd07f2afd4ade92445fd..54b467963553885943a13be1fb02dc33468ed9da 100644 --- a/frameworks/ets/ani/privacy/src/privacy_manager.cpp +++ b/frameworks/ets/ani/privacy/src/privacy_manager.cpp @@ -666,6 +666,61 @@ static void UnRegisterPermActiveStatusCallback([[maybe_unused]] ani_env* env, return; } +static void StopUsingPermissionExecute([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object object, + ani_int tokenID, ani_string permissionName, ani_int pid) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "StopUsingPermissionExecute begin."); + if (env == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "env null"); + return; + } + + std::string permissionNameString; + if (!AniParseString(env, permissionName, permissionNameString)) { + BusinessErrorAni::ThrowParameterTypeError(env, STS_ERROR_PARAM_ILLEGAL, + GetParamErrorMsg("permissionName", "Permissions")); + return; + } + + auto retCode = PrivacyKit::StopUsingPermission(tokenID, permissionNameString, pid); + if (retCode != RET_SUCCESS) { + int32_t stsCode = GetStsErrorCode(retCode); + BusinessErrorAni::ThrowError(env, stsCode, GetErrorMessage(stsCode)); + } +} + +static void StartUsingPermissionExecute([[maybe_unused]] ani_env* env, [[maybe_unused]] ani_object object, + ani_int tokenID, ani_string permissionName, ani_int pid, ani_int usedType) +{ + ACCESSTOKEN_LOG_INFO(LABEL, "StartUsingPermissionExecute begin."); + if (env == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "env null"); + return; + } + + std::string permissionNameString; + if (!AniParseString(env, permissionName, permissionNameString)) { + BusinessErrorAni::ThrowParameterTypeError(env, STS_ERROR_PARAM_ILLEGAL, + GetParamErrorMsg("permissionName", "Permissions")); + return; + } + + ACCESSTOKEN_LOG_INFO(LABEL, "usedType is : %{public}d", usedType); + PermissionUsedTypeValue UsedType; + switch (usedType) { + case -1: UsedType = INVALID_USED_TYPE; break; + case 0: UsedType = NORMAL_TYPE; break; + case 1: UsedType = PICKER_TYPE; break; + case 2: UsedType = SECURITY_COMPONENT_TYPE; break; + case 3: UsedType = PERM_USED_TYPE_BUTT; break; + } + + auto retCode = PrivacyKit::StartUsingPermission(tokenID, permissionNameString, pid, UsedType); + if (retCode != RET_SUCCESS) { + int32_t stsCode = GetStsErrorCode(retCode); + BusinessErrorAni::ThrowError(env, stsCode, GetErrorMessage(stsCode)); + } +} extern "C" { ANI_EXPORT ani_status ANI_Constructor(ani_vm* vm, uint32_t* result) { @@ -695,6 +750,12 @@ ANI_EXPORT ani_status ANI_Constructor(ani_vm* vm, uint32_t* result) ani_native_function { "addPermissionUsedRecordSync", "ILstd/core/String;IIL@ohos/privacyManager/privacyManager/AddPermissionUsedRecordOptionsInner;:V", reinterpret_cast(AddPermissionUsedRecord) }, + ani_native_function { "stopUsingPermissionExecute", + nullptr, + reinterpret_cast(StopUsingPermissionExecute) }, + ani_native_function { "startUsingPermissionExecute", + nullptr, + reinterpret_cast(StartUsingPermissionExecute) }, }; if (ANI_OK != env->Class_BindNativeMethods(cls, methods.data(), methods.size())) {