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,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
+