tgios 0.0.37 → 0.0.38

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OTgwNWZlYjdjMDRiMjUxMzcxZTkxZDhjYzA5NjNkMDVkZTZhMDNhMw==
4
+ MTIzZDUyZTdiNGY4ZGQwODBjNTI2ZDk2ZTkyN2NmZTNhNGEzNzI5ZQ==
5
5
  data.tar.gz: !binary |-
6
- MGRkYjE1Mzg0YTg5NTNkYzkwOGVlYzgzNzk3NGVkZDA5ODhhNzRhNg==
6
+ YzRlYWViYjJlYjBlYzk4YzBjY2M1YzAzMTgyOGQ3OGM2ODkwMTEzMg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- OWE1NGZhMzc4OGJlYWRkMjBiOWU0NDU5ZjRjMjc5ZDUxNjAwY2VjNDRkYWQ2
10
- MTU1YTg3YWQxYTcwZTI0MTQ3Njg0Y2MzM2U2MDgyMjljY2U1NTI1ZmZhODZm
11
- ZGI3MmZjYTRhYWRmMTkyYjkxZjc3ZjY3ZmQ0NTZjMDdlYmZjZTc=
9
+ MDZhMDk5Mjk0OTIxOGNlNDYzMzJmM2JiNzRmNDY3ZTU1OTE1NGYyNTUwMGMy
10
+ NTFmN2RlNTg4ZDllZjMzYmFiZmQyNmI4ZGVmMWNlZDVhNDZjNGYzYjRkZDE3
11
+ NTQzYjNjNWFmMzVhNzk3N2RlODJiMjBlOTQ3MmFlNzc4NTU1ZGE=
12
12
  data.tar.gz: !binary |-
13
- NzNjYjhhMDIxOGVmOWExNzM4YWJmOGEwMDc3ZDE2MWI5Mzk4N2Q1ZWE0NDEw
14
- ZWMzNTU2ZGMyZGEwMThhZThmMTUxY2Y4NzQ4ZTRkYTFiYzJiNTYyN2NjMjA3
15
- YzZlYmI2NDBlNWNhNmRhZjI0NDQxZTJjNGRhMjM1ZWE3NGVlODc=
13
+ M2U3MzU2M2FhYzllMjUzYThmMzYxNjM0NjU5YjJlM2JhMzEzOGVkYjkxMWMy
14
+ N2I3ZDRkNzJkYjZlMDgwNTlhZTczOGVjY2ZiYzMxZGExNzE1Y2NkMjk1NDhi
15
+ MmQwZjliYTNiNGY2ZTNiZTY2ODM1NDUxYjJiOWFiZTNhZDNjY2Q=
@@ -5,7 +5,7 @@
5
5
 
6
6
  module Tgios
7
7
  class FakeBeacon
8
- attr_accessor :proximityUUID, :major, :minor
8
+ attr_accessor :proximityUUID, :major, :minor, :accuracy, :proximity, :rssi
9
9
 
10
10
  def initialize(attributes)
11
11
  attributes.each do |k, v|
@@ -17,8 +17,10 @@ module Tgios
17
17
 
18
18
  class BeaconManager < BindingBase
19
19
  attr_accessor :range_method, :range_limit, :tolerance, :current_beacon, :background
20
+ ALGORITHMS = [:continue, :timeout]
20
21
 
21
22
  BeaconFoundKey = 'Tgios::BeaconManager::BeaconFound'
23
+ BeaconsFoundKey = 'Tgios::BeaconManager::BeaconsFound'
22
24
  EnterRegionKey = 'Tgios::BeaconManager::EnterRegion'
23
25
  ExitRegionKey = 'Tgios::BeaconManager::ExitRegion'
24
26
 
@@ -30,17 +32,36 @@ module Tgios
30
32
  @default
31
33
  end
32
34
 
33
- def initialize(uuid, range_limit=-70, background=false, tolerance=5, range_method=:rssi)
35
+ #############################################
36
+ # range_method: :rssi or :accuracy
37
+ # range_limit: around -70 for :rssi / around 1.5 (meters) for :accuracy
38
+ # background: range beacons when device is in background
39
+ # algorithm: :continue or :timeout
40
+ # tolerance: for algorithm continue: number of times a beacon is ranged continuously required to trigger beacon changed event, for algorithm timeout: time in seconds for a beacon marked as changed
41
+ #############################################
42
+
43
+ def initialize(options)
34
44
  @events = {}
