calabash 2.0.0.pre1 → 2.0.0.prelegacy2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -38
  3. data/lib/calabash.rb +18 -5
  4. data/lib/calabash/android.rb +3 -0
  5. data/lib/calabash/android/adb.rb +25 -1
  6. data/lib/calabash/android/application.rb +14 -3
  7. data/lib/calabash/android/build/builder.rb +15 -2
  8. data/lib/calabash/android/build/java_keystore.rb +10 -0
  9. data/lib/calabash/android/build/resigner.rb +4 -0
  10. data/lib/calabash/android/build/test_server.rb +2 -0
  11. data/lib/calabash/android/defaults.rb +1 -0
  12. data/lib/calabash/android/device.rb +42 -1
  13. data/lib/calabash/android/environment.rb +10 -0
  14. data/lib/calabash/android/interactions.rb +2 -0
  15. data/lib/calabash/android/legacy.rb +149 -0
  16. data/lib/calabash/android/lib/TestServer.apk +0 -0
  17. data/lib/calabash/android/life_cycle.rb +1 -0
  18. data/lib/calabash/android/physical_buttons.rb +8 -0
  19. data/lib/calabash/android/screenshot.rb +1 -0
  20. data/lib/calabash/android/scroll.rb +110 -0
  21. data/lib/calabash/android/server.rb +3 -1
  22. data/lib/calabash/android/text.rb +6 -0
  23. data/lib/calabash/application.rb +29 -0
  24. data/lib/calabash/cli/build.rb +15 -1
  25. data/lib/calabash/cli/console.rb +9 -5
  26. data/lib/calabash/cli/generate.rb +3 -0
  27. data/lib/calabash/cli/helpers.rb +7 -1
  28. data/lib/calabash/cli/resign.rb +1 -0
  29. data/lib/calabash/cli/run.rb +10 -6
  30. data/lib/calabash/cli/setup_keystore.rb +2 -0
  31. data/lib/calabash/color.rb +7 -0
  32. data/lib/calabash/defaults.rb +1 -0
  33. data/lib/calabash/device.rb +7 -0
  34. data/lib/calabash/environment.rb +1 -0
  35. data/lib/calabash/http/retriable_client.rb +2 -0
  36. data/lib/calabash/interactions.rb +1 -0
  37. data/lib/calabash/ios.rb +2 -0
  38. data/lib/calabash/ios/application.rb +8 -1
  39. data/lib/calabash/ios/conditions.rb +3 -0
  40. data/lib/calabash/ios/date_picker.rb +412 -0
  41. data/lib/calabash/ios/defaults.rb +1 -0
  42. data/lib/calabash/ios/device.rb +1 -0
  43. data/lib/calabash/ios/device/device_implementation.rb +16 -11
  44. data/lib/calabash/ios/device/ipad_1x_2x_mixin.rb +253 -0
  45. data/lib/calabash/ios/device/keyboard_mixin.rb +2 -0
  46. data/lib/calabash/ios/device/rotation_mixin.rb +1 -0
  47. data/lib/calabash/ios/device/routes/condition_route_mixin.rb +1 -0
  48. data/lib/calabash/ios/device/routes/map_route_mixin.rb +1 -0
  49. data/lib/calabash/ios/device/routes/response_parser.rb +1 -0
  50. data/lib/calabash/ios/device/routes/uia_route_mixin.rb +44 -6
  51. data/lib/calabash/ios/device/text_mixin.rb +2 -0
  52. data/lib/calabash/ios/device/uia_keyboard_mixin.rb +9 -0
  53. data/lib/calabash/ios/device/uia_mixin.rb +1 -0
  54. data/lib/calabash/ios/interactions.rb +30 -1
  55. data/lib/calabash/ios/runtime.rb +8 -0
  56. data/lib/calabash/ios/text.rb +5 -45
  57. data/lib/calabash/legacy.rb +7 -0
  58. data/lib/calabash/lib/skeleton/config/cucumber.yml +1 -3
  59. data/lib/calabash/lib/skeleton/features/support/env.rb +15 -1
  60. data/lib/calabash/life_cycle.rb +19 -2
  61. data/lib/calabash/location.rb +2 -0
  62. data/lib/calabash/page.rb +13 -0
  63. data/lib/calabash/patch.rb +1 -0
  64. data/lib/calabash/query_result.rb +4 -0
  65. data/lib/calabash/text.rb +53 -0
  66. data/lib/calabash/utility.rb +4 -4
  67. data/lib/calabash/version.rb +1 -1
  68. data/lib/calabash/wait.rb +4 -0
  69. metadata +119 -115
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c5f1a37cf3cb44cfb343b2824ad867a43b8ada5b
4
- data.tar.gz: 37184436097bcf66b89307857ccddb35e014ecbc
3
+ metadata.gz: 7eec9905c00a2b1822fe2023e350f2f62c419c0a
4
+ data.tar.gz: 6e04cfd68a0a182b63344fdf5656afc35613bf59
5
5
  SHA512:
