From 0c46b74913b92986c908435441ab04d8cde5f9d0 Mon Sep 17 00:00:00 2001 From: liweifeng Date: Fri, 14 Jan 2022 16:53:16 +0800 Subject: [PATCH] start options deliver to window 1. support StartAbilityForResult contain start options 2. support api8 start api7 with start options 3. filter reserved string PARAM_RESV_WINDOW_MODE in want params set by user. Change-Id: I1a4f2aca4e6b9fd78a5cabb85c9448995c9e5af9 Signed-off-by: liweifeng --- .../ability_runtime/include/ability_context.h | 3 +++ .../include/ability_context_impl.h | 2 ++ .../src/ability_context_impl.cpp | 9 +++++++++ .../kits/ability/native/include/ability.h | 18 +++++++++--------- .../ability/native/include/ability_window.h | 2 +- frameworks/kits/ability/native/src/ability.cpp | 12 ++++++------ .../native/src/ability_runtime/js_ability.cpp | 2 +- .../src/ability_runtime/js_ability_context.cpp | 13 +++++++++++-- .../kits/ability/native/src/ability_window.cpp | 4 ++-- .../cpp/src/ohos/aafwk/content/want.cpp | 2 ++ .../ability_manager/include/start_options.h | 1 - .../want/include/ohos/aafwk/content/want.h | 3 +++ .../inner/napi_common/napi_common_want.cpp | 4 ++++ .../abilitymgr/src/ability_manager_service.cpp | 7 +++---- services/abilitymgr/src/start_options.cpp | 1 - 15 files changed, 56 insertions(+), 27 deletions(-) diff --git a/frameworks/kits/ability/ability_runtime/include/ability_context.h b/frameworks/kits/ability/ability_runtime/include/ability_context.h index 762a30c605..45a54360f7 100644 --- a/frameworks/kits/ability/ability_runtime/include/ability_context.h +++ b/frameworks/kits/ability/ability_runtime/include/ability_context.h @@ -64,6 +64,9 @@ public: virtual ErrCode StartAbilityForResult(const AAFwk::Want &Want, int requestCode, RuntimeTask &&task) = 0; + virtual ErrCode StartAbilityForResult(const AAFwk::Want &Want, const AAFwk::StartOptions &startOptions, + int requestCode, RuntimeTask &&task) = 0; + virtual ErrCode TerminateAbilityWithResult(const AAFwk::Want &want, int resultCode) = 0; virtual ErrCode RestoreWindowStage(void* contentStorage) = 0; diff --git a/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h b/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h index 2d2515cdf2..e1a8b27308 100644 --- a/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h +++ b/frameworks/kits/ability/ability_runtime/include/ability_context_impl.h @@ -43,6 +43,8 @@ public: ErrCode StartAbility(const AAFwk::Want &want, int requestCode) override; ErrCode StartAbility(const AAFwk::Want &want, const AAFwk::StartOptions &startOptions, int requestCode) override; ErrCode StartAbilityForResult(const AAFwk::Want &want, int requestCode, RuntimeTask &&task) override; + ErrCode StartAbilityForResult(const AAFwk::Want &want, const AAFwk::StartOptions &startOptions, + int requestCode, RuntimeTask &&task) override; ErrCode TerminateAbilityWithResult(const AAFwk::Want &want, int resultCode) override; void OnAbilityResult(int requestCode, int resultCode, const AAFwk::Want &resultData) override; bool ConnectAbility(const AAFwk::Want &want, diff --git a/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp b/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp index 0ba7d64147..544403720a 100644 --- a/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp +++ b/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp @@ -86,6 +86,15 @@ ErrCode AbilityContextImpl::StartAbilityForResult(const AAFwk::Want &want, int r return err; } +ErrCode AbilityContextImpl::StartAbilityForResult(const AAFwk::Want &want, const AAFwk::StartOptions &startOptions, + int requestCode, RuntimeTask &&task) +{ + HILOG_DEBUG("%{public}s. Start calling StartAbilityForResult.", __func__); + resultCallbacks_.insert(make_pair(requestCode, std::move(task))); + ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, startOptions, token_, requestCode); + HILOG_INFO("%{public}s. End calling StartAbilityForResult. ret=%{public}d", __func__, err); + return err; +} ErrCode AbilityContextImpl::TerminateAbilityWithResult(const AAFwk::Want &want, int resultCode) { diff --git a/frameworks/kits/ability/native/include/ability.h b/frameworks/kits/ability/native/include/ability.h index c144badf72..3cdcb7dfad 100755 --- a/frameworks/kits/ability/native/include/ability.h +++ b/frameworks/kits/ability/native/include/ability.h @@ -107,7 +107,7 @@ public: int TerminateAbility(Want &want); /** - * @brief By binding an action, you can set different action parameters in Intent to present different initial + * @brief By binding an action, you can set different action parameters in want to present different initial * pages. You must register actions in the profile file. * * @param action Indicates the action to bind. @@ -199,8 +199,8 @@ public: * Starts a new ability with specific start settings. * A Page or Service ability uses this method to start a specific ability. * The system locates the target ability from installed abilities based on - * the value of the intent parameter and then starts it. You can specify the - * ability to start using the intent parameter. + * the value of the want parameter and then starts it. You can specify the + * ability to start using the want parameter. * * @param want Indicates the ability to start. * @param abilityStartSetting Indicates the setting ability used to start. @@ -387,7 +387,7 @@ public: * * @param windowOption Indicates the window option defined by the user. */ - virtual void InitWindow(Rosen::WindowType winType, int32_t displayId); + virtual void InitWindow(Rosen::WindowType winType, int32_t displayId, sptr option); /** * @brief Get the window belong to the ability. @@ -850,10 +850,10 @@ public: /** * @brief A Page or Service ability uses this method to start a specific ability. The system locates the target - * ability from installed abilities based on the value of the intent parameter and then starts it. You can specify - * the ability to start using the intent parameter. + * ability from installed abilities based on the value of the want parameter and then starts it. You can specify + * the ability to start using the want parameter. * - * @param intent Indicates the ability to start. + * @param want Indicates the ability to start. * * @return errCode ERR_OK on success, others on failure. */ @@ -1492,10 +1492,10 @@ private: // Keep consistent with DMS defines. Used to callback to DMS. static const std::string DMS_SESSION_ID; - // The originating deviceId passed by DMS using intent param. + // The originating deviceId passed by DMS using want param. static const std::string DMS_ORIGIN_DEVICE_ID; - // If session id cannot get from intent, assign it as default. + // If session id cannot get from want, assign it as default. static const int DEFAULT_DMS_SESSION_ID; std::vector lostedByReconnectTempForms_; diff --git a/frameworks/kits/ability/native/include/ability_window.h b/frameworks/kits/ability/native/include/ability_window.h index 8d92173d51..69b5005901 100644 --- a/frameworks/kits/ability/native/include/ability_window.h +++ b/frameworks/kits/ability/native/include/ability_window.h @@ -51,7 +51,7 @@ public: */ bool InitWindow(Rosen::WindowType winType, std::shared_ptr &abilityContext, - sptr &listener, int32_t displayId); + sptr &listener, int32_t displayId, sptr option); /** * @brief Called when this ability is started. diff --git a/frameworks/kits/ability/native/src/ability.cpp b/frameworks/kits/ability/native/src/ability.cpp index c8fa668e6a..88337ec483 100755 --- a/frameworks/kits/ability/native/src/ability.cpp +++ b/frameworks/kits/ability/native/src/ability.cpp @@ -202,8 +202,8 @@ void Ability::OnStart(const Want &want) abilityInfo_->name.c_str(), winType, displayId); - - InitWindow(winType, displayId); + auto option = GetWindowOption(want); + InitWindow(winType, displayId, option); if (abilityWindow_ != nullptr) { APP_LOGI("%{public}s begin abilityWindow_->OnPostAbilityStart.", __func__); @@ -677,7 +677,7 @@ void Ability::SetUIContent(int layoutRes, std::shared_ptr &context, int * * @param windowOption Indicates the window option defined by the user. */ -void Ability::InitWindow(Rosen::WindowType winType, int32_t displayId) +void Ability::InitWindow(Rosen::WindowType winType, int32_t displayId, sptr option) { if (abilityWindow_ == nullptr) { APP_LOGE("Ability::InitWindow abilityWindow_ is nullptr"); @@ -686,11 +686,11 @@ void Ability::InitWindow(Rosen::WindowType winType, int32_t displayId) bool useNewMission = AbilityImpl::IsUseNewMission(); APP_LOGI("%{public}s beign abilityWindow_->InitWindow.", __func__); if (useNewMission) { - abilityWindow_->InitWindow(winType, abilityContext_, sceneListener_, displayId); + abilityWindow_->InitWindow(winType, abilityContext_, sceneListener_, displayId, option); } else { std::shared_ptr context = nullptr; sptr listener = nullptr; - abilityWindow_->InitWindow(winType, context, listener, displayId); + abilityWindow_->InitWindow(winType, context, listener, displayId, option); } APP_LOGI("%{public}s end abilityWindow_->InitWindow.", __func__); } @@ -3247,7 +3247,7 @@ sptr Ability::GetWindowOption(const Want &want) APP_LOGE("Ability::GetWindowOption option is null."); return nullptr; } - auto windowMode = want.GetIntParam(StartOptions::STRING_WINDOW_MODE, + auto windowMode = want.GetIntParam(Want::PARAM_RESV_WINDOW_MODE, AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED); APP_LOGI("Ability::GetWindowOption window mode is %{public}d.", windowMode); option->SetWindowMode(static_cast(windowMode)); 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 4c9134f474..d4f1113f74 100755 --- a/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp +++ b/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp @@ -319,7 +319,7 @@ void JsAbility::DoOnForeground(const Want& want) } } auto option = GetWindowOption(want); - Rosen::WMError ret = scene_->Init(displayId, abilityContext_, sceneListener_); + Rosen::WMError ret = scene_->Init(displayId, abilityContext_, sceneListener_, option); if (ret != Rosen::WMError::WM_OK) { HILOG_ERROR("%{public}s error. failed to init window scene!", __func__); return; 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 index 52a8a8bc64..dde6a512da 100644 --- a/frameworks/kits/ability/native/src/ability_runtime/js_ability_context.cpp +++ b/frameworks/kits/ability/native/src/ability_runtime/js_ability_context.cpp @@ -152,8 +152,16 @@ NativeValue* JsAbilityContext::OnStartAbilityForResult(NativeEngine& engine, Nat HILOG_ERROR("%s Failed to parse want!", __func__); return engine.CreateUndefined(); } + decltype(info.argc) unwrapArgc = 1; + AAFwk::StartOptions startOptions; + if (info.argc > ARGC_ONE && info.argv[1]->TypeOf() == NATIVE_OBJECT) { + HILOG_INFO("OnStartAbilityForResult start options is used."); + AppExecFwk::UnwrapStartOptions(reinterpret_cast(&engine), + reinterpret_cast(info.argv[1]), startOptions); + unwrapArgc++; + } - NativeValue* lastParam = info.argc == 1 ? nullptr : info.argv[1]; + NativeValue* lastParam = info.argc == unwrapArgc ? nullptr : info.argv[unwrapArgc]; NativeValue* result = nullptr; std::unique_ptr uasyncTask = CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, nullptr, &result); @@ -175,7 +183,8 @@ NativeValue* JsAbilityContext::OnStartAbilityForResult(NativeEngine& engine, Nat asyncTask->Reject(engine, CreateJsError(engine, 1, "context is released!")); } else { curRequestCode_ = (curRequestCode_ == INT_MAX) ? 0 : (curRequestCode_ + 1); - context->StartAbilityForResult(want, curRequestCode_, std::move(task)); + (unwrapArgc == 1) ? context->StartAbilityForResult(want, curRequestCode_, std::move(task)) : + context->StartAbilityForResult(want, startOptions, curRequestCode_, std::move(task)); } HILOG_INFO("OnStartAbilityForResult is called end"); return result; diff --git a/frameworks/kits/ability/native/src/ability_window.cpp b/frameworks/kits/ability/native/src/ability_window.cpp index 611beeb80a..c595e1b722 100644 --- a/frameworks/kits/ability/native/src/ability_window.cpp +++ b/frameworks/kits/ability/native/src/ability_window.cpp @@ -50,10 +50,10 @@ void AbilityWindow::Init(std::shared_ptr& handler, std::shared_p */ bool AbilityWindow::InitWindow(Rosen::WindowType winType, std::shared_ptr &abilityContext, - sptr &listener, int32_t displayId) + sptr &listener, int32_t displayId, sptr option) { APP_LOGI("%{public}s begin.", __func__); - auto ret = windowScene_->Init(displayId, abilityContext, listener); + auto ret = windowScene_->Init(displayId, abilityContext, listener, option); if (ret != OHOS::Rosen::WMError::WM_OK) { APP_LOGE("%{public}s error. failed to init window scene!", __func__); return false; diff --git a/frameworks/kits/content/cpp/src/ohos/aafwk/content/want.cpp b/frameworks/kits/content/cpp/src/ohos/aafwk/content/want.cpp index ffe84090a3..fee16ccbf4 100644 --- a/frameworks/kits/content/cpp/src/ohos/aafwk/content/want.cpp +++ b/frameworks/kits/content/cpp/src/ohos/aafwk/content/want.cpp @@ -66,6 +66,8 @@ const std::string Want::OCT_SEMICOLON("073"); // ';' const std::string Want::MIME_TYPE("mime-type"); const std::string Want::WANT_HEADER("#Intent;"); +const std::string Want::PARAM_RESV_WINDOW_MODE("ohos.aafwk.param.windowMode"); + /** * @description:Default construcotr of Want class, which is used to initialzie flags and URI. * @param None diff --git a/interfaces/innerkits/ability_manager/include/start_options.h b/interfaces/innerkits/ability_manager/include/start_options.h index 8410fab105..82fe7cd47f 100644 --- a/interfaces/innerkits/ability_manager/include/start_options.h +++ b/interfaces/innerkits/ability_manager/include/start_options.h @@ -24,7 +24,6 @@ namespace OHOS { namespace AAFwk { class StartOptions : public Parcelable { public: - static const std::string STRING_WINDOW_MODE; static const std::string STRING_DISPLAY_ID; const int32_t DEFAULT_DISPLAY_ID {0}; diff --git a/interfaces/innerkits/want/include/ohos/aafwk/content/want.h b/interfaces/innerkits/want/include/ohos/aafwk/content/want.h index 0127fedd27..315916ac39 100644 --- a/interfaces/innerkits/want/include/ohos/aafwk/content/want.h +++ b/interfaces/innerkits/want/include/ohos/aafwk/content/want.h @@ -787,6 +787,9 @@ public: static constexpr int HEX_STRING_BUF_LEN = 36; static constexpr int HEX_STRING_LEN = 10; + // reserved param definition + static const std::string PARAM_RESV_WINDOW_MODE; + private: WantParams parameters_; Operation operation_; diff --git a/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_want.cpp b/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_want.cpp index 5829d942c0..9dff21cbd3 100644 --- a/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_want.cpp +++ b/interfaces/kits/napi/aafwk/inner/napi_common/napi_common_want.cpp @@ -708,6 +708,10 @@ bool UnwrapWantParams(napi_env env, napi_value param, AAFwk::WantParams &wantPar NAPI_CALL_BASE(env, napi_get_element(env, jsProNameList, index, &jsProName), false); std::string strProName = UnwrapStringFromJS(env, jsProName); + /* skip reserved param */ + if (strProName == Want::PARAM_RESV_WINDOW_MODE) { + continue; + } HILOG_INFO("%{public}s called. Property name=%{public}s.", __func__, strProName.c_str()); NAPI_CALL_BASE(env, napi_get_named_property(env, param, strProName.c_str(), &jsProValue), false); NAPI_CALL_BASE(env, napi_typeof(env, jsProValue, &jsValueType), false); diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 5d2552076a..294446b87b 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -393,9 +393,8 @@ int AbilityManagerService::StartAbility(const Want &want, const StartOptions &st } } - abilityRequest.want.SetParam(StartOptions::STRING_WINDOW_MODE, startOptions.GetWindowMode()); abilityRequest.want.SetParam(StartOptions::STRING_DISPLAY_ID, startOptions.GetDisplayID()); - + abilityRequest.want.SetParam(Want::PARAM_RESV_WINDOW_MODE, startOptions.GetWindowMode()); if (useNewMission_) { return currentMissionListManager_->StartAbility(abilityRequest); } else { @@ -631,7 +630,7 @@ int AbilityManagerService::MinimizeAbility(const sptr &token) if (!IsAbilityControllerResuming(abilityRecord->GetAbilityInfo().bundleName)) { return ERR_WOULD_BLOCK; } - + if (useNewMission_) { return currentMissionListManager_->MinimizeAbility(token); } else { @@ -2591,7 +2590,7 @@ void AbilityManagerService::StartSystemApplication() HILOG_INFO("start mms"); StartingMmsAbility(); } - + // Location may change DelayedSingleton::GetInstance()->StartupResidentProcess(); } diff --git a/services/abilitymgr/src/start_options.cpp b/services/abilitymgr/src/start_options.cpp index c0e0046700..20eb4bfd33 100644 --- a/services/abilitymgr/src/start_options.cpp +++ b/services/abilitymgr/src/start_options.cpp @@ -18,7 +18,6 @@ namespace OHOS { namespace AAFwk { -const std::string StartOptions::STRING_WINDOW_MODE = "ohos.aafwk.windowMode"; const std::string StartOptions::STRING_DISPLAY_ID = "ohos.aafwk.displayId"; bool StartOptions::ReadFromParcel(Parcel &parcel)