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
@@ -6,11 +6,13 @@
6
6
  #include <logging/RhoLogConf.h>
7
7
  #include <common/RhodesApp.h>
8
8
  #include <sync/SyncThread.h>
9
+ #include <sync/ClientRegister.h>
9
10
 
10
11
  #include <sys/stat.h>
11
12
  #include <sys/resource.h>
12
13
 
13
14
  #include "rhodes/JNIRhodes.h"
15
+ #include "rhodes/RhoClassFactory.h"
14
16
 
15
17
  #undef DEFAULT_LOGCATEGORY
16
18
  #define DEFAULT_LOGCATEGORY "Rhodes"
@@ -493,6 +495,20 @@ RHO_GLOBAL void JNICALL Java_com_rhomobile_rhodes_RhodesService_callActivationCa
493
495
  rho_rhodesapp_callAppActiveCallback(active);
494
496
  }
495
497
 
498
+ RHO_GLOBAL void JNICALL Java_com_rhomobile_rhodes_RhodesService_setPushRegistrationId
499
+ (JNIEnv *env, jobject, jstring jId)
500
+ {
501
+ std::string id = rho_cast<std::string>(env, jId);
502
+ rho::sync::CClientRegister::Create(new rho::common::CRhoClassFactory, id.c_str());
503
+ }
504
+
505
+ RHO_GLOBAL void JNICALL Java_com_rhomobile_rhodes_RhodesService_callPushCallback
506
+ (JNIEnv *env, jobject, jstring jData)
507
+ {
508
+ std::string data = rho_cast<std::string>(env, jData);
509
+ rho_rhodesapp_callPushCallback(data.c_str());
510
+ }
511
+
496
512
  RHO_GLOBAL char *rho_timezone()