6
- metadata.gz: 0737e9ced39e5c585a8a030f1072c537f456bcf3d08f3e11a92fc99c794677fa10f8cbde32a79266ad2dbe25b2081e4abc3c3bca924c9f3162b7f25d423c1d94
7
- data.tar.gz: 257460621c5e711e222e84e91f52c070da2ae1a12bda33386bd01ebb7148f9b9c5d05231dc3561bb4adee216f73f6d9bf14464dffdbebed5bfe8728fefc71cc0
6
+ metadata.gz: 8fb4d1de04c47649ceade147f1977eef6ce298c2f4216f0d0861bef340ed57bbc49dfac5626d0932bb4827629aa81989db7d5d51f640a1bc5cf4856ec391e2e8
7
+ data.tar.gz: 67fd7bdd4c7f84483ed9424ec9540e8acbff3add8dfc5ce4f5d3813c3507c38a4b49cc1ee50cbb41cd4cd72d90ebf72df97a14d6dd189ec1abaae652f039b1ef
data/README.md CHANGED
@@ -6,18 +6,6 @@
6
6
 
7
7
  Automated Acceptance Testing for Mobile Apps
8
8
 
9
- ## Initial workflow
10
-
11
- **TL;DR**
12
-
13
- ```
14
- $ cd calabash
15
- $ ./copy_repos.sh
16
- $ ./changing_old_files.sh
17
- ```
18
-
19
- Before Calabash is ready to be released, the old gems will exist outside version control. To make a change run the script `copy_repos.sh`. This will copy the Android and iOS repositories and extract them as files in the directory `old`. Then execute `changing_old_files.sh`. This script will move old files into their new directories. To make changes to "old files" e.g. move them, add your steps to `changing_old_files.sh` and execute it. To make code changes to old files, change them locally first to ensure they work. Then copy the change to the branch `united` on either iOS or Android. Commit the changes and push them upstream. `copy_repos.sh` will always download the newest files.
20
-
21
9
  ## Rake
22
10
 
23
11
  **TODO** Release instructions for Android and iOS.
@@ -27,8 +15,6 @@ $ rake -T
27
15
  rake android:build # Build the Android test server
28
16
  rake build # Build calabash-1.9.9.pre2.gem into the pkg directory
29
17
  rake ctags # Generate ctags in ./git/tags
30
- rake cucumber:android # Run Android cucumber tests
31
- rake cucumber:ios # Run iOS cucumber tests
32
18
  rake install # Build and install calabash-1.9.9.pre2.gem into system gems
33
19
  rake release # Create tag v1.9.9.pre2 and build and push calabash-1.9.9.pre2.gem to Rubygems
34
20
  rake spec # Run RSpec code examples
@@ -63,28 +49,5 @@ $ be cucumber
63
49
 
64
50
  ### Cucumber iOS
65
51
 
66
- ```
67
- $ cd cucumber/ios
68
- $ bundle update
69
- $ rake ensure_app # Optional. See note below.
70
- $ be cucumber
71
- ```
72
-
73
- The rake task `ensure_app` checks the `cucumber/ios` directory for
74
- CalSmoke-cal.app. If it exists, it will do nothing. If it does not exist,
75
- it will pull the latest sources from the CalSmoke repo, build the
76
- CalSmoke-cal.app from the master branch, and install it in the
77
- `cucumber/ios` directory.
78
-
79
- If you want to use a different CalSmoke-cal.app, drop it into `cucumber/ios`
80
- or call cucumber with `CAL\_APP` set.
81
-
82
- ```
83
- $ CAL_APP=/path/to/your/CalSmoke-cal.app be cucumber
84
- ```
85
-
86
- The rake task `ensure_ipa` does the same thing, but for the CalSmoke-cal.ipa.
87
-
88
- Testing against physical devices requires that you have ideviceinstaller
89
- installed in /usr/local/bin/ideviceinstaller.
52
+ See `cucumber/ios/README.md`.
90
53
 
