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.
- data/Gemfile.lock +5 -5
- data/README.md +2 -2
- data/Rakefile +5 -6
- data/assets/Rakefile +32 -11
- data/assets/res/drawable/get_ruboto_core.png +0 -0
- data/assets/res/layout/get_ruboto_core.xml +1 -1
- data/assets/samples/sample_activity.rb +13 -11
- data/assets/samples/sample_broadcast_receiver.rb +6 -3
- data/assets/samples/sample_service.rb +10 -7
- data/assets/src/InheritingActivity.java +1 -186
- data/assets/src/RubotoActivity.java +9 -11
- data/assets/src/RubotoBroadcastReceiver.java +34 -27
- data/assets/src/RubotoService.java +9 -2
- data/assets/src/org/ruboto/EntryPointActivity.java +194 -0
- data/assets/src/org/ruboto/Script.java +29 -15
- data/assets/src/org/ruboto/test/InstrumentationTestRunner.java +17 -16
- data/assets/src/ruboto.rb +11 -608
- data/assets/src/ruboto/activity.rb +84 -0
- data/assets/src/ruboto/base.rb +88 -0
- data/assets/src/ruboto/broadcast_receiver.rb +31 -0
- data/assets/src/ruboto/legacy.rb +223 -0
- data/assets/src/ruboto/menu.rb +89 -0
- data/assets/src/ruboto/preference.rb +78 -0
- data/assets/src/ruboto/service.rb +74 -0
- data/assets/src/ruboto/util/stack.rb +34 -0
- data/assets/src/ruboto/util/toast.rb +18 -0
- data/assets/src/ruboto/widget.rb +188 -0
- data/assets/test/{assets/scripts → src}/test_helper.rb +4 -0
- data/bin/ruboto +7 -0
- data/lib/ruboto/commands/base.rb +4 -18
- data/lib/ruboto/util/build.rb +1 -2
- data/lib/ruboto/util/update.rb +77 -70
- data/lib/ruboto/version.rb +1 -1
- data/test/activity/psych_activity.rb +25 -0
- data/test/activity/psych_activity_test.rb +16 -0
- data/test/activity/stack_activity_test.rb +1 -1
- data/test/app_test_methods.rb +8 -4
- data/test/minimal_app_test.rb +6 -3
- data/test/rake_test.rb +1 -1
- data/test/ruboto_gen_test.rb +10 -1
- data/test/test_helper.rb +3 -5
- data/test/update_test_methods.rb +2 -2
- metadata +20 -8
- data/test/ruboto_gen_with_psych_test.rb +0 -16
- 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
|
+
|