bluepotion 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +10 -0
- data/lib/bluepotion.rb +16 -0
- data/lib/project/ext/activity.rb +62 -0
- data/lib/project/ext/array_list.rb +25 -0
- data/lib/project/ext/fragment.rb +2 -0
- data/lib/project/ext/object.rb +105 -0
- data/lib/project/ext/string.rb +23 -0
- data/lib/project/ext/view.rb +81 -0
- data/lib/project/potion.rb +50 -0
- data/lib/project/pro_motion/pm_activity.rb +38 -0
- data/lib/project/pro_motion/pm_application.rb +71 -0
- data/lib/project/pro_motion/pm_home_activity.rb +14 -0
- data/lib/project/pro_motion/pm_screen.rb +67 -0
- data/lib/project/pro_motion/pm_screen_module.rb +165 -0
- data/lib/project/pro_motion/pm_single_fragment_activity.rb +31 -0
- data/lib/project/ruby_motion_query/rmq/actions.rb +48 -0
- data/lib/project/ruby_motion_query/rmq/base.rb +260 -0
- data/lib/project/ruby_motion_query/rmq/data.rb +64 -0
- data/lib/project/ruby_motion_query/rmq/debug.rb +9 -0
- data/lib/project/ruby_motion_query/rmq/enumerablish.rb +99 -0
- data/lib/project/ruby_motion_query/rmq/events.rb +28 -0
- data/lib/project/ruby_motion_query/rmq/factory.rb +47 -0
- data/lib/project/ruby_motion_query/rmq/position.rb +2 -0
- data/lib/project/ruby_motion_query/rmq/selectors.rb +72 -0
- data/lib/project/ruby_motion_query/rmq/styles.rb +108 -0
- data/lib/project/ruby_motion_query/rmq/subviews.rb +95 -0
- data/lib/project/ruby_motion_query/rmq/tags.rb +58 -0
- data/lib/project/ruby_motion_query/rmq/traverse.rb +287 -0
- data/lib/project/ruby_motion_query/rmq/utils.rb +36 -0
- data/lib/project/ruby_motion_query/rmq/version.rb +6 -0
- data/lib/project/ruby_motion_query/rmq_activity_data.rb +3 -0
- data/lib/project/ruby_motion_query/rmq_app.rb +9 -0
- data/lib/project/ruby_motion_query/rmq_color.rb +121 -0
- data/lib/project/ruby_motion_query/rmq_device.rb +47 -0
- data/lib/project/ruby_motion_query/rmq_event.rb +1 -0
- data/lib/project/ruby_motion_query/rmq_font.rb +61 -0
- data/lib/project/ruby_motion_query/rmq_image.rb +55 -0
- data/lib/project/ruby_motion_query/rmq_rect.rb +576 -0
- data/lib/project/ruby_motion_query/rmq_screen_data.rb +3 -0
- data/lib/project/ruby_motion_query/rmq_stylesheet.rb +39 -0
- data/lib/project/ruby_motion_query/rmq_view_data.rb +88 -0
- data/lib/project/ruby_motion_query/stylers/rmq_button_styler.rb +3 -0
- data/lib/project/ruby_motion_query/stylers/rmq_image_button_styler.rb +3 -0
- data/lib/project/ruby_motion_query/stylers/rmq_image_view_styler.rb +24 -0
- data/lib/project/ruby_motion_query/stylers/rmq_linear_layout_styler.rb +32 -0
- data/lib/project/ruby_motion_query/stylers/rmq_relative_layout_styler.rb +7 -0
- data/lib/project/ruby_motion_query/stylers/rmq_styler_helper.rb +3 -0
- data/lib/project/ruby_motion_query/stylers/rmq_text_view_styler.rb +50 -0
- data/lib/project/ruby_motion_query/stylers/rmq_view_styler.rb +201 -0
- data/lib/project/version.rb +3 -0
- data/templates/screen/app/screens/name_screen.rb +20 -0
- data/templates/screen/app/stylesheets/name_screen_stylesheet.rb +24 -0
- data/templates/screen/spec/screens/name_screen_spec.rb +8 -0
- metadata +119 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 843068c1c8ba6af4bd308d825109986b0361d4b1
|
4
|
+
data.tar.gz: a7733756b70dde4407a24f100e0513c9d31df1c3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 550fd29b558508b3c1c963b49f62c96a2d15c2e1542de02f40a0df473159a6b37015321b9824a3a1f1d53578b1dccfd08a6a39bc8adde46632305cce013f33cf
|
7
|
+
data.tar.gz: 4bcb7d36b43f1c347d78400337a420dc298f90bd82ad3341fff6684918298f01c29c34a80a1e843bbc64223b8c8e91b1e05f0ada3daf29eb3151a28d7953f752
|
data/README.md
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
<p align="center"><img src="http://s3.amazonaws.com/ir_public/projects/redpotion/BluePotion_logo_500w.png" alt="logo" width="250px"></p>
|
2
|
+
|
3
|
+
<br />
|
4
|
+
|
5
|
+
BluePotion
|
6
|
+
-----------
|
7
|
+
|
8
|
+
Like [RedPotion](http://redpotion.org), but for RubyMotion Android.
|
9
|
+
|
10
|
+
## BluePotion is pre-alpha right now!
|
data/lib/bluepotion.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
unless defined?(Motion::Project::Config)
|
4
|
+
raise "This file must be required within a RubyMotion project Rakefile."
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'bluepotion'
|
8
|
+
|
9
|
+
lib_dir_path = File.dirname(File.expand_path(__FILE__))
|
10
|
+
Motion::Project::App.setup do |app|
|
11
|
+
insert_point = app.files.find_index { |file| file =~ /^(?:\.\/)?app\// } || 0
|
12
|
+
|
13
|
+
Dir.glob(File.join(lib_dir_path, "project/**/*.rb")).reverse.each do |file|
|
14
|
+
app.files.insert(insert_point, file)
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
class Android::App::Activity
|
2
|
+
|
3
|
+
def root_view
|
4
|
+
@_root_view ||= getWindow.getDecorView.findViewById(Android::R::Id::Content)
|
5
|
+
end
|
6
|
+
|
7
|
+
def rmq_data
|
8
|
+
@_rmq_data ||= RMQActivityData.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def rmq(*working_selectors)
|
12
|
+
crmq = (rmq_data.cached_rmq ||= RMQ.create_with_selectors([], self))
|
13
|
+
|
14
|
+
if working_selectors.length == 0
|
15
|
+
crmq
|
16
|
+
else
|
17
|
+
RMQ.create_with_selectors(working_selectors, self, crmq)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def stylesheet
|
22
|
+
self.rmq.stylesheet
|
23
|
+
end
|
24
|
+
|
25
|
+
def stylesheet=(value)
|
26
|
+
self.rmq.stylesheet = value
|
27
|
+
end
|
28
|
+
|
29
|
+
def color(*params)
|
30
|
+
RMQ.color(*params)
|
31
|
+
end
|
32
|
+
|
33
|
+
def font
|
34
|
+
rmq.font
|
35
|
+
end
|
36
|
+
|
37
|
+
def image
|
38
|
+
rmq.image
|
39
|
+
end
|
40
|
+
|
41
|
+
def append_view(view_or_class, style=nil, opts={})
|
42
|
+
self.rmq.append_view(view_or_class, style, opts)
|
43
|
+
end
|
44
|
+
|
45
|
+
def append_view!(view_or_class, style=nil, opts={})
|
46
|
+
self.rmq.append_view(view_or_class, style, opts).get
|
47
|
+
end
|
48
|
+
|
49
|
+
class << self
|
50
|
+
|
51
|
+
def stylesheet(style_sheet_class)
|
52
|
+
@rmq_style_sheet_class = style_sheet_class
|
53
|
+
end
|
54
|
+
|
55
|
+
def rmq_style_sheet_class
|
56
|
+
@rmq_style_sheet_class
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Java::Util::ArrayList
|
2
|
+
|
3
|
+
# REMOVE when RubyMotion adds this
|
4
|
+
def uniq
|
5
|
+
if self.length <= 1
|
6
|
+
self
|
7
|
+
else
|
8
|
+
h = {}
|
9
|
+
self.each do |el|
|
10
|
+
h[el] = nil
|
11
|
+
end
|
12
|
+
h.keys
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# REMOVE when RubyMotion adds this
|
17
|
+
def uniq!
|
18
|
+
# This was failing with an array of views, TODO, check
|
19
|
+
out = self.uniq
|
20
|
+
self.clear
|
21
|
+
self.addAll out
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
class Object
|
2
|
+
|
3
|
+
# REMOVE when RubyMotion adds this
|
4
|
+
def object_id
|
5
|
+
Java::Lang::System.identityHashCode(self)
|
6
|
+
end
|
7
|
+
|
8
|
+
# REMOVE when RubyMotion adds this
|
9
|
+
def caller
|
10
|
+
out = "caller:"
|
11
|
+
|
12
|
+
stacktrace = Java::Lang::Thread.currentThread.getStackTrace
|
13
|
+
stacktrace.each_with_index do |trc, i|
|
14
|
+
klass_name = trc.className
|
15
|
+
method_name = trc.methodName
|
16
|
+
|
17
|
+
next if klass_name == "com.rubymotion.ReplTask"
|
18
|
+
next if method_name == "getStackTrace" || method_name == "getThreadStackTrace"
|
19
|
+
|
20
|
+
line_number = trc.getLineNumber
|
21
|
+
out << "\n "
|
22
|
+
#out << " " * i
|
23
|
+
if line_number < 0
|
24
|
+
out << " "
|
25
|
+
else
|
26
|
+
out << line_number.to_s.ljust(4)
|
27
|
+
end
|
28
|
+
out << " "
|
29
|
+
out << method_name.to_s.ljust(30)
|
30
|
+
out << " "
|
31
|
+
out << klass_name.to_s
|
32
|
+
end
|
33
|
+
|
34
|
+
out
|
35
|
+
end
|
36
|
+
|
37
|
+
def inspect
|
38
|
+
if self.respond_to?(:id)
|
39
|
+
"<#{short_class_name}|#{id}>"
|
40
|
+
else
|
41
|
+
"<#{short_class_name}|#{object_id}>"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def short_class_name
|
46
|
+
self.class.name.split('.').last
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
# RMQ stuff
|
51
|
+
|
52
|
+
def rmq(*working_selectors)
|
53
|
+
if (app = RMQ.app) && ((cvc = app.current_screen) || (cvc = app.current_activity))
|
54
|
+
cvc.rmq(working_selectors)
|
55
|
+
else
|
56
|
+
RMQ.create_with_array_and_selectors([], working_selectors, self)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def find(*args) # Do not alias this, strange bugs happen where classes don't have methods
|
61
|
+
rmq(*args)
|
62
|
+
end
|
63
|
+
|
64
|
+
def find!(*args) # Do not alias this, strange bugs happen where classes don't have methods
|
65
|
+
rmq(*args).get
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
# BluePotion stuff
|
70
|
+
|
71
|
+
# REMOVE when mp starts working
|
72
|
+
def mp(s, opts={})
|
73
|
+
if opts[:debugging_only]
|
74
|
+
return unless RMQ.debugging?
|
75
|
+
end
|
76
|
+
|
77
|
+
if s.nil?
|
78
|
+
s = "<nil>"
|
79
|
+
else
|
80
|
+
s = s.to_s
|
81
|
+
end
|
82
|
+
backspace = "\b\b " * (Android::App::Application.name.length + 13)
|
83
|
+
lines = s.split("\n")
|
84
|
+
lines.each do |line|
|
85
|
+
if RMQ.debugging?
|
86
|
+
out = backspace
|
87
|
+
out << "\e[1;#{36}m#{self.object_id}\e[0m #{self.short_class_name}".ljust(50)
|
88
|
+
out << " \e[1;#{34}m#{line}\e[0m"
|
89
|
+
puts out
|
90
|
+
else
|
91
|
+
puts "#{backspace} \e[1;#{34}m#{line}\e[0m"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def app
|
97
|
+
rmq.app
|
98
|
+
end
|
99
|
+
|
100
|
+
def device
|
101
|
+
rmq.device
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class String
|
2
|
+
# REMOVE when RubyMotion adds this
|
3
|
+
def rjust(number_of_characters)
|
4
|
+
if self.length < number_of_characters
|
5
|
+
out = " " * (number_of_characters - self.length)
|
6
|
+
out << self
|
7
|
+
out
|
8
|
+
else
|
9
|
+
self
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# REMOVE when RubyMotion adds this
|
14
|
+
def ljust(number_of_characters)
|
15
|
+
if self.length < number_of_characters
|
16
|
+
out = self
|
17
|
+
out << " " * (number_of_characters - self.length)
|
18
|
+
out
|
19
|
+
else
|
20
|
+
self
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
class Android::View::View
|
2
|
+
def inspect
|
3
|
+
"<#{id} #{short_class_name}>"
|
4
|
+
end
|
5
|
+
|
6
|
+
def to_s
|
7
|
+
self.inspect
|
8
|
+
end
|
9
|
+
|
10
|
+
def rmq_data
|
11
|
+
@_rmq_data ||= RMQViewData.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def rmq_created
|
15
|
+
end
|
16
|
+
|
17
|
+
# Override this to build your view and view's subviews
|
18
|
+
def rmq_build
|
19
|
+
on_load
|
20
|
+
end
|
21
|
+
def on_load
|
22
|
+
end
|
23
|
+
|
24
|
+
def rmq_appended
|
25
|
+
end
|
26
|
+
|
27
|
+
def rmq_style_applied
|
28
|
+
on_styled
|
29
|
+
end
|
30
|
+
|
31
|
+
def on_styled
|
32
|
+
end
|
33
|
+
|
34
|
+
def rmq(*working_selectors)
|
35
|
+
q = RMQ.create_with_selectors(working_selectors, self) #.tap do |o|
|
36
|
+
q
|
37
|
+
#if vc = self.rmq_data.view_controller
|
38
|
+
#o.weak_view_controller = vc
|
39
|
+
#end
|
40
|
+
#end
|
41
|
+
end
|
42
|
+
|
43
|
+
def color(*params)
|
44
|
+
RMQ.color(*params)
|
45
|
+
end
|
46
|
+
|
47
|
+
def font
|
48
|
+
rmq.font
|
49
|
+
end
|
50
|
+
|
51
|
+
def image
|
52
|
+
rmq.image
|
53
|
+
end
|
54
|
+
|
55
|
+
def append_view(view_or_class, style=nil, opts={})
|
56
|
+
self.rmq.append_view(view_or_class, style, opts)
|
57
|
+
end
|
58
|
+
|
59
|
+
def append_view!(view_or_class, style=nil, opts={})
|
60
|
+
self.rmq.append_view(view_or_class, style, opts).get
|
61
|
+
end
|
62
|
+
|
63
|
+
def subviews
|
64
|
+
out = []
|
65
|
+
|
66
|
+
if self.is_a?(Potion::ViewGroup)
|
67
|
+
(0...self.getChildCount).each_with_index do |i|
|
68
|
+
sbv = self.getChildAt(i)
|
69
|
+
out << sbv unless self == sbv
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
out
|
74
|
+
end
|
75
|
+
|
76
|
+
def superview
|
77
|
+
sv = self.getParent()
|
78
|
+
sv = nil unless sv.is_a?(Potion::ViewGroup)
|
79
|
+
sv
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Potion
|
2
|
+
Activity = Android::App::Activity
|
3
|
+
View = Android::View::View
|
4
|
+
ViewGroup = Android::View::ViewGroup
|
5
|
+
|
6
|
+
# layouts
|
7
|
+
LinearLayout = Android::Widget::LinearLayout
|
8
|
+
FrameLayout = Android::Widget::FrameLayout
|
9
|
+
RelativeLayout = Android::Widget::RelativeLayout
|
10
|
+
AbsoluteLayout = Android::Widget::AbsoluteLayout
|
11
|
+
|
12
|
+
# widgets
|
13
|
+
Label = Android::Widget::TextView
|
14
|
+
TextView = Android::Widget::TextView
|
15
|
+
ImageView = Android::Widget::ImageView
|
16
|
+
Button = Android::Widget::Button
|
17
|
+
Toast = Android::Widget::Toast
|
18
|
+
|
19
|
+
# graphics
|
20
|
+
Color = Android::Graphics::Color
|
21
|
+
Typeface = Android::Graphics::Typeface
|
22
|
+
|
23
|
+
ArrayList = Java::Util::ArrayList
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# Android's generateViewId method was implemented in API leve 17 - for older devices we need to
|
28
|
+
# roll our own solution.
|
29
|
+
#
|
30
|
+
# This is apparently Android's implementation from View.java, according to:
|
31
|
+
# http://stackoverflow.com/questions/1714297/android-view-setidint-id-programmatically-how-to-avoid-id-conflicts
|
32
|
+
class Potion::ViewIdGenerator
|
33
|
+
|
34
|
+
@current_id = Java::Util::Concurrent::Atomic::AtomicInteger.new(1)
|
35
|
+
|
36
|
+
def self.generate
|
37
|
+
while true do
|
38
|
+
result = @current_id.get
|
39
|
+
# aapt-generated IDs have the high byte nonzero; clamp to the range under that.
|
40
|
+
new_value = result + 1
|
41
|
+
if new_value > 0x00FFFFFF
|
42
|
+
new_value = 1
|
43
|
+
end
|
44
|
+
if @current_id.compareAndSet(result, new_value)
|
45
|
+
return result
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#module ProMotion
|
2
|
+
|
3
|
+
class PMActivity < Android::App::Activity
|
4
|
+
|
5
|
+
def onCreate(saved_instance_state)
|
6
|
+
super
|
7
|
+
|
8
|
+
mp "PMActivity onCreate", debugging_only: true
|
9
|
+
|
10
|
+
on_create(saved_instance_state)
|
11
|
+
PMApplication.current_application.context
|
12
|
+
end
|
13
|
+
|
14
|
+
def on_create(saved_instance_state)
|
15
|
+
mp "PMActivity on_create", debugging_only: true
|
16
|
+
end
|
17
|
+
|
18
|
+
def onResume
|
19
|
+
super
|
20
|
+
PMApplication.current_application.current_activity = self
|
21
|
+
end
|
22
|
+
|
23
|
+
def onPause
|
24
|
+
clear_references
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
28
|
+
def onDestroy
|
29
|
+
clear_references
|
30
|
+
super
|
31
|
+
end
|
32
|
+
|
33
|
+
def clear_references
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
#end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# RM-773
|
2
|
+
#module ProMotion
|
3
|
+
class PMApplication < Android::App::Application
|
4
|
+
attr_accessor :home_screen_class, :context, :current_activity
|
5
|
+
|
6
|
+
def onCreate
|
7
|
+
mp "PMApplication onCreate", debugging_only: true
|
8
|
+
|
9
|
+
# We can always get to the current application from PMApplication.current_application
|
10
|
+
# but we set the child class's current_application too, in case someone uses that
|
11
|
+
PMApplication.current_application = self
|
12
|
+
self.class.current_application = self
|
13
|
+
|
14
|
+
@context = self
|
15
|
+
|
16
|
+
@home_screen_class = self.class.home_screen_class
|
17
|
+
self.on_create if respond_to?(:on_create)
|
18
|
+
end
|
19
|
+
|
20
|
+
def window
|
21
|
+
if @current_activity
|
22
|
+
@window ||= @current_activity.getWindow
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def current_screen
|
27
|
+
if @current_activity && (ca = @current_activity)
|
28
|
+
if ca.is_a?(PMSingleFragmentActivity)
|
29
|
+
ca.fragment
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def guess_current_screen
|
35
|
+
# TODO
|
36
|
+
#ca.getFragmentManager.findFragmentById(Android::R::Id.fragment_container)
|
37
|
+
#ca.getFragmentManager.frameTitle
|
38
|
+
end
|
39
|
+
|
40
|
+
# @return [Symbol] Environment the app is running it
|
41
|
+
def environment
|
42
|
+
@_environment ||= RUBYMOTION_ENV.to_sym
|
43
|
+
end
|
44
|
+
|
45
|
+
# @return [Boolean] true if the app is running in the :release environment
|
46
|
+
def release?
|
47
|
+
environment == :release
|
48
|
+
end
|
49
|
+
alias :production? :release?
|
50
|
+
|
51
|
+
# @return [Boolean] true if the app is running in the :test environment
|
52
|
+
def test?
|
53
|
+
environment == :test
|
54
|
+
end
|
55
|
+
|
56
|
+
# @return [Boolean] true if the app is running in the :development environment
|
57
|
+
def development?
|
58
|
+
environment == :development
|
59
|
+
end
|
60
|
+
|
61
|
+
class << self
|
62
|
+
attr_accessor :current_application, :home_screen_class
|
63
|
+
|
64
|
+
def home_screen(hclass)
|
65
|
+
mp "PMApplication home_screen", debugging_only: true
|
66
|
+
@home_screen_class = hclass
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
#end
|