diff --git a/frameworks/native/inputmethod_ability/include/input_method_panel.h b/frameworks/native/inputmethod_ability/include/input_method_panel.h index 093df774796b305ede00343724632411c00c5031..2b56076b24af9edb2b5c135a76580fe62e388649 100644 --- a/frameworks/native/inputmethod_ability/include/input_method_panel.h +++ b/frameworks/native/inputmethod_ability/include/input_method_panel.h @@ -128,6 +128,7 @@ private: int32_t CalculateFloatRect(const LayoutParams &layoutParams, PanelAdjustInfo &lanIterValue, PanelAdjustInfo &porIterValue); int32_t CalculateNoConfigRect(const PanelFlag panelFlag, const LayoutParams &layoutParams); + void CalculateFloatNoConfigRect(const LayoutParams &layoutParams); int32_t GetResizeParams(Rosen::Rect &portrait, Rosen::Rect &landscape, uint32_t width, uint32_t height); int32_t ParseEnhancedParams( diff --git a/frameworks/native/inputmethod_ability/src/input_method_panel.cpp b/frameworks/native/inputmethod_ability/src/input_method_panel.cpp index 0bf9e8c454daef9158c92f616badf2fe3a509a66..55cd59e4a2ab9d1abece36a40f6bad253829256c 100644 --- a/frameworks/native/inputmethod_ability/src/input_method_panel.cpp +++ b/frameworks/native/inputmethod_ability/src/input_method_panel.cpp @@ -1044,6 +1044,8 @@ int32_t InputMethodPanel::InitAdjustInfo() .right = static_cast(config.right * densityDpi), .bottom = static_cast(config.bottom * densityDpi) }; panelAdjust_.insert({ config.style, info }); + IMSA_HILOGI("PanelAdjustInfo: {top=%{public}d, left=%{public}d, right=%{public}d, bottom=%{public}d}", + info.top, info.left, info.right, info.bottom); } isAdjustInfoInitialized_.store(true); return ErrorCode::NO_ERROR; @@ -1080,46 +1082,62 @@ int32_t InputMethodPanel::CalculateNoConfigRect(const PanelFlag panelFlag, const if (panelFlag == PanelFlag::FLG_FIXED) { keyboardLayoutParams_.gravity_ = WindowGravity::WINDOW_GRAVITY_BOTTOM; WindowSize portraitDisplaySize; - if (!GetDisplaySize(true, portraitDisplaySize)) { - IMSA_HILOGE("GetPortraitDisplaySize failed!"); + if (!GetDisplaySize(true, portraitDisplaySize) || + portraitDisplaySize.width > static_cast(INT32_MAX)) { + IMSA_HILOGE("Portrait display width is %{public}u out of int32_t range", portraitDisplaySize.width); return ErrorCode::ERROR_WINDOW_MANAGER; } keyboardLayoutParams_.PortraitPanelRect_.width_ = portraitDisplaySize.width; keyboardLayoutParams_.PortraitPanelRect_.height_ = layoutParams.portraitRect.height_; - keyboardLayoutParams_.PortraitPanelRect_.posY_ = - static_cast(portraitDisplaySize.height - keyboardLayoutParams_.PortraitPanelRect_.height_); + int64_t height = static_cast(portraitDisplaySize.height); + int64_t panelHeight = static_cast(keyboardLayoutParams_.PortraitPanelRect_.height_); + int64_t posY = height - panelHeight; + if (posY > INT32_MAX || posY < INT32_MIN) { + IMSA_HILOGE("Portrait height:%{public}u, posY:%{public}lld", portraitDisplaySize.height, posY); + return ErrorCode::ERROR_PARAMETER_CHECK_FAILED; + } + keyboardLayoutParams_.PortraitPanelRect_.posY_ = static_cast(posY); keyboardLayoutParams_.PortraitPanelRect_.posX_ = NUMBER_ZERO; - // fixed Portraitkeyboard keyboardLayoutParams_.PortraitKeyboardRect_.width_ = keyboardLayoutParams_.PortraitPanelRect_.width_; keyboardLayoutParams_.PortraitKeyboardRect_.height_ = keyboardLayoutParams_.PortraitPanelRect_.height_; keyboardLayoutParams_.PortraitKeyboardRect_.posY_ = keyboardLayoutParams_.PortraitPanelRect_.posY_; keyboardLayoutParams_.PortraitKeyboardRect_.posX_ = keyboardLayoutParams_.PortraitPanelRect_.posX_; - WindowSize landscapeDisplaySize; - if (!GetDisplaySize(false, landscapeDisplaySize)) { - IMSA_HILOGE("GetLandscapeDisplaySize failed!"); + if (!GetDisplaySize(false, landscapeDisplaySize) || + landscapeDisplaySize.width > static_cast(INT32_MAX)) { + IMSA_HILOGE("Landscape display width is %{public}u out of int32_t range!", landscapeDisplaySize.width); return ErrorCode::ERROR_WINDOW_MANAGER; } keyboardLayoutParams_.LandscapePanelRect_.width_ = landscapeDisplaySize.width; keyboardLayoutParams_.LandscapePanelRect_.height_ = layoutParams.landscapeRect.height_; - keyboardLayoutParams_.LandscapePanelRect_.posY_ = - static_cast(landscapeDisplaySize.height - keyboardLayoutParams_.LandscapePanelRect_.height_); + int64_t landscapeHeight = static_cast(landscapeDisplaySize.height); + int64_t landscapePanelHeight = static_cast(keyboardLayoutParams_.LandscapePanelRect_.height_); + int64_t posYLandscape = landscapeHeight - landscapePanelHeight; + if (posYLandscape > INT32_MAX || posYLandscape < INT32_MIN) { + IMSA_HILOGE("Landscape height:%{public}u, posY:%{public}lld", landscapeDisplaySize.height, posYLandscape); + return ErrorCode::ERROR_PARAMETER_CHECK_FAILED; + } + keyboardLayoutParams_.LandscapePanelRect_.posY_ = static_cast(posYLandscape); keyboardLayoutParams_.LandscapePanelRect_.posX_ = NUMBER_ZERO; - // Landscapekeyboard keyboardLayoutParams_.LandscapeKeyboardRect_.width_ = keyboardLayoutParams_.LandscapePanelRect_.width_; keyboardLayoutParams_.LandscapeKeyboardRect_.height_ = keyboardLayoutParams_.LandscapePanelRect_.height_; keyboardLayoutParams_.LandscapeKeyboardRect_.posY_ = keyboardLayoutParams_.LandscapePanelRect_.posY_; keyboardLayoutParams_.LandscapeKeyboardRect_.posX_ = keyboardLayoutParams_.LandscapePanelRect_.posX_; } else { - keyboardLayoutParams_.gravity_ = WindowGravity::WINDOW_GRAVITY_FLOAT; - keyboardLayoutParams_.LandscapeKeyboardRect_ = layoutParams.landscapeRect; - keyboardLayoutParams_.PortraitKeyboardRect_ = layoutParams.portraitRect; - keyboardLayoutParams_.LandscapePanelRect_ = layoutParams.landscapeRect; - keyboardLayoutParams_.PortraitPanelRect_ = layoutParams.portraitRect; + CalculateFloatNoConfigRect(layoutParams); } return ErrorCode::NO_ERROR; } +void InputMethodPanel::CalculateFloatNoConfigRect(const LayoutParams &layoutParams) +{ + keyboardLayoutParams_.gravity_ = WindowGravity::WINDOW_GRAVITY_FLOAT; + keyboardLayoutParams_.LandscapeKeyboardRect_ = layoutParams.landscapeRect; + keyboardLayoutParams_.PortraitKeyboardRect_ = layoutParams.portraitRect; + keyboardLayoutParams_.LandscapePanelRect_ = layoutParams.landscapeRect; + keyboardLayoutParams_.PortraitPanelRect_ = layoutParams.portraitRect; +} + std::tuple, std::vector> InputMethodPanel::GetScreenStatus( const PanelFlag panelFlag) {