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
|
|