data/lib/calabash.rb CHANGED
@@ -25,6 +25,7 @@ module Calabash
25
25
  require 'calabash/text'
26
26
  require 'calabash/interactions'
27
27
  require 'calabash/defaults'
28
+ require 'calabash/legacy'
28
29
  require 'calabash/console_helpers'
29
30
 
30
31
 
@@ -112,7 +113,6 @@ module Calabash
112
113
  raise ArgumentError, "Expected a 'Class', got '#{page_class.class}'"
113
114
  end
114
115
 
115
-
116
116
  page_name = page_class.name
117
117
  full_page_name = "#{platform_module}::#{page_name}"
118
118
 
@@ -120,6 +120,17 @@ module Calabash
120
120
  page_class = platform_module.const_get(page_name, false)
121
121
 
122
122
  if page_class.is_a?(Class)
123
+ modules = page_class.included_modules.map(&:to_s)
124
+
125
+ unless modules.include?("Calabash::#{platform_module}")
126
+ raise "Page '#{page_class}' does not include Calabash::#{platform_module}"
127
+ end
128
+
129
+ if modules.include?('Calabash::Android') &&
130
+ modules.include?('Calabash::IOS')
131
+ raise "Page '#{page_class}' includes both Calabash::Android and Calabash::IOS"
132
+ end
133
+
123
134
  page = page_class.send(:new, self)
124
135
 
125
136
  if page.is_a?(Calabash::Page)
@@ -241,6 +252,7 @@ module Calabash
241
252
  @@has_set_embedding_context
242
253
  end
243
254
 
255
+ # @!visibility private
244
256
  def self.new_embed_method(method)
245
257
  define_method(:embed) do |*args|
246
258
  method.call(*args)
@@ -249,6 +261,7 @@ module Calabash
249
261
  @@has_set_embedding_context = true
250
262
  end
251
263
 
264
+ # @!visibility private
252
265
  def embed(*_)
253
266
  Logger.warn 'Embed is not available in this context. Will not embed.'
254
267
  end
@@ -264,9 +277,9 @@ unless Object.const_defined?(:IOS)
264
277
  end
265
278
 
266
279
  if Calabash::Environment::DEBUG_CALLED_METHODS
267
- $stdout.puts "#{Calabash::Color.red("Will print every Calabash method called!")}"
268
- $stdout.puts "#{Calabash::Color.red("Warning: This might slow down your test drastically")}"
269
- $stdout.puts "#{Calabash::Color.red("and is an experimental feature.")}"
280
+ $stdout.puts "#{Calabash::Color.red('Will print every Calabash method called!')}"
281
+ $stdout.puts "#{Calabash::Color.red('Warning: This might slow down your test drastically')}"
282
+ $stdout.puts "#{Calabash::Color.red('and is an experimental feature.')}"
270
283
 
271
284
  calabash_file = Calabash.method(:extended).source_location.first
272
285
  $__calabash_dir_name = File.dirname(calabash_file)
@@ -274,7 +287,7 @@ if Calabash::Environment::DEBUG_CALLED_METHODS
274
287
  trace_func = lambda do |event, file, line, id, binding, classname|
275
288
  if event == 'call'
276
289
  if classname.to_s.split('::').first == 'Calabash'
277
- binding_caller_locations = binding.eval("caller_locations")
290
+ binding_caller_locations = binding.eval('caller_locations')
278
291
  files = binding_caller_locations[3..-1].map(&:path)
279
292
 
280
293
  calabash_not_in_stacktrace = files.none? do |file|
@@ -38,6 +38,8 @@ module Calabash
38
38
  require 'calabash/android/text'
39
39
  require 'calabash/android/console_helpers'
40
40
  require 'calabash/android/life_cycle'
41
+ require 'calabash/android/scroll'
42
+ require 'calabash/android/legacy'
41
43
 
42
44
  include Calabash::Android::Gestures
43
45
  include Calabash::Android::Interactions
@@ -45,6 +47,7 @@ module Calabash
45
47
  include Calabash::Android::Orientation
46
48
  include Calabash::Android::PhysicalButtons
47
49
  include Calabash::Android::Text
50
+ include Calabash::Android::Scroll
48
51
 
49
52
  # @!visibility private
