calatrava 0.0.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +7 -1
- data/calatrava.gemspec +2 -2
- data/features/sample_app.feature +27 -0
- data/features/step_definitions/app_steps.rb +3 -0
- data/features/support/calatrava_app.rb +31 -0
- data/features/support/env.rb +18 -0
- data/lib/calatrava/project.rb +5 -2
- data/lib/calatrava/tasks/apache.rb +20 -10
- data/lib/calatrava/tasks/droid.rb +1 -1
- data/lib/calatrava/tasks/web.rb +5 -0
- data/lib/calatrava/templates/droid/app/bridge.coffee +21 -120
- data/lib/calatrava/templates/droid/calatrava/{src/com/CALATRAVA_TMPL → CALATRAVA_TMPL}/AndroidManifest.xml.calatrava +2 -2
- data/lib/calatrava/templates/droid/calatrava/{calatrava-build.xml → CALATRAVA_TMPL/build.xml.calatrava} +1 -1
- data/lib/calatrava/templates/droid/calatrava/src/com/CALATRAVA_TMPL/ConversionForm.java.calatrava +4 -4
- data/lib/calatrava/templates/droid/calatrava/src/com/CALATRAVA_TMPL/Title.java.calatrava +2 -2
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/KernelBridge.java +1 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/PageRegistry.java +13 -1
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/RegisteredActivity.java +7 -1
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/RhinoService.java +12 -7
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/shell/WebViewActivity.java +2 -4
- data/lib/calatrava/templates/ios/src/ConversionFormViewController.h +4 -0
- data/lib/calatrava/templates/ios/src/ConversionFormViewController.m +36 -3
- data/lib/calatrava/templates/ios/src/ConversionFormViewController.xib +144 -20
- data/lib/calatrava/templates/kernel/app/calatrava.coffee +171 -3
- data/lib/calatrava/templates/kernel/app/converter/controller.converter.coffee +37 -42
- data/lib/calatrava/templates/kernel/app/converter/init.converter.coffee +4 -4
- data/lib/calatrava/templates/kernel/spec/converter/controller.converter.spec.coffee +6 -6
- data/lib/calatrava/templates/kernel/spec/stubView.coffee +18 -2
- data/lib/calatrava/templates/package.json +0 -1
- data/lib/calatrava/templates/shell/pages/converter/conversionForm.haml +6 -4
- data/lib/calatrava/templates/shell/pages/converter/page.conversionForm.coffee +18 -24
- data/lib/calatrava/templates/shell/stylesheets/shell.scss +0 -0
- data/lib/calatrava/templates/web/app/source/bridge.coffee +61 -93
- data/lib/calatrava/version.rb +1 -1
- metadata +39 -34
- data/lib/calatrava/templates/ios/res/js/bridge.js +0 -249
- data/lib/calatrava/templates/shell/shell.scss +0 -1
    
        data/Rakefile
    CHANGED
    
    | @@ -9,7 +9,13 @@ namespace :test do | |
| 9 9 | 
             
              end
         | 
| 10 10 |  | 
| 11 11 | 
             
              Cucumber::Rake::Task.new(:features) do |t|
         | 
| 12 | 
            -
                t.cucumber_opts = "features --format pretty"
         | 
| 12 | 
            +
                t.cucumber_opts = "features --format pretty --tags ~@wip"
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              namespace :features do
         | 
| 16 | 
            +
                Cucumber::Rake::Task.new(:wip) do |t|
         | 
| 17 | 
            +
                  t.cucumber_opts = "features --format pretty --tags @wip --wip"
         | 
| 18 | 
            +
                end
         | 
| 13 19 | 
             
              end
         | 
| 14 20 | 
             
            end
         | 
| 15 21 |  | 
    
        data/calatrava.gemspec
    CHANGED
    
    | @@ -6,8 +6,8 @@ Gem::Specification.new do |s| | |
| 6 6 | 
             
              s.name        = "calatrava"
         | 
| 7 7 | 
             
              s.version     = Calatrava::Version
         | 
| 8 8 | 
             
              s.authors     = ["Giles Alexander"]
         | 
