calatrava 0.6.6 → 0.6.7

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.
Files changed (38) hide show
  1. data/.travis.yml +1 -0
  2. data/CHANGES.markdown +35 -0
  3. data/Gemfile +4 -2
  4. data/Gemfile.lock +46 -1
  5. data/contracts/rate-exchange.jns +12 -0
  6. data/lib/calatrava/apache.rb +1 -1
  7. data/lib/calatrava/mobile_web_app.rb +7 -0
  8. data/lib/calatrava/templates/.auto_compile.rb +11 -0
  9. data/lib/calatrava/templates/.gitignore +24 -0
  10. data/lib/calatrava/templates/Gemfile.calatrava +6 -3
  11. data/lib/calatrava/templates/build_env.sh +2 -1
  12. data/lib/calatrava/templates/config/environments.yml +4 -4
  13. data/lib/calatrava/templates/config/templates/env.coffee.erb +3 -6
  14. data/lib/calatrava/templates/config/templates/httpd.conf.erb +1 -1
  15. data/lib/calatrava/templates/droid/calatrava/CALATRAVA_TMPL/AndroidManifest.xml.calatrava +1 -0
  16. data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/AjaxRequestManager.java +1 -1
  17. data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/NativePageStateManager.java +32 -0
  18. data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/PageStateManager.java +13 -0
  19. data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/RegisteredActivity.java +28 -2
  20. data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/shell/WebViewActivity.java +12 -62
  21. data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/shell/WebViewPageStateManager.java +89 -0
  22. data/lib/calatrava/templates/ios/Podfile.calatrava +1 -1
  23. data/lib/calatrava/templates/kernel/app/calatrava.coffee +3 -3
  24. data/lib/calatrava/templates/kernel/app/converter/controller.converter.coffee +7 -5
  25. data/lib/calatrava/templates/kernel/app/converter/init.converter.coffee +1 -1
  26. data/lib/calatrava/templates/kernel/app/converter/repository.converter.coffee +11 -0
  27. data/lib/calatrava/templates/kernel/features/support/bridge.coffee +20 -25
  28. data/lib/calatrava/templates/kernel/features/support/spec_helper.js +4 -4
  29. data/lib/calatrava/templates/kernel/plugins/alert.coffee +2 -2
  30. data/lib/calatrava/templates/kernel/spec/converter/controller.converter.spec.coffee +42 -19
  31. data/lib/calatrava/templates/kernel/spec/converter/repository.converter.spec.coffee +27 -0
  32. data/lib/calatrava/templates/kernel/spec/environment.spec_helper.coffee +3 -7
  33. data/lib/calatrava/templates/kernel/spec/spec_helper.js +3 -2
  34. data/lib/calatrava/templates/web/app/source/bridge.coffee +3 -7
  35. data/lib/calatrava/templates/web/app/source/init.coffee +6 -3
  36. data/lib/calatrava/version.rb +1 -1
  37. data/tools/janus.jar +0 -0
  38. metadata +11 -2
data/.travis.yml CHANGED
@@ -2,3 +2,4 @@ language: ruby
2
2
  rvm: 1.9.3
3
3
  script:
4
4
  - bundle exec rake test:rspec test:features:travis
