ruboto 1.0.0 → 1.0.1

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.
@@ -132,17 +132,18 @@ public class JRubyAdapter {
132
132
  // END Ruboto HeapAlloc
133
133
  setDebugBuild(appContext);
134
134
  Log.d("Setting up JRuby runtime (" + (isDebugBuild ? "DEBUG" : "RELEASE") + ")");
135
- System.setProperty("jruby.compile.mode", "OFF"); // OFF OFFIR JITIR? FORCE FORCEIR
136
- // System.setProperty("jruby.compile.backend", "DALVIK");
135
+ System.setProperty("jruby.backtrace.style", "normal"); // normal raw full mri
137
136
  System.setProperty("jruby.bytecode.version", "1.6");
137
+ // System.setProperty("jruby.compat.version", "RUBY2_0"); // RUBY1_9 is the default in JRuby 1.7
138
+ // System.setProperty("jruby.compile.backend", "DALVIK");
139
+ System.setProperty("jruby.compile.mode", "OFF"); // OFF OFFIR JITIR? FORCE FORCEIR
138
140
  System.setProperty("jruby.interfaces.useProxy", "true");
141
+ System.setProperty("jruby.ir.passes", "LocalOptimizationPass,DeadCodeElimination");
139
142
  System.setProperty("jruby.management.enabled", "false");
143
+ System.setProperty("jruby.native.enabled", "false");
140
144
  System.setProperty("jruby.objectspace.enabled", "false");
145
+ System.setProperty("jruby.rewrite.java.trace", "true");
141
146
  System.setProperty("jruby.thread.pooling", "true");
142
- System.setProperty("jruby.native.enabled", "false");
143
- // System.setProperty("jruby.compat.version", "RUBY2_0"); // RUBY1_9 is the default in JRuby 1.7
144
- System.setProperty("jruby.ir.passes", "LocalOptimizationPass,DeadCodeElimination");
145
- System.setProperty("jruby.backtrace.style", "normal"); // normal raw full mri
146
147
 
147
148
  // Uncomment these to debug/profile Ruby source loading
148
149
  // System.setProperty("jruby.debug.loadService", "true");
@@ -106,6 +106,7 @@ public class ScriptLoader {
106
106
  }
107
107
  component.getScriptInfo().setRubyInstance(rubyInstance);
108
108
  }