35
45
  @previous_beacons = []
36
- @background = background
37
- @tolerance = (tolerance || 5)
38
-
39
- @uuid = NSUUID.alloc.initWithUUIDString(uuid)
40
- @range_method = range_method
41
- @range_limit = range_limit
42
-
43
- @region = CLBeaconRegion.alloc.initWithProximityUUID(@uuid, identifier: uuid.split('-').first)
46
+ @beacons_last_seen_at = {}
47
+ @background = options[:background]
48
+
49
+ self.algorithm = (options[:algorithm] || :continue)
50
+ @tolerance = (options[:tolerance] || 5)
51
+
52
+ @uuid = NSUUID.alloc.initWithUUIDString(options[:uuid])
53
+ @major = options[:major]
54
+ @minor = options[:minor]
55
+ @range_method = (options[:range_method] || :rssi)
56
+ @range_limit = (options[:range_limit] || -70)
57
+
58
+ @region = if @major && @minor
59
+ CLBeaconRegion.alloc.initWithProximityUUID(@uuid, major: @major, minor: @minor, identifier: identifier)
60
+ elsif @major
61
+ CLBeaconRegion.alloc.initWithProximityUUID(@uuid, major: @major, identifier: identifier)
62
+ else
63
+ CLBeaconRegion.alloc.initWithProximityUUID(@uuid, identifier: identifier)
64
+ end
44
65
  @region.notifyOnEntry = true
45
66
  @region.notifyOnExit = true
46
67
  @region.notifyEntryStateOnDisplay = true
@@ -49,6 +70,11 @@ module Tgios
49
70
 
50
71
  UIApplicationWillEnterForegroundNotification.add_observer(self, 'on_enter_foreground:')
51
72
  UIApplicationDidEnterBackgroundNotification.add_observer(self, 'on_enter_background:')
73
+
74
+ end
75
+
76
+ def identifier
77
+ [@uuid.UUIDString, @major, @minor].join('/')
52
78
  end
53
79
 
54
80
  def on(event_key,&block)
@@ -56,28 +82,35 @@ module Tgios
56
82
  self
57
83
  end
58
84
 
85
+ def algorithm=(val)
86
+ alg = val.to_s.to_sym
87
+ return unless alg.present?
88
+ if @algorithm != alg
89
+ @previous_beacons.clear
90
+ end
91
+ raise ArgumentError.new("Algorithm not found, valid algorithm are: [#{ALGORITHMS.join(', ')}]") unless ALGORITHMS.include?(alg)
92
+
93
+ @algorithm = alg
94
+ end
95
+
59
96
  def locationManager(manager, didDetermineState: state, forRegion: region)
60
97
  NSLog "didDetermineState #{state}"
61
98
  if state == CLRegionStateInside
62
99
  manager.startRangingBeaconsInRegion(region)
100
+ did_enter_region(region)
101
+ elsif state == CLRegionStateOutside
102
+ did_exit_region(region)
63
103
  end
64
104
  end
65
105
 
66
106
  def locationManager(manager, didEnterRegion: region)
67
107
  NSLog 'didEnterRegion'
68
- if region.isKindOfClass(CLBeaconRegion)
69
- manager.startRangingBeaconsInRegion(region)
70
- end
108
+ did_enter_region(region)
71
109
  end
72
110
 
73
111
  def locationManager(manager, didExitRegion: region)
74
112
  NSLog 'didExitRegion'
75
- if region.isKindOfClass(CLBeaconRegion)
76
- manager.stopRangingBeaconsInRegion(region)
77
- if has_event(:exit_region)
78
- @events[:exit_region].call(region)
79
- end
80
- end
113
+ did_exit_region(region)
81
114
  end
82
115
 
83
116
  def locationManager(manager, didRangeBeacons: beacons, inRegion: region)
@@ -105,6 +138,11 @@ module Tgios
105
138
  end
106
139
 
107
140
  BeaconFoundKey.post_notification(self, {region: region, beacon: @current_beacon})
