tgios 0.0.37 → 0.0.38

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 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