ruboto 0.11.0 → 0.12.0.rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. data/Gemfile.lock +1 -1
  2. data/README.md +7 -5
  3. data/Rakefile +3 -4
  4. data/assets/rakelib/ruboto.rake +138 -87
  5. data/assets/samples/sample_broadcast_receiver.rb +1 -1
  6. data/assets/src/InheritingActivity.java +0 -6
  7. data/assets/src/RubotoActivity.java +4 -1
  8. data/assets/src/RubotoBroadcastReceiver.java +2 -11
  9. data/assets/src/RubotoService.java +6 -52
  10. data/assets/src/org/ruboto/EntryPointActivity.java +276 -36
  11. data/assets/src/org/ruboto/JRubyAdapter.java +5 -152
  12. data/assets/src/org/ruboto/Script.java +1 -1
  13. data/assets/src/org/ruboto/ScriptLoader.java +26 -44
  14. data/assets/src/org/ruboto/test/InstrumentationTestRunner.java +4 -21
  15. data/bin/ruboto +0 -6
  16. data/lib/ruboto/commands/base.rb +58 -48
  17. data/lib/ruboto/sdk_locations.rb +23 -0
  18. data/lib/ruboto/sdk_versions.rb +1 -19
  19. data/lib/ruboto/util/build.rb +32 -32
  20. data/lib/ruboto/util/setup.rb +240 -0
  21. data/lib/ruboto/util/update.rb +12 -25
  22. data/lib/ruboto/util/verify.rb +7 -4
  23. data/lib/ruboto/util/xml_element.rb +62 -76
  24. data/lib/ruboto/version.rb +1 -1
  25. data/test/activity/image_button_activity_test.rb +2 -2
  26. data/test/activity/image_button_and_button_activity_test.rb +2 -2
  27. data/test/activity/json_activity.rb +1 -1
  28. data/test/activity/navigation_activity.rb +12 -12
  29. data/test/activity/navigation_activity_test.rb +7 -7
  30. data/test/activity/option_menu_activity.rb +0 -1
  31. data/test/activity/option_menu_activity_test.rb +2 -2
  32. data/test/activity/stack_activity_test.rb +10 -20
  33. data/test/app_test_methods.rb +0 -4
  34. data/test/broadcast_receiver_test.rb +16 -6
  35. data/test/minimal_app_test.rb +4 -12
  36. data/test/rake_test.rb +37 -23
  37. data/test/ruboto_gen_test.rb +12 -15
  38. data/test/sqldroid_test.rb +3 -6
  39. data/test/test_helper.rb +2 -0
  40. data/test/update_test_methods.rb +9 -9
  41. metadata +7 -11
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruboto (0.11.0)
4
+ ruboto (0.12.0.dev)
5
5
  main (>= 4.7.2)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -42,7 +42,7 @@ Command-line Tools
42
42
  ### Application generator
43
43
 
44
44
  $ ruboto gen app --package com.yourdomain.whatever --path path/to/where/you/want/the/app --name NameOfApp --target android-version --min-sdk another-android-version --activity MainActivityName
45
- Version values must be specified using'android-' and the sdk level number (e.g., android-8 is froyo).
45
+ Version values must be specified using'android-' and the sdk level number (e.g., android-10 is gingerbread).
46
46
 
47
47
  <a name="class_generator"></a>
48
48
  ### Class generator
@@ -165,7 +165,7 @@ You generate an app with the option `--activity FooActivity`, which means that r
165
165
 
166
166
  The arguments passed to the methods are the same as the arguments that the java methods take. Consult the Android documentation.
167
167
 
