diff --git a/frameworks/ets/ani/privacy/ets/@ohos.privacyManager.ets b/frameworks/ets/ani/privacy/ets/@ohos.privacyManager.ets index b53beac7730cb971234d006f7e934afccd61bfd3..9a63b5b9996c7cbb21f41ed3f4144134f41266fb 100644 --- a/frameworks/ets/ani/privacy/ets/@ohos.privacyManager.ets +++ b/frameworks/ets/ani/privacy/ets/@ohos.privacyManager.ets @@ -56,6 +56,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 { @@ -134,6 +140,129 @@ 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", "Permissions"); + throw err; + } + let optionalPid = -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, optionalPid) }); + p1.then(() => { + resolve(undefined); + }).catch((err: Error): void => { + reject(err as BusinessError); + }); + }); + 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", "Permissions"); + throw err; + } + let optionalPid = -1; + let p2 = taskpool.execute((): void => { + return new PrivacyManagerInner().stopUsingPermissionExecute(tokenID, permissionName, optionalPid) }); + p2.then(() => { + let err = new BusinessError(); + callback(err, undefined); + },(err: Error): void=> { + callback(err as BusinessError, 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", "Permissions"); + throw err; + } + let optionalPid: 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, optionalPid) }); + p1.then(() => { + resolve(undefined); + }).catch((err: Error): void => { + reject(err as BusinessError); + }); + }); + 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", "Permissions"); + throw err; + } + let optionalPid = -1; + let optionalUsedType = PermissionUsedType.NORMAL_TYPE; + let p = new Promise((resolve: (v: undefined) => void, reject: (error: BusinessError) => void): void => { + let p1 = taskpool.execute((): void => { + return new PrivacyManagerInner().startUsingPermissionExecute(tokenID, permissionName, + optionalPid, optionalUsedType) }); + p1.then(() => { + resolve(undefined); + }).catch((err: Error): void => { + reject(err as BusinessError); + }); + }); + 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", "Permissions"); + throw err; + } + let optionalPid = -1; + let optionalUsedType = PermissionUsedType.NORMAL_TYPE; + let p2 = taskpool.execute((): void => { + return new PrivacyManagerInner().startUsingPermissionExecute(tokenID, permissionName, + optionalPid, optionalUsedType) }); + p2.then(() => { + let err = new BusinessError(); + callback(err, undefined); + },(err: Error): void => { + callback(err as BusinessError, 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", "Permissions"); + throw err; + } + let optionalPid: int = pid ?? -1; + let optionalUsedType = usedType ?? PermissionUsedType.NORMAL_TYPE; + let p = new Promise((resolve: (v: undefined) => void, reject: (error: BusinessError) => void): void => { + let p1 = taskpool.execute((): void => { + return new PrivacyManagerInner().startUsingPermissionExecute(tokenID, permissionName, + optionalPid, optionalUsedType) }); + p1.then(() => { + resolve(undefined); + }).catch((err: Error): void => { + reject(err as BusinessError); + }); + }); + 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..4b2208f522c6e235d53ef4259428c58ab0e5c66f 100644 --- a/frameworks/ets/ani/privacy/src/privacy_manager.cpp +++ b/frameworks/ets/ani/privacy/src/privacy_manager.cpp @@ -666,6 +666,59 @@ 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; + } + + ACCESSTOKEN_LOG_INFO(LABEL, + "PermissionName : %{public}s, tokenID : %{public}u, pid : %{public}d", + permissionNameString.c_str(), tokenID, pid); + + 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, PermissionUsedType 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, + "PermissionName : %{public}s, tokenID : %{public}u, pid : %{public}d, UsedType : %{public}d", + permissionNameString.c_str(), tokenID, pid, usedType); + + 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 +748,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())) {