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.
- checksums.yaml +4 -4
- data/Gemfile.lock +4 -4
- data/RELEASE_CANDICATE_DOC.md +4 -17
- data/RELEASE_DOC.md +42 -43
- data/Rakefile +33 -11
- data/assets/rakelib/ruboto.rake +4 -2
- data/assets/samples/sample_broadcast_receiver.rb +1 -1
- data/assets/src/InheritingBroadcastReceiver.java +0 -3
- data/assets/src/InheritingClass.java +4 -9
- data/assets/src/InheritingService.java +0 -5
- data/assets/src/RubotoActivity.java +12 -52
- data/assets/src/RubotoBroadcastReceiver.java +3 -10
- data/assets/src/RubotoService.java +5 -102
- data/assets/src/org/ruboto/JRubyAdapter.java +7 -6
- data/assets/src/org/ruboto/ScriptLoader.java +2 -29
- data/lib/ruboto/util/build.rb +26 -14
- data/lib/ruboto/util/emulator.rb +27 -11
- data/lib/ruboto/util/update.rb +15 -10
- data/lib/ruboto/util/verify.rb +1 -2
- data/lib/ruboto/util/xml_element.rb +53 -23
- data/lib/ruboto/version.rb +1 -1
- data/test/activity/stack_activity_test.rb +3 -2
- data/test/activity/subclass_activity.rb +0 -1
- data/test/arjdbc_test.rb +119 -0
- data/test/rake_test.rb +10 -0
- data/test/ruboto_gen_test.rb +4 -3
- data/test/sample_broadcast_receiver_test.rb +31 -0
- data/test/test_helper.rb +2 -2
- metadata +26 -24
| @@ -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. | 
| 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 | 
            -
                 | 
| 123 | 
            +
                public static void unloadScript(RubotoComponent component) {
         | 
| 151 124 | 
             
                    ((Map)JRubyAdapter.get("RUBOTO_JAVA_PROXIES")).remove(component.getScriptInfo().getRubyInstance());
         | 
| 152 125 | 
             
                }
         | 
| 153 126 |  | 
    
        data/lib/ruboto/util/build.rb
    CHANGED
    
    | @@ -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 | 
            -
             | 
| 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] | 
| 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
         | 
    
        data/lib/ruboto/util/emulator.rb
    CHANGED
    
    | @@ -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 | 
            -
             | 
| 96 | 
            -
             | 
| 97 | 
            -
             | 
| 98 | 
            -
             | 
| 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 | 
            -
             | 
| 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
         | 
    
        data/lib/ruboto/util/update.rb
    CHANGED
    
    | @@ -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 | 
            -
                     | 
| 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 | 
            -
             | 
| 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 | 
            -
             | 
| 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 | 
            -
                           | 
| 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  | 
| 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  | 
| 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  | 
| 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  | 
| 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  | 
| 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  | 
| 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
         | 
    
        data/lib/ruboto/util/verify.rb
    CHANGED
    
    | @@ -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 | 
            -
             | 
| 196 | 
            -
             | 
| 197 | 
            -
             | 
| 198 | 
            -
             | 
| 199 | 
            -
             | 
| 200 | 
            -
             | 
| 201 | 
            -
             | 
| 202 | 
            -
             | 
| 203 | 
            -
             | 
| 204 | 
            -
             | 
| 205 | 
            -
             | 
| 206 | 
            -
             | 
| 207 | 
            -
             | 
| 208 | 
            -
             | 
| 209 | 
            -
             | 
| 210 | 
            -
             | 
| 211 | 
            -
             | 
| 212 | 
            -
             | 
| 213 | 
            -
             | 
| 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
         | 
    
        data/lib/ruboto/version.rb
    CHANGED
    
    
| @@ -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 | 
            -
                             | 
| 31 | 
            -
                             | 
| 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)}]"
         | 
    
        data/test/arjdbc_test.rb
    ADDED
    
    | @@ -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
         |