141
+ BeaconsFoundKey.post_notification(self, {region: region, beacon: @current_beacon, beacons_in_range: beacons_in_range, any_beacons: known_beacons + unknown_beacons})
142
+ end
143
+
144
+ def locationManager(manager, rangingBeaconsDidFailForRegion: region, withError: error)
145
+ @events[:ranging_failed].call(region, error) if @events[:range_failed]
108
146
  end
109
147
 
110
148
  def location_manager
@@ -159,22 +197,67 @@ module Tgios
159
197
  stop_monitor unless @background
160
198
  end
161
199
 
200
+ def did_enter_region(region)
201
+ if region.isKindOfClass(CLBeaconRegion)
202
+ location_manager.startRangingBeaconsInRegion(region)
203
+ if has_event(:enter_region)
204
+ @events[:enter_region].call(region)
205
+ end
206
+ EnterRegionKey.post_notification(self, {region: region})
207
+ end
208
+ end
209
+
210
+ def did_exit_region(region)
211
+ if region.isKindOfClass(CLBeaconRegion)
212
+ location_manager.stopRangingBeaconsInRegion(region)
213
+ if has_event(:exit_region)
214
+ @events[:exit_region].call(region)
215
+ end
216
+ ExitRegionKey.post_notification(self, {region: region})
217
+ end
218
+ end
219
+
162
220
  def has_event(event)
163
221
  @events.has_key?(event)
164
222
  end
165
223
 
166
224
  def push_beacon(beacon)
167
- if beacon_eqs(beacon, @current_beacon)
168
- @current_beacon = beacon
169
- else
170
- if @previous_beacons.find { |b| !beacon_eqs(beacon, b) }.blank?
171
- @current_beacon = beacon
172
- else
173
- @current_beacon = nil if @previous_beacons.find{ |b| beacon_eqs(@current_beacon, b)}.blank?
174
- end
225
+ case @algorithm
226
+ when :continue
227
+ if beacon_eqs(beacon, @current_beacon)
228
+ @current_beacon = beacon
229
+ else
230
+ if @previous_beacons.find { |b| !beacon_eqs(beacon, b) }.blank? # all previous beacons is the new beacon
231
+ @current_beacon = beacon
232
+ else
233
+ @current_beacon = nil if @previous_beacons.find{ |b| beacon_eqs(@current_beacon, b)}.blank? # all previous beacons is not the current beacon
234
+ end
235
+ end
236
+ @previous_beacons << beacon
237
+ @previous_beacons.delete_at(0) if @previous_beacons.length > @tolerance
238
+
239
+ when :timeout
240
+ time_now = Time.now
241
+ beacon_hash = {beacon: beacon, time: time_now}
242
+ @beacons_last_seen_at[self.class.beacon_key(beacon)] = beacon_hash
243
+
244
+ while @previous_beacons.present? && time_now - @previous_beacons.first[:time] > @tolerance do
245
+ @previous_beacons.delete_at(0)
246
+ end
247
+ @previous_beacons << beacon_hash
248
+
249
+ current_beacon_hash = @beacons_last_seen_at[self.class.beacon_key(@current_beacon)]
250
+ if current_beacon_hash
251
+
252
+ end
253
+ if !current_beacon_hash || time_now - current_beacon_hash[:time] < @tolerance
254
+ # current beacon not change
255
+ else
256
+ count_hash = @previous_beacons.each_with_object(Hash.new(0)) {|e, h| h[self.class.beacon_key(e[:beacon])] += @tolerance - (time_now - e[:time])} # beacon has more weighting if time is later
257
+ max_beacon_key = count_hash.max_by(&:last).first
258
+ @current_beacon = @beacons_last_seen_at[max_beacon_key][:beacon]
259
+ end
175
260
  end
176
- @previous_beacons << beacon
177
- @previous_beacons.delete_at(0) if @previous_beacons.length > @tolerance
178
261
  end
179
262
 
180
263
  def beacon_eqs(beacon1, beacon2)
@@ -186,6 +269,10 @@ module Tgios
186
269
  beacon1.minor == beacon2.minor && beacon1.major == beacon2.major && beacon1.proximityUUID == beacon2.proximityUUID
187
270
  end
188
271
 
272
+ def self.beacon_key(beacon)
273
+ [beacon.try(:proximityUUIDbeacon), beacon.try(:major), beacon.try(:minor)].join('/')
274
+ end
275
+
189
276
  def new_fake_beacon(options)
