Skip to content

Commit 695c17d

Browse files
authored
add flags for key press (#87)
* add flags * rename flag to flags * update unit tests and docstring * fix rubocop * add changelog and change metastate * tweak changelog
1 parent 11524af commit 695c17d

File tree

5 files changed

+164
-14
lines changed

5 files changed

+164
-14
lines changed

.rubocop.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ Metrics/ClassLength:
1111
Metrics/AbcSize:
1212
Enabled: false
1313
Metrics/CyclomaticComplexity:
14-
Max: 9
14+
Max: 10
1515
Metrics/PerceivedComplexity:
16-
Max: 9
16+
Max: 10
1717
Style/Documentation:
1818
Enabled: false
1919
Style/CommentedKeyword:

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file.
33

44
## [Unreleased]
55
### Enhancements
6+
- Has one **Breaking Change**
7+
- Add `flags` in `press_keycode` and `long_press_keycode`
8+
- New: `@driver.press_keycode 66, metastate: [1], flags: [0x20, 0x2000]`
9+
- `metastate` should set as a keyword argument
10+
- `long_press_keycode` as well
11+
- Before: `@driver.press_keycode 66, 1` (Can set only metastate)
612

713
### Bug fixes
814

lib/appium_lib_core/device.rb

+40-12
Original file line numberDiff line numberDiff line change
@@ -224,26 +224,44 @@ module Device
224224
# @driver.keyevent 82
225225
#
226226

227-
# @!method press_keycode(key, metastate = nil)
227+
# @!method press_keycode(key, metastate: [], flags: [])
228228
# Press keycode on the device.
229229
# http://developer.android.com/reference/android/view/KeyEvent.html
230-
# @param [integer] key The key to press.
231-
# @param [String] metastate The state the metakeys should be in when pressing the key.
230+
# @param [Integer] key The key to press. The values which have `KEYCODE_` prefix in http://developer.android.com/reference/android/view/KeyEvent.html
231+
# e.g.: KEYCODE_HOME is `3` or `0x00000003`
232+
# @param [[Integer]] metastate: The state the metakeys should be in when pressing the key. Default is empty Array.
233+
# Metastate have `META_` prefix in https://developer.android.com/reference/android/view/KeyEvent.html
234+
# e.g.: META_SHIFT_ON is `1` or `0x00000001`
235+
# @param [[Integer]] flags: Native Android flag value. Several flags can be combined into a single key event.
236+
# Default is empty Array. Can set multiple flags as Array.
237+
# Flags have `FLAG_` prefix in http://developer.android.com/reference/android/view/KeyEvent.html
238+
# e.g.: FLAG_CANCELED is `32` or `0x00000020`
232239
#
233240
# @example
234241
#
235-
# @driver.press_keycode 82
242+
# @driver.press_keycode 66
243+
# @driver.press_keycode 66, flags: [0x02]
244+
# @driver.press_keycode 66, metastate: [1], flags: [32]
236245
#
237246

238-
# @!method long_press_keycode(key, metastate = nil)
247+
# @!method long_press_keycode(key, metastate: [], flags: [])
239248
# Long press keycode on the device.
240249
# http://developer.android.com/reference/android/view/KeyEvent.html
241-
# @param [integer] key The key to long press.
242-
# @param [String] metastate The state the metakeys should be in when long pressing the key.
250+
# @param [Integer] key The key to long press. The values which have `KEYCODE_` prefix in http://developer.android.com/reference/android/view/KeyEvent.html
251+
# e.g.: KEYCODE_HOME is `3` or `0x00000003`
252+
# @param [[Integer]] metastate: The state the metakeys should be in when pressing the key. Default is empty Array.
253+
# Metastate have `META_` prefix in https://developer.android.com/reference/android/view/KeyEvent.html
254+
# e.g.: META_SHIFT_ON is `1` or `0x00000001`
255+
# @param [[Integer]] flags: Native Android flag value. Several flags can be combined into a single key event.
256+
# Default is empty Array. Can set multiple flags as Array.
257+
# Flags have `FLAG_` prefix in http://developer.android.com/reference/android/view/KeyEvent.html
258+
# e.g.: FLAG_CANCELED is `32` or `0x00000020`
243259
#
244260
# @example
245261
#
246-
# @driver.long_press_keycode 82
262+
# @driver.long_press_keycode 66
263+
# @driver.long_press_keycode 66, flags: [0x20, 0x2000]
264+
# @driver.long_press_keycode 66, metastate: [1], flags: [32, 8192]
247265
#
248266

249267
# @!method push_file(path, filedata)
@@ -739,17 +757,27 @@ def keyevent(key, metastate = nil)
739757
end
740758

741759
add_endpoint_method(:press_keycode) do
742-
def press_keycode(key, metastate = nil)
760+
def press_keycode(key, metastate: [], flags: [])
761+
raise ArgumentError, 'flags should be Array' unless flags.is_a? Array
762+
raise ArgumentError, 'metastates should be Array' unless metastate.is_a? Array
763+
743764
args = { keycode: key }
744-
args[:metastate] = metastate if metastate
765+
args[:metastate] = metastate.reduce(0) { |acc, meta| acc | meta } unless metastate.empty?
766+
args[:flags] = flags.reduce(0) { |acc, flag| acc | flag } unless flags.empty?
767+
745768
execute :press_keycode, {}, args
746769
end
747770
end
748771

749772
add_endpoint_method(:long_press_keycode) do
750-
def long_press_keycode(key, metastate = nil)
773+
def long_press_keycode(key, metastate: [], flags: [])
774+
raise ArgumentError, 'flags should be Array' unless flags.is_a? Array
775+
raise ArgumentError, 'metastates should be Array' unless metastate.is_a? Array
776+
751777
args = { keycode: key }
752-
args[:metastate] = metastate if metastate
778+
args[:metastate] = metastate.reduce(0) { |acc, meta| acc | meta } unless metastate.empty?
779+
args[:flags] = flags.reduce(0) { |acc, flag| acc | flag } unless flags.empty?
780+
753781
execute :long_press_keycode, {}, args
754782
end
755783
end

test/unit/android/device_test.rb

+58
Original file line numberDiff line numberDiff line change
@@ -395,24 +395,82 @@ def test_keyevent
395395
assert_requested(:post, "#{SESSION}/appium/device/keyevent", times: 1)
396396
end
397397

398+
# keypress
398399
def test_press_keycode
399400
stub_request(:post, "#{SESSION}/appium/device/press_keycode")
401+
.with(body: { keycode: 86 }.to_json)
400402
.to_return(headers: HEADER, status: 200, body: { value: '' }.to_json)
401403

402404
@driver.press_keycode 86
403405

404406
assert_requested(:post, "#{SESSION}/appium/device/press_keycode", times: 1)
405407
end
406408

409+
# keypress
410+
def test_press_keycode_with_flags
411+
stub_request(:post, "#{SESSION}/appium/device/press_keycode")
412+
.with(body: { keycode: 86, metastate: 2_097_153, flags: 44 }.to_json)
413+
.to_return(headers: HEADER, status: 200, body: { value: '' }.to_json)
414+
415+
# metastate is META_SHIFT_ON and META_NUM_LOCK_ON
416+
# flags is CANCELFLAG_CANCELEDED, FLAG_KEEP_TOUCH_MODE, FLAG_FROM_SYSTEM
417+
@driver.press_keycode 86, metastate: [0x00000001, 0x00200000], flags: [0x20, 0x00000004, 0x00000008]
418+
419+
assert_requested(:post, "#{SESSION}/appium/device/press_keycode", times: 1)
420+
end
421+
422+
# keypress
423+
def test_press_keycode_with_flags_with_wrong_flags
424+
assert_raises ArgumentError do
425+
@driver.press_keycode 86, flags: 0x02
426+
end
427+
end
428+
429+
# keypress
430+
def test_press_keycode_with_flags_with_wrong_metastate
431+
assert_raises ArgumentError do
432+
@driver.press_keycode 86, metastate: 0x02
433+
end
434+
end
435+
436+
# keypress
407437
def test_long_press_keycode
408438
stub_request(:post, "#{SESSION}/appium/device/long_press_keycode")
439+
.with(body: { keycode: 86 }.to_json)
409440
.to_return(headers: HEADER, status: 200, body: { value: '' }.to_json)
410441

411442
@driver.long_press_keycode 86
412443

413444
assert_requested(:post, "#{SESSION}/appium/device/long_press_keycode", times: 1)
414445
end
415446

447+
# keypress
448+
def test_long_press_keycodewith_flags
449+
stub_request(:post, "#{SESSION}/appium/device/long_press_keycode")
450+
.with(body: { keycode: 86, metastate: 1, flags: 36 }.to_json)
451+
.to_return(headers: HEADER, status: 200, body: { value: '' }.to_json)
452+
453+
# metastate is META_SHIFT_ON
454+
# flags is CANCELFLAG_CANCELEDED, FLAG_KEEP_TOUCH_MODE
455+
@driver.long_press_keycode 86, metastate: [1], flags: [32, 4]
456+
457+
assert_requested(:post, "#{SESSION}/appium/device/long_press_keycode", times: 1)
458+
end
459+
460+
# keypress
461+
def test_long_press_keycode_with_flags_with_wrong_flags
462+
assert_raises ArgumentError do
463+
@driver.long_press_keycode 86, flags: 0x02
464+
end
465+
end
466+
467+
# keypress
468+
def test_long_press_keycode_with_flags_with_wrong_metastate
469+
assert_raises ArgumentError do
470+
@driver.long_press_keycode 86, metastate: 0x02
471+
end
472+
end
473+
416474
def test_take_element_screenshot
417475
stub_request(:get, "#{SESSION}/element/id/screenshot")
418476
.to_return(headers: HEADER, status: 200, body: { value: '' }.to_json)

test/unit/android/device_w3c_test.rb

+58
Original file line numberDiff line numberDiff line change
@@ -394,24 +394,82 @@ def test_keyevent
394394
assert_requested(:post, "#{SESSION}/appium/device/keyevent", times: 1)
395395
end
396396

397+
# keypress
397398
def test_press_keycode
398399
stub_request(:post, "#{SESSION}/appium/device/press_keycode")
400+
.with(body: { keycode: 86 }.to_json)
399401
.to_return(headers: HEADER, status: 200, body: { value: '' }.to_json)
400402

401403
@driver.press_keycode 86
402404

403405
assert_requested(:post, "#{SESSION}/appium/device/press_keycode", times: 1)
404406
end
405407

408+
# keypress
409+
def test_press_keycode_with_flags
410+
stub_request(:post, "#{SESSION}/appium/device/press_keycode")
411+
.with(body: { keycode: 86, metastate: 2_097_153, flags: 44 }.to_json)
412+
.to_return(headers: HEADER, status: 200, body: { value: '' }.to_json)
413+
414+
# metastate is META_SHIFT_ON and META_NUM_LOCK_ON
415+
# flags is CANCELFLAG_CANCELEDED, FLAG_KEEP_TOUCH_MODE, FLAG_FROM_SYSTEM
416+
@driver.press_keycode 86, metastate: [0x00000001, 0x00200000], flags: [0x20, 0x00000004, 0x00000008]
417+
418+
assert_requested(:post, "#{SESSION}/appium/device/press_keycode", times: 1)
419+
end
420+
421+
# keypress
422+
def test_press_keycode_with_flags_with_wrong_flags
423+
assert_raises ArgumentError do
424+
@driver.press_keycode 86, flags: 0x02
425+
end
426+
end
427+
428+
# keypress
429+
def test_press_keycode_with_flags_with_wrong_metastate
430+
assert_raises ArgumentError do
431+
@driver.press_keycode 86, metastate: 0x02
432+
end
433+
end
434+
435+
# keypress
406436
def test_long_press_keycode
407437
stub_request(:post, "#{SESSION}/appium/device/long_press_keycode")
438+
.with(body: { keycode: 86 }.to_json)
408439
.to_return(headers: HEADER, status: 200, body: { value: '' }.to_json)
409440

410441
@driver.long_press_keycode 86
411442

412443
assert_requested(:post, "#{SESSION}/appium/device/long_press_keycode", times: 1)
413444
end
414445

446+
# keypress
447+
def test_long_press_keycodewith_flags
448+
stub_request(:post, "#{SESSION}/appium/device/long_press_keycode")
449+
.with(body: { keycode: 86, metastate: 1, flags: 36 }.to_json)
450+
.to_return(headers: HEADER, status: 200, body: { value: '' }.to_json)
451+
452+
# metastate is META_SHIFT_ON
453+
# flags is CANCELFLAG_CANCELEDED, FLAG_KEEP_TOUCH_MODE
454+
@driver.long_press_keycode 86, metastate: [1], flags: [32, 4]
455+
456+
assert_requested(:post, "#{SESSION}/appium/device/long_press_keycode", times: 1)
457+
end
458+
459+
# keypress
460+
def test_long_press_keycode_with_flags_with_wrong_flags
461+
assert_raises ArgumentError do
462+
@driver.long_press_keycode 86, flags: 0x02
463+
end
464+
end
465+
466+
# keypress
467+
def test_long_press_keycode_with_flags_with_wrong_metastate
468+
assert_raises ArgumentError do
469+
@driver.long_press_keycode 86, metastate: 0x02
470+
end
471+
end
472+
415473
def test_take_element_screenshot
416474
stub_request(:get, "#{SESSION}/element/id/screenshot")
417475
.to_return(headers: HEADER, status: 200, body: { value: '' }.to_json)

0 commit comments

Comments
 (0)