droiuby 0.1.6 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/lib/droiuby.rb +1 -1
  3. data/lib/droiuby/android.rb +59 -0
  4. data/lib/droiuby/application.rb +30 -0
  5. data/lib/droiuby/bootstrap.rb +263 -0
  6. data/lib/droiuby/droiuby.rb +47 -0
  7. data/lib/droiuby/loader.rb +36 -0
  8. data/lib/droiuby/plugins/plugins.rb +25 -0
  9. data/lib/droiuby/preload.rb +29 -0
  10. data/lib/droiuby/{project.rb → scripts/project.rb} +15 -6
  11. data/lib/droiuby/scripts/templates/ruby/Gemfile.erb +3 -0
  12. data/lib/droiuby/{templates → scripts/templates}/ruby/application.css.erb +0 -0
  13. data/lib/droiuby/{templates → scripts/templates}/ruby/config.droiuby.erb +0 -0
  14. data/lib/droiuby/{templates → scripts/templates}/ruby/gitignore.erb +0 -0
  15. data/lib/droiuby/{templates → scripts/templates}/ruby/index.rb.erb +0 -0
  16. data/lib/droiuby/{templates → scripts/templates}/ruby/index.xml.erb +0 -0
  17. data/lib/droiuby/support/asset.rb +47 -0
  18. data/lib/droiuby/support/autoload.rb +22 -0
  19. data/lib/droiuby/support/fixnum.rb +11 -0
  20. data/lib/droiuby/support/object.rb +11 -0
  21. data/lib/droiuby/support/string.rb +38 -0
  22. data/lib/droiuby/support/system.rb +14 -0
  23. data/lib/droiuby/support/thread.rb +17 -0
  24. data/lib/droiuby/support/to_query.rb +28 -0
  25. data/lib/droiuby/support/utils.rb +10 -0
  26. data/lib/droiuby/wrappers/accelerometer.rb +17 -0
  27. data/lib/droiuby/wrappers/activity.rb +64 -0
  28. data/lib/droiuby/wrappers/animation.rb +141 -0
  29. data/lib/droiuby/wrappers/async.rb +33 -0
  30. data/lib/droiuby/wrappers/button.rb +2 -0
  31. data/lib/droiuby/wrappers/canvas.rb +147 -0
  32. data/lib/droiuby/wrappers/collection/view_array.rb +21 -0
  33. data/lib/droiuby/wrappers/compound_button_wrapper.rb +25 -0
  34. data/lib/droiuby/wrappers/edit_text.rb +22 -0
  35. data/lib/droiuby/wrappers/image_button.rb +8 -0
  36. data/lib/droiuby/wrappers/intent.rb +24 -0
  37. data/lib/droiuby/wrappers/java_helpers/java_method_helper.rb +42 -0
  38. data/lib/droiuby/wrappers/java_helpers/view_helper.rb +84 -0
  39. data/lib/droiuby/wrappers/linear_layout.rb +15 -0
  40. data/lib/droiuby/wrappers/list_adapter_wrapper.rb +61 -0
  41. data/lib/droiuby/wrappers/list_view.rb +10 -0
  42. data/lib/droiuby/wrappers/listeners/auto_wrap.rb +72 -0
  43. data/lib/droiuby/wrappers/listeners/on_click_listener.rb +21 -0
  44. data/lib/droiuby/wrappers/listeners/on_web_console_ready_listener.rb +23 -0
  45. data/lib/droiuby/wrappers/motion_events.rb +34 -0
  46. data/lib/droiuby/wrappers/preferences.rb +59 -0
  47. data/lib/droiuby/wrappers/proxy_builder/interface_builder.rb +25 -0
  48. data/lib/droiuby/wrappers/runnable_wrapper.rb +16 -0
  49. data/lib/droiuby/wrappers/surface_view_wrapper.rb +59 -0
  50. data/lib/droiuby/wrappers/text_view.rb +28 -0
  51. data/lib/droiuby/wrappers/thread_pool.rb +18 -0
  52. data/lib/droiuby/wrappers/view_group_wrapper.rb +87 -0
  53. data/lib/droiuby/wrappers/view_wrapper.rb +221 -0
  54. data/lib/droiuby/wrappers/web_view.rb +16 -0
  55. data/lib/droiuby/wrappers/wrappers.rb +5 -0
  56. metadata +77 -51
