droiuby 0.1.6 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/droiuby.rb +1 -1
- data/lib/droiuby/android.rb +59 -0
- data/lib/droiuby/application.rb +30 -0
- data/lib/droiuby/bootstrap.rb +263 -0
- data/lib/droiuby/droiuby.rb +47 -0
- data/lib/droiuby/loader.rb +36 -0
- data/lib/droiuby/plugins/plugins.rb +25 -0
- data/lib/droiuby/preload.rb +29 -0
- data/lib/droiuby/{project.rb → scripts/project.rb} +15 -6
- data/lib/droiuby/scripts/templates/ruby/Gemfile.erb +3 -0
- data/lib/droiuby/{templates → scripts/templates}/ruby/application.css.erb +0 -0
- data/lib/droiuby/{templates → scripts/templates}/ruby/config.droiuby.erb +0 -0
- data/lib/droiuby/{templates → scripts/templates}/ruby/gitignore.erb +0 -0
- data/lib/droiuby/{templates → scripts/templates}/ruby/index.rb.erb +0 -0
- data/lib/droiuby/{templates → scripts/templates}/ruby/index.xml.erb +0 -0
- data/lib/droiuby/support/asset.rb +47 -0
- data/lib/droiuby/support/autoload.rb +22 -0
- data/lib/droiuby/support/fixnum.rb +11 -0
- data/lib/droiuby/support/object.rb +11 -0
- data/lib/droiuby/support/string.rb +38 -0
- data/lib/droiuby/support/system.rb +14 -0
- data/lib/droiuby/support/thread.rb +17 -0
- data/lib/droiuby/support/to_query.rb +28 -0
- data/lib/droiuby/support/utils.rb +10 -0
- data/lib/droiuby/wrappers/accelerometer.rb +17 -0
- data/lib/droiuby/wrappers/activity.rb +64 -0
- data/lib/droiuby/wrappers/animation.rb +141 -0
- data/lib/droiuby/wrappers/async.rb +33 -0
- data/lib/droiuby/wrappers/button.rb +2 -0
- data/lib/droiuby/wrappers/canvas.rb +147 -0
- data/lib/droiuby/wrappers/collection/view_array.rb +21 -0
- data/lib/droiuby/wrappers/compound_button_wrapper.rb +25 -0
- data/lib/droiuby/wrappers/edit_text.rb +22 -0
- data/lib/droiuby/wrappers/image_button.rb +8 -0
- data/lib/droiuby/wrappers/intent.rb +24 -0
- data/lib/droiuby/wrappers/java_helpers/java_method_helper.rb +42 -0
- data/lib/droiuby/wrappers/java_helpers/view_helper.rb +84 -0
- data/lib/droiuby/wrappers/linear_layout.rb +15 -0
- data/lib/droiuby/wrappers/list_adapter_wrapper.rb +61 -0
- data/lib/droiuby/wrappers/list_view.rb +10 -0
- data/lib/droiuby/wrappers/listeners/auto_wrap.rb +72 -0
- data/lib/droiuby/wrappers/listeners/on_click_listener.rb +21 -0
- data/lib/droiuby/wrappers/listeners/on_web_console_ready_listener.rb +23 -0
- data/lib/droiuby/wrappers/motion_events.rb +34 -0
- data/lib/droiuby/wrappers/preferences.rb +59 -0
- data/lib/droiuby/wrappers/proxy_builder/interface_builder.rb +25 -0
- data/lib/droiuby/wrappers/runnable_wrapper.rb +16 -0
- data/lib/droiuby/wrappers/surface_view_wrapper.rb +59 -0
- data/lib/droiuby/wrappers/text_view.rb +28 -0
- data/lib/droiuby/wrappers/thread_pool.rb +18 -0
- data/lib/droiuby/wrappers/view_group_wrapper.rb +87 -0
- data/lib/droiuby/wrappers/view_wrapper.rb +221 -0
- data/lib/droiuby/wrappers/web_view.rb +16 -0
- data/lib/droiuby/wrappers/wrappers.rb +5 -0
- metadata +77 -51
@@ -0,0 +1,72 @@
|
|
1
|
+
module Droiuby
|
2
|
+
module Wrappers
|
3
|
+
module Listeners
|
4
|
+
|
5
|
+
class AutoWrapBase
|
6
|
+
def to_native(klass, package = 'android.view.View')
|
7
|
+
Droiuby::Wrappers::ProxyBuilder::InvocationHandler.new("#{package}$#{klass}", self).to_native
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class AutoWrap < AutoWrapBase
|
12
|
+
|
13
|
+
def initialize(execution_bundle, auto_wrap_block)
|
14
|
+
@execution_bundle = execution_bundle
|
15
|
+
@auto_wrap_block = auto_wrap_block
|
16
|
+
end
|
17
|
+
|
18
|
+
def method_missing(meth, *args, &block)
|
19
|
+
if meth.to_s =~ /^on(.+)$/
|
20
|
+
wrapped_args = args.collect { |a|
|
21
|
+
wrap_native_view(a)
|
22
|
+
}
|
23
|
+
@auto_wrap_block.call(*wrapped_args)
|
24
|
+
else
|
25
|
+
super # You *must* call super if you don't handle the
|
26
|
+
# method, otherwise you'll mess up Ruby's method
|
27
|
+
# lookup.
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
class AutoWrapMultiple < AutoWrapBase
|
35
|
+
|
36
|
+
def initialize(execution_bundle, impl_blocks = {})
|
37
|
+
@execution_bundle = execution_bundle
|
38
|
+
@auto_wrap_blocks = impl_blocks
|
39
|
+
end
|
40
|
+
|
41
|
+
def impl(method, &block)
|
42
|
+
@auto_wrap_block["on#{meth.to_s.camelize}"] = block
|
43
|
+
end
|
44
|
+
|
45
|
+
def method_missing(meth, *args, &block)
|
46
|
+
if meth.to_s =~ /^on(.+)$/
|
47
|
+
wrapped_args = args.collect { |a|
|
48
|
+
wrap_native_view(a)
|
49
|
+
}
|
50
|
+
@auto_wrap_block[meth.to_s].call(*wrapped_args)
|
51
|
+
else
|
52
|
+
super # You *must* call super if you don't handle the
|
53
|
+
# method, otherwise you'll mess up Ruby's method
|
54
|
+
# lookup.
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def on(event,&block)
|
60
|
+
listener_ref = event.to_s.camelize
|
61
|
+
self.native.send(:"setOn#{listener_ref}Listener",_listener("On#{listener_ref}Listener", &block))
|
62
|
+
end
|
63
|
+
|
64
|
+
protected
|
65
|
+
|
66
|
+
def _listener(java_class, package = 'android.view.View' , &block)
|
67
|
+
Droiuby::Wrappers::Listeners::AutoWrap.new(_execution_bundle, block).to_native(java_class, package)
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Droiuby
|
2
|
+
module Wrappers
|
3
|
+
module Listeners
|
4
|
+
class OnClickListener
|
5
|
+
|
6
|
+
def initialize(execution_bundle, auto_wrap_block)
|
7
|
+
@auto_wrap_block = auto_wrap_block
|
8
|
+
@native = ProxyBuilder::InvocationHandler.new("android.view.View.OnClickListener", self).to_native
|
9
|
+
end
|
10
|
+
|
11
|
+
def onClick(view)
|
12
|
+
@auto_wrap_block.call(view)
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_native
|
16
|
+
@native
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Droiuby
|
2
|
+
module Wrappers
|
3
|
+
module Listeners
|
4
|
+
class OnWebConsoleReadyListener
|
5
|
+
|
6
|
+
def initialize(execution_bundle, auto_wrap_block)
|
7
|
+
@auto_wrap_block = auto_wrap_block
|
8
|
+
@native = Java::com.droiuby.wrappers::OnWebConsoleReadyRubyWrapper.new(execution_bundle, self)
|
9
|
+
end
|
10
|
+
|
11
|
+
def onReady(httpd)
|
12
|
+
on_ui_thread {
|
13
|
+
@auto_wrap_block.call(httpd)
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_native
|
18
|
+
@native
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class MotionEventsWrapper
|
2
|
+
|
3
|
+
ACTION_DOWN = Java::android.view.MotionEvent::ACTION_DOWN
|
4
|
+
ACTION_MOVE = Java::android.view.MotionEvent::ACTION_MOVE
|
5
|
+
|
6
|
+
include Droiuby::ViewHelper
|
7
|
+
include JavaMethodHelper
|
8
|
+
|
9
|
+
java_fast_reader Java::android.view.MotionEvent, :x, :y, :action, :pointer_count, :history_size
|
10
|
+
java_native_method Java::android.view.MotionEvent, :getHistoricalEventTime, [Java::int]
|
11
|
+
java_native_method Java::android.view.MotionEvent, :getPointerId, [Java::int]
|
12
|
+
java_native_method Java::android.view.MotionEvent, :getHistoricalX, [Java::int, Java::int]
|
13
|
+
java_native_method Java::android.view.MotionEvent, :getHistoricalY, [Java::int, Java::int]
|
14
|
+
|
15
|
+
|
16
|
+
def initialize(event)
|
17
|
+
@native = event
|
18
|
+
end
|
19
|
+
|
20
|
+
def native
|
21
|
+
@native
|
22
|
+
end
|
23
|
+
|
24
|
+
def each(&block)
|
25
|
+
pointerCount = pointer_count
|
26
|
+
(0...history_size).each do |h|
|
27
|
+
current_time = java_getHistoricalEventTime(h)
|
28
|
+
(0...pointerCount).each do |p|
|
29
|
+
block.call(java_getPointerId(p), java_getHistoricalX(p, h), java_getHistoricalY(p, h))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
class Preferences
|
2
|
+
|
3
|
+
def initialize(preferences)
|
4
|
+
@preferences = preferences
|
5
|
+
end
|
6
|
+
|
7
|
+
def has_key?(key)
|
8
|
+
@preferences.contains(key.to_s)
|
9
|
+
end
|
10
|
+
|
11
|
+
def contains?(key)
|
12
|
+
has_key? key
|
13
|
+
end
|
14
|
+
|
15
|
+
def get(key, default = nil)
|
16
|
+
prefs = (safe_get(key, nil) { |k, d| @preferences.getBoolean(k, nil) }) ||
|
17
|
+
(safe_get(key, nil) { |k, d| @preferences.getFloat(k, nil) }) ||
|
18
|
+
(safe_get(key, nil) { |k, d| @preferences.getInt(k, nil) }) ||
|
19
|
+
(safe_get(key, nil) { |k, d| @preferences.getLong(k, nil) }) ||
|
20
|
+
(safe_get(key, nil) { |k, d| @preferences.getString(k, nil) })
|
21
|
+
prefs.nil? ? default : prefs
|
22
|
+
end
|
23
|
+
|
24
|
+
def update_attributes(attributes = {})
|
25
|
+
editor = @preferences.edit
|
26
|
+
attributes.each { |k,v|
|
27
|
+
k = k.to_s
|
28
|
+
if v.kind_of? String
|
29
|
+
editor.putString(k,v)
|
30
|
+
elsif v.kind_of? Integer
|
31
|
+
editor.putInt(k,v)
|
32
|
+
elsif v.kind_of? Long
|
33
|
+
editor.putLong(k,v)
|
34
|
+
elsif v.kind_of? Float
|
35
|
+
editor.putFloat(k,v)
|
36
|
+
elsif v.boolean?
|
37
|
+
editor.putBoolean(k,v)
|
38
|
+
elsif v == :remove
|
39
|
+
editor.remove(k)
|
40
|
+
end
|
41
|
+
}
|
42
|
+
editor
|
43
|
+
end
|
44
|
+
|
45
|
+
def update_attributes!(attributes = {})
|
46
|
+
update_attributes(attributes).commit
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def safe_get(key, default, &block)
|
52
|
+
begin
|
53
|
+
block.call key.to_s, default
|
54
|
+
rescue Java::java.lang.ClassCastException=>e
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Droiuby
|
2
|
+
module Wrappers
|
3
|
+
module ProxyBuilder
|
4
|
+
class InvocationHandler
|
5
|
+
|
6
|
+
def initialize(klass_name, backing_object)
|
7
|
+
puts "autowrap using dexmaker"
|
8
|
+
handler = Java::com.droiuby.wrappers.InvocationHandlerRubyWrapper.new(_execution_bundle, self)
|
9
|
+
@backing_object = backing_object
|
10
|
+
@native = Java::com.droiuby.client.core.InterfaceGenerator.wrapperForClass(_current_activity, klass_name, handler)
|
11
|
+
end
|
12
|
+
|
13
|
+
def invoke(object, method, params)
|
14
|
+
method_name = method.getName
|
15
|
+
@backing_object.send(method_name, *params)
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_native
|
19
|
+
@native
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'droiuby/wrappers/canvas'
|
2
|
+
|
3
|
+
class SurfaceHolderWrapper
|
4
|
+
|
5
|
+
include JavaMethodHelper
|
6
|
+
|
7
|
+
java_native_method Java::com.droiuby.client.core.wrappers.SurfaceViewHolderWrapper, :lockCanvas, [], "java_lockCanvasVoid"
|
8
|
+
java_native_method Java::com.droiuby.client.core.wrappers.SurfaceViewHolderWrapper, :lockCanvas, [Java::android.graphics.Rect], "java_lockCanvas"
|
9
|
+
java_native_method Java::com.droiuby.client.core.wrappers.SurfaceViewHolderWrapper, :unlockCanvasAndPost, [Java::android.graphics.Canvas]
|
10
|
+
|
11
|
+
def initialize(surface)
|
12
|
+
@native = surface
|
13
|
+
end
|
14
|
+
|
15
|
+
def native
|
16
|
+
@native
|
17
|
+
end
|
18
|
+
|
19
|
+
def lock(rect = nil, &block)
|
20
|
+
if rect.nil?
|
21
|
+
# canvas = Canvas.new(native.lockCanvas)
|
22
|
+
canvas = Canvas.new(java_lockCanvasVoid)
|
23
|
+
else
|
24
|
+
# canvas = Canvas.new(native.lockCanvas(rect))
|
25
|
+
canvas = Canvas.new(java_lockCanvas(rect.native))
|
26
|
+
end
|
27
|
+
block.call(canvas)
|
28
|
+
# native.unlockCanvasAndPost(canvas.native)
|
29
|
+
java_unlockCanvasAndPost(canvas.native)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
class SurfaceViewWrapper < ViewWrapper
|
35
|
+
|
36
|
+
def initialize(view = nil)
|
37
|
+
unless view.nil?
|
38
|
+
@view = view
|
39
|
+
else
|
40
|
+
@view = Java::com.droiuby.client.core.wrappers.SurfaceViewWrapper.new(_current_activity, _execution_bundle)
|
41
|
+
end
|
42
|
+
@builder = Java::com.droiuby.client.core.builder.ViewBuilder.new
|
43
|
+
@builder.setContext(_current_activity)
|
44
|
+
end
|
45
|
+
|
46
|
+
def on(event, &block)
|
47
|
+
case(event.to_sym)
|
48
|
+
when :surface_created
|
49
|
+
auto_wrap_block = Proc.new { |surface| block.call(SurfaceHolderWrapper.new(surface))}
|
50
|
+
self.native.setSurfaceCreatedBlock(auto_wrap_block)
|
51
|
+
when :surface_destroyed
|
52
|
+
auto_wrap_block = Proc.new { |surface| block.call(SurfaceHolderWrapper.new(surface))}
|
53
|
+
self.native.setSurfaceDestroyedBlock(auto_wrap_block)
|
54
|
+
else
|
55
|
+
super(event.to_sym, &block)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'droiuby/wrappers/view_wrapper'
|
2
|
+
|
3
|
+
class TextViewWrapper < ViewWrapper
|
4
|
+
|
5
|
+
java_attr_accessor :cursor_visible, :text_color, :text_scale_x
|
6
|
+
|
7
|
+
def text=(text)
|
8
|
+
@view.setText(text.to_s)
|
9
|
+
end
|
10
|
+
|
11
|
+
def text
|
12
|
+
@view.getText
|
13
|
+
end
|
14
|
+
|
15
|
+
def text_size=(size)
|
16
|
+
@view.setTextSize(Java::android.util.TypedValue::COMPLEX_UNIT_DIP,size.to_f)
|
17
|
+
end
|
18
|
+
|
19
|
+
def text_color
|
20
|
+
@view.getCurrentTextColor
|
21
|
+
end
|
22
|
+
|
23
|
+
def text_color=(value)
|
24
|
+
@view.setTextColor(parse_color(value));
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class ThreadPoolWrapper
|
2
|
+
|
3
|
+
def initialize
|
4
|
+
@native = com.droiuby.client.core.wrappers.ThreadPoolWorkerWrapper.new
|
5
|
+
end
|
6
|
+
|
7
|
+
def native
|
8
|
+
@native
|
9
|
+
end
|
10
|
+
|
11
|
+
def task(&block)
|
12
|
+
@native.addTask(Java::com.droiuby.client.core.wrappers.ThreadWrapper.new(block, _execution_bundle))
|
13
|
+
end
|
14
|
+
|
15
|
+
def start
|
16
|
+
@native.start
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'droiuby/wrappers/view_wrapper'
|
2
|
+
|
3
|
+
class ViewGroupWrapper < ViewWrapper
|
4
|
+
def inner=(markup)
|
5
|
+
_activity_builder.parsePartialReplaceChildren(@view, markup, _execution_bundle)
|
6
|
+
after_partial_setup(self)
|
7
|
+
end
|
8
|
+
|
9
|
+
#TODO: support reverse markup generation
|
10
|
+
def inner
|
11
|
+
puts "TODO"
|
12
|
+
end
|
13
|
+
|
14
|
+
def append(markup_or_view)
|
15
|
+
if markup_or_view.kind_of? String
|
16
|
+
_activity_builder.parsePartialAppendChildren(@view, markup_or_view, _execution_bundle)
|
17
|
+
elsif markup_or_view.kind_of? ViewWrapper
|
18
|
+
_activity_builder.appendChild(@view, markup_or_view.native)
|
19
|
+
elsif markup_or_view.kind_of? Java::android.view.View.new
|
20
|
+
_activity_builder.appendChild(@view, markup_or_view)
|
21
|
+
end
|
22
|
+
after_partial_setup(self)
|
23
|
+
end
|
24
|
+
|
25
|
+
def <<(markup_or_view)
|
26
|
+
append(markup_or_view)
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_front!(child = nil)
|
30
|
+
if child.nil?
|
31
|
+
super
|
32
|
+
else
|
33
|
+
@view.bringChildToFront(self.to_native(child))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def count
|
38
|
+
@view.getChildCount
|
39
|
+
end
|
40
|
+
|
41
|
+
def children
|
42
|
+
wrapped_views = (0...self.count).collect { |i|
|
43
|
+
wrap_native_view(self.child(i))
|
44
|
+
}
|
45
|
+
ViewArray.new(wrapped_views)
|
46
|
+
end
|
47
|
+
|
48
|
+
def child(index)
|
49
|
+
@view.getChildAt(index)
|
50
|
+
end
|
51
|
+
|
52
|
+
def form_fields
|
53
|
+
fields = {}
|
54
|
+
collect_fields(self, fields)
|
55
|
+
fields
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def set_hash_from_tag(child, field_hash, &block)
|
61
|
+
unless child.native.getTag.nil?
|
62
|
+
tag = child.native.getTag
|
63
|
+
if tag.kind_of? Java::com.droiuby.client.core.ViewExtras
|
64
|
+
unless tag.getView_name.nil?
|
65
|
+
field_hash[tag.getView_name.to_sym] = block.call(child)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def collect_fields(view, field_hash)
|
72
|
+
view.children.each do |child|
|
73
|
+
if child.kind_of? EditTextWrapper
|
74
|
+
set_hash_from_tag(child, field_hash) do |c|
|
75
|
+
c.text
|
76
|
+
end
|
77
|
+
elsif child.kind_of? CompoundButtonWrapper
|
78
|
+
set_hash_from_tag(child, field_hash) do |c|
|
79
|
+
c.checked? ? 'true' : 'false'
|
80
|
+
end
|
81
|
+
elsif child.kind_of? ViewGroupWrapper
|
82
|
+
collect_fields(child, field_hash)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|