Module: Calabash::Android::TouchHelpers

Includes:
Gestures
Included in:
Operations
Defined in:
lib/calabash-android/touch_helpers.rb

Instance Method Summary collapse

Instance Method Details

#double_tap(query_string, options = {}) ⇒ Object



34
35
36
37
38
39
40
41
42
# File 'lib/calabash-android/touch_helpers.rb', line 34

def double_tap(query_string, options={})
  if query_result?(query_string)
    center_x, center_y = find_coordinate(query_string, options)

    perform_action("double_tap_coordinate", center_x, center_y)
  else
    execute_gesture(Gesture.with_parameters(Gesture.double_tap(options), {query_string: query_string}.merge(options)))
  end
end

#drag(*args) ⇒ Object



64
65
66
# File 'lib/calabash-android/touch_helpers.rb', line 64

def drag(*args)
  pan(*args)
end

#execute_gesture(multi_touch_gesture) ⇒ Object



6
7
8
9
10
11
12
# File 'lib/calabash-android/touch_helpers.rb', line 6

def execute_gesture(multi_touch_gesture)
  result = JSON.parse(http("/gesture", JSON.parse(multi_touch_gesture.to_json), read_timeout: multi_touch_gesture.timeout+10))

  if result['outcome'] != 'SUCCESS'
    raise "Failed to perform gesture. #{result['reason']}"
  end
end

#find_coordinate(uiquery, options = {}) ⇒ Object



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/calabash-android/touch_helpers.rb', line 120

def find_coordinate(uiquery, options={})
  raise "Cannot find nil" unless uiquery

  element = execute_uiquery(uiquery)

  raise "No elements found. Query: #{uiquery}" if element.nil?

  x = element["rect"]["center_x"]
  y = element["rect"]["center_y"]

  if options[:offset]
    x += options[:offset][:x] || 0
    y += options[:offset][:y] || 0
  end

  [x, y]
end

#flick(query_string, direction, options = {}) ⇒ Object



104
105
106
# File 'lib/calabash-android/touch_helpers.rb', line 104

def flick(query_string, direction, options={})
  execute_gesture(Gesture.with_parameters(Gesture.swipe(direction, {flick: true}.merge(options)), {query_string: query_string}.merge(options)))
end

#flick_down(options = {}) ⇒ Object



100
101
102
# File 'lib/calabash-android/touch_helpers.rb', line 100

def flick_down(options={})
  flick("* id:'content'", :down, options)
end

#flick_left(options = {}) ⇒ Object



88
89
90
# File 'lib/calabash-android/touch_helpers.rb', line 88

def flick_left(options={})
  flick("DecorView", :left, options)
end

#flick_right(options = {}) ⇒ Object



92
93
94
# File 'lib/calabash-android/touch_helpers.rb', line 92

def flick_right(options={})
  flick("DecorView", :right, options)
end

#flick_up(options = {}) ⇒ Object



96
97
98
# File 'lib/calabash-android/touch_helpers.rb', line 96

def flick_up(options={})
  flick("* id:'content'", :up, options)
end

#long_press(query_string, options = {}) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/calabash-android/touch_helpers.rb', line 44

def long_press(query_string, options={})
  if query_result?(query_string)
    center_x, center_y = find_coordinate(query_string, options)
    length = options[:length]

    perform_action("long_press_coordinate", center_x, center_y, *(length unless length.nil?))
  else
    length = options[:length]

    if length
      puts "Using the length key is deprecated. Use 'time' (in seconds) instead."
      options[:time] = length/1000.0
    end

    options[:time] ||= 1

    touch(query_string, options)
  end
end

#long_press_when_element_exists(query_string, options = {}) ⇒ Object



148
149
150
151
152
153
154
155
156
# File 'lib/calabash-android/touch_helpers.rb', line 148

def long_press_when_element_exists(query_string, options={})
  options.merge!({action: lambda {|q| long_press(q, options)}})

  if options[:scroll] == true
    scroll_to(query_string, options)
  else
    when_element_exists(query_string, options)
  end
