rhodes 2.1.0 → 2.2.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (241) hide show
  1. data/CHANGELOG +7 -0
  2. data/README.textile +4 -5
  3. data/Rakefile +8 -1
  4. data/lib/build/jake.rb +22 -16
  5. data/lib/extensions/rhoxml/rexml/cdata.rb +67 -0
  6. data/lib/extensions/rhoxml/rexml/document.rb +2 -116
  7. data/lib/extensions/rhoxml/rexml/element.rb +1 -1
  8. data/lib/extensions/rhoxml/rexml/text.rb +117 -0
  9. data/lib/framework/rho/render.rb +19 -11
  10. data/lib/framework/rho/rho.rb +17 -10
  11. data/lib/framework/rho/rhobluetooth.rb +103 -0
  12. data/lib/framework/rho/rhocontroller.rb +2 -0
  13. data/lib/framework/rho/rhoevent.rb +43 -0
  14. data/lib/framework/rho/rhoevent_bb.rb +80 -0
  15. data/lib/framework/rho/rhoevent_c.rb +47 -0
  16. data/lib/framework/rhodes.rb +2 -2
  17. data/lib/framework/rhom/rhom_db_adapter.rb +2 -1
  18. data/lib/framework/rhom/rhom_model.rb +9 -3
  19. data/lib/framework/rhom/rhom_object_factory.rb +46 -22
  20. data/lib/framework/rhom/rhom_source.rb +12 -10
  21. data/lib/framework/version.rb +2 -2
  22. data/lib/rhodes.rb +2 -2
  23. data/platform/android/Rhodes/AndroidManifest.xml +23 -2
  24. data/platform/android/Rhodes/gen/com/rhomobile/rhodes/R.java +54 -38
  25. data/platform/android/Rhodes/jni/include/rhodes.h +3 -0
  26. data/platform/android/Rhodes/jni/include/rhodes/JNIRhodes.h +2 -2
  27. data/platform/android/Rhodes/jni/include/rhodes/details/rhojava.inc +4 -0
  28. data/platform/android/Rhodes/jni/include/rhodes/jni/com_rhomobile_rhodes_RhodesService.h +16 -0
  29. data/platform/android/Rhodes/jni/include/rhodes/jni/com_rhomobile_rhodes_bluetooth_RhoBluetoothManager.h +21 -0
  30. data/platform/android/Rhodes/jni/src/bluetooth.cpp +169 -0
  31. data/platform/android/Rhodes/jni/src/callbacks.cpp +10 -0
  32. data/platform/android/Rhodes/jni/src/event.cpp +429 -0
  33. data/platform/android/Rhodes/jni/src/fileapi.cpp +51 -1
  34. data/platform/android/Rhodes/jni/src/rhodes.cpp +16 -0
  35. data/platform/android/Rhodes/jni/src/sslimpl.cpp +3 -0
  36. data/platform/android/Rhodes/res/layout/bt_device_list.xml +42 -0
  37. data/platform/android/Rhodes/res/layout/bt_device_name.xml +7 -0
  38. data/platform/android/Rhodes/res/values/strings.xml +8 -0
  39. data/platform/android/Rhodes/src/com/rhomobile/rhodes/AndroidR.java +14 -0
  40. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Capabilities.java +2 -0
  41. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Push.java +7 -0
  42. data/platform/android/Rhodes/src/com/rhomobile/rhodes/PushReceiver.java +58 -0
  43. data/platform/android/Rhodes/src/com/rhomobile/rhodes/PushService.java +53 -0
  44. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Rhodes.java +8 -0
  45. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesService.java +144 -3
  46. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/IRhoBluetoothManager.java +66 -0
  47. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothDeviceListActivity.java +201 -0
  48. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothManager.java +139 -0
  49. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothManagerNew.java +401 -0
  50. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothManagerOld.java +136 -0
  51. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothSession.java +457 -0
  52. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/UUIDHelper.java +71 -0
  53. data/platform/android/Rhodes/src/com/rhomobile/rhodes/camera/ImageCapture.java +12 -7
  54. data/platform/android/Rhodes/src/com/rhomobile/rhodes/event/Event.java +19 -0
  55. data/platform/android/Rhodes/src/com/rhomobile/rhodes/event/EventStore.java +261 -0
  56. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SimpleMainView.java +4 -2
  57. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/TabbedMainView.java +2 -2
  58. data/platform/android/Rhodes/src/com/rhomobile/rhodes/uri/MailUriHandler.java +10 -2
  59. data/platform/android/build/RhodesSRC_build.files +33 -22
  60. data/platform/android/build/android.rake +198 -27
  61. data/platform/android/build/librhodes_build.files +3 -1
  62. data/platform/android/build/libruby_build.files +4 -1
  63. data/platform/bb/Hsqldb/src/com/rho/db/HsqlDBResult.java +2 -2
  64. data/platform/bb/Hsqldb/src/com/rho/db/HsqlDBRowResult.java +1 -1
  65. data/platform/bb/Hsqldb/src/org/hsqldb/Expression.java +7 -4
  66. data/platform/bb/Hsqldb/src/org/hsqldb/Like.java +3 -3
  67. data/platform/bb/Hsqldb/src/org/hsqldb/Table.java +3 -1
  68. data/platform/bb/Hsqldb/src/org/hsqldb/Tokenizer.java +1 -1
  69. data/platform/bb/RubyVM/RubyVM.jdp +1 -0
  70. data/platform/bb/RubyVM/src/com/rho/RhoConf.java +108 -1
  71. data/platform/bb/RubyVM/src/com/rho/RhoLogConf.java +7 -1
  72. data/platform/bb/RubyVM/src/com/rho/RhoRuby.java +7 -4
  73. data/platform/bb/RubyVM/src/com/rho/ThreadQueue.java +7 -1
  74. data/platform/bb/RubyVM/src/com/rho/net/AsyncHttp.java +1 -1
  75. data/platform/bb/RubyVM/src/com/rho/net/NetRequest.java +21 -23
  76. data/platform/bb/RubyVM/src/com/rho/net/RhoConnection.java +19 -10
  77. data/platform/bb/RubyVM/src/com/rho/sync/SyncEngine.java +8 -0
  78. data/platform/bb/RubyVM/src/com/rho/sync/SyncNotify.java +3 -0
  79. data/platform/bb/RubyVM/src/com/rho/sync/SyncThread.java +14 -17
  80. data/platform/bb/RubyVM/src/com/xruby/runtime/builtin/RubyFile.java +7 -5
  81. data/platform/bb/RubyVM/src/com/xruby/runtime/lang/RhoSupport.java +2 -0
  82. data/platform/bb/RubyVM/src/com/xruby/runtime/lang/RubyRuntime.java +10 -1
  83. data/platform/bb/RubyVM/src/j2me/io/File.java +7 -6
  84. data/platform/bb/build/RubyVM_build.files +412 -412
  85. data/platform/bb/build/bb.rake +42 -18
  86. data/platform/bb/build/hsqldb_build.files +151 -151
  87. data/platform/bb/build/rhodes_build.files +44 -40
  88. data/platform/bb/rhodes/platform/5.0/com/rho/BrowserAdapter5.java +2 -0
  89. data/platform/bb/rhodes/platform/5.0/com/rho/RhodesApplicationPlatform.java +237 -0
  90. data/platform/bb/rhodes/platform/common/com/rho/RhodesApplicationPlatform.java +14 -0
  91. data/platform/bb/rhodes/rhodes.jdp +6 -1
  92. data/platform/bb/rhodes/src/com/rho/RhoRubyHelper.java +7 -1
  93. data/platform/bb/rhodes/src/com/rho/RhodesApplicationPlatform.java +14 -0
  94. data/platform/bb/rhodes/src/com/rho/net/NetworkAccess.java +62 -76
  95. data/platform/bb/rhodes/src/com/rho/rubyext/RhoCalendar.java +660 -0
  96. data/platform/bb/rhodes/src/{rhomobile → com/rho/rubyext}/RhoPhonebook.java +95 -38
  97. data/platform/bb/rhodes/src/com/rho/rubyext/System.java +22 -1
  98. data/platform/bb/rhodes/src/rhomobile/PushListeningThread.java +26 -6
  99. data/platform/bb/rhodes/src/rhomobile/RhodesApplication.java +21 -7
  100. data/platform/bb/rhodes/src/rhomobile/bluetooth/BluetoothManager.java +528 -0
  101. data/platform/bb/rhodes/src/rhomobile/bluetooth/BluetoothPort.java +281 -0
  102. data/platform/bb/rhodes/src/rhomobile/bluetooth/BluetoothScreen.java +119 -0
  103. data/platform/bb/rhodes/src/rhomobile/camera/CameraFilesListener.java +2 -2
  104. data/platform/iphone/Classes/AppManager/AppManager.m +70 -7
  105. data/platform/iphone/Classes/Bluetooth/Bluetooth.h +72 -0
  106. data/platform/iphone/Classes/Bluetooth/Bluetooth.m +414 -0
  107. data/platform/iphone/Classes/Event/Event.h +12 -0
  108. data/platform/iphone/Classes/Event/Event.m +300 -0
  109. data/platform/iphone/Classes/LogOptionsController.h +2 -1
  110. data/platform/iphone/Classes/LogOptionsController.m +1 -1
  111. data/platform/iphone/Classes/LogViewController.h +2 -1
  112. data/platform/iphone/Classes/MapView/MapViewController.h +2 -1
  113. data/platform/iphone/Classes/RhoViewController.h +16 -0
  114. data/platform/iphone/Classes/RhoViewController.m +20 -0
  115. data/platform/iphone/Classes/Rhodes.h +12 -0
  116. data/platform/iphone/Classes/Rhodes.m +34 -6
  117. data/platform/iphone/Classes/Signature/SignatureViewController.h +2 -2
  118. data/platform/iphone/Classes/Signature/SignatureViewController.m +0 -10
  119. data/platform/iphone/Classes/SimpleMainView.h +2 -2
  120. data/platform/iphone/Classes/SimpleMainView.m +5 -14
  121. data/platform/iphone/Classes/SplashViewController.h +2 -2
  122. data/platform/iphone/Classes/TabbedMainView.h +2 -2
  123. data/platform/iphone/Classes/TabbedMainView.m +5 -10
  124. data/platform/iphone/Info.plist +5 -5
  125. data/platform/iphone/rhorubylib/rhorubylib.xcodeproj/project.pbxproj +39 -0
  126. data/platform/iphone/rhorunner.xcodeproj/project.pbxproj +47 -4
  127. data/platform/osx/Rhodes Debugger/NoodleLineNumberView.m +3 -2
  128. data/platform/shared/common/AutoPointer.h +3 -0
  129. data/platform/shared/common/RhoConf.cpp +2 -1
  130. data/platform/shared/common/RhoThread.h +1 -1
  131. data/platform/shared/common/RhoTime.h +3 -3
  132. data/platform/shared/common/RhodesApp.cpp +75 -23
  133. data/platform/shared/common/RhodesApp.h +4 -0
  134. data/platform/shared/common/RhodesAppBase.h +2 -0
  135. data/platform/shared/common/ThreadQueue.cpp +23 -18
  136. data/platform/shared/common/ThreadQueue.h +2 -0
  137. data/platform/shared/db/res/db/syncdb.schema +39 -39
  138. data/platform/shared/logging/RhoLogConf.cpp +58 -3
  139. data/platform/shared/logging/RhoLogConf.h +3 -1
  140. data/platform/shared/net/CURLNetRequest.cpp +17 -6
  141. data/platform/shared/net/HttpServer.cpp +125 -25
  142. data/platform/shared/net/HttpServer.h +4 -3
  143. data/platform/shared/ruby/ext/bluetooth/bluetooth.i +56 -0
  144. data/platform/shared/ruby/ext/bluetooth/bluetooth_wrap.c +2563 -0
  145. data/platform/shared/ruby/ext/calendar/calendar.i +28 -0
  146. data/platform/shared/ruby/ext/calendar/calendar_wrap.c +2251 -0
  147. data/platform/shared/ruby/ext/calendar/event.h +41 -0
  148. data/platform/shared/ruby/ext/calendar/event.i +28 -0
  149. data/platform/shared/ruby/ext/calendar/event_wrap.c +2151 -0
  150. data/platform/shared/ruby/ext/rho/rhoruby.c +103 -3
  151. data/platform/shared/ruby/ext/rho/rhoruby.h +16 -2
  152. data/platform/shared/ruby/ext/rhoconf/rhoconf.i +12 -0
  153. data/platform/shared/ruby/ext/rhoconf/rhoconf_wrap.c +101 -0
  154. data/platform/shared/ruby/ext/system/system.i +14 -0
  155. data/platform/shared/ruby/ext/system/system_wrap.c +2568 -2208
  156. data/platform/shared/ruby/main.c +8 -0
  157. data/platform/shared/rubyext/GeoLocation.cpp +6 -3
  158. data/platform/shared/rubyext/System.cpp +14 -0
  159. data/platform/shared/sync/SyncEngine.cpp +9 -1
  160. data/platform/shared/sync/SyncNotify.cpp +16 -8
  161. data/platform/shared/sync/SyncNotify.h +1 -0
  162. data/platform/shared/sync/SyncThread.cpp +7 -12
  163. data/platform/shared/sync/SyncThread.h +5 -3
  164. data/platform/wm/build/wm.rake +7 -1
  165. data/platform/wm/rhodes/Alert.cpp +1 -1
  166. data/platform/wm/rhodes/MainWindow.cpp +28 -0
  167. data/platform/wm/rhodes/MainWindow.h +9 -0
  168. data/platform/wm/rhodes/OutlookApp.cpp +72 -0
  169. data/platform/wm/rhodes/OutlookApp.h +22 -0
  170. data/platform/wm/rhodes/Rhodes.cpp +8 -0
  171. data/platform/wm/rhodes/Rhodes.rc +31 -0
  172. data/platform/wm/rhodes/bluetooth/Bluetooth.cpp +1274 -0
  173. data/platform/wm/rhodes/bluetooth/Bluetooth.h +321 -0
  174. data/platform/wm/rhodes/phonebook/NativeAddressBook.cpp +37 -70
  175. data/platform/wm/rhodes/phonebook/NativeAddressBook.h +0 -4
  176. data/platform/wm/rhodes/resource.h +8 -1
  177. data/platform/wm/rhodes/rho/net/NetRequest.cpp +4 -0
  178. data/platform/wm/rhodes/rho/net/NetRequestImpl.cpp +6 -4
  179. data/platform/wm/rhodes/rho/rubyext/calendar.cpp +487 -0
  180. data/platform/wm/rhodes/rhodes.vcproj +28 -11
  181. data/platform/wm/rhodes/stdafx.h +1 -0
  182. data/platform/wm/rubylib/rubylib.vcproj +32 -0
  183. data/rakefile.rb +8 -1
  184. data/res/generators/templates/application/Rakefile +1 -1
  185. data/res/generators/templates/application/app/layout.erb +4 -1
  186. data/res/generators/templates/application/build.yml +0 -1
  187. data/res/generators/templates/application/public/css/iphone.css +2 -2
  188. data/res/generators/templates/application/public/jqtouch/jqtouch-iphone.css +9 -0
  189. data/res/generators/templates/application/public/jqtouch/jqtouch.css +1 -5
  190. data/res/generators/templates/application/public/jqtouch/jqtouch.js +3 -2
  191. data/rhodes.gemspec +1 -1
  192. data/spec/perfomance_spec/app/Benchmark/benchmark.rb +4 -0
  193. data/spec/perfomance_spec/app/Benchmark/bulk_results.erb +13 -0
  194. data/spec/perfomance_spec/app/Benchmark/controller.rb +178 -0
  195. data/spec/perfomance_spec/app/Benchmark/create_results.erb +13 -0
  196. data/spec/perfomance_spec/app/Benchmark/customers.erb +35 -0
  197. data/spec/perfomance_spec/app/Benchmark/index.erb +9 -0
  198. data/spec/perfomance_spec/app/Benchmark/products.erb +25 -0
  199. data/spec/perfomance_spec/app/Benchmark/search_results.erb +13 -0
  200. data/spec/perfomance_spec/app/Customer/customer.rb +6 -0
  201. data/spec/perfomance_spec/app/Perftest/index.erb +5 -0
  202. data/spec/perfomance_spec/app/Product/index.erb +25 -0
  203. data/spec/perfomance_spec/app/Product/product.rb +6 -0
  204. data/spec/perfomance_spec/app/helpers/application_helper.rb +126 -0
  205. data/spec/perfomance_spec/app/helpers/browser_helper.rb +18 -0
  206. data/spec/perfomance_spec/rhoconfig.txt +1 -1
  207. data/spec/phone_spec/app/Account_s/account_s.rb +5 -2
  208. data/spec/phone_spec/app/Case/case.rb +1 -0
  209. data/spec/phone_spec/app/Case_s/case_s.rb +2 -0
  210. data/spec/phone_spec/app/Data/perftest.json +35 -0
  211. data/spec/phone_spec/app/Data/testCDATA.xml +11 -0
  212. data/spec/phone_spec/app/Product/product.rb +1 -1
  213. data/spec/phone_spec/app/{Spec → spec}/asynchttp_spec.rb +66 -17
  214. data/spec/phone_spec/app/{Spec → spec}/barcode_spec.rb +0 -0
  215. data/spec/phone_spec/app/{Spec → spec}/blobsync_spec.rb +0 -0
  216. data/spec/phone_spec/app/{Spec → spec}/bsearch_spec.rb +0 -0
  217. data/spec/phone_spec/app/{Spec → spec}/bulksync_spec.rb +0 -0
  218. data/spec/phone_spec/app/{Spec → spec}/contacts_spec.rb +0 -0
  219. data/spec/phone_spec/app/{Spec → spec}/crypt_spec.rb +0 -0
  220. data/spec/phone_spec/app/{Spec → spec}/date_spec.rb +0 -0
  221. data/spec/phone_spec/app/spec/events_spec.rb +199 -0
  222. data/spec/phone_spec/app/{Spec → spec}/fixtures/client_info.txt +0 -0
  223. data/spec/phone_spec/app/{Spec → spec}/fixtures/object_values.txt +0 -0
  224. data/spec/phone_spec/app/{Spec → spec}/json_spec.rb +11 -2
  225. data/spec/phone_spec/app/{Spec → spec}/mapview_spec.rb +0 -0
  226. data/spec/phone_spec/app/{Spec → spec}/nativebar_spec.rb +0 -0
  227. data/spec/phone_spec/app/{Spec → spec}/navbar_spec.rb +0 -0
  228. data/spec/phone_spec/app/{Spec → spec}/pagination/fixtures/object_values.txt +0 -0
  229. data/spec/phone_spec/app/{Spec → spec}/rho_controller_spec.rb +5 -0
  230. data/spec/phone_spec/app/{Spec → spec}/rho_spec.rb +48 -0
  231. data/spec/phone_spec/app/{Spec → spec}/rhofile_spec.rb +9 -6
  232. data/spec/phone_spec/app/{Spec → spec}/rhom_object_spec.rb +188 -9
  233. data/spec/phone_spec/app/{Spec → spec}/syncengine_spec.rb +0 -0
  234. data/spec/phone_spec/app/{Spec → spec}/xml_spec.rb +15 -0
  235. data/spec/phone_spec/app/{Spec → spec}/xruby_spec.rb +0 -0
  236. data/spec/phone_spec/app/spec_runner.rb +4 -1
  237. data/spec/phone_spec/build.yml +2 -1
  238. metadata +95 -31
  239. data/platform/bb/rhodes/platform/5.0/com/rho/RhoMainScreen.java +0 -36
  240. data/platform/bb/rhodes/platform/6.0/com/rho/BrowserAdapter5.java +0 -155
  241. data/platform/bb/rhodes/platform/6.0/com/rho/RhoMainScreen.java +0 -36