50
53
  def self.binary_location(name, abi, using_pie)
@@ -17,8 +17,10 @@ module Calabash
17
17
  end
18
18
  end
19
19
 
20
+ # @!visibility private
20
21
  PROCESS_WAIT_TIME = 10
21
22
 
23
+ # @!visibility private
22
24
  def self.open_pipe_with_timeout(timeout, *cmd, &block)
23
25
  begin
24
26
  i, o, e, t, pid = nil
@@ -52,6 +54,7 @@ module Calabash
52
54
  end
53
55
  end
54
56
 
57
+ # @!visibility private
55
58
  def self.open_adb_pipe(*cmd, **options, &block)
56
59
  timeout = options.fetch(:timeout, PROCESS_WAIT_TIME)
57
60
 
@@ -60,11 +63,23 @@ module Calabash
60
63
  end
61
64
  end
62
65
 
66
+ # @!visibility private
63
67
  DAEMON_STARTED_MESSAGE = "* daemon not running. starting it now on port 5037 *\n* daemon started successfully *\n"
64
68
 
65
69
  def self.command(*cmd, **args)
66
70
  Logger.debug("ADB Command: #{cmd.join(', ')}")
67
71
  Logger.debug("ADB input: #{args[:input]}")
72
+
73
+ cmd_s = "#{Environment.adb_path} #{cmd.join(' ')}"
74
+
75
+ Logger.debug("Going to execute: #{cmd_s}")
76
+ `#{cmd_s}`
77
+ end
78
+
79
+ # @!visibility private
80
+ def self.old_command(*cmd, **args)
81
+ Logger.debug("ADB Command: #{cmd.join(', ')}")
82
+ Logger.debug("ADB input: #{args[:input]}")
68
83
  stderr = nil
69
84
  stdout = nil
70
85
  exit_code = nil
@@ -121,10 +136,12 @@ module Calabash
121
136
 
122
137
  attr_reader :serial
123
138
 
139
+ # @!visibility private
124
140
  def initialize(serial)
125
141
  @serial = serial
126
142
  end
127
143
 
144
+ # @!visibility private
128
145
  def command(*argv, **args)
129
146
  cmd = argv.dup
130
147
 
@@ -135,9 +152,16 @@ module Calabash
135
152
  ADB.command(*cmd, args)
136
153
  end
137
154
 
155
+ # @!visibility private
156
+ def shell(shell_cmd, options={})
157
+ command('shell', shell_cmd)
158
+ end
159
+
160
+ # @!visibility private
138
161
  END_STRING = '__CAL_END__'
139
162
 
140
- def shell(shell_cmd, options={})
163
+ # @!visibility private
164
+ def old_shell(shell_cmd, options={})
141
165
  if shell_cmd.nil? || shell_cmd.empty?
142
166
  raise ArgumentError, "Invalid shell command '#{shell_cmd}'"
143
167
  end
@@ -8,7 +8,7 @@ module Calabash
8
8
  application_path = Environment::APP_PATH
9
9
 
10
10
  if application_path.nil?
11
- raise 'No application path is set'
11
+ raise 'No application path is set. Specify application with environment variable CAL_APP'
12
12
  end
13
13
 
14
14
  unless File.exist?(application_path)
@@ -20,8 +20,12 @@ module Calabash
20
20
  end
21
21
 
22
22
  build_test_server = Build::TestServer.new(application_path)
23
- test_server_path = Environment::TEST_SERVER_PATH ||
24
- build_test_server.path
23
+ test_server_path = Environment::TEST_SERVER_PATH
24
+
25
+ unless test_server_path
26
+ test_server_path = build_test_server.path
27
+ Logger.info "No test-server specified. Defaulting to path '#{test_server_path}'"
28
+ end
25
29
 
26
30
  unless File.exist?(test_server_path)
27
31
  Logger.error "Test-server '#{test_server_path}' does not exist."
@@ -38,6 +42,13 @@ module Calabash
38
42
  @test_server = Application.new(test_server_path, nil, options) if test_server_path
39
43
  end
40
44
 
45
+ # Is this application an android application
46
+ #
47
+ # @return [Boolean] Always returns true
48
+ def android_application?
49
+ true
50
+ end
51
+
41
52
  def extract_identifier
42
53
  package_line = aapt_dump('package').first
43
54
  raise "'package' not found in aapt output" unless package_line
