ruboto 0.5.2 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/Gemfile.lock +5 -5
  2. data/README.md +2 -2
  3. data/Rakefile +5 -6
  4. data/assets/Rakefile +32 -11
  5. data/assets/res/drawable/get_ruboto_core.png +0 -0
  6. data/assets/res/layout/get_ruboto_core.xml +1 -1
  7. data/assets/samples/sample_activity.rb +13 -11
  8. data/assets/samples/sample_broadcast_receiver.rb +6 -3
  9. data/assets/samples/sample_service.rb +10 -7
  10. data/assets/src/InheritingActivity.java +1 -186
  11. data/assets/src/RubotoActivity.java +9 -11
  12. data/assets/src/RubotoBroadcastReceiver.java +34 -27
  13. data/assets/src/RubotoService.java +9 -2
  14. data/assets/src/org/ruboto/EntryPointActivity.java +194 -0
  15. data/assets/src/org/ruboto/Script.java +29 -15
  16. data/assets/src/org/ruboto/test/InstrumentationTestRunner.java +17 -16
  17. data/assets/src/ruboto.rb +11 -608
  18. data/assets/src/ruboto/activity.rb +84 -0
  19. data/assets/src/ruboto/base.rb +88 -0
  20. data/assets/src/ruboto/broadcast_receiver.rb +31 -0
  21. data/assets/src/ruboto/legacy.rb +223 -0
  22. data/assets/src/ruboto/menu.rb +89 -0
  23. data/assets/src/ruboto/preference.rb +78 -0
  24. data/assets/src/ruboto/service.rb +74 -0
  25. data/assets/src/ruboto/util/stack.rb +34 -0
  26. data/assets/src/ruboto/util/toast.rb +18 -0
  27. data/assets/src/ruboto/widget.rb +188 -0
  28. data/assets/test/{assets/scripts → src}/test_helper.rb +4 -0
  29. data/bin/ruboto +7 -0
  30. data/lib/ruboto/commands/base.rb +4 -18
  31. data/lib/ruboto/util/build.rb +1 -2
  32. data/lib/ruboto/util/update.rb +77 -70
  33. data/lib/ruboto/version.rb +1 -1
  34. data/test/activity/psych_activity.rb +25 -0
  35. data/test/activity/psych_activity_test.rb +16 -0
  36. data/test/activity/stack_activity_test.rb +1 -1
  37. data/test/app_test_methods.rb +8 -4
  38. data/test/minimal_app_test.rb +6 -3
  39. data/test/rake_test.rb +1 -1
  40. data/test/ruboto_gen_test.rb +10 -1
  41. data/test/test_helper.rb +3 -5
  42. data/test/update_test_methods.rb +2 -2
  43. metadata +20 -8
  44. data/test/ruboto_gen_with_psych_test.rb +0 -16
  45. data/test/ruboto_update_with_psych_test.rb +0 -18
@@ -75,6 +75,7 @@ THE_CONSTANTS
75
75
 
76
76
  // This causes JRuby to initialize and takes while
77
77
  protected void prepareJRuby() {
78
+ Script.put("$context", this);
78
79
  Script.put("$activity", this);
79
80
  Script.put("$bundle", args[0]);
80
81
  }
