bluepotion 0.1.2 → 0.1.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.
- checksums.yaml +4 -4
- data/lib/project/blue_potion_net.rb +105 -0
- data/lib/project/ext/object.rb +2 -0
- data/lib/project/potion.rb +19 -3
- data/lib/project/potion_dialog/potion_dialog.rb +46 -0
- data/lib/project/pro_motion/{pm_activity.rb → activities/pm_activity.rb} +18 -0
- data/lib/project/pro_motion/activities/pm_home_activity.rb +14 -0
- data/lib/project/pro_motion/activities/pm_navigation_activity.rb +83 -0
- data/lib/project/pro_motion/{pm_single_fragment_activity.rb → activities/pm_single_fragment_activity.rb} +14 -3
- data/lib/project/pro_motion/adapters/pm_base_adapter.rb +75 -0
- data/lib/project/pro_motion/adapters/pm_cursor_adapter.rb +44 -0
- data/lib/project/pro_motion/fragments/pm_list_screen.rb +191 -0
- data/lib/project/pro_motion/{pm_screen.rb → fragments/pm_screen.rb} +31 -6
- data/lib/project/pro_motion/{pm_screen_module.rb → fragments/pm_screen_module.rb} +72 -20
- data/lib/project/pro_motion/pm_application.rb +15 -4
- data/lib/project/pro_motion/{pm_hash_bundle.rb → support/pm_hash_bundle.rb} +4 -0
- data/lib/project/ruby_motion_query/rmq/base.rb +1 -1
- data/lib/project/ruby_motion_query/rmq/data.rb +2 -36
- data/lib/project/ruby_motion_query/rmq/subviews.rb +30 -0
- data/lib/project/ruby_motion_query/rmq_color.rb +1 -1
- data/lib/project/ruby_motion_query/rmq_resource.rb +26 -0
- data/lib/project/version.rb +1 -1
- data/lib/project/volley_wrap/http_result.rb +98 -0
- data/lib/project/volley_wrap/request.rb +98 -0
- data/lib/project/volley_wrap/response_listener.rb +49 -0
- data/lib/project/volley_wrap/session_client.rb +72 -0
- metadata +19 -8
- data/lib/project/pro_motion/pm_home_activity.rb +0 -16
@@ -6,7 +6,11 @@
|
|
6
6
|
|
7
7
|
attr_accessor :view
|
8
8
|
|
9
|
-
def onAttach(activity)
|
9
|
+
def onAttach(activity)
|
10
|
+
super
|
11
|
+
activity.on_fragment_attached(self) if activity.respond_to?(:on_fragment_attached)
|
12
|
+
on_attach(activity)
|
13
|
+
end
|
10
14
|
def on_attach(activity); end
|
11
15
|
|
12
16
|
def onCreate(bundle); super; on_create(bundle); end
|
@@ -18,7 +22,8 @@
|
|
18
22
|
if @xml_resource = self.class.xml_resource
|
19
23
|
@view = inflater.inflate(r(:layout, @xml_resource), parent, false)
|
20
24
|
else
|
21
|
-
|
25
|
+
v = load_view
|
26
|
+
@view ||= v
|
22
27
|
@view.setId Potion::ViewIdGenerator.generate
|
23
28
|
end
|
24
29
|
|
@@ -50,9 +55,7 @@
|
|
50
55
|
|
51
56
|
build_and_tag_xml_views
|
52
57
|
|
53
|
-
|
54
|
-
self.activity.title = self.class.bars_title
|
55
|
-
|
58
|
+
set_title
|
56
59
|
on_load
|
57
60
|
on_activity_created
|
58
61
|
end
|
@@ -80,9 +83,31 @@
|
|
80
83
|
def onDestroy; super; on_destroy; end
|
81
84
|
def on_destroy; end
|
82
85
|
|
83
|
-
def onDetach
|
86
|
+
def onDetach
|
87
|
+
super
|
88
|
+
on_detach
|
89
|
+
self.activity.on_fragment_detached(self) if self.activity.respond_to?(:on_fragment_detached)
|
90
|
+
end
|
84
91
|
def on_detach; end
|
85
92
|
|
93
|
+
def set_title
|
94
|
+
self.title = self.class.bars_title
|
95
|
+
end
|
96
|
+
|
97
|
+
def title
|
98
|
+
@title
|
99
|
+
end
|
100
|
+
def title=(value)
|
101
|
+
@title = value
|
102
|
+
|
103
|
+
if a = self.activity
|
104
|
+
if a_bar = self.action_bar
|
105
|
+
a_bar.title = value
|
106
|
+
end
|
107
|
+
a.title = value
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
86
111
|
private
|
87
112
|
|
88
113
|
def build_and_tag_xml_views
|
@@ -93,8 +93,21 @@
|
|
93
93
|
self.rmq.append(view_or_class, style, opts).get
|
94
94
|
end
|
95
95
|
|
96
|
-
|
96
|
+
def create(view_or_class, style=nil, opts={})
|
97
|
+
self.rmq.create(view_or_class, style, opts)
|
98
|
+
end
|
99
|
+
|
100
|
+
def create!(view_or_class, style=nil, opts={})
|
101
|
+
self.rmq.create(view_or_class, style, opts).get
|
102
|
+
end
|
97
103
|
|
104
|
+
def build(view_or_class, style=nil, opts={})
|
105
|
+
self.rmq.build(view_or_class, style, opts)
|
106
|
+
end
|
107
|
+
|
108
|
+
def build!(view_or_class, style=nil, opts={})
|
109
|
+
self.rmq.build(view_or_class, style, opts).get
|
110
|
+
end
|
98
111
|
|
99
112
|
# temporary stand-in for Java's R class
|
100
113
|
def r(resource_type, resource_name)
|
@@ -108,15 +121,27 @@
|
|
108
121
|
|
109
122
|
def open(screen_class, options={})
|
110
123
|
mp "ScreenModule open", debugging_only: true
|
111
|
-
activity_class = options.delete(:activity) || PMSingleFragmentActivity
|
112
124
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
125
|
+
if !options[:activity] && self.activity.respond_to?(:open_fragment)
|
126
|
+
if screen_class.respond_to?(:new)
|
127
|
+
screen = screen_class.new
|
128
|
+
else
|
129
|
+
screen = screen_class
|
130
|
+
end
|
131
|
+
self.activity.open_fragment screen, options
|
132
|
+
else
|
133
|
+
open_modal(screen_class, options)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def open_modal(screen_class, options)
|
138
|
+
activity_class = options.delete(:activity) || PMNavigationActivity
|
139
|
+
activity_class = PMNavigationActivity if activity_class == :nav
|
140
|
+
activity_class = PMSingleFragmentActivity if activity_class == :single
|
141
|
+
|
142
|
+
intent = Potion::Intent.new(self.activity, activity_class)
|
143
|
+
intent.putExtra PMActivity::EXTRA_FRAGMENT_CLASS, screen_class.to_s
|
144
|
+
intent.setFlags(Potion::Intent::FLAG_ACTIVITY_CLEAR_TOP) if options.delete(:close)
|
120
145
|
|
121
146
|
if extras = options.delete(:extras)
|
122
147
|
extras.keys.each do |key, value|
|
@@ -128,18 +153,34 @@
|
|
128
153
|
unless options.blank?
|
129
154
|
# The rest of the options are screen accessors, we use fragment arguments for this
|
130
155
|
hash_bundle = PMHashBundle.from_hash(options)
|
131
|
-
intent.putExtra
|
156
|
+
intent.putExtra PMActivity::EXTRA_FRAGMENT_ARGUMENTS, hash_bundle.to_bundle
|
132
157
|
end
|
133
158
|
|
134
159
|
self.activity.startActivity intent
|
135
160
|
end
|
136
161
|
|
137
162
|
def close(options={})
|
138
|
-
|
163
|
+
# Hang onto an activity reference, since we lose the activity
|
164
|
+
act = self.activity
|
165
|
+
|
166
|
+
if options[:activity] && options[:to_screen]
|
167
|
+
# Closing to particular activity
|
168
|
+
open options[:to_screen], activity: options[:activity], close: true
|
169
|
+
elsif options[:to_screen]
|
170
|
+
# Closing to particular fragment
|
171
|
+
while act.fragment && !act.fragment.is_a?(options[:to_screen])
|
172
|
+
act.close_fragment
|
173
|
+
act.finish unless act.fragment
|
174
|
+
end
|
175
|
+
else
|
176
|
+
# Closing current screen or activity if no screens left
|
177
|
+
act.close_fragment if act.fragment
|
178
|
+
act.finish unless act.fragment
|
179
|
+
end
|
139
180
|
end
|
140
181
|
|
141
182
|
def start_activity(activity_class)
|
142
|
-
intent =
|
183
|
+
intent = Potion::Intent.new(self.activity, activity_class)
|
143
184
|
#intent.putExtra("key", value); # Optional parameters
|
144
185
|
self.activity.startActivity(intent)
|
145
186
|
end
|
@@ -158,13 +199,10 @@
|
|
158
199
|
input_manager.hideSoftInputFromWindow(view.getWindowToken(), 0);
|
159
200
|
end
|
160
201
|
|
161
|
-
|
162
|
-
def activity
|
163
|
-
getActivity()
|
164
|
-
end
|
165
|
-
|
166
202
|
def action_bar
|
167
|
-
activity
|
203
|
+
if a = activity
|
204
|
+
a.getActionBar
|
205
|
+
end
|
168
206
|
end
|
169
207
|
|
170
208
|
def menu
|
@@ -173,6 +211,7 @@
|
|
173
211
|
|
174
212
|
# Example: add_action_bar_button(title: "My text", show: :if_room)
|
175
213
|
def add_action_bar_button(options={})
|
214
|
+
@action_bar ||= { button_actions: {} }
|
176
215
|
unless menu
|
177
216
|
mp "#{self.inspect}#add_action_bar_button: No menu set up yet."
|
178
217
|
return
|
@@ -187,11 +226,24 @@
|
|
187
226
|
show_as_action = 4 if options[:show] == :with_text
|
188
227
|
show_as_action = 8 if options[:show] == :collapse
|
189
228
|
|
190
|
-
btn = self.activity.menu.add(options.fetch(:group, 0), options.fetch(:item_id, 0), options.fetch(:order, 0), options.fetch(:title, "
|
229
|
+
btn = self.activity.menu.add(options.fetch(:group, 0), options.fetch(:item_id, @action_bar[:current_id] || 0), options.fetch(:order, 0), options.fetch(:title, ""))
|
191
230
|
btn.setShowAsAction(show_as_action) if show_as_action
|
192
|
-
btn.setIcon(options[:icon]) if options[:icon]
|
231
|
+
btn.setIcon(image.resource(options[:icon].to_s)) if options[:icon]
|
232
|
+
@action_bar[:button_actions][btn.getItemId] = options[:action] if options[:action]
|
233
|
+
@action_bar[:current_id] = btn.getItemId + 1
|
193
234
|
btn
|
194
235
|
end
|
195
236
|
|
237
|
+
def on_options_item_selected(item)
|
238
|
+
return unless @action_bar
|
239
|
+
return unless method_name = @action_bar[:button_actions][item.getItemId]
|
240
|
+
if respond_to?(method_name)
|
241
|
+
send(method_name)
|
242
|
+
else
|
243
|
+
mp "#{self.inspect} No method #{method_name.inspect} implemented for this screen."
|
244
|
+
true
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
196
248
|
end
|
197
249
|
#end
|
@@ -43,11 +43,10 @@
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
# Typically you don't use this, use `find.screen` instead, TODO, probably should remove this
|
46
47
|
def current_screen
|
47
|
-
if @current_activity &&
|
48
|
-
|
49
|
-
ca.fragment
|
50
|
-
end
|
48
|
+
if @current_activity && @current_activity.respond_to?(:fragment)
|
49
|
+
@current_activity.fragment
|
51
50
|
end
|
52
51
|
end
|
53
52
|
|
@@ -78,6 +77,18 @@
|
|
78
77
|
environment == :development
|
79
78
|
end
|
80
79
|
|
80
|
+
def resource
|
81
|
+
RMQResource
|
82
|
+
end
|
83
|
+
|
84
|
+
def net
|
85
|
+
BluePotionNet
|
86
|
+
end
|
87
|
+
|
88
|
+
def async(options={}, &block)
|
89
|
+
MotionAsync.async(options, &block)
|
90
|
+
end
|
91
|
+
|
81
92
|
class << self
|
82
93
|
attr_accessor :current_application, :home_screen_class
|
83
94
|
|
@@ -30,6 +30,8 @@ class PMHashBundle
|
|
30
30
|
value = case value_type
|
31
31
|
when "com.rubymotion.String"
|
32
32
|
bundle.getString(key)
|
33
|
+
when "com.rubymotion.Symbol"
|
34
|
+
bundle.getString(key).to_sym
|
33
35
|
when "java.lang.Integer"
|
34
36
|
bundle.getInt(key)
|
35
37
|
when "java.lang.Double"
|
@@ -64,6 +66,8 @@ class PMHashBundle
|
|
64
66
|
case value_type
|
65
67
|
when "com.rubymotion.String"
|
66
68
|
bundle.putString(key, value)
|
69
|
+
when "com.rubymotion.Symbol"
|
70
|
+
bundle.putString(key, value.to_s)
|
67
71
|
when "java.lang.Integer"
|
68
72
|
bundle.putInt(key, value)
|
69
73
|
when "java.lang.Double"
|
@@ -8,7 +8,7 @@ class RMQ
|
|
8
8
|
if value.is_a?(Potion::Activity)
|
9
9
|
@originated_from = value
|
10
10
|
@activity = value
|
11
|
-
elsif value.is_a?(PMScreen)
|
11
|
+
elsif value.is_a?(PMScreen) || value.is_a?(PMListScreen)
|
12
12
|
@originated_from = value
|
13
13
|
elsif value.is_a?(Potion::View)
|
14
14
|
@originated_from = value
|
@@ -3,25 +3,8 @@ class RMQ
|
|
3
3
|
if new_data != :rmq_not_provided
|
4
4
|
selected.each do |view|
|
5
5
|
case view
|
6
|
-
|
7
|
-
#when UIButton then view.setTitle(new_data, forState: UIControlStateNormal)
|
8
|
-
#when UIImageView then view.image = new_data
|
9
|
-
#when UITableView then
|
10
|
-
#when UISwitch then view.setOn(new_data)
|
11
|
-
#when UIDatePicker then
|
12
|
-
#when UISegmentedControl then
|
13
|
-
#when UIRefreshControl then
|
14
|
-
#when UIPageControl then
|
15
|
-
#when UISlider then
|
16
|
-
#when UIStepper then
|
17
|
-
#when UITabBar then
|
18
|
-
#when UITableViewCell then
|
6
|
+
when Potion::EditText then view.text = new_data.to_s.toString
|
19
7
|
when Potion::TextView then view.text = new_data
|
20
|
-
#when UITextField then view.text = new_data
|
21
|
-
#when UINavigationBar then
|
22
|
-
#when UIScrollView then
|
23
|
-
#when UIProgressView then view.setProgress(new_data, animated: true)
|
24
|
-
|
25
8
|
# TODO, finish
|
26
9
|
end
|
27
10
|
end
|
@@ -30,25 +13,8 @@ class RMQ
|
|
30
13
|
else
|
31
14
|
out = selected.map do |view|
|
32
15
|
case view
|
33
|
-
|
34
|
-
#when UIButton then view.titleForState(UIControlStateNormal)
|
35
|
-
#when UIImageView then view.image
|
36
|
-
#when UITableView then
|
37
|
-
#when UISwitch then
|
38
|
-
#when UIDatePicker then
|
39
|
-
#when UISegmentedControl then
|
40
|
-
#when UIRefreshControl then
|
41
|
-
#when UIPageControl then
|
42
|
-
#when UISlider then
|
43
|
-
#when UIStepper then
|
44
|
-
#when UITabBar then
|
45
|
-
#when UITableViewCell then
|
16
|
+
when Potion::EditText then view.text.toString.to_s
|
46
17
|
when Potion::TextView then view.text
|
47
|
-
#when UITextField then view.text
|
48
|
-
#when UINavigationBar then
|
49
|
-
#when UIScrollView then
|
50
|
-
#when UIProgressView then view.progress
|
51
|
-
|
52
18
|
# TODO, finish
|
53
19
|
end
|
54
20
|
end
|
@@ -6,9 +6,17 @@ class RMQ
|
|
6
6
|
created = false
|
7
7
|
appended = false
|
8
8
|
built = false
|
9
|
+
tag_xml_layout = false
|
9
10
|
|
10
11
|
if view_or_class.is_a?(Potion::View)
|
11
12
|
new_view = view_or_class
|
13
|
+
elsif view_or_class.is_a?(Symbol) # Inflate from xml
|
14
|
+
created = true
|
15
|
+
layout = RMQResource.layout(view_or_class)
|
16
|
+
|
17
|
+
inflater = Potion::LayoutInflater.from(self.activity)
|
18
|
+
new_view = inflater.inflate(layout, nil)
|
19
|
+
tag_xml_layout = true
|
12
20
|
else
|
13
21
|
created = true
|
14
22
|
new_view = view_or_class.new(RMQ.app.context)
|
@@ -48,6 +56,8 @@ class RMQ
|
|
48
56
|
if self.stylesheet
|
49
57
|
apply_style_to_view(new_view, opts[:style]) if opts[:style]
|
50
58
|
end
|
59
|
+
|
60
|
+
tag_all_from_resource_entry_name(new_view) if tag_xml_layout
|
51
61
|
end
|
52
62
|
|
53
63
|
viewq = RMQ.create_with_array_and_selectors(subviews_added, selectors, @originated_from, self)
|
@@ -57,6 +67,26 @@ class RMQ
|
|
57
67
|
end
|
58
68
|
alias :insert :add_subview
|
59
69
|
|
70
|
+
def tag_all_from_resource_entry_name(view)
|
71
|
+
view.rmq.find.each do |view|
|
72
|
+
if ren = view.resource_entry_name
|
73
|
+
view.rmq_data.tag(ren.to_sym)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
# Removes the selected views from their parent's (superview) subview array
|
80
|
+
#
|
81
|
+
# @example
|
82
|
+
# rmq(a_view, another_view).remove
|
83
|
+
#
|
84
|
+
# @return [RMQ]
|
85
|
+
def remove
|
86
|
+
selected.each { |view| view.parent.removeView(view) }
|
87
|
+
self
|
88
|
+
end
|
89
|
+
|
60
90
|
def append(view_or_class, style=nil, opts={}, dummy=nil) # <- dummy is to get around RM bug)
|
61
91
|
opts[:style] = style
|
62
92
|
#opts[:block] = block if block
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class RMQ
|
2
|
+
# @return [RMQResource]
|
3
|
+
def self.resource
|
4
|
+
RMQResource
|
5
|
+
end
|
6
|
+
|
7
|
+
# @return [RMQResource]
|
8
|
+
def resource
|
9
|
+
RMQResource
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class RMQResource
|
14
|
+
class << self
|
15
|
+
def find(resource_type, resource_name)
|
16
|
+
application = PMApplication.current_application
|
17
|
+
application.resources.getIdentifier(resource_name.to_s,
|
18
|
+
resource_type.to_s,
|
19
|
+
application.package_name)
|
20
|
+
end
|
21
|
+
|
22
|
+
def layout(name)
|
23
|
+
self.find("layout", name)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/project/version.rb
CHANGED
@@ -0,0 +1,98 @@
|
|
1
|
+
module VW
|
2
|
+
class HTTPResult
|
3
|
+
attr_accessor :object, :error, :response, :request_url, :request_params, :request_method
|
4
|
+
|
5
|
+
def initialize(response, response_object, error)
|
6
|
+
@response = response
|
7
|
+
@object = response_object
|
8
|
+
@error = error
|
9
|
+
end
|
10
|
+
|
11
|
+
def status_code
|
12
|
+
@response.statusCode if @response
|
13
|
+
end
|
14
|
+
|
15
|
+
def not_modified?
|
16
|
+
@response.notModified if @response
|
17
|
+
end
|
18
|
+
|
19
|
+
def body
|
20
|
+
@object.to_s if @object
|
21
|
+
end
|
22
|
+
|
23
|
+
def method_description
|
24
|
+
case @request_method
|
25
|
+
when 0
|
26
|
+
"GET"
|
27
|
+
when 1
|
28
|
+
"POST"
|
29
|
+
when 2
|
30
|
+
"PUT"
|
31
|
+
when 3
|
32
|
+
"DELETE"
|
33
|
+
else
|
34
|
+
"Unknown"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def headers
|
39
|
+
if @response
|
40
|
+
@_headers ||= @response.headers.inject({}){|h, entry_set| h[entry_set[0]] = entry_set[1] ; h }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def success?
|
45
|
+
!failure?
|
46
|
+
end
|
47
|
+
|
48
|
+
def failure?
|
49
|
+
!!error
|
50
|
+
end
|
51
|
+
|
52
|
+
def inspect
|
53
|
+
"<VW::HTTPResult:#{self.object_id} #{@request_url}>"
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_s
|
57
|
+
header_string = if (h = headers)
|
58
|
+
h.map{|k,v| " #{k} = #{v}"}.join("\n")
|
59
|
+
else
|
60
|
+
"none"
|
61
|
+
end
|
62
|
+
|
63
|
+
#mp @request_params.class.name
|
64
|
+
params_string = if @request_params
|
65
|
+
#@request_params.class.name
|
66
|
+
@request_params.map{|k,v| " #{k} = #{v}"}.join("\n")
|
67
|
+
else
|
68
|
+
"none"
|
69
|
+
end
|
70
|
+
|
71
|
+
%(
|
72
|
+
|
73
|
+
Request -------------------------
|
74
|
+
|
75
|
+
URL: #{@request_url}
|
76
|
+
Method: #{method_description}
|
77
|
+
Params:
|
78
|
+
#{params_string}
|
79
|
+
|
80
|
+
Response -------------------------
|
81
|
+
|
82
|
+
Status code: #{status_code}
|
83
|
+
Not modified?: #{not_modified?}
|
84
|
+
Success: #{success?}
|
85
|
+
|
86
|
+
Error: #{error.toString if error}
|
87
|
+
|
88
|
+
Headers:
|
89
|
+
#{header_string}
|
90
|
+
|
91
|
+
Body:
|
92
|
+
#{body}
|
93
|
+
\n
|
94
|
+
)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module VW
|
2
|
+
class Request < Com::Android::Volley::Toolbox::StringRequest
|
3
|
+
# part of this class had to be implemented as a Java extension to work around
|
4
|
+
# what appears to be a RM bug. See request.java
|
5
|
+
|
6
|
+
VOLLEY_GET = 0
|
7
|
+
VOLLEY_POST = 1
|
8
|
+
VOLLEY_PUT = 2
|
9
|
+
VOLLEY_DELETE = 3
|
10
|
+
|
11
|
+
def self.get_request(url, listener)
|
12
|
+
set_request_for_listener VOLLEY_GET, url, nil, listener
|
13
|
+
Request.new(VOLLEY_GET, url, listener, listener).tap do |req|
|
14
|
+
req.setRetryPolicy(retry_policy)
|
15
|
+
req.listener = listener
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.post_request(url, params, listener)
|
20
|
+
request_with_params(VOLLEY_POST, url, params, listener).tap do |req|
|
21
|
+
req.listener = listener
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.put_request(url, params, listener)
|
26
|
+
request_with_params(VOLLEY_PUT, url, params, listener).tap do |req|
|
27
|
+
req.listener = listener
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.delete_request(url, params, listener)
|
32
|
+
request_with_params(VOLLEY_DELETE, url, params, listener).tap do |req|
|
33
|
+
req.listener = listener
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def listener=(value)
|
38
|
+
@listener = value
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.retry_policy
|
42
|
+
Com::Android::Volley::DefaultRetryPolicy.new(10000, 3, 1)
|
43
|
+
end
|
44
|
+
|
45
|
+
def headers=(headers)
|
46
|
+
# call into the method defined in the .java file
|
47
|
+
setHeaders(headers)
|
48
|
+
end
|
49
|
+
|
50
|
+
def parseNetworkResponse(network_response)
|
51
|
+
@listener.network_response = network_response if @listener
|
52
|
+
super
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.set_request_for_listener(method, url, params, listener)
|
56
|
+
# There probably is a much better way then passing all these around like this
|
57
|
+
listener.request_url = url
|
58
|
+
listener.request_params = params
|
59
|
+
listener.request_method = method
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
# this is to maintain compatibility with AFMotion - somewhere (possibly in AFNetworking?) the
|
65
|
+
# keys get flattened out like so:
|
66
|
+
#
|
67
|
+
# { user: { email: "x@x.com", password: "pass" } }
|
68
|
+
# becomes
|
69
|
+
# { "user[email]" => "x@x.com", "user[password]" => "pass" }
|
70
|
+
#
|
71
|
+
# This is not a robust implementation of this, but will serve our needs for now
|
72
|
+
def self.prepare_params(params)
|
73
|
+
new_params = {}
|
74
|
+
params.keys.each do |key|
|
75
|
+
if params[key].is_a?(Hash)
|
76
|
+
params[key].keys.each do |inner_key|
|
77
|
+
new_params["#{key}[#{inner_key}]"] = params[key][inner_key].to_s
|
78
|
+
end
|
79
|
+
else
|
80
|
+
new_params[key.to_s] = params[key].to_s
|
81
|
+
end
|
82
|
+
end
|
83
|
+
new_params
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.request_with_params(method, url, params, listener)
|
87
|
+
set_request_for_listener method, url, params, listener
|
88
|
+
|
89
|
+
Request.new(method, url, listener, listener).tap do |req|
|
90
|
+
req.setRetryPolicy(retry_policy)
|
91
|
+
params = prepare_params(params)
|
92
|
+
req.setParams(params)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module VW
|
2
|
+
class ResponseListener
|
3
|
+
attr_accessor :serializer, :callback, :network_response, :request_url, :request_params, :request_method
|
4
|
+
|
5
|
+
def initialize(serializer, &block)
|
6
|
+
@serializer = serializer
|
7
|
+
@callback = block
|
8
|
+
end
|
9
|
+
|
10
|
+
def onResponse(response)
|
11
|
+
response_object = expect_json? ? Moran.parse(response.to_s) : response
|
12
|
+
create_result(@network_response, response_object, nil)
|
13
|
+
end
|
14
|
+
|
15
|
+
def onErrorResponse(error)
|
16
|
+
if network_response = error.networkResponse
|
17
|
+
data = network_response.data
|
18
|
+
end
|
19
|
+
create_result(network_response, data, error.toString)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def expect_json?
|
25
|
+
serializer == :json
|
26
|
+
end
|
27
|
+
|
28
|
+
def create_result(response, response_object, error)
|
29
|
+
request = HTTPResult.new(response, response_object, error)
|
30
|
+
request.request_url = @request_url
|
31
|
+
request.request_params = @request_params
|
32
|
+
request.request_method = @request_method
|
33
|
+
|
34
|
+
if VW::SessionClient.debug
|
35
|
+
mp request.to_s
|
36
|
+
end
|
37
|
+
callback.call request
|
38
|
+
end
|
39
|
+
|
40
|
+
def dump_network_error(error)
|
41
|
+
puts error.toString
|
42
|
+
if response = error.networkResponse
|
43
|
+
puts response.statusCode
|
44
|
+
puts response.headers
|
45
|
+
puts response.data
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|