diff --git a/frameworks/kits/ability/ability_runtime/test/mock/AMS/mock_serviceability_manager_service.h b/frameworks/kits/ability/ability_runtime/test/mock/AMS/mock_serviceability_manager_service.h index fb6a3059f83231995beaae402548ef8beaa4540a..18196624fca553c9fa0dc882db6ef4269856f908 100644 --- a/frameworks/kits/ability/ability_runtime/test/mock/AMS/mock_serviceability_manager_service.h +++ b/frameworks/kits/ability/ability_runtime/test/mock/AMS/mock_serviceability_manager_service.h @@ -134,6 +134,7 @@ public: MOCK_METHOD1(CleanMission, int(int32_t missionId)); MOCK_METHOD0(CleanAllMissions, int()); MOCK_METHOD1(MoveMissionToFront, int(int32_t missionId)); + MOCK_METHOD2(MoveMissionToFront, int(int32_t missionId, const StartOptions &startOptions)); MOCK_METHOD2(GetWantSenderInfo, int(const sptr &target, std::shared_ptr &info)); diff --git a/frameworks/kits/ability/native/src/ability.cpp b/frameworks/kits/ability/native/src/ability.cpp index 54ce04dd2027150cccb628e9cbfb4bff8921e0b3..e9e830a071c8b3b5ee2a647136684588c6cc2936 100755 --- a/frameworks/kits/ability/native/src/ability.cpp +++ b/frameworks/kits/ability/native/src/ability.cpp @@ -3272,6 +3272,12 @@ void Ability::DoOnForeground(const Want& want) if (abilityWindow_ != nullptr) { APP_LOGI("%{public}s begin abilityWindow_->OnPostAbilityForeground, sceneFlag:%{public}d.", __func__, sceneFlag_); + auto windowMode = want.GetIntParam(Want::PARAM_RESV_WINDOW_MODE, + AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED); + auto window = abilityWindow_->GetWindow(); + if (window != nullptr && windowMode != AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED) { + window->SetWindowMode(static_cast(windowMode)); + } abilityWindow_->OnPostAbilityForeground(sceneFlag_); APP_LOGI("%{public}s end abilityWindow_->OnPostAbilityForeground.", __func__); } else { 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 a5563e07cd4b44bbd7d94b58cd97b8226cb2dc36..c598dd5155f526c2812fee4ccd105b5ddcab415f 100755 --- a/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp +++ b/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp @@ -459,6 +459,13 @@ void JsAbility::DoOnForeground(const Want &want) } else { OnSceneCreated(); } + } else { + auto windowMode = want.GetIntParam(Want::PARAM_RESV_WINDOW_MODE, + AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED); + auto window = scene_->GetMainWindow(); + if (window != nullptr && windowMode != AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED) { + window->SetWindowMode(static_cast(windowMode)); + } } HILOG_INFO("%{public}s begin scene_->GoForeground, sceneFlag_:%{public}d.", __func__, Ability::sceneFlag_); scene_->GoForeground(Ability::sceneFlag_); diff --git a/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.h b/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.h index f828cef1da661c0fa4e7c870ea9fa2f8dd643a9a..774e4c351d2ce5a27b742a4cc5b9f82da58b75fb 100644 --- a/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.h +++ b/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.h @@ -154,6 +154,7 @@ public: MOCK_METHOD0(CleanAllMissions, int()); MOCK_METHOD2(SetMissionLabel, int(const sptr &token, const std::string &label)); MOCK_METHOD1(MoveMissionToFront, int(int32_t missionId)); + MOCK_METHOD2(MoveMissionToFront, int(int32_t missionId, const StartOptions &startOptions)); MOCK_METHOD1(GetAbilityRunningInfos, int(std::vector &info)); MOCK_METHOD2(GetExtensionRunningInfos, int(int upperLimit, std::vector &info)); diff --git a/frameworks/kits/appkit/test/Mock/include/mock_ability_mgr_service.h b/frameworks/kits/appkit/test/Mock/include/mock_ability_mgr_service.h index f53ce738e032cb1419c6ee36a623a62e308f3338..40362b43c53ef7f8f47f5a0f325187f89ae12680 100644 --- a/frameworks/kits/appkit/test/Mock/include/mock_ability_mgr_service.h +++ b/frameworks/kits/appkit/test/Mock/include/mock_ability_mgr_service.h @@ -73,6 +73,7 @@ public: MOCK_METHOD1(CleanMission, int(int32_t missionId)); MOCK_METHOD0(CleanAllMissions, int()); MOCK_METHOD1(MoveMissionToFront, int(int32_t missionId)); + MOCK_METHOD2(MoveMissionToFront, int(int32_t missionId, const StartOptions &startOptions)); MOCK_METHOD1(GetAbilityRunningInfos, int(std::vector &info)); MOCK_METHOD2(GetExtensionRunningInfos, int(int upperLimit, std::vector &info)); diff --git a/frameworks/kits/test/mock/AMS/mock_ability_manager_service.h b/frameworks/kits/test/mock/AMS/mock_ability_manager_service.h index 08e6ee1ace67e73282896984c89290b71d4badb0..c9a350591a4853c32292a1273ebf676be51268f6 100644 --- a/frameworks/kits/test/mock/AMS/mock_ability_manager_service.h +++ b/frameworks/kits/test/mock/AMS/mock_ability_manager_service.h @@ -130,6 +130,7 @@ public: MOCK_METHOD1(CleanMission, int(int32_t missionId)); MOCK_METHOD0(CleanAllMissions, int()); MOCK_METHOD1(MoveMissionToFront, int(int32_t missionId)); + MOCK_METHOD2(MoveMissionToFront, int(int32_t missionId, const StartOptions &startOptions)); MOCK_METHOD2(SetMissionLabel, int(const sptr &token, const std::string &label)); MOCK_METHOD2(GetWantSenderInfo, int(const sptr &target, std::shared_ptr &info)); diff --git a/frameworks/kits/test/mock/AMS/mock_serviceability_manager_service.h b/frameworks/kits/test/mock/AMS/mock_serviceability_manager_service.h index cca6d5b4c931def3db70089ac07e43f9d0b98e21..933c423ab70d759125de948a668a57f1836eece8 100644 --- a/frameworks/kits/test/mock/AMS/mock_serviceability_manager_service.h +++ b/frameworks/kits/test/mock/AMS/mock_serviceability_manager_service.h @@ -129,6 +129,7 @@ public: MOCK_METHOD1(CleanMission, int(int32_t missionId)); MOCK_METHOD0(CleanAllMissions, int()); MOCK_METHOD1(MoveMissionToFront, int(int32_t missionId)); + MOCK_METHOD2(MoveMissionToFront, int(int32_t missionId, const StartOptions &startOptions)); MOCK_METHOD2(SetMissionLabel, int(const sptr &token, const std::string &label)); MOCK_METHOD2(GetWantSenderInfo, int(const sptr &target, std::shared_ptr &info)); diff --git a/interfaces/innerkits/ability_manager/include/ability_manager_client.h b/interfaces/innerkits/ability_manager/include/ability_manager_client.h index 2fb5972561443b51ff62565ccffacaff28915f65..bbbfc93e2a7ce2c3d7c33328e5f6fdc42ca0d6d6 100644 --- a/interfaces/innerkits/ability_manager/include/ability_manager_client.h +++ b/interfaces/innerkits/ability_manager/include/ability_manager_client.h @@ -609,11 +609,13 @@ public: /** * @brief Move a mission to front. * @param missionId Id of target mission. + * @param startOptions Special startOptions for target mission. * * @return Returns ERR_OK on success, others on failure. */ ErrCode MoveMissionToFront(int32_t missionId); - + ErrCode MoveMissionToFront(int32_t missionId, const StartOptions &startOptions); + /** * Start Ability, connect session with common ability. * diff --git a/interfaces/innerkits/ability_manager/include/ability_manager_interface.h b/interfaces/innerkits/ability_manager/include/ability_manager_interface.h index b741244ada4b7995ad4c4c0e89b967498a41a0e7..601d9ea3254331279510c4312b1358ced362603e 100644 --- a/interfaces/innerkits/ability_manager/include/ability_manager_interface.h +++ b/interfaces/innerkits/ability_manager/include/ability_manager_interface.h @@ -566,7 +566,9 @@ public: virtual int CleanAllMissions() = 0; virtual int MoveMissionToFront(int32_t missionId) = 0; - + + virtual int MoveMissionToFront(int32_t missionId, const StartOptions &startOptions) = 0; + /** * Start Ability, connect session with common ability. * @@ -669,7 +671,7 @@ public: * @return Returns ERR_OK on success, others on failure. */ virtual int DelegatorDoAbilityBackground(const sptr &token) = 0; - + /** * Calls this interface to move the ability to the foreground. * @@ -846,7 +848,7 @@ public: // ipc id for move mission to front (50) STOP_USER, - // ipc id for set ability controller (51) + // ipc id for set ability controller (51)` SET_ABILITY_CONTROLLER, // ipc id for get stability test flag (52) @@ -861,6 +863,9 @@ public: // ipc id for ability background (55) DO_ABILITY_BACKGROUND, + // ipc id for move mission to front by options (56) + MOVE_MISSION_TO_FRONT_BY_OPTIONS, + // ipc id 1001-2000 for DMS // ipc id for starting ability (1001) START_ABILITY = 1001, diff --git a/interfaces/innerkits/ability_manager/include/start_options.h b/interfaces/innerkits/ability_manager/include/start_options.h index 82fe7cd47f70d11565949bff267bab297c8fa8a7..ed8bc0f6e706c1e3c8393ec73cd162cd0b999be1 100644 --- a/interfaces/innerkits/ability_manager/include/start_options.h +++ b/interfaces/innerkits/ability_manager/include/start_options.h @@ -22,11 +22,16 @@ #include "parcel.h" namespace OHOS { namespace AAFwk { -class StartOptions : public Parcelable { +class StartOptions final : public Parcelable, public std::enable_shared_from_this { public: static const std::string STRING_DISPLAY_ID; const int32_t DEFAULT_DISPLAY_ID {0}; + StartOptions() = default; + ~StartOptions() = default; + StartOptions(const StartOptions &other); + StartOptions &operator=(const StartOptions &other); + bool ReadFromParcel(Parcel &parcel); virtual bool Marshalling(Parcel &parcel) const override; static StartOptions *Unmarshalling(Parcel &parcel); diff --git a/interfaces/kits/napi/aafwk/mission_manager/BUILD.gn b/interfaces/kits/napi/aafwk/mission_manager/BUILD.gn index 54de57a91d3e910accecab15dd4c9cdc00737ae8..d57db5e17bec3e290a61d1f79094fa205576ccdd 100644 --- a/interfaces/kits/napi/aafwk/mission_manager/BUILD.gn +++ b/interfaces/kits/napi/aafwk/mission_manager/BUILD.gn @@ -30,6 +30,7 @@ ohos_shared_library("missionmanager_napi") { "//foundation/aafwk/standard/interfaces/kits/napi/aafwk/inner/napi_common", "//base/global/resmgr_standard/interfaces/innerkits/include", "//third_party/icu/icu4c/source/common", + "//foundation/aafwk/standard/frameworks/kits/ability/ability_runtime/include/", "//foundation/aafwk/standard/frameworks/kits/ability/native/include/continuation/kits", "//foundation/communication/ipc/ipc/native/src/napi/include", ] @@ -49,6 +50,7 @@ ohos_shared_library("missionmanager_napi") { external_deps = [ "ability_base:want", + "ability_runtime:ability_context_native", "ability_runtime:ability_manager", "ability_runtime:runtime", "bundle_framework:appexecfwk_base", diff --git a/interfaces/kits/napi/aafwk/mission_manager/mission_manager.cpp b/interfaces/kits/napi/aafwk/mission_manager/mission_manager.cpp index da1fb0fdefd2578c4ccad5de89e31a4aca26e130..06ed67195273a22066bc0725fe6d88f8ba381d02 100644 --- a/interfaces/kits/napi/aafwk/mission_manager/mission_manager.cpp +++ b/interfaces/kits/napi/aafwk/mission_manager/mission_manager.cpp @@ -15,6 +15,7 @@ #include "mission_manager.h" +#include "ability_context.h" #include "ability_manager_client.h" #include "event_handler.h" #include "event_runner.h" @@ -24,11 +25,13 @@ #include "js_runtime_utils.h" #include "mission_snapshot.h" #include "pixel_map_napi.h" +#include "start_options.h" #include namespace OHOS { namespace AbilityRuntime { +constexpr size_t ARGC_ONE = 1; using namespace OHOS::AppExecFwk; using AbilityManagerClient = AAFwk::AbilityManagerClient; namespace { @@ -108,6 +111,22 @@ public: } private: + std::shared_ptr GetNativeAbilityContext(NativeValue* nativeContext) + { + if (nativeContext != nullptr) { + // Parse info->argv[0] as abilitycontext + auto objContext = AbilityRuntime::ConvertNativeValueTo(nativeContext); + if (objContext == nullptr) { + HILOG_ERROR("ConvertNativeValueTo Context Object failed"); + return nullptr; + } + auto context = static_cast*>(objContext->GetNativePointer()); + auto abilityContext = Context::ConvertTo(context->lock()); + return abilityContext; + } + return nullptr; + } + NativeValue* OnRegisterMissionListener(NativeEngine &engine, NativeCallbackInfo &info) { HILOG_INFO("%{public}s is called", __FUNCTION__); @@ -452,14 +471,30 @@ private: HILOG_ERROR("Parse missionId failed"); errCode = ERR_NOT_OK; } - + decltype(info.argc) unwrapArgc = 1; + + AAFwk::StartOptions startOptions; + if (info.argc > ARGC_ONE && info.argv[1]->TypeOf() == NATIVE_OBJECT) { + HILOG_INFO("OnMoveMissionToFront context is used."); + auto abilityContext = GetNativeAbilityContext(info.argv[1]); + if (abilityContext != nullptr) { + auto windowMode = abilityContext->GetCurrentWindowMode(); + if (windowMode == AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_PRIMARY || + windowMode == AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_SECONDARY) { + startOptions.SetWindowMode(windowMode); + unwrapArgc++; + } + HILOG_INFO("Window mode is %{public}d", windowMode); + } + } AsyncTask::CompleteCallback complete = - [missionId, errCode](NativeEngine &engine, AsyncTask &task, int32_t status) { + [missionId, errCode, startOptions, unwrapArgc](NativeEngine &engine, AsyncTask &task, int32_t status) { if (errCode != 0) { task.Reject(engine, CreateJsError(engine, errCode, "Invalidate params.")); return; } - auto ret = AbilityManagerClient::GetInstance()->MoveMissionToFront(missionId); + auto ret = (unwrapArgc == 1) ? AbilityManagerClient::GetInstance()->MoveMissionToFront(missionId) : + AbilityManagerClient::GetInstance()->MoveMissionToFront(missionId, startOptions); if (ret == 0) { task.Resolve(engine, engine.CreateUndefined()); } else { @@ -467,7 +502,7 @@ private: } }; - NativeValue* lastParam = (info.argc <= 1) ? nullptr : info.argv[1]; + NativeValue* lastParam = (info.argc <= unwrapArgc) ? nullptr : info.argv[unwrapArgc]; NativeValue* result = nullptr; AsyncTask::Schedule( engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result)); @@ -505,7 +540,6 @@ NativeValue* JsMissionManagerInit(NativeEngine* engine, NativeValue* exportObj) BindNativeFunction(*engine, *object, "clearMission", JsMissionManager::ClearMission); BindNativeFunction(*engine, *object, "clearAllMissions", JsMissionManager::ClearAllMissions); BindNativeFunction(*engine, *object, "moveMissionToFront", JsMissionManager::MoveMissionToFront); - BindNativeFunction(*engine, *object, "moveMissionToFront", JsMissionManager::MoveMissionToFront); return engine->CreateUndefined(); } } // namespace AbilityRuntime diff --git a/services/abilitymgr/include/ability_manager_proxy.h b/services/abilitymgr/include/ability_manager_proxy.h index 18ad4c0f89afc025f3d444129d31fc0048c16477..7308ccacba10a605512c2e49395874bff016bf55 100644 --- a/services/abilitymgr/include/ability_manager_proxy.h +++ b/services/abilitymgr/include/ability_manager_proxy.h @@ -544,7 +544,9 @@ public: virtual int CleanAllMissions() override; virtual int MoveMissionToFront(int32_t missionId) override; - + + virtual int MoveMissionToFront(int32_t missionId, const StartOptions &startOptions) override; + /** * Start Ability, connect session with common ability. * @@ -655,7 +657,7 @@ public: * @param pid The not response process ID. */ virtual bool SendANRProcessID(int pid) override; - + private: template int GetParcelableInfos(MessageParcel &reply, std::vector &parcelableInfos); diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index 30f893ce7d37d348738d5a08e32791820a593df6..e012cefa95e442c90be459354eeb089e18bababe 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -659,6 +659,8 @@ public: virtual int MoveMissionToFront(int32_t missionId) override; + virtual int MoveMissionToFront(int32_t missionId, const StartOptions &startOptions) override; + virtual int StartSyncRemoteMissions(const std::string& devId, bool fixConflict, int64_t tag) override; virtual int StopSyncRemoteMissions(const std::string& devId) override; diff --git a/services/abilitymgr/include/ability_manager_stub.h b/services/abilitymgr/include/ability_manager_stub.h index 08bacb824caa2785704e9e4b3c9a011d17086494..448a262cf098f14e2968ecb5bf23bd584b459dfc 100644 --- a/services/abilitymgr/include/ability_manager_stub.h +++ b/services/abilitymgr/include/ability_manager_stub.h @@ -142,7 +142,7 @@ private: int CleanMissionInner(MessageParcel &data, MessageParcel &reply); int CleanAllMissionsInner(MessageParcel &data, MessageParcel &reply); int MoveMissionToFrontInner(MessageParcel &data, MessageParcel &reply); - + // for new version ability (call ability) int StartAbilityByCallInner(MessageParcel &data, MessageParcel &reply); int ReleaseInner(MessageParcel &data, MessageParcel &reply); @@ -170,6 +170,7 @@ private: int DoAbilityBackgroundInner(MessageParcel &data, MessageParcel &reply); int IsRunningInStabilityTestInner(MessageParcel &data, MessageParcel &reply); + int MoveMissionToFrontByOptionsInner(MessageParcel &data, MessageParcel &reply); using RequestFuncType = int (AbilityManagerStub::*)(MessageParcel &data, MessageParcel &reply); std::map requestFuncMap_; diff --git a/services/abilitymgr/include/mission_list_manager.h b/services/abilitymgr/include/mission_list_manager.h index 650085f7f87e4e4dd9bea2c173f0f9db2a447d8a..3b6168303261041fdb4a5bc07b2af61e04eac12e 100644 --- a/services/abilitymgr/include/mission_list_manager.h +++ b/services/abilitymgr/include/mission_list_manager.h @@ -27,6 +27,7 @@ #include "mission_info.h" #include "mission_snapshot.h" #include "snapshot.h" +#include "start_options.h" #include "want.h" namespace OHOS { @@ -67,9 +68,10 @@ public: int GetMissionInfo(int32_t missionId, MissionInfo &missionInfo); - int MoveMissionToFront(int32_t missionId); + int MoveMissionToFront(int32_t missionId, std::shared_ptr startOptions = nullptr); - int MoveMissionToFront(int32_t missionId, bool isCallerFromLauncher); + int MoveMissionToFront(int32_t missionId, bool isCallerFromLauncher, + std::shared_ptr startOptions = nullptr); /** * OnAbilityRequestDone, app manager service call this interface after ability request done. @@ -294,7 +296,6 @@ public: * @param element, target ability name. */ int ReleaseLocked(const sptr &connect, const AppExecFwk::ElementName &element); - /** * @brief register snapshotHandler * @param handler the snapshotHandler diff --git a/services/abilitymgr/src/ability_manager_client.cpp b/services/abilitymgr/src/ability_manager_client.cpp index ec19bb5290a81717b830a017248cf65c3f139963..bd52b1c76369d1f1e02a77973411b630f5c63081 100644 --- a/services/abilitymgr/src/ability_manager_client.cpp +++ b/services/abilitymgr/src/ability_manager_client.cpp @@ -772,6 +772,14 @@ ErrCode AbilityManagerClient::MoveMissionToFront(int32_t missionId) return abms->MoveMissionToFront(missionId); } +ErrCode AbilityManagerClient::MoveMissionToFront(int32_t missionId, const StartOptions &startOptions) +{ + CHECK_REMOTE_OBJECT_AND_RETURN(remoteObject_, ABILITY_SERVICE_NOT_CONNECTED); + + sptr abms = iface_cast(remoteObject_); + return abms->MoveMissionToFront(missionId, startOptions); +} + ErrCode AbilityManagerClient::StartAbilityByCall( const Want &want, const sptr &connect, const sptr &callToken) { diff --git a/services/abilitymgr/src/ability_manager_proxy.cpp b/services/abilitymgr/src/ability_manager_proxy.cpp index 86db7a562d30993b0ea3aef66f6128bfe7644063..854a4a4ef9a952133559b488e38244b761954403 100644 --- a/services/abilitymgr/src/ability_manager_proxy.cpp +++ b/services/abilitymgr/src/ability_manager_proxy.cpp @@ -1996,6 +1996,32 @@ int AbilityManagerProxy::MoveMissionToFront(int32_t missionId) return reply.ReadInt32(); } +int AbilityManagerProxy::MoveMissionToFront(int32_t missionId, const StartOptions &startOptions) +{ + int error; + MessageParcel data; + MessageParcel reply; + MessageOption option; + + if (!WriteInterfaceToken(data)) { + return INNER_ERR; + } + if (!data.WriteInt32(missionId)) { + HILOG_ERROR("move mission to front , WriteInt32 fail."); + return ERR_INVALID_VALUE; + } + if (!data.WriteParcelable(&startOptions)) { + HILOG_ERROR("startOptions write failed."); + return INNER_ERR; + } + error = Remote()->SendRequest(IAbilityManager::MOVE_MISSION_TO_FRONT_BY_OPTIONS, data, reply, option); + if (error != NO_ERROR) { + HILOG_ERROR("move mission to front, SendRequest error: %d", error); + return error; + } + return reply.ReadInt32(); +} + int AbilityManagerProxy::StartUser(int userId) { int error; diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index c9e0f6a7755bdaf2b06b3369521a0dbd1f010190..26f3ce6ec56a523d0f3da5c4e863bd286df69cbb 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -1445,6 +1445,21 @@ int AbilityManagerService::MoveMissionToFront(int32_t missionId) return currentMissionListManager_->MoveMissionToFront(missionId); } +int AbilityManagerService::MoveMissionToFront(int32_t missionId, const StartOptions &startOptions) +{ + HILOG_INFO("request MoveMissionToFront, missionId:%{public}d", missionId); + CHECK_POINTER_AND_RETURN(currentMissionListManager_, ERR_NO_INIT); + CHECK_POINTER_AND_RETURN(iBundleManager_, ERR_NO_INIT); + + if (!CheckCallerIsSystemAppByIpc()) { + HILOG_ERROR("caller is not system app"); + return CALLER_ISNOT_SYSTEMAPP; + } + + auto options = std::make_shared(startOptions); + return currentMissionListManager_->MoveMissionToFront(missionId, options); +} + std::shared_ptr AbilityManagerService::GetServiceRecordByElementName(const std::string &element) { return connectManager_->GetServiceRecordByElementName(element); diff --git a/services/abilitymgr/src/ability_manager_stub.cpp b/services/abilitymgr/src/ability_manager_stub.cpp index d9088839c36d2b4c77dced73dbe1bf51d5cf4559..6d679b09bd3028d11fc41353602eb6c28359f4b5 100644 --- a/services/abilitymgr/src/ability_manager_stub.cpp +++ b/services/abilitymgr/src/ability_manager_stub.cpp @@ -125,6 +125,7 @@ void AbilityManagerStub::SecondStepInit() requestFuncMap_[CLEAN_MISSION] = &AbilityManagerStub::CleanMissionInner; requestFuncMap_[CLEAN_ALL_MISSIONS] = &AbilityManagerStub::CleanAllMissionsInner; requestFuncMap_[MOVE_MISSION_TO_FRONT] = &AbilityManagerStub::MoveMissionToFrontInner; + requestFuncMap_[MOVE_MISSION_TO_FRONT_BY_OPTIONS] = &AbilityManagerStub::MoveMissionToFrontByOptionsInner; requestFuncMap_[START_CALL_ABILITY] = &AbilityManagerStub::StartAbilityByCallInner; requestFuncMap_[RELEASE_CALL_ABILITY] = &AbilityManagerStub::ReleaseInner; requestFuncMap_[SET_MISSION_LABEL] = &AbilityManagerStub::SetMissionLabelInner; @@ -1148,9 +1149,25 @@ int AbilityManagerStub::MoveMissionToFrontInner(MessageParcel &data, MessageParc return NO_ERROR; } +int AbilityManagerStub::MoveMissionToFrontByOptionsInner(MessageParcel &data, MessageParcel &reply) +{ + int32_t missionId = data.ReadInt32(); + StartOptions *startOptions = data.ReadParcelable(); + if (startOptions == nullptr) { + HILOG_ERROR("startOptions is nullptr"); + return ERR_INVALID_VALUE; + } + int result = MoveMissionToFront(missionId, *startOptions); + if (!reply.WriteInt32(result)) { + HILOG_ERROR("MoveMissionToFront failed."); + return ERR_INVALID_VALUE; + } + return NO_ERROR; +} + int AbilityManagerStub::StartAbilityByCallInner(MessageParcel &data, MessageParcel &reply) { - + HILOG_DEBUG("AbilityManagerStub::StartAbilityByCallInner begin."); Want *want = data.ReadParcelable(); if (want == nullptr) { @@ -1166,7 +1183,7 @@ int AbilityManagerStub::StartAbilityByCallInner(MessageParcel &data, MessageParc reply.WriteInt32(result); delete want; - + HILOG_DEBUG("AbilityManagerStub::StartAbilityByCallInner end."); return NO_ERROR; diff --git a/services/abilitymgr/src/mission_list_manager.cpp b/services/abilitymgr/src/mission_list_manager.cpp index 4447b96782cc87ac06cda0d3d3ca2a07609e7339..ffefdf596bfabe00d534de1988e792f3f97741f9 100644 --- a/services/abilitymgr/src/mission_list_manager.cpp +++ b/services/abilitymgr/src/mission_list_manager.cpp @@ -145,13 +145,14 @@ int MissionListManager::GetMissionInfo(int32_t missionId, MissionInfo &missionIn return DelayedSingleton::GetInstance()->GetMissionInfoById(missionId, missionInfo); } -int MissionListManager::MoveMissionToFront(int32_t missionId) +int MissionListManager::MoveMissionToFront(int32_t missionId, std::shared_ptr startOptions) { std::lock_guard guard(managerLock_); - return MoveMissionToFront(missionId, true); + return MoveMissionToFront(missionId, true, startOptions); } -int MissionListManager::MoveMissionToFront(int32_t missionId, bool isCallerFromLauncher) +int MissionListManager::MoveMissionToFront(int32_t missionId, bool isCallerFromLauncher, + std::shared_ptr startOptions) { HILOG_INFO("move mission to front:%{public}d.", missionId); std::lock_guard guard(managerLock_); @@ -177,7 +178,12 @@ int MissionListManager::MoveMissionToFront(int32_t missionId, bool isCallerFromL HILOG_ERROR("get target ability record failed, missionId: %{public}d", missionId); return MOVE_MISSION_FAILED; } - + if (startOptions != nullptr) { + Want want(targetAbilityRecord->GetWant()); + want.SetParam(Want::PARAM_RESV_WINDOW_MODE, startOptions->GetWindowMode()); + targetAbilityRecord->SetWant(want); + targetAbilityRecord->SetIsNewWant(true); + } // schedule target ability to foreground. targetAbilityRecord->ProcessForegroundAbility(); HILOG_DEBUG("SetMovingState, missionId: %{public}d", missionId); diff --git a/services/abilitymgr/src/start_options.cpp b/services/abilitymgr/src/start_options.cpp index 20eb4bfd33af410f4bf68d5d27c14aa979080452..0ec49ac7681aa67f58e87bba2cefa593cdfc4671 100644 --- a/services/abilitymgr/src/start_options.cpp +++ b/services/abilitymgr/src/start_options.cpp @@ -20,6 +20,21 @@ namespace AAFwk { const std::string StartOptions::STRING_DISPLAY_ID = "ohos.aafwk.displayId"; +StartOptions::StartOptions(const StartOptions &other) +{ + windowMode_ = other.windowMode_; + displayId_ = other.displayId_; +} + +StartOptions &StartOptions::operator=(const StartOptions &other) +{ + if (this != &other) { + windowMode_ = other.windowMode_; + displayId_ = other.displayId_; + } + return *this; +} + bool StartOptions::ReadFromParcel(Parcel &parcel) { SetWindowMode(parcel.ReadInt32()); diff --git a/services/abilitymgr/test/unittest/phone/ability_manager_proxy_test/ability_manager_stub_mock.h b/services/abilitymgr/test/unittest/phone/ability_manager_proxy_test/ability_manager_stub_mock.h index bf6c9c53302e39e565fa0e7079fd49594664db66..3ddb3e8e63197197ed1425b18a2bb18898862faf 100644 --- a/services/abilitymgr/test/unittest/phone/ability_manager_proxy_test/ability_manager_stub_mock.h +++ b/services/abilitymgr/test/unittest/phone/ability_manager_proxy_test/ability_manager_stub_mock.h @@ -409,6 +409,7 @@ public: MOCK_METHOD1(CleanMission, int(int32_t missionId)); MOCK_METHOD0(CleanAllMissions, int()); MOCK_METHOD1(MoveMissionToFront, int(int32_t missionId)); + MOCK_METHOD2(MoveMissionToFront, int(int32_t missionId, const StartOptions &startOptions)); MOCK_METHOD2(SetMissionLabel, int(const sptr &token, const std::string &label)); MOCK_METHOD2(GetWantSenderInfo, int(const sptr &target, std::shared_ptr &info)); MOCK_METHOD1(GetAbilityRunningInfos, int(std::vector &info)); diff --git a/services/abilitymgr/test/unittest/phone/ability_manager_stub_test/ability_manager_stub_impl_mock.h b/services/abilitymgr/test/unittest/phone/ability_manager_stub_test/ability_manager_stub_impl_mock.h index 344172f54992adb057a04bf43afd08fe0e37b215..f0d41aed44f38612ec24b66920736bf109faabda 100644 --- a/services/abilitymgr/test/unittest/phone/ability_manager_stub_test/ability_manager_stub_impl_mock.h +++ b/services/abilitymgr/test/unittest/phone/ability_manager_stub_test/ability_manager_stub_impl_mock.h @@ -357,6 +357,10 @@ public: { return 0; } + virtual int MoveMissionToFront(int32_t missionId, const StartOptions &startOptions) override + { + return 0; + } virtual int GetMissionInfos(const std::string& deviceId, int32_t numMax, std::vector &missionInfos) override { diff --git a/services/formmgr/test/mock/include/mock_ability_manager.h b/services/formmgr/test/mock/include/mock_ability_manager.h index 1471e06786061003bfaac3306805a6f80642e335..f4221725fe2b486084576f66b162407074dd84ad 100644 --- a/services/formmgr/test/mock/include/mock_ability_manager.h +++ b/services/formmgr/test/mock/include/mock_ability_manager.h @@ -329,7 +329,10 @@ public: { return 0; } - + virtual int MoveMissionToFront(int32_t missionId, const StartOptions &startOptions) override + { + return 0; + } virtual int SetMissionLabel(const sptr &token, const std::string &lable) override { @@ -798,6 +801,10 @@ public: { return 0; } + virtual int MoveMissionToFront(int32_t missionId, const StartOptions &startOptions) override + { + return 0; + } virtual int StartSyncRemoteMissions(const std::string& devId, bool fixConflict, int64_t tag) override { return 0; diff --git a/services/test/mock/include/appmgr/mock_ability_mgr_host.h b/services/test/mock/include/appmgr/mock_ability_mgr_host.h index 3707f0dd010db4a3ecf8779b84293192b1f3c6e5..00ec95b783b3764ffc7dec7247b95a2c4b237d53 100644 --- a/services/test/mock/include/appmgr/mock_ability_mgr_host.h +++ b/services/test/mock/include/appmgr/mock_ability_mgr_host.h @@ -375,6 +375,10 @@ public: { return 0; } + virtual int MoveMissionToFront(int32_t missionId, const StartOptions &startOptions) override + { + return 0; + } virtual int StartSyncRemoteMissions(const std::string& devId, bool fixConflict, int64_t tag) override { return 0; diff --git a/services/test/mock/include/mock_ability_mgr_service.h b/services/test/mock/include/mock_ability_mgr_service.h index 83fe2e1c4b33e5532f2c4b05e6fbde0fff269861..52f2be57e695393907a1bcb257a32534f015029a 100644 --- a/services/test/mock/include/mock_ability_mgr_service.h +++ b/services/test/mock/include/mock_ability_mgr_service.h @@ -112,6 +112,7 @@ public: MOCK_METHOD1(CleanMission, int(int32_t missionId)); MOCK_METHOD0(CleanAllMissions, int()); MOCK_METHOD1(MoveMissionToFront, int(int32_t missionId)); + MOCK_METHOD2(MoveMissionToFront, int(int32_t missionId, const StartOptions &startOptions)); MOCK_METHOD2(SetMissionLabel, int(const sptr &token, const std::string &label)); MOCK_METHOD1(ClearUpApplicationData, int(const std::string &)); diff --git a/tools/test/mock/mock_ability_manager_stub.h b/tools/test/mock/mock_ability_manager_stub.h index 15e4358bf46a0f67c01d226d8c625c77502db367..882e8017ec0fa2572767ba0ac6e34a2f48b9f8d4 100644 --- a/tools/test/mock/mock_ability_manager_stub.h +++ b/tools/test/mock/mock_ability_manager_stub.h @@ -135,6 +135,7 @@ public: MOCK_METHOD1(CleanMission, int(int32_t missionId)); MOCK_METHOD0(CleanAllMissions, int()); MOCK_METHOD1(MoveMissionToFront, int(int32_t missionId)); + MOCK_METHOD2(MoveMissionToFront, int(int32_t missionId, const StartOptions &startOptions)); MOCK_METHOD2(SetMissionLabel, int(const sptr &token, const std::string &label)); MOCK_METHOD1(ClearUpApplicationData, int(const std::string &));