@@ -82,18 +83,15 @@ THE_CONSTANTS
82
83
  protected void loadScript() {
83
84
  try {
84
85
  if (scriptName != null) {
85
- new Script(scriptName).execute();
86
- } else if (configBundle != null && configBundle.getString("Remote Variable") != null) {
87
- setRemoteVariable(configBundle.getString("Remote Variable"));
88
- if (configBundle.getBoolean("Define Remote Variable")) {
89
- Script.put(remoteVariable, this);
90
- }
91
- if (configBundle.getString("Initialize Script") != null) {
92
- Script.execute(configBundle.getString("Initialize Script"));
93
- }
94
- Script.execute(getRemoteVariableCall("on_create($bundle)"));
86
+ Script.setScriptFilename(getClass().getClassLoader().getResource(scriptName).getPath());
87
+ Script.execute(new Script(scriptName).getContents());
95
88
  } else {
96
- throw new RuntimeException("Neither script name nor remote variable was set.");
89
+ // TODO: Why doesn't this work?
90
+ // Script.callMethod(this, "initialize_ruboto");
91
+ Script.execute("$activity.initialize_ruboto");
92
+ // TODO: Why doesn't this work?
93
+ // Script.callMethod(this, "on_create", args[0]);
94
+ Script.execute("$activity.on_create($bundle)");
97
95
  }
98
96
  } catch(IOException e){
99
97
  e.printStackTrace();
@@ -2,50 +2,57 @@ package THE_PACKAGE;
2
2
 
3
3
  import java.io.IOException;
4
4
 
5
- public abstract class THE_RUBOTO_CLASS THE_ACTION THE_ANDROID_CLASS {
6
- private String scriptName;
7
- private String remoteVariable = "";
8
-
9
- THE_CONSTANTS
10
-
11
- private Object[] callbackProcs = new Object[CONSTANTS_COUNT];
5
+ public class THE_RUBOTO_CLASS THE_ACTION THE_ANDROID_CLASS {
6
+ private String scriptName = null;
7
+ private boolean initialized = false;
12
8
 
13
9
  public void setCallbackProc(int id, Object obj) {
14
- callbackProcs[id] = obj;
10
+ // Error: no callbacks
11
+ throw new RuntimeException("RubotoBroadcastReceiver does not accept callbacks");
15
12
  }
16
13
 
17
- public THE_RUBOTO_CLASS setRemoteVariable(String var) {
18
- remoteVariable = ((var == null) ? "" : (var + "."));
19
- return this;
20
- }
21
-
22
14
  public void setScriptName(String name){
23
15
  scriptName = name;
24
16
  }
25
17
 
26
- public THE_RUBOTO_CLASS(String scriptName) {
27
- setScriptName(scriptName);
28
- if (Script.isInitialized()) {
29
- loadScript();
18
+ public THE_RUBOTO_CLASS() {
19
+ this(null);
20
+ }
21
+
22
+ public THE_RUBOTO_CLASS(String name) {
23
+ super();
24
+
25
+ if (name != null) {
26
+ setScriptName(name);
27
+
28
+ if (Script.isInitialized()) {
29
+ loadScript();
30
+ }
30
31
  }
31
32
  }
32
33
 
33
34
  protected void loadScript() {
34
35
  Script.put("$broadcast_receiver", this);
35
- try {
36
- new Script(scriptName).execute();
37
- } catch(IOException e) {
38
- throw new RuntimeException("IOException loading broadcast receiver script", e);
36
+ if (scriptName != null) {
37
+ try {
38
+ new Script(scriptName).execute();
39
+ } catch(IOException e) {
40
+ throw new RuntimeException("IOException loading broadcast receiver script", e);
41
+ }
39
42
  }
40
43
  }
41
44
 
42
- /****************************************************************************************
43
- *
44
- * Generated Methods
45
- */
46
-
47
- THE_METHODS
45
+ public void onReceive(android.content.Context context, android.content.Intent intent) {
46
+ Script.put("$context", context);
47
+ Script.put("$broadcast_receiver", this);
48
+ Script.put("$intent", intent);
48
49
 
50
+ try {
51
+ Script.execute("$broadcast_receiver.on_receive($context, $intent)");
52
+ } catch(Exception e) {
53
+ e.printStackTrace();
54
+ }
55
+ }
49
56
  }
50
57
 
51
58
 
@@ -4,7 +4,7 @@ import org.ruboto.Script;
4
4
  import java.io.IOException;
5
5
  import android.app.ProgressDialog;
6
6
 
7
- public abstract class THE_RUBOTO_CLASS THE_ACTION THE_ANDROID_CLASS {
7
+ public class THE_RUBOTO_CLASS THE_ACTION THE_ANDROID_CLASS {
8
8
  private String scriptName;
9
9
  private String remoteVariable = "";
10
10
  public Object[] args;
@@ -38,9 +38,16 @@ THE_CONSTANTS
38
38
  super.onCreate();
39
39
 
40
40
  if (Script.setUpJRuby(this)) {
41
+ Script.defineGlobalVariable("$context", this);
41
42
  Script.defineGlobalVariable("$service", this);
43
+
42
44
  try {
43
- new Script(scriptName).execute();
45
+ if (scriptName != null) {
46
+ new Script(scriptName).execute();
47
+ } else {
48
+ Script.execute("$service.initialize_ruboto");
49
+ Script.execute("$service.on_create");
50
+ }
44
51
  } catch(IOException e) {
45
52
  e.printStackTrace();
46
53
  }
@@ -0,0 +1,194 @@
1
+ package org.ruboto;
2
+
3
+ import java.io.File;
4
+ import java.io.IOException;
5
+
6
+ import org.ruboto.Script;
7
+
8
+ import android.app.ProgressDialog;
9
+ import android.content.BroadcastReceiver;
10
+ import android.content.Context;
11
+ import android.content.DialogInterface;
12
+ import android.content.DialogInterface.OnCancelListener;
13
+ import android.content.Intent;
14
+ import android.content.IntentFilter;
15
+ import android.net.Uri;
16
+ import android.os.Bundle;
17
+ import android.os.Handler;
18
+ import android.util.Log;
19
+ import android.view.View;
20
+ import android.widget.TextView;
21
+ import android.widget.Toast;
22
+
23
+ public class EntryPointActivity extends org.ruboto.RubotoActivity {
24
+ private int splash = 0;
25
+ private ProgressDialog loadingDialog;
26
+ private boolean dialogCancelled = false;
27
+ private BroadcastReceiver receiver;
28
+ private boolean appStarted = false;
29
+
30
+ public void onCreate(Bundle bundle) {
31
+ Log.d("RUBOTO", "onCreate: ");
32
+
33
+ try {
34
+ splash = Class.forName(getPackageName() + ".R$layout").getField("splash").getInt(null);
35
+ } catch (Exception e) {
36
+ splash = -1;
37
+ }
38
+
39
+ if (Script.isInitialized()) {
40
+ appStarted = true;
41
+ }
42
+ super.onCreate(bundle);
43
+ }
44
+
45
+ public void onResume() {
46
+ Log.d("RUBOTO", "onResume: ");
47
+
48
+ if(appStarted) {
49
+ Log.d("RUBOTO", "onResume: App already started!");
50
+ super.onResume();
51
+ return;
52
+ }
53
+
54
+ Log.d("RUBOTO", "onResume: Checking JRuby");
55
+ if (Script.isInitialized()) {
56
+ Log.d("RUBOTO", "Already initialized");
57
+ fireRubotoActivity();
58
+ } else {
59
+ Log.d("RUBOTO", "Not initialized");
60
+ showProgress();
61
+ receiver = new BroadcastReceiver(){
62
+ public void onReceive(Context context, Intent intent) {
63
+ Log.i("RUBOTO", "received broadcast: " + intent);
64
+ Log.i("RUBOTO", "URI: " + intent.getData());
65
+ if (intent.getData().toString().equals("package:org.ruboto.core")) {
66
+ Toast.makeText(context,"Ruboto Core is now installed.",Toast.LENGTH_SHORT).show();
67
+ if (receiver != null) {
68
+ unregisterReceiver(receiver);
69
+ receiver = null;
70
+ }
71
+ showProgress();
72
+ initJRuby(false);
73
+ }
74
+ }
75
+ };
76
+ IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
77
+ filter.addDataScheme("package");
78
+ registerReceiver(receiver, filter);
79
+ initJRuby(true);
80
+ super.onResume();
81
+ }
82
+ }
83
+
84
+ public void onPause() {
85
+ Log.d("RUBOTO", "onPause: ");
86
+
87
+ if (receiver != null) {
88
+ unregisterReceiver(receiver);
89
+ receiver = null;
90
+ }
91
+ super.onPause();
92
+ }
93
+
94
+ public void onDestroy() {
95
+ Log.d("RUBOTO", "onDestroy: ");
96
+
97
+ super.onDestroy();
98
+ if (dialogCancelled) {
99
+ System.runFinalizersOnExit(true);
100
+ System.exit(0);
101
+ }
102
+ }
103
+
104
+ private void initJRuby(final boolean firstTime) {
105
+ new Thread(new Runnable() {
106
+ public void run() {
107
+ final boolean jrubyOk = Script.setUpJRuby(EntryPointActivity.this);
108
+ if (jrubyOk) {
109
+ Log.d("RUBOTO", "onResume: JRuby OK");
110
+ prepareJRuby();
111
+ runOnUiThread(new Runnable() {
112
+ public void run() {
113
+ fireRubotoActivity();
114
+ }
115
+ });
116
+ } else {
117
+ runOnUiThread(new Runnable() {
118
+ public void run() {
119
+ if (firstTime) {
120
+ Log.d("RUBOTO", "onResume: Checking JRuby - IN UI thread");
121
+ try {
122
+ setContentView(Class.forName(getPackageName() + ".R$layout").getField("get_ruboto_core").getInt(null));
123
+ } catch (Exception e) {
124
+ }
125
+ } else {
126
+ Toast.makeText(EntryPointActivity.this,"Failed to initialize Ruboto Core.",Toast.LENGTH_SHORT).show();
127
+ try {
128
+ TextView textView = (TextView) findViewById(Class.forName(getPackageName() + ".R$id").getField("text").getInt(null));
129
+ textView.setText("Woops! Ruboto Core was installed, but it failed to initialize properly! I am not sure how to proceed from here. If you can, please file an error report at http://ruboto.org/");
130
+ } catch (Exception e) {
131
+ }
132
+ }
133
+ hideProgress();
134
+ }
135
+ });
136
+ }
137
+ }
138
+ }).start();
139
+ }
140
+
141
+ private static final String RUBOTO_APK = "RubotoCore-release.apk";
142
+ private static final String RUBOTO_URL = "https://github.com/downloads/ruboto/ruboto/" + RUBOTO_APK;
143
+
144
+ // Called when the button is pressed.
145
+ public void getRubotoCore(View view) {
146
+ try {
147
+ startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("market://details?id=org.ruboto.core")));
148
+ } catch (android.content.ActivityNotFoundException anfe) {
149
+ try {
150
+ TextView textView = (TextView) findViewById(Class.forName(getPackageName() + ".R$id").getField("text").getInt(null));
151
+ Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(RUBOTO_URL));
152
+ startActivity(intent);
153
+ } catch (Exception e) {}
154
+ }
155
+ }
156
+
157
+ private void fireRubotoActivity() {
158
+ if(appStarted) return;
159
+ appStarted = true;
160
+ Log.i("RUBOTO", "Starting activity");
161
+ loadScript();
162
+ onStart();
163
+ super.onResume();
164
+ hideProgress();
165
+ }
166
+
167
+ private void showProgress() {
168
+ if (loadingDialog == null) {
169
+ Log.i("RUBOTO", "Showing progress");
170
+ if (splash > 0) {
171
+ requestWindowFeature(android.view.Window.FEATURE_NO_TITLE);
172
+ setContentView(splash);
173
+ } else {
174
+ loadingDialog = ProgressDialog.show(this, null, "Starting...", true, true);
175
+ loadingDialog.setCanceledOnTouchOutside(false);
176
+ loadingDialog.setOnCancelListener(new OnCancelListener() {
177
+ public void onCancel(DialogInterface dialog) {
178
+ dialogCancelled = true;
179
+ finish();
180
+ }
181
+ });
182
+ }
183
+ }
184
+ }
185
+
186
+ private void hideProgress() {
187
+ if (loadingDialog != null) {
188
+ Log.d("RUBOTO", "Hide progress");
189
+ loadingDialog.dismiss();
190
+ loadingDialog = null;
191
+ }
192
+ }
193
+
194
+ }
@@ -169,11 +169,8 @@ public class Script {
169
169
  callScriptingContainerMethod(Void.class, "setCurrentDirectory", defaultCurrentDir);
170
170
 
171
171
  if (out != null) {
172
- // callScriptingContainerMethod(Void.class, "setOutput", out);
173
172
  Method setOutputMethod = ruby.getClass().getMethod("setOutput", PrintStream.class);
174
173
  setOutputMethod.invoke(ruby, out);
175
-
176
- // callScriptingContainerMethod(Void.class, "setError", out);
177
174
  Method setErrorMethod = ruby.getClass().getMethod("setError", PrintStream.class);
178
175
  setErrorMethod.invoke(ruby, out);
179
176
  }
@@ -229,15 +226,10 @@ public class Script {
229
226
  } catch (RuntimeException re) {
230
227
  re.printStackTrace();
231
228
  } catch (IllegalAccessException e) {
232
- // TODO Auto-generated catch block
233
229
  e.printStackTrace();
234
230
  } catch (InvocationTargetException e) {
235
- try {
236
- e.printStackTrace();
237
- } catch (NullPointerException npe) {
238
- }
231
+ printStackTrace(e);
239
232
  } catch (NoSuchMethodException e) {
240
- // TODO Auto-generated catch block
241
233
  e.printStackTrace();
242
234
  }
243
235
  return null;
@@ -330,7 +322,7 @@ public class Script {
330
322
  if (new File(scriptsDir).exists()) {
331
323
  Log.i(TAG, "Found extra scripts dir: " + scriptsDir);
332
324
  setDir(scriptsDir);
333
- exec("$:.unshift '" + scriptsDir + "' ; $:.uniq! ; p $:");
325
+ exec("$:.unshift '" + scriptsDir + "' ; $:.uniq!");
334
326
  return true;
335
327
  } else {
336
328
  Log.i(TAG, "Extra scripts dir not present: " + scriptsDir);
@@ -495,7 +487,6 @@ public class Script {
495
487
  }
496
488
 
497
489
  public static void callMethod(Object receiver, String methodName, Object[] args) {
498
- // callScriptingContainerMethod(Void.class, "callMethod", receiver, methodName, args);
499
490
  try {
500
491
  Method callMethodMethod = ruby.getClass().getMethod("callMethod", Object.class, String.class, Object[].class);
501
492
  callMethodMethod.invoke(ruby, receiver, methodName, args);
@@ -504,7 +495,7 @@ public class Script {
504
495
  } catch (IllegalAccessException iae) {
505
496
  throw new RuntimeException(iae);
506
497
  } catch (java.lang.reflect.InvocationTargetException ite) {
507
- throw (RuntimeException)(ite.getCause());
498
+ printStackTrace(ite);
508
499
  }
509
500
  }
510
501
 
@@ -518,7 +509,6 @@ public class Script {
518
509
 
519
510
  @SuppressWarnings("unchecked")
520
511
  public static <T> T callMethod(Object receiver, String methodName, Object[] args, Class<T> returnType) {
521
- // return callScriptingContainerMethod(returnType, "callMethod", receiver, methodName, args, returnType);
522
512
  try {
523
513
  Method callMethodMethod = ruby.getClass().getMethod("callMethod", Object.class, String.class, Object[].class, Class.class);
524
514
  return (T) callMethodMethod.invoke(ruby, receiver, methodName, args, returnType);
@@ -527,8 +517,9 @@ public class Script {
527
517
  } catch (IllegalAccessException iae) {
528
518
  throw new RuntimeException(iae);
529
519
  } catch (java.lang.reflect.InvocationTargetException ite) {
530
- throw (RuntimeException) ite.getCause();
520
+ printStackTrace(ite);
531
521
  }
522
+ return null;
532
523
  }
533
524
 
534
525
  public static <T> T callMethod(Object receiver, String methodName,
@@ -541,5 +532,28 @@ public class Script {
541
532
  return callMethod(receiver, methodName, new Object[]{}, returnType);
542
533
  }
543
534
 
544
- }
535
+ private static void printStackTrace(Throwable t) {
536
+ PrintStream out;
537
+ try {
538
+ Method getOutputMethod = ruby.getClass().getMethod("getOutput");
539
+ out = (PrintStream) getOutputMethod.invoke(ruby);
540
+ } catch (java.lang.NoSuchMethodException nsme) {
541
+ throw new RuntimeException("ScriptingContainer#getOutput method not found.", nsme);
542
+ } catch (java.lang.IllegalAccessException iae) {
543
+ throw new RuntimeException("ScriptingContainer#getOutput method not accessable.", iae);
544
+ } catch (java.lang.reflect.InvocationTargetException ite) {
545
+ throw new RuntimeException("ScriptingContainer#getOutput failed.", ite);
546
+ }
545
547
 
548
+ // TODO(uwe): Simplify this when Issue #144 is resolved
549
+ try {
550
+ t.printStackTrace(out);
551
+ } catch (NullPointerException npe) {
552
+ // TODO(uwe): printStackTrace should not fail
553
+ for (java.lang.StackTraceElement ste : t.getStackTrace()) {
554
+ out.append(ste.toString() + "\n");
555
+ }
556
+ }
557
+ }
558
+
559
+ }
@@ -23,6 +23,8 @@ import junit.framework.Test;
23
23
  import junit.framework.TestCase;
24
24
  import junit.framework.TestSuite;
25
25
  import org.ruboto.Script;
26
+ import java.util.Set;
27
+ import java.util.HashSet;
26
28
 
27
29
  public class InstrumentationTestRunner extends android.test.InstrumentationTestRunner {
28
30
  private Class activityClass;
@@ -39,23 +41,25 @@ public class InstrumentationTestRunner extends android.test.InstrumentationTestR
39
41
  Script.defineGlobalVariable("$test", this);
40
42
  Script.defineGlobalVariable("$suite", suite);
41
43
 
42
- // TODO(uwe): Why doesn't this work?
43
- // Script.copyScriptsIfNeeded(getContext());
44
-
45
44
  loadScript("test_helper.rb");
46
45
 
47
- // TODO(uwe): Why doesn't this work?
48
- // String[] scripts = new File(Script.scriptsDirName(getContext())).list();
49
-
50
- String[] scripts = getContext().getResources().getAssets().list("scripts");
51
- for (String f : scripts) {
52
- if (f.equals("test_helper.rb")) continue;
53
- Log.i(getClass().getName(), "Found script: " + f);
54
- loadScript(f);
46
+ String test_apk_path = getContext().getPackageManager().getApplicationInfo(getContext().getPackageName(), 0).sourceDir;
47
+ JarFile jar = new JarFile(test_apk_path);
48
+ Enumeration<JarEntry> entries = jar.entries();
49
+ while(entries.hasMoreElements()) {
50
+ JarEntry entry = entries.nextElement();
51
+ String name = entry.getName();
52
+ if (name.indexOf("/") >= 0 || !name.endsWith(".rb")) {
53
+ continue;
54
+ }
55
+ if (name.equals("test_helper.rb")) continue;
56
+ loadScript(name);
55
57
  }
56
58
  } else {
57
59
  addError(suite, new RuntimeException("Ruboto Core platform is missing"));
58
60
  }
61
+ } catch (android.content.pm.PackageManager.NameNotFoundException e) {
62
+ addError(suite, e);
59
63
  } catch (IOException e) {
60
64
  addError(suite, e);
61
65
  } catch (RuntimeException e) {
@@ -98,10 +102,8 @@ public class InstrumentationTestRunner extends android.test.InstrumentationTestR
98
102
  }
99
103
 
100
104
  private void loadScript(String f) throws IOException {
101
- // TODO(uwe): Why doesn't this work?
102
- // InputStream is = new FileInputStream(Script.scriptsDirName(getContext()) + "/" + f);
103
-
104
- InputStream is = getContext().getResources().getAssets().open("scripts/" + f);
105
+ Log.d(getClass().getName(), "Loading test script: " + f);
106
+ InputStream is = getClass().getClassLoader().getResourceAsStream(f);
105
107
  BufferedReader buffer = new BufferedReader(new InputStreamReader(is));
106
108
  StringBuilder source = new StringBuilder();
107
109
  while (true) {
@@ -111,7 +113,6 @@ public class InstrumentationTestRunner extends android.test.InstrumentationTestR
111
113
  }
112
114
  buffer.close();
113
115
 
114
- Log.d(getClass().getName(), "Loading test script: " + f);
115
116
  String oldFilename = Script.getScriptFilename();
116
117
  Script.setScriptFilename(f);
117
118
  Script.put("$script_code", source.toString());