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,71 @@
1
+ package com.rhomobile.rhodes.bluetooth;
2
+
3
+
4
+ import java.util.UUID;
5
+
6
+ public class UUIDHelper {
7
+
8
+ /** SDP 0x0001 16-bit */
9
+ public static final UUID SDP_PROTOCOL_UUID = fromUUID16(0x0001);
10
+
11
+ /** RFCOMM 0x0003 16-bit */
12
+ public static final UUID RFCOMM_PROTOCOL_UUID = fromUUID16(0x0003);
13
+
14
+ /** OBEX 0x0008 16-bit */
15
+ public static final UUID OBEX_PROTOCOL_UUID = fromUUID16(0x0008);
16
+
17
+ /** HTTP 0x000C 16-bit */
18
+ public static final UUID HTTP_PROTOCOL_UUID = fromUUID16(0x000C);
19
+
20
+ /** L2CAP 0x0100 16-bit */
21
+ public static final UUID L2CAP_PROTOCOL_UUID = fromUUID16(0x0100);
22
+
23
+ /** BNEP 0x000F 16-bit */
24
+ public static final UUID BNEP_PROTOCOL_UUID = fromUUID16(0x000F);
25
+
26
+ /** Serial Port 0x1101 16-bit */
27
+ public static final UUID SERIAL_PORT_PROTOCOL_UUID = fromUUID16(0x1101);
28
+
29
+ /** OBEX Object Push Profile 0x1105 16-bit */
30
+ public static final UUID OBEX_OBJECT_PUSH_PROTOCOL_UUID = fromUUID16(0x1105);
31
+
32
+ /** OBEX File Transfer Profile 0x1106 16-bit */
33
+ public static final UUID OBEX_FILE_TRANSFER_PROTOCOL_UUID = fromUUID16(0x1106);
34
+
35
+ /** Personal Area Networking User 0x1115 16-bit */
36
+ public static final UUID PERSONAL_AREA_NETWORKING_PROTOCOL_UUID = fromUUID16(0x1115);
37
+
38
+ private static final String UUID_BASE = "0000-1000-8000-00805F9B34FB";
39
+
40
+ private static final int MASK_UUID16 = 0x0000FFFF;
41
+
42
+ private static final int MASK_UUID128 = 0x0000FFFF;
43
+
44
+ public static final UUID fromUUID16(int uuid16) {
45
+
46
+ String s = uuidStringFromUuid16(uuid16);
47
+ UUID uuid = UUID.fromString(s);
48
+
49
+ return uuid;
50
+ }
51
+
52
+ public static final int toUUID16(UUID uuid128) {
53
+
54
+ long bits = uuid128.getMostSignificantBits();
55
+
56
+ return (int) ((bits >> 32) & MASK_UUID128);
57
+ }
58
+
59
+ private static final String uuidStringFromUuid16(int uuid16) {
60
+
61
+ StringBuilder b = new StringBuilder();
62
+ String hex = Integer.toHexString(uuid16 & MASK_UUID16);
63
+ b.append("00000000".substring(hex.length()));
64
+ b.append(hex);
65
+ b.append('-');
66
+ b.append(UUID_BASE);
67
+
68
+ return b.toString();
69
+ }
70
+
71
+ }
@@ -93,7 +93,6 @@ public class ImageCapture extends RhoActivity implements SurfaceHolder.Callback,
93
93
  public void onPictureTaken(byte[] data, Camera c) {
94
94
  Logger.D(TAG, "PICTURE CALLBACK RAW");
95
95
  camera.startPreview();
96
- startAutoFocusIfExist();
97
96
  }
98
97
  };
99
98
 
@@ -107,7 +106,8 @@ public class ImageCapture extends RhoActivity implements SurfaceHolder.Callback,
107
106
  switch (keyCode) {
108
107
  case KeyEvent.KEYCODE_DPAD_CENTER:
109
108
  case KeyEvent.KEYCODE_CAMERA:
110
- takePicture();
109
+ takePictureWithAutofocus();
110
+ cameraButton.setVisibility(View.INVISIBLE);
111
111
  return true;
112
112
  case KeyEvent.KEYCODE_BACK:
113
113
  return super.onKeyDown(keyCode, event);
@@ -148,7 +148,6 @@ public class ImageCapture extends RhoActivity implements SurfaceHolder.Callback,
148
148
  camera.setParameters(p);
149
149
  camera.setPreviewDisplay(holder);
150
150
  camera.startPreview();
151
- startAutoFocusIfExist();
152
151
  isPreviewRunning = true;
153
152
  } catch (Exception e) {
154
153
  Logger.E(TAG, e.getMessage());
@@ -165,11 +164,16 @@ public class ImageCapture extends RhoActivity implements SurfaceHolder.Callback,
165
164
 
166
165
  public void onClick(View v) {
167
166
  if (v.getId() == AndroidR.id.cameraButton) {
168
- takePicture();
167
+ takePictureWithAutofocus();
169
168
  cameraButton.setVisibility(View.INVISIBLE);
170
169
 
171
170
  }
172
171
  }
172
+
173
+ private void takePictureWithAutofocus() {
174
+ startAutoFocus();
175
+ }
176
+
173
177
 
174
178
  private void takePicture() {
175
179
  if (!mIsActive) {
@@ -199,14 +203,15 @@ public class ImageCapture extends RhoActivity implements SurfaceHolder.Callback,
199
203
  mIsActive = false;
200
204
  }
201
205
 
202
- private void startAutoFocusIfExist() {
206
+ private void startAutoFocus() {
203
207
  //this only from API v.5 and higher
204
208
  //String focus_mode = camera.getParameters().getFocusMode();
205
209
  //if ((focus_mode != Camera.Parameters.FOCUS_MODE_FIXED) && (focus_mode != Camera.Parameters.FOCUS_MODE_INFINITY)) {
206
- camera.autoFocus(this);
210
+ camera.autoFocus(this);
207
211
  //}
208
- }
212
+ }
209
213
 
210
214
  public void onAutoFocus (boolean success, Camera camera) {
215
+ takePicture();
211
216
  }
212
217
  }
@@ -0,0 +1,19 @@
1
+ package com.rhomobile.rhodes.event;
2
+
3
+ import java.util.Date;
4
+
5
+ public class Event {
6
+
7
+ public Event(String eid) {
8
+ id = eid;
9
+ }
10
+
11
+ public String id;
12
+ public String title;
13
+ public Date startDate;
14
+ public Date endDate;
15
+ public Date lastModified;
16
+ public String location;
17
+ public String notes;
18
+ public String privacy;
19
+ }
@@ -0,0 +1,261 @@
1
+ package com.rhomobile.rhodes.event;
2
+
3
+ import java.util.Date;
4
+ import java.util.Vector;
5
+
6
+ import android.database.Cursor;
7
+ import android.content.ContentResolver;
8
+ import android.content.ContentUris;
9
+ import android.content.ContentValues;
10
+ import android.net.Uri;
11
+ import android.os.Build;
12
+
13
+ import com.rhomobile.rhodes.Capabilities;
14
+ import com.rhomobile.rhodes.Logger;
15
+ import com.rhomobile.rhodes.RhodesService;
16
+
17
+ public class EventStore {
18
+
19
+ private static final String TAG = "EventStore";
20
+
21
+ private static final String AUTHORITY = Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO ? "com.android.calendar" : "calendar";
22
+ private static final Uri EVENTS_URI = Uri.parse("content://" + AUTHORITY + "/events");
23
+
24
+ private static final String EVENTS_TITLE = "title";
25
+ private static final String EVENTS_START_DATE = "dtstart";
26
+ private static final String EVENTS_END_DATE = "dtend";
27
+ private static final String EVENTS_LOCATION = "eventLocation";
28
+ private static final String EVENTS_NOTES = "description";
29
+ private static final String EVENTS_PRIVACY = "visibility";
30
+
31
+ private static void reportFail(String name, Exception e) {
32
+ Logger.E(TAG, "Call of \"" + name + "\" failed: " + e.getMessage());
33
+ e.printStackTrace();
34
+ }
35
+
36
+ private static String dateToString(Date date) {
37
+ return String.format("%04d-%02d-%02d %02d:%02d:%02d",
38
+ date.getYear() + 1900, date.getMonth() + 1, date.getDate(),
39
+ date.getHours(), date.getMinutes(), date.getSeconds());
40
+ }
41
+
42
+ private static void checkCapabilities() throws IllegalAccessException {
43
+ if (!Capabilities.CALENDAR_ENABLED)
44
+ throw new IllegalAccessException("Capability CALENDAR disabled");
45
+ }
46
+
47
+ private static ContentResolver getContentResolver() {
48
+ return RhodesService.getInstance().getContext().getContentResolver();
49
+ }
50
+
51
+ private static long getDefaultCalendarId() {
52
+ final Cursor calendarCursor = getContentResolver().query(
53
+ Uri.parse("content://" + AUTHORITY + "/calendars"),
54
+ new String[] {"_id"},
55
+ null, null, null);
56
+ try {
57
+ if (!calendarCursor.moveToFirst())
58
+ throw new RuntimeException("No calendars found!");
59
+ long id = calendarCursor.getLong(0);
60
+ return id;
61
+ }
62
+ finally {
63
+ calendarCursor.close();
64
+ }
65
+ }
66
+
67
+ public static Object fetch(Date startDate, Date endDate, boolean includeRepeating) {
68
+ try {
69
+ checkCapabilities();
70
+
71
+ Logger.D(TAG, "fetch(start, end), start: " + dateToString(startDate) + ", end: " + dateToString(endDate));
72
+
73
+ Vector<Event> ret = new Vector<Event>();
74
+
75
+ ContentResolver r = getContentResolver();
76
+
77
+ Cursor eventCursor;
78
+ if (includeRepeating) {
79
+ Uri.Builder builder = Uri.parse("content://" + AUTHORITY + "/instances/when").buildUpon();
80
+ ContentUris.appendId(builder, startDate.getTime());
81
+ ContentUris.appendId(builder, endDate.getTime());
82
+
83
+ eventCursor = r.query(builder.build(),
84
+ new String[] {"event_id", EVENTS_TITLE, "begin", "end", EVENTS_LOCATION,
85
+ EVENTS_NOTES, EVENTS_PRIVACY},
86
+ null, //"Calendars._id=" + id,
87
+ null, "startDay ASC, startMinute ASC");
88
+ }
89
+ else {
90
+ String where = String.format("(%s >= ? and %s <= ?) or (%s >= ? and %s <= ?)",
91
+ EVENTS_START_DATE, EVENTS_START_DATE, EVENTS_END_DATE, EVENTS_END_DATE);
92
+ String start = Long.toString(startDate.getTime());
93
+ String end = Long.toString(endDate.getTime());
94
+ eventCursor = r.query(EVENTS_URI,
95
+ new String[] {"_id", EVENTS_TITLE, EVENTS_START_DATE, EVENTS_END_DATE,
96
+ EVENTS_LOCATION, EVENTS_NOTES, EVENTS_PRIVACY},
97
+ where, new String[] {start, end, start, end},
98
+ null);
99
+ }
100
+ if (eventCursor == null)
101
+ throw new RuntimeException("Calendar provider not found");
102
+ try {
103
+ while (eventCursor.moveToNext()) {
104
+ String eid = eventCursor.getString(0);
105
+ Event event = new Event(eid);
106
+
107
+ event.title = eventCursor.getString(1);
108
+ event.startDate = new Date(eventCursor.getLong(2));
109
+ event.endDate = new Date(eventCursor.getLong(3));
110
+ event.location = eventCursor.getString(4);
111
+ event.notes = eventCursor.getString(5);
112
+ switch (eventCursor.getInt(6)) {
113
+ case 1: event.privacy = "confidential"; break;
114
+ case 2: event.privacy = "private"; break;
115
+ case 3: event.privacy = "public"; break;
116
+ }
117
+
118
+ Logger.D(TAG, "Event: id: " + event.id +
119
+ ", title: " + event.title +
120
+ ", begin: " + dateToString(event.startDate) +
121
+ ", end: " + dateToString(event.endDate));
122
+
123
+ ret.add(event);
124
+ }
125
+ }
126
+ finally {
127
+ eventCursor.close();
128
+ }
129
+
130
+ return ret;
131
+ }
132
+ catch (Exception e) {
133
+ reportFail("fetch(start, end)", e);
134
+ String error = e.getMessage();
135
+ return error == null ? "unknown" : error;
136
+ }
137
+ }
138
+
139
+ public static Object fetch(String id) {
140
+ try {
141
+ checkCapabilities();
142
+
143
+ Logger.D(TAG, "fetch(id)");
144
+
145
+ ContentResolver r = getContentResolver();
146
+
147
+ Uri uri = ContentUris.withAppendedId(EVENTS_URI, Long.parseLong(id));
148
+ final Cursor eventCursor = r.query(uri,
149
+ new String[] {EVENTS_TITLE, EVENTS_START_DATE, EVENTS_END_DATE,
150
+ EVENTS_LOCATION, EVENTS_NOTES, EVENTS_PRIVACY},
151
+ null, null, null);
152
+ if (eventCursor == null)
153
+ throw new RuntimeException("Calendar provider not found");
154
+
155
+ try {
156
+ if (!eventCursor.moveToFirst()) {
157
+ Logger.D(TAG, "fetch(id): result set is empty");
158
+ return null;
159
+ }
160
+ Event event = new Event(id);
161
+ event.title = eventCursor.getString(0);
162
+ event.startDate = new Date(eventCursor.getLong(1));
163
+ event.endDate = new Date(eventCursor.getLong(2));
164
+ event.location = eventCursor.getString(3);
165
+ event.notes = eventCursor.getString(4);
166
+ switch (eventCursor.getInt(5)) {
167
+ case 1: event.privacy = "confidential"; break;
168
+ case 2: event.privacy = "private"; break;
169
+ case 3: event.privacy = "public"; break;
170
+ }
171
+
172
+ Logger.D(TAG, "Event: id: " + event.id +
173
+ ", title: " + event.title +
174
+ ", begin: " + dateToString(event.startDate) +
175
+ ", end: " + dateToString(event.endDate));
176
+
177
+ return event;
178
+ }
179
+ finally {
180
+ eventCursor.close();
181
+ }
182
+ }
183
+ catch (Exception e) {
184
+ reportFail("fetch(id)", e);
185
+ String error = e.getMessage();
186
+ return error == null ? "unknown" : error;
187
+ }
188
+ }
189
+
190
+ public static String save(Event event) {
191
+ try {
192
+ checkCapabilities();
193
+
194
+ Logger.D(TAG, "save(event)");
195
+
196
+ ContentValues values = new ContentValues();
197
+ values.put(EVENTS_TITLE, event.title);
198
+ values.put(EVENTS_START_DATE, event.startDate.getTime());
199
+ values.put(EVENTS_END_DATE, event.endDate.getTime());
200
+ if (event.location != null)
201
+ values.put(EVENTS_LOCATION, event.location);
202
+ if (event.notes != null)
203
+ values.put(EVENTS_NOTES, event.notes);
204
+ if (event.privacy != null)
205
+ {
206
+ int privacy = 0;
207
+ if (event.privacy.equalsIgnoreCase("confidential"))
208
+ privacy = 1;
209
+ else if (event.privacy.equalsIgnoreCase("private"))
210
+ privacy = 2;
211
+ else if (event.privacy.equalsIgnoreCase("public"))
212
+ privacy = 3;
213
+ values.put(EVENTS_PRIVACY, privacy);
214
+ }
215
+
216
+ long calendarId = getDefaultCalendarId();
217
+ values.put("calendar_id", calendarId);
218
+
219
+ ContentResolver r = getContentResolver();
220
+
221
+ if (event.id == null || event.id.equalsIgnoreCase("")) {
222
+ Logger.D(TAG, "Insert new event...");
223
+ Uri euri = r.insert(EVENTS_URI, values);
224
+ event.id = Long.toString(ContentUris.parseId(euri));
225
+ Logger.D(TAG, "Event id of event is " + event.id);
226
+ }
227
+ else {
228
+ Logger.D(TAG, "Update event...");
229
+ Uri uri = ContentUris.withAppendedId(EVENTS_URI, Long.parseLong(event.id));
230
+ r.update(uri, values, null, null);
231
+ Logger.D(TAG, "Event updated");
232
+ }
233
+
234
+ return null;
235
+ }
236
+ catch (Exception e) {
237
+ reportFail("save", e);
238
+ String error = e.getMessage();
239
+ return error == null ? "unknown" : error;
240
+ }
241
+ }
242
+
243
+ public static String delete(String id) {
244
+ try {
245
+ checkCapabilities();
246
+
247
+ Logger.D(TAG, "delete(id)");
248
+
249
+ int rows = getContentResolver().delete(EVENTS_URI, "_id=?", new String[] {id});
250
+ Logger.D(TAG, String.format("%d rows deleted", rows));
251
+
252
+ return null;
253
+ }
254
+ catch (Exception e) {
255
+ reportFail("delete", e);
256
+ String error = e.getMessage();
257
+ return error == null ? "unknown" : error;
258
+ }
259
+ }
260
+
261
+ }
@@ -291,15 +291,17 @@ public class SimpleMainView implements MainView {
291
291
  group = new LinearLayout(ctx);
292
292
  group.setGravity(gravity);
293
293
  group.setOrientation(LinearLayout.HORIZONTAL);
294
- group.setLayoutParams(new LinearLayout.LayoutParams(FILL_PARENT, FILL_PARENT, 1));
294
+ group.setLayoutParams(new LinearLayout.LayoutParams(WRAP_CONTENT, FILL_PARENT, 1));
295
295
  bottom.addView(group);
296
296
  }
297
297
  group.addView(button);
298
298
  }
299
299
 
300
300
  // Last group should have gravity RIGHT
301
- if (group != null)
301
+ if (group != null) {
302
302
  group.setGravity(Gravity.RIGHT);
303
+ bottom.requestLayout();
304
+ }
303
305
  }
304
306
 
305
307
  webView.requestFocus();
@@ -131,7 +131,7 @@ public class TabbedMainView implements MainView {
131
131
  tabIndex = Integer.parseInt(tabId);
132
132
  TabData data = tabData.elementAt(tabIndex);
133
133
  if (data.reload || !data.loaded) {
134
- getView(tabIndex).navigate(data.url, tabIndex);
134
+ RhodesService.loadUrl(data.url);
135
135
  data.loaded = true;
136
136
  }
137
137
  }
@@ -162,7 +162,7 @@ public class TabbedMainView implements MainView {
162
162
  throw new IllegalArgumentException("'action' should be String");
163
163
 
164
164
  String label = (String)labelObj;
165
- String action = r.normalizeUrl((String)actionObj);
165
+ String action = (String)actionObj;
166
166
  String icon = null;
167
167
  boolean reload = false;
168
168