@@ -0,0 +1,25 @@
1
+ module Droiuby
2
+ class Plugins
3
+
4
+ def self.descendants
5
+ @descendants ||= []
6
+ end
7
+
8
+ def self.inherited(descendant)
9
+ descendants << descendant
10
+ end
11
+
12
+ #ran after all classes are initialized and before executing the MainActivity on_create method
13
+ def after_bootstrap
14
+ end
15
+
16
+ #after a partial is rendered
17
+ def after_partial_setup(view)
18
+ end
19
+
20
+ #after a complete view is rendered
21
+ def after_view_setup
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ #trigger pre load
2
+ def start_droiuby_plugins
3
+ puts "starting plugins"
4
+ $droiuby_plugins = []
5
+ puts "loading plugins"
6
+ Droiuby::Plugins.descendants.each { |klass|
7
+ puts "plugin -> #{klass.to_s}"
8
+ $droiuby_plugins << klass.new
9
+ }
10
+
11
+ $droiuby_plugins.each do |plugin|
12
+ puts "plugin attach #{plugin.class.to_s}"
13
+ plugin.after_bootstrap
14
+ end unless $droiuby_plugins.blank?
15
+ end
16
+
17
+ def after_view_setup
18
+ $droiuby_plugins.each do |plugin|
19
+ puts "plugin attach #{plugin.class.to_s}"
20
+ plugin.after_view_setup
21
+ end unless $droiuby_plugins.blank?
22
+ end
23
+
24
+ def after_partial_setup(view_group)
25
+ $droiuby_plugins.each do |plugin|
26
+ puts "plugin attach #{plugin.class.to_s}"
27
+ plugin.after_partial_setup(view_group)
28
+ end unless $droiuby_plugins.blank?
29
+ end
@@ -132,12 +132,17 @@ class Project < Thor
132
132
  end
133
133
 
134
134
  dest_folder = File.join(output_dir,"#{name}")
135
+ template File.join('ruby','Gemfile.erb'), File.join(dest_folder,"Gemfile")
135
136
  template File.join('ruby','config.droiuby.erb'), File.join(dest_folder,"config.droiuby")
136
137
  template File.join('ruby','gitignore.erb'), File.join(dest_folder,".gitignore")
137
138
  template File.join('ruby','index.xml.erb'), File.join(dest_folder,"index.xml")
138
139
  template File.join('ruby','application.css.erb'), File.join(dest_folder,"application.css")
139
140
  template File.join('ruby','index.rb.erb'), File.join(dest_folder,"index.rb")
140
141
  empty_directory File.join(dest_folder,"lib")
142
+ say "running bundle install"
143
+ Dir.chdir dest_folder
144
+ `bundle install`
145
+ bundle
141
146
  end
142
147
 
143
148
  desc "package NAME [WORKSPACE_DIR] [true|false]","package a project"
@@ -177,8 +182,11 @@ class Project < Thor
177
182
  Thread.new do
178
183
  while !ready
179
184
  end
180
- `adb shell am start -W -S --activity-clear-top --activity-brought-to-front -n com.droiuby.application/.CanvasActivity`
181
- launch(device_ip, "http://#{host_name_args}:#{port}/config.droiuby")
185
+ begin
186
+ launch(device_ip, "http://#{host_name_args}:#{port}/config.droiuby")
187
+ rescue Exception=>e
188
+ `adb shell am start -W -S --activity-clear-top --activity-brought-to-front -n com.droiuby.application/.DroiubyActivity`
189
+ end
182
190
  end
183
191
 
184
192
  puts "Starting server: http://#{host_name_args}:#{port}"
@@ -264,9 +272,7 @@ class Project < Thor
264
272
  end
265
273
 
266
274
  desc "execute NAME DEVICE_IP [WORKSPACE_DIR]","package and execute a droiuby application to target device running droiuby client"
267
-
268
275
  def execute(name, device_ip, source_dir = 'projects')
269
- `adb shell am start -W -S --activity-clear-top --activity-brought-to-front -n com.droiuby.application/.CanvasActivity`
270
276
  package name, source_dir, "true"
271
277
  upload name, device_ip, source_dir
272
278
  end
@@ -312,9 +318,12 @@ class Project < Thor
312
318
  FileUtils.rm archive, :force=>true
313
319
 
314
320
  Zip::File.open(archive, Zip::File::CREATE) do |zipfile|
315
- Dir["#{path}/**/**"].reject{ |f| f==archive || f.match(/\/build/) }.each do |file|
321
+ Dir.glob("**{,/*/**}/*.*").reject{ |f| f==archive || f.match(/^build/) }.uniq.each do |file|
316
322
  say_status 'adding', file
317
- zipfile.add(file.sub(path+'/',''),file)
323
+ begin
324
+ zipfile.add(file, file)
325
+ rescue Zip::ZipEntryExistsError=>e
326
+ end
318
327
  end
