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
@@ -0,0 +1,78 @@
1
+ #######################################################
2
+ #
3
+ # ruboto/preference.rb
4
+ #
5
+ # Basic set up for preferences (activity and widgets).
6
+ #
7
+ #######################################################
8
+
9
+ require 'ruboto/activity'
10
+
11
+ java_import "android.preference.PreferenceScreen"
12
+ java_import "android.preference.Preference"
13
+ ruboto_import "org.ruboto.RubotoPreferenceActivity"
14
+ ruboto_configure_activity(RubotoPreferenceActivity)
15
+
16
+ RubotoPreferenceActivity.class_eval do
17
+ def preference_screen(params={})
18
+ rv = self.getPreferenceManager.createPreferenceScreen(self)
19
+ rv.configure self, params
20
+ @parent.addPreference(rv) if @parent
21
+ if block_given?
22
+ old_parent, @parent = @parent, rv
23
+ yield
24
+ @parent = old_parent
25
+ end
26
+ rv
27
+ end
28
+
29
+ def setup_preference_screen &block
30
+ @preference_screen_block = block
31
+ end
32
+
33
+ def on_create(bundle)
34
+ @parent = nil
35
+ setPreferenceScreen(instance_eval &@preference_screen_block) if @preference_screen_block
36
+ instance_eval { @finish_create_block.call } if @finish_create_block
37
+ end
38
+ end
39
+
40
+ Preference.class_eval do
41
+ def configure(context, params = {})
42
+ params.each do |k, v|
43
+ if v.is_a?(Array)
44
+ self.send("set#{k.to_s.gsub(/(^|_)([a-z])/) { $2.upcase }}", *v)
45
+ else
46
+ self.send("set#{k.to_s.gsub(/(^|_)([a-z])/) { $2.upcase }}", v)
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ #
53
+ # RubotoPreferenceActivity Preference Generation
54
+ #
55
+
56
+ def ruboto_import_preferences(*preferences)
57
+ preferences.each { |i| ruboto_import_preference i }
58
+ end
59
+
60
+ def ruboto_import_preference(class_name, package_name="android.preference")
61
+ klass = java_import("#{package_name}.#{class_name}") || eval("Java::#{package_name}.#{class_name}")
62
+ return unless klass
63
+
64
+ RubotoPreferenceActivity.class_eval "
65
+ def #{(class_name.to_s.gsub(/([A-Z])/) { '_' + $1.downcase })[1..-1]}(params={})
66
+ rv = #{class_name}.new self
67
+ rv.configure self, params
68
+ @parent.addPreference(rv) if @parent
69
+ if block_given?
70
+ old_parent, @parent = @parent, rv
71
+ yield
72
+ @parent = old_parent
73
+ end
74
+ rv
75
+ end
76
+ "
77
+ end
78
+
@@ -0,0 +1,74 @@
1
+ require 'ruboto/base'
2
+
3
+ #######################################################
4
+ #
5
+ # ruboto/service.rb
6
+ #
7
+ # Basic service set up and callback configuration.
8
+ #
9
+ #######################################################
10
+
11
+ #
12
+ # Context
13
+ #
14
+
15
+ module Ruboto
16
+ module Context
17
+ def initialize_ruboto()
18
+ eval("#{$new_context_global} = self")
19
+ $new_context_global = nil
20
+
21
+ instance_eval &$context_init_block if $context_init_block
22
+ $context_init_block = nil
23
+ setup_ruboto_callbacks
24
+
25
+ @initialized = true
26
+ self
27
+ end
28
+
29
+ def start_ruboto_service(global_variable_name = '$service', klass=RubotoService, &block)
30
+ $context_init_block = block
31
+ $new_context_global = global_variable_name
32
+
33
+ if @initialized or (self == $service) or ($service == nil) # FIx mix between activity and service
34
+ self.startService Java::android.content.Intent.new(self, klass.java_class)
35
+ else
36
+ initialize_ruboto
37
+ on_create
38
+ end
39
+
40
+ self
41
+ end
42
+ end
43
+ end
44
+
45
+ java_import "android.content.Context"
46
+ Context.class_eval do
47
+ include Ruboto::Context
48
+ end
49
+
50
+ #
51
+ # Leave for legacy Service Subclass Setup
52
+ #
53
+
54
+ module Ruboto
55
+ module Service
56
+ end
57
+ end
58
+
59
+ #
60
+ # Basic Service Setup
61
+ #
62
+
63
+ def ruboto_configure_service(klass)
64
+ klass.class_eval do
65
+ include Ruboto::Service
66
+
67
+ def on_create
68
+ end
69
+ end
70
+ end
71
+
72
+ ruboto_import "org.ruboto.RubotoService"
73
+ ruboto_configure_service(RubotoService)
74
+
@@ -0,0 +1,34 @@
1
+ #######################################################
2
+ #
3
+ # ruboto/util/stack.rb
4
+ #
5
+ # Utility methods for running code in a separate
6
+ # thread with a larger stack.
7
+ #
8
+ #######################################################
9
+
10
+ class Object
11
+ def with_large_stack(opts = {}, &block)
12
+ opts = {:size => opts} if opts.is_a? Integer
13
+ opts = {:name => 'Block with large stack'}.update(opts)
14
+ exception = nil
15
+ result = nil
16
+ t = Thread.with_large_stack(opts, &proc{result = block.call rescue exception = $!})
17
+ t.join
18
+ raise exception if exception
19
+ result
20
+ end
21
+ end
22
+
23
+ class Thread
24
+ def self.with_large_stack(opts = {}, &block)
25
+ opts = {:size => opts} if opts.is_a? Integer
26
+ stack_size_kb = opts.delete(:size) || 64
27
+ name = opts.delete(:name) || "Thread with large stack"
28
+ raise "Unknown option(s): #{opts.inspect}" unless opts.empty?
29
+ t = java.lang.Thread.new(nil, block, name, stack_size_kb * 1024)
30
+ t.start
31
+ t
32
+ end
33
+ end
34
+
@@ -0,0 +1,18 @@
1
+ #######################################################
2
+ #
3
+ # ruboto/util/toast.rb
4
+ #
5
+ # Utility methods for doing a toast.
6
+ #
7
+ #######################################################
8
+
9
+ Java::android.content.Context.class_eval do
10
+ def toast(text, duration=5000)
11
+ Java::android.widget.Toast.makeText(self, text, duration).show
12
+ end
13
+
14
+ def toast_result(result, success, failure, duration=5000)
15
+ toast(result ? success : failure, duration)
16
+ end
17
+ end
18
+
@@ -0,0 +1,188 @@
1
+ require 'ruboto/activity'
2
+
3
+ #######################################################
4
+ #
5
+ # ruboto/widget.rb
6
+ #
7
+ # Import widgets and set up methods on activity to
8
+ # create and initialize. You do not need this if
9
+ # you want to call the Android methods directly.
10
+ #
11
+ #######################################################
12
+
13
+ #
14
+ # Prepare View
15
+ #
16
+
17
+ java_import "android.view.View"
18
+
19
+ View.class_eval do
20
+ @@convert_constants ||= {}
21
+
22
+ def self.add_constant_conversion(from, to)
23
+ @@convert_constants[from] = to
24
+ end
25
+
26
+ def self.convert_constant(from)
27
+ @@convert_constants[from] or from
28
+ end
29
+
30
+ def self.setup_constant_conversion
31
+ (self.constants - self.superclass.constants).each do |i|
32
+ View.add_constant_conversion i.downcase.to_sym, self.const_get(i)
33
+ end
34
+ end
35
+
36
+ def configure(context, params = {})
37
+ if width = params.delete(:width)
38
+ getLayoutParams.width = View.convert_constant(width)
39
+ end
40
+
41
+ if height = params.delete(:height)
42
+ getLayoutParams.height = View.convert_constant(height)
43
+ end
44
+
45
+ if layout = params.delete(:layout)
46
+ lp = getLayoutParams
47
+ layout.each do |k, v|
48
+ values = (v.is_a?(Array) ? v : [v]).map { |i| @@convert_constants[i] or i }
49
+ lp.send("#{k.to_s.gsub(/_([a-z])/) { $1.upcase }}", *values)
50
+ end
51
+ end
52
+
53
+ params.each do |k, v|
54
+ values = (v.is_a?(Array) ? v : [v]).map { |i| @@convert_constants[i] or i }
55
+ self.send("set#{k.to_s.gsub(/(^|_)([a-z])/) { $2.upcase }}", *values)
56
+ end
57
+ end
58
+ end
59
+
60
+ #
61
+ # Load ViewGroup constants
62
+ #
63
+
64
+ java_import "android.view.ViewGroup"
65
+ View.add_constant_conversion :wrap_content, ViewGroup::LayoutParams::WRAP_CONTENT
66
+ View.add_constant_conversion :fill_parent, ViewGroup::LayoutParams::FILL_PARENT
67
+
68
+ #
69
+ # RubotoActivity View Generation
70
+ #
71
+
72
+ def ruboto_import_widgets(*widgets)
73
+ widgets.each { |i| ruboto_import_widget i }
74
+ end
75
+
76
+ def ruboto_import_widget(class_name, package_name="android.widget")
77
+ klass = java_import("#{package_name}.#{class_name}") || eval("Java::#{package_name}.#{class_name}")
78
+
79
+ return unless klass
80
+
81
+ RubotoActivity.class_eval "
82
+ def #{(class_name.to_s.gsub(/([A-Z])/) { '_' + $1.downcase })[1..-1]}(params={})
83
+ if force_style = params.delete(:default_style)
84
+ rv = #{class_name}.new(self, nil, force_style)
85
+ elsif api_key = params.delete(:apiKey)
86
+ rv = #{class_name}.new(self, api_key)
87
+ else
88
+ rv = #{class_name}.new(self)
89
+ end
90
+
91
+ if parent = (params.delete(:parent) || @view_parent)
92
+ parent.addView(rv, (params.delete(:parent_index) || parent.child_count))
93
+ end
94
+
95
+ rv.configure self, params
96
+
97
+ return rv unless block_given?
98
+
99
+ old_view_parent, @view_parent = @view_parent, rv
100
+ yield
101
+ @view_parent = old_view_parent
102
+
103
+ rv
104
+ end
105
+ "
106
+
107
+ setup_list_view if class_name == :ListView
108
+ setup_spinner if class_name == :Spinner
109
+ setup_button if class_name == :Button
110
+ setup_image_button if class_name == :ImageButton
111
+ setup_linear_layout if class_name == :LinearLayout
112
+ setup_relative_layout if class_name == :RelativeLayout
113
+ end
114
+
115
+ #
116
+ # Special widget setup
117
+ #
118
+
119
+ def setup_linear_layout
120
+ Java::android.widget.LinearLayout.setup_constant_conversion
121
+ end
122
+
123
+ def setup_relative_layout
124
+ Java::android.widget.RelativeLayout.setup_constant_conversion
125
+ end
126
+
127
+ def setup_button
128
+ # legacy
129
+ end
130
+
131
+ def setup_image_button
132
+ # legacy
133
+ end
134
+
135
+ def setup_list_view
136
+ Java::android.widget.ListView.class_eval do
137
+ attr_reader :adapter, :adapter_list
138
+
139
+ def configure(context, params = {})
140
+ if params.has_key? :list
141
+ @adapter_list = Java::java.util.ArrayList.new
142
+ @adapter_list.addAll(params[:list])
143
+ item_layout = params.delete(:item_layout) || R::layout::simple_list_item_1
144
+ @adapter = Java::android.widget.ArrayAdapter.new(context, item_layout, @adapter_list)
145
+ setAdapter @adapter
146
+ params.delete :list
147
+ end
148
+ if params.has_key? :adapter
149
+ @adapter = params[:adapter]
150
+ end
151
+ super(context, params)
152
+ end
153
+
154
+ def reload_list(list)
155
+ @adapter_list.clear
156
+ @adapter_list.addAll(list)
157
+ @adapter.notifyDataSetChanged
158
+ invalidate
159
+ end
160
+ end
161
+ end
162
+
163
+ def setup_spinner
164
+ Java::android.widget.Spinner.class_eval do
165
+ attr_reader :adapter, :adapter_list
166
+
167
+ def configure(context, params = {})
168
+ if params.has_key? :list
169
+ @adapter_list = Java::java.util.ArrayList.new
170
+ @adapter_list.addAll(params[:list])
171
+ item_layout = params.delete(:item_layout) || R::layout::simple_spinner_item
172
+ @adapter = Java::android.widget.ArrayAdapter.new(context, item_layout, @adapter_list)
173
+ @adapter.setDropDownViewResource(params.delete(:dropdown_layout) || R::layout::simple_spinner_dropdown_item)
174
+ setAdapter @adapter
175
+ params.delete :list
176
+ end
177
+ super(context, params)
178
+ end
179
+
180
+ def reload_list(list)
181
+ @adapter.clear
182
+ @adapter.addAll(list)
183
+ @adapter.notifyDataSetChanged
184
+ invalidate
185
+ end
186
+ end
187
+ end
188
+
@@ -11,3 +11,7 @@ end
11
11
  def assert_less_than_or_equal(limit, actual, message = nil)
