ruboto 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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