diff --git a/frameworks/ets/ani/privacy/ets/@ohos.privacyManager.ets b/frameworks/ets/ani/privacy/ets/@ohos.privacyManager.ets index 5ddd54b013558632781ac9f8b59aa6aedd64d8c3..a51533d07459f703d60c66bdc9fc9306d62b974c 100644 --- a/frameworks/ets/ani/privacy/ets/@ohos.privacyManager.ets +++ b/frameworks/ets/ani/privacy/ets/@ohos.privacyManager.ets @@ -218,11 +218,11 @@ export default namespace privacyManager { }); } - export function getPermissionUsedTypeInfos(tokenId?: int, permissionName?: Permissions): Promise>{ - let tokenIdIn = tokenId ? tokenId : 0; + export function getPermissionUsedTypeInfos(tokenId?: int, permissionName?: Permissions): Promise> { + let tokenIdIn = tokenId ?? 0; let permissionNameIn = permissionName ?? ""; - return new Promise>( - (resolve: (v: Array) => void, reject: (err:BusinessError) => void): Array => { + return new Promise> ( + (resolve: (v: Array) => void, reject: (err: BusinessError) => void): Array => { let p1 = taskpool.execute((): Array => { return getPermissionUsedTypeInfosExecute(tokenIdIn, permissionNameIn); }); @@ -230,12 +230,12 @@ export default namespace privacyManager { resolve(e as Array); }).catch((err: Error): void => { reject(err as BusinessError); - }) + }); }); } - export function setPermissionUsedRecordToggleStatus(status: boolean): Promise{ - return new Promise( + export function setPermissionUsedRecordToggleStatus(status: boolean): Promise { + return new Promise ( (resolve: (v: undefined) => void, reject: (err: BusinessError) => void): void => { let p1 = taskpool.execute((): void => { setPermissionUsedRecordToggleStatusExecute(status); @@ -244,13 +244,13 @@ export default namespace privacyManager { resolve(undefined); }).catch((err: Error): void => { reject(err as BusinessError); - }) + }); }); } export function getPermissionUsedRecordToggleStatus(): Promise{ - return new Promise( - (resolve: (v: boolean) => void, reject: (err:BusinessError) => void): void => { + return new Promise ( + (resolve: (v: boolean) => void, reject: (err: BusinessError) => void): void => { let p1 = taskpool.execute((): boolean => { return getPermissionUsedRecordToggleStatusExecute(); }); @@ -258,7 +258,7 @@ export default namespace privacyManager { resolve(e as boolean); }).catch((err: Error): void =>{ reject(err as BusinessError); - }) + }); }); } diff --git a/frameworks/ets/ani/privacy/src/privacy_manager.cpp b/frameworks/ets/ani/privacy/src/privacy_manager.cpp index 7e828ab504db4681b7010f4e50847009ca824a63..b451facd50c3eb87f28582b782c663fc3709ac69 100644 --- a/frameworks/ets/ani/privacy/src/privacy_manager.cpp +++ b/frameworks/ets/ani/privacy/src/privacy_manager.cpp @@ -688,31 +688,144 @@ static ani_object GetPermissionUsedRecordExecute([[maybe_unused]] ani_env* env, return nullptr; } +ani_object ConvertPermissionUsedTypeInfo(ani_env *env, const PermissionUsedTypeInfo &info) +{ + ani_class cls {}; + ani_status status = ANI_ERROR; + ani_method method {}; + ani_object object = nullptr; + + if (env == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "Env is null."); + return nullptr; + } + if (!AniFindClass(env, "L@ohos/privacyManager/privacyManager/PermissionUsedTypeInfoInner;", cls)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "FindClass is failed."); + return nullptr; + } + if (cls == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "FindClass is failed."); + return nullptr; + } + if (!AniClassFindMethod(env, cls, "", ":V", method)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "FindMethod is failed."); + return nullptr; + } + if ((status = env->Object_New(cls, method, &object)) != ANI_OK) { + ACCESSTOKEN_LOG_ERROR(LABEL, "ObjectNew is failed."); + return nullptr; + } + if (object == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "ObjectNew is failed."); + return nullptr; + } + if (!SetIntProperty(env, object, "tokenId", info.tokenId)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "tokenId set fail."); + return nullptr; + } + if (!SetStringProperty(env, object, "permissionName", info.permissionName)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "PermissionName set fail."); + return nullptr; + } + const char* permUsedTypeDes = "L@ohos/privacyManager/privacyManager/PermissionUsedType;"; + if (!SetEnumProperty(env, object, permUsedTypeDes, "usedType", static_cast(info.type))) { + ACCESSTOKEN_LOG_ERROR(LABEL, "UsedType set fail."); + return nullptr; + } + return object; +} + +static ani_ref ConvertPermissionUsedTypeInfos(ani_env* env, const std::vector& infos) +{ + if (env == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "Env is null."); + return nullptr; + } + ani_class arrayCls = nullptr; + if (!AniFindClass(env, "Lescompat/Array;", arrayCls)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "FindClass is failed."); + return nullptr; + } + if (arrayCls == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "FindClass is failed."); + return nullptr; + } + ani_method arrayCtor; + if (!AniClassFindMethod(env, arrayCls, "", ":V", arrayCtor)) { + ACCESSTOKEN_LOG_ERROR(LABEL, "FindMethod is failed."); + return nullptr; + } + ani_object arrayObj; + ani_status status = env->Object_New(arrayCls, arrayCtor, &arrayObj, infos.size()); + if (status != ANI_OK) { + ACCESSTOKEN_LOG_ERROR(LABEL, "status : %{public}d", status); + return arrayObj; + } + ani_size index = 0; + for (const auto &instanceInfo : infos) { + ani_ref ani_info = ConvertPermissionUsedTypeInfo(env, instanceInfo); + if (ani_info == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "GetPermissionUsedTypeInfoData is failed."); + break; + } + status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ILstd/core/Object;:V", index, ani_info); + if (status != ANI_OK) { + ACCESSTOKEN_LOG_ERROR(LABEL, "CallMethodByName is failed."); + break; + } + ++index; + } + return arrayObj; +} + static ani_ref GetPermissionUsedTypeInfosExecute([[maybe_unused]] ani_env* env, ani_int aniTokenID, ani_string aniPermission) { if (env == nullptr) { ACCESSTOKEN_LOG_ERROR(LABEL, "Env is null"); + return nullptr; } - return nullptr; + std::string permission = ParseAniString(env, static_cast(aniPermission)); + int32_t retCode = ANI_ERROR; + std::vector retVec; + AccessTokenID tokenID = static_cast(aniTokenID); + retCode = PrivacyKit::GetPermissionUsedTypeInfos(tokenID, permission, retVec); + if (retCode != RET_SUCCESS) { + BusinessErrorAni::ThrowError(env, GetStsErrorCode(retCode), + GetErrorMessage(GetStsErrorCode(retCode))); + return nullptr; + } + return ConvertPermissionUsedTypeInfos(env, retVec); } static void SetPermissionUsedRecordToggleStatusExecute([[maybe_unused]] ani_env* env, ani_boolean status) { - ACCESSTOKEN_LOG_INFO(LABEL, "SetPermissionUsedRecordToggleStatusExecute Call"); if (env == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "Env is null"); return; } + int32_t userID = 0; + int32_t retCode = PrivacyKit::SetPermissionUsedRecordToggleStatus(userID, status); + if (retCode != RET_SUCCESS) { + int32_t stsCode = BusinessErrorAni::GetStsErrorCode(retCode); + BusinessErrorAni::ThrowError(env, stsCode, GetErrorMessage(stsCode)); + } } static ani_boolean GetPermissionUsedRecordToggleStatusExecute([[maybe_unused]] ani_env* env) { - ACCESSTOKEN_LOG_INFO(LABEL, "GetPermissionUsedRecordToggleStatusExecute Call"); if (env == nullptr) { + ACCESSTOKEN_LOG_ERROR(LABEL, "Env is null"); + return false; + } + int32_t userID = 0; + bool isToggleStatus = false; + int32_t retCode = PrivacyKit::GetPermissionUsedRecordToggleStatus(userID, isToggleStatus); + if (retCode != RET_SUCCESS) { + BusinessErrorAni::ThrowError(env, GetStsErrorCode(retCode), GetErrorMessage(GetStsErrorCode(retCode))); return false; } - bool isToggleStaus = false; - return isToggleStaus; + return isToggleStatus; } void InitPrivacyFunction(ani_env *env)