rhodes 2.1.0 → 2.2.0.beta.1

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 (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
@@ -0,0 +1,136 @@
1
+ package com.rhomobile.rhodes.bluetooth;
2
+
3
+ import android.app.Activity;
4
+ import android.bluetooth.BluetoothAdapter;
5
+ import android.bluetooth.BluetoothDevice;
6
+ import android.content.Intent;
7
+ import android.os.Handler;
8
+ import android.os.Looper;
9
+ import android.os.Message;
10
+ import android.util.Log;
11
+ import android.view.View;
12
+ import android.view.View.OnClickListener;
13
+ import android.widget.ArrayAdapter;
14
+ import android.widget.Button;
15
+ import android.widget.EditText;
16
+ import android.widget.ListView;
17
+ import android.widget.TextView;
18
+ import android.widget.Toast;
19
+ import com.rhomobile.rhodes.RhodesService;
20
+ import com.rhomobile.rhodes.util.PerformOnUiThread;
21
+
22
+
23
+ public class RhoBluetoothManagerOld implements IRhoBluetoothManager {
24
+
25
+ private static final String TAG = "RhoBluetoothManagerOld";
26
+ private static final boolean D = true;
27
+
28
+
29
+ public RhoBluetoothManagerOld () {
30
+ if(D) Log.d(TAG, "RhoBluetoothManagerOld()");
31
+ }
32
+
33
+ public void init(){
34
+ }
35
+
36
+ public void setDeviceName(String device_name) {
37
+ }
38
+
39
+
40
+ private void sendMessage(String message) {
41
+ }
42
+
43
+
44
+ private void setupSession() {
45
+ }
46
+
47
+
48
+ public void onSessionConnectedOK() {
49
+ }
50
+
51
+ public void onSessionDisconnected() {
52
+ }
53
+
54
+ public void onSessionReadMessage(byte[] buf, int bytes) {
55
+ }
56
+
57
+ public void onSessionConnectedDeviceName(String name) {
58
+ }
59
+
60
+ public void onSessionToast(String message) {
61
+ }
62
+
63
+
64
+ public static void onActivityResult(int requestCode, int resultCode, Intent data) {
65
+ }
66
+
67
+ public void onDeviceListActivityFinished( boolean is_ok, String adress) {
68
+ }
69
+
70
+ public void onActivityResultPrivate(int requestCode, int resultCode, Intent data) {
71
+ }
72
+
73
+
74
+ public RhoBluetoothSession getSession() {
75
+ return null;
76
+ }
77
+
78
+
79
+
80
+ public int is_bluetooth_available() {
81
+ return 0;
82
+ }
83
+
84
+ public void off_bluetooth() {
85
+ }
86
+
87
+ public void set_device_name(String device_name) {
88
+ }
89
+
90
+ public String get_device_name() {
91
+ return "";
92
+ }
93
+
94
+ public String get_last_error() {
95
+ return RhoBluetoothManager.BTC_ERROR;
96
+ }
97
+
98
+ public String create_session(String role, String callback_url) {
99
+ fireCreateSessionCallback(RhoBluetoothManager.BTC_ERROR, "");
100
+ return RhoBluetoothManager.BTC_ERROR;
101
+ }
102
+
103
+ public void fireCreateSessionCallback(String status, String connected_device_name) {
104
+ }
105
+
106
+
107
+ public void session_set_callback(String connected_device_name, String callback_url) {
108
+ }
109
+
110
+ public void fireSessionCallback(String connected_device_name, String event_type) {
111
+ }
112
+
113
+ public void session_disconnect(String connected_device_name) {
114
+ }
115
+
116
+ public int session_get_status(String connected_device_name) {
117
+ return -1;
118
+ }
119
+
120
+ public String session_read_string(String connected_device_name) {
121
+ return "";
122
+ }
123
+
124
+ public void session_write_string(String connected_device_name, String str) {
125
+ }
126
+
127
+ public int session_read_data(String connected_device_name, Byte[] buf, int max_length) {
128
+ return 0;
129
+ }
130
+
131
+ public void session_write_data(String connected_device_name, Byte[] buf, int length) {
132
+ }
133
+
134
+
135
+
136
+ }
@@ -0,0 +1,457 @@
1
+ package com.rhomobile.rhodes.bluetooth;
2
+
3
+ import java.io.IOException;
4
+ import java.io.InputStream;
5
+ import java.io.OutputStream;
6
+ import java.util.UUID;
7
+
8
+
9
+ import android.bluetooth.BluetoothAdapter;
10
+ import android.bluetooth.BluetoothDevice;
11
+ import android.bluetooth.BluetoothServerSocket;
12
+ import android.bluetooth.BluetoothSocket;
13
+ import android.content.Context;
14
+ import android.os.Bundle;
15
+ import android.os.Handler;
16
+ import android.os.Message;
17
+ import android.util.Log;
18
+
19
+
20
+
21
+ public class RhoBluetoothSession {
22
+
23
+ // events for listener
24
+ public static String BT_SESSION_INPUT_DATA_RECEIVED = "SESSION_INPUT_DATA_RECEIVED";
25
+ public static String BT_SESSION_DISCONNECT = "SESSION_DISCONNECT";
26
+
27
+
28
+ // Debugging
29
+ private static final String TAG = "RhoBluetoothSession";
30
+ private static final boolean D = true;
31
+
32
+ // Name for the SDP record when creating server socket
33
+ private static final String NAME = "btspp";
34
+
35
+ // Unique UUID for this application
36
+ private static final UUID MY_UUID = UUIDHelper.SERIAL_PORT_PROTOCOL_UUID;
37
+
38
+ // Member fields
39
+ private final BluetoothAdapter mAdapter;
40
+ private final Handler mHandler;
41
+ private AcceptThread mAcceptThread;
42
+ private ConnectThread mConnectThread;
43
+ private ConnectedThread mConnectedThread;
44
+ private int mState;
45
+
46
+ // Constants that indicate the current connection state
47
+ public static final int STATE_NONE = 0; // we're doing nothing
48
+ public static final int STATE_LISTEN = 1; // now listening for incoming connections
49
+ public static final int STATE_CONNECTING = 2; // now initiating an outgoing connection
50
+ public static final int STATE_CONNECTED = 3; // now connected to a remote device
51
+
52
+ private String mCallbackUrl;
53
+
54
+ /**
55
+ * Constructor. Prepares a new RhoBluetoothSession session.
56
+ * @param context The UI Activity Context
57
+ * @param handler A Handler to send messages back to the UI Activity
58
+ */
59
+ public RhoBluetoothSession(Context context, Handler handler) {
60
+ mAdapter = BluetoothAdapter.getDefaultAdapter();
61
+ mState = STATE_NONE;
62
+ mHandler = handler;
63
+ mCallbackUrl = null;
64
+ }
65
+
66
+ public void setCallbackURL(String url) {
67
+ mCallbackUrl = url;
68
+ }
69
+
70
+ public String getCallbackURL() {
71
+ return mCallbackUrl;
72
+ }
73
+
74
+ /**
75
+ * Set the current state of the chat connection
76
+ * @param state An integer defining the current connection state
77
+ */
78
+ private synchronized void setState(int state) {
79
+ if (D) Log.d(TAG, "setState() " + mState + " -> " + state);
80
+ mState = state;
81
+
82
+ // Give the new state to the Handler so the UI Activity can update
83
+ //mHandler.obtainMessage(RhoBluetoothManager.MESSAGE_STATE_CHANGE, state, -1).sendToTarget();
84
+ switch (mState) {
85
+ case RhoBluetoothSession.STATE_CONNECTED:
86
+ //fireCreateSessionCallback(BTC_OK, mConnectedDeviceName);
87
+ mCallbackUrl = null;
88
+ RhoBluetoothManager.sharedInstance().onSessionConnectedOK();
89
+ break;
90
+ case RhoBluetoothSession.STATE_LISTEN:
91
+ case RhoBluetoothSession.STATE_NONE:
92
+ //fireSessionCallback(mConnectedDeviceName, mSession.BT_SESSION_DISCONNECT);
93
+ mCallbackUrl = null;
94
+ RhoBluetoothManager.sharedInstance().onSessionDisconnected();
95
+ break;
96
+ }
97
+ }
98
+
99
+ /**
100
+ * Return the current connection state. */
101
+ public synchronized int getState() {
102
+ return mState;
103
+ }
104
+
105
+ /**
106
+ * Start the chat service. Specifically start AcceptThread to begin a
107
+ * session in listening (server) mode. Called by the Activity onResume() */
108
+ public synchronized void start() {
109
+ if (D) Log.d(TAG, "start");
110
+
111
+ // Cancel any thread attempting to make a connection
112
+ if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;}
113
+
114
+ // Cancel any thread currently running a connection
115
+ if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;}
116
+
117
+ // Start the thread to listen on a BluetoothServerSocket
118
+ if (mAcceptThread == null) {
119
+ mAcceptThread = new AcceptThread();
120
+ mAcceptThread.start();
121
+ }
122
+ setState(STATE_LISTEN);
123
+ }
124
+
125
+ /**
126
+ * Start the ConnectThread to initiate a connection to a remote device.
127
+ * @param device The BluetoothDevice to connect
128
+ */
129
+ public synchronized void connect(BluetoothDevice device) {
130
+ if (D) Log.d(TAG, "connect to: " + device);
131
+
132
+ // Cancel any thread attempting to make a connection
133
+ if (mState == STATE_CONNECTING) {
134
+ if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;}
135
+ }
136
+
137
+ // Cancel any thread currently running a connection
138
+ if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;}
139
+
140
+ // Start the thread to connect with the given device
141
+ mConnectThread = new ConnectThread(device);
142
+ mConnectThread.start();
143
+ setState(STATE_CONNECTING);
144
+ }
145
+
146
+ /**
147
+ * Start the ConnectedThread to begin managing a Bluetooth connection
148
+ * @param socket The BluetoothSocket on which the connection was made
149
+ * @param device The BluetoothDevice that has been connected
150
+ */
151
+ public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) {
152
+ if (D) Log.d(TAG, "connected");
153
+
154
+ // Cancel the thread that completed the connection
155
+ if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;}
156
+
157
+ // Cancel any thread currently running a connection
158
+ if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;}
159
+
160
+ // Cancel the accept thread because we only want to connect to one device
161
+ if (mAcceptThread != null) {mAcceptThread.cancel(); mAcceptThread = null;}
162
+
163
+ // Start the thread to manage the connection and perform transmissions
164
+ mConnectedThread = new ConnectedThread(socket);
165
+ mConnectedThread.start();
166
+
167
+ // Send the name of the connected device back to the UI Activity
168
+ //Message msg = mHandler.obtainMessage(RhoBluetoothManager.MESSAGE_DEVICE_NAME);
169
+ //Bundle bundle = new Bundle();
170
+ //bundle.putString(RhoBluetoothManager.sharedInstance().DEVICE_NAME, device.getName());
171
+ //msg.setData(bundle);
172
+ //mHandler.sendMessage(msg);
173
+ RhoBluetoothManager.sharedInstance().onSessionConnectedDeviceName(device.getName());
174
+
175
+
176
+ setState(STATE_CONNECTED);
177
+ }
178
+
179
+ /**
180
+ * Stop all threads
181
+ */
182
+ public synchronized void stop() {
183
+ if (D) Log.d(TAG, "stop");
184
+ if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;}
185
+ if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;}
186
+ if (mAcceptThread != null) {mAcceptThread.cancel(); mAcceptThread = null;}
187
+ setState(STATE_NONE);
188
+ }
189
+
190
+ /**
191
+ * Write to the ConnectedThread in an unsynchronized manner
192
+ * @param out The bytes to write
193
+ * @see ConnectedThread#write(byte[])
194
+ */
195
+ public void write(byte[] out) {
196
+ // Create temporary object
197
+ ConnectedThread r;
198
+ // Synchronize a copy of the ConnectedThread
199
+ synchronized (this) {
200
+ if (mState != STATE_CONNECTED) return;
201
+ r = mConnectedThread;
202
+ }
203
+ // Perform the write unsynchronized
204
+ r.write(out);
205
+ }
206
+
207
+ /**
208
+ * Indicate that the connection attempt failed and notify the UI Activity.
209
+ */
210
+ private void connectionFailed() {
211
+ if (D) Log.d(TAG, "connectionFailed()");
212
+ setState(STATE_LISTEN);
213
+
214
+ // Send a failure message back to the Activity
215
+ //Message msg = mHandler.obtainMessage(RhoBluetoothManager.MESSAGE_TOAST);
216
+ //Bundle bundle = new Bundle();
217
+ //bundle.putString(RhoBluetoothManager.TOAST, "Unable to connect device");
218
+ //msg.setData(bundle);
219
+ //mHandler.sendMessage(msg);
220
+ RhoBluetoothManager.sharedInstance().onSessionToast("Unable to connect device");
221
+ }
222
+
223
+ /**
224
+ * Indicate that the connection was lost and notify the UI Activity.
225
+ */
226
+ public void connectionLost() {
227
+ if (D) Log.d(TAG, "connectionLost()");
228
+ setState(STATE_LISTEN);
229
+
230
+ // Send a failure message back to the Activity
231
+ //Message msg = mHandler.obtainMessage(RhoBluetoothManager.MESSAGE_TOAST);
232
+ //Bundle bundle = new Bundle();
233
+ //bundle.putString(RhoBluetoothManager.TOAST, "Device connection was lost");
234
+ //msg.setData(bundle);
235
+ //mHandler.sendMessage(msg);
236
+ RhoBluetoothManager.sharedInstance().onSessionToast("Device connection was lost");
237
+ }
238
+
239
+ /**
240
+ * This thread runs while listening for incoming connections. It behaves
241
+ * like a server-side client. It runs until a connection is accepted
242
+ * (or until cancelled).
243
+ */
244
+ private class AcceptThread extends Thread {
245
+ // The local server socket
246
+ private final BluetoothServerSocket mmServerSocket;
247
+
248
+ public AcceptThread() {
249
+ BluetoothServerSocket tmp = null;
250
+
251
+ // Create a new listening server socket
252
+ try {
253
+ tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
254
+ } catch (IOException e) {
255
+ Log.e(TAG, "listen() failed", e);
256
+ }
257
+ mmServerSocket = tmp;
258
+ }
259
+
260
+ public void run() {
261
+ if (D) Log.d(TAG, "BEGIN mAcceptThread" + this);
262
+ setName("AcceptThread");
263
+ BluetoothSocket socket = null;
264
+
265
+ // Listen to the server socket if we're not connected
266
+ while (mState != STATE_CONNECTED) {
267
+ try {
268
+ // This is a blocking call and will only return on a
269
+ // successful connection or an exception
270
+ socket = mmServerSocket.accept();
271
+ } catch (IOException e) {
272
+ Log.e(TAG, "accept() failed", e);
273
+ break;
274
+ }
275
+
276
+ // If a connection was accepted
277
+ if (socket != null) {
278
+ synchronized (RhoBluetoothSession.this) {
279
+ switch (mState) {
280
+ case STATE_LISTEN:
281
+ case STATE_CONNECTING:
282
+ // Situation normal. Start the connected thread.
283
+ connected(socket, socket.getRemoteDevice());
284
+ break;
285
+ case STATE_NONE:
286
+ case STATE_CONNECTED:
287
+ // Either not ready or already connected. Terminate new socket.
288
+ try {
289
+ socket.close();
290
+ } catch (IOException e) {
291
+ Log.e(TAG, "Could not close unwanted socket", e);
292
+ }
293
+ break;
294
+ }
295
+ }
296
+ }
297
+ }
298
+ if (D) Log.i(TAG, "END mAcceptThread");
299
+ }
300
+
301
+ public void cancel() {
302
+ if (D) Log.d(TAG, "cancel " + this);
303
+ try {
304
+ mmServerSocket.close();
305
+ } catch (IOException e) {
306
+ Log.e(TAG, "close() of server failed", e);
307
+ }
308
+ }
309
+ }
310
+
311
+
312
+ /**
313
+ * This thread runs while attempting to make an outgoing connection
314
+ * with a device. It runs straight through; the connection either
315
+ * succeeds or fails.
316
+ */
317
+ private class ConnectThread extends Thread {
318
+ private final BluetoothSocket mmSocket;
319
+ private final BluetoothDevice mmDevice;
320
+
321
+ public ConnectThread(BluetoothDevice device) {
322
+ mmDevice = device;
323
+ BluetoothSocket tmp = null;
324
+
325
+ // Get a BluetoothSocket for a connection with the
326
+ // given BluetoothDevice
327
+ try {
328
+ tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
329
+ } catch (IOException e) {
330
+ Log.e(TAG, "create() failed", e);
331
+ }
332
+ mmSocket = tmp;
333
+ }
334
+
335
+ public void run() {
336
+ Log.i(TAG, "BEGIN mConnectThread");
337
+ setName("ConnectThread");
338
+
339
+ // Always cancel discovery because it will slow down a connection
340
+ mAdapter.cancelDiscovery();
341
+
342
+ // Make a connection to the BluetoothSocket
343
+ try {
344
+ // This is a blocking call and will only return on a
345
+ // successful connection or an exception
346
+ mmSocket.connect();
347
+ } catch (IOException e) {
348
+ connectionFailed();
349
+ // Close the socket
350
+ try {
351
+ mmSocket.close();
352
+ } catch (IOException e2) {
353
+ Log.e(TAG, "unable to close() socket during connection failure", e2);
354
+ }
355
+ // Start the service over to restart listening mode
356
+ RhoBluetoothSession.this.start();
357
+ return;
358
+ }
359
+
360
+ // Reset the ConnectThread because we're done
361
+ synchronized (RhoBluetoothSession.this) {
362
+ mConnectThread = null;
363
+ }
364
+
365
+ // Start the connected thread
366
+ connected(mmSocket, mmDevice);
367
+ }
368
+
369
+ public void cancel() {
370
+ try {
371
+ mmSocket.close();
372
+ } catch (IOException e) {
373
+ Log.e(TAG, "close() of connect socket failed", e);
374
+ }
375
+ }
376
+ }
377
+
378
+ /**
379
+ * This thread runs during a connection with a remote device.
380
+ * It handles all incoming and outgoing transmissions.
381
+ */
382
+ private class ConnectedThread extends Thread {
383
+ private final BluetoothSocket mmSocket;
384
+ private final InputStream mmInStream;
385
+ private final OutputStream mmOutStream;
386
+
387
+ public ConnectedThread(BluetoothSocket socket) {
388
+ Log.d(TAG, "create ConnectedThread");
389
+ mmSocket = socket;
390
+ InputStream tmpIn = null;
391
+ OutputStream tmpOut = null;
392
+
393
+ // Get the BluetoothSocket input and output streams
394
+ try {
395
+ tmpIn = socket.getInputStream();
396
+ tmpOut = socket.getOutputStream();
397
+ } catch (IOException e) {
398
+ Log.e(TAG, "temp sockets not created", e);
399
+ }
400
+
401
+ mmInStream = tmpIn;
402
+ mmOutStream = tmpOut;
403
+ }
404
+
405
+ public void run() {
406
+ Log.i(TAG, "BEGIN mConnectedThread");
407
+ byte[] buffer = new byte[1024];
408
+ int bytes;
409
+
410
+ // Keep listening to the InputStream while connected
411
+ while (true) {
412
+ try {
413
+ // Read from the InputStream
414
+ bytes = mmInStream.read(buffer);
415
+
416
+ // Send the obtained bytes to the UI Activity
417
+ //mHandler.obtainMessage(RhoBluetoothManager.MESSAGE_READ, bytes, -1, buffer)
418
+ // .sendToTarget();
419
+ byte[] buf_for_send = buffer.clone();
420
+ RhoBluetoothManager.sharedInstance().onSessionReadMessage(buf_for_send, bytes);
421
+ } catch (IOException e) {
422
+ Log.e(TAG, "disconnected", e);
423
+ connectionLost();
424
+ break;
425
+ }
426
+ }
427
+ }
428
+
429
+ /**
430
+ * Write to the connected OutStream.
431
+ * @param buffer The bytes to write
432
+ */
433
+ public void write(byte[] buffer) {
434
+ try {
435
+ mmOutStream.write(buffer);
436
+
437
+ // Share the sent message back to the UI Activity
438
+ //mHandler.obtainMessage(RhoBluetoothManager.MESSAGE_WRITE, -1, -1, buffer)
439
+ // .sendToTarget();
440
+ } catch (IOException e) {
441
+ Log.e(TAG, "Exception during write", e);
442
+ }
443
+ }
444
+
445
+ public void cancel() {
446
+ try {
447
+ mmSocket.close();
448
+ } catch (IOException e) {
449
+ Log.e(TAG, "close() of connect socket failed", e);
450
+ }
451
+ }
452
+ }
453
+
454
+
455
+
456
+
457
+ }