| 9 | 
            -
              s.email       = [" | 
| 10 | 
            -
              s.homepage    = ""
         | 
| 9 | 
            +
              s.email       = ["giles.alexander@gmail.com"]
         | 
| 10 | 
            +
              s.homepage    = "http://calatrava.github.com"
         | 
| 11 11 | 
             
              s.summary     = %q{Cross-platform mobile apps with native UIs}
         | 
| 12 12 | 
             
              s.description = %q{A framework to build cross-platform mobile apps with high quality native UIs.}
         | 
| 13 13 |  | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            Feature: Sample App
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              In order to get started with Calatrava
         | 
| 4 | 
            +
              As a new calatrava user
         | 
| 5 | 
            +
              I want a new Calatrava project to contain a working sample app
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              Scenario: Create a sample project
         | 
| 8 | 
            +
                When I create an app named "sample"
         | 
| 9 | 
            +
                And  I cd to "sample"
         | 
| 10 | 
            +
                And  I run `bundle install`
         | 
| 11 | 
            +
                And  I run `rake bootstrap`
         | 
| 12 | 
            +
                Then the exit status should be 0
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              Scenario: Sample app kernel
         | 
| 15 | 
            +
                When I create an app named "sample"
         | 
| 16 | 
            +
                And  I cd to "sample"
         | 
| 17 | 
            +
                And  I run `bundle install`
         | 
| 18 | 
            +
                And  I run `rake bootstrap`
         | 
| 19 | 
            +
                And  I run `rake kernel:spec`
         | 
| 20 | 
            +
                Then the exit status should be 0
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              Scenario: Mobile web sample app
         | 
| 23 | 
            +
                When I create an app named "sample"
         | 
| 24 | 
            +
                And  I cd to "sample"
         | 
| 25 | 
            +
                And  I run `bundle install`
         | 
| 26 | 
            +
                And  I run `rake bootstrap`
         | 
| 27 | 
            +
                And  I start apache
         | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            require 'aruba/api'
         | 
| 2 | 
            +
            require 'open-uri'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            class CalatravaApp
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              include Aruba::Api
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              def initialize(name)
         | 
| 9 | 
            +
                @name = name
         | 
| 10 | 
            +
                run_simple("calatrava create #{@name}")
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              def start_apache
         | 
| 14 | 
            +
                cd @name
         | 
| 15 | 
            +
                run_simple 'rake web:apache:background'
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                not_running_yet = true
         | 
| 18 | 
            +
                while not_running_yet
         | 
| 19 | 
            +
                  begin
         | 
| 20 | 
            +
                    open('http://localhost:8888') { |_| not_running_yet = false }
         | 
| 21 | 
            +
                  rescue Errno::ECONNREFUSED
         | 
| 22 | 
            +
                    # still not running
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                Kernel.at_exit do
         | 
| 27 | 
            +
                  run_simple 'rake web:apache:stop'
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            end
         | 
    
        data/features/support/env.rb
    CHANGED
    
    | @@ -3,3 +3,21 @@ require 'aruba/cucumber' | |
| 3 3 | 
             
            ENV['PATH'] = "#{File.expand_path(File.dirname(__FILE__) + '/../../bin')}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
         | 
| 4 4 |  | 
| 5 5 | 
             
            ENV['RUBYLIB'] = "#{File.expand_path(File.dirname(__FILE__) + '/../../lib')}#{File::PATH_SEPARATOR}#{ENV['RUBYLIB']}"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            Before do
         | 
| 8 | 
            +
              @aruba_timeout_seconds = 20
         | 
| 9 | 
            +
            end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            class CalatravaWorld
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              def create_app(name)
         | 
| 14 | 
            +
                @app = CalatravaApp.new(name)
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              def current_app
         | 
| 18 | 
            +
                @app
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            World { CalatravaWorld.new }
         | 
    
        data/lib/calatrava/project.rb
    CHANGED
    
    | @@ -95,11 +95,14 @@ module Calatrava | |
| 95 95 | 
             
                      FileUtils.cp(item, target_item) if File.file? item
         | 
| 96 96 | 
             
                    end
         | 
| 97 97 | 
             
                    Dir.chdir "#{@name}" do
         | 
| 98 | 
            +
                      Dir.chdir "#{@name}" do
         | 
| 99 | 
            +
                        FileUtils.mv "build.xml", "../build.xml"
         | 
| 100 | 
            +
                        FileUtils.mv "AndroidManifest.xml", "../AndroidManifest.xml"
         | 
| 101 | 
            +
                      end
         | 
| 102 | 
            +
                      FileUtils.rm_rf "#{@name}"
         | 
| 98 103 | 
             
                      Dir.chdir "src/com/#{@name}" do
         | 
| 99 104 | 
             
                        FileUtils.mv "Title.java", "#{@title}.java"
         | 
| 100 | 
            -
                        FileUtils.mv "AndroidManifest.xml", "../../../AndroidManifest.xml"
         | 
| 101 105 | 
             
                      end
         | 
| 102 | 
            -
                      FileUtils.mv "calatrava-build.xml", "build.xml"
         | 
| 103 106 | 
             
                    end
         | 
| 104 107 |  | 
| 105 108 | 
             
                    FileUtils.rm_rf "calatrava"
         | 
| @@ -16,26 +16,36 @@ else | |
| 16 16 | 
             
              LOAD_LOG_MODULE = true
         | 
| 17 17 | 
             
            end
         | 
| 18 18 |  | 
| 19 | 
            -
            def httpd(command)
         | 
| 20 | 
            -
               | 
| 19 | 
            +
            def httpd(command, opts = {})
         | 
| 20 | 
            +
              cmd = %Q{#{HTTPD} -d #{APACHE_DIR} -f conf/httpd.conf -e DEBUG -k #{command} -DNO_DETACH -DFOREGROUND}
         | 
| 21 | 
            +
              puts cmd
         | 
| 22 | 
            +
              if opts[:background]
         | 
| 23 | 
            +
                fork do
         | 
| 24 | 
            +
                  exec cmd
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              else
         | 
| 27 | 
            +
                exec cmd
         | 
| 28 | 
            +
              end
         | 
| 21 29 | 
             
            end
         | 
| 22 30 |  | 
| 23 31 | 
             
            def configure_apache
         | 
| 24 32 | 
             
              cp config_path("httpd.conf"), File.join(APACHE_DIR, 'conf')
         | 
| 25 33 | 
             
            end
         | 
| 26 34 |  | 
| 27 | 
            -
            def launch_apache
         | 
| 28 | 
            -
               | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 35 | 
            +
            def launch_apache(opts = {})
         | 
| 36 | 
            +
              if !opts[:background]
         | 
| 37 | 
            +
                puts
         | 
| 38 | 
            +
                puts "\t\t" + "*"*40
         | 
| 39 | 
            +
                puts "\t\t" + "***   STARTING APACHE ON PORT 8888   ***"
         | 
| 40 | 
            +
                puts "\t\t" + "*"*40
         | 
| 41 | 
            +
                puts
         | 
| 42 | 
            +
              end
         | 
| 33 43 |  | 
| 34 | 
            -
              httpd :start
         | 
| 44 | 
            +
              httpd :start, opts
         | 
| 35 45 | 
             
            end
         | 
| 36 46 |  | 
| 37 47 | 
             
            def stop_apache
         | 
| 38 | 
            -
              httpd  | 
| 48 | 
            +
              httpd 'graceful-stop'
         | 
| 39 49 | 
             
            end
         | 
| 40 50 |  | 
| 41 51 | 
             
            def reload_apache
         | 
| @@ -69,7 +69,7 @@ namespace :droid do | |
| 69 69 |  | 
| 70 70 | 
             
              desc "Deploy app to device/emulator"
         | 
| 71 71 | 
             
              task :deploy => :publish do
         | 
| 72 | 
            -
                sh "adb  | 
| 72 | 
            +
                sh "adb install -r artifacts/#{ENV['CALATRAVA_ENV']}/#{Calatrava::Project.current.name}-debug.apk"
         | 
| 73 73 | 
             
              end
         | 
| 74 74 |  | 
| 75 75 | 
             
              desc "Clean droid public directory"
         | 
    
        data/lib/calatrava/tasks/web.rb
    CHANGED
    
    | @@ -61,6 +61,11 @@ namespace :web do | |
| 61 61 | 
             
                  launch_apache
         | 
| 62 62 | 
             
                end
         | 
| 63 63 |  | 
| 64 | 
            +
                task :background => [:build, 'web/apache/public', APACHE_LOGS_DIR] do
         | 
| 65 | 
            +
                  configure_apache
         | 
| 66 | 
            +
                  launch_apache :background => true
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 64 69 | 
             
                desc "Reload the apache configuration"
         | 
| 65 70 | 
             
                task :reload do
         | 
| 66 71 | 
             
                  reload_apache
         | 
| @@ -1,130 +1,31 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 1 | 
            +
            calatrava ?= {}
         | 
| 2 | 
            +
            calatrava.bridge = calatrava.bridge ? {}
         | 
| 3 3 |  | 
| 4 | 
            -
             | 
| 5 | 
            -
               | 
| 6 | 
            -
              for i in [1...32]
         | 
| 7 | 
            -
                r = Math.floor(Math.random() * 16)
         | 
| 8 | 
            -
                str = str + r.toString(16)
         | 
| 9 | 
            -
              str.toUpperCase()
         | 
| 4 | 
            +
            calatrava.bridge.runtime = (() ->
         | 
| 5 | 
            +
              pages = {}
         | 
| 10 6 |  | 
| 11 | 
            -
             | 
| 12 | 
            -
              extraArgs = _.toArray(arguments).slice(1);
         | 
| 13 | 
            -
              tw.bridge.pages.pageNamed(page).dispatch.apply(tw.bridge.pages.pageNamed(page), extraArgs)
         | 
| 7 | 
            +
              changePage: (target) -> pageRegistry.changePage(target)
         | 
| 14 8 |  | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
                 | 
| 9 | 
            +
              registerProxyForPage: (proxyId, pageName) ->
         | 
| 10 | 
            +
                pages[proxyId] = pageName
         | 
| 11 | 
            +
                pageRegistry.registerProxyForPage(pageName, proxyId)
         | 
| 18 12 |  | 
| 19 | 
            -
               | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 13 | 
            +
              log: (message) -> androidRuntime.log(message)
         | 
| 14 | 
            +
              attachProxyEventHandler: (proxyId, event) ->
         | 
| 15 | 
            +
              startTimerWithTimeout: (timerId, timeout) -> pageRegistry.startTimer(timeout, timerId)
         | 
| 16 | 
            +
              openUrl: (url) -> pageRegistry.openUrl(url)
         | 
| 22 17 |  | 
| 23 | 
            -
               | 
| 24 | 
            -
                 | 
| 25 | 
            -
                 | 
| 26 | 
            -
                  @handlerRegistry[event].apply(this, args)
         | 
| 18 | 
            +
              valueOfProxyField: (proxyId, field, getId) ->
         | 
| 19 | 
            +
                value = String(pageRegistry.getValueForField(pages[proxyId], field))
         | 
| 20 | 
            +
                calatrava.inbound.fieldRead(proxyId, getId, value)
         | 
| 27 21 |  | 
| 28 | 
            -
               | 
| 29 | 
            -
                 | 
| 22 | 
            +
              renderProxy: (viewObject, proxyId) ->
         | 
| 23 | 
            +
                pageRegistry.renderPage(pages[proxyId], JSON.stringify(viewObject))
         | 
| 30 24 |  | 
| 31 | 
            -
               | 
| 32 | 
            -
                 | 
| 33 | 
            -
                pageRegistry.renderPage(@pageName, viewObject)
         | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
            tw.bridge.changePage = (target) ->
         | 
| 37 | 
            -
              pageRegistry.changePage(target)
         | 
| 38 | 
            -
              target
         | 
| 39 | 
            -
             | 
| 40 | 
            -
            tw.bridge.pages = (() ->
         | 
| 41 | 
            -
              pagesByName = {}
         | 
| 42 | 
            -
             | 
| 43 | 
            -
              pageNamed: (pageName) ->
         | 
| 44 | 
            -
                if (!pagesByName[pageName])
         | 
| 45 | 
            -
                  pagesByName[pageName] = new tw.bridge.Page(pageName)
         | 
| 46 | 
            -
                pagesByName[pageName]
         | 
| 47 | 
            -
            )()
         | 
| 48 | 
            -
             | 
| 49 | 
            -
            tw.bridge.widgets = (()->
         | 
| 50 | 
            -
              callbacks = {}
         | 
| 51 | 
            -
              display: (name, options, callback) ->
         | 
| 52 | 
            -
                pageRegistry.displayWidget(name, JSON.stringify(options))
         | 
| 53 | 
            -
                callbacks[name] = callback
         | 
| 54 | 
            -
             | 
| 55 | 
            -
              invokeCallback: (name) ->
         | 
| 56 | 
            -
                args = _.toArray(arguments).slice(1)
         | 
| 57 | 
            -
                callbacks[name].apply(this, args)
         | 
| 58 | 
            -
            )()
         | 
| 59 | 
            -
             | 
| 60 | 
            -
            tw.bridge.dialog = (()->
         | 
| 61 | 
            -
              display : (name) ->
         | 
| 62 | 
            -
                pageRegistry.displayDialog(name)
         | 
| 63 | 
            -
            )()
         | 
| 64 | 
            -
             | 
| 65 | 
            -
            tw.bridge.request = (reqOptions) ->
         | 
| 66 | 
            -
              tw.bridge.requests.issue reqOptions
         | 
| 67 | 
            -
             | 
| 68 | 
            -
            tw.bridge.requests = (() ->
         | 
| 69 | 
            -
              successHandlers = {}
         | 
| 70 | 
            -
              failureHandlers = {}
         | 
| 71 | 
            -
             | 
| 72 | 
            -
              issue: (options) ->
         | 
| 73 | 
            -
                requestId = generateRandomString()
         | 
| 74 | 
            -
                if options.body
         | 
| 75 | 
            -
                  bodyStr = options.body
         | 
| 76 | 
            -
                else
         | 
| 77 | 
            -
                  bodyStr = ""
         | 
| 78 | 
            -
                if (bodyStr.constructor != String)
         | 
| 79 | 
            -
                  bodyStr = JSON.stringify(body)
         | 
| 80 | 
            -
             | 
| 81 | 
            -
                if options.customHeaders
         | 
| 82 | 
            -
                  headers = JSON.stringify(options.customHeaders)
         | 
| 83 | 
            -
                else
         | 
| 84 | 
            -
                  headers = ""
         | 
| 85 | 
            -
             | 
| 86 | 
            -
                successHandlers[requestId] = options.success
         | 
| 87 | 
            -
                failureHandlers[requestId] = options.failure
         | 
| 88 | 
            -
                ajaxRequestManagerRegistry.makeRequest(requestId,
         | 
| 25 | 
            +
              issueRequest: (options) ->
         | 
| 26 | 
            +
                ajaxRequestManagerRegistry.makeRequest(options.requestId,
         | 
| 89 27 | 
             
                  options.url,
         | 
| 90 28 | 
             
                  options.method,
         | 
| 91 | 
            -
                   | 
| 92 | 
            -
                  headers)
         | 
| 93 | 
            -
             | 
| 94 | 
            -
              successfulResponse: (reqId, response) ->
         | 
| 95 | 
            -
                successHandlers[reqId](response)
         | 
| 96 | 
            -
                @clearHandlers(reqId)
         | 
| 97 | 
            -
             | 
| 98 | 
            -
              failureResponse: (reqId, errorCode, response) ->
         | 
| 99 | 
            -
                failureHandlers[reqId](errorCode, response)
         | 
| 100 | 
            -
                @clearHandlers(reqId)
         | 
| 101 | 
            -
             | 
| 102 | 
            -
              clearHandlers: (reqId) ->
         | 
| 103 | 
            -
                successHandlers[reqId] = null
         | 
| 104 | 
            -
                failureHandlers[reqId] = null
         | 
| 105 | 
            -
            )()
         | 
| 106 | 
            -
             | 
| 107 | 
            -
            tw.bridge.alert = (message) ->
         | 
| 108 | 
            -
              pageRegistry.alert(message)
         | 
| 109 | 
            -
             | 
| 110 | 
            -
            tw.bridge.openUrl = (url) ->
         | 
| 111 | 
            -
              pageRegistry.openUrl(url)
         | 
| 112 | 
            -
             | 
| 113 | 
            -
            tw.bridge.trackEvent = (pageName, channel, eventName, variables, properties) ->
         | 
| 114 | 
            -
              pageRegistry.track(pageName, channel, eventName, variables, properties)
         | 
| 115 | 
            -
             | 
| 116 | 
            -
            tw.bridge.timers = (() ->
         | 
| 117 | 
            -
              callbacks = {}
         | 
| 118 | 
            -
             | 
| 119 | 
            -
              start: (timeout, callback) ->
         | 
| 120 | 
            -
                timerId = generateRandomString()
         | 
| 121 | 
            -
                callbacks[timerId] = callback
         | 
| 122 | 
            -
                pageRegistry.startTimer(timeout, timerId)
         | 
| 123 | 
            -
                timerId
         | 
| 124 | 
            -
             | 
| 125 | 
            -
              fireTimer: (timerId) ->
         | 
| 126 | 
            -
                callbacks[timerId]() if callbacks[timerId]
         | 
| 127 | 
            -
             | 
| 128 | 
            -
              clearTimer: (timerId) ->
         | 
| 129 | 
            -
                delete callbacks[timerId]
         | 
| 29 | 
            +
                  options.body,
         | 
| 30 | 
            +
                  options.headers)
         | 
| 130 31 | 
             
            )()
         | 
| @@ -1,10 +1,10 @@ | |
| 1 1 | 
             
            <?xml version="1.0" encoding="utf-8"?>
         | 
| 2 2 | 
             
            <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         | 
| 3 | 
            -
                  package="com.{{  | 
| 3 | 
            +
                  package="com.{{ project_slug }}"
         | 
| 4 4 | 
             
                  android:versionCode="1"
         | 
| 5 5 | 
             
                  android:versionName="1.0">
         | 
| 6 6 | 
             
                <application android:label="@string/app_name" >
         | 
| 7 | 
            -
                    <activity android:name="com.{{  | 
| 7 | 
            +
                    <activity android:name="com.{{ project_slug }}.{{ project_title }}"
         | 
| 8 8 | 
             
                              android:label="@string/app_name">
         | 
| 9 9 | 
             
                        <intent-filter>
         | 
| 10 10 | 
             
                            <action android:name="android.intent.action.MAIN" />
         | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 2 | 
             
            <!-- A standard Android ant build file, with changes to support calatrava.
         | 
| 3 3 | 
             
                 It incorporates ivy to manage dependencies. -->
         | 
| 4 | 
            -
            <project name=" | 
| 4 | 
            +
            <project name="{{ project_slug }}" default="help">
         | 
| 5 5 |  | 
| 6 6 | 
             
                <!-- The local.properties file is created and updated by the 'android' tool.
         | 
| 7 7 | 
             
                     It contains the path to the SDK. It should *NOT* be checked into
         | 
    
        data/lib/calatrava/templates/droid/calatrava/src/com/CALATRAVA_TMPL/ConversionForm.java.calatrava
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            package com.{{  | 
| 1 | 
            +
            package com.{{ project_slug }};
         | 
| 2 2 |  | 
| 3 3 | 
             
            import com.calatrava.CalatravaPage;
         | 
| 4 4 | 
             
            import com.calatrava.shell.WebViewActivity;
         | 
| @@ -17,11 +17,11 @@ public class ConversionForm extends WebViewActivity | |
| 17 17 |  | 
| 18 18 | 
             
              @Override
         | 
| 19 19 | 
             
              protected List<String> getEvents() {
         | 
| 20 | 
            -
                return Arrays.asList("selectedInCurrency", "selectedOutCurrency");
         | 
| 20 | 
            +
                return Arrays.asList("selectedInCurrency", "selectedOutCurrency", "convert");
         | 
| 21 21 | 
             
              }
         | 
| 22 22 |  | 
| 23 23 | 
             
              @Override
         | 
| 24 24 | 
             
              protected List<String> getFields() {
         | 
| 25 | 
            -
                return  | 
| 25 | 
            +
                return Arrays.asList("in_amount", "in_currency", "out_amount", "out_currency");
         | 
| 26 26 | 
             
              }
         | 
| 27 | 
            -
            }
         | 
| 27 | 
            +
            }
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            package com.{{  | 
| 1 | 
            +
            package com.{{ project_slug }};
         | 
| 2 2 |  | 
| 3 3 | 
             
            import android.app.Activity;
         | 
| 4 4 | 
             
            import android.os.Bundle;
         | 
| @@ -14,7 +14,7 @@ public class {{ project_title }} extends Activity | |
| 14 14 | 
             
                    super.onCreate(savedInstanceState);
         | 
| 15 15 | 
             
                    setContentView(R.layout.main);
         | 
| 16 16 |  | 
| 17 | 
            -
                    Launcher.launchKernel("com. | 
| 17 | 
            +
                    Launcher.launchKernel("com.{{ project_slug }}", this, getApplication(), new Runnable() {
         | 
| 18 18 | 
             
                      public void run() {
         | 
| 19 19 | 
             
                        Launcher.launchFlow("example.converter.start");
         | 
| 20 20 | 
             
                      }
         | 
| @@ -31,6 +31,7 @@ public class PageRegistry { | |
| 31 31 | 
             
              private RhinoService rhino;
         | 
| 32 32 | 
             
              private Map<String, Class<?>> pageFactories = new HashMap<String, Class<?>>();
         | 
| 33 33 | 
             
              private Map<String, RegisteredPage> registeredPages = new HashMap<String, RegisteredPage>();
         | 
| 34 | 
            +
              private Map<String, String> proxyByPage = new HashMap<String, String>();
         | 
| 34 35 |  | 
| 35 36 | 
             
              public static PageRegistry sharedRegistry() {
         | 
| 36 37 | 
             
                return sharedRegistry;
         | 
| @@ -84,6 +85,11 @@ public class PageRegistry { | |
| 84 85 | 
             
                  }               
         | 
| 85 86 | 
             
                }
         | 
| 86 87 | 
             
              }
         | 
| 88 | 
            +
             | 
| 89 | 
            +
              public void registerProxyForPage(String pageName, String proxyId) {
         | 
| 90 | 
            +
                Log.d(TAG, "Attaching proxy '" + proxyId + "' to name '" + pageName + "'");
         | 
| 91 | 
            +
                proxyByPage.put(pageName, proxyId);
         | 
| 92 | 
            +
              }
         | 
| 87 93 |  | 
| 88 94 | 
             
              public void changePage(String target) {
         | 
| 89 95 | 
             
                Log.d(TAG, "changePage('" + target + "')");
         | 
| @@ -92,6 +98,12 @@ public class PageRegistry { | |
| 92 98 | 
             
                appContext.startActivity(new Intent(appContext, activityClass));
         | 
| 93 99 | 
             
              }
         | 
| 94 100 |  | 
| 101 | 
            +
              public void triggerEvent(String pageName, String event, String... extraArgs) {
         | 
| 102 | 
            +
                String proxy = proxyByPage.get(pageName);
         | 
| 103 | 
            +
                Log.d(TAG, "Dispatching to proxy '" + proxy + "'");
         | 
| 104 | 
            +
                rhino.triggerEvent(proxy, event, extraArgs);
         | 
| 105 | 
            +
              }
         | 
| 106 | 
            +
             | 
| 95 107 | 
             
              public void displayWidget(String name, String options) {
         | 
| 96 108 | 
             
                appContext.sendBroadcast(new Intent("com.calatrava.widget").putExtra("name", name).putExtra("options", options));
         | 
| 97 109 | 
             
              }
         | 
| @@ -120,7 +132,7 @@ public class PageRegistry { | |
| 120 132 | 
             
                  public void run() {
         | 
| 121 133 | 
             
                    timer.cancel();
         | 
| 122 134 | 
             
                    timer.purge();
         | 
| 123 | 
            -
                    rhino.callJsFunction(" | 
| 135 | 
            +
                    rhino.callJsFunction("calatrava.inbound.fireTimer", new String[] {timerId});
         | 
| 124 136 | 
             
                  }
         | 
| 125 137 | 
             
                }, 1000 * timeout);
         | 
| 126 138 | 
             
              }
         | 
    
        data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/RegisteredActivity.java
    CHANGED
    
    | @@ -73,13 +73,19 @@ public abstract class RegisteredActivity extends Activity { | |
| 73 73 | 
             
                super.onDestroy();
         | 
| 74 74 | 
             
                unbindService(connection);
         | 
| 75 75 | 
             
              }
         | 
| 76 | 
            +
             | 
| 77 | 
            +
              public void triggerEvent(String event, String... extraArgs) {
         | 
| 78 | 
            +
                PageRegistry.sharedRegistry().triggerEvent(getPageName(), event, extraArgs);
         | 
| 79 | 
            +
              }
         | 
| 76 80 |  | 
| 77 81 | 
             
              public void invokeWidgetCallback(String...args) {
         | 
| 78 | 
            -
                rhino.callJsFunction(" | 
| 82 | 
            +
                rhino.callJsFunction("calatrava.inbound.invokeCallback", args);
         | 
| 79 83 | 
             
              }
         | 
| 80 84 |  | 
| 81 85 | 
             
              protected abstract void onRhinoConnected(RhinoService rhino);
         | 
| 82 86 |  | 
| 87 | 
            +
              protected abstract String getPageName();
         | 
| 88 | 
            +
             | 
| 83 89 | 
             
              public abstract String getFieldValue(String field);
         | 
| 84 90 |  | 
| 85 91 | 
             
              public abstract void render(final String json);
         | 
| @@ -42,6 +42,7 @@ public class RhinoService extends Service { | |
| 42 42 |  | 
| 43 43 | 
             
                  Object wrappedRegistry = Context.javaToJS(PageRegistry.sharedRegistry(), mScope);
         | 
| 44 44 | 
             
                  ScriptableObject.putProperty(mScope, "pageRegistry", wrappedRegistry);
         | 
| 45 | 
            +
                  ScriptableObject.putProperty(mScope, "androidRuntime", this);
         | 
| 45 46 |  | 
| 46 47 | 
             
                  Object wrappedAjaxRequestManagerRegistry = Context.javaToJS(AjaxRequestManager.sharedManager(), mScope);
         | 
| 47 48 | 
             
                  ScriptableObject.putProperty(mScope, "ajaxRequestManagerRegistry", wrappedAjaxRequestManagerRegistry);
         | 
| @@ -75,8 +76,8 @@ public class RhinoService extends Service { | |
| 75 76 | 
             
                evaller.load(source, name);
         | 
| 76 77 | 
             
              }
         | 
| 77 78 |  | 
| 78 | 
            -
              public void triggerEvent(String  | 
| 79 | 
            -
                evaller.triggerEvent( | 
| 79 | 
            +
              public void triggerEvent(String proxy, String eventId, String[] extraArgs) {
         | 
| 80 | 
            +
                evaller.triggerEvent(proxy, eventId, extraArgs);
         | 
| 80 81 | 
             
              }
         | 
| 81 82 |  | 
| 82 83 | 
             
              public void invokeSuccessCallback(String requestId, String response) {
         | 
| @@ -87,6 +88,10 @@ public class RhinoService extends Service { | |
| 87 88 | 
             
                evaller.ajaxFailureResponse(requestId, statusCode, responseBody);
         | 
| 88 89 | 
             
              }
         | 
| 89 90 |  | 
| 91 | 
            +
              public void log(String message) {
         | 
| 92 | 
            +
                Log.d(TAG, message);
         | 
| 93 | 
            +
              }
         | 
| 94 | 
            +
             | 
| 90 95 | 
             
              public void callJsFunction(String function) {
         | 
| 91 96 | 
             
                evaller.callJsFunction(function);
         | 
| 92 97 | 
             
              }
         | 
| @@ -149,15 +154,15 @@ public class RhinoService extends Service { | |
| 149 154 | 
             
                  dispatchJs(js);
         | 
| 150 155 | 
             
                }
         | 
| 151 156 |  | 
| 152 | 
            -
                public void triggerEvent(String  | 
| 157 | 
            +
                public void triggerEvent(String proxy, String eventId, String[] extraArgs) {
         | 
| 153 158 | 
             
                  StringBuilder sb = new StringBuilder("");
         | 
| 154 159 | 
             
                  for (String arg : extraArgs) {
         | 
| 155 160 | 
             
                    sb.append(", '");
         | 
| 156 161 | 
             
                    sb.append(arg);
         | 
| 157 162 | 
             
                    sb.append("'");
         | 
| 158 163 | 
             
                  }
         | 
| 159 | 
            -
                  String js = " | 
| 160 | 
            -
                      .replace("{0}",  | 
| 164 | 
            +
                  String js = "calatrava.inbound.dispatchEvent('{0}', '{1}'{2});"
         | 
| 165 | 
            +
                      .replace("{0}", proxy)
         | 
| 161 166 | 
             
                      .replace("{1}", eventId)
         | 
| 162 167 | 
             
                      .replace("{2}", sb.toString());
         | 
| 163 168 |  | 
| @@ -167,14 +172,14 @@ public class RhinoService extends Service { | |
| 167 172 | 
             
                }
         | 
| 168 173 |  | 
| 169 174 | 
             
                public void ajaxSuccessfulResponse(String requestId, String json) {
         | 
| 170 | 
            -
                  String js = " | 
| 175 | 
            +
                  String js = "calatrava.inbound.successfulResponse('{0}', '{1}');"
         | 
| 171 176 | 
             
                      .replace("{0}", requestId)
         | 
| 172 177 | 
             
                      .replace("{1}", json);
         | 
| 173 178 | 
             
                  dispatchJs(js);
         | 
| 174 179 | 
             
                }
         | 
| 175 180 |  | 
| 176 181 | 
             
                public void ajaxFailureResponse(String requestId, int statusCode, String responseBody) {
         | 
| 177 | 
            -
                  String js = " | 
| 182 | 
            +
                  String js = "calatrava.inbound.failureResponse('{0}', {1}, '{2}');"
         | 
| 178 183 | 
             
                      .replace("{0}", requestId)
         | 
| 179 184 | 
             
                      .replace("{1}", Integer.toString(statusCode))
         | 
| 180 185 | 
             
                      .replace("{2}", responseBody);
         | 
| @@ -112,8 +112,6 @@ public abstract class WebViewActivity extends RegisteredActivity { | |
| 112 112 | 
             
                });
         | 
| 113 113 | 
             
              }
         | 
| 114 114 |  | 
| 115 | 
            -
              protected abstract String getPageName();
         | 
| 116 | 
            -
             | 
| 117 115 | 
             
              protected abstract List<String> getEvents();
         | 
| 118 116 |  | 
| 119 117 | 
             
              protected abstract List<String> getFields();
         | 
| @@ -159,7 +157,7 @@ public abstract class WebViewActivity extends RegisteredActivity { | |
| 159 157 | 
             
              }
         | 
| 160 158 |  | 
| 161 159 | 
             
              private void pageHasOpened() {
         | 
| 162 | 
            -
                 | 
| 160 | 
            +
                triggerEvent("pageOpened", new String[] {});
         | 
| 163 161 | 
             
              }
         | 
| 164 162 |  | 
| 165 163 | 
             
              private void onPageLoadCompleted() {
         | 
| @@ -230,7 +228,7 @@ public abstract class WebViewActivity extends RegisteredActivity { | |
| 230 228 | 
             
                  } else {
         | 
| 231 229 | 
             
                    Log.d(TAG, "extraArgs were null!");
         | 
| 232 230 | 
             
                  }
         | 
| 233 | 
            -
                   | 
| 231 | 
            +
                  triggerEvent(event, extraArgs);
         | 
| 234 232 | 
             
                }
         | 
| 235 233 |  | 
| 236 234 | 
             
                public void onRenderComplete(Object ignored) {
         | 
| @@ -10,6 +10,10 @@ | |
| 10 10 |  | 
| 11 11 | 
             
            @interface ConversionFormViewController : BaseUIViewController<UIPickerViewDataSource, UIPickerViewDelegate>
         | 
| 12 12 |  | 
| 13 | 
            +
            @property (retain, nonatomic) IBOutlet UITextField *inAmount;
         | 
| 14 | 
            +
            @property (retain, nonatomic) IBOutlet UITextField *outAmount;
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            - (IBAction)convert:(id)sender;
         | 
| 13 17 | 
             
            - (void)render:(NSDictionary *)jsViewObject;
         | 
| 14 18 |  | 
| 15 19 |  |