ruboto 0.5.2 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|