@@ -16,7 +16,8 @@ module Calabash
16
16
  end
17
17
  end
18
18
 
19
- def build
19
+ # @!visibility private
20
+ def build(out_file = nil)
20
21
  apk_fingerprint = fingerprint_from_apk
21
22
  @logger.log "#{@application_path} was signed with a certificate with fingerprint #{apk_fingerprint}", :debug
22
23
 
@@ -48,7 +49,7 @@ module Calabash
48
49
 
49
50
  application = Calabash::Application.from_path(@application_path)
50
51
 
51
- test_server_file_name = TestServer.new(@application_path).path
52
+ test_server_file_name = out_file || TestServer.new(@application_path).path
52
53
  FileUtils.mkdir_p File.dirname(test_server_file_name) unless File.exist? File.dirname(test_server_file_name)
53
54
 
54
55
  Dir.mktmpdir do |workspace_dir|
@@ -69,6 +70,17 @@ module Calabash
69
70
 
70
71
  Zip::File.new("dummy.apk").extract("AndroidManifest.xml","customAndroidManifest.xml")
71
72
  Zip::File.open("TestServer.apk") do |zip_file|
73
+ begin
74
+ check_file("AndroidManifest.xml")
75
+ manifest_exists = true
76
+ rescue
77
+ manifest_exists = false
78
+ end
79
+
80
+ if manifest_exists
81
+ zip_file.remove("AndroidManifest.xml")
82
+ end
83
+
72
84
  zip_file.add("AndroidManifest.xml", "customAndroidManifest.xml")
73
85
  end
74
86
  end
@@ -83,6 +95,7 @@ module Calabash
83
95
  @logger.log "Done signing the test server. Moved it to #{test_server_file_name}"
84
96
  end
85
97
 
98
+ # @!visibility private
86
99
  def fingerprint_from_apk
87
100
  application_path = File.expand_path(@application_path)
88
101
 
@@ -5,6 +5,7 @@ module Calabash
5
5
  module Build
6
6
  # @!visibility private
7
7
  class JavaKeystore
8
+ # @!visibility private
8
9
  CALABASH_KEYSTORE_SETTINGS_FILENAME = 'calabash_keystore_settings.json'
9
10
 
10
11
  attr_reader :errors, :location, :keystore_alias, :store_password
@@ -68,6 +69,7 @@ module Calabash
68
69
  @logger.log "Signature algorithm name: #{signature_algorithm_name}", :debug
69
70
  end
70
71
 
72
+ # @!visibility private
71
73
  def sign_apk(apk_path, dest_path)
72
74
  raise "Cannot sign with a miss configured keystore" if errors
73
75
  raise "No such file: #{apk_path}" unless File.exists?(apk_path)
@@ -86,6 +88,7 @@ module Calabash
86
88
  end
87
89
  end
88
90
 
91
+ # @!visibility private
89
92
  def system_with_stdout_on_success(cmd, *args)
90
93
  a = Escape.shell_command(args)
91
94
  cmd = "#{cmd} #{a.gsub("'", '"')}"
@@ -98,10 +101,12 @@ module Calabash
98
101
  end
99
102
  end
100
103
 
104
+ # @!visibility private
101
105
  def fail_wrong_info
102
106
  raise "Could not read keystore with the given credentials. Please ensure "
103
107
  end
104
108
 
109
+ # @!visibility private
105
110
  def self.read_keystore_with_default_password_and_alias(path)
106
111
  path = File.expand_path path
107
112
 
@@ -128,6 +133,7 @@ module Calabash
128
133
  end
129
134
  end
130
135
 
136
+ # @!visibility private
131
137
  def self.get_keystores
132
138
  if keystore = keystore_from_settings
133
139
  [ keystore ]
@@ -141,6 +147,7 @@ module Calabash
141
147
  end
142
148
  end
143
149
 
150
+ # @!visibility private
144
151
  def self.keystore_from_settings
145
152
  if File.exist?(CALABASH_KEYSTORE_SETTINGS_FILENAME)
146
153
  Logger.info "Reading keystore information specified in #{CALABASH_KEYSTORE_SETTINGS_FILENAME}"
@@ -157,16 +164,19 @@ module Calabash
157
164
  end
158
165
  end
159
166
 
167
+ # @!visibility private
160
168
  def self.fail_if_key_missing(map, key)
161
169
  raise "Found #{CALABASH_KEYSTORE_SETTINGS_FILENAME} but no #{key} defined." unless map[key]
