bubble-wrap 1.8.0 → 1.9.0
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/.travis.yml +14 -9
- data/CHANGELOG.md +21 -2
- data/Gemfile.lock +8 -5
- data/README.md +54 -3
- data/Rakefile +7 -1
- data/lib/bubble-wrap/camera.rb +1 -1
- data/lib/bubble-wrap/core.rb +1 -1
- data/lib/bubble-wrap/font.rb +1 -1
- data/lib/bubble-wrap/loader.rb +4 -4
- data/lib/bubble-wrap/media.rb +1 -1
- data/lib/bubble-wrap/motion.rb +7 -1
- data/lib/bubble-wrap/version.rb +2 -2
- data/motion/core/app.rb +4 -0
- data/motion/core/device/ios/camera_wrapper.rb +1 -1
- data/motion/core/device/ios/screen.rb +2 -2
- data/motion/core/device/osx/screen.rb +1 -1
- data/motion/core/device/screen.rb +1 -1
- data/motion/core/ios/device.rb +1 -1
- data/motion/core/ios/ns_index_path.rb +11 -0
- data/motion/core/json.rb +2 -2
- data/motion/core/kvo.rb +118 -55
- data/motion/core/ns_notification_center.rb +2 -2
- data/motion/core/ns_url_request.rb +2 -2
- data/motion/core/osx/device.rb +1 -1
- data/motion/core/string.rb +7 -7
- data/motion/font/font.rb +1 -1
- data/motion/ios/8/location_constants.rb +21 -0
- data/motion/location/location.rb +38 -18
- data/motion/mail/result.rb +1 -1
- data/motion/media/media.rb +1 -1
- data/motion/motion/accelerometer.rb +55 -0
- data/motion/motion/device_motion.rb +139 -0
- data/motion/motion/gyroscope.rb +55 -0
- data/motion/motion/magnetometer.rb +55 -0
- data/motion/motion/motion.rb +0 -288
- data/motion/reactor.rb +3 -3
- data/motion/reactor/deferrable.rb +32 -32
- data/motion/reactor/periodic_timer.rb +1 -1
- data/motion/reactor/queue.rb +6 -6
- data/motion/reactor/thread_aware_deferrable.rb +1 -1
- data/motion/reactor/timer.rb +1 -1
- data/motion/rss_parser.rb +6 -3
- data/motion/shortcut.rb +1 -1
- data/motion/sms/result.rb +1 -1
- data/motion/test_suite_delegate.rb +1 -1
- data/motion/ui/ui_activity_view_controller_wrapper.rb +6 -1
- data/motion/ui/ui_alert_view.rb +21 -1
- data/motion/util/deprecated.rb +1 -1
- data/samples/alert/Gemfile.lock +1 -1
- data/spec/lib/bubble-wrap/requirement_spec.rb +2 -2
- data/spec/lib/bubble-wrap_spec.rb +1 -1
- data/spec/lib/motion_stub.rb +1 -1
- data/spec/motion/core/app_spec.rb +6 -0
- data/spec/motion/core/device/osx/screen_spec.rb +1 -1
- data/spec/motion/core/ios/ns_index_path_spec.rb +20 -0
- data/spec/motion/core/kvo_spec.rb +171 -58
- data/spec/motion/core/ns_notification_center_spec.rb +3 -3
- data/spec/motion/core/string_spec.rb +16 -16
- data/spec/motion/core_spec.rb +3 -3
- data/spec/motion/font/font_spec.rb +1 -1
- data/spec/motion/location/location_spec.rb +61 -9
- data/spec/motion/mail/result_spec.rb +7 -7
- data/spec/motion/media/player_spec.rb +1 -1
- data/spec/motion/reactor/thread_aware_deferrable_spec.rb +3 -3
- data/spec/motion/sms/result_spec.rb +6 -6
- data/spec/motion/ui/ui_alert_view_spec.rb +59 -1
- data/spec/motion/util/deprecated_spec.rb +1 -1
- metadata +17 -4
- data/motion/ios/7/uiactivity_view_controller_constants.rb +0 -10
@@ -3,8 +3,8 @@ class NSURLRequest
|
|
3
3
|
# Provides a to_s method so we can use inspect in instances and get
|
4
4
|
# valuable information.
|
5
5
|
def to_s
|
6
|
-
"#<#{self.class}:#{self.object_id} - url: #{self.URL.description},
|
7
|
-
headers: #{self.allHTTPHeaderFields.inspect},
|
6
|
+
"#<#{self.class}:#{self.object_id} - url: #{self.URL.description},
|
7
|
+
headers: #{self.allHTTPHeaderFields.inspect},
|
8
8
|
cache policy: #{self.cachePolicy}, Pipelining: #{self.HTTPShouldUsePipelining}, main doc url: #{mainDocumentURL},\
|
9
9
|
timeout: #{self.timeoutInterval}, network service type: #{self.networkServiceType} >"
|
10
10
|
end
|
data/motion/core/osx/device.rb
CHANGED
data/motion/core/string.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module BubbleWrap
|
2
|
-
# This module contains simplified version of the `camelize` and
|
3
|
-
# `underscore` methods from ActiveSupport, since these are such
|
2
|
+
# This module contains simplified version of the `camelize` and
|
3
|
+
# `underscore` methods from ActiveSupport, since these are such
|
4
4
|
# common operations when dealing with the Cocoa API.
|
5
5
|
module String
|
6
6
|
|
@@ -67,8 +67,8 @@ module BubbleWrap
|
|
67
67
|
return color_klass.send(keyword_selector) if color_klass.respond_to? keyword_selector
|
68
68
|
|
69
69
|
# Next attempt to convert from hex
|
70
|
-
hex_color = self.gsub("#", "")
|
71
|
-
case hex_color.size
|
70
|
+
hex_color = self.gsub("#", "")
|
71
|
+
case hex_color.size
|
72
72
|
when 3
|
73
73
|
colors = hex_color.scan(%r{[0-9A-Fa-f]}).map!{ |el| (el * 2).to_i(16) }
|
74
74
|
when 6
|
@@ -77,15 +77,15 @@ module BubbleWrap
|
|
77
77
|
colors = hex_color.scan(%r<[0-9A-Fa-f]{2}>).map!{ |el| el.to_i(16) }
|
78
78
|
else
|
79
79
|
raise ArgumentError
|
80
|
-
end
|
80
|
+
end
|
81
81
|
if colors.size == 3
|
82
82
|
BubbleWrap.rgb_color(colors[0], colors[1], colors[2])
|
83
83
|
elsif colors.size == 4
|
84
84
|
BubbleWrap.rgba_color(colors[1], colors[2], colors[3], colors[0])
|
85
85
|
else
|
86
86
|
raise ArgumentError
|
87
|
-
end
|
88
|
-
end
|
87
|
+
end
|
88
|
+
end
|
89
89
|
|
90
90
|
end
|
91
91
|
end
|
data/motion/font/font.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
module BW
|
2
|
+
# New additions to CLAuthorizationStatus in ios8
|
3
|
+
# see: https://developer.apple.com/library/prerelease/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/index.html#//apple_ref/c/tdef/CLAuthorizationStatus
|
4
|
+
Constants.register(
|
5
|
+
KCLAuthorizationStatusAuthorized,
|
6
|
+
KCLAuthorizationStatusAuthorizedWhenInUse,
|
7
|
+
KCLAuthorizationStatusAuthorizedAlways
|
8
|
+
)
|
9
|
+
|
10
|
+
module Location
|
11
|
+
module_function
|
12
|
+
|
13
|
+
def authorized?
|
14
|
+
[
|
15
|
+
BW::Constants.get("KCLAuthorizationStatus", :authorized),
|
16
|
+
BW::Constants.get("KCLAuthorizationStatus", :authorized_always),
|
17
|
+
BW::Constants.get("KCLAuthorizationStatus", :authorized_when_in_use)
|
18
|
+
].include?(CLLocationManager.authorizationStatus)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/motion/location/location.rb
CHANGED
@@ -25,10 +25,6 @@ module BubbleWrap
|
|
25
25
|
KCLLocationAccuracyNearestTenMeters, KCLLocationAccuracyHundredMeters,
|
26
26
|
KCLLocationAccuracyKilometer, KCLLocationAccuracyThreeKilometers
|
27
27
|
|
28
|
-
# New additions to CLAuthorizationStatus in ios8
|
29
|
-
# see: https://developer.apple.com/library/prerelease/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/index.html#//apple_ref/c/tdef/CLAuthorizationStatus
|
30
|
-
Constants.register KCLAuthorizationStatusAuthorizedWhenInUse, KCLAuthorizationStatusAuthorizedAlways
|
31
|
-
|
32
28
|
module_function
|
33
29
|
# Start getting locations
|
34
30
|
# @param [Hash] options = {
|
@@ -47,12 +43,15 @@ module BubbleWrap
|
|
47
43
|
# }
|
48
44
|
# @block for callback. takes one argument, `result`.
|
49
45
|
# - On error or cancelled, is called with a hash {error: BW::Location::Error::<Type>}
|
50
|
-
# - On success, is called with a hash {to: #<CLLocation>, from: #<CLLocation
|
46
|
+
# - On success, is called with a hash {to: #<CLLocation>, from: #<CLLocation>, previous: [#<CLLocation>,...]}
|
47
|
+
# -- :previous will return an Array of CLLocation objects, ordered from oldest to newest, excluding the
|
48
|
+
# locations :to and :from, returning an empty Array if no additional locations were provided
|
51
49
|
#
|
52
50
|
# Example
|
53
51
|
# BW::Location.get(distance_filter: 10, desired_accuracy: :nearest_ten_meters) do |result|
|
54
52
|
# result[:to].class == CLLocation
|
55
53
|
# result[:from].class == CLLocation
|
54
|
+
# result[:previous].class == NSArray<CLLocation>
|
56
55
|
# p "Lat #{result[:to].latitude}, Long #{result[:to].longitude}"
|
57
56
|
# end
|
58
57
|
def get(options = {}, &block)
|
@@ -70,6 +69,7 @@ module BubbleWrap
|
|
70
69
|
|
71
70
|
@options[:significant] = false if @options[:significant].nil?
|
72
71
|
@retries = 0
|
72
|
+
@from_location = nil
|
73
73
|
|
74
74
|
if not enabled?
|
75
75
|
error(Error::DISABLED) and return
|
@@ -86,13 +86,8 @@ module BubbleWrap
|
|
86
86
|
self.location_manager.desiredAccuracy = Constants.get("KCLLocationAccuracy", @options[:desired_accuracy])
|
87
87
|
self.location_manager.purpose = @options[:purpose] if @options[:purpose]
|
88
88
|
|
89
|
-
|
90
|
-
|
91
|
-
elsif @options[:compass]
|
92
|
-
self.location_manager.startUpdatingHeading
|
93
|
-
else
|
94
|
-
self.location_manager.startUpdatingLocation
|
95
|
-
end
|
89
|
+
@initialized = true
|
90
|
+
start
|
96
91
|
end
|
97
92
|
|
98
93
|
def get_significant(options = {}, &block)
|
@@ -136,6 +131,18 @@ module BubbleWrap
|
|
136
131
|
get_compass(options.merge(once: true), &block)
|
137
132
|
end
|
138
133
|
|
134
|
+
# Start getting locations
|
135
|
+
def start
|
136
|
+
return unless initialized?
|
137
|
+
if @options[:significant]
|
138
|
+
self.location_manager.startMonitoringSignificantLocationChanges
|
139
|
+
elsif @options[:compass]
|
140
|
+
self.location_manager.startUpdatingHeading
|
141
|
+
else
|
142
|
+
self.location_manager.startUpdatingLocation
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
139
146
|
# Stop getting locations
|
140
147
|
def stop
|
141
148
|
return unless @options
|
@@ -159,9 +166,16 @@ module BubbleWrap
|
|
159
166
|
CLLocationManager.locationServicesEnabled
|
160
167
|
end
|
161
168
|
|
169
|
+
# returns true/false if CLLocationManager has been initialized with the provided or default options
|
170
|
+
def initialized?
|
171
|
+
@initialized ||= false
|
172
|
+
end
|
173
|
+
|
162
174
|
# returns true/false whether services are enabled for the _app_
|
163
175
|
def authorized?
|
164
|
-
[
|
176
|
+
[
|
177
|
+
BW::Constants.get("KCLAuthorizationStatus", :authorized)
|
178
|
+
].include?(CLLocationManager.authorizationStatus)
|
165
179
|
end
|
166
180
|
|
167
181
|
def error(type)
|
@@ -172,13 +186,19 @@ module BubbleWrap
|
|
172
186
|
|
173
187
|
##########
|
174
188
|
# CLLocationManagerDelegate Methods
|
175
|
-
def locationManager(manager,
|
189
|
+
def locationManager(manager, didUpdateLocations:locations)
|
176
190
|
if @options[:once]
|
177
|
-
@callback && @callback.call(
|
191
|
+
@callback && @callback.call(locations.last)
|
178
192
|
@callback = proc { |result| }
|
179
193
|
stop
|
180
194
|
else
|
181
|
-
|
195
|
+
size = locations.count
|
196
|
+
result = {to: locations.last,
|
197
|
+
from: ( (size > 1) ? locations.last(2).first : @from_location ),
|
198
|
+
previous: ( (size > 2) ? locations.first(size - 2) : [] )
|
199
|
+
}
|
200
|
+
@from_location = result[:to]
|
201
|
+
@callback && @callback.call(result)
|
182
202
|
end
|
183
203
|
end
|
184
204
|
|
@@ -211,8 +231,8 @@ module BubbleWrap
|
|
211
231
|
if @retries > @options[:retries]
|
212
232
|
error(Error::LOCATION_UNKNOWN)
|
213
233
|
else
|
214
|
-
|
215
|
-
|
234
|
+
stop
|
235
|
+
start
|
216
236
|
end
|
217
237
|
when KCLErrorNetwork
|
218
238
|
error(Error::NETWORK_FAILURE)
|
data/motion/mail/result.rb
CHANGED
data/motion/media/media.rb
CHANGED
@@ -0,0 +1,55 @@
|
|
1
|
+
module BubbleWrap
|
2
|
+
module Motion
|
3
|
+
class Accelerometer < GenericMotionInterface
|
4
|
+
|
5
|
+
def start(options={}, &handler)
|
6
|
+
if options.key?(:interval)
|
7
|
+
@manager.accelerometerUpdateInterval = options[:interval]
|
8
|
+
end
|
9
|
+
|
10
|
+
if handler
|
11
|
+
queue = convert_queue(options[:queue])
|
12
|
+
@manager.startAccelerometerUpdatesToQueue(queue, withHandler: internal_handler(handler))
|
13
|
+
else
|
14
|
+
@manager.startAccelerometerUpdates
|
15
|
+
end
|
16
|
+
|
17
|
+
return self
|
18
|
+
end
|
19
|
+
|
20
|
+
private def handle_result(result_data, error, handler)
|
21
|
+
if result_data
|
22
|
+
result = {
|
23
|
+
data: result_data,
|
24
|
+
acceleration: result_data.acceleration,
|
25
|
+
x: result_data.acceleration.x,
|
26
|
+
y: result_data.acceleration.y,
|
27
|
+
z: result_data.acceleration.z,
|
28
|
+
}
|
29
|
+
else
|
30
|
+
result = nil
|
31
|
+
end
|
32
|
+
|
33
|
+
handler.call(result, error)
|
34
|
+
end
|
35
|
+
|
36
|
+
def available?
|
37
|
+
@manager.accelerometerAvailable?
|
38
|
+
end
|
39
|
+
|
40
|
+
def active?
|
41
|
+
@manager.accelerometerActive?
|
42
|
+
end
|
43
|
+
|
44
|
+
def data
|
45
|
+
@manager.accelerometerData
|
46
|
+
end
|
47
|
+
|
48
|
+
def stop
|
49
|
+
@manager.stopAccelerometerUpdates
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
module BubbleWrap
|
2
|
+
module Motion
|
3
|
+
class DeviceMotion < GenericMotionInterface
|
4
|
+
|
5
|
+
def start(options={}, &handler)
|
6
|
+
if options.key?(:interval)
|
7
|
+
@manager.deviceMotionUpdateInterval = options[:interval]
|
8
|
+
end
|
9
|
+
|
10
|
+
if options.key?(:reference)
|
11
|
+
reference_frame = convert_reference_frame(options[:reference])
|
12
|
+
else
|
13
|
+
reference_frame = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
if handler
|
17
|
+
queue = convert_queue(options[:queue])
|
18
|
+
|
19
|
+
if reference_frame
|
20
|
+
@manager.startDeviceMotionUpdatesUsingReferenceFrame(reference_frame, toQueue: queue, withHandler: internal_handler(handler))
|
21
|
+
else
|
22
|
+
@manager.startDeviceMotionUpdatesToQueue(queue, withHandler: internal_handler(handler))
|
23
|
+
end
|
24
|
+
else
|
25
|
+
if reference_frame
|
26
|
+
@manager.startDeviceMotionUpdatesUsingReferenceFrame(reference_frame)
|
27
|
+
else
|
28
|
+
@manager.startDeviceMotionUpdates
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
return self
|
33
|
+
end
|
34
|
+
|
35
|
+
private def handle_result(result_data, error, handler)
|
36
|
+
if result_data
|
37
|
+
result = {
|
38
|
+
data: result_data,
|
39
|
+
attitude: result_data.attitude,
|
40
|
+
rotation: result_data.rotationRate,
|
41
|
+
gravity: result_data.gravity,
|
42
|
+
acceleration: result_data.userAcceleration,
|
43
|
+
magnetic: result_data.magneticField,
|
44
|
+
}
|
45
|
+
|
46
|
+
if result_data.attitude
|
47
|
+
result.merge!({
|
48
|
+
roll: result_data.attitude.roll,
|
49
|
+
pitch: result_data.attitude.pitch,
|
50
|
+
yaw: result_data.attitude.yaw,
|
51
|
+
matrix: result_data.attitude.rotationMatrix,
|
52
|
+
quaternion: result_data.attitude.quaternion,
|
53
|
+
})
|
54
|
+
end
|
55
|
+
|
56
|
+
if result_data.rotationRate
|
57
|
+
result.merge!({
|
58
|
+
rotation_x: result_data.rotationRate.x,
|
59
|
+
rotation_y: result_data.rotationRate.y,
|
60
|
+
rotation_z: result_data.rotationRate.z,
|
61
|
+
})
|
62
|
+
end
|
63
|
+
|
64
|
+
if result_data.gravity
|
65
|
+
result.merge!({
|
66
|
+
gravity_x: result_data.gravity.x,
|
67
|
+
gravity_y: result_data.gravity.y,
|
68
|
+
gravity_z: result_data.gravity.z,
|
69
|
+
})
|
70
|
+
end
|
71
|
+
|
72
|
+
if result_data.userAcceleration
|
73
|
+
result.merge!({
|
74
|
+
acceleration_x: result_data.userAcceleration.x,
|
75
|
+
acceleration_y: result_data.userAcceleration.y,
|
76
|
+
acceleration_z: result_data.userAcceleration.z,
|
77
|
+
})
|
78
|
+
end
|
79
|
+
|
80
|
+
if result_data.magneticField
|
81
|
+
case result_data.magneticField.accuracy
|
82
|
+
when CMMagneticFieldCalibrationAccuracyLow
|
83
|
+
accuracy = :low
|
84
|
+
when CMMagneticFieldCalibrationAccuracyMedium
|
85
|
+
accuracy = :medium
|
86
|
+
when CMMagneticFieldCalibrationAccuracyHigh
|
87
|
+
accuracy = :high
|
88
|
+
end
|
89
|
+
|
90
|
+
result.merge!({
|
91
|
+
field: result_data.magneticField.field,
|
92
|
+
magnetic_x: result_data.magneticField.field.x,
|
93
|
+
magnetic_y: result_data.magneticField.field.y,
|
94
|
+
magnetic_z: result_data.magneticField.field.z,
|
95
|
+
magnetic_accuracy: accuracy,
|
96
|
+
})
|
97
|
+
end
|
98
|
+
else
|
99
|
+
result = nil
|
100
|
+
end
|
101
|
+
|
102
|
+
handler.call(result, error)
|
103
|
+
end
|
104
|
+
|
105
|
+
def convert_reference_frame(reference_frame)
|
106
|
+
case reference_frame
|
107
|
+
when :arbitrary_z
|
108
|
+
CMAttitudeReferenceFrameXArbitraryZVertical
|
109
|
+
when :corrected_z
|
110
|
+
CMAttitudeReferenceFrameXArbitraryCorrectedZVertical
|
111
|
+
when :magnetic_north
|
112
|
+
CMAttitudeReferenceFrameXMagneticNorthZVertical
|
113
|
+
when :true_north
|
114
|
+
CMAttitudeReferenceFrameXTrueNorthZVertical
|
115
|
+
else
|
116
|
+
reference_frame
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def available?
|
121
|
+
@manager.deviceMotionAvailable?
|
122
|
+
end
|
123
|
+
|
124
|
+
def active?
|
125
|
+
@manager.deviceMotionActive?
|
126
|
+
end
|
127
|
+
|
128
|
+
def data
|
129
|
+
@manager.deviceMotion
|
130
|
+
end
|
131
|
+
|
132
|
+
def stop
|
133
|
+
@manager.stopDeviceMotionUpdates
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module BubbleWrap
|
2
|
+
module Motion
|
3
|
+
class Gyroscope < GenericMotionInterface
|
4
|
+
|
5
|
+
def start(options={}, &handler)
|
6
|
+
if options.key?(:interval)
|
7
|
+
@manager.gyroUpdateInterval = options[:interval]
|
8
|
+
end
|
9
|
+
|
10
|
+
if handler
|
11
|
+
queue = convert_queue(options[:queue])
|
12
|
+
@manager.startGyroUpdatesToQueue(queue, withHandler: internal_handler(handler))
|
13
|
+
else
|
14
|
+
@manager.startGyroUpdates
|
15
|
+
end
|
16
|
+
|
17
|
+
return self
|
18
|
+
end
|
19
|
+
|
20
|
+
private def handle_result(result_data, error, handler)
|
21
|
+
if result_data
|
22
|
+
result = {
|
23
|
+
data: result_data,
|
24
|
+
rotation: result_data.rotationRate,
|
25
|
+
x: result_data.rotationRate.x,
|
26
|
+
y: result_data.rotationRate.y,
|
27
|
+
z: result_data.rotationRate.z,
|
28
|
+
}
|
29
|
+
else
|
30
|
+
result = nil
|
31
|
+
end
|
32
|
+
|
33
|
+
handler.call(result, error)
|
34
|
+
end
|
35
|
+
|
36
|
+
def available?
|
37
|
+
@manager.gyroAvailable?
|
38
|
+
end
|
39
|
+
|
40
|
+
def active?
|
41
|
+
@manager.gyroActive?
|
42
|
+
end
|
43
|
+
|
44
|
+
def data
|
45
|
+
@manager.gyroData
|
46
|
+
end
|
47
|
+
|
48
|
+
def stop
|
49
|
+
@manager.stopGyroUpdates
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|