190
277
  FakeBeacon.new({uuid: @uuid}.merge(options))
191
278
  end
@@ -3,7 +3,7 @@ module Tgios
3
3
 
4
4
  def initialize(url)
5
5
  super
6
- @url = url
6
+ @url = url.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
7
7
  @events = {}
8
8
  end
9
9
 
@@ -1,20 +1,17 @@
1
1
  module Tgios
2
2
  class PhotoController < ExtendedUIViewController
3
- include LoadingIndicator
4
3
  attr_accessor :url
5
4
 
6
5
  def viewDidLoad
7
6
  super
8
7
  self.view.backgroundColor = :black.uicolor
9
8
 
10
- add_loading_indicator_to(self.view)
9
+ @load_view = LoadingView.add_loading_view_to(self.view)
11
10
  unless @url.nil?
12
- start_loading
13
- image_loader = ImageLoader.new(@url)
14
- image_loader.on(:image_loaded) do |image, success|
15
- stop_loading
16
- if success
17
- ap 'image loaded'
11
+ @load_view.start_loading
12
+ ImageLoader.load_url(@url) do |image, success|
13
+ @load_view.stop_loading
14
+ if success && self.view
18
15
  # TODO: use motion layout or other way to handle frame size (or allow full screen)
19
16
  small_frame = self.view.bounds
20
17
  small_frame.size.height -= 20 + 44 if small_frame == UIScreen.mainScreen.bounds
@@ -22,9 +19,7 @@ module Tgios
22
19
  scroll_view = PhotoScrollView.alloc.initWithFrame(small_frame, image: image)
23
20
  self.view.addSubview(scroll_view)
24
21
  end
25
- image_loader.prepareForRelease
26
22
  end
27
- image_loader.load
28
23
 
29
24
  end
30
25
  end
@@ -7,14 +7,38 @@ module Tgios
7
7
  self.view.backgroundColor = :dark_gray.uicolor
8
8
  @load_view = Tgios::LoadingView.add_loading_view_to(self.view)
9
9
  @load_view.start_loading
10
- if Device.simulator?
10
+ if NSProcessInfo.processInfo.environment[:IPHONE_SIMULATOR_DEVICE].present?
11
11
  self.performSelector('fake_scan', withObject: nil, afterDelay: 3)
12
12
  else
13
- self.performSelector('startScanning', withObject: nil, afterDelay: 0.5)
13
+ check_permission
14
+ # self.performSelector('startScanning', withObject: nil, afterDelay: 0.5)
14
15
  end
15
16
 
16
17
  end
17
18
 
19
+ def check_permission
20
+ status = AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo)
21
+ if status == AVAuthorizationStatusAuthorized
22
+ self.performSelector('startScanning', withObject: nil, afterDelay: 0.5)
23
+ elsif status == AVAuthorizationStatusNotDetermined
24
+ Dispatch::Queue.new('ScanQrController').async do
25
+ AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: ->(granted) {
26
+ if granted
27
+ Dispatch::Queue.main.async do
28
+ startScanning
29
+ end
30
+ else
31
+ Dispatch::Queue.main.async do
32
+ @events[:permission_denied].call if @events[:permission_denied]
33
+ end
34
+ end
35
+ })
36
+ end
37
+ else
38
+ @events[:permission_denied].call if @events[:permission_denied]
39
+ end
40
+ end
41
+
18
42
  def startScanning
19
43
  @load_view.stop_loading
20
44
  setupCapture
@@ -27,6 +51,16 @@ module Tgios
27
51
  @session.sessionPreset = AVCaptureSessionPresetHigh
28
52
 
29
53
  @device = AVCaptureDevice.defaultDeviceWithMediaType AVMediaTypeVideo
54
+ if @device.lockForConfiguration(nil)
55
+ if @device.isFocusModeSupported(AVCaptureFocusModeContinuousAutoFocus)
56
+ @device.focusMode = AVCaptureFocusModeContinuousAutoFocus
57
+ end
58
+ if @device.isAutoFocusRangeRestrictionSupported
59
+ @device.autoFocusRangeRestriction = AVCaptureAutoFocusRangeRestrictionNear
60
+ end
61
+ @device.unlockForConfiguration
62
+ end
63
+
30
64
  @error = Pointer.new('@')