162
170
  end
163
171
 
172
+ # @!visibility private
164
173
  def self.extract_md5_fingerprint(fingerprints)
165
174
  m = fingerprints.scan(/MD5.*((?:[a-fA-F\d]{2}:){15}[a-fA-F\d]{2})/).flatten
166
175
  raise "No MD5 fingerprint found:\n #{fingerprints}" if m.empty?
167
176
  m.first
168
177
  end
169
178
 
179
+ # @!visibility private
170
180
  def self.extract_signature_algorithm_name(fingerprints)
171
181
  m = fingerprints.scan(/Signature algorithm name: (.*)/).flatten
172
182
  raise "No signature algorithm names found:\n #{fingerprints}" if m.empty?
@@ -14,6 +14,7 @@ module Calabash
14
14
  end
15
15
  end
16
16
 
17
+ # @!visibility private
17
18
  def resign!
18
19
  Dir.mktmpdir do |tmp_dir|
19
20
  @logger.log 'Resigning apk', :debug
@@ -26,6 +27,7 @@ module Calabash
26
27
  end
27
28
  end
28
29
 
30
+ # @!visibility private
29
31
  def unsign(unsigned_path)
30
32
  meta_files = `"#{Environment.aapt_path}" list "#{unsigned_path}"`.lines.collect(&:strip).grep(/^META-INF\//)
31
33
 
@@ -53,12 +55,14 @@ module Calabash
53
55
  end
54
56
  end
55
57
 
58
+ # @!visibility private
56
59
  def zipalign(unaligned_path, app_path)
57
60
  cmd = %Q("#{Environment.zipalign_path}" -f 4 "#{unaligned_path}" "#{app_path}")
58
61
  @logger.log "Zipaligning using: #{cmd}", :debug
59
62
  system(cmd)
60
63
  end
61
64
 
65
+ # @!visibility private
62
66
  def sign(app_path, dest_path)
63
67
  java_keystore = JavaKeystore.get_keystores.first
64
68
 
@@ -7,10 +7,12 @@ module Calabash
7
7
  @application_path = application_path
8
8
  end
9
9
 
10
+ # @!visibility private
10
11
  def path
11
12
  File.expand_path("test_servers/#{checksum(@application_path)}_#{VERSION}.apk")
12
13
  end
13
14
 
15
+ # @!visibility private
14
16
  def exists?
15
17
  File.exists?(path)
16
18
  end
@@ -1,5 +1,6 @@
1
1
  module Calabash
2
2
  module Android
3
+ # Runtime defaults for Android.
3
4
  module Defaults
4
5
  # Sets up the default device and the default application based on the
5
6
  # environment.
@@ -22,6 +22,7 @@ module Calabash
22
22
  port_forward(new_server.endpoint.port, new_server.test_server_port)
23
23
  end
24
24
 
25
+ # @!visibility private
25
26
  def self.default_serial
26
27
  serials = list_serials
27
28
 
@@ -46,6 +47,7 @@ module Calabash
46
47
  end
47
48
  end
48
49
 
50
+ # @!visibility private
49
51
  def self.list_serials
50
52
  output = ADB.command('devices')
51
53
  lines = output.lines
@@ -62,12 +64,14 @@ module Calabash
62
64
  end
63
65
  end
64
66
 
67
+ # @!visibility private
65
68
  def installed_packages
66
69
  adb.shell('pm list packages').lines.map do |line|
67
70
  line.sub('package:', '').chomp
68
71
  end
69
72
  end
70
73
 
74
+ # @!visibility private
71
75
  def installed_apps
72
76
  adb.shell('pm list packages -f').lines.map do |line|
73
77
  # line will be package:<path>=<package>
@@ -80,6 +84,7 @@ module Calabash
80
84
  end
81
85
  end
82
86
 
87
+ # @!visibility private
83
88
  def test_server_responding?
84
89
  begin
85
90
  http_client.get(HTTP::Request.new('ping'), retries: 1).body == 'pong'
@@ -88,6 +93,7 @@ module Calabash
88
93
  end
89
94
  end
90
95
 
96
+ # @!visibility private
91
97
  def test_server_ready?
92
98
  begin
93
99
  http_client.get(HTTP::Request.new('ready')).body == 'true'
@@ -96,6 +102,7 @@ module Calabash
96
102
  end
97
103
  end
98
104
 
105
+ # @!visibility private
99
106
  def port_forward(host_port, test_server_port = nil)
100
107
  if test_server_port.nil?
101
108
  test_server_port = server.test_server_port
@@ -105,6 +112,7 @@ module Calabash
105
112
  adb.command(*adb_forward_cmd)
106
113
  end
107
114
 
115
+ # @!visibility private
108
116
  def make_map_parameters(query, map_method_name, *method_args)
109
117
  converted_args = []
110
118
 
@@ -172,6 +180,7 @@ module Calabash
172
180
  Calabash::QueryResult.create(result['results'], query)
173
181
  end
174
182
 
183
+ # @!visibility private
175
184
  def perform_action(action, *arguments)
176
185
  @logger.log "Action: #{action} - Arguments: #{arguments.join(', ')}"
177
186
 
@@ -197,10 +206,12 @@ module Calabash
197
206
  result
198
207
  end
199
208
 
209
+ # @!visibility private
200
210
  def enter_text(text)
201
211
  perform_action('keyboard_enter_text', text)
202
212
  end
203
213
 
214
+ # @!visibility private
204
215
  def md5_checksum(file_path)
205
216
  result = adb.shell("#{md5_binary} '#{file_path}'")
206
217
  captures = result.match(/(\w+)/).captures
@@ -234,15 +245,41 @@ module Calabash
234
245
  result['result']
235
246
  end
236
247
 
248
+
249
+ # @!visibility private
250
+ def keyboard_visible?
251
+ input_method = adb.shell("dumpsys input_method")
252
+ input_method.lines.each do |line|
253
+ match = line.match(/mInputShown\s*=\s*(.*)/)
254
+
255
+ if match && match.captures.length != 0
256
+ shown = match.captures.first.chomp
257
+
258
+ if shown == "true"
259
+ return true
260
+ elsif shown == "false"
261
+ return false
262
+ else
263
+ raise "Could not detect keyboard visibility. '#{shown}'"
264
+ end
265
+ end
266
+ end
267
+
268
+ raise "Could not detect keyboard visibility. Could not find 'mInputShown'"
269
+ end
270
+
271
+ # @!visibility private
237
272
  def go_home
238
273
  adb.shell("input keyevent 3")
239
274
  end
240
275
 
276
+ # @!visibility private
241
277
  def set_location(location)
242
278
  perform_action('set_gps_coordinates',
243
279
  location[:latitude], location[:longitude])
244
280
  end
245
281
 
282
+ # @!visibility private
246
283
  def resume_app(path_or_application)
247
284
  application = parse_path_or_app_parameters(path_or_application)
248
285
 
@@ -263,6 +300,7 @@ module Calabash
263
300
  true
264
301
  end
265
302
 
303
+ # @!visibility private
266
304
  def resume_activity(package, activity)
267
305
  if package_running?(package)
268
306
  if info[:sdk_version] >= 11
@@ -279,12 +317,14 @@ module Calabash
279
317
  end
280
318
  end
281
319
 
320
+ # @!visibility private
282
321
  def app_running?(path_or_application)
283
322
  application = parse_path_or_app_parameters(path_or_application)
284
323
 
285
324
  package_running?(application.identifier)
286
325
  end
287
326
 
327
+ # @!visibility private
288
328
  def current_focus
289
329
  # Example: mFocusedApp=AppWindowToken{42c52610 token=Token{42b5d048 ActivityRecord{42a7bcc8 u0 com.example/.MainActivity t3}}}
290
330
  result = adb.shell('dumpsys window windows')
@@ -314,6 +354,7 @@ module Calabash
314
354
  raise "Unexpected output from `dumpsys window windows`"
315
355
  end
316
356
 
357
+ # @!visibility private
317
358
  def evaluate_javascript_in(query, javascript)
318
359
  parameters =
319
360
  {
@@ -705,7 +746,7 @@ module Calabash
705
746
  installed_app_md5_checksum = md5_checksum(installed_app[:path])
706
747
 
707
748
  if application.md5_checksum != installed_app_md5_checksum
708
- @logger.log("The md5 checksum has changed (#{application.md5_checksum} != #{installed_app_md5_checksum}.", :info)
749
+ @logger.log("The md5 checksum has changed (#{application.md5_checksum} != #{installed_app_md5_checksum}).", :info)
709
750
  _install_app(application)
710
751
  end
711
752
  else