5
+ - java -jar tools/janus.jar --verify contracts/rate-exchange.jns | grep "(0 failed)"
data/CHANGES.markdown CHANGED
@@ -1,3 +1,24 @@
1
+ ## v0.6.7
2
+
3
+ New features:
4
+ * Compile Kernel/Shell coffeescript files automatically upon change,
5
+ when apache is running
6
+ * Enhance currency converter sample app to start using a remote service
7
+
8
+ Bugs Fixed:
9
+ * [Issue #54][i54]: [droid] Ajax IOExceptions aren't properly passed
10
+ around
11
+ * [Issue #71][i71]: [web] Passed forward the error response in a ajax
12
+ call failure
13
+ * [iOS Issue #9][ios-i9]: Fixes a startup crash
14
+ * [Issue #75][i75]: calatrava.confirm callback argument is not defined
15
+ * [Issue #63][i63]: Update stub namespace of the calatrava brigde for
16
+ template spec files
17
+ * [Issue #76][i76]: Enable render for Native Android views
18
+ * [Issue #33][i33]: 'env: node: No such file or directory" build error
19
+ in xcode trying to run base project
20
+ * [Issue #83][i83]: Bundler might install multiple cocoapods version
21
+
1
22
  ## v0.6.6
2
23
  * Fix to add mac specific dependencies conditionally
3
24
 
@@ -124,6 +145,10 @@ Changes that will affect existing projects:
124
145
  * [James Gregory](https://github.com/jagregory)
125
146
  * [Sneha Venkatesh](https://github.com/snehayv)
126
147
  * [Dan Tao](https://github.com/dtao)
148
+ * [Priyank Gupta](https://github.com/priyaaank)
149
+ * [Rick Carragher](https://github.com/rcarragher)
150
+ * [Pedro Leal](https://github.com/pedrombl)
151
+ * [Prasanna Pendse](https://github.com/prasanna)
127
152
 
128
153
  [i5]: https://github.com/calatrava/calatrava/issues/5
129
154
  [i12]: https://github.com/calatrava/calatrava/issues/12
@@ -147,3 +172,13 @@ Changes that will affect existing projects:
147
172
  [i43]: https://github.com/calatrava/calatrava/issues/43
148
173
  [ios-i1]: https://github.com/calatrava/calatrava-ios/issues/1
149
174
  [ios-i4]: https://github.com/calatrava/calatrava-ios/pull/4
175
+ [i67]: https://github.com/calatrava/calatrava/pull/67
176
+ [i72]: https://github.com/calatrava/calatrava/issues/72
177
+ [i71]: https://github.com/calatrava/calatrava/pull/71
178
+ [i54]: https://github.com/calatrava/calatrava/pull/54
179
+ [ios-i9]: https://github.com/calatrava/calatrava-ios/pull/9
180
+ [i75]: https://github.com/calatrava/calatrava/issues/75
181
+ [i63]: https://github.com/calatrava/calatrava/pull/63
182
+ [i76]: https://github.com/calatrava/calatrava/pull/76
183
+ [i33]: https://github.com/calatrava/calatrava/issues/33
184
+ [i83]: https://github.com/calatrava/calatrava/issues/83
data/Gemfile CHANGED
@@ -2,5 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in calatrava.gemspec
4
4
  gemspec
5
- xcodeproj
6
- cocoapods
5
+ if RUBY_PLATFORM =~ /darwin/
6
+ gem "xcodeproj"
7
+ gem "cocoapods"
8
+ end
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- calatrava (0.6.5)
4
+ calatrava (0.6.6)
5
5
  cucumber (~> 1.2.1)
6
6
  haml (~> 3.1.7)
7
7
  mustache (~> 0.99.4)
@@ -13,6 +13,10 @@ PATH
13
13
  GEM
14
14
  remote: https://rubygems.org/
15
15
  specs:
16
+ activesupport (3.2.13)
17
+ i18n (= 0.6.1)
18
+ multi_json (~> 1.0)
19
+ addressable (2.3.4)
16
20
  aruba (0.5.1)
17
21
  childprocess (~> 0.3.6)
18
22
  cucumber (>= 1.1.1)
@@ -20,19 +24,55 @@ GEM
20
24
  builder (3.1.4)
21
25
  childprocess (0.3.6)
22
26
  ffi (~> 1.0, >= 1.0.6)
27
+ claide (0.2.0)
28
+ cocoapods (0.19.1)
29
+ activesupport (~> 3.2.13)
30
+ claide (~> 0.2.0)
31
+ cocoapods-core (= 0.19.1)
32
+ cocoapods-downloader (~> 0.1.0)
33
+ colored (~> 1.2)
34
+ escape (~> 0.0.4)
35
+ faraday (~> 0.8.1)
36
+ json (~> 1.7.3)
37
+ octokit (~> 1.7)
38
+ open4 (~> 1.3.0)
39
+ rake (~> 10.0.0)
40
+ xcodeproj (~> 0.5.5)
41
+ cocoapods-core (0.19.1)
42
+ activesupport (~> 3.2.13)
43
+ rake (~> 10.0.0)
44
+ cocoapods-downloader (0.1.0)
45
+ colored (1.2)
23
46
  cucumber (1.2.1)
24
47
  builder (>= 2.1.2)
25
48
  diff-lcs (>= 1.1.3)
26
49
  gherkin (~> 2.11.0)
27
50
  json (>= 1.4.6)
28
51
  diff-lcs (1.1.3)
52
+ escape (0.0.4)
53
+ faraday (0.8.7)
54
+ multipart-post (~> 1.1)
55
+ faraday_middleware (0.9.0)
56
+ faraday (>= 0.7.4, < 0.9)
29
57
  ffi (1.2.0)
30
58
  gherkin (2.11.5)
31
59
  json (>= 1.4.6)
32
60
  haml (3.1.8)
61
+ hashie (2.0.5)
62
+ i18n (0.6.1)
33
63
  json (1.7.5)
34
64
  multi_json (1.7.3)
65
+ multipart-post (1.2.0)
35
66
  mustache (0.99.4)
67
+ netrc (0.7.7)
68
+ octokit (1.24.0)
69
+ addressable (~> 2.2)
70
+ faraday (~> 0.8)
71
+ faraday_middleware (~> 0.9)
72
+ hashie (~> 2.0)
73
+ multi_json (~> 1.3)
74
+ netrc (~> 0.7.7)
75
+ open4 (1.3.0)
36
76
  rake (10.0.4)
37
77
  rspec (2.12.0)
38
78
  rspec-core (~> 2.12.0)
@@ -53,6 +93,9 @@ GEM
53
93
  watir-webdriver (0.6.4)
54
94
  selenium-webdriver (>= 2.18.0)
55
95
  websocket (1.0.7)
96
+ xcodeproj (0.5.5)
97
+ activesupport (~> 3.2.13)
98
+ colored (~> 1.2)
56
99
 
57
100
  PLATFORMS
58
101
  ruby
@@ -60,4 +103,6 @@ PLATFORMS
60
103
  DEPENDENCIES
61
104
  aruba
62
105
  calatrava!
106
+ cocoapods
63
107
  rspec
108
+ xcodeproj
@@ -0,0 +1,12 @@
1
+ (service
2
+ "Rate Exchange"
3
+
4
+ (contract "Get currency exchange rate"
5
+ (method :get)
6
+ (url "http://rate-exchange.appspot.com/currency?from=USD&to=INR")
7
+
8
+ (should-have :path "$.to" :equal-to "INR")
9
+ (should-have :path "$.from" :equal-to "USD")
10
+ (should-have :path "$.rate" :of-type :number)
11
+ )
12
+ )
@@ -75,7 +75,7 @@ module Calatrava
75
75
  end
76
76
 
77
77
  desc "launch a non-daemon apache instance on port 8888 which will serve our local app and also proxy to backend services"
78
- task :start => ['web:build', apache_public_dir, apache_logs_dir, "#{apache_conf_dir}/httpd.conf"] do
78
+ task :start => ['web:build', apache_public_dir, apache_logs_dir, "#{apache_conf_dir}/httpd.conf", 'web:autocompile'] do
79
79
  launch_apache
80
80
  end
81
81
 
@@ -69,6 +69,13 @@ module Calatrava
69
69
  rm_rf build_dir
70
70
  end
71
71
 
72
+ desc "Auto compile shell and kernel files"
73
+ task :autocompile do
74
+ fork do
75
+ exec "ruby ./.auto_compile.rb"
76
+ end
77
+ end
78
+
72
79
  namespace :apache do
73
80
  @apache.install_tasks
74
81
  end
@@ -0,0 +1,11 @@
1
+ if Gem::Specification.find_all_by_name('filewatcher').count > 0
2
+ require 'filewatcher'
3
+ FileWatcher.new(Dir["kernel/app/**/*.coffee", "kernel/plugins/**/*coffee", "shell/**/*.coffee"]).watch do |filename|
4
+ puts "Recompiling file " + filename
5
+ system "node_modules/coffee-script/bin/coffee --compile --output web/public/scripts #{filename}"
6
+ end
7
+ else
8
+ $stderr.puts("*"*100)
9
+ $stderr.puts("File watcher gem is not present as part of gem set. Your kernel and shell files won't be auto compiled.")
10
+ $stderr.puts("*"*100)
11
+ end
@@ -0,0 +1,24 @@
1
+ artifacts/
2
+ config/result/
3
+ droid/*/ant/
4
+ droid/*/ivy/
5
+ droid/*/assets/calatrava/
6
+ droid/*/bin/
7
+ droid/*/gen/
8
+ node_modules/
9
+ .idea/
10
+ .node_updated
11
+ ios/public/
12
+ ios/*.xcworkspace/
13
+ .sass-cache/
14
+ .rake/
15
+ web/apache/conf/httpd.conf
16
+ web/apache/logs/
17
+ web/apache/public
18
+ web/public/
19
+ *.iml
20
+ .DS_Store
21
+ *.apk
22
+ *.ap_
23
+ *.dex
24
+ *.class
@@ -1,6 +1,9 @@
1
1
  source :rubygems
2
2
 
3
- gem "rake"
3
+ gem "rake", ">= 0.9.5"
4
4
  gem "calatrava"{{#dev?}}, :path => '../'{{/dev?}}
5
- {{#mac?}}gem "xcodeproj"
6
- gem "cocoapods"{{/mac?}}
5
+ {{#mac?}}gem "xcodeproj", ">= 0.4.0"
6
+ gem "cocoapods", ">= 0.16.0"{{/mac?}}
7
+
8
+ #auto compile shell and kernel for webapp. If you remove this, it'll stop auto compiling
9
+ gem "filewatcher"
@@ -1,2 +1,3 @@
1
+ export PATH=$PATH:/usr/local/bin
1
2
  source ~/.rvm/scripts/rvm
2
- rvm rvmrc load
3
+ rvm rvmrc load
@@ -1,17 +1,17 @@
1
1
  local:
2
- api_endpoint : "http://localhost:8081"
2
+ api_endpoint : "http://rate-exchange.appspot.com"
3
3
  web_port : 8888
4
4
 
5
5
  development:
6
- api_endpoint : "http://localhost:8081"
6
+ api_endpoint : "http://rate-exchange.appspot.com"
7
7
  web_port : 8888
8
8
 
9
9
  test:
10
- api_endpoint : "http://localhost:8081"
10
+ api_endpoint : "http://rate-exchange.appspot.com"
11
11
  web_port : 8888
12
12
 
13
13
  automation:
14
- api_endpoint : "http://localhost:8081"
14
+ api_endpoint : "http://rate-exchange.appspot.com"
15
15
  web_port : 8889
16
16
 
17
17
  production:
@@ -1,7 +1,4 @@
1
- root = exports ? this
2
- root.tw = root.tw ? {}
3
- tw = root.tw
4
- tw.bridge = tw.bridge ? {}
1
+ example ?= {}
2
+ example.converter ?= {}
5
3
 
6
- tw.bridge.environment = () ->
7
- serviceEndpoint: "<%= configuration['service_endpoint'] %>"
4
+ example.converter.apiEndpoint = "<%= configuration['api_endpoint'] %>" if _.isUndefined(example.converter.apiEndpoint)
@@ -24,7 +24,7 @@ Listen <%= configuration['web_port'] %>
24
24
 
25
25
  ProxyRequests off
26
26
 
27
- ProxyPass /api <%= configuration['api_endpoint'] %>/api
27
+ ProxyPass /currency <%= configuration['api_endpoint'] %>/currency
28
28
 
29
29
  SSLProxyEngine On
30
30
 
@@ -3,6 +3,7 @@
3
3
  package="com.{{ project_slug }}"
4
4
  android:versionCode="1"
5
5
  android:versionName="1.0">
6
+ <uses-permission android:name="android.permission.INTERNET" />
6
7
  <application android:label="@string/app_name"
7
8
  android:name="{{ project_title }}">
8
9
  <activity android:name=".Bootstrap"
@@ -110,7 +110,7 @@ public class AjaxRequestManager {
110
110
  } catch (IOException e) {
111
111
  Log.d(TAG, "Request threw exception", e);
112
112
  Log.d(TAG, "requestId: " + requestId);
113
- rhino.invokeFailureCallback(requestId, 500, "IOException");
113
+ rhino.invokeFailureCallback(requestId, 500, e.toString());
114
114
  } finally {
115
115
  Log.d(TAG, "About to hide loader");
116
116
  context.sendBroadcast(new Intent("com.calatrava.ajax.finish"));
@@ -0,0 +1,32 @@
1
+ package com.calatrava.bridge;
2
+
3
+ import android.app.Activity;
4
+
5
+ public class NativePageStateManager implements PageStateManager {
6
+
7
+ private RegisteredActivity activity;
8
+
9
+ public NativePageStateManager(Activity activity) {
10
+ this.activity = (RegisteredActivity) activity;
11
+ }
12
+
13
+ @Override
14
+ public void onCreateProcessing() {
15
+ activity.registerPage();
16
+ }
17
+
18
+ @Override
19
+ public void onResumeProcessing() {
20
+ activity.pageOnScreen();
21
+ }
22
+
23
+ @Override
24
+ public void onPauseProcessing() {
25
+ activity.pageOffScreen();
26
+ }
27
+
28
+ @Override
29
+ public void onDestroyProcessing() {
30
+ activity.unRegisterPage();
31
+ }
32
+ }
@@ -0,0 +1,13 @@
1
+ package com.calatrava.bridge;
2
+
3
+ public interface PageStateManager {
4
+
5
+ public void onCreateProcessing();
6
+
7
+ public void onResumeProcessing();
8
+
9
+ public void onPauseProcessing();
10
+
11
+ public void onDestroyProcessing();
12
+
13
+ }
@@ -8,9 +8,10 @@ import android.util.Log;
8
8
 
9
9
  public abstract class RegisteredActivity extends Activity {
10
10
  private String TAG = RegisteredActivity.class.getSimpleName();
11
-
12
11
  private RhinoService rhino;
12
+
13
13
  private RequestLoader spinner = new RequestLoader(this);
14
+ protected PageStateManager pageStateManager;
14
15
 
15
16
  private BroadcastReceiver receiver = new BroadcastReceiver() {
16
17
  @Override
@@ -29,7 +30,13 @@ public abstract class RegisteredActivity extends Activity {
29
30
  @Override
30
31
  protected void onCreate(Bundle availableData) {
31
32
  super.onCreate(availableData);
33
+ initializePageStateManager();
32
34
  rhino = ((CalatravaApplication)getApplication()).getRhino();
35
+ pageStateManager.onCreateProcessing();
36
+ }
37
+
38
+ protected void initializePageStateManager() {
39
+ pageStateManager = new NativePageStateManager(this);
33
40
  }
34
41
 
35
42
  @Override
@@ -38,27 +45,46 @@ public abstract class RegisteredActivity extends Activity {
38
45
  registerReceiver(receiver, new IntentFilter("com.calatrava.ajax.start"));
39
46
  registerReceiver(receiver, new IntentFilter("com.calatrava.ajax.finish"));
40
47
  registerReceiver(receiver, new IntentFilter("com.calatrava.command"));
48
+ pageStateManager.onResumeProcessing();
41
49
  }
42
50
 
43
51
  @Override
44
52
  protected void onPause() {
45
53
  super.onPause();
46
54
  unregisterReceiver(receiver);
55
+ pageStateManager.onPauseProcessing();
47
56
  }
48
57
 
49
58
  @Override
50
59
  public void onDestroy() {
51
60
  super.onDestroy();
61
+ pageStateManager.onDestroyProcessing();
52
62
  }
53
63
 
54
64
  public void triggerEvent(String event, String... extraArgs) {
55
65
  PageRegistry.sharedRegistry().triggerEvent(getPageName(), event, extraArgs);
56
66
  }
57
-
67
+
58
68
  public void invokeWidgetCallback(String...args) {
59
69
  rhino.callJsFunction("calatrava.inbound.invokeCallback", args);
60
70
  }
61
71
 
72
+ public void pageOnScreen() {
73
+ PageRegistry.sharedRegistry().pageOnscreen(getPageName());
74
+ }
75
+
76
+ public void pageOffScreen() {
77
+ PageRegistry.sharedRegistry().pageOffscreen(getPageName());
78
+ }
79
+
80
+ public void registerPage() {
81
+ PageRegistry.sharedRegistry().registerPage(getPageName(), this);
82
+ }
83
+
84
+ public void unRegisterPage() {
85
+ PageRegistry.sharedRegistry().unregisterPage(getPageName());
86
+ }
87
+
62
88
  protected abstract String getPageName();
63
89
 
64
90
  public abstract String getFieldValue(String field);
@@ -7,15 +7,10 @@ import android.content.IntentFilter;
7
7
  import android.graphics.Color;
8
8
  import android.os.Bundle;
9
9
  import android.util.Log;
10
- import android.webkit.JsResult;
11
- import android.webkit.WebChromeClient;
12
10
  import android.webkit.WebView;
13
- import android.webkit.WebViewClient;
14
-
15
- import com.calatrava.bridge.CalatravaApplication;
11
+ import com.calatrava.bridge.PageStateManager;
16
12
  import com.calatrava.bridge.RegisteredActivity;
17
13
  import com.calatrava.bridge.RhinoService;
18
- import com.calatrava.bridge.PageRegistry;
19
14
 
20
15
  import java.util.HashMap;
21
16
  import java.util.List;
@@ -45,17 +40,18 @@ public abstract class WebViewActivity extends RegisteredActivity {
45
40
  protected void onCreate(Bundle data)
46
41
  {
47
42
  super.onCreate(data);
43
+ }
44
+
45
+ @Override
46
+ protected void initializePageStateManager() {
48
47
  jsContainer = new JSContainer(getRhino(), getPageName());
49
- loadPage();
48
+ webView = new WebView(this);
49
+ pageStateManager = new WebViewPageStateManager(this, jsContainer, getPageName(), webView);
50
50
  }
51
51
 
52
52
  @Override
53
53
  protected void onResume() {
54
54
  super.onResume();
55
-
56
- onPageLoadCompleted();
57
- pageHasOpened();
58
-
59
55
  registerReceiver(receiver, new IntentFilter("com.calatrava.dialog"));
60
56
  }
61
57
 
@@ -63,15 +59,12 @@ public abstract class WebViewActivity extends RegisteredActivity {
63
59
  protected void onPause() {
64
60
  super.onPause();
65
61
 
66
- PageRegistry.sharedRegistry().pageOffscreen(getPageName());
67
62
  unregisterReceiver(receiver);
68
63
  }
69
64
 
70
65
  @Override
71
66
  public void onDestroy() {
72
67
  super.onDestroy();
73
-
74
- PageRegistry.sharedRegistry().unregisterPage(getPageName());
75
68
  }
76
69
 
77
70
  public String getFieldValue(final String field) {
@@ -115,60 +108,17 @@ public abstract class WebViewActivity extends RegisteredActivity {
115
108
  protected abstract List<String> getEvents();
116
109
 
117
110
  protected abstract List<String> getFields();
118
-
111
+
119
112
  protected int getBackgroundColor(){
120
113
  return Color.TRANSPARENT;
121
114
  }
122
115
 
123
- protected void loadPage() {
124
- PageRegistry.sharedRegistry().registerPage(getPageName(), this);
125
-
126
- webView = new WebView(this);
127
- setContentView(webView);
128
-
129
- webView.getSettings().setJavaScriptEnabled(true);
130
- webView.getSettings().setDomStorageEnabled(true);
131
- webView.setScrollBarStyle(webView.SCROLLBARS_OUTSIDE_OVERLAY);
132
- webView.setScrollbarFadingEnabled(true);
133
- webView.addJavascriptInterface(jsContainer, "container");
134
-
135
- webView.setWebViewClient(new WebViewClient() {
136
- @Override
137
- public void onPageFinished(WebView view, String url) {
138
- super.onPageFinished(view, url);
139
- Log.d(TAG, "Webview finished loading a URL");
140
-
141
- pageReady = true;
142
- onPageLoadCompleted();
143
- }
144
- });
145
-
146
- webView.setWebChromeClient(new WebChromeClient() {
147
- @Override
148
- public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
149
- Log.d(TAG, "Received JS alert: '" + message + "'");
150
- return false;
151
- }
152
- });
153
-
154
- webView.loadUrl("file:///android_asset/calatrava/views/" + getPageName() + ".html");
155
- pageHasOpened();
116
+ public void pageReadiness(boolean pageState) {
117
+ this.pageReady = pageState;
156
118
  }
157
119
 
158
- private void pageHasOpened() {
159
- triggerEvent("pageOpened", new String[] {});
160
- }
161
-
162
- private void onPageLoadCompleted() {
163
- if (jsContainer != null && pageReady) {
164
- jsContainer.onRenderComplete(null);
165
-
166
- for (String field : getFields()) {
167
- jsContainer.hasField(field);
168
- }
169
-
170
- PageRegistry.sharedRegistry().pageOnscreen(getPageName());
171
- }
120
+ public boolean pageState() {
121
+ return pageReady;
172
122
  }
173
123
 
174
124
  public class JSContainer {
@@ -0,0 +1,89 @@
1
+ package com.calatrava.shell;
2
+
3
+ import android.app.Activity;
4
+ import android.util.Log;
5
+ import android.webkit.JsResult;
6
+ import android.webkit.WebChromeClient;
7
+ import android.webkit.WebView;
8
+ import android.webkit.WebViewClient;
9
+ import com.calatrava.bridge.PageStateManager;
10
+
11
+ public class WebViewPageStateManager implements PageStateManager {
12
+
13
+ private static final String TAG = WebViewPageStateManager.class.getSimpleName();
14
+ private WebViewActivity webViewActivity;
15
+ private WebViewActivity.JSContainer jsContainer;
16
+ private final String pageName;
17
+ private final WebView webView;
18
+
19
+ public WebViewPageStateManager(Activity activity, WebViewActivity.JSContainer jsContainer, String pageName, WebView webView) {
20
+ this.webViewActivity = (WebViewActivity) activity;
21
+ this.jsContainer = jsContainer;
22
+ this.pageName = pageName;
23
+ this.webView = webView;
24
+ }
25
+
26
+ public void onCreateProcessing() {
27
+ webViewActivity.registerPage();
28
+
29
+ webViewActivity.setContentView(webView);
30
+
31
+ webView.getSettings().setJavaScriptEnabled(true);
32
+ webView.getSettings().setDomStorageEnabled(true);
33
+ webView.setScrollBarStyle(webView.SCROLLBARS_OUTSIDE_OVERLAY);
34
+ webView.setScrollbarFadingEnabled(true);
35
+ webView.addJavascriptInterface(jsContainer, "container");
36
+
37
+ webView.setWebViewClient(new WebViewClient() {
38
+ @Override
39
+ public void onPageFinished(WebView view, String url) {
40
+ super.onPageFinished(view, url);
41
+ Log.d(TAG, "Webview finished loading a URL");
42
+
43
+ webViewActivity.pageReadiness(true);
44
+ onPageLoadCompleted();
45
+ }
46
+ });
47
+
48
+ webView.setWebChromeClient(new WebChromeClient() {
49
+ @Override
50
+ public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
51
+ Log.d(TAG, "Received JS alert: '" + message + "'");
52
+ return false;
53
+ }
54
+ });
55
+
56
+ webView.loadUrl("file:///android_asset/calatrava/views/" + pageName + ".html");
57
+ pageHasOpened();
58
+ }
59
+
60
+ public void onResumeProcessing() {
61
+ onPageLoadCompleted();
62
+ pageHasOpened();
63
+ }
64
+
65
+ public void onPauseProcessing() {
66
+ webViewActivity.pageOffScreen();
67
+ }
68
+
69
+ public void onDestroyProcessing() {
70
+ webViewActivity.unRegisterPage();
71
+ }
72
+
73
+ private void onPageLoadCompleted() {
74
+ if (jsContainer != null && webViewActivity.pageState()) {
75
+ jsContainer.onRenderComplete(null);
76
+
77
+ for (String field : webViewActivity.getFields()) {
78
+ jsContainer.hasField(field);
79
+ }
80
+
81
+ webViewActivity.pageOnScreen();
82
+ }
83
+ }
84
+
85
+ private void pageHasOpened() {
86
+ webViewActivity.triggerEvent("pageOpened", new String[]{});
87
+ }
88
+
89
+ }
@@ -3,7 +3,7 @@ platform :ios, '5.0'
3
3
  xcodeproj '{{ project_name}}.xcodeproj'
4
4
 
5
5
  {{^dev?}}
6
- pod 'calatrava', :git => 'https://github.com/calatrava/calatrava-ios', :commit => '236a7395bbd90186a9359602ac77a982c5962e44'
6
+ pod 'calatrava', :git => 'https://github.com/calatrava/calatrava-ios', :commit => '50b05d43055bc6680ea55ce888ab692c00193c28'
7
7
  {{/dev?}}
8
8
  {{#dev?}}
9
9
  pod 'calatrava', :local => '../../../calatrava-ios'
@@ -22,7 +22,7 @@ calatrava.inbound =
22
22
  calatrava.bridge.requests.successfulResponse(requestId, response)
23
23
 
24
24
  failureResponse: (requestId, errorCode, response) ->
25
- calatrava.bridge.requests.failureResponse(requestId,errorCode, response)
25
+ calatrava.bridge.requests.failureResponse(requestId, errorCode, response)
26
26
 
27
27
  fireTimer: (timerId) ->
28
28
  calatrava.bridge.timers.fireTimer(timerId)
@@ -165,8 +165,8 @@ calatrava.bridge.requests = (() ->
165
165
  successHandlersById[requestId](response) if successHandlersById[requestId]
166
166
  clearHandlers(requestId)
167
167
 
168
- failureResponse: (requestId, response) ->
169
- failureHandlersById[requestId](response) if failureHandlersById[requestId]
168
+ failureResponse: (requestId, errorCode, response) ->
169
+ failureHandlersById[requestId](errorCode, response) if failureHandlersById[requestId]
170
170
  clearHandlers(requestId)
171
171
  )()
172
172
 
@@ -1,7 +1,7 @@
1
1
  example ?= {}
2
2
  example.converter ?= {}
3
3
 
4
- example.converter.controller = ({views, changePage, ajax}) ->
4
+ example.converter.controller = ({views, changePage, repository}) ->
5
5
  currencies = ['USD', 'AUD', 'GBP', 'INR']
6
6
  currencyRate =
7
7
  USD: 1
@@ -19,10 +19,12 @@ example.converter.controller = ({views, changePage, ajax}) ->
19
19
  selected: c == selectedCurrency
20
20
 
21
21
  performConversion = (amount) ->
22
- outRate = currencyRate[outCurrency]
23
- inRate = currencyRate[inCurrency]
24
- views.conversionForm.render
25
- out_amount: (Math.round(amount * (outRate / inRate) * 100)) / 100
22
+ repository.exchangeRate
23
+ from: inCurrency
24
+ to: outCurrency
25
+ ifSucceeded: (rate) ->
26
+ views.conversionForm.render
27
+ out_amount: (Math.round(amount * rate * 100)) / 100
26
28
 
27
29
  convert = () ->
28
30
  views.conversionForm.get 'in_amount', (inAmount) ->
@@ -6,6 +6,6 @@ example.converter.start = ->
6
6
  views:
7
7
  conversionForm: calatrava.bridge.pages.pageNamed "conversionForm"
8
8
  changePage: calatrava.bridge.changePage
9
- ajax: calatrava.bridge.request
9
+ repository: example.converter.repository calatrava.bridge.request
10
10
 
11
11
  calatrava.bridge.changePage "conversionForm"
@@ -0,0 +1,11 @@
1
+ example ?= {}
2
+ example.converter ?= {}
3
+
4
+ example.converter.repository = (ajax) ->
5
+ exchangeRate: (options) ->
6
+ ajax
7
+ url: "#{example.converter.apiEndpoint}/currency?from=#{options.from}&to=#{options.to}"
8
+ method: "GET"
9
+ success: (response) ->
10
+ options.ifSucceeded JSON.parse(response).rate
11
+ failure: options.elseFailed
@@ -1,5 +1,5 @@
1
- tw ?= {}
2
- tw.bridge = tw.bridge ? {}
1
+ calatrava ?= {}
2
+ calatrava.bridge = calatrava.bridge ? {}
3
3
 
4
4
  generateRandomString = () ->
5
5
  str = ''
@@ -8,15 +8,10 @@ generateRandomString = () ->
8
8
  str = str + r.toString(16)
9
9
  return str.toUpperCase();
10
10
 
11
- tw.bridge.environment = () ->
12
- serviceEndpoint: "http://localhost:4568"
13
- apiEndpoint: "http://localhost:4568"
14
- sessionTimeout: 10
11
+ calatrava.bridge.dispatchEvent = (page, event) ->
12
+ calatrava.bridge.pages.pageNamed(page).dispatch(event)
15
13
 
16
- tw.bridge.dispatchEvent = (page, event) ->
17
- tw.bridge.pages.pageNamed(page).dispatch(event)
18
-
19
- class tw.bridge.Page
14
+ class calatrava.bridge.Page
20
15
  constructor: (@pageName) ->
21
16
  @fieldValues = {}
22
17
  @handlerRegistry = {}
@@ -51,24 +46,24 @@ class tw.bridge.Page
51
46
  allRenderObjects: () ->
52
47
  @renderObjects
53
48
 
54
- tw.bridge.changePage = (target) ->
55
- tw.bridge.pages.setCurrent(target)
56
- tw.bridge.changedPage = target
49
+ calatrava.bridge.changePage = (target) ->
50
+ calatrava.bridge.pages.setCurrent(target)
51
+ calatrava.bridge.changedPage = target
57
52
 
58
- tw.bridge.pages = (() ->
53
+ calatrava.bridge.pages = (() ->
59
54
  pagesByName = {}
60
55
  current = ""
61
56
 
62
57
  pageNamed: (pageName) ->
63
58
  if (!pagesByName[pageName])
64
- pagesByName[pageName] = new tw.bridge.Page(pageName)
59
+ pagesByName[pageName] = new calatrava.bridge.Page(pageName)
65
60
  pagesByName[pageName]
66
61
 
67
62
  current: () -> pagesByName[current]
68
63
  setCurrent: (newPage) -> current = newPage
69
64
  )()
70
65
 
71
- class tw.bridge.Widget
66
+ class calatrava.bridge.Widget
72
67
  constructor: (@name, @options, @callback) ->
73
68
 
74
69
  getCallback: ->
@@ -77,16 +72,16 @@ class tw.bridge.Widget
77
72
  getOptions: ->
78
73
  @options
79
74
 
80
- tw.bridge.widgets = (()->
75
+ calatrava.bridge.widgets = (()->
81
76
  widgets = {}
82
77
  display: (name, options, callback) ->
83
- widgets[name] = new tw.bridge.Widget(name, options, callback)
78
+ widgets[name] = new calatrava.bridge.Widget(name, options, callback)
84
79
 
85
80
  widget: (name) ->
86
81
  widgets[name]
87
82
  )()
88
83
 
89
- tw.bridge.timers = (() ->
84
+ calatrava.bridge.timers = (() ->
90
85
  timers = {}
91
86
  start: (timeout, callback) ->
92
87
  timers["searchResultsExpired"] = callback
@@ -97,19 +92,19 @@ tw.bridge.timers = (() ->
97
92
  timers[name]()
98
93
  )()
99
94
 
100
- tw.bridge.dialog = (() ->
95
+ calatrava.bridge.dialog = (() ->
101
96
  display: (name) ->
102
97
  )()
103
98
 
104
- tw.bridge.request = (reqOptions) ->
99
+ calatrava.bridge.request = (reqOptions) ->
105
100
  # mock this for kernel features
106
- response = tw.bridge.requests.issue reqOptions
101
+ response = calatrava.bridge.requests.issue reqOptions
107
102
  if response.status == 'successful'
108
103
  reqOptions.success(response.body)
109
104
  else
110
105
  reqOptions.failure(response.body)
111
106
 
112
- tw.bridge.requests = (() ->
107
+ calatrava.bridge.requests = (() ->
113
108
  storedRequests = []
114
109
 
115
110
  stubRequest: (options) ->
@@ -119,6 +114,6 @@ tw.bridge.requests = (() ->
119
114
  _.tap _.chain(storedRequests).filter((sr) -> sr.url.test(options.url)).last().value().response, (v) ->
120
115
  )()
121
116
 
122
- tw.bridge.alert = (message) ->
117
+ calatrava.bridge.alert = (message) ->
123
118
 
124
- tw.bridge.trackEvent = () ->
119
+ calatrava.bridge.trackEvent = () ->
@@ -14,7 +14,7 @@ date = require('date');
14
14
  underscore = require('underscore');
15
15
  _ = underscore;
16
16
 
17
- exports.tw = require('bridge').tw;
17
+ exports.calatrava = require('bridge').calatrava;
18
18
 
19
19
  function recursiveExtend(moduleToExtend, module) {
20
20
  _.each(module, function (value, key) {
@@ -33,15 +33,15 @@ function getPageObjectForPageName(pageName){
33
33
  }
34
34
 
35
35
  function getWidget(name) {
36
- return tw.bridge.widgets.widget(name)
36
+ return calatrava.bridge.widgets.widget(name)
37
37
  }
38
38
 
39
39
  function showDialog(name) {
40
- return tw.bridge.dialog.display(name)
40
+ return calatrava.bridge.dialog.display(name)
41
41
  }
42
42
 
43
43
  function triggerTimer(name){
44
- return tw.bridge.timers.triggerTimer(name)
44
+ return calatrava.bridge.timers.triggerTimer(name)
45
45
  }
46
46
 
47
47
  exports.getPageObjectForPageName = getPageObjectForPageName;
@@ -3,9 +3,9 @@ calatrava.alert = (message) ->
3
3
  message: message
4
4
 
5
5
  calatrava.confirm = (message, onOkExecute) ->
6
- okCallbackHandle = calatrava.bridge.plugins.rememberCallback () ->
6
+ okCallbackHandle = calatrava.bridge.plugins.rememberCallback (result) ->
7
7
  calatrava.bridge.plugins.deleteCallback(okCallbackHandle)
8
- onOkExecute()
8
+ onOkExecute(result)
9
9
 
10
10
  calatrava.bridge.plugins.call 'alert', 'displayConfirm',
11
11
  message: message
@@ -4,34 +4,57 @@ example = exports.example
4
4
  stubView = exports.stubView
5
5
 
6
6
  describe 'converter controller', ->
7
- ajax = null
8
- changePage = null
9
- views = null
10
-
11
7
  beforeEach ->
12
- ajax = jasmine.createSpy("ajax requester")
13
- changePage = jasmine.createSpy('page changer').andCallFake (targetPage) ->
14
- if views[targetPage].boundEvents['pageOpened']?
15
- views[targetPage].trigger 'pageOpened'
16
- views =
8
+ @changePage = jasmine.createSpy('page changer').andCallFake (targetPage) ->
9
+ if @views[targetPage].boundEvents['pageOpened']?
10
+ @views[targetPage].trigger 'pageOpened'
11
+ @views =
17
12
  conversionForm: stubView.create('converterForm')
13
+ @exchangeRateRepository = jasmine.createSpy "fake repository"
18
14
 
19
- subject = example.converter.controller
20
- changePage: changePage
21
- views: views
22
- ajax: ajax
15
+ example.converter.controller
16
+ changePage: @changePage
17
+ views: @views
18
+ repository:
19
+ exchangeRate: @exchangeRateRepository
23
20
 
24
21
  it 'should bind the convert event', ->
25
- expect(views.conversionForm.boundEvents['convert']).not.toBeUndefined()
22
+ expect(@views.conversionForm.boundEvents['convert']).not.toBeUndefined()
26
23
 
27
24
  describe 'converting', ->
28
25
 
29
26
  beforeEach ->
30
- views.conversionForm.fieldContains 'in_currency', 'USD'
31
- views.conversionForm.fieldContains 'out_currency', 'AUD'
32
- views.conversionForm.fieldContains 'in_amount', 100
33
- views.conversionForm.trigger 'convert'
27
+ @views.conversionForm.fieldContains 'in_currency', 'USD'
28
+ @views.conversionForm.fieldContains 'out_currency', 'AUD'
34
29
 
35
30
  it 'should render the correctly converted amount', ->
36
- expect(views.conversionForm.lastMessage()).toEqual
31
+ @views.conversionForm.fieldContains 'in_amount', 100
32
+ @views.conversionForm.trigger 'convert'
33
+ @exchangeRateRepository.mostRecentCall.args[0].ifSucceeded(.96)
34
+ expect(@views.conversionForm.lastMessage()).toEqual
37
35
  out_amount: 96
36
+
37
+ it 'should round-off amount to 2 decimal places', ->
38
+ @views.conversionForm.fieldContains 'in_amount', 1
39
+ @views.conversionForm.trigger 'convert'
40
+ @exchangeRateRepository.mostRecentCall.args[0].ifSucceeded(.3663)
41
+ expect(@views.conversionForm.lastMessage()).toEqual
42
+ out_amount: .37
43
+
44
+ it 'should confirm when amount is absent', ->
45
+ calatrava.confirm = jasmine.createSpy("confirmation dialog")
46
+ @views.conversionForm.fieldContains 'in_amount', ""
47
+ @views.conversionForm.trigger 'convert'
48
+
49
+ expect(calatrava.confirm).toHaveBeenCalled()
50
+
51
+ it 'should consider amount as 1 if amount is absent and confirmation accepted', ->
52
+ calatrava.confirm = jasmine.createSpy("confirmation dialog")
53
+ @views.conversionForm.fieldContains 'in_amount', ""
54
+ @views.conversionForm.trigger 'convert'
55
+ calatrava.confirm.mostRecentCall.args[1](true)
56
+ @exchangeRateRepository.mostRecentCall.args[0].ifSucceeded(.96)
57
+
58
+ expect(@views.conversionForm.lastMessage()).toEqual
59
+ out_amount: 0.96
60
+
@@ -0,0 +1,27 @@
1
+ exports = require 'spec_helper'
2
+
3
+ example = exports.example
4
+
5
+ describe 'converter repository', ->
6
+
7
+ beforeEach ->
8
+ @ajax = jasmine.createSpy "ajax requester"
9
+ @onSuccess = jasmine.createSpy "success callback"
10
+ @onFailure = jasmine.createSpy "failure callback"
11
+ example.converter.apiEndpoint = "//endpoint"
12
+ example.converter.repository(@ajax).exchangeRate
13
+ from: "USD"
14
+ to: "INR"
15
+ ifSucceeded: @onSuccess
16
+ elseFailed: @onFailure
17
+
18
+ it 'should call appropriate API for exchange rate', ->
19
+ expect(@ajax.mostRecentCall.args[0].url).toEqual "//endpoint/currency?from=USD&to=INR"
20
+
21
+ it 'should call success callback with rate when request is successful', ->
22
+ @ajax.mostRecentCall.args[0].success "{\"rate\": 55}"
23
+ expect(@onSuccess).toHaveBeenCalledWith 55
24
+
25
+ it 'should call failure callback when request fails', ->
26
+ @ajax.mostRecentCall.args[0].failure "failure response"
27
+ expect(@onFailure).toHaveBeenCalledWith("failure response")
@@ -1,11 +1,7 @@
1
- tw ?= {}
1
+ calatrava ?= {}
2
2
 
3
- tw =
3
+ calatrava =
4
4
  bridge:
5
- environment: () ->
6
- serviceEndpoint: "test env"
7
- sessionTimeout: 10
8
-
9
5
  changePage: (page) ->
10
6
  page.show()
11
7
 
@@ -22,4 +18,4 @@ tw =
22
18
  dialog:
23
19
  display: () ->
24
20
 
25
- exports.tw = tw
21
+ exports.calatrava = calatrava
@@ -12,7 +12,7 @@ _ = underscore;
12
12
 
13
13
  stubView = require('stubView.coffee').stubView;
14
14
 
15
- tw = require('environment.spec_helper').tw;
15
+ calatrava = require('environment.spec_helper').calatrava;
16
16
 
17
17
  function recursiveExtend(moduleToExtend, module) {
18
18
  _.each(module, function (value, key) {
@@ -27,9 +27,10 @@ function recursiveExtend(moduleToExtend, module) {
27
27
 
28
28
  example = {};
29
29
  recursiveExtend(example, require('controller.converter').example);
30
+ recursiveExtend(example, require('repository.converter').example);
30
31
 
31
32
  exports.stubView = stubView;
32
- exports.tw = tw;
33
+ exports.calatrava = calatrava;
33
34
  exports.appDir = __dirname + "/../app";
34
35
  exports.example = example;
35
36
 
@@ -2,11 +2,6 @@ calatrava ?= {}
2
2
  calatrava.bridge = calatrava.bridge ? {}
3
3
  calatrava.bridge.web = calatrava.bridge.web ? {}
4
4
 
5
- calatrava.bridge.environment = () ->
6
- sessionTimeout: 600
7
- serviceEndpoint: ""
8
- apiEndpoint: ""
9
-
10
5
  calatrava.bridge.web.ajax = (options) ->
11
6
  loader = $("#loader")
12
7
 
@@ -63,10 +58,11 @@ calatrava.bridge.web.ajax = (options) ->
63
58
  showLoader()
64
59
  success: (response) ->
65
60
  goToTop()
61
+ response = JSON.stringify(response) if _.isObject(response)
66
62
  options.success(response)
67
- error: () ->
63
+ error: (response) ->
68
64
  showLoader()
69
- options.failure() if options.failure?
65
+ options.failure(response.status, response.responseText) if options.failure?
70
66
  complete: hideLoader
71
67
 
72
68
  calatrava.bridge.web.page = (pageName, proxyId) ->
@@ -1,6 +1,9 @@
1
- root = this
2
- root.calatrava ?= {}
3
- calatrava = root.calatrava
1
+ example ?= {}
2
+ example.converter ?= {}
3
+ calatrava ?= {}
4
+
5
+ #cross-domain calls would fail for web. Using ProxyPass in httpd.conf instead.
6
+ example.converter.apiEndpoint = ""
4
7
 
5
8
  # Hide all the sub-pages when first launching the app
6
9
  $(document).ready ->
@@ -1,3 +1,3 @@
1
1
  module Calatrava
2
- Version = "0.6.6"
2
+ Version = "0.6.7"
3
3
  end
data/tools/janus.jar ADDED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: calatrava
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.6
4
+ version: 0.6.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-18 00:00:00.000000000 Z
12
+ date: 2013-06-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -178,6 +178,7 @@ files:
178
178
  - Vagrantfile
179
179
  - bin/calatrava
180
180
  - calatrava.gemspec
181
+ - contracts/rate-exchange.jns
181
182
  - ext/mkrf_conf.rb
182
183
  - features/cli.feature
183
184
  - features/project.feature
@@ -211,6 +212,8 @@ files:
211
212
  - lib/calatrava/tasks/rake.rb
212
213
  - lib/calatrava/tasks/release.rb
213
214
  - lib/calatrava/template.rb
215
+ - lib/calatrava/templates/.auto_compile.rb
216
+ - lib/calatrava/templates/.gitignore
214
217
  - lib/calatrava/templates/.ruby-gemset.calatrava
215
218
  - lib/calatrava/templates/.ruby-version
216
219
  - lib/calatrava/templates/Gemfile.calatrava
@@ -239,7 +242,9 @@ files:
239
242
  - lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/AssetRepository.java
240
243
  - lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/CalatravaApplication.java
241
244
  - lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/KernelBridge.java
245
+ - lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/NativePageStateManager.java
242
246
  - lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/PageRegistry.java
247
+ - lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/PageStateManager.java
243
248
  - lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/PluginCommand.java
244
249
  - lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/PluginRegistry.java
245
250
  - lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/RegisteredActivity.java
@@ -248,6 +253,7 @@ files:
248
253
  - lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/RequestLoader.java
249
254
  - lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/RhinoService.java
250
255
  - lib/calatrava/templates/droid/calatrava/src/com/calatrava/shell/WebViewActivity.java
256
+ - lib/calatrava/templates/droid/calatrava/src/com/calatrava/shell/WebViewPageStateManager.java
251
257
  - lib/calatrava/templates/droid/manifest.yml
252
258
  - lib/calatrava/templates/ios/Podfile.calatrava
253
259
  - lib/calatrava/templates/ios/manifest.yml
@@ -269,11 +275,13 @@ files:
269
275
  - lib/calatrava/templates/kernel/app/calatrava.coffee
270
276
  - lib/calatrava/templates/kernel/app/converter/controller.converter.coffee
271
277
  - lib/calatrava/templates/kernel/app/converter/init.converter.coffee
278
+ - lib/calatrava/templates/kernel/app/converter/repository.converter.coffee
272
279
  - lib/calatrava/templates/kernel/app/pageHelper.coffee
273
280
  - lib/calatrava/templates/kernel/features/support/bridge.coffee
274
281
  - lib/calatrava/templates/kernel/features/support/spec_helper.js
275
282
  - lib/calatrava/templates/kernel/plugins/alert.coffee
276
283
  - lib/calatrava/templates/kernel/spec/converter/controller.converter.spec.coffee
284
+ - lib/calatrava/templates/kernel/spec/converter/repository.converter.spec.coffee
277
285
  - lib/calatrava/templates/kernel/spec/environment.spec_helper.coffee
278
286
  - lib/calatrava/templates/kernel/spec/spec_helper.js
279
287
  - lib/calatrava/templates/kernel/spec/stubView.coffee
@@ -298,6 +306,7 @@ files:
298
306
  - spec/output_file_spec.rb
299
307
  - spec/shell_spec.rb
300
308
  - spec/spec_helper.rb
309
+ - tools/janus.jar
301
310
  homepage: http://calatrava.github.com
302
311
  licenses: []
303
312
  post_install_message: