rhodes 3.3.2 → 3.3.3.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 (51) hide show
  1. data/CHANGELOG +3 -0
  2. data/Manifest.txt +4 -0
  3. data/Rakefile +2 -2
  4. data/doc/device-caps.txt +2 -2
  5. data/doc/rhodes-api.txt +0 -3
  6. data/installer/rhostudio-moto.nsi +14 -48
  7. data/installer/rhostudio.nsi +12 -12
  8. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesApplication.java +167 -46
  9. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesService.java +1 -1
  10. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SplashScreen.java +15 -15
  11. data/platform/android/build/android.rake +36 -24
  12. data/platform/iphone/Classes/MapView/GoogleGeocoder.h +2 -1
  13. data/platform/iphone/Classes/MapView/GoogleGeocoder.m +44 -6
  14. data/platform/iphone/Classes/MapView/MapViewController.m +10 -1
  15. data/platform/shared/common/ExtManager.cpp +103 -0
  16. data/platform/shared/common/ExtManager.h +101 -0
  17. data/platform/shared/common/RhodesApp.cpp +3 -2
  18. data/platform/shared/common/RhodesApp.h +3 -0
  19. data/platform/shared/common/map/GeocodingMapEngine.cpp +24 -1
  20. data/platform/shared/common/map/GeocodingMapEngine.h +3 -0
  21. data/platform/shared/logging/RhoLogConf.cpp +2 -1
  22. data/platform/shared/net/HttpServer.cpp +1 -1
  23. data/platform/shared/ruby/ext/rho/rhoruby.c +6 -0
  24. data/platform/wm/RhoLib/RhoLib.vcproj +8 -0
  25. data/platform/wm/rhodes/DateTimePicker.cpp +38 -8
  26. data/platform/wm/rhodes/DateTimePicker.h +4 -0
  27. data/platform/wm/rhodes/LogOptionsDlg.cpp +16 -0
  28. data/platform/wm/rhodes/LogOptionsDlg.h +3 -2
  29. data/platform/wm/rhodes/LogView.cpp +21 -1
  30. data/platform/wm/rhodes/LogView.h +3 -1
  31. data/platform/wm/rhodes/MainWindow.cpp +1 -2
  32. data/platform/wm/rhodes/MapView/MapViewManager.cpp +16 -2
  33. data/platform/wm/rhodes/MapView/MapViewManager.h +2 -0
  34. data/platform/wm/rhodes/Rhodes.cpp +2 -1
  35. data/platform/wm/rhodes/Rhodes.rc +7 -6
  36. data/platform/wm/rhodes/rho/rubyext/RhoSignature.cpp +303 -147
  37. data/platform/wm/rhodes/rho/rubyext/RhoSignature.h +22 -16
  38. data/platform/wm/rhoelements.sln +3 -3
  39. data/platform/wp7/RhoRubyLib/common/RhoFile.cs +16 -0
  40. data/platform/wp7/RhoRubyLib/net/HttpServer.cs +5 -5
  41. data/platform/wp7/RhoRubyLib/views/RhoView.xaml +1 -1
  42. data/platform/wp7/RhoRubyLib/views/RhoView.xaml.cs +36 -3
  43. data/rakefile.rb +2 -2
  44. data/res/generators/rhogen.rb +5 -0
  45. data/res/generators/templates/application/app/layout.erb +6 -2
  46. data/res/generators/templates/application/public/js/jquery-wp7-patch.js +149 -0
  47. data/res/generators/templates/extension/extensions/montana/ext/montana/platform/wm/Montana.sln +29 -7
  48. data/res/generators/templates/extension/extensions/montana/ext/montana/platform/wm/Montana.vcproj +316 -0
  49. data/res/generators/templates/extension/extensions/montana/ext/montana/platform/wm/montana.vsprops +15 -0
  50. data/version +1 -1
  51. metadata +11 -5
data/CHANGELOG CHANGED
@@ -1,3 +1,6 @@
1
+ ## 3.3.3
2
+ * Fix Windows Mobile issues
3
+
1
4
  ## 3.3.2
2
5
  * iPhone: fix AppStore sumbit issue. Now all files stored in Private Documents, only database and user files in Documents
3
6
  * Fix issues with Ruby 1.9.2 on Mac
data/Manifest.txt CHANGED
@@ -2117,6 +2117,8 @@ platform/shared/common/AppMenu.h
2117
2117
  platform/shared/common/AutoPointer.h
2118
2118
  platform/shared/common/BundleManager.cpp
2119
2119
  platform/shared/common/emml.h
2120
+ platform/shared/common/ExtManager.cpp
2121
+ platform/shared/common/ExtManager.h
2120
2122
  platform/shared/common/InputStream.h
2121
2123
  platform/shared/common/iphone/RhoClassFactory.cpp
2122
2124
  platform/shared/common/iphone/RhoClassfactory.h
@@ -4783,6 +4785,7 @@ res/generators/templates/application/public/jquery/jquery-1.6.4.js
4783
4785
  res/generators/templates/application/public/jquery/jquery-1.6.4.min.js
4784
4786
  res/generators/templates/application/public/js/application.js
4785
4787
  res/generators/templates/application/public/js/jqmobile-patch.js
4788
+ res/generators/templates/application/public/js/jquery-wp7-patch.js
4786
4789
  res/generators/templates/application/public/js/rho.js
4787
4790
  res/generators/templates/application/public/js/rhogeolocation-wm.js
4788
4791
  res/generators/templates/application/public/js/rhogeolocation.js
@@ -4809,6 +4812,7 @@ res/generators/templates/extension/extensions/montana/ext/montana/platform/iphon
4809
4812
  res/generators/templates/extension/extensions/montana/ext/montana/platform/iphone/Rakefile
4810
4813
  res/generators/templates/extension/extensions/montana/ext/montana/platform/wm/Montana.sln
4811
4814
  res/generators/templates/extension/extensions/montana/ext/montana/platform/wm/Montana.vcproj
4815
+ res/generators/templates/extension/extensions/montana/ext/montana/platform/wm/montana.vsprops
4812
4816
  res/generators/templates/extension/extensions/montana/ext/montana/platform/wm/Rakefile
4813
4817
  res/generators/templates/extension/extensions/montana/ext/montana/platform/wm/src/montana_wm.cpp
4814
4818
  res/generators/templates/extension/extensions/montana/ext/montana/platform/wm/src/montana_wm.h
data/Rakefile CHANGED
@@ -274,8 +274,8 @@ namespace "config" do
274
274
  $app_config["capabilities"] += ["barcode"] if $app_config["extensions"].index("barcode-moto")
275
275
  end
276
276
 
277
- puts "$app_config['extensions'] : #{$app_config['extensions']}"
278
- puts "$app_config['capabilities'] : #{$app_config['capabilities']}"
277
+ puts "$app_config['extensions'] : #{$app_config['extensions'].inspect}"
278
+ puts "$app_config['capabilities'] : #{$app_config['capabilities'].inspect}"
279
279
 
280
280
  $hidden_app = $app_config["hidden_app"].nil?() ? "0" : $app_config["hidden_app"]
281
281
 
data/doc/device-caps.txt CHANGED
@@ -717,7 +717,7 @@ Get a list of scanners present on the device. Return array of hashes ('name','id
717
717
  Enables the scanner. barcode_callback get the same parameters as Barcode.take_barcode:
718
718
 
719
719
  :::ruby
720
- Barcode.enable(url_for(:action => :barcode_callback), {:name=>name_from_enumerate})
720
+ Barcode.enable(url_for(:action => :barcode_callback), {:id=>id_from_enumerate})
721
721
 
722
722
  Callback parameters:
723
723
 
@@ -742,7 +742,7 @@ Performs a soft trigger stop
742
742
  Enables the scanner and start scanner. Before callback is called scanner is disabled:
743
743
 
744
744
  :::ruby
745
- Barcode.take_barcode(url_for(:action => :barcode_callback), {:name=>name_from_enumerate})
745
+ Barcode.take_barcode(url_for(:action => :barcode_callback), {:id=>id_from_enumerate})
746
746
 
747
747
  THe callback uses these parameters.
748
748
 
data/doc/rhodes-api.txt CHANGED
@@ -52,13 +52,10 @@ The [BluetoothSession Class](/rhodes/device-caps#bluetooth) controls the session
52
52
 
53
53
  The [NFC Classes](/rhodes/nfc) provide access to Near Field Communication functionality, which is currently only supported on Android.
54
54
 
55
- ZZZ Filled in
56
55
  The [RingtoneManager Class](/rhodes/ringtonemanager-api) allows you to view and play a device's ringtones.
57
56
 
58
- ZZZZ Filled in
59
57
  The [Alert Class](/rhodes/alert-api) lets you call system alert methods for popup, vibrate, or playing audio files.
60
58
 
61
- ZZZZ Filled in
62
59
  The [Timer Class](/rhodes/timer-api) lets the device use a timer.
63
60
 
64
61
  The [MapView Class](/rhodes/device-caps#mapview) provides an embeddable map interface with the create method and various settings and annotations depending on the map provider (such as Google).
@@ -81,11 +81,11 @@ section
81
81
  createShortCut "$SMPROGRAMS\RhoStudio\RhoStudio.lnk" "$INSTDIR\eclipse\RhoStudio.exe"
82
82
 
83
83
  # added information in 'unistall programs' in contorol panel
84
- WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RhoStudio" \
84
+ WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\RhoStudio" \
85
85
  "DisplayName" "RhoStudio - RAD tool for develop and debug rhodes/rhoconnect applications"
86
- WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RhoStudio" \
86
+ WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\RhoStudio" \
87
87
  "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
88
- WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RhoStudio" \
88
+ WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\RhoStudio" \
89
89
  "DisplayIcon" "$\"$INSTDIR\uninstall.exe$\""
90
90
 
91
91
  Goto okFinishSection
@@ -114,27 +114,27 @@ section "uninstall"
114
114
  # remove env vars
115
115
  Push "PATH"
116
116
  Push "R"
117
- Push "HKLM"
117
+ Push "HKCU"
118
118
  Push "$INSTDIR\ruby\bin"
119
119
  Call un.EnvVarUpdate
120
120
  Pop $R0
121
121
 
122
122
  Push "PATH"
123
123
  Push "R"
124
- Push "HKLM"
124
+ Push "HKCU"
125
125
  Push "$INSTDIR\make-3.81\bin"
126
126
  Call un.EnvVarUpdate
127
127
  Pop $R0
128
128
 
129
129
  Push "PATH"
130
130
  Push "R"
131
- Push "HKLM"
131
+ Push "HKCU"
132
132
  Push "$INSTDIR\redis-2.4.0"
133
133
  Call un.EnvVarUpdate
134
134
  Pop $R0
135
135
 
136
- DeleteRegValue HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" REDIS_HOME
137
- DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RhoStudio"
136
+ DeleteRegValue HKCU "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" REDIS_HOME
137
+ DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\RhoStudio"
138
138
 
139
139
  # remove $INSTDIR
140
140
  RMDir /r /REBOOTOK $INSTDIR
@@ -150,7 +150,7 @@ Section "GNU Make" gnumakeSection
150
150
 
151
151
  Push "PATH"
152
152
  Push "P"
153
- Push "HKLM"
153
+ Push "HKCU"
154
154
  Push "$INSTDIR\make-3.81\bin"
155
155
  Call EnvVarUpdate
156
156
  Pop $R0
@@ -181,14 +181,14 @@ Section "DevKit" devkitSection
181
181
 
182
182
  Push "PATH"
183
183
  Push "P"
184
- Push "HKLM"
184
+ Push "HKCU"
185
185
  Push "$INSTDIR\devkit\mingw\bin"
186
186
  Call EnvVarUpdate
187
187
  Pop $R0
188
188
 
189
189
  Push "PATH"
190
190
  Push "P"
191
- Push "HKLM"
191
+ Push "HKCU"
192
192
  Push "$INSTDIR\devkit\bin"
193
193
  Call EnvVarUpdate
194
194
  Pop $R0
@@ -201,7 +201,6 @@ Section "Ruby, Rubygems, Rhodes, Rhoconnect and adapters" rubySection
201
201
 
202
202
  File /r "ruby"
203
203
  File /r "make-3.81"
204
- #File /r "rhosync"
205
204
  File "README.html"
206
205
  File "RHOSTUDIO-LICENSE.txt"
207
206
 
@@ -209,7 +208,7 @@ Section "Ruby, Rubygems, Rhodes, Rhoconnect and adapters" rubySection
209
208
 
210
209
  Push "PATH"
211
210
  Push "P"
212
- Push "HKLM"
211
+ Push "HKCU"
213
212
  Push "$INSTDIR\ruby\bin"
214
213
  Call EnvVarUpdate
215
214
  Pop $R0
@@ -228,14 +227,14 @@ Section "Redis" redisSection
228
227
 
229
228
  Push "PATH"
230
229
  Push "P"
231
- Push "HKLM"
230
+ Push "HKCU"
232
231
  Push "$INSTDIR\redis-2.4.0"
233
232
  Call EnvVarUpdate
234
233
  Pop $R0
235
234
 
236
235
  Push "REDIS_HOME"
237
236
  Push "P"
238
- Push "HKLM"
237
+ Push "HKCU"
239
238
  Push "$INSTDIR\redis-2.4.0"
240
239
  Call EnvVarUpdate
241
240
  Pop $R0
@@ -300,39 +299,6 @@ SectionEnd
300
299
  ;======================================================
301
300
  ;Functions
302
301
 
303
- Function .onInit
304
- !insertmacro MUI_INSTALLOPTIONS_EXTRACT "configUi.ini"
305
- FunctionEnd
306
-
307
- LangString TEXT_IO_TITLE ${LANG_ENGLISH} "Configuration page"
308
- LangString TEXT_IO_SUBTITLE ${LANG_ENGLISH} "This page will update application files based on your system configuration."
309
-
310
- /*
311
- Function customerConfig
312
- !insertmacro MUI_HEADER_TEXT "$(TEXT_IO_TITLE)" "$(TEXT_IO_SUBTITLE)"
313
- !insertmacro MUI_INSTALLOPTIONS_DISPLAY "configUi.ini"
314
- !insertmacro MUI_INSTALLOPTIONS_READ $varApacheEmail "configUi.ini" "Field 3" "State"
315
- !insertmacro MUI_INSTALLOPTIONS_READ $varApachePort "configUi.ini" "Field 4" "State"
316
-
317
- Push SERVERADMIN
318
- Push $varApacheEmail
319
- Push all
320
- Push all
321
- Push $INSTDIR\apache2\conf\httpd.conf
322
- Call AdvReplaceInFile
323
-
324
- Push SERVERPORT
325
- Push $varApachePort
326
- Push all
327
- Push all
328
- Push $INSTDIR\apache2\conf\httpd.conf
329
- Call AdvReplaceInFile
330
-
331
- ExecWait '"$INSTDIR\apache2\bin\httpd.exe" -k install'
332
- ExecWait 'net start Apache2.2'
333
- FunctionEnd
334
- */
335
-
336
302
  Function FixScriptFilesInDir
337
303
  Exch $R0 #path
338
304
  Exch
@@ -80,11 +80,11 @@ section
80
80
  createShortCut "$SMPROGRAMS\RhoStudio\RhoStudio.lnk" "$INSTDIR\eclipse\RhoStudio.exe"
81
81
 
82
82
  # added information in 'unistall programs' in contorol panel
83
- WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RhoStudio" \
83
+ WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\RhoStudio" \
84
84
  "DisplayName" "RhoStudio - RAD tool for develop and debug rhodes/rhoconnect applications"
85
- WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RhoStudio" \
85
+ WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\RhoStudio" \
86
86
  "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
87
- WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RhoStudio" \
87
+ WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\RhoStudio" \
88
88
  "DisplayIcon" "$\"$INSTDIR\uninstall.exe$\""
89
89
 
90
90
  Goto okFinishSection
@@ -113,21 +113,21 @@ section "uninstall"
113
113
  # remove env vars
114
114
  Push "PATH"
115
115
  Push "R"
116
- Push "HKLM"
116
+ Push "HKCU"
117
117
  Push "$INSTDIR\ruby\bin"
118
118
  Call un.EnvVarUpdate
119
119
  Pop $R0
120
120
 
121
121
  Push "PATH"
122
122
  Push "R"
123
- Push "HKLM"
123
+ Push "HKCU"
124
124
  Push "$INSTDIR\make-3.81\bin"
125
125
  Call un.EnvVarUpdate
126
126
  Pop $R0
127
127
 
128
128
  Push "PATH"
129
129
  Push "R"
130
- Push "HKLM"
130
+ Push "HKCU"
131
131
  Push "$INSTDIR\redis-2.4.0"
132
132
  Call un.EnvVarUpdate
133
133
  Pop $R0
@@ -149,7 +149,7 @@ Section "GNU Make" gnumakeSection
149
149
 
150
150
  Push "PATH"
151
151
  Push "P"
152
- Push "HKLM"
152
+ Push "HKCU"
153
153
  Push "$INSTDIR\make-3.81\bin"
154
154
  Call EnvVarUpdate
155
155
  Pop $R0
@@ -180,14 +180,14 @@ Section "DevKit" devkitSection
180
180
 
181
181
  Push "PATH"
182
182
  Push "P"
183
- Push "HKLM"
183
+ Push "HKCU"
184
184
  Push "$INSTDIR\devkit\mingw\bin"
185
185
  Call EnvVarUpdate
186
186
  Pop $R0
187
187
 
188
188
  Push "PATH"
189
189
  Push "P"
190
- Push "HKLM"
190
+ Push "HKCU"
191
191
  Push "$INSTDIR\devkit\bin"
192
192
  Call EnvVarUpdate
193
193
  Pop $R0
@@ -208,7 +208,7 @@ Section "Ruby, Rubygems, Rhodes, Rhoconnect and adapters" rubySection
208
208
 
209
209
  Push "PATH"
210
210
  Push "P"
211
- Push "HKLM"
211
+ Push "HKCU"
212
212
  Push "$INSTDIR\ruby\bin"
213
213
  Call EnvVarUpdate
214
214
  Pop $R0
@@ -227,14 +227,14 @@ Section "Redis" redisSection
227
227
 
228
228
  Push "PATH"
229
229
  Push "P"
230
- Push "HKLM"
230
+ Push "HKCU"
231
231
  Push "$INSTDIR\redis-2.4.0"
232
232
  Call EnvVarUpdate
233
233
  Pop $R0
234
234
 
235
235
  Push "REDIS_HOME"
236
236
  Push "P"
237
- Push "HKLM"
237
+ Push "HKCU"
238
238
  Push "$INSTDIR\redis-2.4.0"
239
239
  Call EnvVarUpdate
240
240
  Pop $R0
@@ -48,10 +48,15 @@ public class RhodesApplication extends Application{
48
48
 
49
49
  private static final String TAG = RhodesApplication.class.getSimpleName();
50
50
  private static Handler mHandler;
51
+ static AppEventObserver sRhodesAppActiveWatcher;
51
52
  static {
52
53
  NativeLibraries.load();
53
54
  }
54
55
 
56
+ public static void handleAppStarted() {
57
+ sRhodesAppActiveWatcher.run();
58
+ }
59
+
55
60
  private ApplicationInfo getAppInfo() {
56
61
  Context context = this;
57
62
  String pkgName = context.getPackageName();
@@ -84,6 +89,8 @@ public class RhodesApplication extends Application{
84
89
 
85
90
  Log.i(TAG, "Initializing...");
86
91
 
92
+ sRhodesAppActiveWatcher = AppState.AppStarted.addObserver("RhodesAppActiveObserver", true);
93
+
87
94
  RhodesApplication.runWhen(
88
95
  UiState.MainActivityStarted,
89
96
  new StateHandler(false) {
@@ -228,19 +235,124 @@ public class RhodesApplication extends Application{
228
235
  public abstract void run();
229
236
  }
230
237
 
231
- private static void runHandlers(Collection<StateHandler> handlers)
232
- {
233
- for(StateHandler handler: handlers) {
234
- handler.run();
238
+ /**
239
+ *
240
+ * @author lexis_tikh
241
+ *
242
+ */
243
+ private static class EventObserver implements Runnable{
244
+ private volatile boolean mReady = false;
245
+ private boolean mCheckOnce;
246
+ private String mTag;
247
+
248
+ public EventObserver(String tag, boolean once) { mTag = tag; mCheckOnce = once; }
249
+ public synchronized boolean isReady() { return mReady; }
250
+ public String toString() { return mTag + " - " + (mReady?"ready":"not ready");}
251
+ public synchronized void reset() { mReady = false; }
252
+ public boolean isCheckOnce() { return mCheckOnce; }
253
+ public void run() { // notify
254
+ synchronized(this) {
255
+ mReady = true;
256
+ }
257
+ Logger.I(mTag, "Ready");
258
+ }
259
+ }
260
+
261
+ public static class AppEventObserver extends EventObserver {
262
+ private AppState mState;
263
+
264
+ public AppEventObserver(String tag, AppState state, boolean once) {
265
+ super(tag, once);
266
+ mState = state;
267
+ }
268
+ public void run() {
269
+ super.run();
270
+
271
+ if(mState == null) throw new IllegalStateException("AppEventObserver state is not initialized");
272
+
273
+ RhodesApplication.stateChanged(mState);
274
+ }
275
+ }
276
+
277
+ public static class UiEventObserver extends EventObserver {
278
+ private UiState mState;
279
+
280
+ public UiEventObserver(String tag, UiState state, boolean once) {
281
+ super(tag, once);
282
+ mState = state;
283
+ }
284
+ public void run() {
285
+ super.run();
286
+
287
+ if(mState == null) throw new IllegalStateException("UiEventObserver state is not initialized");
288
+
289
+ RhodesApplication.stateChanged(mState);
290
+ }
291
+ }
292
+
293
+ private static int runHandlers(Collection<StateHandler> handlers) {
294
+ if (handlers == null) return 0;
295
+
296
+ for(StateHandler handler: handlers) {
297
+ handler.run();
235
298
  Exception error = handler.getError();
236
299
  if (error != null)
237
300
  {
238
301
  Logger.E(TAG, error);
239
302
  Thread.dumpStack();
240
303
  }
241
- }
304
+ }
305
+
306
+ return handlers.size();
307
+ }
308
+
309
+ private static class StateImpl <Observer extends EventObserver> {
310
+ private String TAG;
311
+ private Vector<Observer> mObservers = new Vector<Observer>();
312
+ private Vector<StateHandler> mHandlers = new Vector<StateHandler>();
313
+
314
+ public StateImpl(String tag) { TAG = tag; }
315
+
316
+ public void addObserver(Observer o) { mObservers.add(o); }
317
+ public void addHandler(StateHandler h) { mHandlers.add(h); }
318
+
319
+ public boolean isComplete() {
320
+ boolean complete = true;
321
+ for (Observer observer: mObservers) {
322
+ complete &= observer.isReady();
323
+ if (!complete) {
324
+ Logger.D(TAG, observer.toString());
325
+ break;
326
+ }
327
+ }
328
+ return complete;
329
+ }
330
+
331
+ public Collection<StateHandler> commitHandlers() {
332
+ Vector<StateHandler> handlers = new Vector<StateHandler>();
333
+ Vector<StateHandler> doneHandlers = new Vector<StateHandler>();
334
+ for (StateHandler handler: mHandlers) {
335
+ handlers.add(handler);
336
+ if (handler.isRunOnce()) {
337
+ doneHandlers.add(handler);
338
+ }
339
+ }
340
+ mHandlers.removeAll(doneHandlers);
341
+ return handlers;
342
+ }
343
+
344
+ public void commitObservers() {
345
+ Vector<EventObserver> observers = new Vector<EventObserver>();
346
+ for (EventObserver o: mObservers) {
347
+ if (o.isCheckOnce()) {
348
+ observers.add(o);
349
+ }
350
+ }
351
+ mObservers.removeAll(observers);
352
+ }
242
353
  }
243
354
 
355
+
244
356
  public enum AppState
245
357
  {
246
358
  Undefined("Undefined") {
@@ -264,42 +376,49 @@ public class RhodesApplication extends Application{
264
376
 
265
377
  private Vector<StateHandler> mHandlers = new Vector<StateHandler>();
266
378
  private String TAG;
379
+ private StateImpl<AppEventObserver> mImpl;
267
380
 
268
- private AppState(String tag) { TAG = tag; }
381
+ private AppState(String tag) {
382
+ TAG = tag;
383
+ mImpl = new StateImpl<AppEventObserver>(tag);
384
+ }
269
385
 
270
386
  private synchronized Collection<StateHandler> commit()
271
387
  {
272
- Vector<StateHandler> handlers = new Vector<StateHandler>();
388
+ Collection<StateHandler> handlers = null;// = new Vector<StateHandler>();
273
389
 
274
390
  Logger.T(TAG, "Starting commit. Current AppState: " + sAppState.TAG);
275
- if((this == AppActivated) && (sAppState == Undefined)) {
276
- appActivatedFlag = true;
277
- Logger.I(TAG, "Cannot commit now, application will be activated when started.");
278
- } else {
279
- Logger.T(TAG, "Commiting AppState handlers.");
280
- Vector<StateHandler> doneHandlers = new Vector<StateHandler>();
281
- for (StateHandler handler: mHandlers) {
282
- handlers.add(handler);
283
- if (handler.isRunOnce()) {
284
- doneHandlers.add(handler);
285
- }
286
- }
287
- mHandlers.removeAll(doneHandlers);
288
- sAppState = this;
391
+ if(mImpl.isComplete()) {
392
+ if((this == AppActivated) && (sAppState == Undefined)) {
393
+ appActivatedFlag = true;
394
+ Logger.I(TAG, "Cannot commit now, application will be activated when started.");
395
+ } else {
396
+ Logger.T(TAG, "Commiting AppState handlers.");
397
+
398
+ handlers = mImpl.commitHandlers();
399
+ mImpl.commitObservers();
400
+
401
+ sAppState = this;
402
+ }
289
403
  }
290
404
  Logger.T(TAG, "After AppState commit: " + sAppState.TAG);
291
405
  return handlers;
292
406
  }
293
407
 
294
408
  public synchronized void addHandler(StateHandler handler) { mHandlers.add(handler); }
409
+ public synchronized AppEventObserver addObserver(String tag, boolean once) {
410
+ AppEventObserver observer = new AppEventObserver(tag, this, once);
411
+ mImpl.addObserver(observer);
412
+ return observer;
413
+ }
295
414
  public abstract boolean canHandle(AppState state);
296
-
415
+
297
416
  static public void handleState(AppState state) {
298
- runHandlers(state.commit());
299
- Logger.I(sAppState.TAG, "Handlers have completed.");
417
+ int cnt = runHandlers(state.commit());
418
+ Logger.I(sAppState.TAG, "Handlers have completed: " + cnt);
300
419
  if((state == AppStarted) && appActivatedFlag) {
301
- runHandlers(AppActivated.commit());
302
- Logger.I(sAppState.TAG, "Handlers have completed.");
420
+ cnt = runHandlers(AppActivated.commit());
421
+ Logger.I(sAppState.TAG, "Handlers have completed: " + cnt);
303
422
  }
304
423
  return;
305
424
  }
@@ -324,40 +443,42 @@ public class RhodesApplication extends Application{
324
443
  public boolean canHandle(UiState state) { return (state == this) || (state == MainActivityCreated); }
325
444
  };
326
445
 
327
- private Vector<StateHandler> mHandlers = new Vector<StateHandler>();
446
+ private StateImpl<UiEventObserver> mImpl;
328
447
  public String TAG;
329
448
 
330
- private UiState(String tag) { TAG = tag; }
449
+ private UiState(String tag) {
450
+ TAG = tag;
451
+ mImpl = new StateImpl<UiEventObserver>(tag);
452
+ }
331
453
 
332
454
  private synchronized Collection<StateHandler> commit()
333
455
  {
334
- Vector<StateHandler> handlers = new Vector<StateHandler>();
456
+ Collection<StateHandler> handlers = null;
335
457
 
336
458
  Logger.T(TAG, "Starting commit. Current UiState: " + sUiState.TAG);
337
459
 
338
- if (!sUiState.canHandle(this)) {
339
-
340
- Logger.T(TAG, "Commiting UiState handlers.");
341
- Vector<StateHandler> doneHandlers = new Vector<StateHandler>();
342
- for (StateHandler handler: mHandlers) {
343
- handlers.add(handler);
344
- if (handler.isRunOnce()) {
345
- doneHandlers.add(handler);
346
- }
347
- }
348
- mHandlers.removeAll(doneHandlers);
349
- sUiState = this;
350
- }
460
+ if (mImpl.isComplete()) {
461
+ if (!sUiState.canHandle(this)) {
462
+ handlers = mImpl.commitHandlers();
463
+ mImpl.commitObservers();
464
+ sUiState = this;
465
+ }
466
+ }
351
467
  Logger.T(TAG, "After UiState commit: " + sUiState.TAG);
352
468
  return handlers;
353
469
  }
354
470
 
355
- public synchronized void addHandler(StateHandler handler) { mHandlers.add(handler); }
471
+ public synchronized void addHandler(StateHandler handler) { mImpl.addHandler(handler); }
472
+ public synchronized UiEventObserver addObserver(String tag, boolean once) {
473
+ UiEventObserver observer = new UiEventObserver(tag, this, once);
474
+ mImpl.addObserver(observer);
475
+ return observer;
476
+ }
356
477
  public abstract boolean canHandle(UiState state);
357
-
478
+
358
479
  static public void handleState(UiState state) {
359
- runHandlers(state.commit());
360
- Logger.I(sAppState.TAG, "Handlers have completed.");
480
+ int cnt = runHandlers(state.commit());
481
+ Logger.I(sAppState.TAG, "Handlers have completed: " + cnt);
361
482
  }
362
483
  }
363
484