12
12
  raise "#{"#{message}\n" if message}Expected '#{actual}' to be less than or equal to '#{limit}'" unless actual <= limit
13
13
  end
14
+
15
+ def assert_matches(pattern, actual, message = nil)
16
+ raise "#{"#{message}\n" if message}'#{pattern}' expected, but got '#{actual}'" unless pattern =~ actual
17
+ end
data/bin/ruboto CHANGED
@@ -1,4 +1,11 @@
1
1
  #!/usr/bin/env ruby
2
+
3
+ `android list`
4
+ if $? != 0
5
+ puts "Android SDK not in path"
6
+ exit 1
7
+ end
8
+
2
9
  require 'ruboto/commands/base'
3
10
 
4
11
  # Run Base, which will handle actual commands
@@ -55,10 +55,6 @@ module Ruboto
55
55
  description "Generate the JRuby jars jar"
56
56
  cast :boolean
57
57
  }
58
- option("with-psych") {
59
- description "Generate the Psych YAML parser jar"
60
- cast :boolean
61
- }
62
58
 
63
59
  def run
64
60
  package = params['package'].value
@@ -94,7 +90,7 @@ module Ruboto
94
90
  update_ruboto true
95
91
  update_icons true
96
92
  update_classes true
97
- update_jruby true, params['with-psych'].value if params['with-jruby'].value || params['with-psych'].value
93
+ update_jruby true if params['with-jruby'].value
98
94
  # update_build_xml
