ruboto 0.5.2 → 0.5.3

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 (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,84 @@
1
+ require 'ruboto/base'
2
+
3
+ #######################################################
4
+ #
5
+ # ruboto/activity.rb
6
+ #
7
+ # Basic activity 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_dialog(remote_variable, theme=Java::android.R.style::Theme_Dialog, &block)
30
+ ruboto_import "org.ruboto.RubotoDialog"
31
+ start_ruboto_activity(remote_variable, RubotoDialog, theme, &block)
32
+ end
33
+
34
+ def start_ruboto_activity(global_variable_name, klass=RubotoActivity, theme=nil, &block)
35
+ $context_init_block = block
36
+ $new_context_global = global_variable_name
37
+
38
+ if @initialized or (self == $activity && !$activity.kind_of?(RubotoActivity))
39
+ b = Java::android.os.Bundle.new
40
+ b.putInt("Theme", theme) if theme
41
+
42
+ i = Java::android.content.Intent.new
43
+ i.setClass self, klass.java_class
44
+ i.putExtra("RubotoActivity Config", b)
45
+
46
+ self.startActivity i
47
+ else
48
+ initialize_ruboto
49
+ on_create nil
50
+ end
51
+
52
+ self
53
+ end
54
+ end
55
+ end
56
+
57
+ java_import "android.content.Context"
58
+ Context.class_eval do
59
+ include Ruboto::Context
60
+ end
61
+
62
+ #
63
+ # Basic Activity Setup
64
+ #
65
+
66
+ module Ruboto
67
+ module Activity
68
+ end
69
+ end
70
+
71
+ def ruboto_configure_activity(klass)
72
+ klass.class_eval do
73
+ include Ruboto::Activity
74
+
75
+ # Can't be moved into the module
76
+ def on_create(bundle)
77
+ end
78
+ end
79
+ end
80
+
81
+ java_import "android.app.Activity"
82
+ ruboto_import "org.ruboto.RubotoActivity"
83
+ ruboto_configure_activity(RubotoActivity)
84
+
@@ -0,0 +1,88 @@
1
+ #######################################################
2
+ #
3
+ # ruboto/base.rb
4
+ #
5
+ # Code shared by other ruboto components.
6
+ #
7
+ #######################################################
8
+
9
+ # Only used needed for ruboto-core apps
10
+ require 'ruboto/version'
11
+ $RUBOTO_VERSION = 10
12
+
13
+ def confirm_ruboto_version(required_version, exact=true)
14
+ raise "requires $RUBOTO_VERSION=#{required_version} or greater, current version #{$RUBOTO_VERSION}" if $RUBOTO_VERSION < required_version and not exact
15
+ raise "requires $RUBOTO_VERSION=#{required_version}, current version #{$RUBOTO_VERSION}" if $RUBOTO_VERSION != required_version and exact
16
+ end
17
+
18
+ require 'java'
19
+
20
+ $package_name = ($activity || $service || $broadcast_receiver).package_name
21
+ $package = eval("Java::#{$package_name}")
22
+
23
+ # Create convenience method for top-level android package so we do not need to prefix with 'Java::'.
24
+ module Kernel
25
+ def android
26
+ JavaUtilities.get_package_module_dot_format('android')
27
+ end
28
+ end
29
+
30
+ java_import "android.R"
31
+
32
+ module Ruboto
33
+ java_import "#{$package_name}.R"
34
+ begin
35
+ Id = JavaUtilities.get_proxy_class("#{$package_name}.R$id")
36
+ rescue NameError
37
+ Java::android.util.Log.d "RUBOTO", "no R$id"
38
+ end
39
+ end
40
+ AndroidIds = JavaUtilities.get_proxy_class("android.R$id")
41
+
42
+ #
43
+ # Callbacks
44
+ #
45
+
46
+ module Ruboto
47
+ module CallbackClass
48
+ def new_with_callbacks &block
49
+ new.initialize_ruboto_callbacks &block
50
+ end
51
+ end
52
+
53
+ module Callbacks
54
+ def initialize_ruboto_callbacks &block
55
+ instance_eval &block
56
+ setup_ruboto_callbacks
57
+ self
58
+ end
59
+
60
+ def ruboto_callback_methods
61
+ (singleton_methods - ["on_create", "on_receive"]).select{|i| i =~ /^on_/}
62
+ end
63
+
64
+ def setup_ruboto_callbacks
65
+ ruboto_callback_methods.each do |i|
66
+ begin
67
+ setCallbackProc(self.class.const_get(i.sub(/^on_/, "CB_").upcase), method(i))
68
+ rescue
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ #
76
+ # Import a class and set it up for handlers
77
+ #
78
+
79
+ def ruboto_import(package_class)
80
+ klass = java_import(package_class) || eval("Java::#{package_class}")
81
+ return unless klass
82
+
83
+ klass.class_eval do
84
+ extend Ruboto::CallbackClass
85
+ include Ruboto::Callbacks
86
+ end
87
+ end
88
+
@@ -0,0 +1,31 @@
1
+ #######################################################
2
+ #
3
+ # ruboto/broadcast_receiver.rb
4
+ #
5
+ # Basic broadcast_receiver set up and callback configuration.
6
+ #
7
+ #######################################################
8
+
9
+ require 'ruboto/base'
10
+
11
+ ruboto_import "org.ruboto.RubotoBroadcastReceiver"
12
+ RubotoBroadcastReceiver.class_eval do
13
+ def self.new_with_callbacks &block
14
+ (($broadcast_receiver.nil? || $broadcast_receiver.initialized) ? new : $broadcast_receiver).initialize_ruboto_callbacks &block
15
+ end
16
+
17
+ def initialized
18
+ @initialized ||= false
19
+ end
20
+
21
+ def initialize_ruboto_callbacks &block
22
+ instance_eval &block
23
+ setup_ruboto_callbacks
24
+ @initialized = true
25
+ self
26
+ end
27
+
28
+ def on_receive(context, intent)
29
+ end
30
+ end
31
+
@@ -0,0 +1,223 @@
1
+ require 'ruboto/activity'
2
+
3
+ #######################################################
4
+ #
5
+ # ruboto/legacy.rb
6
+ #
7
+ # Required for backwards compatibility. The goal
8
+ # should be to run scripts without this.
9
+ #
10
+ #######################################################
11
+
12
+ #
13
+ # Old handle methods
14
+ #
15
+
16
+ module Ruboto
17
+ module Callbacks
18
+ def method_missing(name, *args, &block)
19
+ if name.to_s =~ /^handle_(.*)/ and (const = self.class.const_get("CB_#{$1.upcase}"))
20
+ setCallbackProc(const, block)
21
+ self
22
+ else
23
+ super
24
+ end
25
+ end
26
+
27
+ def respond_to?(name)
28
+ return true if name.to_s =~ /^handle_(.*)/ and self.class.const_get("CB_#{$1.upcase}")
29
+ super
30
+ end
31
+
32
+ def initialize_handlers(&block)
33
+ instance_eval &block
34
+ self
35
+ end
36
+ end
37
+ end
38
+
39
+ #
40
+ # Old handle_create for Activities
41
+ #
42
+
43
+ module Ruboto
44
+ module Activity
45
+ def handle_finish_create &block
46
+ @finish_create_block = block
47
+ end
48
+
49
+ def setup_content &block
50
+ @view_parent = nil
51
+ @content_view_block = block
52
+ end
53
+
54
+ def handle_create(&block)
55
+ $new_context_global = "$activity"
56
+ instance_exec &block
57
+ initialize_ruboto
58
+ on_create nil
59
+ end
60
+ end
61
+ end
62
+
63
+ RubotoActivity.class_eval do
64
+ def on_create(bundle)
65
+ @view_parent = nil
66
+ setContentView(instance_eval &@content_view_block) if @content_view_block
67
+ instance_eval { @finish_create_block.call } if @finish_create_block
68
+ end
69
+ end
70
+
71
+ #
72
+ # Allow IRB legacy
73
+ #
74
+
75
+ if $package_name == "org.ruboto.irb"
76
+ Java::org.ruboto.irb.IRB.class_eval do
77
+ def handle_create(&block)
78
+ start_ruboto_activity "$activity", RubotoActivity, nil, &block
79
+ end
80
+ end
81
+ end
82
+
83
+ #
84
+ # Legacy Service Subclass Setup
85
+ #
86
+
87
+ module Ruboto
88
+ module Service
89
+ def handle_create(&block)
90
+ $new_context_global = "$service"
91
+ instance_exec &block
92
+ initialize_ruboto
93
+ on_create
94
+ end
95
+ end
96
+ end
97
+
98
+ #
99
+ # Legacy BroadcastReceiver Subclass Setup
100
+ #
101
+
102
+ module Ruboto
103
+ module BroadcastReceiver
104
+ def handle_receive(&block)
105
+ instance_exec &block
106
+ on_receive($context, nil)
107
+ end
108
+ end
109
+ end
110
+
111
+ #
112
+ # Allows RubotoActivity to handle callbacks covering Class based handlers
113
+ #
114
+
115
+ def ruboto_register_handler(handler_class, unique_name, for_class, method_name)
116
+ klass_name = handler_class[/.+\.([A-Z].+)/, 1]
117
+ klass = ruboto_import handler_class
118
+
119
+ unless RubotoActivity.method_defined? "#{unique_name}_handler"
120
+ RubotoActivity.class_eval "
121
+ def #{unique_name}_handler
122
+ @#{unique_name}_handler ||= #{klass_name}.new
123
+ end
124
+
125
+ def handle_#{unique_name}(&block)
126
+ #{unique_name}_handler.handle_#{unique_name} &block
127
+ self
128
+ end
129
+ "
130
+ end
131
+
132
+ unless for_class.method_defined? "orig_#{method_name}"
133
+ for_class.class_eval "
134
+ alias_method :orig_#{method_name}, :#{method_name}
135
+ def #{method_name}(handler)
136
+ orig_#{method_name}(handler.kind_of?(RubotoActivity) ? handler.#{unique_name}_handler : handler)
137
+ end
138
+ "
139
+ end
140
+ end
141
+
142
+ def setup_button
143
+ Button.class_eval do
144
+ def configure(context, params = {})
145
+ setOnClickListener(context)
146
+ super(context, params)
147
+ end
148
+ end
149
+
150
+ ruboto_register_handler("org.ruboto.callbacks.RubotoOnClickListener", "click", Button, "setOnClickListener")
151
+ end
152
+
153
+ def setup_image_button
154
+ ImageButton.class_eval do
155
+ def configure(context, params = {})
156
+ setOnClickListener(context)
157
+ super(context, params)
158
+ end
159
+ end
160
+
161
+ ruboto_register_handler("org.ruboto.callbacks.RubotoOnClickListener", "click", ImageButton, "setOnClickListener")
162
+ end
163
+
164
+ def setup_list_view
165
+ Java::android.widget.ListView.class_eval do
166
+ attr_reader :adapter, :adapter_list
167
+
168
+ def configure(context, params = {})
169
+ if params.has_key? :list
170
+ @adapter_list = Java::java.util.ArrayList.new
171
+ @adapter_list.addAll(params[:list])
172
+ item_layout = params.delete(:item_layout) || R::layout::simple_list_item_1
173
+ @adapter = Java::android.widget.ArrayAdapter.new(context, item_layout, @adapter_list)
174
+ setAdapter @adapter
175
+ params.delete :list
176
+ end
177
+ if params.has_key? :adapter
178
+ @adapter = params[:adapter]
179
+ end
180
+ setOnItemClickListener(context) # legacy
181
+ super(context, params)
182
+ end
183
+
184
+ def reload_list(list)
185
+ @adapter_list.clear
186
+ @adapter_list.addAll(list)
187
+ @adapter.notifyDataSetChanged
188
+ invalidate
189
+ end
190
+ end
191
+
192
+ ruboto_register_handler("org.ruboto.callbacks.RubotoOnItemClickListener", "item_click", Java::android.widget.ListView, "setOnItemClickListener") # legacy
193
+ end
194
+
195
+ def setup_spinner
196
+ Java::android.widget.Spinner.class_eval do
197
+ attr_reader :adapter, :adapter_list
198
+
199
+ def configure(context, params = {})
200
+ if params.has_key? :list
201
+ @adapter_list = Java::java.util.ArrayList.new
202
+ @adapter_list.addAll(params[:list])
203
+ item_layout = params.delete(:item_layout) || R::layout::simple_spinner_item
204
+ @adapter = Java::android.widget.ArrayAdapter.new(context, item_layout, @adapter_list)
205
+ @adapter.setDropDownViewResource(params.delete(:dropdown_layout) || R::layout::simple_spinner_dropdown_item)
206
+ setAdapter @adapter
207
+ params.delete :list
208
+ end
209
+ setOnItemSelectedListener(context) # legacy
210
+ super(context, params)
211
+ end
212
+
213
+ def reload_list(list)
214
+ @adapter.clear
215
+ @adapter.addAll(list)
216
+ @adapter.notifyDataSetChanged
217
+ invalidate
218
+ end
219
+ end
220
+
221
+ ruboto_register_handler("org.ruboto.callbacks.RubotoOnItemSelectedListener", "item_selected", Java::android.widget.Spinner, "setOnItemSelectedListener") # legacy
222
+ end
223
+
@@ -0,0 +1,89 @@
1
+ require 'ruboto/activity'
2
+
3
+ #######################################################
4
+ #
5
+ # ruboto/menu.rb
6
+ #
7
+ # Make using menus a little easier. This is still using
8
+ # handle methods and may be moved into legacy code.
9
+ #
10
+ #######################################################
11
+
12
+ module Ruboto
13
+ module Activity
14
+ #
15
+ # Option Menus
16
+ #
17
+ def add_menu title, icon=nil, &block
18
+ mi = @menu.add(title)
19
+ mi.setIcon(icon) if icon
20
+ mi.class.class_eval { attr_accessor :on_click }
21
+ mi.on_click = block
22
+
23
+ # Seems to be needed or the block might get cleaned up
24
+ @all_menu_items = [] unless @all_menu_items
25
+ @all_menu_items << mi
26
+ end
27
+
28
+ def handle_create_options_menu &block
29
+ p = Proc.new do |*args|
30
+ @menu = args[0]
31
+ instance_eval { block.call(*args) } if block
32
+ end
33
+ setCallbackProc(self.class.const_get("CB_CREATE_OPTIONS_MENU"), p)
34
+
35
+ p = Proc.new do |num, menu_item|
36
+ # handles a problem where this is called for context items
37
+ # TODO(uwe): JRUBY-5866 JRuby can't access nested Java class if the class is called 'id'
38
+ # TODO(uwe): Remove check for SDK version when we stop supporting api level < 11
39
+ unless @just_processed_context_item == menu_item || (android.os.Build::VERSION::SDK_INT >= 11 && menu_item.item_id == AndroidIds.home)
40
+ instance_eval &(menu_item.on_click)
41
+ @just_processed_context_item = nil
42
+ true
43
+ else
44
+ false
45
+ end
46
+ end
47
+ setCallbackProc(self.class.const_get("CB_MENU_ITEM_SELECTED"), p)
48
+ end
49
+
50
+ #
51
+ # Context Menus
52
+ #
53
+
54
+ def add_context_menu title, &block
55
+ mi = @context_menu.add(title)
56
+ mi.class.class_eval { attr_accessor :on_click }
57
+ mi.on_click = block
58
+
59
+ # Seems to be needed or the block might get cleaned up
60
+ @all_menu_items = [] unless @all_menu_items
61
+ @all_menu_items << mi
62
+ end
63
+
64
+ def handle_create_context_menu &block
65
+ p = Proc.new do |*args|
66
+ @context_menu = args[0]
67
+ instance_eval { block.call(*args) } if block
68
+ end
69
+ setCallbackProc(self.class.const_get("CB_CREATE_CONTEXT_MENU"), p)
70
+
71
+ p = Proc.new do |menu_item|
72
+ if menu_item.on_click
73
+ arg = menu_item
74
+ begin
75
+ arg = menu_item.getMenuInfo.position
76
+ rescue
77
+ end
78
+ instance_eval { menu_item.on_click.call(arg) }
79
+ @just_processed_context_item = menu_item
80
+ true
81
+ else
82
+ false
83
+ end
84
+ end
85
+ setCallbackProc(self.class.const_get("CB_CONTEXT_ITEM_SELECTED"), p)
86
+ end
87
+ end
88
+ end
89
+