end

#pan(query_string, direction, options = {}) ⇒ Object



84
85
86
# File 'lib/calabash-android/touch_helpers.rb', line 84

def pan(query_string, direction, options={})
  execute_gesture(Gesture.with_parameters(Gesture.swipe(direction, options), {query_string: query_string}.merge(options)))
end

#pan_down(options = {}) ⇒ Object



80
81
82
# File 'lib/calabash-android/touch_helpers.rb', line 80

def pan_down(options={})
  pan("* id:'content'", :down, options)
end

#pan_left(options = {}) ⇒ Object



68
69
70
# File 'lib/calabash-android/touch_helpers.rb', line 68

def pan_left(options={})
  pan("DecorView", :left, options)
end

#pan_right(options = {}) ⇒ Object



72
73
74
# File 'lib/calabash-android/touch_helpers.rb', line 72

def pan_right(options={})
  pan("DecorView", :right, options)
end

#pan_up(options = {}) ⇒ Object



76
77
78
# File 'lib/calabash-android/touch_helpers.rb', line 76

def pan_up(options={})
  pan("* id:'content'", :up, options)
end

#pinch(query_string, direction, options = {}) ⇒ Object



116
117
118
# File 'lib/calabash-android/touch_helpers.rb', line 116

def pinch(query_string, direction, options={})
  execute_gesture(Gesture.with_parameters(Gesture.pinch(direction, options), {query_string: query_string}.merge(options)))
end

#pinch_in(options = {}) ⇒ Object



112
113
114
# File 'lib/calabash-android/touch_helpers.rb', line 112

def pinch_in(options={})
  pinch("* id:'content'", :in, options)
end

#pinch_out(options = {}) ⇒ Object



108
109
110
# File 'lib/calabash-android/touch_helpers.rb', line 108

def pinch_out(options={})
  pinch("* id:'content'", :out, options)
end

#query_result?(uiquery) ⇒ Boolean

Returns:

  • (Boolean)


158
159
160
161
162
163
164
165
166
# File 'lib/calabash-android/touch_helpers.rb', line 158

def query_result?(uiquery)
  element = if uiquery.is_a?(Array)
    uiquery.first
  else
    uiquery
  end

  element.is_a?(Hash) && element.has_key?('rect') && element['rect'].has_key?('center_x') && element['rect'].has_key?('center_y')
end

#tap(mark, *args) ⇒ Object



14
15
16
17
18
# File 'lib/calabash-android/touch_helpers.rb', line 14

def tap(mark, *args)
  puts "Warning: The method tap is deprecated. Use tap_mark instead. In later Calabash versions we will change the semantics of `tap` to take a general query."

  tap_mark(mark, *args)
end

#tap_mark(mark, *args) ⇒ Object



20
21
22
# File 'lib/calabash-android/touch_helpers.rb', line 20

def tap_mark(mark, *args)
  touch("* marked:'#{mark}'", *args)
end

#tap_when_element_exists(query_string, options = {}) ⇒ Object



138
139
140
141
142
143
144
145
146
# File 'lib/calabash-android/touch_helpers.rb', line 138

def tap_when_element_exists(query_string, options={})
  options.merge!({action: lambda {|q| touch(q, options)}})

  if options[:scroll] == true
    scroll_to(query_string, options)
  else
    when_element_exists(query_string, options)
  end
end

#touch(query_string, options = {}) ⇒ Object



24
25
26
27
28
29
30
31
32
# File 'lib/calabash-android/touch_helpers.rb', line 24

def touch(query_string, options={})
  if query_result?(query_string)
    center_x, center_y = find_coordinate(query_string, options)

    perform_action("touch_coordinate", center_x, center_y)
  else
    execute_gesture(Gesture.with_parameters(Gesture.tap(options), {query_string: query_string}.merge(options)))
  end
end