From 3eac5ca02bcbb2bcf223f78cd042df87c65747d8 Mon Sep 17 00:00:00 2001 From: yuaqiang Date: Sat, 22 Jan 2022 11:56:04 +0000 Subject: [PATCH 1/2] Description:revert launcher split screen mode Sig:SIG_ApplicationFramework Feature or Bugfix:Feature Binary Source:No Signed-off-by: altay Change-Id: I2fd353364d9e138b3764ff9d2a6fc0a4e717cf21 --- frameworks/kits/ability/native/src/ability.cpp | 6 ------ services/abilitymgr/src/mission_list_manager.cpp | 8 +++----- 2 files changed, 3 insertions(+), 11 deletions(-) mode change 100644 => 100755 services/abilitymgr/src/mission_list_manager.cpp diff --git a/frameworks/kits/ability/native/src/ability.cpp b/frameworks/kits/ability/native/src/ability.cpp index d770bb2007d..88337ec4834 100755 --- a/frameworks/kits/ability/native/src/ability.cpp +++ b/frameworks/kits/ability/native/src/ability.cpp @@ -71,8 +71,6 @@ const std::string Ability::DMS_SESSION_ID("sessionId"); const std::string Ability::DMS_ORIGIN_DEVICE_ID("deviceId"); const int Ability::DEFAULT_DMS_SESSION_ID(0); const std::string PERMISSION_REQUIRE_FORM = "ohos.permission.REQUIRE_FORM"; -const std::string LAUNCHER_BUNDLE_NAME = "com.ohos.launcher"; -const std::string LAUNCHER_ABILITY_NAME = "com.ohos.launcher.MainAbility"; const int TARGET_VERSION_THRESHOLDS = 8; static std::mutex formLock; @@ -196,10 +194,6 @@ void Ability::OnStart(const Want &want) winType = Rosen::WindowType::WINDOW_TYPE_SYSTEM_ALARM_WINDOW; } - if (abilityInfo_->bundleName == LAUNCHER_BUNDLE_NAME && abilityInfo_->name == LAUNCHER_ABILITY_NAME) { - winType = Rosen::WindowType::WINDOW_TYPE_WALLPAPER; - } - int defualtDisplayId = Rosen::WindowScene::DEFAULT_DISPLAY_ID; int displayId = want.GetIntParam(StartOptions::STRING_DISPLAY_ID, defualtDisplayId); APP_LOGI("Ability::OnStart bundleName:%{public}s, abilityName:%{public}s, config.type:%{public}d, " diff --git a/services/abilitymgr/src/mission_list_manager.cpp b/services/abilitymgr/src/mission_list_manager.cpp old mode 100644 new mode 100755 index fe1fecc8649..7fcbe92272f --- a/services/abilitymgr/src/mission_list_manager.cpp +++ b/services/abilitymgr/src/mission_list_manager.cpp @@ -245,11 +245,9 @@ int MissionListManager::StartAbilityLocked(const std::shared_ptr // 4. move target list to top MoveMissionListToTop(targetList); - // ability is already foreground, process next ability, excepting for launcher's MainAbility. - if ((abilityRequest.abilityInfo.bundleName != AbilityConfig::LAUNCHER_BUNDLE_NAME || - abilityRequest.abilityInfo.name != AbilityConfig::LAUNCHER_ABILITY_NAME) && - (targetAbilityRecord->IsAbilityState(AbilityState::FOREGROUND_NEW) || - targetAbilityRecord->IsAbilityState(AbilityState::FOREGROUNDING_NEW))) { + // ability is already foreground, process next ability. + if (targetAbilityRecord->IsAbilityState(AbilityState::FOREGROUND_NEW) || + targetAbilityRecord->IsAbilityState(AbilityState::FOREGROUNDING_NEW)) { PostStartWaittingAbility(); return 0; } -- Gitee From f70e18e029f21a26ff59e08b437d22032121f234 Mon Sep 17 00:00:00 2001 From: yuaqiang Date: Mon, 24 Jan 2022 02:22:44 +0000 Subject: [PATCH 2/2] Description:To request permission dynamically in context Sig:SIG_ApplicationFramework Feature or Bugfix:Feature Binary Source:No Signed-off-by: altay Change-Id: I04809fc1c394711953afe284c2ce2c919678c083 --- .../ability_runtime/include/ability_context.h | 19 ++++- .../include/ability_context_impl.h | 5 +- .../src/ability_context_impl.cpp | 18 ++++- .../ability_runtime/js_ability_context.h | 1 + .../kits/ability/native/src/ability.cpp | 2 +- .../kits/ability/native/src/ability_impl.cpp | 8 +++ .../native/src/ability_runtime/js_ability.cpp | 7 ++ .../ability_runtime/js_ability_context.cpp | 69 ++++++++++--------- services/abilitymgr/src/ability_record.cpp | 5 ++ 9 files changed, 98 insertions(+), 36 deletions(-) mode change 100644 => 100755 frameworks/kits/ability/ability_runtime/include/ability_context.h mode change 100644 => 100755 frameworks/kits/ability/ability_runtime/include/ability_context_impl.h mode change 100644 => 100755 frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp mode change 100644 => 100755 frameworks/kits/ability/native/include/ability_runtime/js_ability_context.h mode change 100644 => 100755 frameworks/kits/ability/native/src/ability_runtime/js_ability_context.cpp mode change 100644 => 100755 services/abilitymgr/src/ability_record.cpp diff --git a/frameworks/kits/ability/ability_runtime/include/ability_context.h b/frameworks/kits/ability/ability_runtime/include/ability_context.h old mode 100644 new mode 100755 index 86592c74abc..27b879cce29 --- a/frameworks/kits/ability/ability_runtime/include/ability_context.h +++ b/frameworks/kits/ability/ability_runtime/include/ability_context.h @@ -27,6 +27,7 @@ namespace OHOS { namespace AbilityRuntime { using RuntimeTask = std::function; +using PermissionRequestTask = std::function&, const std::vector&)>; class AbilityContext : public Context { public: virtual ~AbilityContext() = default; @@ -124,7 +125,23 @@ public: * @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. */ - virtual void RequestPermissionsFromUser(const std::vector &permissions, int requestCode) = 0; + virtual void RequestPermissionsFromUser(const std::vector &permissions, int requestCode, PermissionRequestTask &&task) = 0; + + /** + * @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) = 0; /** * @brief Get ContentStorage. diff --git a/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h b/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h old mode 100644 new mode 100755 index cbf3e44ade4..c7ed4aa2b10 --- a/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h +++ b/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h @@ -58,7 +58,9 @@ public: ErrCode TerminateSelf() override; sptr GetAbilityToken() override; - void RequestPermissionsFromUser(const std::vector &permissions, int requestCode) 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; ErrCode RestoreWindowStage(void* contentStorage) override; /** @@ -103,6 +105,7 @@ private: std::shared_ptr abilityInfo_ = nullptr; std::shared_ptr stageContext_ = nullptr; std::map resultCallbacks_; + std::map permissionRequestCallbacks_; void* contentStorage_ = nullptr; }; } // namespace AbilityRuntime diff --git a/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp b/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp old mode 100644 new mode 100755 index 6e812396a4e..f7b64fccd4c --- a/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp +++ b/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp @@ -214,9 +214,25 @@ sptr AbilityContextImpl::GetAbilityToken() return token_; } -void AbilityContextImpl::RequestPermissionsFromUser(const std::vector &permissions, int requestCode) +void AbilityContextImpl::RequestPermissionsFromUser(const std::vector &permissions, int requestCode, PermissionRequestTask &&task) { HILOG_INFO("%{public}s called.", __func__); + AAFwk::Want want; + want.SetElementName("com.ohos.permissionmanager", "com.ohos.permissionmanager.GrantAbility"); + want.SetParam("ohos.user.grant.permission", permissions); + HILOG_DEBUG("%{public}s. Start calling StartAbility.", __func__); + permissionRequestCallbacks_.insert(make_pair(requestCode, std::move(task))); + ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode); + HILOG_INFO("%{public}s. End calling StartAbility. ret=%{public}d", __func__, err); +} + +void AbilityContextImpl::OnRequestPermissionsFromUserResult( + int requestCode, const std::vector &permissions, const std::vector &grantResults) +{ + HILOG_DEBUG("%{public}s. Start calling OnRequestPermissionsFromUserResult.", __func__); + permissionRequestCallbacks_[requestCode](permissions, grantResults); + permissionRequestCallbacks_.erase(requestCode); + HILOG_INFO("%{public}s. End calling OnRequestPermissionsFromUserResult.", __func__); } ErrCode AbilityContextImpl::RestoreWindowStage(void* contentStorage) diff --git a/frameworks/kits/ability/native/include/ability_runtime/js_ability_context.h b/frameworks/kits/ability/native/include/ability_runtime/js_ability_context.h old mode 100644 new mode 100755 index d4b019efdbb..83063b689f3 --- a/frameworks/kits/ability/native/include/ability_runtime/js_ability_context.h +++ b/frameworks/kits/ability/native/include/ability_runtime/js_ability_context.h @@ -68,6 +68,7 @@ private: static NativeValue* WrapWant(NativeEngine& engine, const AAFwk::Want& want); static bool UnWrapAbilityResult(NativeEngine& engine, NativeValue* argv, int& resultCode, AAFwk::Want& want); static NativeValue* WrapAbilityResult(NativeEngine& engine, const int& resultCode, const AAFwk::Want& want); + static NativeValue* WrapPermissionRequestResult(NativeEngine& engine, const std::vector &permissions, const std::vector &grantResults); std::weak_ptr context_; int curRequestCode_ = 0; diff --git a/frameworks/kits/ability/native/src/ability.cpp b/frameworks/kits/ability/native/src/ability.cpp index 88337ec4834..a7dbd85765c 100755 --- a/frameworks/kits/ability/native/src/ability.cpp +++ b/frameworks/kits/ability/native/src/ability.cpp @@ -196,7 +196,7 @@ void Ability::OnStart(const Want &want) int defualtDisplayId = Rosen::WindowScene::DEFAULT_DISPLAY_ID; int displayId = want.GetIntParam(StartOptions::STRING_DISPLAY_ID, defualtDisplayId); - APP_LOGI("Ability::OnStart bundleName:%{public}s, abilityName:%{public}s, config.type:%{public}d, " + APP_LOGI("Ability::OnStart bundleName:%{public}s, abilityName:%{public}s, windowType:%{public}d, " "displayId:%{public}d", abilityInfo_->bundleName.c_str(), abilityInfo_->name.c_str(), diff --git a/frameworks/kits/ability/native/src/ability_impl.cpp b/frameworks/kits/ability/native/src/ability_impl.cpp index 801b49ee655..a50a86fd2f5 100755 --- a/frameworks/kits/ability/native/src/ability_impl.cpp +++ b/frameworks/kits/ability/native/src/ability_impl.cpp @@ -503,6 +503,14 @@ void AbilityImpl::SendResult(int requestCode, int resultCode, const Want &result } else { APP_LOGI("%{public}s user cancel permissions.", __func__); } + } else if (resultData.HasParameter("ohos.user.grant.permission")) { + std::vector permissions = resultData.GetStringArrayParam("ohos.user.grant.permission"); + std::vector grantedResult(permissions.size(), -1); + if (resultCode > 0) { + grantedResult = resultData.GetIntArrayParam("ohos.user.grant.permission.result"); + APP_LOGI("%{public}s Get user granted result.", __func__); + } + ability_->OnRequestPermissionsFromUserResult(requestCode, permissions, grantedResult); } else { ability_->OnAbilityResult(requestCode, resultCode, resultData); } diff --git a/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp b/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp index 6da103b7cad..d4d2ba4a25e 100755 --- a/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp +++ b/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp @@ -263,6 +263,13 @@ void JsAbility::OnRequestPermissionsFromUserResult(int requestCode, const std::v 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) diff --git a/frameworks/kits/ability/native/src/ability_runtime/js_ability_context.cpp b/frameworks/kits/ability/native/src/ability_runtime/js_ability_context.cpp old mode 100644 new mode 100755 index b402fc7d706..6028667bbe8 --- a/frameworks/kits/ability/native/src/ability_runtime/js_ability_context.cpp +++ b/frameworks/kits/ability/native/src/ability_runtime/js_ability_context.cpp @@ -35,7 +35,6 @@ namespace AbilityRuntime { constexpr size_t ARGC_ZERO = 0; constexpr size_t ARGC_ONE = 1; constexpr size_t ARGC_TWO = 2; -constexpr size_t ARGC_THREE = 3; constexpr int32_t ERROR_CODE_ONE = 1; void JsAbilityContext::Finalizer(NativeEngine* engine, void* data, void* hint) @@ -381,7 +380,7 @@ NativeValue* JsAbilityContext::OnRequestPermissionsFromUser(NativeEngine& engine { HILOG_INFO("OnRequestPermissionsFromUser is called"); - if (info.argc != ARGC_TWO && info.argc != ARGC_THREE) { + if (info.argc != ARGC_ONE && info.argc != ARGC_TWO) { HILOG_ERROR("Not enough params"); return engine.CreateUndefined(); } @@ -389,42 +388,39 @@ NativeValue* JsAbilityContext::OnRequestPermissionsFromUser(NativeEngine& engine std::vector permissionList; if (!OHOS::AppExecFwk::UnwrapArrayStringFromJS(reinterpret_cast(&engine), reinterpret_cast(info.argv[0]), permissionList)) { - HILOG_INFO("%{public}s called, the first parameter is invalid.", __func__); + HILOG_ERROR("%{public}s called, the first parameter is invalid.", __func__); return engine.CreateUndefined(); } - int32_t requestCode = 0; - if (!OHOS::AppExecFwk::UnwrapInt32FromJS2(reinterpret_cast(&engine), - reinterpret_cast(info.argv[1]), requestCode)) { - HILOG_INFO("%{public}s called, the second parameter is invalid.", __func__); - return engine.CreateUndefined(); + if (permissionList.size() == 0) { + HILOG_ERROR("%{public}s called, params do not meet specification.", __func__); } - AsyncTask::CompleteCallback complete = - [weak = context_, permissionList, requestCode](NativeEngine& engine, AsyncTask& task, int32_t status) { - auto context = weak.lock(); - if (!context) { - HILOG_WARN("context is released"); - task.Reject(engine, CreateJsError(engine, 1, "Context is released")); - return; - } - - HILOG_INFO("RequestPermissionsFromUser is called"); - context->RequestPermissionsFromUser(permissionList, requestCode); - - NativeValue* objValue = engine.CreateObject(); - NativeObject* object = ConvertNativeValueTo(objValue); - object->SetProperty("requestCode", CreateJsValue(engine, requestCode)); - object->SetProperty("permissions", CreateNativeArray(engine, permissionList)); - std::vector grantResults(permissionList.size()); - object->SetProperty("authResults", CreateNativeArray(engine, grantResults)); - task.Resolve(engine, objValue); - }; - - NativeValue* lastParam = (info.argc == ARGC_TWO) ? nullptr : info.argv[ARGC_TWO]; + NativeValue* lastParam = (info.argc == ARGC_ONE) ? nullptr : info.argv[ARGC_TWO]; NativeValue* result = nullptr; - AsyncTask::Schedule( - engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result)); + auto uasyncTask = CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, nullptr, &result); + std::shared_ptr asyncTask = std::move(uasyncTask); + PermissionRequestTask task = + [&engine, asyncTask](const std::vector &permissions, const std::vector &grantResults) { + HILOG_INFO("OnRequestPermissionsFromUser async callback is called"); + NativeValue* requestResult = JsAbilityContext::WrapPermissionRequestResult(engine, permissions, grantResults); + if (requestResult == nullptr) { + HILOG_WARN("wrap requestResult failed"); + asyncTask->Reject(engine, CreateJsError(engine, 1, "failed to get granted result data!")); + } else { + asyncTask->Resolve(engine, requestResult); + } + HILOG_INFO("OnRequestPermissionsFromUser async callback is called end"); + }; + auto context = context_.lock(); + if (context == nullptr) { + 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)); + } + HILOG_INFO("OnRequestPermissionsFromUser is called end"); return result; } @@ -542,6 +538,15 @@ NativeValue* JsAbilityContext::WrapAbilityResult(NativeEngine& engine, const int return jAbilityResult; } +NativeValue* JsAbilityContext::WrapPermissionRequestResult(NativeEngine& engine, const std::vector &permissions, const std::vector &grantResults) +{ + NativeValue* jsPermissionRequestResult = engine.CreateObject(); + NativeObject* permissionRequestResult = ConvertNativeValueTo(jsPermissionRequestResult); + permissionRequestResult->SetProperty("permissions", CreateNativeArray(engine, permissions)); + permissionRequestResult->SetProperty("authResults", CreateNativeArray(engine, grantResults)); + return jsPermissionRequestResult; +} + NativeValue* CreateJsAbilityContext(NativeEngine& engine, std::shared_ptr context) { NativeValue* objValue = CreateJsBaseContext(engine, context); diff --git a/services/abilitymgr/src/ability_record.cpp b/services/abilitymgr/src/ability_record.cpp old mode 100644 new mode 100755 index 4a46419c76d..3a93c0a8b6d --- a/services/abilitymgr/src/ability_record.cpp +++ b/services/abilitymgr/src/ability_record.cpp @@ -1004,6 +1004,11 @@ void AbilityRecord::OnSchedulerDied(const wptr &remote) abilityManagerService->OnAbilityDied(ability); }; handler->PostTask(task); + auto uriTask = [want = want_, ability = shared_from_this()]() { + ability->SaveResultToCallers(-1, &want); + ability->SendResultToCallers(); + } + handler->PostTask(uriTask); } void AbilityRecord::SetConnRemoteObject(const sptr &remoteObject) -- Gitee