1c29fa5a6Sopenharmony_ci/* 2c29fa5a6Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License. 5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at 6c29fa5a6Sopenharmony_ci * 7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c29fa5a6Sopenharmony_ci * 9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and 13c29fa5a6Sopenharmony_ci * limitations under the License. 14c29fa5a6Sopenharmony_ci */ 15c29fa5a6Sopenharmony_ci 16c29fa5a6Sopenharmony_ci#include "hot_area.h" 17c29fa5a6Sopenharmony_ci 18c29fa5a6Sopenharmony_ci#include "display_manager.h" 19c29fa5a6Sopenharmony_ci 20c29fa5a6Sopenharmony_ci#include "devicestatus_define.h" 21c29fa5a6Sopenharmony_ci 22c29fa5a6Sopenharmony_ci#undef LOG_TAG 23c29fa5a6Sopenharmony_ci#define LOG_TAG "HotArea" 24c29fa5a6Sopenharmony_ci 25c29fa5a6Sopenharmony_cinamespace OHOS { 26c29fa5a6Sopenharmony_cinamespace Msdp { 27c29fa5a6Sopenharmony_cinamespace DeviceStatus { 28c29fa5a6Sopenharmony_cinamespace Cooperate { 29c29fa5a6Sopenharmony_cinamespace { 30c29fa5a6Sopenharmony_ciconstexpr int32_t HOT_AREA_WIDTH { 100 }; 31c29fa5a6Sopenharmony_ciconstexpr int32_t HOT_AREA_MARGIN { 200 }; 32c29fa5a6Sopenharmony_ci}; // namespace 33c29fa5a6Sopenharmony_ci 34c29fa5a6Sopenharmony_civoid HotArea::AddListener(const RegisterHotareaListenerEvent &event) 35c29fa5a6Sopenharmony_ci{ 36c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 37c29fa5a6Sopenharmony_ci std::lock_guard guard(lock_); 38c29fa5a6Sopenharmony_ci HotAreaInfo info { 39c29fa5a6Sopenharmony_ci .pid = event.pid, 40c29fa5a6Sopenharmony_ci .msgId = MessageId::HOT_AREA_ADD_LISTENER, 41c29fa5a6Sopenharmony_ci }; 42c29fa5a6Sopenharmony_ci auto [iter, isOk] = callbacks_.emplace(info); 43c29fa5a6Sopenharmony_ci if (!isOk) { 44c29fa5a6Sopenharmony_ci callbacks_.erase(iter); 45c29fa5a6Sopenharmony_ci callbacks_.emplace(info); 46c29fa5a6Sopenharmony_ci } 47c29fa5a6Sopenharmony_ci} 48c29fa5a6Sopenharmony_ci 49c29fa5a6Sopenharmony_civoid HotArea::RemoveListener(const UnregisterHotareaListenerEvent &event) 50c29fa5a6Sopenharmony_ci{ 51c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 52c29fa5a6Sopenharmony_ci std::lock_guard guard(lock_); 53c29fa5a6Sopenharmony_ci callbacks_.erase(HotAreaInfo { .pid = event.pid }); 54c29fa5a6Sopenharmony_ci} 55c29fa5a6Sopenharmony_ci 56c29fa5a6Sopenharmony_civoid HotArea::EnableCooperate(const EnableCooperateEvent &event) 57c29fa5a6Sopenharmony_ci{ 58c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 59c29fa5a6Sopenharmony_ci std::lock_guard guard(lock_); 60c29fa5a6Sopenharmony_ci auto display = Rosen::DisplayManager::GetInstance().GetDefaultDisplay(); 61c29fa5a6Sopenharmony_ci CHKPV(display); 62c29fa5a6Sopenharmony_ci width_ = display->GetWidth(); 63c29fa5a6Sopenharmony_ci height_ = display->GetHeight(); 64c29fa5a6Sopenharmony_ci} 65c29fa5a6Sopenharmony_ci 66c29fa5a6Sopenharmony_ciint32_t HotArea::ProcessData(std::shared_ptr<MMI::PointerEvent> pointerEvent) 67c29fa5a6Sopenharmony_ci{ 68c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 69c29fa5a6Sopenharmony_ci std::lock_guard guard(lock_); 70c29fa5a6Sopenharmony_ci CHKPR(pointerEvent, RET_ERR); 71c29fa5a6Sopenharmony_ci MMI::PointerEvent::PointerItem pointerItem; 72c29fa5a6Sopenharmony_ci if (!pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem)) { 73c29fa5a6Sopenharmony_ci FI_HILOGE("Corrupted pointer event"); 74c29fa5a6Sopenharmony_ci return RET_ERR; 75c29fa5a6Sopenharmony_ci } 76c29fa5a6Sopenharmony_ci displayX_ = pointerItem.GetDisplayX(); 77c29fa5a6Sopenharmony_ci displayY_ = pointerItem.GetDisplayY(); 78c29fa5a6Sopenharmony_ci deltaX_ = pointerItem.GetRawDx(); 79c29fa5a6Sopenharmony_ci deltaY_ = pointerItem.GetRawDy(); 80c29fa5a6Sopenharmony_ci CheckInHotArea(); 81c29fa5a6Sopenharmony_ci CheckPointerToEdge(type_); 82c29fa5a6Sopenharmony_ci NotifyMessage(); 83c29fa5a6Sopenharmony_ci return RET_OK; 84c29fa5a6Sopenharmony_ci} 85c29fa5a6Sopenharmony_ci 86c29fa5a6Sopenharmony_civoid HotArea::CheckInHotArea() 87c29fa5a6Sopenharmony_ci{ 88c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 89c29fa5a6Sopenharmony_ci if (displayX_ <= HOT_AREA_WIDTH && displayY_ >= HOT_AREA_MARGIN && 90c29fa5a6Sopenharmony_ci displayY_ <= (height_ - HOT_AREA_MARGIN)) { 91c29fa5a6Sopenharmony_ci type_ = HotAreaType::AREA_LEFT; 92c29fa5a6Sopenharmony_ci } else if (displayX_ >= (width_ - HOT_AREA_WIDTH) && displayY_ >= HOT_AREA_MARGIN && 93c29fa5a6Sopenharmony_ci displayY_ <= (height_ - HOT_AREA_MARGIN)) { 94c29fa5a6Sopenharmony_ci type_ = HotAreaType::AREA_RIGHT; 95c29fa5a6Sopenharmony_ci } else if (displayY_ <= HOT_AREA_WIDTH && displayX_ >= HOT_AREA_MARGIN && 96c29fa5a6Sopenharmony_ci displayX_ <= (width_ - HOT_AREA_MARGIN)) { 97c29fa5a6Sopenharmony_ci type_ = HotAreaType::AREA_TOP; 98c29fa5a6Sopenharmony_ci } else if (displayY_ >= (height_ - HOT_AREA_WIDTH) && displayX_ >= HOT_AREA_MARGIN && 99c29fa5a6Sopenharmony_ci displayX_ <= (width_ - HOT_AREA_MARGIN)) { 100c29fa5a6Sopenharmony_ci type_ = HotAreaType::AREA_BOTTOM; 101c29fa5a6Sopenharmony_ci } else { 102c29fa5a6Sopenharmony_ci type_ = HotAreaType::AREA_NONE; 103c29fa5a6Sopenharmony_ci } 104c29fa5a6Sopenharmony_ci} 105c29fa5a6Sopenharmony_ci 106c29fa5a6Sopenharmony_civoid HotArea::CheckPointerToEdge(HotAreaType type) 107c29fa5a6Sopenharmony_ci{ 108c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 109c29fa5a6Sopenharmony_ci if (type == HotAreaType::AREA_LEFT) { 110c29fa5a6Sopenharmony_ci isEdge_ = displayX_ <= 0 && deltaX_ < 0; 111c29fa5a6Sopenharmony_ci } else if (type == HotAreaType::AREA_RIGHT) { 112c29fa5a6Sopenharmony_ci isEdge_ = displayX_ >= (width_ - 1) && deltaX_ > 0; 113c29fa5a6Sopenharmony_ci } else if (type == HotAreaType::AREA_TOP) { 114c29fa5a6Sopenharmony_ci isEdge_ = displayY_ <= 0 && deltaY_ < 0; 115c29fa5a6Sopenharmony_ci } else if (type == HotAreaType::AREA_BOTTOM) { 116c29fa5a6Sopenharmony_ci isEdge_ = displayY_ >= (height_ - 1) && deltaY_ > 0; 117c29fa5a6Sopenharmony_ci } else { 118c29fa5a6Sopenharmony_ci isEdge_ = false; 119c29fa5a6Sopenharmony_ci } 120c29fa5a6Sopenharmony_ci} 121c29fa5a6Sopenharmony_ci 122c29fa5a6Sopenharmony_civoid HotArea::NotifyMessage() 123c29fa5a6Sopenharmony_ci{ 124c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 125c29fa5a6Sopenharmony_ci OnHotAreaMessage(type_, isEdge_); 126c29fa5a6Sopenharmony_ci} 127c29fa5a6Sopenharmony_ci 128c29fa5a6Sopenharmony_civoid HotArea::OnHotAreaMessage(HotAreaType msg, bool isEdge) 129c29fa5a6Sopenharmony_ci{ 130c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 131c29fa5a6Sopenharmony_ci for (const auto &callback : callbacks_) { 132c29fa5a6Sopenharmony_ci NotifyHotAreaMessage(callback.pid, callback.msgId, msg, isEdge); 133c29fa5a6Sopenharmony_ci } 134c29fa5a6Sopenharmony_ci} 135c29fa5a6Sopenharmony_ci 136c29fa5a6Sopenharmony_civoid HotArea::OnClientDied(const ClientDiedEvent &event) 137c29fa5a6Sopenharmony_ci{ 138c29fa5a6Sopenharmony_ci FI_HILOGI("Remove client died listener, pid: %{public}d", event.pid); 139c29fa5a6Sopenharmony_ci callbacks_.erase(HotAreaInfo { .pid = event.pid }); 140c29fa5a6Sopenharmony_ci} 141c29fa5a6Sopenharmony_ci 142c29fa5a6Sopenharmony_civoid HotArea::NotifyHotAreaMessage(int32_t pid, MessageId msgId, HotAreaType msg, bool isEdge) 143c29fa5a6Sopenharmony_ci{ 144c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 145c29fa5a6Sopenharmony_ci CHKPV(env_); 146c29fa5a6Sopenharmony_ci auto session = env_->GetSocketSessionManager().FindSessionByPid(pid); 147c29fa5a6Sopenharmony_ci CHKPV(session); 148c29fa5a6Sopenharmony_ci NetPacket pkt(msgId); 149c29fa5a6Sopenharmony_ci 150c29fa5a6Sopenharmony_ci pkt << displayX_ << displayY_ << static_cast<int32_t>(msg) << isEdge; 151c29fa5a6Sopenharmony_ci if (pkt.ChkRWError()) { 152c29fa5a6Sopenharmony_ci FI_HILOGE("Packet write data failed"); 153c29fa5a6Sopenharmony_ci return; 154c29fa5a6Sopenharmony_ci } 155c29fa5a6Sopenharmony_ci if (!session->SendMsg(pkt)) { 156c29fa5a6Sopenharmony_ci FI_HILOGE("Sending failed"); 157c29fa5a6Sopenharmony_ci return; 158c29fa5a6Sopenharmony_ci } 159c29fa5a6Sopenharmony_ci} 160c29fa5a6Sopenharmony_ci} // namespace Cooperate 161c29fa5a6Sopenharmony_ci} // namespace DeviceStatus 162c29fa5a6Sopenharmony_ci} // namespace Msdp 163c29fa5a6Sopenharmony_ci} // namespace OHOS 164