31
65
  @input = AVCaptureDeviceInput.deviceInputWithDevice @device, error: @error
32
66
 
@@ -35,7 +35,7 @@ module Tgios
35
35
  @search_bar.sizeToFit
36
36
  @search_bar.delegate=self
37
37
  @search_result_table.tableHeaderView=@search_bar
38
- @search_bar.becomeFirstResponder unless @hide_keyboard
38
+ @search_bar.performSelector('becomeFirstResponder', withObject: nil, afterDelay: 0.0) unless @hide_keyboard
39
39
  @events[:after_layout].call(@search_bar, @search_result_table) unless @events[:after_layout].nil?
40
40
 
41
41
  end
@@ -64,6 +64,16 @@ module Tgios
64
64
  end
65
65
  end
66
66
 
67
+ def viewWillAppear(animated)
68
+ super
69
+ @search_result_table_binding.listen_to_keyboard
70
+ end
71
+
72
+ def viewWillDisappear(animated)
73
+ @search_result_table_binding.stop_listen_to_keyboard
74
+ super
75
+ end
76
+
67
77
  def init
68
78
  super
69
79
  @events={}
@@ -1,8 +1,9 @@
1
1
  module Tgios
2
2
  class TableSectionListBinding < BindingBase
3
- Events = [:cell_identifier, :build_cell, :update_cell,
3
+ Events = [:cell_identifier, :build_cell, :update_cell, :update_accessory,
4
4
  :get_section, :get_section_text, :get_section_footer_text, :get_rows, :get_row, :get_row_text, :get_row_detail_text,
5
- :touch_row, :cell_height, :section_header, :section_footer, :reach_bottom, :header_height, :footer_height
5
+ :touch_row, :delete_row, :can_delete_row, :should_indent, :editing_style,
6
+ :cell_height, :section_header, :section_footer, :reach_bottom, :header_height, :footer_height
6
7
  ]
7
8
 
8
9
  def initialize(table_view, list, options={})
@@ -137,6 +138,26 @@ module Tgios
137
138
  end
138
139
  end
139
140
 
141
+ def tableView(tableView, commitEditingStyle: editingStyle, forRowAtIndexPath: index_path)
142
+ if editingStyle == UITableViewCellEditingStyleDelete
143
+ if @events[:delete_row].present?
144
+ record = @events[:get_row].call(index_path)
145
+ @events[:delete_row].call(index_path, record) do |success|
146
+ tableView.deleteRowsAtIndexPaths([index_path], withRowAnimation: UITableViewRowAnimationFade) if success
147
+ end
148
+ end
149
+ end
150
+ end
151
+
152
+ def tableView(tableView, canEditRowAtIndexPath:index_path)
153
+ if @events[:can_delete_row].present?
154
+ record = @events[:get_row].call(index_path)
155
+ @events[:can_delete_row].call(index_path, record)
156
+ else
157
+ @events[:delete_row].present?
158
+ end
159
+ end
160
+
140
161
  def tableView(tableView, numberOfRowsInSection: section)
141
162
  rows = @events[:get_rows].call(section)
142
163
  rows.length
@@ -196,6 +217,23 @@ module Tgios
196
217
  0
197
218
  end
198
219
 
220
+ def tableView(tableView, shouldIndentWhileEditingRowAtIndexPath:index_path)
221
+ flag = if @events.has_key?(:should_indent)
222
+ record = @events[:get_row].call(index_path)
223
+ @events[:should_indent].call(index_path, record)
224
+ end
225
+ return flag unless flag.nil?
226
+ true
227
+ end
228
+
229
+ def tableView(tableView, editingStyleForRowAtIndexPath:index_path)
230
+ style = if @events.has_key?(:editing_style)
231
+ record = @events[:get_row].call(index_path)
232
+ @events[:editing_style].call(index_path, record)
233
+ end
234
+ return style unless style.nil?
235
+ UITableViewCellEditingStyleDelete
236
+ end
199
237
 
200
238
  def tableView(tableView, willDisplayCell:cell, forRowAtIndexPath:index_path)
201
239
  unless @events[:reach_bottom].nil? || index_path.section < @list.length - 1 || index_path.row < @events[:get_rows].call(index_path).length - 1
@@ -43,6 +43,18 @@ module Tgios
43
43
  @events[:item_tapped].call(view_at(indexPath), indexPath.row) unless @events[:item_tapped].nil?
44
44
  end
45
45
 
46
+ def collectionView(collectionView, layout:collectionViewLayout, sizeForItemAtIndexPath:indexPath)
47
+ size = if @events[:item_size].nil?
48
+ view_at(indexPath).try(:bounds).try(:size)
49
+ else
50
+ @events[:item_size].call(view_at(indexPath), indexPath)
51
+ end
52
+ unless size && size != CGSizeZero
53
+ size = collectionViewLayout.itemSize
54
+ end
55
+ size
56
+ end
57
+
46
58
  def scrollViewDidEndDecelerating(scrollView)
47
59
  page = (scrollView.contentOffset.x / scrollView.frame.size.width).round
48
60
  if page != @current_page
@@ -12,6 +12,11 @@ module Tgios
12
12
  @tableView.delegate=self
13
13
  @display_field=display_field
14
14
  set_list(list)
15
+ if @table_utility_binding.nil?
16
+ @table_utility_binding = UITableViewUtilityBinding.new.bind(@tableView)
17
+ else
18
+ @table_utility_binding.bind(@tableView)
19
+ end
15
20
  @options=(options || {})
16
21
  return self
17
22
  end
@@ -44,7 +49,8 @@ module Tgios
44
49
  end
45
50
 
46
51
  def update_cell_text(record, cell, index_path)
47
- cell.textLabel.text=record[@display_field]
52
+ text = record.is_a?(Hash) ? record[@display_field] : record.send(@display_field)
53
+ cell.textLabel.text=text.to_s
48
54
  cell
49
55
  end
50
56
 
@@ -85,21 +91,23 @@ module Tgios
85
91
  end
86
92
 
87
93
  def tableView(tableView, willDisplayCell:cell, forRowAtIndexPath:indexPath)
88
- unless @events[:load_more].nil? || indexPath.row < @list.length - 1 || !@total.nil? && @total <= @list.count || @loading
89
- @loading = true
90
- @events[:load_more].call(@page+1, indexPath) do |success, results, total|
91
- if success && !@list.nil?
92
- @total = total
93
- @page += 1
94
- @list += results
95
- @tableView.reloadData
94
+ if indexPath.row >= @list.length - 1
95
+ unless @events[:load_more].nil? || !@total.nil? && @total <= @list.size || @loading
96
+ @loading = true
97
+ @events[:load_more].call(@page+1, indexPath) do |success, results, total|
98
+ if success && !@list.nil?
99
+ @total = total
100
+ @page += 1
101
+ @list.concat(results)
102
+ @tableView.reloadData
103
+ end
104
+ @loading = false
96
105
  end
97
- @loading = false
98
106
  end
99
- end
100
107
 
101
- unless @events[:reach_bottom].nil? || indexPath.row < @list.length - 1
102
- @events[:reach_bottom].call(indexPath)
108
+ unless @events[:reach_bottom].nil?
109
+ @events[:reach_bottom].call(indexPath)
110
+ end
103
111
  end
104
112
  end
105
113
 
@@ -129,7 +137,24 @@ module Tgios
129
137
  can_edit
130
138
  end
131
139
 
140
+ def scrollViewDidScroll(scroll_view)
141
+ @events[:did_scroll].call(scroll_view) if @events[:did_scroll]
142
+ end
143
+
144
+ def scrollViewDidEndDragging(scroll_view, willDecelerate:decelerate)
145
+ @events[:did_end_scroll].call(scroll_view, decelerate) if @events[:did_end_scroll]
146
+ end
147
+
148
+ def listen_to_keyboard
149
+ @table_utility_binding.listen_to_keyboard
150
+ end
151
+
152
+ def stop_listen_to_keyboard
153
+ @table_utility_binding.stop_listen_to_keyboard
154
+ end
155
+
132
156
  def onPrepareForRelease
157
+ @table_utility_binding.prepareForRelease
133
158
  @events=nil
134
159
  @list=nil
135
160
  @display_field=nil
@@ -1,3 +1,3 @@
1
1
  module Tgios
2
- VERSION = '0.0.37'
2
+ VERSION = '0.0.38'
3
3
  end
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.37
4
+ version: 0.0.38
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: 2015-07-23 00:00:00.000000000 Z
12
+ date: 2016-11-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sugarcube