497
513
  {
498
514
  static char *tz = NULL;
@@ -70,6 +70,9 @@ namespace net
70
70
  SSLImpl::SSLImpl()
71
71
  {
72
72
  JNIEnv *env = jnienv();
73
+ if (!env) {
74
+ return;
75
+ }
73
76
  cls = getJNIClass(RHODES_JAVA_CLASS_SSLIMPL);
74
77
  if (!cls) return;
75
78
  midConstructor = getJNIClassMethod(env, cls, "<init>", "()V");
@@ -0,0 +1,42 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:orientation="vertical"
4
+ android:layout_width="match_parent"
5
+ android:layout_height="match_parent"
6
+ >
7
+ <TextView android:id="@+id/title_paired_devices"
8
+ android:layout_width="match_parent"
9
+ android:layout_height="wrap_content"
10
+ android:text="@string/title_paired_devices"
11
+ android:visibility="gone"
12
+ android:background="#666"
13
+ android:textColor="#fff"
14
+ android:paddingLeft="5dp"
15
+ />
16
+ <ListView android:id="@+id/paired_devices"
17
+ android:layout_width="match_parent"
18
+ android:layout_height="wrap_content"
19
+ android:stackFromBottom="true"
20
+ android:layout_weight="1"
21
+ />
22
+ <TextView android:id="@+id/title_new_devices"
23
+ android:layout_width="match_parent"
24
+ android:layout_height="wrap_content"
25
+ android:text="@string/title_other_devices"
26
+ android:visibility="gone"
27
+ android:background="#666"
28
+ android:textColor="#fff"
29
+ android:paddingLeft="5dp"
30
+ />
31
+ <ListView android:id="@+id/new_devices"
32
+ android:layout_width="match_parent"
33
+ android:layout_height="wrap_content"
34
+ android:stackFromBottom="true"
35
+ android:layout_weight="2"
36
+ />
37
+ <Button android:id="@+id/button_scan"
38
+ android:layout_width="match_parent"
39
+ android:layout_height="wrap_content"
40
+ android:text="@string/button_scan"
41
+ />
42
+ </LinearLayout>
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <TextView xmlns:android="http://schemas.android.com/apk/res/android"
3
+ android:layout_width="match_parent"
4
+ android:layout_height="wrap_content"
5
+ android:textSize="18sp"
6
+ android:padding="5dp"
7
+ />
@@ -19,4 +19,12 @@
19
19
  <string name="cancel">Cancel</string>
20
20
  <color name="sig_bkgColor">#FFFFFF</color>
21
21
  <color name="sig_penColor">#66009A</color>
22
+ <!-- RhoBluetoothDeviceListActivity -->
23
+ <string name="scanning">scanning for devices...</string>
24
+ <string name="select_device">select a device to connect</string>
25
+ <string name="none_paired">No devices have been paired</string>
26
+ <string name="none_found">No devices found</string>
27
+ <string name="title_paired_devices">Paired Devices</string>
28
+ <string name="title_other_devices">Other Available Devices</string>
29
+ <string name="button_scan">Scan for devices</string>
22
30
  </resources>
@@ -73,6 +73,11 @@ public final class AndroidR {
73
73
  public static final int sig_clearButton=R.id.sig_clearButton;
74
74
  public static final int sig_okButton=R.id.sig_okButton;
75
75
  public static final int signature_view=R.id.signature_view;
76
+ public static final int title_paired_devices=R.id.title_paired_devices;
77
+ public static final int paired_devices=R.id.paired_devices;
78
+ public static final int title_new_devices=R.id.title_new_devices;
79
+ public static final int new_devices=R.id.new_devices;
80
+ public static final int button_scan=R.id.button_scan;
76
81
  }
77
82
  public static final class layout {
78
83
  public static final int camera=R.layout.camera;
@@ -83,6 +88,8 @@ public final class AndroidR {
83
88
  public static final int logoptions=R.layout.logoptions;
84
89
  public static final int logview=R.layout.logview;
85
90
  public static final int datetime=R.layout.datetime;
91
+ public static final int bt_device_list=R.layout.bt_device_list;
92
+ public static final int bt_device_name=R.layout.bt_device_name;
86
93
  }
87
94
  public static final class menu {
88
95
  public static final int options=R.menu.options;
@@ -103,5 +110,12 @@ public final class AndroidR {
103
110
  public static final int refresh=R.string.refresh;
104
111
  public static final int sync=R.string.sync;
105
112
  public static final int to_top=R.string.to_top;
113
+ public static final int scanning=R.string.scanning;
114
+ public static final int select_device=R.string.select_device;
115
+ public static final int none_paired=R.string.none_paired;
116
+ public static final int none_found=R.string.none_found;
117
+ public static final int title_paired_devices=R.string.title_paired_devices;
118
+ public static final int title_other_devices=R.string.title_other_devices;
119
+ public static final int button_scan=R.string.button_scan;
106
120
  }
107
121
  }
@@ -3,11 +3,13 @@ package com.rhomobile.rhodes;
3
3
  public class Capabilities {
4
4
 
5
5
  public static boolean AUDIO_ENABLED = true;
6
+ public static boolean CALENDAR_ENABLED = true;
6
7
  public static boolean CAMERA_ENABLED = true;
7
8
  public static boolean GPS_ENABLED = true;
8
9
  public static boolean NETWORK_STATE_ENABLED = true;
9
10
  public static boolean PHONE_ENABLED = true;
10
11
  public static boolean PIM_ENABLED = true;
12
+ public static boolean PUSH_ENABLED = true;
11
13
  public static boolean RECORD_AUDIO_ENABLED = true;
12
14
  public static boolean VIBRATE_ENABLED = true;
13
15
 
@@ -0,0 +1,7 @@
1
+ package com.rhomobile.rhodes;
2
+
3
+ public class Push {
4
+
5
+ public static final String SENDER = "support@rhomobile.com";
6
+
7
+ }
@@ -0,0 +1,58 @@
1
+ package com.rhomobile.rhodes;
2
+
3
+ import android.content.BroadcastReceiver;
4
+ import android.content.Context;
5
+ import android.content.Intent;
6
+ import android.util.Log;
7
+
8
+ public class PushReceiver extends BroadcastReceiver {
9
+
10
+ private static final String TAG = "PushReceiver";
11
+
12
+ private static final String REG_ID = "registration_id";
13
+
14
+ private void handleRegistration(Context context, Intent intent) {
15
+ String id = intent.getStringExtra(REG_ID);
16
+ String error = intent.getStringExtra("error");
17
+ String unregistered = intent.getStringExtra("unregistered");
18
+ if (error != null) {
19
+ Log.d(TAG, "Received error: " + error);
20
+ }
21
+ else if (unregistered != null) {
22
+ Log.d(TAG, "Unregistered: " + unregistered);
23
+ }
24
+ else if (id != null) {
25
+ // TODO: store it in reg_id variable
26
+ Log.d(TAG, "Registered: id: " + id);
27
+ RhodesService r = RhodesService.getInstance();
28
+ if (r == null) {
29
+ Log.e(TAG, "Rhodes instance is null");
30
+ return;
31
+ }
32
+ r.setPushRegistrationId(id);
33
+ }
34
+ else
35
+ Log.w(TAG, "Unknown registration event");
36
+ }
37
+
38
+ private void handleMessage(Context context, Intent intent) {
39
+ RhodesService r = RhodesService.getInstance();
40
+ if (r == null) {
41
+ Log.e(TAG, "Rhodes instance is null");
42
+ return;
43
+ }
44
+ r.handlePushMessage(intent);
45
+ }
46
+
47
+ @Override
48
+ public void onReceive(Context context, Intent intent) {
49
+ String action = intent.getAction();
50
+ if (action.equals(PushService.C2DM_INTENT_PREFIX + "REGISTRATION"))
51
+ handleRegistration(context, intent);
52
+ else if (action.equals(PushService.C2DM_INTENT_PREFIX + "RECEIVE"))
53
+ handleMessage(context, intent);
54
+ else
55
+ Log.w(TAG, "Unknown action received (PUSH): " + action);
56
+ }
57
+
58
+ }
@@ -0,0 +1,53 @@
1
+ package com.rhomobile.rhodes;
2
+
3
+ import android.app.PendingIntent;
4
+ import android.content.Context;
5
+ import android.content.Intent;
6
+ import android.os.Build;
7
+
8
+ public class PushService {
9
+
10
+ private static final String TAG = "PushService";
11
+
12
+ public static final String C2DM_INTENT_PREFIX = "com.google.android.c2dm.intent.";
13
+
14
+ private static void checkCapabilities() throws IllegalAccessException {
15
+ if (!Capabilities.PUSH_ENABLED)
16
+ throw new IllegalAccessException("Capability PUSH disabled");
17
+ }
18
+
19
+ private static boolean isOsVersionEnough() {
20
+ int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
21
+ return sdkVersion >= Build.VERSION_CODES.FROYO;
22
+ }
23
+
24
+ public static void register() throws IllegalAccessException {
25
+ if (!isOsVersionEnough())
26
+ return;
27
+
28
+ checkCapabilities();
29
+
30
+ Logger.D(TAG, "Register for PUSH messages");
31
+
32
+ Context ctx = RhodesService.getInstance().getContext();
33
+ Intent registrationIntent = new Intent(C2DM_INTENT_PREFIX + "REGISTER");
34
+ registrationIntent.putExtra("app", PendingIntent.getBroadcast(ctx, 0, new Intent(), 0));
35
+ registrationIntent.putExtra("sender", Push.SENDER);
36
+ ctx.startService(registrationIntent);
37
+ }
38
+
39
+ public static void unregister() throws IllegalAccessException {
40
+ if (!isOsVersionEnough())
41
+ return;
42
+
43
+ checkCapabilities();
44
+
45
+ Logger.D(TAG, "Unregister from PUSH messages");
46
+
47
+ Context ctx = RhodesService.getInstance().getContext();
48
+ Intent unregIntent = new Intent(C2DM_INTENT_PREFIX + "UNREGISTER");
49
+ unregIntent.putExtra("app", PendingIntent.getBroadcast(ctx, 0, new Intent(), 0));
50
+ ctx.startService(unregIntent);
51
+ }
52
+
53
+ }
@@ -22,6 +22,7 @@ package com.rhomobile.rhodes;
22
22
 
23
23
  import com.rhomobile.rhodes.mainview.MainView;
24
24
 
25
+ import android.content.Intent;
25
26
  import android.content.pm.ActivityInfo;
26
27
  import android.content.res.Configuration;
27
28
  import android.os.Bundle;
@@ -33,6 +34,7 @@ import android.view.MenuItem;
33
34
  import android.view.Window;
34
35
  import android.view.ViewGroup.LayoutParams;
35
36
  import android.widget.FrameLayout;
37
+ import com.rhomobile.rhodes.bluetooth.RhoBluetoothManager;
36
38
 
37
39
  public class Rhodes extends RhoActivity {
38
40
 
@@ -120,4 +122,10 @@ public class Rhodes extends RhoActivity {
120
122
  static {
121
123
  NativeLibraries.load();
122
124
  }
125
+
126
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
127
+ RhoBluetoothManager.onActivityResult(requestCode, resultCode, data);
128
+ }
129
+
130
+
123
131
  }
@@ -5,9 +5,11 @@ import java.io.IOException;
5
5
  import java.util.Calendar;
6
6
  import java.util.Enumeration;
7
7
  import java.util.Locale;
8
+ import java.util.Set;
8
9
  import java.util.TimeZone;
9
10
  import java.util.Vector;
10
11
 
12
+ import com.rhomobile.rhodes.bluetooth.RhoBluetoothManager;
11
13
  import com.rhomobile.rhodes.file.RhoFileApi;
12
14
  import com.rhomobile.rhodes.geolocation.GeoLocation;
13
15
  import com.rhomobile.rhodes.mainview.MainView;
@@ -23,6 +25,7 @@ import com.rhomobile.rhodes.util.PerformOnUiThread;
23
25
  import com.rhomobile.rhodes.webview.ChromeClientOld;
24
26
  import com.rhomobile.rhodes.webview.RhoWebSettings;
25
27
 
28
+ import android.app.Activity;
26
29
  import android.content.Context;
27
30
  import android.content.Intent;
28
31
  import android.content.pm.ApplicationInfo;
@@ -31,7 +34,9 @@ import android.graphics.Bitmap;
31
34
  import android.net.ConnectivityManager;
32
35
  import android.net.NetworkInfo;
33
36
  import android.os.Build;
37
+ import android.os.Bundle;
34
38
  import android.os.Handler;
39
+ import android.os.PowerManager;
35
40
  import android.os.Process;
36
41
  import android.telephony.TelephonyManager;
37
42
  import android.util.DisplayMetrics;
@@ -62,12 +67,16 @@ public class RhodesService {
62
67
  return instance;
63
68
  }
64
69
 
65
- private Context ctx;
70
+ private Activity ctx;
66
71
 
67
72
  public Context getContext() {
68
73
  return ctx;
69
74
  }
70
75
 
76
+ public Activity getMainActivity() {
77
+ return ctx;
78
+ }
79
+
71
80
  private RhoLogConf m_rhoLogConf = new RhoLogConf();
72
81
  public RhoLogConf getLogConf() {
73
82
  return m_rhoLogConf;
@@ -90,10 +99,11 @@ public class RhodesService {
90
99
  return uiThreadId;
91
100
  }
92
101
 
93
- public void setInfo(Context c, long id, Handler handler) {
102
+ public void setInfo(Activity c, long id, Handler handler) {
94
103
  ctx = c;
95
104
  uiThreadId = id;
96
105
  uiHandler = handler;
106
+ RhoBluetoothManager.sharedInstance();
97
107
  }
98
108
 
99
109
  private Handler uiHandler;
@@ -150,6 +160,48 @@ public class RhodesService {
150
160
  private String rootPath = null;
151
161
  private native void nativeInitPath(String rootPath, String sqliteJournalsPath, String apkPath);
152
162
 
163
+ static PowerManager.WakeLock wakeLockObject = null;
164
+ static boolean wakeLockEnabled = false;
165
+
166
+ public static int rho_sys_set_sleeping(int enable) {
167
+ Logger.I(TAG, "rho_sys_set_sleeping("+enable+")");
168
+ int wasEnabled = 1;
169
+ if (wakeLockObject != null) {
170
+ wasEnabled = 0;
171
+ }
172
+ if (enable != 0) {
173
+ // disable lock device
174
+ PerformOnUiThread.exec( new Runnable() {
175
+ public void run() {
176
+ if (wakeLockObject != null) {
177
+ wakeLockObject.release();
178
+ wakeLockObject = null;
179
+ wakeLockEnabled = false;
180
+ }
181
+ }
182
+ }, false);
183
+ }
184
+ else {
185
+ // lock device from sleep
186
+ PerformOnUiThread.exec( new Runnable() {
187
+ public void run() {
188
+ if (wakeLockObject == null) {
189
+ PowerManager pm = (PowerManager)getInstance().getContext().getSystemService(Context.POWER_SERVICE);
190
+ if (pm != null) {
191
+ wakeLockObject = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
192
+ wakeLockObject.acquire();
193
+ wakeLockEnabled = true;
194
+ }
195
+ else {
196
+ Logger.E(TAG, "rho_sys_set_sleeping() - Can not get PowerManager !!!");
197
+ }
198
+ }
199
+ }
200
+ }, false);
201
+ }
202
+ return wasEnabled;
203
+ }
204
+
153
205
  private void initRootPath() {
154
206
  ApplicationInfo appInfo = getAppInfo();
155
207
  String dataDir = appInfo.dataDir;
@@ -197,6 +249,7 @@ public class RhodesService {
197
249
  return true;
198
250
  }
199
251
  catch (Exception ex) {
252
+ Logger.E(TAG, ex.getMessage());
200
253
  continue;
201
254
  }
202
255
  }
@@ -210,6 +263,8 @@ public class RhodesService {
210
263
  }
211
264
 
212
265
  public void hideSplashScreen() {
266
+ PerformOnUiThread.exec(new Runnable() {
267
+ public void run() {
213
268
  if (splashScreen != null) {
214
269
  splashScreen.hide(outerFrame);
215
270
  splashScreen = null;
@@ -217,6 +272,8 @@ public class RhodesService {
217
272
  View view = mainView.getView();
218
273
  view.setVisibility(View.VISIBLE);
219
274
  view.requestFocus();
275
+ }
276
+ }, false);
220
277
  }
221
278
 
222
279
  public WebView createWebView() {
@@ -325,7 +382,7 @@ public class RhodesService {
325
382
  return instance != null;
326
383
  }
327
384
 
328
- public RhodesService(Context c, ViewGroup rootWindow) {
385
+ public RhodesService(Activity c, ViewGroup rootWindow) {
329
386
  ctx = c;
330
387
  instance = this;
331
388
 
@@ -399,6 +456,15 @@ public class RhodesService {
399
456
  uriHandlers.addElement(new SmsUriHandler(ctx));
400
457
  uriHandlers.addElement(new VideoUriHandler(ctx));
401
458
 
459
+ try {
460
+ if (Capabilities.PUSH_ENABLED)
461
+ PushService.register();
462
+ } catch (IllegalAccessException e) {
463
+ Log.e(TAG, e.getMessage());
464
+ exitApp();
465
+ return;
466
+ }
467
+
402
468
  Thread init = new Thread(new Runnable() {
403
469
 
404
470
  public void run() {
@@ -414,6 +480,22 @@ public class RhodesService {
414
480
  }
415
481
 
416
482
  public void exitApp() {
483
+ try {
484
+ if (Capabilities.PUSH_ENABLED)
485
+ PushService.unregister();
486
+ } catch (IllegalAccessException e) {
487
+ Log.e(TAG, e.getMessage());
488
+ }
489
+
490
+ PerformOnUiThread.exec( new Runnable() {
491
+ public void run() {
492
+ if (wakeLockObject != null) {
493
+ wakeLockObject.release();
494
+ wakeLockObject = null;
495
+ wakeLockEnabled = false;
496
+ }
497
+ }
498
+ }, false);
417
499
  Process.killProcess(Process.myPid());
418
500
  }
419
501
 
@@ -423,12 +505,38 @@ public class RhodesService {
423
505
  GeoLocation.isKnownPosition();
424
506
  needGeoLocationRestart = false;
425
507
  }
508
+ PerformOnUiThread.exec( new Runnable() {
509
+ public void run() {
510
+ if (wakeLockEnabled) {
511
+ if (wakeLockObject == null) {
512
+ PowerManager pm = (PowerManager)getInstance().getContext().getSystemService(Context.POWER_SERVICE);
513
+ if (pm != null) {
514
+ Logger.I(TAG, "activityStarted() restore wakeLock object");
515
+ wakeLockObject = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
516
+ wakeLockObject.acquire();
517
+ }
518
+ else {
519
+ Logger.E(TAG, "activityStarted() - Can not get PowerManager !!!");
520
+ }
521
+ }
522
+ }
523
+ }
524
+ }, false);
426
525
  callActivationCallback(true);
427
526
  }
428
527
  ++activitiesActive;
429
528
  }
430
529
 
431
530
  public void activityStopped() {
531
+ PerformOnUiThread.exec( new Runnable() {
532
+ public void run() {
533
+ if (wakeLockObject != null) {
534
+ Logger.I(TAG, "activityStopped() temporary destroy wakeLock object");
535
+ wakeLockObject.release();
536
+ wakeLockObject = null;
537
+ }
538
+ }
539
+ }, false);
432
540
  --activitiesActive;
433
541
  if (activitiesActive == 0) {
434
542
  needGeoLocationRestart = GeoLocation.isAvailable();
@@ -594,6 +702,39 @@ public class RhodesService {
594
702
  TimeZone tz = cal.getTimeZone();
595
703
  return tz.getDisplayName();
596
704
  }
705
+
706
+ public native void setPushRegistrationId(String id);
707
+
708
+ private native void callPushCallback(String data);
597
709
 
710
+ public void handlePushMessage(Intent intent) {
711
+ Logger.D(TAG, "Receive PUSH message");
712
+
713
+ Bundle extras = intent.getExtras();
714
+ if (extras == null) {
715
+ Logger.W(TAG, "Empty PUSH message received");
716
+ return;
717
+ }
718
+
719
+ StringBuilder builder = new StringBuilder();
720
+
721
+ Set<String> keys = extras.keySet();
722
+ for (String key : keys) {
723
+ Logger.D(TAG, "PUSH item: " + key);
724
+ Object value = extras.get(key);
725
+ if (builder.length() > 0)
726
+ builder.append("&");
727
+ builder.append(key);
728
+ builder.append("=");
729
+ if (value != null)
730
+ builder.append(value.toString());
731
+ }
732
+
733
+ String data = builder.toString();
734
+ Logger.D(TAG, "Received PUSH message: " + data);
735
+ callPushCallback(data);
736
+
737
+ // TODO: handle alers/sounds/vibrate events
738
+ }
598
739
 
599
740
  }