diff --git a/frameworks/js/napi/featureAbility/napi_context.cpp b/frameworks/js/napi/featureAbility/napi_context.cpp index ac973f629a..d31cad558d 100644 --- a/frameworks/js/napi/featureAbility/napi_context.cpp +++ b/frameworks/js/napi/featureAbility/napi_context.cpp @@ -778,19 +778,8 @@ void CallOnRequestPermissionsFromUserResult(int requestCode, const std::vectorrequestCode = requestCode; onRequestPermissionCB->permissions = permissions; onRequestPermissionCB->grantResults = grantResults; diff --git a/frameworks/js/napi/inner/napi_common/napi_common_want.cpp b/frameworks/js/napi/inner/napi_common/napi_common_want.cpp index e17eefff87..f296f944c3 100644 --- a/frameworks/js/napi/inner/napi_common/napi_common_want.cpp +++ b/frameworks/js/napi/inner/napi_common/napi_common_want.cpp @@ -303,12 +303,14 @@ bool InnerWrapWantParamsRemoteObject( auto value = wantParams.GetParam(key); AAFwk::IRemoteObjectWrap *remoteObjectIWrap = AAFwk::IRemoteObjectWrap::Query(value); if (remoteObjectIWrap == nullptr) { + HILOG_ERROR("%{public}s remoteObjectIWrap is nullptr.", __func__); return false; } auto remoteObject = AAFwk::RemoteObjectWrap::UnBox(remoteObjectIWrap); auto jsValue = NAPI_ohos_rpc_CreateJsRemoteObject(env, remoteObject); HILOG_DEBUG("%{public}s called, jsRemoteObject:%{public}p.", __func__, jsValue); if (jsValue == nullptr) { + HILOG_ERROR("%{public}s jsValue is nullptr.", __func__); return false; } diff --git a/frameworks/native/ability/BUILD.gn b/frameworks/native/ability/BUILD.gn index bdc467a9e0..8bc897e502 100644 --- a/frameworks/native/ability/BUILD.gn +++ b/frameworks/native/ability/BUILD.gn @@ -38,6 +38,7 @@ ohos_shared_library("ability_context_native") { sources = [ "ability_runtime/ability_connection.cpp", "ability_runtime/ability_context_impl.cpp", + "ability_runtime/authorization_result.cpp", "ability_runtime/connection_manager.cpp", "ability_runtime/js_extension_context.cpp", "ability_runtime/local_call_container.cpp", @@ -50,11 +51,13 @@ ohos_shared_library("ability_context_native") { ] external_deps = [ + "ability_base:base", "ability_base:configuration", "ability_base:want", "ability_runtime:ability_manager", "ability_runtime:runtime", "access_token:libaccesstoken_sdk", + "access_token:libtoken_callback_sdk", "faultloggerd:lib_dfx_dump_catcher", "hichecker_native:libhichecker", "hitrace_native:hitrace_meter", diff --git a/frameworks/native/ability/ability_runtime/ability_context_impl.cpp b/frameworks/native/ability/ability_runtime/ability_context_impl.cpp index 9ec078702c..d61a37a461 100644 --- a/frameworks/native/ability/ability_runtime/ability_context_impl.cpp +++ b/frameworks/native/ability/ability_runtime/ability_context_impl.cpp @@ -19,10 +19,14 @@ #include "ability_manager_client.h" #include "accesstoken_kit.h" +#include "authorization_result.h" #include "hitrace_meter.h" #include "connection_manager.h" #include "hilog_wrapper.h" #include "permission_list_state.h" +#include "remote_object_wrapper.h" +#include "string_wrapper.h" +#include "want_params_wrapper.h" using OHOS::Security::AccessToken::AccessTokenKit; using OHOS::Security::AccessToken::PermissionListState; @@ -35,6 +39,8 @@ const std::string GRANT_ABILITY_BUNDLE_NAME = "com.ohos.permissionmanager"; const std::string GRANT_ABILITY_ABILITY_NAME = "com.ohos.permissionmanager.GrantAbility"; const std::string PERMISSION_KEY = "ohos.user.grant.permission"; const std::string STATE_KEY = "ohos.user.grant.permission.state"; +const std::string TOKEN_KEY = "ohos.ability.params.token"; +const std::string CALLBACK_KEY = "ohos.ability.params.callback"; std::string AbilityContextImpl::GetBaseDir() const { @@ -367,10 +373,10 @@ sptr AbilityContextImpl::GetToken() } void AbilityContextImpl::RequestPermissionsFromUser(const std::vector &permissions, - int requestCode, PermissionRequestTask &&task) + PermissionRequestTask &&task) { HILOG_INFO("%{public}s called.", __func__); - if (permissions.empty() || requestCode < 0) { + if (permissions.empty()) { HILOG_ERROR("%{public}s. The params are invalid.", __func__); return; } @@ -406,10 +412,13 @@ void AbilityContextImpl::RequestPermissionsFromUser(const std::vectorStartAbility(want, token_, requestCode); - HILOG_INFO("%{public}s. End calling StartAbility. ret=%{public}d", __func__, err); + want.SetParam(TOKEN_KEY, token_); + sptr remoteObject = new AuthorizationResult(std::move(task)); + want.SetParam(CALLBACK_KEY, remoteObject); + + HILOG_DEBUG("%{public}s. Start calling StartExtension.", __func__); + ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, -1); + HILOG_INFO("%{public}s. End calling StartExtension. ret=%{public}d", __func__, err); } else { HILOG_DEBUG("%{public}s. No dynamic popup required.", __func__); if (task) { @@ -418,19 +427,6 @@ void AbilityContextImpl::RequestPermissionsFromUser(const std::vector &permissions, const std::vector &permissionsState) -{ - HILOG_DEBUG("%{public}s. Start calling OnRequestPermissionsFromUserResult.", __func__); - auto iter = permissionRequestCallbacks_.find(requestCode); - if (iter != permissionRequestCallbacks_.end() && iter->second) { - auto task = iter->second; - task(permissions, permissionsState); - permissionRequestCallbacks_.erase(iter); - HILOG_DEBUG("%{public}s. End calling OnRequestPermissionsFromUserResult.", __func__); - } -} - ErrCode AbilityContextImpl::RestoreWindowStage(NativeEngine& engine, NativeValue* contentStorage) { HILOG_INFO("%{public}s begin.", __func__); diff --git a/frameworks/native/ability/ability_runtime/authorization_result.cpp b/frameworks/native/ability/ability_runtime/authorization_result.cpp new file mode 100755 index 0000000000..972010cdad --- /dev/null +++ b/frameworks/native/ability/ability_runtime/authorization_result.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "authorization_result.h" +#include "hilog_wrapper.h" + +namespace OHOS { +namespace AbilityRuntime { +void AuthorizationResult::GrantResultsCallback(const std::vector &permissions, + const std::vector &grantResults) +{ + HILOG_INFO("%{public}s called.", __func__); + if (task_) { + HILOG_DEBUG("%{public}s callback client function.", __func__); + task_(permissions, grantResults); + } +} +} // namespace AbilityRuntime +} // namespace OHOS \ No newline at end of file diff --git a/frameworks/native/ability/native/ability.cpp b/frameworks/native/ability/native/ability.cpp index d25d0f1747..e2d70037f5 100644 --- a/frameworks/native/ability/native/ability.cpp +++ b/frameworks/native/ability/native/ability.cpp @@ -611,23 +611,6 @@ ErrCode Ability::StartAbility(const Want &want, AbilityStartSetting abilityStart return err; } -/** - * @brief Called back after permissions are requested by using - * AbilityContext.requestPermissionsFromUser(java.lang.String[],int). - * - * @param requestCode Indicates the request code passed to this method from - * AbilityContext.requestPermissionsFromUser(java.lang.String[],int). - * @param permissions Indicates the list of permissions requested by using - * AbilityContext.requestPermissionsFromUser(java.lang.String[],int). This parameter cannot be null. - * @param grantResults Indicates the granting results of the corresponding permissions requested using - * AbilityContext.requestPermissionsFromUser(java.lang.String[],int). The value 0 indicates that a - * permission is granted, and the value -1 indicates not. - * - */ -void Ability::OnRequestPermissionsFromUserResult( - int requestCode, const std::vector &permissions, const std::vector &grantResults) -{} - /** * @brief Obtains the MIME type matching the data specified by the URI of the Data ability. This method should be * implemented by a Data ability. Data abilities supports general data types, including text, HTML, and JPEG. diff --git a/frameworks/native/ability/native/ability_context.cpp b/frameworks/native/ability/native/ability_context.cpp index 376c227779..44dc3a3ed4 100644 --- a/frameworks/native/ability/native/ability_context.cpp +++ b/frameworks/native/ability/native/ability_context.cpp @@ -17,6 +17,7 @@ #include "ability_manager_client.h" #include "accesstoken_kit.h" +#include "authorization_result.h" #include "bundle_constants.h" #include "hilog_wrapper.h" #include "iservice_registry.h" @@ -25,6 +26,9 @@ #include "sys_mgr_client.h" #include "system_ability_definition.h" #include "hitrace_meter.h" +#include "remote_object_wrapper.h" +#include "string_wrapper.h" +#include "want_params_wrapper.h" namespace OHOS { namespace AppExecFwk { @@ -34,6 +38,8 @@ const std::string GRANT_ABILITY_BUNDLE_NAME = "com.ohos.permissionmanager"; const std::string GRANT_ABILITY_ABILITY_NAME = "com.ohos.permissionmanager.GrantAbility"; const std::string PERMISSION_KEY = "ohos.user.grant.permission"; const std::string STATE_KEY = "ohos.user.grant.permission.state"; +const std::string TOKEN_KEY = "ohos.ability.params.token"; +const std::string CALLBACK_KEY = "ohos.ability.params.callback"; } ErrCode AbilityContext::StartAbility(const AAFwk::Want &want, int requestCode) @@ -388,7 +394,7 @@ void AbilityContext::GetPermissionDes(const std::string &permissionName, std::st } void AbilityContext::RequestPermissionsFromUser(std::vector &permissions, - std::vector &permissionsState, int requestCode) + std::vector &permissionsState, PermissionRequestTask &&task) { HILOG_DEBUG("%{public}s begin.", __func__); if (permissions.size() == 0) { @@ -396,16 +402,14 @@ void AbilityContext::RequestPermissionsFromUser(std::vector &permis return; } - if (requestCode < 0) { - HILOG_ERROR("AbilityContext::RequestPermissionsFromUser requestCode should be >= 0"); - return; - } - AAFwk::Want want; want.SetElementName(GRANT_ABILITY_BUNDLE_NAME, GRANT_ABILITY_ABILITY_NAME); want.SetParam(PERMISSION_KEY, permissions); want.SetParam(STATE_KEY, permissionsState); - StartAbility(want, requestCode); + want.SetParam(TOKEN_KEY, token_); + sptr remoteObject = new AbilityRuntime::AuthorizationResult(std::move(task)); + want.SetParam(CALLBACK_KEY, remoteObject); + StartAbility(want, -1); HILOG_DEBUG("%{public}s end.", __func__); } diff --git a/frameworks/native/ability/native/ability_impl.cpp b/frameworks/native/ability/native/ability_impl.cpp index cbe2da6019..b8df5fc79a 100644 --- a/frameworks/native/ability/native/ability_impl.cpp +++ b/frameworks/native/ability/native/ability_impl.cpp @@ -243,18 +243,7 @@ void AbilityImpl::SendResult(int requestCode, int resultCode, const Want &result return; } - if (resultData.HasParameter(PERMISSION_KEY)) { - std::vector permissions = resultData.GetStringArrayParam(PERMISSION_KEY); - std::vector grantedResult(permissions.size(), -1); - if (resultCode > 0) { - grantedResult = resultData.GetIntArrayParam(GRANTED_RESULT_KEY); - HILOG_DEBUG("%{public}s Get user granted result.", __func__); - } - ability_->OnRequestPermissionsFromUserResult(requestCode, permissions, grantedResult); - } else { - ability_->OnAbilityResult(requestCode, resultCode, resultData); - } - + ability_->OnAbilityResult(requestCode, resultCode, resultData); // for api5 FeatureAbility::startAbilityForResult ability_->OnFeatureAbilityResult(requestCode, resultCode, resultData); HILOG_DEBUG("%{public}s end.", __func__); diff --git a/frameworks/native/ability/native/ability_process.cpp b/frameworks/native/ability/native/ability_process.cpp index 8b3e2ae82c..d2635da23f 100644 --- a/frameworks/native/ability/native/ability_process.cpp +++ b/frameworks/native/ability/native/ability_process.cpp @@ -43,7 +43,6 @@ using NAPICallOnRequestPermissionsFromUserResult = void (*)(int requestCode, std::shared_ptr AbilityProcess::instance_ = nullptr; std::map> AbilityProcess::abilityResultMap_; -std::map> AbilityProcess::abilityRequestPermissionsForUserMap_; std::mutex AbilityProcess::mutex_; std::shared_ptr AbilityProcess::GetInstance() { @@ -217,66 +216,26 @@ void AbilityProcess::RequestPermissionsFromUser( HILOG_DEBUG("%{public}s. permissions size: %{public}zu. permissionsState size: %{public}zu", __func__, param.permission_list.size(), permissionsState.size()); + auto requestCode = param.requestCode; if (ret != TypePermissionOper::DYNAMIC_OPER) { HILOG_DEBUG("%{public}s. No dynamic popup required.", __func__); - (void)CaullFunc(param.requestCode, param.permission_list, permissionsState, callbackInfo); + (void)CaullFunc(requestCode, param.permission_list, permissionsState, callbackInfo); return; } - ability->RequestPermissionsFromUser(param.permission_list, permissionsState, param.requestCode); - - { - std::lock_guard lock_l(mutex_); - std::map map; - auto it = abilityRequestPermissionsForUserMap_.find(ability); - if (it == abilityRequestPermissionsForUserMap_.end()) { - HILOG_INFO("AbilityProcess::RequestPermissionsFromUser ability: is not in the " - "abilityRequestPermissionsForUserMap_"); - } else { - HILOG_INFO("AbilityProcess::RequestPermissionsFromUser ability: is in the " - "abilityRequestPermissionsForUserMap_"); - map = it->second; + auto task = [self = GetInstance(), requestCode, callbackInfo] + (const std::vector &permissions, const std::vector &grantResults) mutable { + if (!self) { + HILOG_ERROR("%{public}s: self is nullptr.", __func__); + return; } + if (!self->CaullFunc(requestCode, permissions, grantResults, callbackInfo)) { + HILOG_ERROR("%{public}s: call function failed.", __func__); + return; + } + }; - map[param.requestCode] = callbackInfo; - abilityRequestPermissionsForUserMap_[ability] = map; - } -} - -void AbilityProcess::OnRequestPermissionsFromUserResult(Ability *ability, int requestCode, - const std::vector &permissions, const std::vector &permissionsState) -{ - HILOG_INFO("AbilityProcess::OnRequestPermissionsFromUserResult begin"); - if (ability == nullptr) { - HILOG_ERROR("AbilityProcess::OnRequestPermissionsFromUserResult ability is nullptr"); - return; - } - - std::lock_guard lock_l(mutex_); - - auto it = abilityRequestPermissionsForUserMap_.find(ability); - if (it == abilityRequestPermissionsForUserMap_.end()) { - HILOG_ERROR("AbilityProcess::OnRequestPermissionsFromUserResult ability: is not in the " - "abilityRequestPermissionsForUserMap_"); - return; - } - std::map map = it->second; - - auto callback = map.find(requestCode); - if (callback == map.end()) { - HILOG_ERROR("AbilityProcess::OnRequestPermissionsFromUserResult requestCode: %{public}d is not in the map", - requestCode); - return; - } - CallbackInfo callbackInfo = callback->second; - if (!CaullFunc(requestCode, permissions, permissionsState, callbackInfo)) { - HILOG_ERROR("AbilityProcess::OnRequestPermissionsFromUserResult call function failed."); - return; - } - map.erase(requestCode); - - abilityRequestPermissionsForUserMap_[ability] = map; - HILOG_INFO("AbilityProcess::OnRequestPermissionsFromUserResult end"); + ability->RequestPermissionsFromUser(param.permission_list, permissionsState, std::move(task)); } bool AbilityProcess::CaullFunc(int requestCode, const std::vector &permissions, diff --git a/frameworks/native/ability/native/ability_runtime/js_ability.cpp b/frameworks/native/ability/native/ability_runtime/js_ability.cpp index c0fb7a8028..ac73948f7c 100644 --- a/frameworks/native/ability/native/ability_runtime/js_ability.cpp +++ b/frameworks/native/ability/native/ability_runtime/js_ability.cpp @@ -684,19 +684,6 @@ sptr JsAbility::CallRequest() return remoteCallee_; } -void JsAbility::OnRequestPermissionsFromUserResult( - int requestCode, const std::vector &permissions, const std::vector &grantResults) -{ - HILOG_INFO("%{public}s called.", __func__); - std::shared_ptr context = GetAbilityContext(); - if (context == nullptr) { - HILOG_WARN("JsAbility not attached to any runtime context!"); - return; - } - context->OnRequestPermissionsFromUserResult(requestCode, permissions, grantResults); - HILOG_INFO("%{public}s end.", __func__); -} - void JsAbility::CallObjectMethod(const char *name, NativeValue *const *argv, size_t argc) { HILOG_INFO("JsAbility::CallObjectMethod(%{public}s", name); diff --git a/frameworks/native/ability/native/ability_runtime/js_ability_context.cpp b/frameworks/native/ability/native/ability_runtime/js_ability_context.cpp index 3357e4b10d..cd5503a0db 100644 --- a/frameworks/native/ability/native/ability_runtime/js_ability_context.cpp +++ b/frameworks/native/ability/native/ability_runtime/js_ability_context.cpp @@ -964,8 +964,7 @@ NativeValue* JsAbilityContext::OnRequestPermissionsFromUser(NativeEngine& engine HILOG_WARN("context is released"); asyncTask->Reject(engine, CreateJsError(engine, 1, "context is released!")); } else { - curRequestCode_ = (curRequestCode_ == INT_MAX) ? 0 : (curRequestCode_ + 1); - context->RequestPermissionsFromUser(permissionList, curRequestCode_, std::move(task)); + context->RequestPermissionsFromUser(permissionList, std::move(task)); } HILOG_INFO("OnRequestPermissionsFromUser is called end"); return result; diff --git a/frameworks/native/appkit/app/context_container.cpp b/frameworks/native/appkit/app/context_container.cpp index dc5e6c484c..bf369418c2 100644 --- a/frameworks/native/appkit/app/context_container.cpp +++ b/frameworks/native/appkit/app/context_container.cpp @@ -533,19 +533,17 @@ std::string ContextContainer::GetProcessName() /** * @brief Requests certain permissions from the system. * This method is called for permission request. This is an asynchronous method. When it is executed, - * the Ability.onRequestPermissionsFromUserResult(int, String[], int[]) method will be called back. + * the task will be called back. * * @param permissions Indicates the list of permissions to be requested. This parameter cannot be null. * @param permissionsState Indicates the list of permissions' state to be requested. This parameter cannot be null. - * @param requestCode Indicates the request code to be passed to the Ability.onRequestPermissionsFromUserResult(int, - * String[], int[]) callback method. This code cannot be a negative number. - * + * @param task The callback or promise fo js interface. */ void ContextContainer::RequestPermissionsFromUser(std::vector &permissions, - std::vector &permissionsState, int requestCode) + std::vector &permissionsState, PermissionRequestTask &&task) { if (baseContext_ != nullptr) { - baseContext_->RequestPermissionsFromUser(permissions, permissionsState, requestCode); + baseContext_->RequestPermissionsFromUser(permissions, permissionsState, std::move(task)); } else { HILOG_ERROR("ContextContainer::RequestPermissionsFromUser baseContext_ is nullptr"); } diff --git a/frameworks/native/appkit/app/context_deal.cpp b/frameworks/native/appkit/app/context_deal.cpp index d74fa3877a..f9b3588678 100644 --- a/frameworks/native/appkit/app/context_deal.cpp +++ b/frameworks/native/appkit/app/context_deal.cpp @@ -728,16 +728,14 @@ std::string ContextDeal::GetCallingBundle() /** * @brief Requests certain permissions from the system. * This method is called for permission request. This is an asynchronous method. When it is executed, - * the Ability.onRequestPermissionsFromUserResult(int, String[], int[]) method will be called back. + * the task will be called back. * * @param permissions Indicates the list of permissions to be requested. This parameter cannot be null. * @param permissionsState Indicates the list of permissions' state to be requested. This parameter cannot be null. - * @param requestCode Indicates the request code to be passed to the Ability.onRequestPermissionsFromUserResult(int, - * String[], int[]) callback method. This code cannot be a negative number. - * + * @param task The callback or promise fo js interface. */ void ContextDeal::RequestPermissionsFromUser(std::vector &permissions, std::vector &permissionsState, - int requestCode) {} + PermissionRequestTask &&task) {} /** * @brief Starts a new ability with special ability start setting. diff --git a/interfaces/kits/native/ability/ability_runtime/ability_context.h b/interfaces/kits/native/ability/ability_runtime/ability_context.h index 373289f3aa..9cedc6a694 100644 --- a/interfaces/kits/native/ability/ability_runtime/ability_context.h +++ b/interfaces/kits/native/ability/ability_runtime/ability_context.h @@ -176,30 +176,13 @@ public: /** * @brief Requests certain permissions from the system. * This method is called for permission request. This is an asynchronous method. When it is executed, - * the OnRequestPermissionsFromUserResult(int, vector, vector) method will be called back. + * the task will be called back. * * @param permissions Indicates the list of permissions to be requested. This parameter cannot be null. - * @param requestCode Indicates the request code to be passed to the OnRequestPermissionsFromUserResult(int, - * vector, vector) callback method. This code cannot be a negative number. * @param task The callback or promise fo js interface. */ virtual void RequestPermissionsFromUser(const std::vector &permissions, - int requestCode, PermissionRequestTask &&task) = 0; - - /** - * @brief Called back after permissions are requested by using - * RequestPermissionsFromUser(vector, int, PermissionRequestTask). - * - * @param requestCode Indicates the request code passed to this method from - * RequestPermissionsFromUser(vector, int, PermissionRequestTask). - * @param permissions Indicates the list of permissions requested by using - * RequestPermissionsFromUser(vector, int, PermissionRequestTask). - * @param grantResults Indicates the granting results of the corresponding permissions requested using - * RequestPermissionsFromUser(vector, int, PermissionRequestTask). The value 0 indicates that a - * permission is granted, and the value -1 indicates not. - */ - virtual void OnRequestPermissionsFromUserResult( - int requestCode, const std::vector &permissions, const std::vector &grantResults) = 0; + PermissionRequestTask &&task) = 0; /** * @brief Get ContentStorage. diff --git a/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h b/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h index abdea5aa56..dc13e12cb9 100644 --- a/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h +++ b/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h @@ -81,10 +81,7 @@ public: sptr GetToken() override; - void RequestPermissionsFromUser(const std::vector &permissions, - int requestCode, PermissionRequestTask &&task) override; - void OnRequestPermissionsFromUserResult( - int requestCode, const std::vector &permissions, const std::vector &grantResults) override; + void RequestPermissionsFromUser(const std::vector &permissions, PermissionRequestTask &&task) override; ErrCode RestoreWindowStage(NativeEngine& engine, NativeValue* contentStorage) override; diff --git a/interfaces/kits/native/ability/ability_runtime/authorization_result.h b/interfaces/kits/native/ability/ability_runtime/authorization_result.h new file mode 100755 index 0000000000..118a7db2b3 --- /dev/null +++ b/interfaces/kits/native/ability/ability_runtime/authorization_result.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_ABILITY_RUNTIME_AUTHORIZATION_RESULT_H +#define OHOS_ABILITY_RUNTIME_AUTHORIZATION_RESULT_H + +#include "ability_context.h" +#include "base/security/access_token/interfaces/innerkits/token_callback/include/token_callback_stub.h" + +namespace OHOS { +namespace AbilityRuntime { +class AuthorizationResult : public Security::AccessToken::TokenCallbackStub { +public: + explicit AuthorizationResult(PermissionRequestTask&& task) : task_(task) {} + virtual ~AuthorizationResult() = default; + + virtual void GrantResultsCallback(const std::vector &permissions, + const std::vector &grantResults) override; + +private: + PermissionRequestTask task_; +}; +} // namespace AbilityRuntime +} // namespace OHOS +#endif // OHOS_ABILITY_RUNTIME_AUTHORIZATION_RESULT_H diff --git a/interfaces/kits/native/ability/native/ability.h b/interfaces/kits/native/ability/native/ability.h index 5f8a380ce9..d2d0d8b364 100644 --- a/interfaces/kits/native/ability/native/ability.h +++ b/interfaces/kits/native/ability/native/ability.h @@ -266,22 +266,6 @@ public: */ virtual void OnDisconnect(const Want &want); - /** - * @brief Called back after permissions are requested by using - * AbilityContext.requestPermissionsFromUser(java.lang.String[],int). - * - * @param requestCode Indicates the request code passed to this method from - * AbilityContext.requestPermissionsFromUser(java.lang.String[],int). - * @param permissions Indicates the list of permissions requested by using - * AbilityContext.requestPermissionsFromUser(java.lang.String[],int). This parameter cannot be null. - * @param grantResults Indicates the granting results of the corresponding permissions requested using - * AbilityContext.requestPermissionsFromUser(java.lang.String[],int). The value 0 indicates that a - * permission is granted, and the value -1 indicates not. - * - */ - virtual void OnRequestPermissionsFromUserResult( - int requestCode, const std::vector &permissions, const std::vector &grantResults); - /** * @brief Obtains the MIME type matching the data specified by the URI of the Data ability. This method should be * implemented by a Data ability. Data abilities supports general data types, including text, HTML, and JPEG. diff --git a/interfaces/kits/native/ability/native/ability_context.h b/interfaces/kits/native/ability/native/ability_context.h index 0b2677af70..b3c2a918a8 100644 --- a/interfaces/kits/native/ability/native/ability_context.h +++ b/interfaces/kits/native/ability/native/ability_context.h @@ -414,15 +414,14 @@ public: /** * @brief Requests certain permissions from the system. * This method is called for permission request. This is an asynchronous method. When it is executed, - * the Ability.onRequestPermissionsFromUserResult(int, String[], int[]) method will be called back. + * the task will be called back. * * @param permissions Indicates the list of permissions to be requested. This parameter cannot be null. * @param permissionsState Indicates the list of permissions' state to be requested. This parameter cannot be null. - * @param requestCode Indicates the request code to be passed to the Ability.onRequestPermissionsFromUserResult(int, - * String[], int[]) callback method. This code cannot be a negative number. + * @param task The callback or promise fo js interface. */ virtual void RequestPermissionsFromUser(std::vector &permissions, std::vector &permissionsState, - int requestCode) override; + PermissionRequestTask &&task) override; /** * @brief Deletes the specified private file associated with the application. diff --git a/interfaces/kits/native/ability/native/ability_process.h b/interfaces/kits/native/ability/native/ability_process.h index 4b4602e01b..a7b5593b26 100644 --- a/interfaces/kits/native/ability/native/ability_process.h +++ b/interfaces/kits/native/ability/native/ability_process.h @@ -37,8 +37,6 @@ public: void AddAbilityResultCallback(Ability *ability, CallAbilityParam ¶m, int32_t errCode, CallbackInfo &callback); void RequestPermissionsFromUser(Ability *ability, CallAbilityPermissionParam ¶m, CallbackInfo callbackInfo); - void OnRequestPermissionsFromUserResult(Ability *ability, int requestCode, - const std::vector &permissions, const std::vector &grantResults); private: bool CaullFunc(int requestCode, const std::vector &permissions, @@ -48,7 +46,6 @@ private: static std::mutex mutex_; static std::shared_ptr instance_; static std::map> abilityResultMap_; - static std::map> abilityRequestPermissionsForUserMap_; }; } // namespace AppExecFwk } // namespace OHOS diff --git a/interfaces/kits/native/ability/native/ability_runtime/js_ability.h b/interfaces/kits/native/ability/native/ability_runtime/js_ability.h index de4ae40767..5c4653f0fb 100644 --- a/interfaces/kits/native/ability/native/ability_runtime/js_ability.h +++ b/interfaces/kits/native/ability/native/ability_runtime/js_ability.h @@ -53,8 +53,6 @@ public: void OnNewWant(const Want &want) override; void OnAbilityResult(int requestCode, int resultCode, const Want &resultData) override; - void OnRequestPermissionsFromUserResult( - int requestCode, const std::vector &permissions, const std::vector &grantResults) override; sptr CallRequest() override; diff --git a/interfaces/kits/native/appkit/app/context.h b/interfaces/kits/native/appkit/app/context.h index 7b41a3accc..1f52367cbe 100644 --- a/interfaces/kits/native/appkit/app/context.h +++ b/interfaces/kits/native/appkit/app/context.h @@ -35,6 +35,7 @@ class DataShareHelper; namespace AppExecFwk { using Want = OHOS::AAFwk::Want; using AbilityStartSetting = AAFwk::AbilityStartSetting; +using PermissionRequestTask = std::function&, const std::vector&)>; // Request permissions for user #define OHOS_REQUEST_PERMISSION_BUNDLENAME "com.ohos.systemui" #define OHOS_REQUEST_PERMISSION_ABILITY_NAME "com.ohos.systemui.systemdialog.MainAbility" @@ -417,16 +418,14 @@ public: /** * @brief Requests certain permissions from the system. * This method is called for permission request. This is an asynchronous method. When it is executed, - * the Ability.onRequestPermissionsFromUserResult(int, String[], int[]) method will be called back. + * the task will be called back. * * @param permissions Indicates the list of permissions to be requested. This parameter cannot be null. * @param permissionsState Indicates the list of permissions' state to be requested. This parameter cannot be null. - * @param requestCode Indicates the request code to be passed to the Ability.onRequestPermissionsFromUserResult(int, - * String[], int[]) callback method. This code cannot be a negative number. - * + * @param task The callback or promise fo js interface. */ virtual void RequestPermissionsFromUser(std::vector &permissions, std::vector &permissionsState, - int requestCode) = 0; + PermissionRequestTask &&task) = 0; /** * @brief Starts a new ability with special ability start setting. diff --git a/interfaces/kits/native/appkit/app/context_container.h b/interfaces/kits/native/appkit/app/context_container.h index b3600df436..f303d58ef3 100644 --- a/interfaces/kits/native/appkit/app/context_container.h +++ b/interfaces/kits/native/appkit/app/context_container.h @@ -304,16 +304,14 @@ public: /** * @brief Requests certain permissions from the system. * This method is called for permission request. This is an asynchronous method. When it is executed, - * the Ability.onRequestPermissionsFromUserResult(int, String[], int[]) method will be called back. + * the task will be called back. * * @param permissions Indicates the list of permissions to be requested. This parameter cannot be null. * @param permissionsState Indicates the list of permissions' state to be requested. This parameter cannot be null. - * @param requestCode Indicates the request code to be passed to the Ability.onRequestPermissionsFromUserResult(int, - * String[], int[]) callback method. This code cannot be a negative number. - * + * @param task The callback or promise fo js interface. */ void RequestPermissionsFromUser(std::vector &permissions, std::vector &permissionsState, - int requestCode) override; + PermissionRequestTask &&task) override; /** * @brief Creates a Context object for an application with the given bundle name. diff --git a/interfaces/kits/native/appkit/app/context_deal.h b/interfaces/kits/native/appkit/app/context_deal.h index 7502784d9b..99c1763fc0 100644 --- a/interfaces/kits/native/appkit/app/context_deal.h +++ b/interfaces/kits/native/appkit/app/context_deal.h @@ -404,15 +404,14 @@ public: /** * @brief Requests certain permissions from the system. * This method is called for permission request. This is an asynchronous method. When it is executed, - * the Ability.onRequestPermissionsFromUserResult(int, String[], int[]) method will be called back. + * the task will be called back. * * @param permissions Indicates the list of permissions to be requested. This parameter cannot be null. * @param permissionsState Indicates the list of permissions' state to be requested. This parameter cannot be null. - * @param requestCode Indicates the request code to be passed to the Ability.onRequestPermissionsFromUserResult(int, - * String[], int[]) callback method. This code cannot be a negative number. + * @param task The callback or promise fo js interface. */ void RequestPermissionsFromUser(std::vector &permissions, std::vector &permissionsState, - int requestCode) override; + PermissionRequestTask &&task) override; /** * @brief Starts a new ability with special ability start setting. diff --git a/test/mock/frameworks_kits_ability_native_test/include/mock_ability.cpp b/test/mock/frameworks_kits_ability_native_test/include/mock_ability.cpp index b9ef9f0b14..219f0d9072 100644 --- a/test/mock/frameworks_kits_ability_native_test/include/mock_ability.cpp +++ b/test/mock/frameworks_kits_ability_native_test/include/mock_ability.cpp @@ -90,12 +90,6 @@ void Ability::StartAbility(const Want &want, AbilityStartSetting abilityStartSet return; } -void Ability::OnRequestPermissionsFromUserResult( - int requestCode, const std::vector &permissions, const std::vector &grantResults) -{ - return; -} - std::string Ability::GetType(const Uri &uri) { std::string value("\nullptr"); diff --git a/test/unittest/frameworks_kits_ability_native_test/ability_permission_test.cpp b/test/unittest/frameworks_kits_ability_native_test/ability_permission_test.cpp index 21d91ca762..4a99a49296 100644 --- a/test/unittest/frameworks_kits_ability_native_test/ability_permission_test.cpp +++ b/test/unittest/frameworks_kits_ability_native_test/ability_permission_test.cpp @@ -118,33 +118,5 @@ HWTEST_F(AbilityPermissionTest, AaFwk_AbilityPermissionTest_VerifyPermission_010 context_->VerifyPermission(permission_name, 0, 10); } - -/** - * @tc.number: AaFwk_AbilityPermissionTest_RequestPermissionsFromUser_0100 - * @tc.name: RequestPermissionsFromUser - * @tc.desc: Verify that requestpermissionsfromuser is called. - */ -HWTEST_F( - AbilityPermissionTest, AaFwk_AbilityPermissionTest_RequestPermissionsFromUser_0100, Function | MediumTest | Level1) -{ - if (context_ == nullptr) { - EXPECT_EQ(true, context_ != nullptr); - return; - } - - std::shared_ptr appInfo = std::make_shared(); - std::string name = "hello"; - appInfo->bundleName = name; - std::vector permissions; - permissions.emplace_back("permission_1"); - permissions.emplace_back("permission_2"); - permissions.emplace_back("permission_3"); - std::vector permissionsState(permissions.size(), -1); - - std::shared_ptr deal = std::make_shared(); - deal->SetApplicationInfo(appInfo); - context_->AttachBaseContext(deal); - context_->RequestPermissionsFromUser(permissions, permissionsState, 1004); -} } // namespace AppExecFwk } // namespace OHOS