ruboto 0.10.2 → 0.11.0.rc.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -4
- data/Gemfile.lock +12 -6
- data/README.md +2 -2
- data/assets/rakelib/ruboto.rake +165 -7
- data/assets/samples/sample_activity.rb +1 -1
- data/assets/samples/sample_activity_test.rb +2 -2
- data/assets/samples/sample_broadcast_receiver.rb +3 -3
- data/assets/samples/sample_broadcast_receiver_test.rb +1 -1
- data/assets/samples/sample_service.rb +2 -2
- data/assets/src/RubotoBroadcastReceiver.java +9 -0
- data/assets/src/org/ruboto/EntryPointActivity.java +3 -0
- data/assets/src/org/ruboto/JRubyAdapter.java +57 -23
- data/assets/src/org/ruboto/ScriptLoader.java +5 -2
- data/assets/src/ruboto/activity.rb +12 -13
- data/assets/src/ruboto/base.rb +2 -2
- data/assets/src/ruboto/broadcast_receiver.rb +1 -1
- data/assets/src/ruboto/package.rb +2 -2
- data/assets/src/ruboto/preference.rb +4 -4
- data/assets/src/ruboto/service.rb +9 -10
- data/assets/src/ruboto/util/stack.rb +10 -2
- data/assets/src/ruboto/widget.rb +5 -3
- data/lib/ruboto/sdk_versions.rb +1 -1
- data/lib/ruboto/util/update.rb +97 -52
- data/lib/ruboto/version.rb +1 -1
- data/lib/ruboto.rb +1 -1
- data/test/activity/image_button_activity.rb +1 -1
- data/test/activity/image_button_and_button_activity.rb +1 -1
- data/test/activity/json_activity.rb +1 -1
- data/test/activity/margins_activity.rb +1 -1
- data/test/activity/navigation_activity.rb +4 -4
- data/test/activity/navigation_target_activity.rb +1 -1
- data/test/activity/option_menu_activity.rb +2 -2
- data/test/activity/psych_activity.rb +1 -1
- data/test/activity/ruby_file_activity.rb +1 -1
- data/test/activity/stack_activity.rb +1 -1
- data/test/activity/startup_exception_activity.rb +31 -0
- data/test/activity/startup_exception_activity_test.rb +15 -0
- data/test/activity/subclass_activity.rb +2 -2
- data/test/activity/view_constants_activity.rb +1 -1
- data/test/app_test_methods.rb +1 -5
- data/test/broadcast_receiver_test.rb +4 -4
- data/test/minimal_app_test.rb +36 -8
- data/test/ruboto_gen_test.rb +5 -9
- data/test/service_test.rb +5 -5
- data/test/sqldroid_test.rb +1 -1
- data/test/test_helper.rb +13 -4
- metadata +67 -50
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,21 +1,27 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
ruboto (0.11.0.rc.0)
|
5
|
+
main (>= 4.7.2)
|
6
|
+
|
1
7
|
GEM
|
2
8
|
remote: https://rubygems.org/
|
3
9
|
specs:
|
4
|
-
arrayfields (4.
|
5
|
-
chronic (0.
|
10
|
+
arrayfields (4.9.0)
|
11
|
+
chronic (0.9.1)
|
6
12
|
fattr (2.2.1)
|
7
|
-
main (5.0
|
13
|
+
main (5.2.0)
|
8
14
|
arrayfields (>= 4.7.4)
|
9
15
|
chronic (>= 0.6.2)
|
10
16
|
fattr (>= 2.2.0)
|
11
17
|
map (>= 5.1.0)
|
12
|
-
map (
|
13
|
-
rake (0.
|
18
|
+
map (6.3.0)
|
19
|
+
rake (10.0.4)
|
14
20
|
|
15
21
|
PLATFORMS
|
16
22
|
java
|
17
23
|
ruby
|
18
24
|
|
19
25
|
DEPENDENCIES
|
20
|
-
main
|
21
26
|
rake
|
27
|
+
ruboto!
|
data/README.md
CHANGED
@@ -154,11 +154,11 @@ You generate an app with the option `--activity FooActivity`, which means that r
|
|
154
154
|
|
155
155
|
class FooActivity
|
156
156
|
include Ruboto::Activity
|
157
|
-
def
|
157
|
+
def onCreate(bundle)
|
158
158
|
Log.v 'MYAPPNAME', 'onCreate got called!'
|
159
159
|
end
|
160
160
|
|
161
|
-
def
|
161
|
+
def onPause
|
162
162
|
Log.v 'MYAPPNAME', 'onPause got called!'
|
163
163
|
end
|
164
164
|
end
|
data/assets/rakelib/ruboto.rake
CHANGED
@@ -163,7 +163,7 @@ end
|
|
163
163
|
|
164
164
|
desc 'Start the emulator with larger disk'
|
165
165
|
task :emulator do
|
166
|
-
|
166
|
+
start_emulator
|
167
167
|
end
|
168
168
|
|
169
169
|
desc 'Start the application on the device/emulator.'
|
@@ -257,24 +257,40 @@ task :bundle => BUNDLE_JAR
|
|
257
257
|
file BUNDLE_JAR => [GEM_FILE, GEM_LOCK_FILE] do
|
258
258
|
next unless File.exists? GEM_FILE
|
259
259
|
puts "Generating #{BUNDLE_JAR}"
|
260
|
+
require 'bundler'
|
261
|
+
require 'bundler/vendored_thor'
|
260
262
|
|
261
|
-
#
|
263
|
+
# Store original RubyGems/Bundler environment
|
262
264
|
platforms = Gem.platforms
|
263
265
|
ruby_engine = defined?(RUBY_ENGINE) && RUBY_ENGINE
|
266
|
+
gem_paths = {'GEM_HOME' => Gem.path, 'GEM_PATH' => Gem.dir}
|
267
|
+
|
268
|
+
# Override RUBY_ENGINE (we can bundle from MRI for JRuby)
|
264
269
|
Gem.platforms = [Gem::Platform::RUBY, Gem::Platform.new('universal-java')]
|
265
|
-
|
270
|
+
Gem.paths = {'GEM_HOME' => BUNDLE_PATH, 'GEM_PATH' => BUNDLE_PATH}
|
271
|
+
old_verbose, $VERBOSE = $VERBOSE, nil
|
272
|
+
begin
|
273
|
+
Object.const_set('RUBY_ENGINE', 'jruby')
|
274
|
+
ensure
|
275
|
+
$VERBOSE = old_verbose
|
276
|
+
end
|
266
277
|
|
267
278
|
ENV['BUNDLE_GEMFILE'] = GEM_FILE
|
268
|
-
|
279
|
+
Bundler.ui = Bundler::UI::Shell.new
|
269
280
|
Bundler.bundle_path = Pathname.new BUNDLE_PATH
|
270
|
-
|
271
281
|
definition = Bundler.definition
|
272
282
|
definition.validate_ruby!
|
273
283
|
Bundler::Installer.install(Bundler.root, definition)
|
274
284
|
|
275
285
|
# Restore RUBY_ENGINE (limit the scope of this hack)
|
276
|
-
|
286
|
+
old_verbose, $VERBOSE = $VERBOSE, nil
|
287
|
+
begin
|
288
|
+
Object.const_set('RUBY_ENGINE', ruby_engine)
|
289
|
+
ensure
|
290
|
+
$VERBOSE = old_verbose
|
291
|
+
end
|
277
292
|
Gem.platforms = platforms
|
293
|
+
Gem.paths = gem_paths
|
278
294
|
|
279
295
|
gem_paths = Dir["#{BUNDLE_PATH}/gems"]
|
280
296
|
raise 'Gem path not found' if gem_paths.empty?
|
@@ -284,7 +300,7 @@ file BUNDLE_JAR => [GEM_FILE, GEM_LOCK_FILE] do
|
|
284
300
|
|
285
301
|
if package != 'org.ruboto.core' && JRUBY_JARS.none? { |f| File.exists? f }
|
286
302
|
Dir.chdir gem_path do
|
287
|
-
Dir['{activerecord-jdbc-adapter,
|
303
|
+
Dir['{activerecord-jdbc-adapter,jruby-openssl}-*'].each do |g|
|
288
304
|
puts "Removing #{g} gem since it is included in the RubotoCore platform apk."
|
289
305
|
FileUtils.rm_rf g
|
290
306
|
end
|
@@ -361,6 +377,10 @@ Java::arjdbc.jdbc.AdapterJavaService.new.basicLoad(JRuby.runtime)
|
|
361
377
|
# FileUtils.rm_f(files)
|
362
378
|
# ODOT
|
363
379
|
|
380
|
+
# FIXME(uwe): Extract files with case sensitive names for ARJDBC 1.2.7-1.3.x
|
381
|
+
puts `jar xf #{jar} arjdbc/mssql/MSSQLRubyJdbcConnection.class arjdbc/sqlite3/SQLite3RubyJdbcConnection.class`
|
382
|
+
# EMXIF
|
383
|
+
|
364
384
|
elsif jar =~ /shared\/jopenssl.jar$/
|
365
385
|
jar_load_code = <<-END_CODE
|
366
386
|
require 'jruby'
|
@@ -625,3 +645,141 @@ def stop_app
|
|
625
645
|
output = `adb shell ps | grep #{package} | awk '{print $2}' | xargs adb shell kill`
|
626
646
|
output !~ /Operation not permitted/
|
627
647
|
end
|
648
|
+
|
649
|
+
def start_emulator
|
650
|
+
STDOUT.sync = true
|
651
|
+
# FIXME(uwe): Use RBConfig instead
|
652
|
+
if `uname -m`.chomp == 'x86_64'
|
653
|
+
emulator_cmd = 'emulator64-arm'
|
654
|
+
else
|
655
|
+
emulator_cmd = 'emulator-arm'
|
656
|
+
end
|
657
|
+
|
658
|
+
emulator_opts = '-partition-size 256'
|
659
|
+
if ENV['DISPLAY'].nil?
|
660
|
+
emulator_opts << ' -no-window -no-audio'
|
661
|
+
end
|
662
|
+
|
663
|
+
avd_name = "Android_#{sdk_level_name}"
|
664
|
+
new_snapshot = false
|
665
|
+
loop do
|
666
|
+
`killall -0 #{emulator_cmd} 2> /dev/null`
|
667
|
+
if $? == 0
|
668
|
+
`killall #{emulator_cmd}`
|
669
|
+
10.times do |i|
|
670
|
+
`killall -0 #{emulator_cmd} 2> /dev/null`
|
671
|
+
if $? != 0
|
672
|
+
break
|
673
|
+
end
|
674
|
+
if i == 3
|
675
|
+
print 'Waiting for emulator to die: ...'
|
676
|
+
elsif i > 3
|
677
|
+
print '.'
|
678
|
+
end
|
679
|
+
sleep 1
|
680
|
+
end
|
681
|
+
puts
|
682
|
+
`killall -0 #{emulator_cmd} 2> /dev/null`
|
683
|
+
if $? == 0
|
684
|
+
puts 'Emulator still running.'
|
685
|
+
`killall -9 #{emulator_cmd}`
|
686
|
+
sleep 1
|
687
|
+
end
|
688
|
+
end
|
689
|
+
|
690
|
+
if [17, 16, 15, 13, 11].include? sdk_level
|
691
|
+
abi_opt = '--abi armeabi-v7a'
|
692
|
+
elsif sdk_level == 10
|
693
|
+
abi_opt = '--abi armeabi'
|
694
|
+
end
|
695
|
+
|
696
|
+
unless File.exists? "#{ENV['HOME']}/.android/avd/#{avd_name}.avd"
|
697
|
+
puts "Creating AVD #{avd_name}"
|
698
|
+
heap_size = File.read('AndroidManifest.xml') =~ 'largeHeap' ? 256 : 48
|
699
|
+
# FIXME(uwe): Use Ruby instead.
|
700
|
+
# FIXME(uwe): Only change the heap size to be larger.
|
701
|
+
# `sed -i.bak -e "s/vm.heapSize=[0-9]*/vm.heapSize=#{heap_size}/" #{ENV['ANDROID_HOME']}/platforms/*/*/*/hardware.ini`
|
702
|
+
`echo n | android create avd -a -n #{avd_name} -t android-#{sdk_level} #{abi_opt} -c 64M -s HVGA`
|
703
|
+
`sed -i.bak -e "s/vm.heapSize=[0-9]*/vm.heapSize=#{heap_size}/" #{ENV['HOME']}/.android/avd/#{avd_name}.avd/config.ini`
|
704
|
+
new_snapshot = true
|
705
|
+
end
|
706
|
+
|
707
|
+
puts 'Start emulator'
|
708
|
+
system "emulator -avd #{avd_name} #{emulator_opts} &"
|
709
|
+
|
710
|
+
3.times do |i|
|
711
|
+
sleep 1
|
712
|
+
`killall -0 #{emulator_cmd} 2> /dev/null`
|
713
|
+
if $? == 0
|
714
|
+
break
|
715
|
+
end
|
716
|
+
if i == 3
|
717
|
+
print 'Waiting for emulator: ...'
|
718
|
+
elsif i > 3
|
719
|
+
print '.'
|
720
|
+
end
|
721
|
+
end
|
722
|
+
puts
|
723
|
+
`killall -0 #{emulator_cmd} 2> /dev/null`
|
724
|
+
if $? != 0
|
725
|
+
puts 'Unable to start the emulator. Retrying without loading snapshot.'
|
726
|
+
system "emulator -no-snapshot-load -avd #{avd_name} #{emulator_opts} &"
|
727
|
+
10.times do |i|
|
728
|
+
`killall -0 #{emulator_cmd} 2> /dev/null`
|
729
|
+
if $? == 0
|
730
|
+
new_snapshot = true
|
731
|
+
break
|
732
|
+
end
|
733
|
+
if i == 3
|
734
|
+
print 'Waiting for emulator: ...'
|
735
|
+
elsif i > 3
|
736
|
+
print '.'
|
737
|
+
end
|
738
|
+
sleep 1
|
739
|
+
end
|
740
|
+
end
|
741
|
+
|
742
|
+
`killall -0 #{emulator_cmd} 2> /dev/null`
|
743
|
+
if $? == 0
|
744
|
+
print 'Emulator started: '
|
745
|
+
50.times do
|
746
|
+
if `adb get-state`.chomp == 'device'
|
747
|
+
break
|
748
|
+
end
|
749
|
+
print '.'
|
750
|
+
sleep 1
|
751
|
+
end
|
752
|
+
puts
|
753
|
+
if `adb get-state`.chomp == 'device'
|
754
|
+
break
|
755
|
+
end
|
756
|
+
end
|
757
|
+
puts 'Unable to start the emulator.'
|
758
|
+
end
|
759
|
+
|
760
|
+
if new_snapshot
|
761
|
+
puts 'Allow the emulator to calm down a bit.'
|
762
|
+
sleep 15
|
763
|
+
end
|
764
|
+
|
765
|
+
system %Q{(
|
766
|
+
set +e
|
767
|
+
for i in 1 2 3 4 5 6 7 8 9 10 ; do
|
768
|
+
sleep 6
|
769
|
+
adb shell input keyevent 82 >/dev/null 2>&1
|
770
|
+
if [ "$?" == "0" ] ; then
|
771
|
+
set -e
|
772
|
+
adb shell input keyevent 82 >/dev/null 2>&1
|
773
|
+
adb shell input keyevent 4 >/dev/null 2>&1
|
774
|
+
exit 0
|
775
|
+
fi
|
776
|
+
done
|
777
|
+
echo "Failed to unlock screen"
|
778
|
+
set -e
|
779
|
+
exit 1
|
780
|
+
) &}
|
781
|
+
|
782
|
+
system "adb logcat > adb_logcat.log &"
|
783
|
+
|
784
|
+
puts "Emulator #{avd_name} started OK."
|
785
|
+
end
|
@@ -11,11 +11,11 @@ setup do |activity|
|
|
11
11
|
end
|
12
12
|
|
13
13
|
test('initial setup') do |activity|
|
14
|
-
assert_equal
|
14
|
+
assert_equal 'What hath Matz wrought?', @text_view.text
|
15
15
|
end
|
16
16
|
|
17
17
|
test('button changes text') do |activity|
|
18
18
|
button = activity.findViewById(43)
|
19
19
|
button.performClick
|
20
|
-
assert_equal
|
20
|
+
assert_equal 'What hath Matz wrought!', @text_view.text
|
21
21
|
end
|
@@ -2,9 +2,9 @@ import android.util.Log
|
|
2
2
|
|
3
3
|
class SampleBroadcastReceiver
|
4
4
|
# will get called whenever the BroadcastReceiver receives an intent (whenever onReceive is called)
|
5
|
-
def
|
6
|
-
Log.v
|
7
|
-
Log.v
|
5
|
+
def onReceive(context, intent)
|
6
|
+
Log.v 'SampleBroadcastReceiver', 'Broadcast received!'
|
7
|
+
Log.v 'SampleBroadcastReceiver', intent.getExtras.to_s
|
8
8
|
rescue Exception
|
9
9
|
Log.e "Exception processing broadcast: #{$!.message}\n#{$!.backtrace.join("\n")}"
|
10
10
|
end
|
@@ -7,8 +7,8 @@ require 'ruboto/util/toast'
|
|
7
7
|
# online:
|
8
8
|
# http://developer.android.com/reference/android/app/Service.html
|
9
9
|
class SampleService
|
10
|
-
def
|
11
|
-
toast
|
10
|
+
def onStartCommand(intent, flags, startId)
|
11
|
+
toast 'Hello from the service'
|
12
12
|
android.app.Service::START_NOT_STICKY
|
13
13
|
end
|
14
14
|
end
|
@@ -31,6 +31,9 @@ public class THE_RUBOTO_CLASS THE_ACTION THE_ANDROID_CLASS {
|
|
31
31
|
public void onReceive(android.content.Context context, android.content.Intent intent) {
|
32
32
|
try {
|
33
33
|
Log.d("onReceive: " + this);
|
34
|
+
if (ScriptLoader.isCalledFromJRuby()) {
|
35
|
+
return;
|
36
|
+
}
|
34
37
|
if (!scriptLoaded) {
|
35
38
|
if (JRubyAdapter.setUpJRuby(context)) {
|
36
39
|
ScriptLoader.loadScript(this);
|
@@ -47,7 +50,13 @@ public class THE_RUBOTO_CLASS THE_ACTION THE_ANDROID_CLASS {
|
|
47
50
|
JRubyAdapter.put("$intent", intent);
|
48
51
|
JRubyAdapter.runScriptlet("$broadcast_receiver.on_receive($context, $intent)");
|
49
52
|
} else if (JRubyAdapter.isJRubyOneSeven()) {
|
53
|
+
// FIXME(uwe): Simplify when we stop support for snake case aliasing interface callback methods.
|
54
|
+
if ((Boolean)JRubyAdapter.runScriptlet(scriptInfo.getRubyClassName() + ".instance_methods(false).any?{|m| m.to_sym == :onReceive}")) {
|
55
|
+
JRubyAdapter.runRubyMethod(this, "onReceive", new Object[]{context, intent});
|
56
|
+
} else if ((Boolean)JRubyAdapter.runScriptlet(scriptInfo.getRubyClassName() + ".instance_methods(false).any?{|m| m.to_sym == :on_receive}")) {
|
50
57
|
JRubyAdapter.runRubyMethod(this, "on_receive", new Object[]{context, intent});
|
58
|
+
}
|
59
|
+
// EMXIF
|
51
60
|
} else {
|
52
61
|
throw new RuntimeException("Unknown JRuby version: " + JRubyAdapter.get("JRUBY_VERSION"));
|
53
62
|
}
|
@@ -18,7 +18,10 @@ public class EntryPointActivity extends org.ruboto.RubotoActivity {
|
|
18
18
|
private ProgressDialog loadingDialog;
|
19
19
|
private boolean dialogCancelled = false;
|
20
20
|
private BroadcastReceiver receiver;
|
21
|
+
|
22
|
+
// FIXME(uwe): Remove this field? Duplicated by ScriptInfo.isLoaded() ?
|
21
23
|
protected boolean appStarted = false;
|
24
|
+
// EMXIF
|
22
25
|
|
23
26
|
public void onCreate(Bundle bundle) {
|
24
27
|
Log.d("onCreate: ");
|
@@ -250,7 +250,7 @@ public class JRubyAdapter {
|
|
250
250
|
System.setProperty("jruby.objectspace.enabled", "false");
|
251
251
|
System.setProperty("jruby.thread.pooling", "true");
|
252
252
|
System.setProperty("jruby.native.enabled", "false");
|
253
|
-
// System.setProperty("jruby.compat.version", "
|
253
|
+
// System.setProperty("jruby.compat.version", "RUBY2_0"); // RUBY1_9 is the default in JRuby 1.7
|
254
254
|
System.setProperty("jruby.ir.passes", "LocalOptimizationPass,DeadCodeElimination");
|
255
255
|
System.setProperty("jruby.backtrace.style", "normal"); // normal raw full mri
|
256
256
|
|
@@ -305,6 +305,59 @@ public class JRubyAdapter {
|
|
305
305
|
}
|
306
306
|
|
307
307
|
try {
|
308
|
+
//////////////////////////////////
|
309
|
+
//
|
310
|
+
// Set jruby.home
|
311
|
+
//
|
312
|
+
|
313
|
+
String jrubyHome = "file:" + apkName + "!/jruby.home";
|
314
|
+
|
315
|
+
// FIXME(uwe): Remove when we stop supporting RubotoCore 0.4.7
|
316
|
+
Log.i("RUBOTO_CORE_VERSION_NAME: " + RUBOTO_CORE_VERSION_NAME);
|
317
|
+
if (RUBOTO_CORE_VERSION_NAME != null &&
|
318
|
+
(RUBOTO_CORE_VERSION_NAME.equals("0.4.7") || RUBOTO_CORE_VERSION_NAME.equals("0.4.8"))) {
|
319
|
+
jrubyHome = "file:" + apkName + "!";
|
320
|
+
}
|
321
|
+
// EMXIF
|
322
|
+
|
323
|
+
Log.i("Setting JRUBY_HOME: " + jrubyHome);
|
324
|
+
// This needs to be set before the ScriptingContainer is initialized
|
325
|
+
System.setProperty("jruby.home", jrubyHome);
|
326
|
+
|
327
|
+
//////////////////////////////////
|
328
|
+
//
|
329
|
+
// Determine Output
|
330
|
+
//
|
331
|
+
|
332
|
+
if (out != null) {
|
333
|
+
output = out;
|
334
|
+
}
|
335
|
+
|
336
|
+
//////////////////////////////////
|
337
|
+
//
|
338
|
+
// Disable rubygems
|
339
|
+
//
|
340
|
+
|
341
|
+
Class rubyClass = Class.forName("org.jruby.Ruby", true, scriptingContainerClass.getClassLoader());
|
342
|
+
Class rubyInstanceConfigClass = Class.forName("org.jruby.RubyInstanceConfig", true, scriptingContainerClass.getClassLoader());
|
343
|
+
|
344
|
+
Object config = rubyInstanceConfigClass.getConstructor().newInstance();
|
345
|
+
rubyInstanceConfigClass.getMethod("setDisableGems", boolean.class).invoke(config, true);
|
346
|
+
rubyInstanceConfigClass.getMethod("setLoader", ClassLoader.class).invoke(config, classLoader);
|
347
|
+
|
348
|
+
if (output != null) {
|
349
|
+
rubyInstanceConfigClass.getMethod("setOutput", PrintStream.class).invoke(config, output);
|
350
|
+
rubyInstanceConfigClass.getMethod("setError", PrintStream.class).invoke(config, output);
|
351
|
+
}
|
352
|
+
|
353
|
+
// This will become the global runtime and be used by our ScriptingContainer
|
354
|
+
rubyClass.getMethod("newInstance", rubyInstanceConfigClass).invoke(null, config);
|
355
|
+
|
356
|
+
//////////////////////////////////
|
357
|
+
//
|
358
|
+
// Create the ScriptingContainer
|
359
|
+
//
|
360
|
+
|
308
361
|
Class scopeClass = Class.forName("org.jruby.embed.LocalContextScope", true, scriptingContainerClass.getClassLoader());
|
309
362
|
Class behaviorClass = Class.forName("org.jruby.embed.LocalVariableBehavior", true, scriptingContainerClass.getClassLoader());
|
310
363
|
|
@@ -330,28 +383,8 @@ public class JRubyAdapter {
|
|
330
383
|
Log.e("Unable to find app files dir!");
|
331
384
|
}
|
332
385
|
|
333
|
-
if (out != null) {
|
334
|
-
output = out;
|
335
|
-
setOutputStream(out);
|
336
|
-
} else if (output != null) {
|
337
|
-
setOutputStream(output);
|
338
|
-
}
|
339
|
-
|
340
|
-
String jrubyHome = "file:" + apkName + "!/jruby.home";
|
341
|
-
|
342
|
-
// FIXME(uwe): Remove when we stop supporting RubotoCore 0.4.7
|
343
|
-
Log.i("RUBOTO_CORE_VERSION_NAME: " + RUBOTO_CORE_VERSION_NAME);
|
344
|
-
if (RUBOTO_CORE_VERSION_NAME != null &&
|
345
|
-
(RUBOTO_CORE_VERSION_NAME.equals("0.4.7") || RUBOTO_CORE_VERSION_NAME.equals("0.4.8"))) {
|
346
|
-
jrubyHome = "file:" + apkName + "!";
|
347
|
-
}
|
348
|
-
// EMXIF
|
349
|
-
|
350
|
-
Log.i("Setting JRUBY_HOME: " + jrubyHome);
|
351
|
-
System.setProperty("jruby.home", jrubyHome);
|
352
|
-
|
353
386
|
addLoadPath(scriptsDirName(appContext));
|
354
|
-
|
387
|
+
put("$package_name", appContext.getPackageName());
|
355
388
|
|
356
389
|
initialized = true;
|
357
390
|
} catch (ClassNotFoundException e) {
|
@@ -443,7 +476,8 @@ public class JRubyAdapter {
|
|
443
476
|
|
444
477
|
// FIXME(uwe): Remove when we stop supporting Ruby 1.8
|
445
478
|
@Deprecated public static boolean isRubyOneNine() {
|
446
|
-
|
479
|
+
String rv = ((String)get("RUBY_VERSION"));
|
480
|
+
return rv.startsWith("2.0.") || rv.startsWith("1.9.");
|
447
481
|
}
|
448
482
|
|
449
483
|
static void printStackTrace(Throwable t) {
|
@@ -76,12 +76,15 @@ public class ScriptLoader {
|
|
76
76
|
}
|
77
77
|
System.out.println("Set class: " + rubyClass);
|
78
78
|
JRubyAdapter.put(component.getScriptInfo().getRubyClassName(), rubyClass);
|
79
|
-
|
79
|
+
// FIXME(uwe): Collect these threads in a ThreadGroup ?
|
80
|
+
Thread t = new Thread(null, new Runnable(){
|
80
81
|
public void run() {
|
82
|
+
long loadStart = System.currentTimeMillis();
|
81
83
|
JRubyAdapter.setScriptFilename(rubyScript.getAbsolutePath());
|
82
84
|
JRubyAdapter.runScriptlet(script);
|
85
|
+
System.out.println("Script load took " + (System.currentTimeMillis() - loadStart) + "ms");
|
83
86
|
}
|
84
|
-
});
|
87
|
+
}, "ScriptLoader for " + rubyClass, 128 * 1024);
|
85
88
|
try {
|
86
89
|
t.start();
|
87
90
|
t.join();
|
@@ -15,7 +15,7 @@ require 'ruboto/package'
|
|
15
15
|
module Ruboto
|
16
16
|
module Context
|
17
17
|
def start_ruboto_dialog(remote_variable, theme=Java::android.R.style::Theme_Dialog, &block)
|
18
|
-
java_import
|
18
|
+
java_import 'org.ruboto.RubotoDialog'
|
19
19
|
start_ruboto_activity(remote_variable, RubotoDialog, theme, &block)
|
20
20
|
end
|
21
21
|
|
@@ -28,22 +28,21 @@ module Ruboto
|
|
28
28
|
else
|
29
29
|
options = {}
|
30
30
|
end
|
31
|
-
global_variable_name = nil
|
32
31
|
end
|
33
32
|
|
34
|
-
class_name = options[:class_name] || "#{klass.name.split('::').last}_#{source_descriptor(block)[0].split(
|
35
|
-
if
|
36
|
-
Object.const_set(class_name, Class.new(&block))
|
37
|
-
else
|
33
|
+
class_name = options[:class_name] || "#{klass.name.split('::').last}_#{source_descriptor(block)[0].split('/').last.gsub(/[.-]+/, '_')}_#{source_descriptor(block)[1]}"
|
34
|
+
if Object.const_defined?(class_name)
|
38
35
|
Object.const_get(class_name).class_eval(&block) if block_given?
|
36
|
+
else
|
37
|
+
Object.const_set(class_name, Class.new(&block))
|
39
38
|
end
|
40
39
|
b = Java::android.os.Bundle.new
|
41
|
-
b.putInt(
|
42
|
-
b.putString(
|
43
|
-
b.putString(
|
40
|
+
b.putInt('Theme', theme) if theme
|
41
|
+
b.putString('ClassName', class_name)
|
42
|
+
b.putString('Script', options[:script]) if options[:script]
|
44
43
|
i = android.content.Intent.new
|
45
44
|
i.setClass self, klass.java_class
|
46
|
-
i.putExtra(
|
45
|
+
i.putExtra('Ruboto Config', b)
|
47
46
|
startActivity i
|
48
47
|
self
|
49
48
|
end
|
@@ -61,7 +60,7 @@ module Ruboto
|
|
61
60
|
|
62
61
|
end
|
63
62
|
|
64
|
-
java_import
|
63
|
+
java_import 'android.content.Context'
|
65
64
|
Context.class_eval do
|
66
65
|
include Ruboto::Context
|
67
66
|
end
|
@@ -85,7 +84,7 @@ def ruboto_configure_activity(klass)
|
|
85
84
|
end
|
86
85
|
end
|
87
86
|
|
88
|
-
java_import
|
89
|
-
java_import
|
87
|
+
java_import 'android.app.Activity'
|
88
|
+
java_import 'org.ruboto.RubotoActivity'
|
90
89
|
ruboto_configure_activity(RubotoActivity)
|
91
90
|
|
data/assets/src/ruboto/base.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
$package
|
1
|
+
$package = eval("Java::#{$package_name}")
|
2
2
|
|
3
3
|
module Ruboto
|
4
4
|
java_import "#{$package_name}.R"
|
5
5
|
begin
|
6
6
|
Id = JavaUtilities.get_proxy_class("#{$package_name}.R$id")
|
7
7
|
rescue NameError
|
8
|
-
Java::android.util.Log.d
|
8
|
+
Java::android.util.Log.d 'RUBOTO', 'no R$id'
|
9
9
|
end
|
10
10
|
end
|
@@ -8,9 +8,9 @@
|
|
8
8
|
|
9
9
|
require 'ruboto/activity'
|
10
10
|
|
11
|
-
java_import
|
12
|
-
java_import
|
13
|
-
java_import
|
11
|
+
java_import 'android.preference.PreferenceScreen'
|
12
|
+
java_import 'android.preference.Preference'
|
13
|
+
java_import 'org.ruboto.RubotoPreferenceActivity'
|
14
14
|
ruboto_configure_activity(RubotoPreferenceActivity)
|
15
15
|
|
16
16
|
RubotoPreferenceActivity.class_eval do
|
@@ -49,7 +49,7 @@ def ruboto_import_preferences(*preferences)
|
|
49
49
|
preferences.each { |i| ruboto_import_preference i }
|
50
50
|
end
|
51
51
|
|
52
|
-
def ruboto_import_preference(class_name, package_name=
|
52
|
+
def ruboto_import_preference(class_name, package_name='android.preference')
|
53
53
|
klass = java_import("#{package_name}.#{class_name}") || eval("Java::#{package_name}.#{class_name}")
|
54
54
|
return unless klass
|
55
55
|
|
@@ -9,8 +9,8 @@ require 'ruboto/package'
|
|
9
9
|
#
|
10
10
|
#######################################################
|
11
11
|
|
12
|
-
java_import
|
13
|
-
java_import
|
12
|
+
java_import 'android.content.Context'
|
13
|
+
java_import 'org.ruboto.RubotoService'
|
14
14
|
|
15
15
|
module Ruboto
|
16
16
|
module Context
|
@@ -23,21 +23,20 @@ module Ruboto
|
|
23
23
|
else
|
24
24
|
options = {}
|
25
25
|
end
|
26
|
-
global_variable_name = nil
|
27
26
|
end
|
28
27
|
|
29
|
-
class_name = options[:class_name] || "#{klass.name.split('::').last}_#{source_descriptor(block)[0].split(
|
30
|
-
if
|
31
|
-
Object.const_set(class_name, Class.new(&block))
|
32
|
-
else
|
28
|
+
class_name = options[:class_name] || "#{klass.name.split('::').last}_#{source_descriptor(block)[0].split('/').last.gsub(/[.-]+/, '_')}_#{source_descriptor(block)[1]}"
|
29
|
+
if Object.const_defined?(class_name)
|
33
30
|
Object.const_get(class_name).class_eval(&block) if block_given?
|
31
|
+
else
|
32
|
+
Object.const_set(class_name, Class.new(&block))
|
34
33
|
end
|
35
34
|
b = Java::android.os.Bundle.new
|
36
|
-
b.putString(
|
37
|
-
b.putString(
|
35
|
+
b.putString('ClassName', class_name)
|
36
|
+
b.putString('Script', options[:script]) if options[:script]
|
38
37
|
i = android.content.Intent.new
|
39
38
|
i.setClass self, klass.java_class
|
40
|
-
i.putExtra(
|
39
|
+
i.putExtra('Ruboto Config', b)
|
41
40
|
self.startService i
|
42
41
|
self
|
43
42
|
end
|