From 361e176d08605978af8a59a4304499758750863d Mon Sep 17 00:00:00 2001 From: altay Date: Thu, 21 Apr 2022 19:04:42 +0800 Subject: [PATCH] Description:animation Sig:SIG_ApplicationFramework Feature or Bugfix:Bugfix Binary Source:No Signed-off-by: altay Change-Id: I9b108b4dcab08c2de999edecab0174cfbecb41e4 --- .../include/ability_manager_client.h | 14 +- .../include/ability_manager_interface.h | 32 +-- .../ability_manager/include/snapshot.h | 17 -- .../ability_manager/include/window_handler.h | 46 ++++ .../ability_manager/include/window_info.h | 197 ++++++++++++++++++ .../include/ability_manager_proxy.h | 4 +- .../include/ability_manager_service.h | 9 +- .../abilitymgr/include/ability_manager_stub.h | 4 +- .../abilitymgr/src/ability_manager_client.cpp | 14 +- .../abilitymgr/src/ability_manager_proxy.cpp | 40 ++-- .../src/ability_manager_service.cpp | 29 +-- .../abilitymgr/src/ability_manager_stub.cpp | 12 +- .../abilitymgr/src/mission_list_manager.cpp | 62 ++++++ 13 files changed, 392 insertions(+), 88 deletions(-) create mode 100644 interfaces/innerkits/ability_manager/include/window_handler.h create mode 100644 interfaces/innerkits/ability_manager/include/window_info.h diff --git a/interfaces/innerkits/ability_manager/include/ability_manager_client.h b/interfaces/innerkits/ability_manager/include/ability_manager_client.h index 691dcf1b29..e3c8ebba7a 100644 --- a/interfaces/innerkits/ability_manager/include/ability_manager_client.h +++ b/interfaces/innerkits/ability_manager/include/ability_manager_client.h @@ -538,13 +538,6 @@ public: */ ErrCode RegisterSnapshotHandler(const sptr& handler); - /** - * @brief Register the window handler - * @param handler window handler - * @return ErrCode Returns ERR_OK on success, others on failure. - */ - ErrCode RegisterWindowHandler(const sptr& handler); - /** * Set mission label of this ability. * @@ -564,6 +557,13 @@ public: */ ErrCode SetMissionIcon(const sptr &abilityToken, const std::shared_ptr &icon); + + /** + * @brief Register the window handler + * @param handler window handler + * @return ErrCode Returns ERR_OK on success, others on failure. + */ + ErrCode RegisterWindowManagerServiceHandler(const sptr& handler); #endif /** diff --git a/interfaces/innerkits/ability_manager/include/ability_manager_interface.h b/interfaces/innerkits/ability_manager/include/ability_manager_interface.h index a659b41142..13f2e7b9a8 100644 --- a/interfaces/innerkits/ability_manager/include/ability_manager_interface.h +++ b/interfaces/innerkits/ability_manager/include/ability_manager_interface.h @@ -22,28 +22,28 @@ #include #include "ability_connect_callback_interface.h" +#include "ability_running_info.h" #include "ability_scheduler_interface.h" #include "ability_start_setting.h" -#include "foundation/aafwk/standard/interfaces/innerkits/app_manager/include/appmgr/configuration.h" -#include "mission_snapshot.h" -#include "ability_running_info.h" #include "extension_running_info.h" -#include "uri.h" -#include "want.h" -#include "want_sender_info.h" -#include "sender_info.h" -#include "want_sender_interface.h" -#include "want_receiver_interface.h" -#include "system_memory_attr.h" -#include "system_memory_attr.h" +#include "foundation/aafwk/standard/interfaces/innerkits/app_manager/include/appmgr/configuration.h" +#include "iability_controller.h" #include "mission_listener_interface.h" #include "mission_info.h" +#include "mission_snapshot.h" +#include "remote_mission_listener_interface.h" +#include "running_process_info.h" +#include "sender_info.h" #include "snapshot.h" #include "start_options.h" #include "stop_user_callback.h" -#include "running_process_info.h" -#include "remote_mission_listener_interface.h" -#include "iability_controller.h" +#include "system_memory_attr.h" +#include "want.h" +#include "want_receiver_interface.h" +#include "want_sender_info.h" +#include "want_sender_interface.h" +#include "uri.h" +#include "window_handler.h" namespace OHOS { namespace AAFwk { @@ -433,6 +433,8 @@ public: #ifdef SUPPORT_GRAPHICS virtual int SetMissionIcon(const sptr &token, const std::shared_ptr &icon) = 0; + + virtual int RegisterWindowManagerServiceHandler(const sptr& handler) = 0; #endif virtual int GetAbilityRunningInfos(std::vector &info) = 0; @@ -547,8 +549,6 @@ public: */ virtual int32_t GetMissionIdByToken(const sptr &token) = 0; - virtual int RegisterWindowHandler(const sptr& handler) = 0; - #ifdef ABILITY_COMMAND_FOR_TEST /** * Block ability manager service. diff --git a/interfaces/innerkits/ability_manager/include/snapshot.h b/interfaces/innerkits/ability_manager/include/snapshot.h index 7096d58db4..0110a8a5fc 100644 --- a/interfaces/innerkits/ability_manager/include/snapshot.h +++ b/interfaces/innerkits/ability_manager/include/snapshot.h @@ -66,23 +66,6 @@ public: */ virtual int32_t GetSnapshot(const sptr& token, Snapshot& snapshot) = 0; }; - - -/** - * @class IWindowHandler - * Window handler, use to get window - */ -class IWindowHandler : public OHOS::IRemoteBroker { -public: - DECLARE_INTERFACE_DESCRIPTOR(u"ohos.aafwk.WindowHandler"); - - /** - * @brief Get the Window object - * @param abilityToken ability token - * @return int32_t function result - */ - virtual int32_t GetFocusAbility(sptr& abilityToken); -}; } // namespace AAFwk } // namespace OHOS #endif // OHOS_AAFWK_SNAPSHOT_H \ No newline at end of file diff --git a/interfaces/innerkits/ability_manager/include/window_handler.h b/interfaces/innerkits/ability_manager/include/window_handler.h new file mode 100644 index 0000000000..81c76cd480 --- /dev/null +++ b/interfaces/innerkits/ability_manager/include/window_handler.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifdef SUPPORT_GRAPHICS +#ifndef OHOS_AAFWK_WINDOW_HANDLER_H +#define OHOS_AAFWK_WINDOW_HANDLER_H + +#include + +#include "window_info.h" + +namespace OHOS { +namespace AAFwk { +/** + * @class IWindowManagerServiceHandler + * Window Manager Service Handler, use to get window + */ +class IWindowManagerServiceHandler : public OHOS::IRemoteBroker { +public: + DECLARE_INTERFACE_DESCRIPTOR(u"ohos.aafwk.WindowManagerServiceHandler"); + + /** + * @brief Get the Window object + * @param abilityToken ability token + * @return int32_t function result + */ + virtual int32_t GetFocusAbility(sptr& abilityToken); + + virtual void NotifyWindowTransition(WindowTransitionInfo fromInfo, WindowTransitionInfo toInfo); +}; +} // namespace AAFwk +} // namespace OHOS +#endif // OHOS_AAFWK_WINDOW_HANDLER_H +#endif \ No newline at end of file diff --git a/interfaces/innerkits/ability_manager/include/window_info.h b/interfaces/innerkits/ability_manager/include/window_info.h new file mode 100644 index 0000000000..d8753a07d8 --- /dev/null +++ b/interfaces/innerkits/ability_manager/include/window_info.h @@ -0,0 +1,197 @@ +/* + * 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_AAFWK_WINDOW_INFO_H +#define OHOS_AAFWK_WINDOW_INFO_H + +// #include "foundation/aafwk/standard/services/common/include/hilog_wrapper.h" +#include "iremote_object.h" +#include "message_parcel.h" + +namespace OHOS { +namespace AAFwk { +using DisplayId = uint64_t; + +enum class WindowMode : uint32_t { + WINDOW_MODE_UNDEFINED = 0, + WINDOW_MODE_FULLSCREEN = 1, + WINDOW_MODE_SPLIT_PRIMARY = 100, + WINDOW_MODE_SPLIT_SECONDARY, + WINDOW_MODE_FLOATING, + WINDOW_MODE_PIP +}; + +struct Rect { + int32_t posX_; + int32_t posY_; + uint32_t width_; + uint32_t height_; + + bool operator==(const Rect& a) const + { + return (posX_ == a.posX_ && posY_ == a.posY_ && width_ == a.width_ && height_ == a.height_); + } + + bool IsInsideOf(const Rect& a) const + { + return (posX_ >= a.posX_ && posY_ >= a.posY_ && + posX_ + width_ <= a.posX_ + a.width_ && posY_ + height_ <= a.posY_ + a.height_); + } +}; + +enum class WindowType : uint32_t { + APP_WINDOW_BASE = 1, + APP_MAIN_WINDOW_BASE = APP_WINDOW_BASE, + WINDOW_TYPE_APP_MAIN_WINDOW = APP_MAIN_WINDOW_BASE, + APP_MAIN_WINDOW_END, + + APP_SUB_WINDOW_BASE = 1000, + WINDOW_TYPE_MEDIA = APP_SUB_WINDOW_BASE, + WINDOW_TYPE_APP_SUB_WINDOW, + APP_SUB_WINDOW_END, + APP_WINDOW_END = APP_SUB_WINDOW_END, + + SYSTEM_WINDOW_BASE = 2000, + BELOW_APP_SYSTEM_WINDOW_BASE = SYSTEM_WINDOW_BASE, + WINDOW_TYPE_WALLPAPER = SYSTEM_WINDOW_BASE, + WINDOW_TYPE_DESKTOP, + BELOW_APP_SYSTEM_WINDOW_END, + + ABOVE_APP_SYSTEM_WINDOW_BASE = 2100, + WINDOW_TYPE_APP_LAUNCHING = ABOVE_APP_SYSTEM_WINDOW_BASE, + WINDOW_TYPE_DOCK_SLICE, + WINDOW_TYPE_INCOMING_CALL, + WINDOW_TYPE_SEARCHING_BAR, + WINDOW_TYPE_SYSTEM_ALARM_WINDOW, + WINDOW_TYPE_INPUT_METHOD_FLOAT, + WINDOW_TYPE_FLOAT, + WINDOW_TYPE_TOAST, + WINDOW_TYPE_STATUS_BAR, + WINDOW_TYPE_PANEL, + WINDOW_TYPE_KEYGUARD, + WINDOW_TYPE_VOLUME_OVERLAY, + WINDOW_TYPE_NAVIGATION_BAR, + WINDOW_TYPE_DRAGGING_EFFECT, + WINDOW_TYPE_POINTER, + WINDOW_TYPE_LAUNCHER_RECENT, + WINDOW_TYPE_LAUNCHER_DOCK, + WINDOW_TYPE_BOOT_ANIMATION, + WINDOW_TYPE_FREEZE_DISPLAY, + ABOVE_APP_SYSTEM_WINDOW_END, + + SYSTEM_WINDOW_END = ABOVE_APP_SYSTEM_WINDOW_END, +}; + +enum class WindowFlag : uint32_t { + WINDOW_FLAG_DEFAULT, + WINDOW_FLAG_NEED_AVOID = 1, + WINDOW_FLAG_PARENT_LIMIT = 1 << 1, + WINDOW_FLAG_SHOW_WHEN_LOCKED = 1 << 2, + WINDOW_FLAG_END = 1 << 3, +}; + +struct WindowTransitionInfo : public Parcelable { + std::string bundleName_; + std::string abilityName_; + WindowMode mode_ = WindowMode::WINDOW_MODE_FULLSCREEN; + Rect windowRect_ = { 0, 0, 0, 0 }; + sptr abilityToken_ = nullptr; + DisplayId displayId_ = 0; + WindowType windowType_ = WindowType::WINDOW_TYPE_APP_MAIN_WINDOW; + WindowFlag windowFlag_ = WindowFlag::WINDOW_FLAG_DEFAULT; + + virtual bool Marshalling(Parcel& parcel) const override + { + if (!parcel.WriteString(bundleName_)) { + // HILOG_ERROR("Failed to write bundleName"); + return false; + } + + if (!parcel.WriteString(abilityName_)) { + // HILOG_ERROR("Failed to write abilityName"); + return false; + } + + if (!parcel.WriteUint32(static_cast(mode_))) { + // HILOG_ERROR("Failed to write window mode."); + return false; + } + + if (!parcel.WriteInt32(windowRect_.posX_)) { + // HILOG_ERROR("Failed to write rect posX."); + return false; + } + + if (!parcel.WriteInt32(windowRect_.posY_)) { + // HILOG_ERROR("Failed to write rect posY."); + return false; + } + + if (!parcel.WriteUint32(windowRect_.width_)) { + // HILOG_ERROR("Failed to write rect width."); + return false; + } + + if (!parcel.WriteUint32(windowRect_.height_)) { + // HILOG_ERROR("Failed to write rect height."); + return false; + } + + if (!parcel.WriteRemoteObject(abilityToken_)) { + // HILOG_ERROR("Failed to write ability token."); + return false; + } + + if (!parcel.WriteUint64(displayId_)) { + // HILOG_ERROR("Failed to write displayId."); + return false; + } + + if (!parcel.WriteUint32(static_cast(windowType_))) { + // HILOG_ERROR("Failed to write windowType."); + return false; + } + + if (!parcel.WriteUint32(static_cast(windowFlag_))) { + // HILOG_ERROR("Failed to write windowFlag."); + return false; + } + + return true; + } + + static sptr Unmarshalling(MessageParcel& parcel) + { + sptr info; + info->bundleName_ = parcel.ReadString(); + info->abilityName_ = parcel.ReadString(); + info->mode_ = static_cast(parcel.ReadUint32()); + + int32_t posX = parcel.ReadInt32(); + int32_t posY = parcel.ReadInt32(); + uint32_t width = parcel.ReadUint32(); + uint32_t height = parcel.ReadUint32(); + info->windowRect_ = { posX, posY, width, height }; + + info->abilityToken_ = parcel.ReadRemoteObject(); + info->displayId_ = parcel.ReadUint64(); + info->windowType_ = static_cast(parcel.ReadUint32()); + info->windowFlag_ = static_cast(parcel.ReadUint32()); + return info; + } +}; +} // namespace AAFwk +} // namespace OHOS +#endif // OHOS_AAFWK_WINDOW_INFO_H \ No newline at end of file diff --git a/services/abilitymgr/include/ability_manager_proxy.h b/services/abilitymgr/include/ability_manager_proxy.h index 3df435209d..6f9db4e009 100644 --- a/services/abilitymgr/include/ability_manager_proxy.h +++ b/services/abilitymgr/include/ability_manager_proxy.h @@ -407,6 +407,8 @@ public: #ifdef SUPPORT_GRAPHICS virtual int SetMissionIcon(const sptr &token, const std::shared_ptr &icon) override; + + virtual int RegisterWindowManagerServiceHandler(const sptr& handler) override; #endif virtual int GetAbilityRunningInfos(std::vector &info) override; @@ -439,8 +441,6 @@ public: virtual int RegisterSnapshotHandler(const sptr& handler) override; - virtual int RegisterWindowHandler(const sptr& handler) override; - virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& snapshot) override; virtual int StartUserTest(const Want &want, const sptr &observer) override; diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index e4b9d20bc3..6d8fd96228 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -582,13 +582,16 @@ public: #ifdef SUPPORT_GRAPHICS virtual int SetMissionIcon(const sptr &token, const std::shared_ptr &icon) override; + + virtual int RegisterWindowManagerServiceHandler(const sptr& handler) override; + + sptr GetWindowHander(); #endif void ClearUserData(int32_t userId); virtual int RegisterSnapshotHandler(const sptr& handler) override; - virtual int RegisterWindowHandler(const sptr& handler) override; virtual int32_t GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& snapshot) override; @@ -1031,7 +1034,9 @@ private: std::unordered_map> missionListManagers_; std::shared_ptr currentMissionListManager_; - sptr windowHandler_; +#ifdef SUPPORT_GRAPHICS + sptr wmsHandler_; +#endif std::shared_ptr userController_; sptr abilityController_ = nullptr; bool controllerIsAStabilityTest_ = false; diff --git a/services/abilitymgr/include/ability_manager_stub.h b/services/abilitymgr/include/ability_manager_stub.h index 830412feca..c23fd53301 100644 --- a/services/abilitymgr/include/ability_manager_stub.h +++ b/services/abilitymgr/include/ability_manager_stub.h @@ -152,7 +152,9 @@ private: int IsRunningInStabilityTestInner(MessageParcel &data, MessageParcel &reply); int MoveMissionToFrontByOptionsInner(MessageParcel &data, MessageParcel &reply); - int RegisterWindowHandlerInner(MessageParcel &data, MessageParcel &reply); +#ifdef SUPPORT_GRAPHICS + int RegisterWindowManagerServiceHandlerInner(MessageParcel &data, MessageParcel &reply); +#endif #ifdef ABILITY_COMMAND_FOR_TEST int ForceTimeoutForTestInner(MessageParcel &data, MessageParcel &reply); diff --git a/services/abilitymgr/src/ability_manager_client.cpp b/services/abilitymgr/src/ability_manager_client.cpp index 0a6af7fbd1..c41c93b9e3 100644 --- a/services/abilitymgr/src/ability_manager_client.cpp +++ b/services/abilitymgr/src/ability_manager_client.cpp @@ -656,13 +656,6 @@ ErrCode AbilityManagerClient::RegisterSnapshotHandler(const sptrRegisterSnapshotHandler(handler); } -ErrCode AbilityManagerClient::RegisterWindowHandler(const sptr& handler) -{ - auto abms = GetAbilityManager(); - CHECK_POINTER_RETURN_NOT_CONNECTED(abms); - return abms->RegisterWindowHandler(handler); -} - ErrCode AbilityManagerClient::GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& snapshot) { @@ -722,6 +715,13 @@ ErrCode AbilityManagerClient::SetMissionIcon( CHECK_POINTER_RETURN_NOT_CONNECTED(abms); return abms->SetMissionIcon(abilityToken, icon); } + +ErrCode AbilityManagerClient::RegisterWindowManagerServiceHandler(const sptr& handler) +{ + auto abms = GetAbilityManager(); + CHECK_POINTER_RETURN_NOT_CONNECTED(abms); + return abms->RegisterWindowManagerServiceHandler(handler); +} #endif ErrCode AbilityManagerClient::DoAbilityForeground(const sptr &token, uint32_t flag) diff --git a/services/abilitymgr/src/ability_manager_proxy.cpp b/services/abilitymgr/src/ability_manager_proxy.cpp index dd69d042b5..21e691ff83 100644 --- a/services/abilitymgr/src/ability_manager_proxy.cpp +++ b/services/abilitymgr/src/ability_manager_proxy.cpp @@ -1753,6 +1753,26 @@ int AbilityManagerProxy::SetMissionIcon(const sptr &token, } return reply.ReadInt32(); } + +int AbilityManagerProxy::RegisterWindowManagerServiceHandler(const sptr& handler) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!WriteInterfaceToken(data)) { + return INNER_ERR; + } + if (!data.WriteRemoteObject(handler->AsObject())) { + HILOG_ERROR("window: handler write failed."); + return INNER_ERR; + } + auto error = Remote()->SendRequest(IAbilityManager::REGISTER_WINDOW_HANDLER, data, reply, option); + if (error != NO_ERROR) { + HILOG_ERROR("window: send request error: %{public}d", error); + return error; + } + return reply.ReadInt32(); +} #endif int AbilityManagerProxy::GetAbilityRunningInfos(std::vector &info) @@ -2008,26 +2028,6 @@ int AbilityManagerProxy::RegisterSnapshotHandler(const sptr& h return reply.ReadInt32(); } -int AbilityManagerProxy::RegisterWindowHandler(const sptr& handler) -{ - MessageParcel data; - MessageParcel reply; - MessageOption option; - if (!WriteInterfaceToken(data)) { - return INNER_ERR; - } - if (!data.WriteRemoteObject(handler->AsObject())) { - HILOG_ERROR("window: handler write failed."); - return INNER_ERR; - } - auto error = Remote()->SendRequest(IAbilityManager::REGISTER_WINDOW_HANDLER, data, reply, option); - if (error != NO_ERROR) { - HILOG_ERROR("window: send request error: %{public}d", error); - return error; - } - return reply.ReadInt32(); -} - int AbilityManagerProxy::SetAbilityController(const sptr &abilityController, bool imAStabilityTest) { diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 267b0fb063..49b2489712 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -3285,6 +3285,23 @@ int AbilityManagerService::SetMissionIcon(const sptr &token, return missionListManager->SetMissionIcon(token, icon); } + +int AbilityManagerService::RegisterWindowManagerServiceHandler(const sptr &handler) +{ + auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall(); + if (!isSaCall) { + HILOG_ERROR("%{public}s: Permission verification failed", __func__); + return 0; + } + wmsHandler_ = handler; + HILOG_INFO("window: AbilityManagerService register windows handler success."); + return ERR_OK; +} + +sptr AbilityManagerService::GetWindowHander() +{ + return wmsHandler_; +} #endif int AbilityManagerService::StartUser(int userId) @@ -3400,18 +3417,6 @@ int AbilityManagerService::RegisterSnapshotHandler(const sptr& return ERR_OK; } -int AbilityManagerService::RegisterWindowHandler(const sptr &handler) -{ - auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall(); - if (!isSaCall) { - HILOG_ERROR("%{public}s: Permission verification failed", __func__); - return 0; - } - windowHandler_ = handler; - HILOG_INFO("window: AbilityManagerService register windows handler success."); - return ERR_OK; -} - int32_t AbilityManagerService::GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& missionSnapshot) { diff --git a/services/abilitymgr/src/ability_manager_stub.cpp b/services/abilitymgr/src/ability_manager_stub.cpp index aeeee3d86b..8a50993f85 100644 --- a/services/abilitymgr/src/ability_manager_stub.cpp +++ b/services/abilitymgr/src/ability_manager_stub.cpp @@ -138,7 +138,9 @@ void AbilityManagerStub::ThirdStepInit() requestFuncMap_[GET_MISSION_ID_BY_ABILITY_TOKEN] = &AbilityManagerStub::GetMissionIdByTokenInner; requestFuncMap_[GET_TOP_ABILITY] = &AbilityManagerStub::GetTopAbilityInner; requestFuncMap_[SET_MISSION_ICON] = &AbilityManagerStub::SetMissionIconInner; - requestFuncMap_[REGISTER_WINDOW_HANDLER] = &AbilityManagerStub::RegisterWindowHandlerInner; +#ifdef SUPPORT_GRAPHICS + requestFuncMap_[REGISTER_WINDOW_HANDLER] = &AbilityManagerStub::RegisterWindowManagerServiceHandlerInner; +#endif } int AbilityManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) @@ -1181,17 +1183,19 @@ int AbilityManagerStub::RegisterSnapshotHandlerInner(MessageParcel &data, Messag return result; } -int AbilityManagerStub::RegisterWindowHandlerInner(MessageParcel &data, MessageParcel &reply) +#ifdef SUPPORT_GRAPHICS +int AbilityManagerStub::RegisterWindowManagerServiceHandlerInner(MessageParcel &data, MessageParcel &reply) { - sptr handler = iface_cast(data.ReadRemoteObject()); + sptr handler = iface_cast(data.ReadRemoteObject()); if (handler == nullptr) { HILOG_ERROR("window: AbilityManagerStub read window handler failed!"); return ERR_NULL_OBJECT; } - int32_t result = RegisterWindowHandler(handler); + int32_t result = RegisterWindowManagerServiceHandler(handler); HILOG_INFO("window: AbilityManagerStub register window handler result = %{public}d", result); return result; } +#endif int AbilityManagerStub::GetMissionSnapshotInfoInner(MessageParcel &data, MessageParcel &reply) { diff --git a/services/abilitymgr/src/mission_list_manager.cpp b/services/abilitymgr/src/mission_list_manager.cpp index b5cb410744..849c0fd0c1 100644 --- a/services/abilitymgr/src/mission_list_manager.cpp +++ b/services/abilitymgr/src/mission_list_manager.cpp @@ -23,6 +23,7 @@ #include "hilog_wrapper.h" #include "mission_info_mgr.h" #include "hisysevent.h" +#include "window_info.h" namespace OHOS { namespace AAFwk { @@ -183,6 +184,27 @@ int MissionListManager::MoveMissionToFront(int32_t missionId, bool isCallerFromL if (startOptions != nullptr) { targetAbilityRecord->SetWindowMode(startOptions->GetWindowMode()); } + +#ifdef SUPPORT_GRAPHICS + auto abilityMgr = DelayedSingleton::GetInstance(); + if (abilityMgr) { + auto windowHandler = abilityMgr->GetWindowHander(); + if (windowHandler) { + WindowTransitionInfo toInfo; + auto abilityInfo = targetAbilityRecord->GetAbilityInfo(); + toInfo.abilityName_ = abilityInfo.name; + toInfo.bundleName_ = abilityInfo.bundleName; + if (startOptions != nullptr) { + toInfo.mode_ = WindowMode(startOptions->GetWindowMode()); + toInfo.displayId_ = DisplayId(startOptions->GetDisplayID()); + } + toInfo.abilityToken_ = targetAbilityRecord->GetToken(); + WindowTransitionInfo fromInfo; + windowHandler->NotifyWindowTransition(fromInfo, toInfo); + } + } +#endif + // schedule target ability to foreground. targetAbilityRecord->ProcessForegroundAbility(); HILOG_DEBUG("SetMovingState, missionId: %{public}d", missionId); @@ -245,6 +267,46 @@ int MissionListManager::StartAbilityLocked(const std::shared_ptr HILOG_ERROR("Failed to get mission or record."); return ERR_INVALID_VALUE; } + +#ifdef SUPPORT_GRAPHICS + auto abilityMgr = DelayedSingleton::GetInstance(); + if (abilityMgr) { + auto windowHandler = abilityMgr->GetWindowHander(); + if (windowHandler) { + WindowTransitionInfo fromInfo; + if (callerAbility) { + auto abilityInfo = callerAbility->GetAbilityInfo(); + fromInfo.abilityName_ = abilityInfo.name; + fromInfo.bundleName_ = abilityInfo.bundleName; + fromInfo.abilityToken_ = callerAbility->GetToken(); + } + WindowTransitionInfo toInfo; + auto abilityInfo = abilityRequest.abilityInfo; + toInfo.abilityName_ = abilityInfo.name; + toInfo.bundleName_ = abilityInfo.bundleName; + auto abilityStartSetting = abilityRequest.startSetting; + if (abilityStartSetting) { + int32_t mode = std::stoi(abilityStartSetting->GetProperty(AbilityStartSetting::WINDOW_MODE_KEY)); + toInfo.mode_ = WindowMode(mode); + int32_t displayId = + std::stoi(abilityStartSetting->GetProperty(AbilityStartSetting::WINDOW_DISPLAY_ID_KEY)); + toInfo.displayId_ = DisplayId(displayId); + } else { + int32_t mode = abilityRequest.want.GetIntParam(Want::PARAM_RESV_WINDOW_MODE, -1); + int32_t displayId = abilityRequest.want.GetIntParam(Want::PARAM_RESV_DISPLAY_ID, -1); + if (mode != -1) { + toInfo.mode_ = WindowMode(mode); + } + if (displayId != -1) { + toInfo.displayId_ = DisplayId(displayId); + } + } + toInfo.abilityToken_ = targetAbilityRecord->GetToken(); + windowHandler->NotifyWindowTransition(fromInfo, toInfo); + } + } +#endif + if (abilityRequest.IsContinuation()) { targetAbilityRecord->SetLaunchReason(LaunchReason::LAUNCHREASON_CONTINUATION); } else {