diff --git a/interfaces/kits/js/@ohos.application.AccessibilityExtensionAbility.d.ts b/interfaces/kits/js/@ohos.application.AccessibilityExtensionAbility.d.ts index 12add9c4f..4dc895a40 100644 --- a/interfaces/kits/js/@ohos.application.AccessibilityExtensionAbility.d.ts +++ b/interfaces/kits/js/@ohos.application.AccessibilityExtensionAbility.d.ts @@ -15,7 +15,7 @@ import accessibility from './@ohos.accessibility' import AccessibilityExtensionContext, { AccessibilityElement } from './application/AccessibilityExtensionContext' -import inputEventClient from './@ohos.multimodalInput.inputEventClient' +import { KeyEvent } from './@ohos.multimodalInput.keyEvent' /** * class of accessibility extension ability. @@ -49,7 +49,7 @@ export default class AccessibilityExtensionAbility { * Called when a physical key is pressed, such as when the user presses the volume button . * @param keyEvent Indicates the physical key event. */ - onKeyEvent(keyEvent: inputEventClient.KeyEvent): boolean; + onKeyEvent(keyEvent: KeyEvent): boolean; } /** diff --git a/interfaces/kits/napi/include/napi_accessibility_utils.h b/interfaces/kits/napi/include/napi_accessibility_utils.h index df2a8213f..f8cdfdcf8 100644 --- a/interfaces/kits/napi/include/napi_accessibility_utils.h +++ b/interfaces/kits/napi/include/napi_accessibility_utils.h @@ -44,6 +44,13 @@ constexpr int32_t PARAM2 = 2; constexpr int32_t CODE_SUCCESS = 0; constexpr int32_t CODE_FAILED = -1; constexpr int32_t CHAE_BUFFER_MAX = 1024; +// key action +enum KeyAction : int32_t { + CANCEL = 0, + DOWN = 1, + UP = 2, + UNKNOWN = 0xff, +}; std::string GetStringFromNAPI(napi_env env, napi_value value); bool ParseBool(napi_env env, bool& param, napi_value args); @@ -66,6 +73,10 @@ OHOS::AccessibilityConfig::DALTONIZATION_TYPE ConvertStringToDaltonizationTypes( void ConvertActionArgsJSToNAPI( napi_env env, napi_value object, std::map& args, OHOS::Accessibility::ActionType action); +KeyAction TransformKeyActionValue(int32_t keyAction); +bool HasKeyCode(const std::vector& pressedKeys, int32_t keyCode); +void GetKeyValue(napi_env env, napi_value keyObject, const OHOS::MMI::KeyEvent::KeyItem* keyItem); +void SetInputEventProperty(napi_env env, napi_value result, const std::shared_ptr &keyEvent); void ConvertKeyEventToJS(napi_env env, napi_value result, const std::shared_ptr &keyEvent); void ConvertCaptionPropertyToJS(napi_env env, napi_value& result, OHOS::AccessibilityConfig::CaptionProperty captionProperty); diff --git a/interfaces/kits/napi/src/napi_accessibility_utils.cpp b/interfaces/kits/napi/src/napi_accessibility_utils.cpp index 9dffc08b9..04fea40af 100644 --- a/interfaces/kits/napi/src/napi_accessibility_utils.cpp +++ b/interfaces/kits/napi/src/napi_accessibility_utils.cpp @@ -1143,44 +1143,185 @@ void ConvertGesturePathsJSToNAPI(napi_env env, napi_value object, } } +KeyAction TransformKeyActionValue(int32_t keyAction) +{ + HILOG_DEBUG("keyAction:%{public}d", keyAction); + + KeyAction action = KeyAction::UNKNOWN; + if (keyAction == OHOS::MMI::KeyEvent::KEY_ACTION_DOWN) { + action = KeyAction::DOWN; + } else if (keyAction == OHOS::MMI::KeyEvent::KEY_ACTION_UP) { + action = KeyAction::UP; + } else if (keyAction == OHOS::MMI::KeyEvent::KEY_ACTION_CANCEL) { + action = KeyAction::CANCEL; + } else { + HILOG_DEBUG("key action is invalid"); + } + return action; +} + +bool HasKeyCode(const std::vector& pressedKeys, int32_t keyCode) +{ + HILOG_DEBUG(); + + return std::find(pressedKeys.begin(), pressedKeys.end(), keyCode) != pressedKeys.end(); +} + +void GetKeyValue(napi_env env, napi_value keyObject, const OHOS::MMI::KeyEvent::KeyItem* keyItem) +{ + HILOG_DEBUG(); + + if (!keyItem) { + HILOG_WARN("keyItem is null."); + return; + } + + napi_value keyCodeValue = nullptr; + int32_t keyCode = keyItem->GetKeyCode(); + NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, keyCode, &keyCodeValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, keyObject, "code", keyCodeValue)); + + napi_value timeValue = nullptr; + int64_t pressedTime = keyItem->GetDownTime(); + NAPI_CALL_RETURN_VOID(env, napi_create_int64(env, pressedTime, &timeValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, keyObject, "pressedTime", timeValue)); + + napi_value deviceIdValue = nullptr; + int32_t deviceId = keyItem->GetDeviceId(); + NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, deviceId, &deviceIdValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, keyObject, "deviceId", deviceIdValue)); +} + +void SetInputEventProperty(napi_env env, napi_value result, const std::shared_ptr &keyEvent) +{ + HILOG_DEBUG(); + + // set id + napi_value idValue = nullptr; + int32_t id = keyEvent->GetId(); + NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, id, &idValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "id", idValue)); + + // set deviceId + napi_value deviceIdValue = nullptr; + int32_t deviceId = keyEvent->GetDeviceId(); + NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, deviceId, &deviceIdValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "deviceId", deviceIdValue)); + + // set actionTime + napi_value actionTimeValue = nullptr; + int64_t actionTime = keyEvent->GetActionTime(); + NAPI_CALL_RETURN_VOID(env, napi_create_int64(env, actionTime, &actionTimeValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "actionTime", actionTimeValue)); + + // set screenId + napi_value screenIdValue = nullptr; + int32_t screenId = keyEvent->GetTargetDisplayId(); + NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, screenId, &screenIdValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "screenId", screenIdValue)); + + // set windowId + napi_value windowIdValue = nullptr; + int32_t windowId = keyEvent->GetTargetWindowId(); + NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, windowId, &windowIdValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "windowId", windowIdValue)); +} + void ConvertKeyEventToJS(napi_env env, napi_value result, const std::shared_ptr &keyEvent) { - napi_value keyCode; - NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, keyEvent->GetKeyCode(), &keyCode)); - NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "keyCode", keyCode)); + HILOG_DEBUG(); - napi_value keyAction; - NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, keyEvent->GetKeyAction(), &keyAction)); - NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "keyAction", keyAction)); - - napi_value keys; - uint32_t idx = 0; - std::vector keyItems = keyEvent->GetKeyItems(); - NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &keys)); - for (auto &key : keyItems) { - napi_value keyItem = nullptr; - NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &keyItem)); - - napi_value pressed; - NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, key.IsPressed(), &pressed)); - NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, keyItem, "pressed", pressed)); - - napi_value downTime; - NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, key.GetDownTime(), &downTime)); - NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, keyItem, "downTime", downTime)); - - napi_value deviceId; - NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, key.GetDeviceId(), &deviceId)); - NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, keyItem, "deviceId", deviceId)); - - napi_value itemKeyCode; - NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, key.GetKeyCode(), &itemKeyCode)); - NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, keyItem, "keyCode", itemKeyCode)); - - NAPI_CALL_RETURN_VOID(env, napi_set_element(env, keys, idx, keyItem)); - idx++; + if (!keyEvent) { + HILOG_ERROR("keyEvent is null."); + return; } - NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "keys", keys)); + + // set inputEvent + SetInputEventProperty(env, result, keyEvent); + + // set action + napi_value keyActionValue = nullptr; + KeyAction keyAction = TransformKeyActionValue(keyEvent->GetKeyAction()); + if (keyAction != KeyAction::UNKNOWN) { + NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, keyAction, &keyActionValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "action", keyActionValue)); + } + + // set key + napi_value keyObject = nullptr; + NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &keyObject)); + const OHOS::MMI::KeyEvent::KeyItem* keyItem = keyEvent->GetKeyItem(); + GetKeyValue(env, keyObject, keyItem); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "key", keyObject)); + + // set unicodeChar + napi_value unicodeCharValue = nullptr; + NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, 0, &unicodeCharValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "unicodeChar", unicodeCharValue)); + + // set keys + napi_value keysAarry = nullptr; + NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &keysAarry)); + uint32_t index = 0; + std::vector pressedKeys = keyEvent->GetPressedKeys(); + for (const auto &pressedKeyCode : pressedKeys) { + napi_value element = nullptr; + NAPI_CALL_RETURN_VOID(env, napi_create_object(env, &element)); + const OHOS::MMI::KeyEvent::KeyItem* pressedKeyItem = keyEvent->GetKeyItem(pressedKeyCode); + GetKeyValue(env, element, pressedKeyItem); + NAPI_CALL_RETURN_VOID(env, napi_set_element(env, keysAarry, index, element)); + ++index; + } + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "keys", keysAarry)); + + // set ctrlKey + bool isPressed = HasKeyCode(pressedKeys, OHOS::MMI::KeyEvent::KEYCODE_CTRL_LEFT) + || HasKeyCode(pressedKeys, OHOS::MMI::KeyEvent::KEYCODE_CTRL_RIGHT); + napi_value ctrlKeyValue = nullptr; + NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, isPressed, &ctrlKeyValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "ctrlKey", ctrlKeyValue)); + + // set altKey + isPressed = HasKeyCode(pressedKeys, OHOS::MMI::KeyEvent::KEYCODE_ALT_LEFT) + || HasKeyCode(pressedKeys, OHOS::MMI::KeyEvent::KEYCODE_ALT_RIGHT); + napi_value altKeyValue = nullptr; + NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, isPressed, &altKeyValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "altKey", altKeyValue)); + + // set shiftKey + isPressed = HasKeyCode(pressedKeys, OHOS::MMI::KeyEvent::KEYCODE_SHIFT_LEFT) + || HasKeyCode(pressedKeys, OHOS::MMI::KeyEvent::KEYCODE_SHIFT_RIGHT); + napi_value shiftKeyValue = nullptr; + NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, isPressed, &shiftKeyValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "shiftKey", shiftKeyValue)); + + // set logoKey + isPressed = HasKeyCode(pressedKeys, OHOS::MMI::KeyEvent::KEYCODE_META_LEFT) + || HasKeyCode(pressedKeys, OHOS::MMI::KeyEvent::KEYCODE_META_RIGHT); + napi_value logoKeyValue = nullptr; + NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, isPressed, &logoKeyValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "logoKey", logoKeyValue)); + + // set fnKey + isPressed = HasKeyCode(pressedKeys, OHOS::MMI::KeyEvent::KEYCODE_FN); + napi_value fnKeyValue = nullptr; + NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, isPressed, &fnKeyValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "fnKey", fnKeyValue)); + + // set capsLock + napi_value capsLockValue = nullptr; + NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, false, &capsLockValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "capsLock", capsLockValue)); + + // set numLock + napi_value numLockValue = nullptr; + NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, false, &numLockValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "numLock", numLockValue)); + + // set scrollLock + napi_value scrollLockValue = nullptr; + NAPI_CALL_RETURN_VOID(env, napi_get_boolean(env, false, &scrollLockValue)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, result, "scrollLock", scrollLockValue)); } void ConvertCaptionPropertyToJS(