@@ -20,6 +20,8 @@
20
20
  */
21
21
  package com.rhomobile.rhodes.uri;
22
22
 
23
+ import java.util.Map;
24
+
23
25
  import com.rhomobile.rhodes.Logger;
24
26
 
25
27
  import android.content.Context;
@@ -38,8 +40,7 @@ public class MailUriHandler implements UriHandler {
38
40
  }
39
41
 
40
42
  public boolean handle(String url) {
41
- Uri uri = Uri.parse(url);
42
- if (!uri.getScheme().equals("mailto"))
43
+ if (!MailTo.isMailTo(url))
43
44
  return false;
44
45
 
45
46
  Logger.D(TAG, "This is 'mailto' uri, handle it");
@@ -52,12 +53,19 @@ public class MailUriHandler implements UriHandler {
52
53
  String s = muri.getTo();
53
54
  if (s != null) intent.putExtra(Intent.EXTRA_EMAIL, new String[]{s});
54
55
 
56
+ s = muri.getCc();
57
+ if (s != null) intent.putExtra(Intent.EXTRA_CC, new String[]{s});
58
+
55
59
  s = muri.getSubject();
56
60
  if (s != null) intent.putExtra(Intent.EXTRA_SUBJECT, s);
57
61
 
58
62
  s = muri.getBody();
59
63
  if (s != null) intent.putExtra(Intent.EXTRA_TEXT, s);
60
64
 
65
+ Map<String,String> headers = muri.getHeaders();
66
+ s = headers.get("bcc");
67
+ if (s != null) intent.putExtra(Intent.EXTRA_BCC, new String[]{s});
68
+
61
69
  ctx.startActivity(Intent.createChooser(intent, "Send e-mail..."));
62
70
  return true;
63
71
  }
@@ -1,50 +1,59 @@
1
- platform/android/Rhodes/src/com/rhomobile/rhodes/nativeview/RhoNativeViewManager.java
2
- platform/android/Rhodes/src/com/rhomobile/rhodes/AndroidR.java
3
- platform/android/Rhodes/src/com/rhomobile/rhodes/HttpLog.java
4
- platform/android/Rhodes/src/com/rhomobile/rhodes/Logger.java
5
- platform/android/Rhodes/src/com/rhomobile/rhodes/NativeBar.java
6
- platform/android/Rhodes/src/com/rhomobile/rhodes/NavBar.java
7
- platform/android/Rhodes/src/com/rhomobile/rhodes/NetworkConnectivityListener.java
8
- platform/android/Rhodes/src/com/rhomobile/rhodes/NetworkStateTracker.java
9
- platform/android/Rhodes/src/com/rhomobile/rhodes/RhoActivity.java
10
- platform/android/Rhodes/src/com/rhomobile/rhodes/RhoConf.java
11
- platform/android/Rhodes/src/com/rhomobile/rhodes/RhoLogConf.java
12
- platform/android/Rhodes/src/com/rhomobile/rhodes/RhoMenu.java
13
- platform/android/Rhodes/src/com/rhomobile/rhodes/Rhodes.java
14
- platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesService.java
15
- platform/android/Rhodes/src/com/rhomobile/rhodes/RingtoneManager.java
16
- platform/android/Rhodes/src/com/rhomobile/rhodes/SplashScreen.java
17
- platform/android/Rhodes/src/com/rhomobile/rhodes/Utils.java
18
- platform/android/Rhodes/src/com/rhomobile/rhodes/WebView.java
19
1
  platform/android/Rhodes/src/com/rhomobile/rhodes/alert/Alert.java
2
+ platform/android/Rhodes/src/com/rhomobile/rhodes/AndroidR.java
3
+ platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/IRhoBluetoothManager.java
4
+ platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothDeviceListActivity.java
5
+ platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothManager.java
6
+ platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothManagerNew.java
7
+ platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothManagerOld.java
8
+ platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothSession.java
9
+ platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/UUIDHelper.java
20
10
  platform/android/Rhodes/src/com/rhomobile/rhodes/camera/Camera.java
21
11
  platform/android/Rhodes/src/com/rhomobile/rhodes/camera/FileList.java
22
- platform/android/Rhodes/src/com/rhomobile/rhodes/camera/ImageCapture.java
23
12
  platform/android/Rhodes/src/com/rhomobile/rhodes/camera/ImageCaptureCallback.java
13
+ platform/android/Rhodes/src/com/rhomobile/rhodes/camera/ImageCapture.java
24
14
  platform/android/Rhodes/src/com/rhomobile/rhodes/datetime/DateTimePicker.java
25
15
  platform/android/Rhodes/src/com/rhomobile/rhodes/datetime/DateTimePickerScreen.java
16
+ platform/android/Rhodes/src/com/rhomobile/rhodes/event/Event.java
17
+ platform/android/Rhodes/src/com/rhomobile/rhodes/event/EventStore.java
26
18
  platform/android/Rhodes/src/com/rhomobile/rhodes/file/RhoFileApi.java
27
- platform/android/Rhodes/src/com/rhomobile/rhodes/geolocation/GeoLocation.java
28
19
  platform/android/Rhodes/src/com/rhomobile/rhodes/geolocation/GeoLocationImpl.java
20
+ platform/android/Rhodes/src/com/rhomobile/rhodes/geolocation/GeoLocation.java
21
+ platform/android/Rhodes/src/com/rhomobile/rhodes/HttpLog.java
22
+ platform/android/Rhodes/src/com/rhomobile/rhodes/Logger.java
29
23
  platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/MainView.java
30
24
  platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SimpleMainView.java
31
25
  platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/TabbedMainView.java
32
26
  platform/android/Rhodes/src/com/rhomobile/rhodes/mapview/Annotation.java
33
27
  platform/android/Rhodes/src/com/rhomobile/rhodes/mapview/AnnotationsOverlay.java
34
28
  platform/android/Rhodes/src/com/rhomobile/rhodes/mapview/MapView.java
35
- platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/Contact.java
29
+ platform/android/Rhodes/src/com/rhomobile/rhodes/NativeBar.java
30
+ platform/android/Rhodes/src/com/rhomobile/rhodes/nativeview/RhoNativeViewManager.java
31
+ platform/android/Rhodes/src/com/rhomobile/rhodes/NavBar.java
32
+ platform/android/Rhodes/src/com/rhomobile/rhodes/NetworkConnectivityListener.java
33
+ platform/android/Rhodes/src/com/rhomobile/rhodes/NetworkStateTracker.java
36
34
  platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/ContactAccessor.java
37
35
  platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/ContactAccessorNew.java
38
36
  platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/ContactAccessorOld.java
39
37
  platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/ContactField.java
38
+ platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/Contact.java
40
39
  platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/Phonebook.java
40
+ platform/android/Rhodes/src/com/rhomobile/rhodes/PushReceiver.java
41
+ platform/android/Rhodes/src/com/rhomobile/rhodes/PushService.java
42
+ platform/android/Rhodes/src/com/rhomobile/rhodes/RhoActivity.java
43
+ platform/android/Rhodes/src/com/rhomobile/rhodes/RhoConf.java
44
+ platform/android/Rhodes/src/com/rhomobile/rhodes/Rhodes.java
45
+ platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesService.java
46
+ platform/android/Rhodes/src/com/rhomobile/rhodes/RhoLogConf.java
47
+ platform/android/Rhodes/src/com/rhomobile/rhodes/RhoMenu.java
48
+ platform/android/Rhodes/src/com/rhomobile/rhodes/RingtoneManager.java
41
49
  platform/android/Rhodes/src/com/rhomobile/rhodes/signature/ImageCapture.java
42
50
  platform/android/Rhodes/src/com/rhomobile/rhodes/signature/Signature.java
43
51
  platform/android/Rhodes/src/com/rhomobile/rhodes/signature/SignatureView.java
44
52
  platform/android/Rhodes/src/com/rhomobile/rhodes/socket/RhoSockAddr.java
45
- platform/android/Rhodes/src/com/rhomobile/rhodes/socket/RhoSocket.java
46
53
  platform/android/Rhodes/src/com/rhomobile/rhodes/socket/RhoSocketImpl.java
54
+ platform/android/Rhodes/src/com/rhomobile/rhodes/socket/RhoSocket.java
47
55
  platform/android/Rhodes/src/com/rhomobile/rhodes/socket/SSLImpl.java
56
+ platform/android/Rhodes/src/com/rhomobile/rhodes/SplashScreen.java
48
57
  platform/android/Rhodes/src/com/rhomobile/rhodes/ui/AboutDialog.java
49
58
  platform/android/Rhodes/src/com/rhomobile/rhodes/ui/LogOptionsDialog.java
50
59
  platform/android/Rhodes/src/com/rhomobile/rhodes/ui/LogViewDialog.java
@@ -54,8 +63,10 @@ platform/android/Rhodes/src/com/rhomobile/rhodes/uri/TelUriHandler.java
54
63
  platform/android/Rhodes/src/com/rhomobile/rhodes/uri/UriHandler.java
55
64
  platform/android/Rhodes/src/com/rhomobile/rhodes/uri/VideoUriHandler.java
56
65
  platform/android/Rhodes/src/com/rhomobile/rhodes/util/PerformOnUiThread.java
66
+ platform/android/Rhodes/src/com/rhomobile/rhodes/Utils.java
57
67
  platform/android/Rhodes/src/com/rhomobile/rhodes/webview/ChromeClientNew.java
58
68
  platform/android/Rhodes/src/com/rhomobile/rhodes/webview/ChromeClientOld.java
69
+ platform/android/Rhodes/src/com/rhomobile/rhodes/WebView.java
59
70
  platform/android/Rhodes/src/com/rhomobile/rhodes/webview/RhoWebSettings.java
60
71
  platform/android/Rhodes/src/com/rhomobile/rhodes/webview/RhoWebSettingsNew.java
61
72
  platform/android/Rhodes/src/com/rhomobile/rhodes/webview/RhoWebSettingsOld.java
@@ -20,6 +20,8 @@ def get_api_level(version)
20
20
  ANDROID_MARKET_VERSION_TO_API_LEVEL[version]
21
21
  end
22
22
 
23
+ JAVA_PACKAGE_NAME = 'com.rhomobile.rhodes'
24
+
23
25
  # Here is place were android platform should be specified.
24
26
  # For complete list of android API levels and its mapping to
25
27
  # market names (such as "Android-1.5" etc) see output of
@@ -34,9 +36,55 @@ ANDROID_PERMISSIONS = {
34
36
  'phone' => ['CALL_PHONE', 'READ_PHONE_STATE'],
35
37
  'pim' => ['READ_CONTACTS', 'WRITE_CONTACTS', 'GET_ACCOUNTS'],
36
38
  'record_audio' => 'RECORD_AUDIO',
37
- 'vibrate' => 'VIBRATE'
39
+ 'vibrate' => 'VIBRATE',
40
+ 'bluetooth' => ['BLUETOOTH_ADMIN', 'BLUETOOTH'],
41
+ 'calendar' => ['READ_CALENDAR', 'WRITE_CALENDAR'],
42
+ 'push' => proc do |manifest| add_push(manifest) end
38
43
  }
39
44
 
45
+ def add_push(manifest)
46
+ element = REXML::Element.new('permission')
47
+ element.add_attribute('android:name', "#{$app_package_name}.permission.C2D_MESSAGE")
48
+ element.add_attribute('android:protectionLevel', 'signature')
49
+ manifest.add element
50
+
51
+ element = REXML::Element.new('uses-permission')
52
+ element.add_attribute('android:name', "#{$app_package_name}.permission.C2D_MESSAGE")
53
+ manifest.add element
54
+
55
+ element = REXML::Element.new('uses-permission')
56
+ element.add_attribute('android:name', "com.google.android.c2dm.permission.RECEIVE")
57
+ manifest.add element
58
+
59
+ receiver = REXML::Element.new('receiver')
60
+ receiver.add_attribute('android:name', "#{JAVA_PACKAGE_NAME}.PushReceiver")
61
+ receiver.add_attribute('android:permission', "com.google.android.c2dm.permission.SEND")
62
+
63
+ action = REXML::Element.new('action')
64
+ action.add_attribute('android:name', "com.google.android.c2dm.intent.RECEIVE")
65
+ category = REXML::Element.new('category')
66
+ category.add_attribute('android:name', $app_package_name)
67
+
68
+ ie = REXML::Element.new('intent-filter')
69
+ ie.add_element(action)
70
+ ie.add_element(category)
71
+ receiver.add_element(ie)
72
+
73
+ action = REXML::Element.new('action')
74
+ action.add_attribute('android:name', "com.google.android.c2dm.intent.REGISTRATION")
75
+ category = REXML::Element.new('category')
76
+ category.add_attribute('android:name', $app_package_name)
77
+
78
+ ie = REXML::Element.new('intent-filter')
79
+ ie.add_element(action)
80
+ ie.add_element(category)
81
+ receiver.add_element(ie)
82
+
83
+ manifest.elements.each('application') do |app|
84
+ app.add receiver
85
+ end
86
+ end
87
+
40
88
  def set_app_name_android(newname)
41
89
  puts "set_app_name"
42
90
  $stdout.flush
@@ -80,10 +128,15 @@ def set_app_name_android(newname)
80
128
 
81
129
  doc.elements.delete "manifest/application/uses-library[@android:name='com.google.android.maps']" unless $use_geomapping
82
130
 
83
- caps = ['INTERNET', 'PERSISTENT_ACTIVITY']
131
+ caps_proc = []
132
+ caps = ['INTERNET', 'PERSISTENT_ACTIVITY', 'WAKE_LOCK']
84
133
  $app_config["capabilities"].each do |cap|
85
134
  cap = ANDROID_PERMISSIONS[cap]
86
135
  next if cap.nil?
136
+ if cap.is_a? Proc
137
+ caps_proc << cap
138
+ next
139
+ end
87
140
  cap = [cap] if cap.is_a? String
88
141
  cap = [] unless cap.is_a? Array
89
142
  caps += cap
@@ -97,6 +150,14 @@ def set_app_name_android(newname)
97
150
  element.add_attribute('android:minSdkVersion', ANDROID_API_LEVEL.to_s)
98
151
  manifest.add element
99
152
 
153
+ # Clear C2DM stuff
154
+ doc.elements.delete "manifest/application/receiver[@android:name='com.rhomobile.rhodes.PushReceiver']"
155
+ manifest.elements.each('permission') do |e|
156
+ name = e.attribute('name', 'android')
157
+ next if name.nil?
158
+ manifest.delete(e) if name.to_s =~ /\.C2D_MESSAGE$/
159
+ end
160
+
100
161
  manifest.elements.each('uses-permission') { |e| manifest.delete e }
101
162
  caps.sort.each do |cap|
102
163
  element = REXML::Element.new('uses-permission')
@@ -104,6 +165,10 @@ def set_app_name_android(newname)
104
165
  manifest.add element
105
166
  end
106
167
 
168
+ caps_proc.each do |p|
169
+ p.call manifest
170
+ end
171
+
107
172
  File.open($appmanifest, "w") { |f| doc.write f, 2 }
108
173
 
109
174
  buf = File.new($rho_android_r,"r").read.gsub(/^\s*import com\.rhomobile\..*\.R;\s*$/,"\nimport #{$app_package_name}.R;\n")
@@ -158,6 +223,16 @@ namespace "config" do
158
223
  exit 1
159
224
  end
160
225
 
226
+ errfmt = "WARNING!!! Path to Android %s contain spaces! It will not work because of the Google toolchain restrictions. Move it to another location and reconfigure rhodes."
227
+ if $androidsdkpath =~ /\s/
228
+ puts(errfmt % "SDK")
229
+ exit 1
230
+ end
231
+ if $androidndkpath =~ /\s/
232
+ puts(errfmt % "NDK")
233
+ exit 1
234
+ end
235
+
161
236
  $java = $config["env"]["paths"]["java"]
162
237
  $androidpath = Jake.get_absolute $config["build"]["androidpath"]
163
238
  $bindir = File.join($app_path, "bin")
@@ -187,6 +262,7 @@ namespace "config" do
187
262
  $app_rjava_dir = File.join $tmpdir
188
263
  $app_native_libs_java = File.join $tmpdir, "NativeLibraries.java"
189
264
  $app_capabilities_java = File.join $tmpdir, "Capabilities.java"
265
+ $app_push_java = File.join $tmpdir, "Push.java"
190
266
 
191
267
  if RUBY_PLATFORM =~ /(win|w)32$/
192
268
  $emulator = #"cmd /c " +
@@ -194,7 +270,6 @@ namespace "config" do
194
270
  $bat_ext = ".bat"
195
271
  $exe_ext = ".exe"
196
272
  $path_separator = ";"
197
- $rubypath = "res/build-tools/RhoRuby.exe"
198
273
 
199
274
  # Add PATH to cygwin1.dll
200
275
  ENV['CYGWIN'] = 'nodosfilewarning'
@@ -209,11 +284,6 @@ namespace "config" do
209
284
  $exe_ext = ""
210
285
  $path_separator = ":"
211
286
  # TODO: add ruby executable for Linux
212
- if RUBY_PLATFORM =~ /darwin/
213
- $rubypath = "res/build-tools/RubyMac"
214
- else
215
- $rubypath = "res/build-tools/rubylinux"
216
- end
217
287
  end
218
288
 
219
289
  puts "+++ Looking for platform..." if USE_TRACES
@@ -271,7 +341,7 @@ namespace "config" do
271
341
  $keystore = nil
272
342
  $keystore = $app_config["android"]["production"]["certificate"] if !$app_config["android"].nil? and !$app_config["android"]["production"].nil?
273
343
  $keystore = $config["android"]["production"]["certificate"] if $keystore.nil? and !$config["android"].nil? and !$config["android"]["production"].nil?
274
- $keystore = File.join(File.expand_path('~'), ".rhomobile", "keystore") if $keystore.nil?
344
+ $keystore = File.expand_path(File.join(ENV['HOME'], ".rhomobile", "keystore")) if $keystore.nil?
275
345
 
276
346
  $storepass = nil
277
347
  $storepass = $app_config["android"]["production"]["password"] if !$app_config["android"].nil? and !$app_config["android"]["production"].nil?
@@ -388,6 +458,11 @@ namespace "config" do
388
458
  end
389
459
  $app_config["capabilities"].map! { |cap| cap.is_a?(String) ? cap : nil }.delete_if { |cap| cap.nil? }
390
460
 
461
+ $push_sender = nil
462
+ $push_sender = $config["android"]["push"]["sender"] if !$config["android"].nil? and !$config["android"]["push"].nil?
463
+ $push_sender = $app_config["android"]["push"]["sender"] if !$app_config["android"].nil? and !$app_config["android"]["push"].nil?
464
+ $push_sender = "support@rhomobile.com" if $push_sender.nil?
465
+
391
466
  mkdir_p $bindir if not File.exists? $bindir
392
467
  mkdir_p $rhobindir if not File.exists? $rhobindir
393
468
  mkdir_p $targetdir if not File.exists? $targetdir
@@ -661,9 +736,9 @@ namespace "build" do
661
736
 
662
737
  gapi_already_enabled = false
663
738
  caps_already_enabled = {}
664
- ANDROID_PERMISSIONS.keys.each do |k|
665
- caps_already_enabled[k] = false
666
- end
739
+ #ANDROID_PERMISSIONS.keys.each do |k|
740
+ # caps_already_enabled[k] = false
741
+ #end
667
742
  if File.file? genconfig_h
668
743
  File.open(genconfig_h, 'r') do |f|
669
744
  while line = f.gets
@@ -671,8 +746,16 @@ namespace "build" do
671
746
  gapi_already_enabled = true
672
747
  else
673
748
  ANDROID_PERMISSIONS.keys.each do |k|
674
- re = /^\s*#\s*define\s+RHO_CAP_#{k.upcase}_ENABLED\s+true\s*$/
675
- caps_already_enabled[k] = true if line =~ re
749
+ if line =~ /^\s*#\s*define\s+RHO_CAP_#{k.upcase}_ENABLED\s+(.*)\s*$/
750
+ value = $1.strip
751
+ if value == 'true'
752
+ caps_already_enabled[k] = true
753
+ elsif value == 'false'
754
+ caps_already_enabled[k] = false
755
+ else
756
+ raise "Unknown value for the RHO_CAP_#{k.upcase}_ENABLED: #{value}"
757
+ end
758
+ end
676
759
  end
677
760
  end
678
761
  end
@@ -686,7 +769,7 @@ namespace "build" do
686
769
  caps_enabled = {}
687
770
  ANDROID_PERMISSIONS.keys.each do |k|
688
771
  caps_enabled[k] = $app_config["capabilities"].index(k) != nil
689
- regenerate = true if caps_enabled[k] != caps_already_enabled[k]
772
+ regenerate = true if caps_already_enabled[k].nil? or caps_enabled[k] != caps_already_enabled[k]
690
773
  end
691
774
 
692
775
  if regenerate
@@ -735,18 +818,28 @@ namespace "build" do
735
818
 
736
819
  # Generate Capabilities.java
737
820
  File.open($app_capabilities_java, "w") do |f|
738
- f.puts "package com.rhomobile.rhodes;"
821
+ f.puts "package #{JAVA_PACKAGE_NAME};"
739
822
  f.puts "public class Capabilities {"
740
823
  ANDROID_PERMISSIONS.keys.sort.each do |k|
741
824
  f.puts " public static boolean #{k.upcase}_ENABLED = true;"
742
825
  end
743
826
  f.puts "}"
744
827
  end
828
+
829
+ # Generate Push.java
830
+ puts "app_push_java: #{$app_push_java.inspect}"
831
+ File.open($app_push_java, "w") do |f|
832
+ f.puts "package #{JAVA_PACKAGE_NAME};"
833
+ f.puts "public class Push {"
834
+ f.puts " public static final String SENDER = \"#{$push_sender}\";"
835
+ f.puts "};"
836
+ end
837
+
745
838
  end
746
839
 
747
840
  task :gen_java_ext => "config:android" do
748
841
  File.open($app_native_libs_java, "w") do |f|
749
- f.puts "package com.rhomobile.rhodes;"
842
+ f.puts "package #{JAVA_PACKAGE_NAME};"
750
843
  f.puts "public class NativeLibraries {"
751
844
  f.puts " public static void load() {"
752
845
  f.puts " // Load native .so libraries"
@@ -864,11 +957,12 @@ namespace "build" do
864
957
  lines << $app_android_r
865
958
  lines << $app_native_libs_java
866
959
  lines << $app_capabilities_java
960
+ lines << $app_push_java
867
961
  if File.exists? File.join($extensionsdir, "ext_build.files")
868
962
  puts 'ext_build.files found ! Addditional files for compilation :'
869
963
  File.open(File.join($extensionsdir, "ext_build.files")) do |f|
870
964
  while line = f.gets
871
- puts 'java file : ' + line
965
+ puts 'java file : ' + line
872
966
  lines << line
873
967
  end
874
968
  end
@@ -906,6 +1000,13 @@ namespace "build" do
906
1000
  end
907
1001
 
908
1002
  files = []
1003
+ Dir.glob(File.join($extensionsdir, "*.jar")).each do |f|
1004
+ puts Jake.run($jarbin, ["xf", f], File.join($tmpdir, "Rhodes"))
1005
+ unless $?.success?
1006
+ puts "Error running jar (xf)"
1007
+ exit 1
1008
+ end
1009
+ end
909
1010
  Dir.glob(File.join($tmpdir, "Rhodes", "*")).each do |f|
910
1011
  relpath = Pathname.new(f).relative_path_from(Pathname.new(File.join($tmpdir, "Rhodes"))).to_s
911
1012
  files << relpath
@@ -1159,7 +1260,7 @@ def run_application (target_flag)
1159
1260
  args << "-a"
1160
1261
  args << "android.intent.action.MAIN"
1161
1262
  args << "-n"
1162
- args << $app_package_name + "/com.rhomobile.rhodes.Rhodes"
1263
+ args << $app_package_name + "/#{JAVA_PACKAGE_NAME}.Rhodes"
1163
1264
  Jake.run($adb, args)
1164
1265
  end
1165
1266
 
@@ -1181,6 +1282,21 @@ namespace "run" do
1181
1282
  log_name = $app_path + '/RhoLog.txt'
1182
1283
  File.delete(log_name) if File.exist?(log_name)
1183
1284
 
1285
+ # Failsafe to prevent eternal hangs
1286
+ Thread.new {
1287
+ sleep 1000
1288
+
1289
+ if RUBY_PLATFORM =~ /darwin/
1290
+ # OS X:
1291
+ `killall -9 adb`
1292
+ `killall -9 emulator`
1293
+ else
1294
+ # Windows
1295
+ `taskkill /F /IM adb.exe`
1296
+ `taskkill /F /IM emulator.exe`
1297
+ end
1298
+ }
1299
+
1184
1300
  load_app_and_run
1185
1301
 
1186
1302
  Jake.before_run_spec
@@ -1212,19 +1328,31 @@ namespace "run" do
1212
1328
  sleep(5) unless end_spec
1213
1329
  end
1214
1330
 
1215
- #TODO: stop app
1216
1331
  Jake.process_spec_results(start)
1217
1332
 
1333
+ # stop app
1334
+ if RUBY_PLATFORM =~ /darwin/
1335
+ # OS X:
1336
+ `killall -9 adb`
1337
+ `killall -9 emulator`
1338
+ else
1339
+ # Windows
1340
+ `taskkill /F /IM adb.exe`
1341
+ `taskkill /F /IM emulator.exe`
1342
+ end
1343
+
1218
1344
  $stdout.flush
1219
1345
 
1220
1346
  end
1221
1347
 
1222
1348
  task :phone_spec do
1223
- Jake.run_spec_app('android','phone_spec')
1349
+ exit 1 if Jake.run_spec_app('android','phone_spec')
1350
+ exit 0
1224
1351
  end
1225
1352
 
1226
1353
  task :framework_spec do
1227
- Jake.run_spec_app('android','framework_spec')
1354
+ exit 1 if Jake.run_spec_app('android','framework_spec')
1355
+ exit 0
1228
1356
  end
1229
1357
 
1230
1358
  task :emulator => "device:android:debug" do
@@ -1234,7 +1362,13 @@ namespace "run" do
1234
1362
 
1235
1363
  def run_emulator
1236
1364
  apkfile = Jake.get_absolute $targetdir + "/" + $appname + "-debug.apk"
1237
- puts `"#{$adb}" start-server`
1365
+
1366
+ Jake.run($adb, ['kill-server'])
1367
+ #Jake.run($adb, ['start-server'])
1368
+ #adb_start_server = $adb + ' start-server'
1369
+ Thread.new { Jake.run($adb, ['start-server']) }
1370
+ puts 'Sleep for 5 sec. waiting for "adb start-server"'
1371
+ sleep 5
1238
1372
 
1239
1373
  createavd = "\"#{$androidbin}\" create avd --name #{$avdname} --target #{$avdtarget} --sdcard 32M --skin HVGA"
1240
1374
  system(createavd) unless File.directory?( File.join(ENV['HOME'], ".android", "avd", "#{$avdname}.avd" ) )
@@ -1249,12 +1383,49 @@ namespace "run" do
1249
1383
  end
1250
1384
 
1251
1385
  running = is_emulator_running
1252
- Thread.new { system("\"#{$emulator}\" -avd #{$avdname}") } unless running
1253
1386
 
1254
- puts "Waiting for emulator to get started" unless running
1255
- puts "Emulator is up and running" if running
1387
+ if !running
1388
+ # Start the emulator, check on it every 5 seconds until it's running
1389
+ Thread.new { system("\"#{$emulator}\" -avd #{$avdname}") }
1390
+ puts "Waiting up to 180 seconds for emulator..."
1391
+ startedWaiting = Time.now
1392
+ adbRestarts = 1
1393
+ while (Time.now - startedWaiting < 180 )
1394
+ sleep 5
1395
+ now = Time.now
1396
+ emulatorState = ""
1397
+ Jake.run2($adb,["-e", "get-state"],{:system => false, :hideerrors => :false}) do |line|
1398
+ puts "RET: " + line
1399
+ emulatorState += line
1400
+ end
1401
+ if emulatorState =~ /unknown/
1402
+ printf("%.2fs: ",(now - startedWaiting))
1403
+ if (now - startedWaiting) > (60 * adbRestarts)
1404
+ # Restart the adb server every 60 seconds to prevent eternal waiting
1405
+ puts "Appears hung, restarting adb server"
1406
+ Jake.run($adb, ['kill-server'])
1407
+ Thread.new { Jake.run($adb, ['start-server']) }
1408
+ adbRestarts += 1
1409
+ else
1410
+ puts "Still waiting..."
1411
+ end
1412
+ else
1413
+ puts "Success"
1414
+ puts "Device is ready after " + (Time.now - startedWaiting).to_s + " seconds"
1415
+ break
1416
+ end
1417
+ end
1418
+
1419
+ if !is_emulator_running
1420
+ puts "Emulator still isn't up and running, giving up"
1421
+ exit 1
1422
+ end
1423
+
1424
+ else
1425
+ puts "Emulator is up and running"
1426
+ end
1427
+
1256
1428
  $stdout.flush
1257
- puts `"#{$adb}" -e wait-for-device`
1258
1429
  end
1259
1430
 
1260
1431
  def load_app_and_run