99
95
  update_manifest min_sdk[/\d+/], target[/\d+/], true
100
96
  update_core_classes "exclude"
@@ -114,14 +110,9 @@ module Ruboto
114
110
  include Ruboto::Util::Update
115
111
  include Ruboto::Util::Verify
116
112
 
117
- option("with-psych") {
118
- description "Generate the Psych YAML parser jar"
119
- cast :boolean
120
- }
121
-
122
113
  def run
123
114
  Dir.chdir root do
124
- update_jruby true, params['with-psych'].value
115
+ update_jruby true
125
116
  end
126
117
  end
127
118
  end
@@ -332,11 +323,6 @@ module Ruboto
332
323
  description "force and update even if the version hasn't changed"
333
324
  }
334
325
 
335
- option("with-psych") {
336
- description "Generate the Psych YAML parser jar"
337
- cast :boolean
338
- }
339
-
340
326
  def run
341
327
  case params['what'].value
342
328
  when "app" then
@@ -347,12 +333,12 @@ module Ruboto
347
333
  update_ruboto force
348
334
  update_icons force
349
335
  update_classes force
350
- update_jruby force, params['with-psych'].value
336
+ update_jruby force
351
337
  update_manifest nil, nil, force
352
338
  update_core_classes "exclude"
353
339
  update_bundle
354
340
  when "jruby" then
355
- update_jruby(params['force'].value, params['with-psych'].value) || abort
341
+ update_jruby(params['force'].value) || abort
356
342
  when "ruboto" then
357
343
  update_ruboto(params['force'].value) || abort
358
344
  end