319
328
  end
320
329
  say_status 'create', archive
@@ -0,0 +1,3 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'droiuby'
@@ -0,0 +1,47 @@
1
+ class BitmapDrawableWrapper
2
+ def initialize(drawable)
3
+ @native = drawable
4
+ end
5
+
6
+ def native
7
+ @native
8
+ end
9
+
10
+ def to_bitmap
11
+ @native.getBitmap
12
+ end
13
+
14
+ def height
15
+ @native.getIntrinsicHeight
16
+ end
17
+
18
+ def width
19
+ @native.getIntrinsicWidth
20
+ end
21
+ end
22
+
23
+ class AssetHandler
24
+
25
+ def initialize(url)
26
+ @url = url
27
+ end
28
+
29
+ def self.download(url)
30
+ AssetHandler.new(url)
31
+ end
32
+
33
+ def start
34
+ async.perform {
35
+ result = BitmapDrawableWrapper.new(Java::com.droiuby.client.core.utils.Utils.loadAppAssetRuby(_execution_bundle, _current_app, _current_activity,
36
+ @url, Java::com.droiuby.client.core.utils.Utils::ASSET_TYPE_IMAGE, Java::com.droiuby.client.core.utils.Utils::HTTP_GET))
37
+ result
38
+ }.done { |result|
39
+ @block.call(result)
40
+ }.start
41
+ end
42
+
43
+ def done(&block)
44
+ @block = block
45
+ self
46
+ end
47
+ end
@@ -0,0 +1,22 @@
1
+
2
+ class Object
3
+ class << self
4
+ alias :const_missing_old :const_missing
5
+ def const_missing(name)
6
+ puts "constant missing #{name}"
7
+ @looked_for ||= {}
8
+ str_name = name.to_s
9
+ raise "Class not found: #{name}" if @looked_for[str_name]
10
+ @looked_for[str_name] = 1
11
+
12
+ name_parts = name.to_s.split('::').collect { |n| n.underscore }
13
+ require_path = File.join(*name_parts)
14
+
15
+ puts "autoloading #{require_path}"
16
+ require require_path
17
+ klass = const_get(name)
18
+ return klass if klass
19
+ raise "Class not found: #{name}"
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,11 @@
1
+ class Fixnum
2
+
3
+ def dip
4
+ Java::com.droiuby.client.core.builder.ActivityBuilder.toDeviceIndependentPixels(_current_activity, self)
5
+ end
6
+
7
+ def to_px
8
+ Java::com.droiuby.client.core.builder.ActivityBuilder.toPixelsFromDip(_current_activity, self)
9
+ end
10
+
11
+ end
@@ -0,0 +1,11 @@
1
+ class Object
2
+
3
+ def blank?
4
+ respond_to?(:empty?) ? empty? : !self
5
+ end
6
+
7
+ def boolean?
8
+ self.is_a?(TrueClass) || self.is_a?(FalseClass)
9
+ end
10
+
11
+ end
@@ -0,0 +1,38 @@
1
+ class String
2
+
3
+ def camelize(first_letter_in_uppercase = true)
4
+ if first_letter_in_uppercase
5
+ self.to_s.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
6
+ else
7
+ self.first + camelize(self)[1..-1]
8
+ end
9
+ end
10
+
11
+ def to_pixels
12
+ Java::com.droiuby.client.core.builder.ActivityBuilder.toPixels(_current_activity, self)
13
+ end
14
+
15
+ def to_color
16
+ Java::android.graphics.Color.parseColor(self)
17
+ end
18
+
19
+ def underscore
20
+ self.gsub(/::/, '/').
21
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
22
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
23
+ tr("-", "_").
24
+ downcase
25
+ end
26
+
27
+ def constantize
28
+ names = self.split('::')
29
+ names.shift if names.empty? || names.first.empty?
30
+
31
+ constant = Object
32
+ names.each do |name|
33
+ constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
34
+ end
35
+ constant
36
+ end
37
+
38
+ end
@@ -0,0 +1,14 @@
1
+ module Droiuby
2
+ class SystemWrapper
3
+
4
+ include JavaMethodHelper
5
+
6
+ java_native_singleton Java::java.lang.System, :nanoTime, []
7
+ java_native_singleton Java::java.lang.System, :currentTimeMillis, []
8
+ java_native_singleton Java::java.lang.System, :currentTimeMillis, []
9
+ java_native_singleton Java::java.lang.Thread, :sleep, [Java::long]
10
+ java_native_singleton Java::java.lang.System, :gc, []
11
+ java_native_singleton Java::android.util.Log, :d, [Java::java.lang.String, Java::java.lang.String]
12
+
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ class Object
2
+ def with_large_stack(stack_size_kb = 64, &block)
3
+ result = nil
4
+ t = Thread.with_large_stack(&proc{result = block.call})
5
+ t.join
6
+ result
7
+ end
8
+ end
9
+
10
+ class Thread
11
+ def self.with_large_stack(stack_size_kb = 128, &block)
12
+ runnable = RunnableWrapper.new(block).to_native
13
+ t = Java::java.lang.Thread.new(nil, runnable, "block with large stack", stack_size_kb * 1024)
14
+ t.start
15
+ t
16
+ end
17
+ end
@@ -0,0 +1,28 @@
1
+ require 'active_support/core_ext/object/to_param'
2
+
3
+ class Object
4
+ # Converts an object into a string suitable for use as a URL query string, using the given <tt>key</tt> as the
5
+ # param name.
6
+ #
7
+ # Note: This method is defined as a default implementation for all Objects for Hash#to_query to work.
8
+ def to_query(key)
9
+ require 'cgi' unless defined?(CGI) && defined?(CGI::escape)
10
+ "#{CGI.escape(key.to_param)}=#{CGI.escape(to_param.to_s)}"
11
+ end
12
+
13
+ end
14
+
15
+ class Array
16
+ # Converts an array into a string suitable for use as a URL query string,
17
+ # using the given +key+ as the param name.
18
+ #
19
+ # ['Rails', 'coding'].to_query('hobbies') # => "hobbies%5B%5D=Rails&hobbies%5B%5D=coding"
20
+ def to_query(key)
21
+ prefix = "#{key}[]"
22
+ collect { |value| value.to_query(prefix) }.join '&'
23
+ end
24
+ end
25
+
26
+ class Hash
27
+ alias_method :to_query, :to_param
28
+ end
@@ -0,0 +1,10 @@
1
+ module Droiuby
2
+ class Utils
3
+
4
+ def self.start_web_console(&block)
5
+ listener = Droiuby::Wrappers::Listeners::OnWebConsoleReadyListener.new(_execution_bundle,block)
6
+ Java::com.droiuby.client.core.DroiubyLauncher.setupConsole(_execution_bundle, listener.to_native)
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,17 @@
1
+ class Accelerometer
2
+
3
+ attr_accessor :sensor, :rate
4
+ include Droiuby::Wrappers::Listeners
5
+
6
+ def initialize
7
+ @native = _execution_bundle.getSensor(Java::Sensor.TYPE_ACCELEROMETER)
8
+ end
9
+
10
+ def on(event, &block)
11
+ unless @listener
12
+ @listener = Droiuby::Wrappers::Listeners::AutoWrapMultiple.new(_execution_bundle)
13
+ @native.registerListener(@listener.to_native('SensorEventListener'), @sensor, @rate)
14
+ end
15
+ @listener.impl(event, &block)
16
+ end
17
+ end
@@ -0,0 +1,64 @@
1
+ class Activity
2
+
3
+ @@before_content_blocks = []
4
+
5
+ def initialize
6
+ end
7
+
8
+ def me
9
+ _current_activity
10
+ end
11
+
12
+ class << self
13
+
14
+ def on_click(name, &block)
15
+ view = V(name).tap { |v|
16
+ v.native.setOnClickListener(Java::com.droiuby.client.core.OnClickListenerBridge.new(_execution_bundle, v.id))
17
+ }
18
+ define_method("on_click_listener_for_#{view.id.to_s}".to_sym) do |n_view|
19
+ _current_activity.instance_exec(wrap_native_view(n_view),&block)
20
+ end
21
+ end
22
+
23
+ def portrait_mode_only
24
+ add_before_content_task { _current_activity.setRequestedOrientation(ActivityInfo::SCREEN_ORIENTATION_PORTRAIT) }
25
+ end
26
+
27
+ def landscape_mode_only
28
+ add_before_content_task { _current_activity.setRequestedOrientation(ActivityInfo::SCREEN_ORIENTATION_LANDSCAPE) }
29
+ end
30
+
31
+ def no_action_bar
32
+ add_before_content_task { _current_activity.requestWindowFeature(Java::android.view.Window::FEATURE_NO_TITLE) }
33
+ end
34
+
35
+ def set_theme(theme, namespace = nil)
36
+ namespace = "#{namespace}." unless namespace.nil?
37
+
38
+ add_before_content_task do
39
+ _current_activity.setTheme(_R("#{namespace}R.style.#{theme}"))
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ def add_before_content_task(&block)
46
+ @@before_content_blocks = @@before_content_blocks || []
47
+ @@before_content_blocks << block
48
+ end
49
+
50
+ end
51
+
52
+ def on_activity_result(request_code, result_code, intent)
53
+
54
+ end
55
+
56
+ def before_content_render
57
+ @@before_content_blocks.each { |block| block.call }
58
+ _current_activity.setContentView(_R('R.layout.canvas'))
59
+ end
60
+
61
+ def on_activity_reload
62
+ end
63
+
64
+ end
@@ -0,0 +1,141 @@
1
+ class AnimatorListenerWrapper
2
+
3
+ def initialize
4
+ @native = Java::com.droiuby.wrappers::AnimatorListenerRubyWrapper.new(_execution_bundle, self)
5
+ @blocks = {}
6
+ end
7
+
8
+ def set_block(sym, &block)
9
+ @blocks[sym.to_sym] = block
10
+ end
11
+
12
+ def onAnimationStart
13
+ @block[:start].call if @block.has_key? :start
14
+ end
15
+
16
+ def onAnimationEnd
17
+ @block[:end].call if @block.has_key? :end
18
+ end
19
+
20
+ def onAnimationCancel
21
+ @block[:cancel].call if @block.has_key? :cancel
22
+ end
23
+
24
+ def onAnimationRepeat
25
+ @block[:repeat].call if @block.has_key? :repeat
26
+ end
27
+
28
+ def to_native
29
+ @native
30
+ end
31
+ end
32
+
33
+
34
+ #Wrap the android animation API
35
+ class Animator
36
+ def initialize(target)
37
+ @animator_set = Java::android.animation.AnimatorSet.new
38
+ @mode = :together
39
+ @animators = []
40
+ @target = target
41
+ @done = false
42
+ end
43
+
44
+ def animator_set
45
+ @animator_set
46
+ end
47
+
48
+ def animators
49
+ @animators
50
+ end
51
+
52
+ def native
53
+ @animator_set
54
+ end
55
+
56
+ def method_missing(name, *args, &block)
57
+ anim = Java::android.animation.ObjectAnimator.ofFloat(@target.native, name.to_s.camelize(:lower), args[0], args[1]);
58
+ if args[2] && args[2].kind_of?(Hash)
59
+ duration = args[2][:duration]
60
+ anim.setDuration(duration)
61
+ end
62
+ @animators << anim
63
+ anim
64
+ end
65
+
66
+ def sequentially
67
+ @mode = :one_after_the_other
68
+ self
69
+ end
70
+
71
+ def together
72
+ @mode = :together
73
+ self
74
+ end
75
+
76
+ def before(animation)
77
+ Java::android.animation.AnimatorSet.new.tap { |s|
78
+ s.play(to_animator(animation)).before(self.animator_set)
79
+ } if @done
80
+ end
81
+
82
+ def after(animation)
83
+ s = Java::android.animation.AnimatorSet.new.tap { |s|
84
+ s.play(to_animator(animation)).after(self.animator_set)
85
+ } if @done
86
+ end
87
+
88
+ def wait(milliseconds)
89
+ Java::android.animation.AnimatorSet.new.tap { |s|
90
+ s.play(self.animator_set).after(milliseconds.to_i)
91
+ } if @done
92
+ end
93
+
94
+ def with(animation)
95
+ Java::android.animation.AnimatorSet.new.tap { |s|
96
+ s.play(to_animator(animation)).with(self.animator_set)
97
+ } if @done
98
+ end
99
+
100
+ def together
101
+ @mode = :together
102
+ end
103
+
104
+ def one_after_the_other
105
+ @mode = :one_after_the_other
106
+ end
107
+
108
+ def done
109
+ @done = true
110
+ case @mode
111
+ when :together
112
+ @animator_set.playTogether(*@animators)
113
+ when :one_after_the_other
114
+ @animator_set.playSequentially(*@animators)
115
+ end
116
+ end
117
+
118
+ def start
119
+ @animator_set.start
120
+ self
121
+ end
122
+
123
+ def on(event, &block)
124
+ @animation_listener = @animation_listener || AnimatorListenerWrapper.new
125
+ if [:cancel, :start, :end, :repeat ].include?(event)
126
+ @animation_listener.set_block(event, Proc.new { |v| block.call(wrap_native_view(v))})
127
+ self.native.addListener(@animation_listener.to_native)
128
+ end
129
+ self
130
+ end
131
+
132
+ protected
133
+
134
+ def to_animator(animation)
135
+ animator = animation
136
+ if animation.kind_of? Animator
137
+ animator = animation.animator_set
138
+ end
139
+ animator
140
+ end
141
+ end