109
+ persistObjectProxy(component);
109
110
  } catch(IOException e){
110
111
  e.printStackTrace();
111
112
  if (component instanceof android.content.Context) {
@@ -114,40 +115,12 @@ public class ScriptLoader {
114
115
  }
115
116
  }
116
117
 
117
- public static final void callOnCreate(final RubotoComponent component, Object... args) {
118
- persistObjectProxy(component);
119
- if (component instanceof android.content.Context) {
120
- Log.d("Call onCreate on: " + component.getScriptInfo().getRubyInstance());
121
- // FIXME(uwe): Simplify when we stop support for snake case aliasing interface callback methods.
122
- if ((Boolean)JRubyAdapter.runScriptlet(component.getScriptInfo().getRubyClassName() + ".instance_methods(false).any?{|m| m.to_sym == :onCreate}")) {
123
- JRubyAdapter.runRubyMethod(component.getScriptInfo().getRubyInstance(), "onCreate", args);
124
- } else if ((Boolean)JRubyAdapter.runScriptlet(component.getScriptInfo().getRubyClassName() + ".instance_methods(true).any?{|m| m.to_sym == :on_create}")) {
125
- JRubyAdapter.runRubyMethod(component.getScriptInfo().getRubyInstance(), "on_create", args);
126
- } else {
127
- JRubyAdapter.runRubyMethod(component.getScriptInfo().getRubyInstance(), "onCreate", args);
128
- }
129
- // EMXIF
130
- }
131
- }
132
-
133
- public static final void callOnDestroy(final RubotoComponent component) {
134
- String rubyClassName = component.getScriptInfo().getRubyClassName();
135
- if ((Boolean)JRubyAdapter.runScriptlet(rubyClassName + ".instance_methods(false).any?{|m| m.to_sym == :onDestroy}")) {
136
- JRubyAdapter.runRubyMethod(component.getScriptInfo().getRubyInstance(), "onDestroy");
137
- } else if ((Boolean)JRubyAdapter.runScriptlet(rubyClassName + ".instance_methods(true).any?{|m| m.to_sym == :on_destroy}")) {
138
- JRubyAdapter.runRubyMethod(component.getScriptInfo().getRubyInstance(), "on_destroy");
139
- } else {
140
- JRubyAdapter.runRubyMethod(component.getScriptInfo().getRubyInstance(), "onDestroy");
141
- }
142
- releaseObjectProxy(component);
143
- }
144
-
145
118
  private static void persistObjectProxy(RubotoComponent component) {
146
119
  JRubyAdapter.runScriptlet("Java::" + component.getClass().getName() + ".__persistent__ = true");
147
120
  ((Map)JRubyAdapter.get("RUBOTO_JAVA_PROXIES")).put(component.getScriptInfo().getRubyInstance(), component.getScriptInfo().getRubyInstance());
148
121
  }
149
122
 
150
- private static void releaseObjectProxy(RubotoComponent component) {
123
+ public static void unloadScript(RubotoComponent component) {
151
124
  ((Map)JRubyAdapter.get("RUBOTO_JAVA_PROXIES")).remove(component.getScriptInfo().getRubyInstance());
152
125
  }
153
126
 
@@ -3,7 +3,7 @@ module Ruboto
3
3
  module Build
4
4
  include Verify
5
5
  SCRIPTS_DIR = 'src'
6
-
6
+
7
7
  ###########################################################################
8
8
  #
9
9
  # Build Subclass or Interface:
@@ -19,9 +19,9 @@ module Ruboto
19
19
  Dir.mkdir(to) unless File.directory?(to)
20
20
 
21
21
  text = File.read(File.expand_path(Ruboto::GEM_ROOT + "/assets/src/#{src}.java"))
22
- substitutions.each {|k,v| text.gsub!(k, v)}
22
+ substitutions.each { |k, v| text.gsub!(k, v) }
23
23
 
24
- File.open(File.join(to, "#{name}.java"), 'w') {|f| f << text}
24
+ File.open(File.join(to, "#{name}.java"), 'w') { |f| f << text }
25
25
  end
26
26
 
27
27
  #
@@ -35,14 +35,11 @@ module Ruboto
35
35
  abort "ERROR: #{klass} not found" unless element
36
36
 
37
37
  unless force == 'include'
38
- abort "#{klass} not available in minSdkVersion, added in #{element.attribute('api_added')}; use '--force include' to create it" if
39
- element.attribute('api_added') and element.attribute('api_added').to_i > verify_min_sdk.to_i
40
- abort "#{klass} deprecated for targetSdkVersion, deprecated in #{element.attribute('deprecated')}; use '--force include' to create it" if
41
- element.attribute('deprecated') and element.attribute('deprecated').to_i <= verify_target_sdk.to_i
38
+ abort "#{klass} not available in minSdkVersion, added in #{element.attribute('api_added')}; use '--force include' to create it" if element.attribute('api_added') and element.attribute('api_added').to_i > verify_min_sdk.to_i
39
+ abort "#{klass} deprecated for targetSdkVersion, deprecated in #{element.attribute('deprecated')}; use '--force include' to create it" if element.attribute('deprecated') and element.attribute('deprecated').to_i <= verify_target_sdk.to_i
42
40
  end
43
41
 
44
- abort "#{klass} removed for targetSdkVersion, removed in #{element.attribute('api_removed')}" if
45
- element.attribute('api_removed') and element.attribute('api_removed').to_i <= verify_target_sdk.to_i
42
+ abort "#{klass} removed for targetSdkVersion, removed in #{element.attribute('api_removed')}" if element.attribute('api_removed') and element.attribute('api_removed').to_i <= verify_target_sdk.to_i
46
43
 
47
44
  element
48
45
  end
@@ -55,9 +52,9 @@ module Ruboto
55
52
  target_api = verify_target_sdk.to_i
56
53
 
57
54
  # Remove methods changed outside of the scope of the sdk versions
58
- methods = methods.select{|i| !i.attribute('api_added') || (i.attribute('api_added').to_i <= target_api)}
55
+ methods = methods.select { |i| !i.attribute('api_added') || (i.attribute('api_added').to_i <= target_api) }
59
56
  # methods = methods.select{|i| !i.attribute('deprecated') || (i.attribute('deprecated').to_i > min_api)}
60
- methods = methods.select{|i| !i.attribute('api_removed') || (i.attribute('api_removed').to_i > min_api)}
57
+ methods = methods.select { |i| !i.attribute('api_removed') || (i.attribute('api_removed').to_i > min_api) }
61
58
 
62
59
  # Inform and remove methods that do not exist in one of the sdk versions
63
60
  methods = methods.select do |i|
@@ -124,7 +121,7 @@ module Ruboto
124
121
  'THE_RUBOTO_CLASS' => params[:name],
125
122
  'THE_CONSTRUCTORS' => class_desc.name == 'class' ?
126
123
  class_desc.get_elements('constructor').map { |i| i.constructor_definition(params[:name]) }.join("\n\n") : '',
127
- 'THE_METHODS' => methods.map { |i| i.method_definition(params[:name]) }.join("\n\n")
124
+ 'THE_METHODS' => methods_header + methods.map { |i| i.method_definition(params[:name]) }.join("\n\n")
128
125
  }
129
126
  end
130
127
 
@@ -134,8 +131,8 @@ module Ruboto
134
131
  #
135
132
  def generate_core_classes(params)
136
133
  hash = {:package => 'org.ruboto'}
137
- %w(method_base method_include implements force).inject(hash) {|h, i| h[i.to_sym] = params[i.to_sym]; h}
138
- hash[:method_exclude] = params[:method_exclude].split(',').push('onCreate').push('onDestroy').push('onBind').push('onStartCommand').join(',')
134
+ %w(method_base method_include implements force).inject(hash) { |h, i| h[i.to_sym] = params[i.to_sym]; h }
135
+ hash[:method_exclude] = params[:method_exclude]
139
136
 
140
137
  %w(android.app.Activity android.app.Service android.content.BroadcastReceiver).each do |i|
141
138
  name = i.split('.')[-1]
@@ -193,6 +190,21 @@ module Ruboto
193
190
  puts "Added file #{test_file}."
194
191
  end
195
192
  end
193
+
194
+ def methods_header
195
+ <<EOF
196
+ private final ScriptInfo scriptInfo = new ScriptInfo();
197
+ public ScriptInfo getScriptInfo() {
198
+ return scriptInfo;
199
+ }
200
+
201
+ /****************************************************************************************
202
+ *
203
+ * Generated Methods
204
+ */
205
+ EOF
206
+ end
207
+
196
208
  end
197
209
  end
198
210
  end
@@ -83,21 +83,37 @@ module Ruboto
83
83
  end
84
84
  end
85
85
 
86
- if [17, 16, 15, 13, 11].include? sdk_level
87
- abi_opt = '--abi armeabi-v7a'
88
- elsif sdk_level == 10
89
- abi_opt = '--abi armeabi'
90
- end
91
-
92
86
  avd_home = "#{ENV['HOME'].gsub('\\', '/')}/.android/avd/#{avd_name}.avd"
87
+
93
88
  unless File.exists? avd_home
94
89
  puts "Creating AVD #{avd_name}"
95
- if ON_MAC_OS_X
96
- abis = `android list target`.split(/----------\n/).
97
- find { |l| l =~ /android-#{sdk_level}/ }.slice(/(?<=ABIs : ).*/).split(', ')
98
- abi = abis.find { |a| a =~ /x86/ }
90
+
91
+ target = `android list target`.split(/----------\n/).
92
+ find { |l| l =~ /android-#{sdk_level}/ }
93
+
94
+ if target.nil?
95
+ puts "Target android-#{sdk_level} not found. You should run"
96
+ puts "\n ruboto setup -y -t #{sdk_level}\n\nto install it."
97
+ exit 3
98
+ end
99
+
100
+ if ON_MAC_OS_X || ON_WINDOWS
101
+ abis = target.slice(/(?<=ABIs : ).*/).split(', ')
102
+ has_haxm = abis.find { |a| a =~ /x86/ }
99
103
  end
100
- puts `echo n | android create avd -a -n #{avd_name} -t android-#{sdk_level} #{abi_opt} -c 64M -s HVGA #{"--abi #{abi}" if abi}`
104
+
105
+ if has_haxm
106
+ abi_opt = '--abi x86'
107
+ else
108
+ if [17, 16, 15, 13, 11].include? sdk_level
109
+ abi_opt = '--abi armeabi-v7a'
110
+ elsif sdk_level == 10
111
+ abi_opt = '--abi armeabi'
112
+ end
113
+ end
114
+
115
+ puts `echo n | android create avd -a -n #{avd_name} -t android-#{sdk_level} #{abi_opt} -c 64M -s HVGA`
116
+
101
117
  if $? != 0
102
118
  puts 'Failed to create AVD.'
103
119
  exit 3
@@ -17,7 +17,11 @@ module Ruboto
17
17
  def update_android
18
18
  root = Dir.getwd
19
19
  build_xml_file = "#{root}/build.xml"
20
- name = REXML::Document.new(File.read(build_xml_file)).root.attributes['name']
20
+ if File.exists? build_xml_file
21
+ name = REXML::Document.new(File.read(build_xml_file)).root.attributes['name']
22
+ else
23
+ name = File.basename(root)
24
+ end
21
25
 
22
26
  prop_file = "#{root}/project.properties"
23
27
  version_regexp = /^(target=android-)(\d+)$/
@@ -286,14 +290,14 @@ module Ruboto
286
290
  puts "Regenerating subclass #{package}.#{subclass_name}"
287
291
  generate_inheriting_file 'Class', subclass_name
288
292
  generate_subclass_or_interface(:package => package, :template => 'InheritingClass', :class => class_name,
289
- :name => subclass_name, :method_base => method_base, :force => force)
293
+ :name => subclass_name, :method_base => method_base, :force => force)
290
294
  # FIXME(uwe): Remove when we stop updating from Ruboto 0.7.0 and older
291
295
  elsif source_code =~ /^\s*package\s+(\S+?)\s*;.*public\s+class\s+(\S+?)\s+extends\s+(.*?)\s\{.*^\s*private Object\[\] callbackProcs = new Object\[\d+\];/m
292
296
  package, subclass_name, class_name = $1, $2, $3
293
297
  puts "Regenerating subclass #{package}.#{subclass_name}"
294
298
  generate_inheriting_file 'Class', subclass_name
295
299
  generate_subclass_or_interface(:package => package, :template => 'InheritingClass', :class => class_name,
296
- :name => subclass_name, :method_base => 'on', :force => force)
300
+ :name => subclass_name, :method_base => 'on', :force => force)
297
301
  # EMXIF
298
302
  end
299
303
  end
@@ -411,7 +415,8 @@ module Ruboto
411
415
  `jar -xf #{jruby_core}`
412
416
  raise "Unpacking jruby-core jar failed: #$?" unless $? == 0
413
417
  File.delete jruby_core
414
- if Gem::Version.new(jruby_core_version) >= Gem::Version.new('9000.dev')
418
+ gem_version = Gem::Version.new(jruby_core_version.tr('-', '.'))
419
+ if gem_version >= Gem::Version.new('9000.dev')
415
420
  #noinspection RubyLiteralArrayInspection
416
421
  excluded_core_packages = [
417
422
  '**/*Darwin*',
@@ -459,17 +464,17 @@ module Ruboto
459
464
  # 'org/jruby/runtime/opto/OptoFactory*', # What is this?
460
465
  'org/yecht',
461
466
  ]
462
- elsif Gem::Version.new(jruby_core_version) >= Gem::Version.new('1.7.5')
467
+ elsif gem_version >= Gem::Version.new('1.7.5')
463
468
  excluded_core_packages = %w(**/*Darwin* **/*Solaris* **/*windows* **/*Windows* META-INF com/headius com/kenai/constantine com/kenai/jffi com/kenai/jnr/x86asm com/martiansoftware jni jnr/constants/platform/darwin jnr/constants/platform/fake jnr/constants/platform/freebsd jnr/constants/platform/openbsd jnr/constants/platform/sunos jnr/ffi/annotations jnr/ffi/byref jnr/ffi/mapper jnr/ffi/provider jnr/ffi/util jnr/ffi/Struct$* jnr/ffi/types jnr/posix/Aix* jnr/posix/FreeBSD* jnr/posix/MacOS* jnr/posix/OpenBSD* jnr/x86asm org/jruby/ant org/jruby/cext org/jruby/compiler/impl/BaseBodyCompiler* org/jruby/compiler/util org/jruby/demo org/jruby/embed/bsf org/jruby/embed/jsr223 org/jruby/embed/osgi org/jruby/ext/ffi/AbstractMemory* org/jruby/ext/ffi/io org/jruby/ext/ffi/jffi org/jruby/ext/tracepoint org/jruby/javasupport/bsf org/yecht)
464
- elsif Gem::Version.new(jruby_core_version) >= Gem::Version.new('1.7.4')
469
+ elsif gem_version >= Gem::Version.new('1.7.4')
465
470
  excluded_core_packages = %w(**/*Darwin* **/*Solaris* **/*windows* **/*Windows* META-INF com/headius com/kenai/constantine com/kenai/jffi com/kenai/jnr/x86asm com/martiansoftware jline jni jnr/constants/platform/darwin jnr/constants/platform/fake jnr/constants/platform/freebsd jnr/constants/platform/openbsd jnr/constants/platform/sunos jnr/ffi/annotations jnr/ffi/byref jnr/ffi/mapper jnr/ffi/provider jnr/ffi/util jnr/ffi/Struct$* jnr/ffi/types jnr/posix/Aix* jnr/posix/FreeBSD* jnr/posix/MacOS* jnr/posix/OpenBSD* jnr/x86asm org/apache org/fusesource org/jruby/ant org/jruby/cext org/jruby/compiler/impl/BaseBodyCompiler* org/jruby/compiler/util org/jruby/demo org/jruby/embed/bsf org/jruby/embed/jsr223 org/jruby/embed/osgi org/jruby/ext/ffi/AbstractMemory* org/jruby/ext/ffi/io org/jruby/ext/ffi/jffi org/jruby/ext/ripper org/jruby/ext/tracepoint org/jruby/javasupport/bsf org/yecht)
466
- elsif Gem::Version.new(jruby_core_version) >= Gem::Version.new('1.7.3')
471
+ elsif gem_version >= Gem::Version.new('1.7.3')
467
472
  excluded_core_packages = %w(**/*Darwin* **/*Solaris* **/*windows* **/*Windows* META-INF com/headius com/kenai/constantine com/kenai/jffi com/kenai/jnr/x86asm com/martiansoftware jline jni jnr/constants/platform/darwin jnr/constants/platform/fake jnr/constants/platform/freebsd jnr/constants/platform/openbsd jnr/constants/platform/sunos jnr/ffi/annotations jnr/ffi/byref jnr/ffi/provider jnr/ffi/util jnr/ffi/Struct$* jnr/ffi/types jnr/posix/FreeBSD* jnr/posix/MacOS* jnr/posix/OpenBSD* jnr/x86asm org/apache org/fusesource org/jruby/ant org/jruby/cext org/jruby/compiler/impl/BaseBodyCompiler* org/jruby/compiler/util org/jruby/demo org/jruby/embed/bsf org/jruby/embed/jsr223 org/jruby/embed/osgi org/jruby/ext/ffi/AbstractMemory* org/jruby/ext/ffi/io org/jruby/ext/ffi/jffi org/jruby/javasupport/bsf org/yecht)
468
- elsif Gem::Version.new(jruby_core_version) >= Gem::Version.new('1.7.2')
473
+ elsif gem_version >= Gem::Version.new('1.7.2')
469
474
  excluded_core_packages = %w(**/*Darwin* **/*Ruby20* **/*Solaris* **/*windows* **/*Windows* META-INF com/headius com/kenai/constantine com/kenai/jffi com/martiansoftware jline jni jnr/constants/platform/darwin jnr/constants/platform/fake jnr/constants/platform/freebsd jnr/constants/platform/openbsd jnr/constants/platform/sunos jnr/ffi/annotations jnr/ffi/byref jnr/ffi/provider jnr/ffi/util jnr/ffi/Struct$* jnr/ffi/types jnr/posix/MacOS* jnr/posix/OpenBSD* org/apache org/fusesource org/jruby/ant org/jruby/cext org/jruby/compiler/util org/jruby/demo org/jruby/embed/bsf org/jruby/embed/jsr223 org/jruby/embed/osgi org/jruby/ext/ffi/io org/jruby/ext/ffi/jffi org/jruby/javasupport/bsf)
470
- elsif Gem::Version.new(jruby_core_version) >= Gem::Version.new('1.7.1')
475
+ elsif gem_version >= Gem::Version.new('1.7.1')
471
476
  excluded_core_packages = %w(**/*Darwin* **/*Ruby20* **/*Solaris* **/*windows* **/*Windows* META-INF com/headius com/kenai/constantine com/kenai/jffi com/martiansoftware jline jni jnr/constants/platform/darwin jnr/constants/platform/fake jnr/constants/platform/freebsd jnr/constants/platform/openbsd jnr/constants/platform/sunos jnr/ffi/annotations jnr/ffi/byref jnr/ffi/provider jnr/ffi/util jnr/ffi/Struct$* jnr/ffi/types jnr/posix/MacOS* jnr/posix/OpenBSD* org/apache org/fusesource org/jruby/ant org/jruby/cext org/jruby/compiler/util org/jruby/demo org/jruby/embed/bsf org/jruby/embed/jsr223 org/jruby/embed/osgi org/jruby/ext/ffi/io org/jruby/ext/ffi/jffi org/jruby/ext/openssl org/jruby/javasupport/bsf org/jruby/org/bouncycastle)
472
- elsif Gem::Version.new(jruby_core_version) >= Gem::Version.new('1.7.0')
477
+ elsif gem_version >= Gem::Version.new('1.7.0')
473
478
  # TODO(uwe): Remove when we stop supporting jruby-jars 1.7.0
474
479
  excluded_core_packages = %w(**/*Darwin* **/*Solaris* **/*windows* **/*Windows* META-INF com/headius com/kenai/constantine com/kenai/jffi com/martiansoftware jline jni jnr/constants/platform/darwin jnr/constants/platform/fake jnr/constants/platform/freebsd jnr/constants/platform/openbsd jnr/constants/platform/sunos jnr/ffi/annotations jnr/ffi/byref jnr/ffi/provider jnr/ffi/util jnr/ffi/Struct$* jnr/ffi/types jnr/posix/MacOS* jnr/posix/OpenBSD* org/apache org/bouncycastle org/fusesource org/jruby/ant org/jruby/cext org/jruby/compiler/util org/jruby/demo org/jruby/embed/bsf org/jruby/embed/jsr223 org/jruby/embed/osgi org/jruby/ext/ffi/io org/jruby/ext/ffi/jffi org/jruby/ext/openssl org/jruby/javasupport/bsf)
475
480
  # ODOT
@@ -67,8 +67,7 @@ module Ruboto
67
67
  end
68
68
 
69
69
  def verify_strings
70
- abort "cannot find your strings.xml to extract info from it. Make sure you're in the root directory of your app" unless
71
- File.exists? 'res/values/strings.xml'
70
+ abort "cannot find your strings.xml to extract info from it. Make sure you're in the root directory of your app" unless File.exists? 'res/values/strings.xml'
72
71
  @strings ||= REXML::Document.new(File.read('res/values/strings.xml'))
73
72
  end
74
73
 
@@ -187,38 +187,68 @@ module Ruboto
187
187
  end
188
188
 
189
189
  def method_definition(class_name)
190
+ entry_point_guard = (activity_super_guard(class_name, attribute('name')) ||
191
+ service_super_guard(class_name, attribute('name')))
190
192
  method_call(
191
193
  (attribute('return') ? attribute('return') : 'void'),
192
194
  attribute('name'), parameters,
193
195
  get_elements('exception').map { |m| m.attribute('type') },
194
196
  ["if (ScriptLoader.isCalledFromJRuby()) #{super_return}",
195
- if_else('!JRubyAdapter.isInitialized()',
196
- [%Q{Log.i("Method called before JRuby runtime was initialized: #{class_name}##{attribute('name')}");},
197
- super_return]),
198
- 'String rubyClassName = scriptInfo.getRubyClassName();',
199
- "if (rubyClassName == null) #{super_return}",
200
- if_else(
201
- "(Boolean)JRubyAdapter.runScriptlet(rubyClassName + \".instance_methods(false).any?{|m| m.to_sym == :#{attribute('name')}}\")",
202
- ruby_call,
203
- if_else(
204
- "(Boolean)JRubyAdapter.runScriptlet(rubyClassName + \".instance_methods(false).any?{|m| m.to_sym == :#{snake_case_attribute}}\")",
205
- ruby_call(true),
206
- if_else(
207
- "(Boolean)JRubyAdapter.runScriptlet(rubyClassName + \".instance_methods(true).any?{|m| m.to_sym == :#{snake_case_attribute}}\")",
208
- ruby_call(true),
209
- # FIXME(uwe): Can the method be unimplemented? Is the Ruby instance always an instance of this class?
210
- #if_else(
211
- # "(Boolean)JRubyAdapter.runScriptlet(rubyClassName + \".instance_methods(true).any?{|m| m.to_sym == :#{attribute('name')}}\")",
212
- ruby_call,
213
- # [super_return]
214
- #)
215
- )
216
- )
217
- )
197
+ (entry_point_guard && (entry_point_guard + load_script)) ||
198
+ if_else('!JRubyAdapter.isInitialized()',
199
+ [%Q{Log.i("Method called before JRuby runtime was initialized: #{class_name}##{attribute('name')}");},
200
+ super_return]),
201
+ 'String rubyClassName = scriptInfo.getRubyClassName();',
202
+ "if (rubyClassName == null) #{super_return}",
203
+ if_else(
204
+ "(Boolean)JRubyAdapter.runScriptlet(rubyClassName + \".instance_methods(false).any?{|m| m.to_sym == :#{attribute('name')}}\")",
205
+ ruby_call,
206
+ if_else(
207
+ "(Boolean)JRubyAdapter.runScriptlet(rubyClassName + \".instance_methods(false).any?{|m| m.to_sym == :#{snake_case_attribute}}\")",
208
+ ruby_call(true),
209
+ if_else(
210
+ "(Boolean)JRubyAdapter.runScriptlet(rubyClassName + \".instance_methods(true).any?{|m| m.to_sym == :#{snake_case_attribute}}\")",
211
+ ruby_call(true),
212
+ # FIXME(uwe): Can the method be unimplemented? Is the Ruby instance always an instance of this class?
213
+ #if_else(
214
+ # "(Boolean)JRubyAdapter.runScriptlet(rubyClassName + \".instance_methods(true).any?{|m| m.to_sym == :#{attribute('name')}}\")",
215
+ ruby_call,
216
+ # [super_return]
217
+ #)
218
+ )
219
+ )
220
+ ),
221
+ ('ScriptLoader.unloadScript(this);' if attribute('name') == 'onDestroy'),
218
222
  ]
219
223
  ).indent.join("\n")
220
224
  end
221
225
 
226
+ def activity_super_guard(class_name, method_name)
227
+ if class_name == 'RubotoActivity' && method_name == 'onCreate'
228
+ "if (preOnCreate(#{parameters.map { |i| i[0] }.join(', ')})) #{super_return};"
229
+ end
230
+ end
231
+
232
+ def service_super_guard(class_name, method_name)
233
+ if class_name == 'RubotoService'
234
+ if method_name == 'onCreate'
235
+ 'preOnCreate();'
236
+ elsif method_name == 'onStartCommand' || method_name == 'onBind'
237
+ '' # Trigger adding of load_script
238
+ end
239
+ end
240
+ end
241
+
242
+ def load_script
243
+ <<EOF
244
+ if (JRubyAdapter.isInitialized() && scriptInfo.isReadyToLoad()) {
245
+ ScriptLoader.loadScript(this);
246
+ } else {
247
+ #{super_return}
248
+ }
249
+ EOF
250
+ end
251
+
222
252
  def constructor_definition(class_name)
223
253
  method_call(nil, class_name, parameters, nil, [super_string]).indent.join("\n")
224
254
  end
@@ -1,4 +1,4 @@
1
1
  module Ruboto
2
- VERSION = '1.0.0'
2
+ VERSION = '1.0.1'
3
3
  UPDATE_VERSION_LIMIT = '0.7.0'
4
4
  end
@@ -12,6 +12,7 @@ end
12
12
 
13
13
  # ANDROID: 10, PLATFORM: 0.5.3, JRuby: 1.7.3 '[28, 33, 46, 63]' expected, but got '[43, 48, 45, 62]'
14
14
  # ANDROID: 10, PLATFORM: 0.5.4, JRuby: 1.7.3 '[28, 33, 45, 62]' expected, but got '[28, 33, 44, 61]'
15
+ # ANDROID: 16, PLATFORM: 0.5.6, JRuby: 1.7.3 '[28, 33, 45, 62]' expected, but got '[28, 33, 44, 61]'
15
16
  # ANDROID: 16, PLATFORM: 0.6.0, JRuby: 9000.dev '[28, 33, 45, 62]' expected, but got '[28, 33, 45, 63]'
16
17
  # ANDROID: 15, PLATFORM: STANDALONE, JRuby: 1.7.0 '[28, 33, 51, 68]' expected, but got '[28, 33, 47, 64]'
17
18
  test('stack depth') do |activity|
@@ -27,8 +28,8 @@ test('stack depth') do |activity|
27
28
  version_message ="ANDROID: #{android.os.Build::VERSION::SDK_INT}, PLATFORM: #{org.ruboto.JRubyAdapter.uses_platform_apk ? org.ruboto.JRubyAdapter.platform_version_name : 'STANDALONE'}, JRuby: #{org.jruby.runtime.Constants::VERSION}"
28
29
  assert_equal [28 + os_offset[0] + jruby_offset[0],
29
30
  33 + os_offset[1] + jruby_offset[1],
30
- 45 + os_offset[2] + jruby_offset[2],
31
- 63 + os_offset[3] + jruby_offset[3]], [
31
+ 44 + os_offset[2] + jruby_offset[2],
32
+ 62 + os_offset[3] + jruby_offset[3]], [
32
33
  activity.find_view_by_id(42).text.to_i,
33
34
  activity.find_view_by_id(43).text.to_i,
34
35
  activity.find_view_by_id(44).text.to_i,
@@ -4,7 +4,6 @@ ruboto_import_widgets :LinearLayout, :ListView, :TextView
4
4
 
5
5
  class SubclassOfArrayAdapter < Java::AndroidWidget::ArrayAdapter
6
6
  def getView(position, convert_view, parent)
7
- puts 'IN get_view!!!'
8
7
  @inflater ||= context.getSystemService(Context::LAYOUT_INFLATER_SERVICE)
9
8
  row = convert_view ? convert_view : @inflater.inflate(mResource, nil)
10
9
  row.findViewById(mFieldId).text = "[#{get_item(position)}]"
@@ -0,0 +1,119 @@
1
+ require File.expand_path('test_helper', File.dirname(__FILE__))
2
+
3
+ # FIXME(uwe): Remove check when we stop supporting Android < 4.0.3
4
+ if RubotoTest::ANDROID_OS >= 15 || RubotoTest::RUBOTO_PLATFORM != 'STANDALONE'
5
+
6
+ class SqldroidTest < Test::Unit::TestCase
7
+ def setup
8
+ generate_app :bundle => [['activerecord', '<4.0.0'], 'activerecord-jdbcsqlite3-adapter', :sqldroid]
9
+ end
10
+
11
+ def teardown
12
+ cleanup_app
13
+ end
14
+
15
+ def test_sqldroid
16
+ Dir.chdir APP_DIR do
17
+ File.open('src/ruboto_test_app_activity.rb', 'w'){|f| f << <<EOF}
18
+ require 'ruboto/widget'
19
+ require 'ruboto/util/stack'
20
+ with_large_stack do
21
+ require 'active_record'
22
+ end
23
+
24
+ ruboto_import_widgets :LinearLayout, :ListView, :TextView
25
+
26
+ class MyArrayAdapter < android.widget.ArrayAdapter
27
+ def get_view(position, convert_view, parent)
28
+ @inflater ||= context.getSystemService(Context::LAYOUT_INFLATER_SERVICE)
29
+ row = convert_view ? convert_view : @inflater.inflate(mResource, nil)
30
+ row.findViewById(mFieldId).text = get_item(position)
31
+ row
32
+ rescue Exception
33
+ puts "Exception getting list item view: \#$!"
34
+ puts $!.backtrace.join("\\n")
35
+ convert_view
36
+ end
37
+ end
38
+
39
+ class RubotoTestAppActivity
40
+ def onCreate(bundle)
41
+ super
42
+ setTitle File.basename(__FILE__).chomp('_activity.rb').split('_').map { |s| "\#{s[0..0].upcase}\#{s[1..-1]}" }.join(' ')
43
+
44
+ @adapter = MyArrayAdapter.new(self, android.R.layout.simple_list_item_1 , AndroidIds::text1, [])
45
+
46
+ self.content_view =
47
+ linear_layout :orientation => LinearLayout::VERTICAL do
48
+ @text_view_margins = text_view :text => 'What hath Matz wrought?', :id => 42
49
+ @list_view = list_view :adapter => @adapter, :id => 43
50
+ end
51
+ end
52
+
53
+ def onResume
54
+ super
55
+
56
+ db_dir = "\#{application_context.files_dir}/sqlite"
57
+
58
+ with_large_stack do
59
+
60
+ ActiveRecord::Base.establish_connection(
61
+ :adapter => 'jdbcsqlite3',
62
+ :driver => 'org.sqldroid.SQLDroidDriver',
63
+ :url => "jdbc:sqldroid:\#{db_dir}?timeout=60000&retry=1000",
64
+ :database => db_dir,
65
+ )
66
+
67
+ begin
68
+ ActiveRecord::Base.connection.execute "DROP TABLE companions"
69
+ rescue ActiveRecord::StatementInvalid
70
+ # Table does not exist
71
+ end
72
+ ActiveRecord::Base.connection.execute "CREATE TABLE companions (id INTEGER PRIMARY KEY, name VARCHAR(20) NOT NULL)"
73
+ ActiveRecord::Base.connection.execute "INSERT INTO companions VALUES (1, 'Frodo')"
74
+ ActiveRecord::Base.connection.execute "INSERT INTO companions VALUES (2, 'Samwise')"
75
+ ActiveRecord::Base.connection.execute "INSERT INTO companions VALUES (3, 'Meriadoc')"
76
+ ActiveRecord::Base.connection.execute "INSERT INTO companions VALUES (4, 'Peregrin')"
77
+ ActiveRecord::Base.connection.execute "INSERT INTO companions VALUES (5, 'Gandalf')"
78
+ ActiveRecord::Base.connection.execute "INSERT INTO companions VALUES (6, 'Legolas')"
79
+ ActiveRecord::Base.connection.execute "INSERT INTO companions VALUES (7, 'Gimli')"
80
+ ActiveRecord::Base.connection.execute "INSERT INTO companions VALUES (8, 'Aragorn')"
81
+ ActiveRecord::Base.connection.execute "INSERT INTO companions VALUES (9, 'Boromir')"
82
+ companions = ActiveRecord::Base.connection.execute "SELECT name FROM companions"
83
+ run_on_ui_thread do
84
+ @adapter.add_all companions
85
+ end
86
+ end
87
+ end
88
+ end
89
+ EOF
90
+
91
+ File.open('test/src/ruboto_test_app_activity_test.rb', 'w'){|f| f << <<EOF}
92
+ activity Java::org.ruboto.test_app.RubotoTestAppActivity
93
+
94
+ setup do |activity|
95
+ start = Time.now
96
+ loop do
97
+ @text_view = activity.findViewById(42)
98
+ @list_view = activity.findViewById(43)
99
+ break if (@text_view && @list_view) || (Time.now - start > 60)
100
+ sleep 1
101
+ end
102
+ assert @text_view
103
+ assert @list_view
104
+ end
105
+
106
+ test("activity starts") do |activity|
107
+ assert true
108
+ end
109
+ EOF
110
+
111
+ end
112
+
113
+ run_app_tests
114
+ end
115
+
116
+ end
117
+
118
+ end
119
+ # EMXIF