tgios 0.0.28 → 0.0.29
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/tgios/beacon_manager.rb +163 -0
- data/lib/tgios/custom_method.rb +1 -1
- data/lib/tgios/image_loader.rb +1 -1
- data/lib/tgios/images_collection_view_binding.rb +44 -0
- data/lib/tgios/ns_date_helper.rb +18 -15
- data/lib/tgios/search_controller.rb +1 -1
- data/lib/tgios/ui_button_binding.rb +1 -1
- data/lib/tgios/ui_collection_view_binding.rb +78 -0
- data/lib/tgios/ui_picker_view_list_binding.rb +1 -1
- data/lib/tgios/ui_table_view_list_binding.rb +1 -1
- data/lib/tgios/ui_table_view_model_binding.rb +1 -1
- data/lib/tgios/ui_table_view_model_list_binding.rb +1 -1
- data/lib/tgios/ui_text_field_binding.rb +1 -1
- data/lib/tgios/ui_text_view_binding.rb +1 -1
- data/lib/tgios/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NDgwMjVjYThlM2M3YzExYTRjNGE0NTMxMDVmNDBkNjRlNjcxMmY3Nw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NDliZjc4NTNiYWFjM2VkMWQ5YWZiNTBhMjJlNzE3OGI5MDcwMTg0Ng==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZTk3ODVmNTZjZDg4NDYzMTdiOTZhYjJlMTUxMTkzOTA2NjIxM2M4NDFjYjc0
|
10
|
+
ODdkYTE2YmY1ZWMwMjkyODViYzYyYzBmYjRkYzU4ZmE2ZWEyZjg1NTQzM2Ex
|
11
|
+
M2QzZWJjYTQ4ZjA4MjE5OTVlMjg0NjY0YTlkZTg0NjNiOGU1NzQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MTg5OWFjZDIyNGQ4NzgwYTQzZjRkOTUxM2E1ZWZmYmE4ODE5OWJiODQyMGRm
|
14
|
+
MDU2ZTJkMzJjYzRhZDgxZjI4ODE3NmMwYjRmNDY5NjdmOTJiMzZlNGRiMmVl
|
15
|
+
OTcwZjgxNWNkNTViOTkzNTI3ZTYwMzljYmQwYmMyOTk0ZDcwNzI=
|
@@ -0,0 +1,163 @@
|
|
1
|
+
module Tgios
|
2
|
+
class FakeBeacon
|
3
|
+
attr_accessor :proximityUUID, :major, :minor
|
4
|
+
|
5
|
+
def initialize(attributes)
|
6
|
+
attributes.each do |k, v|
|
7
|
+
k = :proximityUUID if k.to_s == 'uuid'
|
8
|
+
instance_variable_set("@#{k}", v)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class BeaconManager < BindingBase
|
14
|
+
attr_accessor :rssi
|
15
|
+
|
16
|
+
def self.default=(val)
|
17
|
+
@default = val
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.default
|
21
|
+
@default
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(uuid, rssi=-70)
|
25
|
+
@events = {}
|
26
|
+
@previous_beacons = []
|
27
|
+
|
28
|
+
@uuid = NSUUID.alloc.initWithUUIDString(uuid)
|
29
|
+
@rssi = rssi
|
30
|
+
|
31
|
+
@region = CLBeaconRegion.alloc.initWithProximityUUID(@uuid, identifier: uuid.split('-').first)
|
32
|
+
@region.notifyOnEntry = true
|
33
|
+
@region.notifyOnExit = true
|
34
|
+
@region.notifyEntryStateOnDisplay = true
|
35
|
+
|
36
|
+
start_monitor
|
37
|
+
|
38
|
+
UIApplicationWillEnterForegroundNotification.add_observer(self, 'on_enter_foreground:')
|
39
|
+
UIApplicationDidEnterBackgroundNotification.add_observer(self, 'on_enter_background:')
|
40
|
+
end
|
41
|
+
|
42
|
+
def on(event_key,&block)
|
43
|
+
@events[event_key] = block.weak!
|
44
|
+
self
|
45
|
+
end
|
46
|
+
|
47
|
+
def locationManager(manager, didDetermineState: state, forRegion: region)
|
48
|
+
NSLog "didDetermineState #{state}"
|
49
|
+
if state == CLRegionStateInside
|
50
|
+
location_manager.startRangingBeaconsInRegion(region)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def locationManager(manager, didEnterRegion: region)
|
55
|
+
NSLog 'didEnterRegion'
|
56
|
+
if region.isKindOfClass(CLBeaconRegion)
|
57
|
+
location_manager.startRangingBeaconsInRegion(region)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def locationManager(manager, didExitRegion: region)
|
62
|
+
NSLog 'didExitRegion'
|
63
|
+
if region.isKindOfClass(CLBeaconRegion)
|
64
|
+
location_manager.stopRangingBeaconsInRegion(region)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def locationManager(manager, didRangeBeacons: beacons, inRegion: region)
|
69
|
+
if has_event(:beacons_found)
|
70
|
+
@events[:beacons_found].call(beacons.select{|b| b.proximity != CLProximityUnknown && b.rssi >= @rssi})
|
71
|
+
end
|
72
|
+
if has_event(:beacon_found)
|
73
|
+
known_beacons = beacons.select{|b| b.proximity != CLProximityUnknown}.sort_by{|b| b.rssi}
|
74
|
+
if known_beacons.present?
|
75
|
+
beacon = known_beacons.last if known_beacons.last.rssi >= @rssi
|
76
|
+
beacon ||= known_beacons.last if known_beacons.length == 1 && known_beacons.last.rssi >= @rssi - 1
|
77
|
+
end
|
78
|
+
|
79
|
+
push_beacon(beacon)
|
80
|
+
@events[:beacon_found].call(@current_beacon)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def location_manager
|
85
|
+
@location_manager ||=
|
86
|
+
begin
|
87
|
+
manager = CLLocationManager.alloc.init
|
88
|
+
manager.delegate = self
|
89
|
+
manager
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def start_monitor
|
94
|
+
location_manager.startMonitoringForRegion(@region)
|
95
|
+
location_manager.requestStateForRegion(@region)
|
96
|
+
end
|
97
|
+
|
98
|
+
def stop_monitor
|
99
|
+
location_manager.stopRangingBeaconsInRegion(@region)
|
100
|
+
location_manager.stopMonitoringForRegion(@region)
|
101
|
+
end
|
102
|
+
|
103
|
+
def on_enter_foreground(noti)
|
104
|
+
NSLog 'on_enter_foreground'
|
105
|
+
self.performSelector('start_monitor', withObject: nil, afterDelay:1)
|
106
|
+
end
|
107
|
+
|
108
|
+
def on_enter_background(noti)
|
109
|
+
NSLog 'on_enter_background'
|
110
|
+
stop_monitor
|
111
|
+
end
|
112
|
+
|
113
|
+
def has_event(event)
|
114
|
+
@events.has_key?(event)
|
115
|
+
end
|
116
|
+
|
117
|
+
def push_beacon(beacon)
|
118
|
+
if beacon_eqs(beacon, @current_beacon)
|
119
|
+
@current_beacon = beacon
|
120
|
+
else
|
121
|
+
if @previous_beacons.find { |b| !beacon_eqs(beacon, b) }.blank?
|
122
|
+
@current_beacon = beacon
|
123
|
+
else
|
124
|
+
@current_beacon = nil if @previous_beacons.find{ |b| beacon_eqs(@current_beacon, b)}.blank?
|
125
|
+
end
|
126
|
+
end
|
127
|
+
@previous_beacons << beacon
|
128
|
+
@previous_beacons.delete_at(0) if @previous_beacons.length > 3
|
129
|
+
end
|
130
|
+
|
131
|
+
def beacon_eqs(beacon1, beacon2)
|
132
|
+
self.class.beacon_eqs(beacon1, beacon2)
|
133
|
+
end
|
134
|
+
|
135
|
+
def self.beacon_eqs(beacon1, beacon2)
|
136
|
+
return beacon1 == beacon2 if beacon1.nil? || beacon2.nil?
|
137
|
+
beacon1.minor == beacon2.minor && beacon1.major == beacon2.major && beacon1.proximityUUID == beacon2.proximityUUID
|
138
|
+
end
|
139
|
+
|
140
|
+
def new_fake_beacon(options)
|
141
|
+
FakeBeacon.new({uuid: @uuid}.merge(options))
|
142
|
+
end
|
143
|
+
|
144
|
+
def self.supported
|
145
|
+
CLLocationManager.isRangingAvailable
|
146
|
+
end
|
147
|
+
|
148
|
+
def onPrepareForRelease
|
149
|
+
UIApplicationWillEnterForegroundNotification.remove_observer(self)
|
150
|
+
UIApplicationDidEnterBackgroundNotification.remove_observer(self)
|
151
|
+
stop_monitor
|
152
|
+
@location_manager = nil
|
153
|
+
@events = nil
|
154
|
+
@current_beacon = nil
|
155
|
+
@previous_beacons = nil
|
156
|
+
end
|
157
|
+
|
158
|
+
def dealloc
|
159
|
+
onPrepareForRelease
|
160
|
+
super
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
data/lib/tgios/custom_method.rb
CHANGED
data/lib/tgios/image_loader.rb
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
module Tgios
|
2
|
+
class ImagesCollectionViewBinding < UICollectionViewBinding
|
3
|
+
include PlasticCup
|
4
|
+
attr_accessor :image_collection_view, :image_views
|
5
|
+
def initialize(list, collection_view=nil, image_view_options={})
|
6
|
+
super
|
7
|
+
@image_collection_view = collection_view.nil? ? self.class.new_horizontal_collection_view : WeakRef.new(collection_view)
|
8
|
+
@image_views = self.class.new_image_views(list, image_view_options)
|
9
|
+
|
10
|
+
bind(@image_collection_view, @image_views)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.new_image_views(list, options={})
|
14
|
+
image_views = []
|
15
|
+
list.each do |item|
|
16
|
+
image_view = Base.style(UIImageView.new, {frame: [[0,0], [50, 50]],
|
17
|
+
contentMode: UIViewContentModeScaleAspectFill,
|
18
|
+
layer: {
|
19
|
+
borderWidth: 1,
|
20
|
+
borderColor: :gray.uicolor.CGColor
|
21
|
+
},
|
22
|
+
clipsToBounds: true}.merge(options))
|
23
|
+
CommonUIUtility.get_image(item) do |image|
|
24
|
+
image_view.image = image
|
25
|
+
end
|
26
|
+
image_views << image_view
|
27
|
+
end
|
28
|
+
image_views
|
29
|
+
end
|
30
|
+
|
31
|
+
def list=(new_list)
|
32
|
+
if new_list.is_a?(Array)
|
33
|
+
@image_views = self.class.new_image_views(new_list)
|
34
|
+
reload(@image_views)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def onPrepareForRelease
|
39
|
+
@image_collection_view = nil
|
40
|
+
@image_views = nil
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
data/lib/tgios/ns_date_helper.rb
CHANGED
@@ -1,22 +1,25 @@
|
|
1
1
|
module Tgios
|
2
2
|
class NSDateHelper
|
3
3
|
def self.to_nsdate(date_string)
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
if date.nil?
|
12
|
-
@formatter2 ||= (
|
13
|
-
@formatter2 = NSDateFormatter.new
|
14
|
-
@formatter2.dateFormat = "yyyy-MM-dd HH:mm:ss"
|
15
|
-
@formatter2.timeZone = NSTimeZone.timeZoneForSecondsFromGMT(0)
|
16
|
-
@formatter2
|
4
|
+
if date_string.is_a?(String)
|
5
|
+
date_string = date_string.gsub(/\.\d*/, '') # remove mini-seconds
|
6
|
+
@formatter ||= (
|
7
|
+
@formatter = NSDateFormatter.new
|
8
|
+
@formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
|
9
|
+
@formatter.timeZone = NSTimeZone.timeZoneForSecondsFromGMT(0)
|
10
|
+
@formatter
|
17
11
|
)
|
18
|
-
date = @
|
19
|
-
|
12
|
+
date = @formatter.dateFromString(date_string)
|
13
|
+
if date.nil?
|
14
|
+
@formatter2 ||= (
|
15
|
+
@formatter2 = NSDateFormatter.new
|
16
|
+
@formatter2.dateFormat = "yyyy-MM-dd HH:mm:ss"
|
17
|
+
@formatter2.timeZone = NSTimeZone.timeZoneForSecondsFromGMT(0)
|
18
|
+
@formatter2
|
19
|
+
)
|
20
|
+
date = @formatter2.dateFromString(date_string).utc
|
21
|
+
end
|
22
|
+
date
|
20
23
|
else
|
21
24
|
date.utc
|
22
25
|
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Tgios
|
2
|
+
class UICollectionViewBinding < BindingBase
|
3
|
+
include PlasticCup
|
4
|
+
|
5
|
+
def initialize(*args)
|
6
|
+
super
|
7
|
+
@events={}
|
8
|
+
@events[:setup_cell]=->(cell, subview, index_path) { setup_cell(cell, subview, index_path) }
|
9
|
+
end
|
10
|
+
|
11
|
+
def on(event_name, &block)
|
12
|
+
@events[event_name]=block.weak!
|
13
|
+
self
|
14
|
+
end
|
15
|
+
|
16
|
+
def bind(collection_view, views=nil)
|
17
|
+
@collection_view = WeakRef.new(collection_view)
|
18
|
+
@collection_view.registerClass(UICollectionViewCell, forCellWithReuseIdentifier:'UICollectionViewCell')
|
19
|
+
@views = WeakRef.new(views) unless views.nil?
|
20
|
+
@collection_view.delegate = self
|
21
|
+
@collection_view.dataSource = self
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
def reload(views=nil)
|
26
|
+
@views = WeakRef.new(views) unless views.nil?
|
27
|
+
@collection_view.reloadData if @collection_view.weakref_alive?
|
28
|
+
end
|
29
|
+
|
30
|
+
def collectionView(collectionView, numberOfItemsInSection: section)
|
31
|
+
@views.count
|
32
|
+
end
|
33
|
+
|
34
|
+
def collectionView(collectionView, cellForItemAtIndexPath: indexPath)
|
35
|
+
cell = collectionView.dequeueReusableCellWithReuseIdentifier('UICollectionViewCell', forIndexPath:indexPath)
|
36
|
+
@events[:setup_cell].call(cell, view_at(indexPath), indexPath)
|
37
|
+
cell
|
38
|
+
end
|
39
|
+
|
40
|
+
def collectionView(collectionView, didSelectItemAtIndexPath: indexPath)
|
41
|
+
@events[:item_tapped].call(view_at(indexPath), indexPath.row) unless @events[:item_tapped].nil?
|
42
|
+
end
|
43
|
+
|
44
|
+
def scrollViewDidEndDecelerating(scrollView)
|
45
|
+
page = (scrollView.contentOffset.x / scrollView.frame.size.width).round
|
46
|
+
if page != @page
|
47
|
+
@page = page
|
48
|
+
@events[:page_changed].call(page) unless @events[:page_changed].nil?
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def view_at(index_path)
|
53
|
+
@views[index_path.row]
|
54
|
+
end
|
55
|
+
|
56
|
+
def setup_cell(cell, subview, index_path)
|
57
|
+
cell.contentView.subviews.makeObjectsPerformSelector('removeFromSuperview')
|
58
|
+
cell.contentView.addSubview(subview)
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.new_horizontal_collection_view(options={})
|
62
|
+
layout = Base.style(UICollectionViewFlowLayout.new,
|
63
|
+
{scrollDirection: UICollectionViewScrollDirectionHorizontal,
|
64
|
+
sectionInset:UIEdgeInsetsMake(0, 15, 0, 10)}.merge(options[:layout] || {}))
|
65
|
+
Base.style(UICollectionView.alloc.initWithFrame(CGRectZero, collectionViewLayout: layout),
|
66
|
+
{backgroundColor: :white.uicolor}.merge(options[:view] || {})
|
67
|
+
)
|
68
|
+
end
|
69
|
+
|
70
|
+
def onPrepareForRelease
|
71
|
+
@events=nil
|
72
|
+
@collection_view.delegate = nil
|
73
|
+
@collection_view.dataSource = nil
|
74
|
+
@collection_view = nil
|
75
|
+
@views = nil
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/lib/tgios/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tgios
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.29
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- April Tsang
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-07-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sugarcube
|
@@ -86,12 +86,14 @@ files:
|
|
86
86
|
- app/app_delegate.rb
|
87
87
|
- lib/tgios.rb
|
88
88
|
- lib/tgios/animatable_view.rb
|
89
|
+
- lib/tgios/beacon_manager.rb
|
89
90
|
- lib/tgios/binding_base.rb
|
90
91
|
- lib/tgios/common_ui_utility.rb
|
91
92
|
- lib/tgios/custom_method.rb
|
92
93
|
- lib/tgios/extended_ui_table_view.rb
|
93
94
|
- lib/tgios/extended_ui_view_controller.rb
|
94
95
|
- lib/tgios/image_loader.rb
|
96
|
+
- lib/tgios/images_collection_view_binding.rb
|
95
97
|
- lib/tgios/loading_indicator.rb
|
96
98
|
- lib/tgios/model_errors_helper.rb
|
97
99
|
- lib/tgios/ns_date_helper.rb
|
@@ -100,6 +102,7 @@ files:
|
|
100
102
|
- lib/tgios/photo_upload.rb
|
101
103
|
- lib/tgios/search_controller.rb
|
102
104
|
- lib/tgios/ui_button_binding.rb
|
105
|
+
- lib/tgios/ui_collection_view_binding.rb
|
103
106
|
- lib/tgios/ui_picker_view_list_binding.rb
|
104
107
|
- lib/tgios/ui_table_view_list_binding.rb
|
105
108
|
- lib/tgios/ui_table_view_model_binding.rb
|