diff --git a/common/interface/IAccessibleAbilityManagerService.idl b/common/interface/IAccessibleAbilityManagerService.idl index 52ea1eca5534333b04b954310007d4481460430f..73806e343977ef966203a9c77d302731274cfb1b 100644 --- a/common/interface/IAccessibleAbilityManagerService.idl +++ b/common/interface/IAccessibleAbilityManagerService.idl @@ -41,6 +41,7 @@ interface OHOS.Accessibility.IAccessibleAbilityManagerService { void EnableAbility([in] String name, [in] unsigned int capabilities); void GetEnabledAbilities([out] String[] enabledAbilities); void DisableAbility([in] String name); + void SetMagnificationState([in] boolean state); void GetActiveWindow([out] int windowId); void EnableUITestAbility([in] IRemoteObject obj); void DisableUITestAbility(); diff --git a/common/interface/test/fuzztest/accessibleabilitymanagerservicestub_fuzzer/accessibleabilitymanagerservicestub_fuzzer.cpp b/common/interface/test/fuzztest/accessibleabilitymanagerservicestub_fuzzer/accessibleabilitymanagerservicestub_fuzzer.cpp index 739cc74b4e2e20119a6206edbfa563b0c42bf443..1ad4e71ab52eb1c2cd960fd98dc73c97bcdca231 100644 --- a/common/interface/test/fuzztest/accessibleabilitymanagerservicestub_fuzzer/accessibleabilitymanagerservicestub_fuzzer.cpp +++ b/common/interface/test/fuzztest/accessibleabilitymanagerservicestub_fuzzer/accessibleabilitymanagerservicestub_fuzzer.cpp @@ -124,6 +124,10 @@ public: { return RET_OK; } + ErrCode SetMagnificationState(const bool state) override + { + return RET_OK; + } ErrCode GetActiveWindow(int32_t &windowId) override { return RET_OK; diff --git a/frameworks/acfwk/include/accessibility_config_impl.h b/frameworks/acfwk/include/accessibility_config_impl.h index 7f7e539e4020d1fab2190c4fcd6238d1bd42be8e..2617990c7d12b0bf7e3ff75d56bb0e50c6ab8549 100644 --- a/frameworks/acfwk/include/accessibility_config_impl.h +++ b/frameworks/acfwk/include/accessibility_config_impl.h @@ -51,6 +51,7 @@ public: Accessibility::RetError EnableAbility(const std::string &name, const uint32_t capabilities); Accessibility::RetError DisableAbility(const std::string &name); + Accessibility::RetError SetMagnificationState(const bool state); Accessibility::RetError SetScreenMagnificationState(const bool state); Accessibility::RetError SetShortKeyState(const bool state); diff --git a/frameworks/acfwk/src/accessibility_config.cpp b/frameworks/acfwk/src/accessibility_config.cpp index 29de41ab669431772d6558920f4d44a4de3bd89f..d5c4f4076435eced668d35747e4cafaee95196f8 100644 --- a/frameworks/acfwk/src/accessibility_config.cpp +++ b/frameworks/acfwk/src/accessibility_config.cpp @@ -93,6 +93,12 @@ Accessibility::RetError AccessibilityConfig::DisableAbility(const std::string &n return pImpl_->DisableAbility(name); } +Accessibility::RetError AccessibilityConfig::SetMagnificationState(const bool state) +{ + CHECK_IMPL_PTR(Accessibility::RET_ERR_NULLPTR) + return pImpl_->SetMagnificationState(state); +} + Accessibility::RetError AccessibilityConfig::SetScreenMagnificationState(const bool state) { CHECK_IMPL_PTR(Accessibility::RET_ERR_NULLPTR) diff --git a/frameworks/acfwk/src/accessibility_config_impl.cpp b/frameworks/acfwk/src/accessibility_config_impl.cpp index 01828b45c9e85d6b239b2bdad63e7df83a10fcfa..46a019bca487206466c4087d75557536962ddd18 100644 --- a/frameworks/acfwk/src/accessibility_config_impl.cpp +++ b/frameworks/acfwk/src/accessibility_config_impl.cpp @@ -368,6 +368,19 @@ Accessibility::RetError AccessibilityConfig::Impl::DisableAbility(const std::str return ret; } +Accessibility::RetError AccessibilityConfig::Impl::SetMagnificationState(const bool state) +{ + HILOG_INFO("state = [%{public}d]", state); + Utils::UniqueReadGuard rLock(rwLock_); + if (GetServiceProxy() == nullptr) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } + Accessibility::RetError ret = static_cast( + GetServiceProxy()->SetMagnificationState(state)); + return ret; +} + Accessibility::RetError AccessibilityConfig::Impl::GetCaptionsState(bool &state) { Utils::UniqueReadGuard rLock(rwLock_); diff --git a/interfaces/innerkits/acfwk/include/accessibility_config.h b/interfaces/innerkits/acfwk/include/accessibility_config.h index dbb6a3bf1b536d41972c41a0a192db9dfe56d4dd..2b44e29fe800fdcb7d3e8124a5647f038fed5027 100644 --- a/interfaces/innerkits/acfwk/include/accessibility_config.h +++ b/interfaces/innerkits/acfwk/include/accessibility_config.h @@ -166,6 +166,13 @@ public: */ Accessibility::RetError DisableAbility(const std::string &name); + /** + * @brief Trigger screen magnification with a shortcut key + * @param state The state of screen magnification to trigger. + * @return Returns RET_OK if successful, otherwise refer to the RetError for the failure. + */ + Accessibility::RetError SetMagnificationState(const bool state); + /** * @brief Set whether to enable the magnification function * @param state true:enable magnification function; false:disable magnification function diff --git a/interfaces/innerkits/common/include/accessibility_def.h b/interfaces/innerkits/common/include/accessibility_def.h index 8c455b82467a99ea43f1653295692c8ed3d86a9f..40d8e43408549ff0f7ec8083b63798ac49489e10 100644 --- a/interfaces/innerkits/common/include/accessibility_def.h +++ b/interfaces/innerkits/common/include/accessibility_def.h @@ -76,6 +76,7 @@ enum RetError : int32_t { RET_ERR_NOT_ENABLED, RET_ERR_PROPERTY_NOT_EXIST, RET_ERR_ACTION_NOT_SUPPORT, + RET_ERR_ENABLE_MAGNIFICATION, }; enum SET_AA_CALLBACK_RESULT : int32_t { @@ -404,6 +405,7 @@ enum class NAccessibilityErrorCode : int32_t { ACCESSIBILITY_ERROR_NO_RIGHT = 9300003, ACCESSIBILITY_ERROR_PROPERTY_NOT_EXIST = 9300004, ACCESSIBILITY_ERROR_ACTION_NOT_SUPPORT = 9300005, + ACCESSIBILITY_ERROR_ENABLE_MAGNIFICATION = 9300007, }; struct NAccessibilityErrMsg { diff --git a/interfaces/kits/napi/accessibility_config/include/napi_accessibility_config.h b/interfaces/kits/napi/accessibility_config/include/napi_accessibility_config.h index 8f92080d3b21328a0820aa5634b41dd420115dd3..4c079e8e9e9c0b8774b21bfc268c18b3b8b4c780 100644 --- a/interfaces/kits/napi/accessibility_config/include/napi_accessibility_config.h +++ b/interfaces/kits/napi/accessibility_config/include/napi_accessibility_config.h @@ -119,12 +119,19 @@ public: static napi_value DisableAbility(napi_env env, napi_callback_info info); static napi_value SubscribeState(napi_env env, napi_callback_info info); static napi_value UnsubscribeState(napi_env env, napi_callback_info info); + static napi_value SetMagnificationState(napi_env env, napi_callback_info info); static napi_value SetConfig(napi_env env, napi_callback_info info); static napi_value GetConfig(napi_env env, napi_callback_info info); static napi_value SubscribeConfigObserver(napi_env env, napi_callback_info info); static napi_value UnSubscribeConfigObserver(napi_env env, napi_callback_info info); static std::shared_ptr configObservers_; static std::shared_ptr enableAbilityListsObservers_; + static inline napi_value ConfigCreateJsUndefined(napi_env env) + { + napi_value result = nullptr; + napi_get_undefined(env, &result); + return result; + } private: static void AsyncWorkComplete(napi_env env, napi_status status, void* data); static void SetConfigExecute(napi_env env, void* data); diff --git a/interfaces/kits/napi/accessibility_config/src/napi_accessibility_config.cpp b/interfaces/kits/napi/accessibility_config/src/napi_accessibility_config.cpp index 7b1ee720fb7ed25fc36d74f014f1c4d7cd0db0c7..7d0acd46c5443b693cd0d8090dd5b61174f1da64 100644 --- a/interfaces/kits/napi/accessibility_config/src/napi_accessibility_config.cpp +++ b/interfaces/kits/napi/accessibility_config/src/napi_accessibility_config.cpp @@ -214,6 +214,47 @@ napi_value NAccessibilityConfig::DisableAbility(napi_env env, napi_callback_info return promise; } +napi_value NAccessibilityConfig::SetMagnificationState(napi_env env, napi_callback_info info) +{ + HILOG_INFO(); + OHOS::Accessibility::RetError errCode = OHOS::Accessibility::RET_OK; + + size_t argc = ARGS_SIZE_TWO; + napi_value parameters[ARGS_SIZE_TWO] = {0}; + napi_get_cb_info(env, info, &argc, parameters, nullptr, nullptr); + + if (argc != ARGS_SIZE_TWO - 1) { + HILOG_ERROR("invalid param"); + errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM; + } + + if (errCode == OHOS::Accessibility::RET_ERR_INVALID_PARAM) { + napi_value err = CreateBusinessError(env, errCode); + napi_throw(env, err); + return ConfigCreateJsUndefined(env); + } + + bool state = false; + bool ret = ParseBool(env, state, parameters[PARAM0]); + if (!ret) { + errCode = OHOS::Accessibility::RET_ERR_INVALID_PARAM; + HILOG_ERROR("invalid param"); + } + + if (errCode == OHOS::Accessibility::RET_ERR_INVALID_PARAM) { + napi_value err = CreateBusinessError(env, errCode); + napi_throw(env, err); + return ConfigCreateJsUndefined(env); + } + auto &instance = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance(); + OHOS::Accessibility::RetError result = instance.SetMagnificationState(state); + if (result != OHOS::Accessibility::RET_OK) { + napi_value err = CreateBusinessError(env, result); + napi_throw(env, err); + } + return ConfigCreateJsUndefined(env); +} + bool NAccessibilityConfig::CheckReadPermission(const std::string &permission) { HILOG_DEBUG(); diff --git a/interfaces/kits/napi/accessibility_config/src/native_module.cpp b/interfaces/kits/napi/accessibility_config/src/native_module.cpp index b97d5933aad7f723c55ba3ea4da45c7c34465dca..ee9124215f61d1eaeb27344a5eb14afe0ed7cd39 100644 --- a/interfaces/kits/napi/accessibility_config/src/native_module.cpp +++ b/interfaces/kits/napi/accessibility_config/src/native_module.cpp @@ -634,6 +634,7 @@ static napi_value InitConfigModule(napi_env env, napi_value exports) DECLARE_NAPI_FUNCTION("off", NAccessibilityConfig::UnsubscribeState), DECLARE_NAPI_FUNCTION("enableAbility", NAccessibilityConfig::EnableAbility), DECLARE_NAPI_FUNCTION("disableAbility", NAccessibilityConfig::DisableAbility), + DECLARE_NAPI_FUNCTION("setMagnificationState", NAccessibilityConfig::SetMagnificationState), DECLARE_NAPI_STATIC_PROPERTY("highContrastText", InitHighContrastText(env)), DECLARE_NAPI_STATIC_PROPERTY("invertColor", InitInvertColor(env)), DECLARE_NAPI_STATIC_PROPERTY("daltonizationState", InitDaltonizationState(env)), diff --git a/interfaces/kits/napi/src/napi_accessibility_utils.cpp b/interfaces/kits/napi/src/napi_accessibility_utils.cpp index c41e78f746cc605a0f80fca373ff9cd2c733727a..607574fce3d0c08db89bc512a74c6dcc2cc9c10c 100644 --- a/interfaces/kits/napi/src/napi_accessibility_utils.cpp +++ b/interfaces/kits/napi/src/napi_accessibility_utils.cpp @@ -67,6 +67,7 @@ namespace { const std::string ERROR_MESSAGE_ACTION_NOT_SUPPORT = "This action is not supported"; const std::string ERROR_MESSAGE_INVALID_BUNDLE_NAME_OR_ABILITY_NAME = "Invalid bundle name or ability name"; const std::string ERROR_MESSAGE_TARGET_ABILITY_ALREADY_ENABLED = "Target ability already enabled"; + const std::string ERROR_MESSAGE_ENABLE_MAGNIFICATION = "Failed to trigger magnification."; } // namespace using namespace OHOS::Accessibility; using namespace OHOS::AccessibilityConfig; @@ -284,6 +285,9 @@ NAccessibilityErrMsg QueryRetMsg(OHOS::Accessibility::RetError errorCode) case OHOS::Accessibility::RetError::RET_ERR_NOT_SYSTEM_APP: return { NAccessibilityErrorCode::ACCESSIBILITY_ERROR_NOT_SYSTEM_APP, ERROR_MESSAGE_NOT_SYSTEM_APP }; + case OHOS::Accessibility::RetError::RET_ERR_ENABLE_MAGNIFICATION: + return { NAccessibilityErrorCode::ACCESSIBILITY_ERROR_ENABLE_MAGNIFICATION, + ERROR_MESSAGE_ENABLE_MAGNIFICATION }; default: return { NAccessibilityErrorCode::ACCESSIBILITY_ERROR_SYSTEM_ABNORMALITY, ERROR_MESSAGE_SYSTEM_ABNORMALITY }; diff --git a/services/aams/include/accessibility_input_interceptor.h b/services/aams/include/accessibility_input_interceptor.h index 170e88e4401c9ba02117c1562529a2de85408a61..7d608e853948bb68d1ef2f3d722e1c1be970cfcd 100644 --- a/services/aams/include/accessibility_input_interceptor.h +++ b/services/aams/include/accessibility_input_interceptor.h @@ -84,6 +84,8 @@ public: void ShieldZoomGesture(bool flag); void RefreshDisplayInfo(); void StartMagnificationInteract(uint32_t mode); + void EnableGesture(uint32_t mode); + void DisableGesture(uint32_t mode); private: AccessibilityInputInterceptor(); diff --git a/services/aams/include/accessibility_zoom_gesture.h b/services/aams/include/accessibility_zoom_gesture.h index 309846a71317918d70be4c77a373243a61d0fd39..9b1c5923fe4563b3bb187082dae3d339e2231490 100644 --- a/services/aams/include/accessibility_zoom_gesture.h +++ b/services/aams/include/accessibility_zoom_gesture.h @@ -51,6 +51,7 @@ public: void ShieldZoomGesture(bool state); void GetWindowParam(bool needRefresh = false); void StartMagnificationInteract(); + void DisableGesture(); inline ACCESSIBILITY_ZOOM_STATE GetZoomState() { return state_; diff --git a/services/aams/include/accessible_ability_manager_service.h b/services/aams/include/accessible_ability_manager_service.h index 7a275acc6559fd15f77e11c7dc3189d77806fa9c..4a62c3e99f3d8f11af871eba745c9f4ebcc1f4e5 100644 --- a/services/aams/include/accessible_ability_manager_service.h +++ b/services/aams/include/accessible_ability_manager_service.h @@ -122,6 +122,7 @@ public: ErrCode DisableAbility(const std::string &name) override; ErrCode EnableUITestAbility(const sptr& obj) override; ErrCode DisableUITestAbility() override; + ErrCode SetMagnificationState(const bool state) override; ErrCode GetActiveWindow(int32_t &windowId) override; ErrCode GetRealWindowAndElementId(int32_t& windowId, int64_t& elementId) override; ErrCode GetSceneBoardInnerWinId(int32_t windowId, int64_t elementId, int32_t& innerWid) override; @@ -318,6 +319,7 @@ public: bool CheckPermission(const std::string &permission) const; // for magnification + bool GetMagnificationState(); uint32_t GetMagnificationType(); uint32_t GetMagnificationMode(); void SetMagnificationMode(int32_t mode); diff --git a/services/aams/include/magnification_manager.h b/services/aams/include/magnification_manager.h index 7e4653704a3e17788d98e590bbc6ddce174d4cf6..dff1e48e1e53d3c4e28aa8cae5fc7590f49ed342 100644 --- a/services/aams/include/magnification_manager.h +++ b/services/aams/include/magnification_manager.h @@ -31,14 +31,13 @@ public: void OnMagnificationTypeChanged(uint32_t magnificationType); void OnModeChanged(uint32_t mode); void DisableMagnification(); - void SetMagnificationState(bool isEnabled); + void TriggerMagnification(uint32_t type, uint32_t mode); bool GetMagnificationState(); void RefreshWindowParam(); private: std::shared_ptr windowMagnificationManager_ = nullptr; std::shared_ptr fullScreenMagnificationManager_ = nullptr; uint32_t currentMode_ = 0; - bool isMagnificationEnabled_ = false; }; } // namespace Accessibility } // namespace OHOS diff --git a/services/aams/include/magnification_menu_manager.h b/services/aams/include/magnification_menu_manager.h index 412684892a5ca57e3e7da5274b79001d04a7b172..d19b3c0509523c6f6abdf9369ed95580e267b9bd 100644 --- a/services/aams/include/magnification_menu_manager.h +++ b/services/aams/include/magnification_menu_manager.h @@ -56,7 +56,7 @@ private: void CreateMenuWindow(); void LoadMenuBgImage(uint32_t mode); void ChangeMode(); - void AdjustMeunPosition(); + void AdjustMenuPosition(); std::shared_ptr DecodePixelMap(const std::string& pathName, const Media::AllocatorType& allocatorType); //menu window @@ -78,7 +78,7 @@ private: uint32_t screenHeight_ = 0; Rosen::DisplayOrientation orientation_ = Rosen::DisplayOrientation::UNKNOWN; - uint32_t meunMode_ = 0; + uint32_t menuMode_ = 0; uint32_t currentType_ = 0; bool isMenuShown_ = false; }; diff --git a/services/aams/include/window_magnification_gesture.h b/services/aams/include/window_magnification_gesture.h index 855b5bb9c918a67e56ab1e28f5d266090fd07d1b..918288d2b1e6dbc951e1a7929c35d2360c1367c2 100644 --- a/services/aams/include/window_magnification_gesture.h +++ b/services/aams/include/window_magnification_gesture.h @@ -94,6 +94,7 @@ public: void SendCacheEventsToNext(); void ShieldZoomGesture(bool state); void StartMagnificationInteract(); + void DisableGesture(); /* Set current magnification gesture state */ inline void SetGestureState(MagnificationGestureState state, int32_t action) diff --git a/services/aams/src/accessibility_input_interceptor.cpp b/services/aams/src/accessibility_input_interceptor.cpp index b3884197e653288b3095ba84f5ae05fa26c0c989..b6e91f9de30bf376afa39d7585e35ed1e0e1f984 100644 --- a/services/aams/src/accessibility_input_interceptor.cpp +++ b/services/aams/src/accessibility_input_interceptor.cpp @@ -442,6 +442,30 @@ void AccessibilityInputInterceptor::StartMagnificationInteract(uint32_t mode) needInteractMagnification_ = true; } +void AccessibilityInputInterceptor::DisableGesture(uint32_t mode) +{ + HILOG_DEBUG("mode = %{public}d", mode); + if (mode == FULL_SCREEN_MAGNIFICATION && zoomGesture_ != nullptr) { + zoomGesture_->DisableGesture(); + } else if (mode == WINDOW_MAGNIFICATION && windowMagnificationGesture_ != nullptr) { + windowMagnificationGesture_->DisableGesture(); + } else { + HILOG_WARN("invalid mode."); + } +} + +void AccessibilityInputInterceptor::EnableGesture(uint32_t mode) +{ + HILOG_DEBUG("mode = %{public}d", mode); + if (mode == FULL_SCREEN_MAGNIFICATION && zoomGesture_ != nullptr) { + zoomGesture_->StartMagnificationInteract(); + } else if (mode == WINDOW_MAGNIFICATION && windowMagnificationGesture_ != nullptr) { + windowMagnificationGesture_->StartMagnificationInteract(); + } else { + HILOG_WARN("invalid mode."); + } +} + AccessibilityInputEventConsumer::AccessibilityInputEventConsumer() { HILOG_DEBUG(); diff --git a/services/aams/src/accessibility_zoom_gesture.cpp b/services/aams/src/accessibility_zoom_gesture.cpp index 18347c3799cf39385128c923154d6880e0649b4d..6cebe6e04b1214cfc60cb291a2e688486ba59d30 100755 --- a/services/aams/src/accessibility_zoom_gesture.cpp +++ b/services/aams/src/accessibility_zoom_gesture.cpp @@ -862,6 +862,12 @@ void AccessibilityZoomGesture::StartMagnificationInteract() TransferState(ZOOMIN_STATE); } +void AccessibilityZoomGesture::DisableGesture() +{ + HILOG_INFO(); + TransferState(READY_STATE); +} + void AccessibilityZoomGesture::OnZoom(int32_t anchorX, int32_t anchorY) { HILOG_INFO(); diff --git a/services/aams/src/accessible_ability_manager_service.cpp b/services/aams/src/accessible_ability_manager_service.cpp index e896fd53db1d3328ec89a46460c35d09f634eccc..b9593b8f16b2099edb818a916387b31d9d016e4e 100644 --- a/services/aams/src/accessible_ability_manager_service.cpp +++ b/services/aams/src/accessible_ability_manager_service.cpp @@ -1579,6 +1579,45 @@ RetError AccessibleAbilityManagerService::InnerDisableAbility(const std::string return RET_OK; } +ErrCode AccessibleAbilityManagerService::SetMagnificationState(const bool state) +{ + HILOG_INFO("state = %{public}d", state); + bool currentState = GetMagnificationState(); + uint32_t type = GetMagnificationType(); + uint32_t mode = GetMagnificationMode(); + + if (!IsSystemApp()) { + HILOG_WARN("Not system app"); + return RET_ERR_NOT_SYSTEM_APP; + } + if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) { + HILOG_WARN("SetCaptionProperty permission denied."); + return RET_ERR_NO_PERMISSION; + } + + if (state && !currentState) { + HILOG_ERROR("magnificaiton is not enabled."); + return RET_ERR_ENABLE_MAGNIFICATION; + } + + if (magnificationManager_ == nullptr) { + HILOG_ERROR("magnificationManager_ is nullptr."); + return RET_ERR_ENABLE_MAGNIFICATION; + } + + if (state == magnificationManager_->GetMagnificationState()) { + HILOG_ERROR("no need change state."); + return RET_OK; + } + + if (state) { + magnificationManager_->TriggerMagnification(type, mode); + } else { + magnificationManager_->DisableMagnification(); + } + return RET_OK; +} + ErrCode AccessibleAbilityManagerService::EnableUITestAbility(const sptr &obj) { HILOG_DEBUG(); @@ -3802,6 +3841,21 @@ std::shared_ptr AccessibleAbilityManagerService::G return config->GetDbHandle(); } +bool AccessibleAbilityManagerService::GetMagnificationState() +{ + HILOG_DEBUG(); + bool magnificationState = false; + shared_ptr helper = GetCurrentAcountDatashareHelper(); + if (helper == nullptr) { + HILOG_ERROR("datashareHelper is nullptr"); + return magnificationState; + } + + magnificationState = + static_cast(helper->GetBoolValue(SCREEN_MAGNIFICATION_KEY, false)); + return magnificationState; +} + uint32_t AccessibleAbilityManagerService::GetMagnificationType() { HILOG_DEBUG(); diff --git a/services/aams/src/magnification_manager.cpp b/services/aams/src/magnification_manager.cpp index 8ae0bd74d80625ec100ba7e524d73ade773f28bc..55c4d89a9386d0f67242384708f9bd5d8aaa0244 100644 --- a/services/aams/src/magnification_manager.cpp +++ b/services/aams/src/magnification_manager.cpp @@ -30,6 +30,9 @@ MagnificationManager::MagnificationManager() std::shared_ptr MagnificationManager::GetWindowMagnificationManager() { HILOG_DEBUG(); + if (currentMode_ == 0) { + currentMode_ = Singleton::GetInstance().GetMagnificationMode(); + } if (windowMagnificationManager_ == nullptr) { windowMagnificationManager_ = std::make_shared(); } @@ -39,6 +42,9 @@ std::shared_ptr MagnificationManager::GetWindowMagni std::shared_ptr MagnificationManager::GetFullScreenMagnificationManager() { HILOG_DEBUG(); + if (currentMode_ == 0) { + currentMode_ = Singleton::GetInstance().GetMagnificationMode(); + } if (fullScreenMagnificationManager_ == nullptr) { fullScreenMagnificationManager_ = std::make_shared(); } @@ -56,7 +62,9 @@ void MagnificationManager::OnMagnificationTypeChanged(uint32_t magnificationType GetFullScreenMagnificationManager(); } - currentMode_ = Singleton::GetInstance().GetMagnificationMode(); + if (currentMode_ == 0) { + currentMode_ = Singleton::GetInstance().GetMagnificationMode(); + } Singleton::GetInstance().SetCurrentType(magnificationType); if (magnificationType == SWITCH_MAGNIFICATION) { if (windowMagnificationManager_ != nullptr && windowMagnificationManager_->isMagnificationWindowShow()) { @@ -130,25 +138,51 @@ void MagnificationManager::OnModeChanged(uint32_t mode) void MagnificationManager::DisableMagnification() { HILOG_INFO(); + auto interceptor = AccessibilityInputInterceptor::GetInstance(); Singleton::GetInstance().DisableMenuWindow(); if (windowMagnificationManager_ != nullptr && windowMagnificationManager_->isMagnificationWindowShow()) { windowMagnificationManager_->DisableWindowMagnification(); - return; + interceptor->DisableGesture(WINDOW_MAGNIFICATION); } if (fullScreenMagnificationManager_ != nullptr && fullScreenMagnificationManager_->isMagnificationWindowShow()) { fullScreenMagnificationManager_->DisableMagnification(); - return; + interceptor->DisableGesture(FULL_SCREEN_MAGNIFICATION); } } -void MagnificationManager::SetMagnificationState(bool isEnabled) +void MagnificationManager::TriggerMagnification(uint32_t type, uint32_t mode) { - isMagnificationEnabled_ = isEnabled; + HILOG_INFO("type = %{public}d, mode = %{public}d", type, mode); + if (mode == WINDOW_MAGNIFICATION) { + if (windowMagnificationManager_ != nullptr) { + windowMagnificationManager_->ShowWindowMagnification(); + } + } + + if (mode == FULL_SCREEN_MAGNIFICATION) { + if (fullScreenMagnificationManager_ != nullptr) { + fullScreenMagnificationManager_->ShowMagnification(); + } + } + + if (type == SWITCH_MAGNIFICATION) { + Singleton::GetInstance().ShowMenuWindow(mode); + } + + auto interceptor = AccessibilityInputInterceptor::GetInstance(); + interceptor->EnableGesture(mode); } bool MagnificationManager::GetMagnificationState() { - return isMagnificationEnabled_; + if (currentMode_ == WINDOW_MAGNIFICATION && windowMagnificationManager_ != nullptr) { + return windowMagnificationManager_->isMagnificationWindowShow(); + } + + if (currentMode_ == FULL_SCREEN_MAGNIFICATION && fullScreenMagnificationManager_ != nullptr) { + return fullScreenMagnificationManager_->isMagnificationWindowShow(); + } + return false; } void MagnificationManager::RefreshWindowParam() diff --git a/services/aams/src/magnification_menu_manager.cpp b/services/aams/src/magnification_menu_manager.cpp index efb4cd8f5c351be98f11337533627ba597ae98f7..e01d796bfb29491f4dfd2665650e275e50a6e71e 100644 --- a/services/aams/src/magnification_menu_manager.cpp +++ b/services/aams/src/magnification_menu_manager.cpp @@ -51,7 +51,6 @@ void MagnificationMenuManager::DeleteInstance() MagnificationMenuManager::MagnificationMenuManager() { HILOG_DEBUG(); - GetWindowParam(); manager_ = Singleton::GetInstance().GetMagnificationMgr(); } @@ -71,6 +70,7 @@ MagnificationMenuManager::~MagnificationMenuManager() void MagnificationMenuManager::CreateMenuWindow() { HILOG_DEBUG(); + GetWindowParam(); menuRect_ = {(screenWidth_ - menuSize_ - margin_), (screenHeight_ - menuSize_ - margin_), menuSize_, menuSize_}; sptr windowOption = new(std::nothrow) Rosen::WindowOption(); windowOption->SetWindowType(Rosen::WindowType::WINDOW_TYPE_MAGNIFICATION_MENU); @@ -121,7 +121,7 @@ void MagnificationMenuManager::ShowMenuWindow(uint32_t mode) { HILOG_DEBUG(); currentType_ = Singleton::GetInstance().GetMagnificationType(); - meunMode_ = Singleton::GetInstance().GetMagnificationMode(); + menuMode_ = Singleton::GetInstance().GetMagnificationMode(); if (currentType_ != SWITCH_MAGNIFICATION) { HILOG_WARN("no need show menu."); return; @@ -170,7 +170,7 @@ void MagnificationMenuManager::MoveMenuWindow(int32_t deltaX, int32_t deltaY) menuRect_.posX_ = menuPosX; menuRect_.posY_ = menuPosY; - AdjustMeunPosition(); + AdjustMenuPosition(); menuWindow_->MoveTo(menuRect_.posX_, menuRect_.posY_); } @@ -210,23 +210,23 @@ void MagnificationMenuManager::OnMenuTap() } DisableMenuWindow(); ChangeMode(); - manager_->OnModeChanged(meunMode_); - ShowMenuWindow(meunMode_); + manager_->OnModeChanged(menuMode_); + ShowMenuWindow(menuMode_); } void MagnificationMenuManager::ChangeMode() { - if (meunMode_ == WINDOW_MAGNIFICATION) { - meunMode_ = FULL_SCREEN_MAGNIFICATION; + if (menuMode_ == WINDOW_MAGNIFICATION) { + menuMode_ = FULL_SCREEN_MAGNIFICATION; return; } - if (meunMode_ == FULL_SCREEN_MAGNIFICATION) { - meunMode_ = WINDOW_MAGNIFICATION; + if (menuMode_ == FULL_SCREEN_MAGNIFICATION) { + menuMode_ = WINDOW_MAGNIFICATION; return; } } -void MagnificationMenuManager::AdjustMeunPosition() +void MagnificationMenuManager::AdjustMenuPosition() { if (menuRect_.posX_ < margin_) { menuRect_.posX_ = margin_; @@ -294,7 +294,7 @@ void MagnificationMenuManager::RefreshWindowParam() if (isMenuShown_) { DisableMenuWindow(); GetWindowParam(); - ShowMenuWindow(meunMode_); + ShowMenuWindow(menuMode_); } else { GetWindowParam(); } diff --git a/services/aams/src/window_magnification_gesture.cpp b/services/aams/src/window_magnification_gesture.cpp index b19da4db967601520f9d4a8bc1c965c23c9488f5..7f08fc85b315026b61964cb322a5016dfb6a00ec 100644 --- a/services/aams/src/window_magnification_gesture.cpp +++ b/services/aams/src/window_magnification_gesture.cpp @@ -845,6 +845,12 @@ void WindowMagnificationGesture::StartMagnificationInteract() SetGestureState(MagnificationGestureState::ZOOMIN_STATE, SWITCH_MENU); } +void WindowMagnificationGesture::DisableGesture() +{ + HILOG_DEBUG(); + SetGestureState(MagnificationGestureState::READY_STATE, SWITCH_MENU); +} + bool WindowMagnificationGesture::IsTapOnInputMethod(MMI::PointerEvent &event) { int32_t pointerCount = event.GetPointerCount(); diff --git a/services/aams/test/mock/src/mock_accessibility_input_interceptor.cpp b/services/aams/test/mock/src/mock_accessibility_input_interceptor.cpp index bbb067d1490beda08f4d16b57c296ba810ed7b56..42cc8b050422e5fa7e37a144916bc8b1318ed1d7 100644 --- a/services/aams/test/mock/src/mock_accessibility_input_interceptor.cpp +++ b/services/aams/test/mock/src/mock_accessibility_input_interceptor.cpp @@ -126,5 +126,15 @@ void AccessibilityInputInterceptor::StartMagnificationInteract(uint32_t mode) { (void)mode; } + +void AccessibilityInputInterceptor::DisableGesture(uint32_t mode) +{ + (void)mode; +} + +void AccessibilityInputInterceptor::EnableGesture(uint32_t mode) +{ + (void)mode; +} } // namespace Accessibility } // namespace OHOS \ No newline at end of file diff --git a/services/aams/test/mock/src/mock_accessible_ability_manager_service.cpp b/services/aams/test/mock/src/mock_accessible_ability_manager_service.cpp index 9222f94675f6d0aae64767269676b756ce319ab6..2220de6917c0f6e0ae05ac2b5c0ab5c0f3695036 100644 --- a/services/aams/test/mock/src/mock_accessible_ability_manager_service.cpp +++ b/services/aams/test/mock/src/mock_accessible_ability_manager_service.cpp @@ -243,6 +243,12 @@ ErrCode AccessibleAbilityManagerService::DisableUITestAbility() return RET_OK; } +ErrCode AccessibleAbilityManagerService::SetMagnificationState(const bool state) +{ + (void)state; + return RET_OK; +} + ErrCode AccessibleAbilityManagerService::GetActiveWindow(int32_t &windowId) { (void)windowId; diff --git a/services/test/mock/mock_accessible_ability_manager_service_stub.cpp b/services/test/mock/mock_accessible_ability_manager_service_stub.cpp index 2ce7db96440ff7d60a033ea2d03c6948da0a475b..57ac3999c25e7b391f33430736b7c3969222deac 100644 --- a/services/test/mock/mock_accessible_ability_manager_service_stub.cpp +++ b/services/test/mock/mock_accessible_ability_manager_service_stub.cpp @@ -171,6 +171,12 @@ ErrCode MockAccessibleAbilityManagerServiceStub::DisableAbility(const std::strin return RET_OK; } +ErrCode MockAccessibleAbilityManagerServiceStub::SetMagnificationState(const bool state) +{ + (void)state; + return RET_OK; +} + ErrCode MockAccessibleAbilityManagerServiceStub::GetActiveWindow(int32_t& windowId) { (void)windowId; diff --git a/services/test/mock/mock_accessible_ability_manager_service_stub.h b/services/test/mock/mock_accessible_ability_manager_service_stub.h index 824ba68b69168c897ad85643b670a36eaf24b203..ccb462b777bb6d6b31efa236b664ea6e12507ed4 100644 --- a/services/test/mock/mock_accessible_ability_manager_service_stub.h +++ b/services/test/mock/mock_accessible_ability_manager_service_stub.h @@ -68,6 +68,7 @@ public: ErrCode GetEnabledAbilities(std::vector& enabledAbilities) override; ErrCode DisableAbility(const std::string& name) override; + ErrCode SetMagnificationState(const bool state) override; ErrCode GetActiveWindow(int32_t& windowId) override; ErrCode EnableUITestAbility(const sptr& obj) override;