168
- Activities also have some special methods defined to make things easier. The easiest way to get an idea of what they are is looking over the [demo scripts](http://github.com/ruboto/ruboto-irb/tree/master/assets/demo-scripts/). You can also read the [ruboto.rb file](http://github.com/ruboto/ruboto/blob/master/assets/src/ruboto.rb) where everything is defined.
168
+ Activities also have some special methods defined to make things easier. The easiest way to get an idea of what they are is looking over the [demo scripts](http://github.com/ruboto/ruboto-irb/tree/master/assets/demo-scripts/). You can also read the [ruboto.rb file](http://github.com/ruboto/ruboto-irb/blob/master/src/ruboto.rb) where everything is defined.
169
169
 
170
170
  Testing
171
171
  -------
@@ -231,12 +231,14 @@ Tips & Tricks
231
231
 
232
232
  ### Emulators
233
233
 
234
+ You can start an emulator corresponding to the api level of your project with `rake emulator`. The emulator will be created for you and will be called after the android version of you rproject, like "Android_4.0.3".
235
+
234
236
  If you're doing a lot of Android development, you'll probably find yourself typing `emulator -avd name_of_emulator` a lot to open emulators. It can be convenient to alias these to shorter commands.
235
237
 
236
238
  For example, in your `~/.bashrc`, `~/.zshrc`, or similar file, you might put
237
- alias eclair="emulator -avd eclair"
238
- alias froyo="emulator -avd froyo"
239
- If you have an "eclair" emulator that runs Android 2.1 and a "froyo" one that runs Android 2.2.
239
+ alias ics="emulator -avd Android_4.0.3"
240
+ alias jellyb="emulator -avd Android_4.1.2"
241
+ If you have an "Android_4.0.3" emulator that runs Android 4..0.1 and a "Android_4.1.2" one that runs Android 4.1.2.
240
242
 
241
243
 
242
244
  Alternatives
data/Rakefile CHANGED
@@ -4,6 +4,7 @@ require 'rexml/document'
4
4
  require 'ruboto/version'
5
5
  require 'ruboto/description'
6
6
  require 'ruboto/sdk_versions'
7
+ require 'ruboto/sdk_locations'
7
8
  require 'uri'
8
9
  require 'net/https'
9
10
 
@@ -15,7 +16,7 @@ PLATFORM_CURRENT_RELEASE_APK = File.expand_path('tmp/RubotoCore-release.apk', Fi
15
16
  MANIFEST_FILE = 'AndroidManifest.xml'
16
17
  GEM_FILE = "ruboto-#{Ruboto::VERSION}.gem"
17
18
  GEM_SPEC_FILE = 'ruboto.gemspec'
18
- EXAMPLE_FILE = File.expand_path("examples/RubotoTestApp_#{Ruboto::VERSION}_tools_r#{Ruboto::SdkVersions::ANDROID_TOOLS_REVISION}.tgz", File.dirname(__FILE__))
19
+ EXAMPLE_FILE = File.expand_path("examples/RubotoTestApp_#{Ruboto::VERSION}_tools_r#{Ruboto::SdkLocations::ANDROID_TOOLS_REVISION}.tgz", File.dirname(__FILE__))
19
20
 
20
21
  CLEAN.include('ruboto-*.gem', 'tmp')
21
22
 
@@ -330,11 +331,9 @@ namespace :platform do
330
331
  desc 'Download the current RubotoCore platform release apk'
331
332
  file PLATFORM_CURRENT_RELEASE_APK do
332
333
  puts 'Downloading the current RubotoCore platform release apk'
333
- uri = URI('https://raw.github.com/ruboto/ruboto-core/master/dist/RubotoCore-release.apk')
334
+ uri = URI('http://ruboto.org/downloads/RubotoCore-release.apk')
334
335
  begin
335
336
  http = Net::HTTP.new(uri.host, uri.port)
336
- http.use_ssl = true
337
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
338
337
  content = http.request(Net::HTTP::Get.new(uri.request_uri)).body
339
338
  File.open(PLATFORM_CURRENT_RELEASE_APK, 'w') { |f| f << content }
340
339
  rescue Exception, SystemExit
@@ -4,6 +4,7 @@ require 'time'
4
4
  require 'rake/clean'
5
5
  require 'rexml/document'
6
6
  require 'timeout'
7
+ require 'net/telnet'
7
8
 
8
9
  ON_WINDOWS = (RbConfig::CONFIG['host_os'] =~ /mswin|mingw/i)
9
10
 
@@ -42,18 +43,34 @@ new_dx_content = File.read(dx_filename).dup
42
43
  # set defaultXmx=-Xmx1024M
43
44
 
44
45
  xmx_pattern = /^defaultMx="-Xmx(\d+)(M|m|G|g|T|t)"/
46
+ MINIMUM_DX_HEAP_SIZE = 2048
45
47
  if new_dx_content =~ xmx_pattern &&
46
- ($1.to_i * 1024 ** {'M' => 2, 'G' => 3, 'T' => 4}[$2.upcase]) < 2560*1024**2
47
- puts "Increasing max heap space from #$1#$2 to 2560M in #{dx_filename}"
48
- new_dx_content.sub!(xmx_pattern, 'defaultMx="-Xmx2560M"')
48
+ ($1.to_i * 1024 ** {'M' => 2, 'G' => 3, 'T' => 4}[$2.upcase]) < MINIMUM_DX_HEAP_SIZE*1024**2
49
+ puts "Increasing max heap space from #$1#$2 to #{MINIMUM_DX_HEAP_SIZE}M in #{dx_filename}"
50
+ new_dx_content.sub!(xmx_pattern, %Q{defaultMx="-Xmx#{MINIMUM_DX_HEAP_SIZE}M"})
49
51
  File.open(dx_filename, 'w') { |f| f << new_dx_content } rescue puts "\n!!! Unable to increase dx heap size !!!\n\n"
52
+ puts new_dx_content.lines.grep(xmx_pattern)
50
53
  end
51
54
 
52
- def manifest; @manifest ||= REXML::Document.new(File.read(MANIFEST_FILE)) end
53
- def package; manifest.root.attribute('package') end
54
- def build_project_name; @build_project_name ||= REXML::Document.new(File.read('build.xml')).elements['project'].attribute(:name).value end
55
- def scripts_path; @sdcard_path ||= "/mnt/sdcard/Android/data/#{package}/files/scripts" end
56
- def app_files_path; @app_files_path ||= "/data/data/#{package}/files" end
55
+ def manifest;
56
+ @manifest ||= REXML::Document.new(File.read(MANIFEST_FILE))
57
+ end
58
+
59
+ def package;
60
+ manifest.root.attribute('package')
61
+ end
62
+
63
+ def build_project_name;
64
+ @build_project_name ||= REXML::Document.new(File.read('build.xml')).elements['project'].attribute(:name).value
65
+ end
66
+
67
+ def scripts_path;
68
+ @sdcard_path ||= "/mnt/sdcard/Android/data/#{package}/files/scripts"
69
+ end
70
+
71
+ def app_files_path;
72
+ @app_files_path ||= "/data/data/#{package}/files"
73
+ end
57
74
 
58
75
  PROJECT_DIR = File.expand_path('..', File.dirname(__FILE__))
59
76
  UPDATE_MARKER_FILE = File.join(PROJECT_DIR, 'bin', 'LAST_UPDATE')
@@ -63,7 +80,7 @@ MANIFEST_FILE = File.expand_path 'AndroidManifest.xml'
63
80
  PROJECT_PROPS_FILE = File.expand_path 'project.properties'
64
81
  RUBOTO_CONFIG_FILE = File.expand_path 'ruboto.yml'
65
82
  GEM_FILE = File.expand_path 'Gemfile.apk'
66
- GEM_LOCK_FILE = File.expand_path 'Gemfile.apk.lock'
83
+ GEM_LOCK_FILE = "#{GEM_FILE}.lock"
67
84
  RELEASE_APK_FILE = File.expand_path "bin/#{build_project_name}-release.apk"
68
85
  APK_FILE = File.expand_path "bin/#{build_project_name}-debug.apk"
69
86
  TEST_APK_FILE = File.expand_path "test/bin/#{build_project_name}Test-debug.apk"
@@ -74,6 +91,10 @@ RUBY_SOURCE_FILES = Dir[File.expand_path 'src/**/*.rb']
74
91
  APK_DEPENDENCIES = [MANIFEST_FILE, RUBOTO_CONFIG_FILE, BUNDLE_JAR] + JRUBY_JARS + JAVA_SOURCE_FILES + RESOURCE_FILES + RUBY_SOURCE_FILES
75
92
  KEYSTORE_FILE = (key_store = File.readlines('ant.properties').grep(/^key.store=/).first) ? File.expand_path(key_store.chomp.sub(/^key.store=/, '').sub('${user.home}', '~')) : "#{build_project_name}.keystore"
76
93
  KEYSTORE_ALIAS = (key_alias = File.readlines('ant.properties').grep(/^key.alias=/).first) ? key_alias.chomp.sub(/^key.alias=/, '') : build_project_name
94
+ APK_FILE_REGEXP = /^-rw-r--r--\s+(?:system|\d+\s+\d+)\s+(?:system|\d+)\s+(\d+)\s+(\d{4}-\d{2}-\d{2} \d{2}:\d{2}|\w{3} \d{2}\s+(?:\d{4}|\d{2}:\d{2}))\s+(.*)$/
95
+ # -rw-r--r-- system system 7487556 2013-04-21 14:01 org.ruboto.example.gps-1.apk
96
+ # -rw-r--r-- 1 1000 1000 59252 Aug 15 2010 /data/app/org.update_test-1.apk
97
+ # -rw-r--r-- 1 1000 1000 59265 Aug 15 01:11 /data/app/org.update2_test-1.apk
77
98
 
78
99
  CLEAN.include('bin', 'gen', 'test/bin', 'test/gen')
79
100
 
@@ -161,9 +182,9 @@ task :tag do
161
182
  sh 'git push origin master --tags'
162
183
  end
163
184
 
164
- desc 'Start the emulator with larger disk'
185
+ desc 'Start the emulator'
165
186
  task :emulator do
166
- start_emulator
187
+ start_emulator(sdk_level)
167
188
  end
168
189
 
169
190
  desc 'Start the application on the device/emulator.'
@@ -258,39 +279,44 @@ file BUNDLE_JAR => [GEM_FILE, GEM_LOCK_FILE] do
258
279
  next unless File.exists? GEM_FILE
259
280
  puts "Generating #{BUNDLE_JAR}"
260
281
  require 'bundler'
261
- require 'bundler/vendored_thor'
262
-
263
- # Store original RubyGems/Bundler environment
264
- platforms = Gem.platforms
265
- ruby_engine = defined?(RUBY_ENGINE) && RUBY_ENGINE
266
- gem_paths = {'GEM_HOME' => Gem.path, 'GEM_PATH' => Gem.dir}
267
-
268
- # Override RUBY_ENGINE (we can bundle from MRI for JRuby)
269
- Gem.platforms = [Gem::Platform::RUBY, Gem::Platform.new('universal-java')]
270
- Gem.paths = {'GEM_HOME' => BUNDLE_PATH, 'GEM_PATH' => BUNDLE_PATH}
271
- old_verbose, $VERBOSE = $VERBOSE, nil
272
- begin
273
- Object.const_set('RUBY_ENGINE', 'jruby')
274
- ensure
275
- $VERBOSE = old_verbose
276
- end
282
+ if Gem::Version.new(Bundler::VERSION) <= Gem::Version.new('1.3.5')
283
+ require 'bundler/vendored_thor'
284
+
285
+ # Store original RubyGems/Bundler environment
286
+ platforms = Gem.platforms
287
+ ruby_engine = defined?(RUBY_ENGINE) && RUBY_ENGINE
288
+ gem_paths = {'GEM_HOME' => Gem.path, 'GEM_PATH' => Gem.dir}
289
+
290
+ # Override RUBY_ENGINE (we can bundle from MRI for JRuby)
291
+ Gem.platforms = [Gem::Platform::RUBY, Gem::Platform.new("universal-dalvik-#{sdk_level}"), Gem::Platform.new('universal-java')]
292
+ Gem.paths = {'GEM_HOME' => BUNDLE_PATH, 'GEM_PATH' => BUNDLE_PATH}
293
+ old_verbose, $VERBOSE = $VERBOSE, nil
294
+ begin
295
+ Object.const_set('RUBY_ENGINE', 'jruby')
296
+ ensure
297
+ $VERBOSE = old_verbose
298
+ end
277
299
 
278
- ENV['BUNDLE_GEMFILE'] = GEM_FILE
279
- Bundler.ui = Bundler::UI::Shell.new
280
- Bundler.bundle_path = Pathname.new BUNDLE_PATH
281
- definition = Bundler.definition
282
- definition.validate_ruby!
283
- Bundler::Installer.install(Bundler.root, definition)
300
+ ENV['BUNDLE_GEMFILE'] = GEM_FILE
301
+ Bundler.ui = Bundler::UI::Shell.new
302
+ Bundler.bundle_path = Pathname.new BUNDLE_PATH
303
+ definition = Bundler.definition
304
+ definition.validate_ruby!
305
+ Bundler::Installer.install(Bundler.root, definition)
284
306
 
285
- # Restore RUBY_ENGINE (limit the scope of this hack)
286
- old_verbose, $VERBOSE = $VERBOSE, nil
287
- begin
288
- Object.const_set('RUBY_ENGINE', ruby_engine)
289
- ensure
290
- $VERBOSE = old_verbose
307
+ # Restore RUBY_ENGINE (limit the scope of this hack)
308
+ old_verbose, $VERBOSE = $VERBOSE, nil
309
+ begin
310
+ Object.const_set('RUBY_ENGINE', ruby_engine)
311
+ ensure
312
+ $VERBOSE = old_verbose
313
+ end
314
+ Gem.platforms = platforms
315
+ Gem.paths = gem_paths
316
+ else
317
+ # Bundler.settings[:platform] = Gem::Platform::DALVIK
318
+ sh "bundle install --gemfile #{GEM_FILE} --path=#{BUNDLE_PATH} --platform=dalvik#{sdk_level}"
291
319
  end
292
- Gem.platforms = platforms
293
- Gem.paths = gem_paths
294
320
 
295
321
  gem_paths = Dir["#{BUNDLE_PATH}/gems"]
296
322
  raise 'Gem path not found' if gem_paths.empty?
@@ -482,36 +508,41 @@ end
482
508
  # Return nil if the package is not installed.
483
509
  def package_installed?(test = false)
484
510
  package_name = "#{package}#{'.tests' if test}"
485
- %w( -0 -1 -2).each do |i|
486
- path = "/data/app/#{package_name}#{i}.apk"
487
- o = `adb shell ls -l #{path}`.chomp
488
- if o =~ /^-rw-r--r-- system\s+system\s+(\d+)\s+(\d{4}-\d{2}-\d{2} \d{2}:\d{2})\s+#{File.basename(path)}$/
489
- installed_apk_size = $1.to_i
490
- installed_timestamp = Time.parse($2)
491
- apk_file = test ? TEST_APK_FILE : APK_FILE
492
- if !File.exists?(apk_file) || (installed_apk_size == File.size(apk_file) &&
493
- installed_timestamp >= File.mtime(apk_file))
494
- return true
495
- else
496
- return false
497
- end
498
- end
499
-
500
- sdcard_path = "/mnt/asec/#{package_name}#{i}/pkg.apk"
501
- o = `adb shell ls -l #{sdcard_path}`.chomp
502
- if o =~ /^-r-xr-xr-x system\s+root\s+(\d+)\s+(\d{4}-\d{2}-\d{2} \d{2}:\d{2})\s+#{File.basename(sdcard_path)}$/
503
- installed_apk_size = $1.to_i
504
- installed_timestamp = Time.parse($2)
505
- apk_file = test ? TEST_APK_FILE : APK_FILE
506
- if !File.exists?(apk_file) || (installed_apk_size == File.size(apk_file) &&
507
- installed_timestamp >= File.mtime(apk_file))
508
- return true
509
- else
510
- return false
511
- end
512
- end
511
+ loop do
512
+ path_line = `adb shell pm path #{package_name}`.chomp
513
+
514
+ # FIXME(uwe): Debug travis CI. Remove when Travis CI is OK.
515
+ puts '*' * 80
516
+ puts 'Output from pm path'
517
+ puts '*' * 80
518
+ puts $?.inspect
519
+ puts '*' * 80
520
+ puts path_line
521
+ puts '*' * 80
522
+ # EMXIF
523
+
524
+ return nil if $? == 0 && path_line.empty?
525
+ break if $? == 0 && path_line =~ /^package:(.*)$/
526
+
527
+ # FIXME(uwe): Debug travis CI. Remove when Travis CI is OK.
528
+ puts '*' * 80
529
+ puts 'Unexpected output from pm path'
530
+ puts '*' * 80
531
+ puts path_line
532
+ puts '*' * 80
533
+ # EMXIF
534
+
535
+ sleep 0.5
513
536
  end
514
- nil
537
+
538
+ path = $1
539
+ o = `adb shell ls -l #{path}`.chomp
540
+ raise "Unexpected ls output: #{o}" if o !~ APK_FILE_REGEXP
541
+ installed_apk_size = $1.to_i
542
+ installed_timestamp = Time.parse($2)
543
+ apk_file = test ? TEST_APK_FILE : APK_FILE
544
+ !File.exists?(apk_file) || (installed_apk_size == File.size(apk_file) &&
545
+ installed_timestamp >= File.mtime(apk_file))
515
546
  end
516
547
 
517
548
  def replace_faulty_code(faulty_file, faulty_code)
@@ -542,6 +573,8 @@ def build_apk(t, release)
542
573
  if release
543
574
  sh "#{ANT_CMD} release"
544
575
  else
576
+ p RbConfig::CONFIG['host_os']
577
+ sh 'free' if RbConfig::CONFIG['host_os'] =~ /linux/
545
578
  sh "#{ANT_CMD} debug"
546
579
  end
547
580
  true
@@ -561,7 +594,7 @@ def install_apk
561
594
  install_retry_count = 0
562
595
  begin
563
596
  timeout 120 do
564
- output = `adb install -r #{APK_FILE} 2>&1`
597
+ output = `adb install -r "#{APK_FILE}" 2>&1`
565
598
  end
566
599
  rescue Timeout::Error
567
600
  puts "Installing package #{package} timed out."
@@ -571,7 +604,7 @@ def install_apk
571
604
  retry
572
605
  end
573
606
  puts 'Trying one final time to install the package:'
574
- output = `adb install -r #{APK_FILE} 2>&1`
607
+ output = `adb install -r "#{APK_FILE}" 2>&1`
575
608
  end
576
609
  if $? == 0 && output !~ failure_pattern && output =~ success_pattern
577
610
  clear_update
@@ -594,7 +627,7 @@ def install_apk
594
627
  install_retry_count = 0
595
628
  begin
596
629
  timeout 120 do
597
- output = `adb install #{APK_FILE} 2>&1`
630
+ output = `adb install "#{APK_FILE}" 2>&1`
598
631
  end
599
632
  rescue Timeout::Error
600
633
  puts "Installing package #{package} timed out."
@@ -604,7 +637,7 @@ def install_apk
604
637
  retry
605
638
  end
606
639
  puts 'Trying one final time to install the package:'
607
- output = `adb install #{APK_FILE} 2>&1`
640
+ output = `adb install "#{APK_FILE}" 2>&1`
608
641
  end
609
642
  puts output
610
643
  raise "Install failed (#{$?}) #{$1 ? "[#$1}]" : output}" if $? != 0 || output =~ failure_pattern || output !~ success_pattern
@@ -646,7 +679,7 @@ def stop_app
646
679
  output !~ /Operation not permitted/
647
680
  end
648
681
 
649
- def start_emulator
682
+ def start_emulator(sdk_level)
650
683
  STDOUT.sync = true
651
684
  # FIXME(uwe): Use RBConfig instead
652
685
  if `uname -m`.chomp == 'x86_64'
@@ -654,7 +687,7 @@ def start_emulator
654
687
  else
655
688
  emulator_cmd = 'emulator-arm'
656
689
  end
657
-
690
+
658
691
  emulator_opts = '-partition-size 256'
659
692
  if ENV['DISPLAY'].nil?
660
693
  emulator_opts << ' -no-window -no-audio'
@@ -662,6 +695,24 @@ def start_emulator
662
695
 
663
696
  avd_name = "Android_#{sdk_level_name}"
664
697
  new_snapshot = false
698
+
699
+ if `adb devices` =~ /emulator-5554/
700
+ t = Net::Telnet.new('Host' => 'localhost', 'Port' => 5554, 'Prompt' => /^OK/)
701
+ output = ''
702
+ t.cmd('avd name') { |c| output << c }
703
+ if output =~ /OK\n(.*)\nOK/
704
+ running_avd_name = $1
705
+ if running_avd_name == avd_name
706
+ puts "Emulator #{avd_name} is already running."
707
+ return
708
+ else
709
+ puts "Emulator #{running_avd_name} is running."
710
+ end
711
+ else
712
+ puts 'No emulator is running.'
713
+ end
714
+ end
715
+
665
716
  loop do
666
717
  `killall -0 #{emulator_cmd} 2> /dev/null`
667
718
  if $? == 0
@@ -703,10 +754,10 @@ def start_emulator
703
754
  `sed -i.bak -e "s/vm.heapSize=[0-9]*/vm.heapSize=#{heap_size}/" #{ENV['HOME']}/.android/avd/#{avd_name}.avd/config.ini`
704
755
  new_snapshot = true
705
756
  end
706
-
757
+
707
758
  puts 'Start emulator'
708
759
  system "emulator -avd #{avd_name} #{emulator_opts} &"
709
-
760
+
710
761
  3.times do |i|
711
762
  sleep 1
712
763
  `killall -0 #{emulator_cmd} 2> /dev/null`
@@ -716,7 +767,7 @@ def start_emulator
716
767
  if i == 3
717
768
  print 'Waiting for emulator: ...'
718
769
  elsif i > 3
719
- print '.'
770
+ print '.'
720
771
  end
721
772
  end
722
773
  puts
@@ -733,12 +784,12 @@ def start_emulator
733
784
  if i == 3
734
785
  print 'Waiting for emulator: ...'
735
786
  elsif i > 3
736
- print '.'
787
+ print '.'
737
788
  end
738
789
  sleep 1
739
790
  end
740
791
  end
741
-
792
+
742
793
  `killall -0 #{emulator_cmd} 2> /dev/null`
743
794
  if $? == 0
744
795
  print 'Emulator started: '
@@ -761,8 +812,8 @@ def start_emulator
761
812
  puts 'Allow the emulator to calm down a bit.'
762
813
  sleep 15
763
814
  end
764
-
765
- system %Q{(
815
+
816
+ system '(
766
817
  set +e
767
818
  for i in 1 2 3 4 5 6 7 8 9 10 ; do
768
819
  sleep 6
@@ -777,9 +828,9 @@ def start_emulator
777
828
  echo "Failed to unlock screen"
778
829
  set -e
779
830
  exit 1
780
- ) &}
781
-
782
- system "adb logcat > adb_logcat.log &"
783
-
831
+ ) &'
832
+
833
+ system 'adb logcat > adb_logcat.log &'
834
+
784
835
  puts "Emulator #{avd_name} started OK."
785
836
  end
@@ -1,7 +1,7 @@
1
1
  import android.util.Log
2
2
 
3
3
  class SampleBroadcastReceiver
4
- # will get called whenever the BroadcastReceiver receives an intent (whenever onReceive is called)
4
+ # Will get called whenever the BroadcastReceiver receives an intent.
5
5
  def onReceive(context, intent)
6
6
  Log.v 'SampleBroadcastReceiver', 'Broadcast received!'
7
7
  Log.v 'SampleBroadcastReceiver', intent.getExtras.to_s