da_funk 3.16.3 → 3.21.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: db979370e3b3a80ece3f2b8ee51020166c047e34a5ee72a6a5b989cbf6bffe1f
4
- data.tar.gz: 2ee4271741d4b3049aab91247c13e8e15dda647b1db4aae70bc5f19e65e2c9f3
3
+ metadata.gz: bc5abcda84d3caf3982e38fe2ec5c10e59de3ea4c171ec086355a4192e610e21
4
+ data.tar.gz: a3bac877e9dc0e25a3b0da2f015c87ba64431dab8c1bc7db8f513c89cdf46289
5
5
  SHA512:
6
- metadata.gz: 9d40b365bf432c8a9053a2c4d23cf248124d2c75018527f250e5c0c581d9f5397f409aea5cfbecb6758bc603ad101775511b5c925c3e7f6e1cb7988a6f55e5f0
7
- data.tar.gz: 7c571708171aff119e1fbb0d11fa1d1dde10440e471cebc209d01ac49c16183473e75c2fb10913e25dde73adef7bf7b8e008f4b15cf5f6777bedf8324329e86a
6
+ metadata.gz: 32172e2717e34860bd3df6eb6a8a8c1bae0eb54dce61fa45e93b9dcd59af4d9da939450f724defa7a41de8612453f73bd50a05ee8dd60d950a4e56d2000768b6
7
+ data.tar.gz: 59de0b4dbdca94dbd077c37e220e22305030823b7a171b2a77e1ea1778f05fc17f6eb2d999a98911348a2a57bd0b101a7f2e2535f4acd60fe740a50289195981
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- da_funk (3.16.3)
4
+ da_funk (3.21.0)
5
5
  archive-zip (~> 0.5)
6
6
  bundler
7
7
  cloudwalk_handshake
@@ -14,36 +14,41 @@ GEM
14
14
  specs:
15
15
  archive-zip (0.12.0)
16
16
  io-like (~> 0.3.0)
17
- ast (2.4.0)
18
- cloudwalk (1.14.3)
17
+ ast (2.4.1)
18
+ cloudwalk (1.15.0)
19
19
  bundler
20
20
  rake
21
- cloudwalk_handshake (1.11.0)
21
+ cloudwalk_handshake (1.13.1)
22
22
  funky-simplehttp (~> 0.6)
23
- funky-emv (1.2.2)
23
+ funky-emv (1.3.0)
24
24
  funky-tlv (~> 0.2)
25
25
  funky-mock (0.1.0)
26
26
  funky-simplehttp (0.6.0)
27
27
  funky-tlv (0.2.3)
28
- io-like (0.3.0)
29
- jaro_winkler (1.5.4)
28
+ io-like (0.3.1)
30
29
  parallel (1.19.1)
31
- parser (2.7.0.2)
30
+ parser (2.7.1.3)
32
31
  ast (~> 2.4.0)
33
32
  posxml_parser (2.26.0)
34
33
  funky-emv (~> 1)
35
34
  rainbow (3.0.0)
36
35
  rake (13.0.1)
37
- rubocop (0.79.0)
38
- jaro_winkler (~> 1.5.1)
36
+ regexp_parser (1.7.1)
37
+ rexml (3.2.4)
38
+ rubocop (0.85.1)
39
39
  parallel (~> 1.10)
40
40
  parser (>= 2.7.0.1)
41
41
  rainbow (>= 2.2.2, < 4.0)
42
+ regexp_parser (>= 1.7)
43
+ rexml
44
+ rubocop-ast (>= 0.0.3)
42
45
  ruby-progressbar (~> 1.7)
43
- unicode-display_width (>= 1.4.0, < 1.7)
46
+ unicode-display_width (>= 1.4.0, < 2.0)
47
+ rubocop-ast (0.0.3)
48
+ parser (>= 2.7.0.1)
44
49
  ruby-progressbar (1.10.1)
45
- unicode-display_width (1.6.1)
46
- yard (0.9.24)
50
+ unicode-display_width (1.7.0)
51
+ yard (0.9.25)
47
52
 
48
53
  PLATFORMS
49
54
  ruby
@@ -59,4 +64,4 @@ DEPENDENCIES
59
64
  yard
60
65
 
61
66
  BUNDLED WITH
62
- 2.0.2
67
+ 2.1.4
@@ -1,5 +1,47 @@
1
1
  # DaFunk
2
2
 
3
+ ### 3.21.0 - 2020-06-12
4
+
5
+ - Removed unnecessary processing method call;
6
+ - Status bar refactored:
7
+ - Removed link icon;
8
+ - Added support to SLOT_MEDIA to print WIFI or GPRS;
9
+ - Renamed SLOT_CONNECTION to SLOT_SIGNAL_LEVEL;
10
+ - Added support to SLOT_BATTERY_PERCENTUAL to print percentual of battery level;
11
+ - Renamed SLOT_BATTERY to SLOT_BATTERY_LEVEL;
12
+ - Update battery and wifi images;
13
+ - Added BATTERY_PERCENTAGE_IMAGES;
14
+ - Show searching icon when network is not connected;
15
+ - Added support to virtual keyboard;
16
+ - Added support to touchscreen event on DaFunk::Helper#menu;
17
+ - Added support to return timeout parameter on DaFunk::Helper#menu when timeout is achieved;
18
+ - Update funky-emv 1.3.0.
19
+
20
+ ### 3.20.0 - 2020-05-28
21
+
22
+ - Rename PaymentChannel::client to ::current;
23
+ - Fix status bar change link to cache old value.
24
+
25
+ ### 3.18.1 - 2020-05-20
26
+
27
+ - Fix issue on DaFunk::Helper#menu_image_touchscreen_or_keyboard it was not checking for special keys
28
+
29
+ ### 3.18.0 - 2020-04-03
30
+
31
+ - Added enable_txt_ui parameter on the following methods
32
+ - DaFunk::ParamsDat#download;
33
+ - DaFunk::ParamsDat#update_apps;
34
+ - DaFunk::ParamsDat#update_app;
35
+ - DaFunk::ParamsDat#update_file;
36
+ - DaFunk::Helper#attach_options;
37
+ - DaFunk::Helper#check_download_error;
38
+
39
+ ### 3.17.0 - 2020-02-10
40
+
41
+ - Added support to infinitepay endpoints config on config.dat file;
42
+ - Update cloudwalk (1.15.0);
43
+ - Update cloudwalk_handshake (1.13.0);
44
+
3
45
  ### 3.16.3 - 2020-01-31
4
46
 
5
47
  - Changed setting emv_input_amount_idle to emv_contactless_amount.
data/Rakefile CHANGED
@@ -68,7 +68,8 @@ FILES = FileList[
68
68
  "lib/device/setting.rb",
69
69
  "lib/device/support.rb",
70
70
  "lib/device/system.rb",
71
- "lib/device/magnetic.rb"
71
+ "lib/device/magnetic.rb",
72
+ "lib/device/virtual_keyboard.rb"
72
73
  ]
73
74
 
74
75
  DaFunk::RakeTask.new do |t|
@@ -14,11 +14,11 @@ module DaFunk
14
14
  string
15
15
  end
16
16
 
17
- def attach_options
18
- if DaFunk::PaymentChannel.client == Context::CommunicationChannel
19
- {:print_last => true}
17
+ def attach_options(enable_txt_ui = true)
18
+ if DaFunk::PaymentChannel.current == Context::CommunicationChannel
19
+ {:print_last => true, :enable_txt_ui => enable_txt_ui}
20
20
  else
21
- {:print_last => false}
21
+ {:print_last => false, :enable_txt_ui => enable_txt_ui}
22
22
  end
23
23
  end
24
24
 
@@ -35,55 +35,63 @@ module DaFunk
35
35
 
36
36
  def attach(options = attach_options)
37
37
  if Device::Network.configured?
38
- print_attach(:attach_connecting, options)
38
+ print_attach(:attach_connecting, options) if options[:enable_txt_ui]
39
39
  unless Device::Network.connected?
40
40
  if Device::Network.attach(options) == Device::Network::SUCCESS
41
41
  Device::Setting.network_configured = 1
42
- print_attach(:attach_connected, options)
42
+ print_attach(:attach_connected, options) if options[:enable_txt_ui]
43
43
  else
44
44
  Device::Setting.network_configured = 0 if DaFunk::ParamsDat.file["connection_management"] == "0"
45
- print_attach(:attach_fail, options.merge(:args => [Device::Network.code.to_s]))
46
- getc(10000)
45
+ if options[:enable_txt_ui]
46
+ print_attach(:attach_fail, options.merge(:args => [Device::Network.code.to_s]))
47
+ getc(10000)
48
+ end
47
49
  return false
48
50
  end
49
51
  else
50
- print_attach(:attach_already_connected, options)
52
+ print_attach(:attach_already_connected, options) if options[:enable_txt_ui]
51
53
  end
52
54
  true
53
55
  else
54
- print_attach(:attach_device_not_configured, options)
55
- getc(2000)
56
+ if options[:enable_txt_ui]
57
+ print_attach(:attach_device_not_configured, options)
58
+ getc(2000)
59
+ end
56
60
  false
57
61
  end
58
62
  end
59
63
 
60
- def check_download_error(ret)
64
+ def check_download_error(ret, enable_txt_ui = true)
61
65
  value = true
66
+ ui = {}
67
+
62
68
  case ret
63
69
  when DaFunk::Transaction::Download::SERIAL_NUMBER_NOT_FOUND
64
- I18n.pt(:download_serial_number_not_found, :args => [ret])
70
+ ui[:i18n] = :download_serial_number_not_found
65
71
  value = false
66
72
  when DaFunk::Transaction::Download::FILE_NOT_FOUND
67
- I18n.pt(:download_file_not_found, :args => [ret])
73
+ ui[:i18n] = :download_file_not_found
68
74
  value = false
69
75
  when DaFunk::Transaction::Download::FILE_NOT_CHANGE
70
- I18n.pt(:download_file_is_the_same, :args => [ret])
76
+ ui[:i18n] = :download_file_is_the_same
71
77
  when DaFunk::Transaction::Download::SUCCESS
72
- I18n.pt(:download_success, :args => [ret])
78
+ ui[:i18n] = :download_success
73
79
  when DaFunk::Transaction::Download::COMMUNICATION_ERROR
74
- I18n.pt(:download_communication_failure, :args => [ret])
80
+ ui[:i18n] = :download_communication_failure
75
81
  value = false
76
82
  when DaFunk::Transaction::Download::MAPREDUCE_RESPONSE_ERROR
77
- I18n.pt(:download_encoding_error, :args => [ret])
83
+ ui[:i18n] = :download_encoding_error
78
84
  value = false
79
85
  when DaFunk::Transaction::Download::IO_ERROR
80
- I18n.pt(:download_io_error, :args => [ret])
86
+ ui[:i18n] = :download_io_error
81
87
  value = false
82
88
  else
83
- I18n.pt(:download_communication_failure, :args => [ret])
89
+ ui[:i18n] = :download_communication_failure
84
90
  value = false
85
91
  end
86
92
 
93
+ I18n.pt(ui[:i18n], :args => [ret]) if enable_txt_ui
94
+
87
95
  value
88
96
  end
89
97
 
@@ -176,15 +184,21 @@ module DaFunk
176
184
  return nil if menu_itens.empty?
177
185
 
178
186
  Device::Display.print_bitmap(path)
179
-
180
187
  timeout = options[:timeout] || Device::IO.timeout
181
- options[:special_keys] = [Device::IO::CANCEL]
188
+
189
+ if options.include?(:special_keys)
190
+ options[:special_keys] += options[:special_keys]
191
+ else
192
+ options[:special_keys] = [Device::IO::CANCEL]
193
+ end
182
194
 
183
195
  event, key = wait_touchscreen_or_keyboard_event(menu_itens, timeout, options)
184
196
 
185
197
  if event == :keyboard
186
198
  if key == Device::IO::CANCEL
187
199
  options[:default]
200
+ elsif options[:special_keys].include?(key)
201
+ key
188
202
  else
189
203
  index = key.to_i-1 == -1 ? 0 : key.to_i-1
190
204
  menu_itens.keys[index]
@@ -282,6 +296,8 @@ module DaFunk
282
296
 
283
297
  if key == Device::IO::ENTER
284
298
  options[:default]
299
+ elsif key == Device::IO::KEY_TIMEOUT
300
+ options[:timeout]
285
301
  else
286
302
  selected
287
303
  end
@@ -289,7 +305,10 @@ module DaFunk
289
305
 
290
306
  # TODO Scalone: Refactor.
291
307
  def pagination(title, options, collection, &block)
308
+ timeout = Device::IO.timeout
309
+ touchscreen_options = {}
292
310
  start_line, options[:limit], options[:header] = pagination_limit(title, options)
311
+
293
312
  if collection.size > (options[:limit] - options[:header]) # minus pagination header
294
313
  key = Device::IO.back_key
295
314
  pages = pagination_page(collection, options[:limit] - options[:header]) # minus pagination header
@@ -299,7 +318,13 @@ module DaFunk
299
318
  pagination_header(title, page, pages.size, start_line, options[:default], options[:header])
300
319
  values = pages[page].to_a
301
320
  block.call(values, start_line + options[:header])
302
- key = try_key(pagination_keys(values.size, true))
321
+
322
+ params = {special_keys: pagination_keys(values.size, true)}
323
+ if options.include?(:touchscreen_options)
324
+ touchscreen_options = options[:touchscreen_options]
325
+ end
326
+
327
+ _, key = wait_touchscreen_or_keyboard_event(touchscreen_options, timeout, params)
303
328
  page = pagination_key_page(page, key, pages.size)
304
329
  end
305
330
  else
@@ -307,7 +332,8 @@ module DaFunk
307
332
  print_title(title, options[:default]) if title
308
333
  values = collection.to_a
309
334
  block.call(values, start_line)
310
- key = try_key(pagination_keys(collection.size, false))
335
+ params = {special_keys: pagination_keys(collection.size, false)}
336
+ _, key = wait_touchscreen_or_keyboard_event(touchscreen_options, timeout, params)
311
337
  end
312
338
  result = values[key.to_i-1] if key.integer?
313
339
  if result.is_a? Array
@@ -427,18 +453,6 @@ module DaFunk
427
453
  end
428
454
  end
429
455
 
430
- def processing(image, message = {})
431
- Device::Display.print_bitmap(to_bmp(image)) if bmp_exists?(image)
432
- end
433
-
434
- def bmp_exists?(bmp)
435
- File.exists?(to_bmp(bmp))
436
- end
437
-
438
- def to_bmp(image)
439
- "./shared/#{image.to_s}.bmp"
440
- end
441
-
442
456
  private
443
457
  def parse_touchscreen_event(menu_itens, x, y)
444
458
  menu_itens.each do |key, value|
@@ -1,18 +1,26 @@
1
1
  module DaFunk
2
2
  module Helper
3
3
  class StatusBar
4
- STATUS_TIMEOUT = 60
5
- SLOT_CONNECTION = 0
6
- SLOT_BATTERY = 7
7
- SLOT_LINK = 1
8
- SLOT_UPDATE = 2
4
+ STATUS_TIMEOUT = 60
5
+ SLOT_MEDIA = 0
6
+ SLOT_SIGNAL_LEVEL = 1
7
+ SLOT_UPDATE = 2
8
+ SLOT_BATTERY_PERCENTUAL = 6
9
+ SLOT_BATTERY_LEVEL = 7
9
10
 
10
11
  BATTERY_IMAGES = {
11
- 0..24 => "./shared/battery0.png",
12
- 25..49 => "./shared/battery25.png",
13
- 50..74 => "./shared/battery50.png",
14
- 75..99 => "./shared/battery75.png",
15
- 100..100 => "./shared/battery100.png"
12
+ 0..4 => "./shared/battery0.png",
13
+ 5..9 => "./shared/baterry5.png",
14
+ 10..19 => "./shared/battery10.png",
15
+ 20..29 => "./shared/battery20.png",
16
+ 30..39 => "./shared/battery30.png",
17
+ 40..49 => "./shared/battery40.png",
18
+ 50..59 => "./shared/battery50.png",
19
+ 60..69 => "./shared/battery60.png",
20
+ 70..79 => "./shared/battery70.png",
21
+ 80..89 => "./shared/battery80.png",
22
+ 90..99 => "./shared/battery90.png",
23
+ 100..100 => "./shared/battery100.png",
16
24
  }
17
25
 
18
26
  BATTERY_CHARGE_IMAGES = {
@@ -20,11 +28,27 @@ module DaFunk
20
28
  100 => "./shared/battery100c.png"
21
29
  }
22
30
 
31
+ BATTERY_PERCENTAGE_IMAGES = {
32
+ 0..4 => "./shared/battery1_percent.png",
33
+ 5..9 => "./shared/battery5_percent.png",
34
+ 10..19 => "./shared/battery10_percent.png",
35
+ 20..29 => "./shared/battery20_percent.png",
36
+ 30..39 => "./shared/battery30_percent.png",
37
+ 40..49 => "./shared/battery40_percent.png",
38
+ 50..59 => "./shared/battery50_percent.png",
39
+ 60..69 => "./shared/battery60_percent.png",
40
+ 70..79 => "./shared/battery70_percent.png",
41
+ 80..89 => "./shared/battery80_percent.png",
42
+ 90..99 => "./shared/battery90_percent.png",
43
+ 100..100 => "./shared/battery100_percent.png",
44
+ }
45
+
23
46
  WIFI_IMAGES = {
24
- 0..29 => "./shared/wifi0.png",
25
- 30..59 => "./shared/wifi30.png",
26
- 60..79 => "./shared/wifi60.png",
27
- 80..200 => "./shared/wifi100.png"
47
+ 0..0 => "./shared/wifi0.png",
48
+ 1..25 => "./shared/wifi25.png",
49
+ 26..50 => "./shared/wifi50.png",
50
+ 59..75 => "./shared/wifi75.png",
51
+ 76..200 => "./shared/wifi100.png"
28
52
  }
29
53
 
30
54
  MOBILE_IMAGES = {
@@ -37,14 +61,13 @@ module DaFunk
37
61
  }
38
62
 
39
63
  class << self
40
- attr_accessor :signal, :battery, :power, :managment, :link
64
+ attr_accessor :signal, :battery, :power, :managment
41
65
  end
42
66
 
43
67
  def self.check
44
68
  if self.valid?
45
69
  self.change_connection
46
70
  self.change_battery
47
- self.change_link
48
71
  self.change_update
49
72
  end
50
73
  end
@@ -57,44 +80,45 @@ module DaFunk
57
80
  end
58
81
  end
59
82
 
60
- def self.change_link
83
+ def self.change_connection
61
84
  if Device::Network.connected?
62
- if DaFunk::PaymentChannel.alive?
63
- PAX::Display.print_status_bar(SLOT_LINK, "./shared/link.png")
64
- else
65
- PAX::Display.print_status_bar(SLOT_LINK, "./shared/unlink.png")
66
- end
67
- else
68
- PAX::Display.print_status_bar(SLOT_LINK, "./shared/unlink.png")
69
- end
70
- end
85
+ sig = Device::Network.signal
71
86
 
72
- def self.change_connection
73
- sig = Device::Network.signal
74
- if self.signal != sig
75
- self.signal = sig
76
- if Device::Network.gprs?
77
- Device::Display.print_status_bar(SLOT_CONNECTION,
78
- get_image_path(:gprs, self.signal))
79
- elsif Device::Network.wifi?
80
- Device::Display.print_status_bar(SLOT_CONNECTION,
81
- get_image_path(:wifi, self.signal))
87
+ if self.signal != sig
88
+ self.signal = sig
89
+
90
+ if Device::Network.gprs?
91
+ Device::Display.print_status_bar(SLOT_MEDIA, "./shared/GPRS.png")
92
+ Device::Display.print_status_bar(SLOT_SIGNAL_LEVEL,
93
+ get_image_path(:gprs, self.signal))
94
+ elsif Device::Network.wifi?
95
+ Device::Display.print_status_bar(SLOT_MEDIA, "./shared/WIFI.png")
96
+ Device::Display.print_status_bar(SLOT_SIGNAL_LEVEL,
97
+ get_image_path(:wifi, self.signal))
98
+ end
82
99
  end
100
+ else
101
+ Device::Display.print_status_bar(SLOT_MEDIA, nil)
102
+ Device::Display.print_status_bar(SLOT_SIGNAL_LEVEL, "./shared/searching.png")
83
103
  end
84
104
  end
85
105
 
86
106
  def self.change_battery
87
107
  bat = Device::System.battery
88
108
  dock = Device::System.power_supply
109
+
89
110
  if self.battery != bat || self.power != dock
90
111
  self.battery = bat
91
112
  self.power = dock
113
+
114
+ Device::Display.print_status_bar(SLOT_BATTERY_PERCENTUAL,
115
+ get_image_path(:battery_percentual, self.battery))
92
116
  if self.power
93
117
  Device::Display.print_status_bar(
94
- SLOT_BATTERY, get_image_path(:battery_charge, self.battery))
118
+ SLOT_BATTERY_LEVEL, get_image_path(:battery_charge, self.battery))
95
119
  else
96
- Device::Display.print_status_bar(
97
- SLOT_BATTERY, get_image_path(:battery, self.battery))
120
+ Device::Display.print_status_bar(SLOT_BATTERY_LEVEL,
121
+ get_image_path(:battery, self.battery))
98
122
  end
99
123
  end
100
124
  end
@@ -110,6 +134,8 @@ module DaFunk
110
134
  BATTERY_IMAGES.each {|k,v| return v if k.include? sig }
111
135
  when :battery_charge
112
136
  BATTERY_CHARGE_IMAGES[sig]
137
+ when :battery_percentual
138
+ BATTERY_PERCENTAGE_IMAGES.each {|k,v| return v if k.include? sig }
113
139
  else
114
140
  nil
115
141
  end
@@ -104,15 +104,17 @@ module DaFunk
104
104
  nil
105
105
  end
106
106
 
107
- def self.download
108
- if attach
107
+ def self.download(enable_txt_ui = true)
108
+ if attach(attach_options(enable_txt_ui))
109
109
  parse
110
110
  ret = try(3) do |attempt|
111
- Device::Display.clear
112
- I18n.pt(:downloading_content, :args => ["PARAMS", 1, 1])
111
+ if enable_txt_ui
112
+ Device::Display.clear
113
+ I18n.pt(:downloading_content, :args => ["PARAMS", 1, 1])
114
+ end
113
115
  getc(100)
114
116
  ret = DaFunk::Transaction::Download.request_param_file(FILE_NAME)
115
- unless check_download_error(ret)
117
+ unless check_download_error(ret, enable_txt_ui)
116
118
  getc(2000)
117
119
  false
118
120
  else
@@ -124,21 +126,21 @@ module DaFunk
124
126
  end
125
127
  end
126
128
 
127
- def self.update_apps(force_params = false, force_crc = false, force = false)
128
- self.download if force_params || ! self.valid
129
+ def self.update_apps(force_params = false, force_crc = false, force = false, enable_txt_ui = true)
130
+ self.download(enable_txt_ui) if force_params || ! self.valid
129
131
  main_updated = nil
130
132
  if self.valid
131
133
  apps_to_update = self.outdated_apps(force_crc, force)
132
134
  size_apps = apps_to_update.size
133
135
  apps_to_update.each_with_index do |app, index|
134
- ret = self.update_app(app, index+1, size_apps, force_crc || force)
136
+ ret = self.update_app(app, index+1, size_apps, force_crc || force, enable_txt_ui)
135
137
  main_updated ||= (ret && app.main_application?)
136
138
  end
137
139
 
138
140
  files_to_update = self.outdated_files(force_crc, force)
139
141
  size_files = files_to_update.size
140
142
  files_to_update.each_with_index do |file_, index|
141
- self.update_file(file_, index+1, size_files, force_crc || force)
143
+ self.update_file(file_, index+1, size_files, force_crc || force, enable_txt_ui)
142
144
  end
143
145
  end
144
146
  ensure
@@ -179,26 +181,30 @@ module DaFunk
179
181
  File.file?(path) && ! keep
180
182
  end
181
183
 
182
- def self.update_app(application, index = 1, all = 1, force = false)
183
- if attach && application
184
+ def self.update_app(application, index = 1, all = 1, force = false, enable_txt_ui = true)
185
+ if attach(attach_options(enable_txt_ui)) && application
184
186
  try(3) do |attempt|
185
- Device::Display.clear
186
- I18n.pt(:downloading_content, :args => [I18n.t(:apps), index, all])
187
+ if enable_txt_ui
188
+ Device::Display.clear
189
+ I18n.pt(:downloading_content, :args => [I18n.t(:apps), index, all])
190
+ end
187
191
  getc(100)
188
- ret = check_download_error(application.download(force))
192
+ ret = check_download_error(application.download(force), enable_txt_ui)
189
193
  getc(1000)
190
194
  ret
191
195
  end
192
196
  end
193
197
  end
194
198
 
195
- def self.update_file(file_parameter, index = 1, all = 1, force = false)
196
- if attach && file_parameter
199
+ def self.update_file(file_parameter, index = 1, all = 1, force = false, enable_txt_ui = true)
200
+ if attach(attach_options(enable_txt_ui)) && file_parameter
197
201
  try(3) do |attempt|
198
- Device::Display.clear
199
- I18n.pt(:downloading_content, :args => [I18n.t(:files), index, all])
202
+ if enable_txt_ui
203
+ Device::Display.clear
204
+ I18n.pt(:downloading_content, :args => [I18n.t(:files), index, all])
205
+ end
200
206
  getc(100)
201
- ret = check_download_error(file_parameter.download(force))
207
+ ret = check_download_error(file_parameter.download(force), enable_txt_ui)
202
208
  file_parameter.unzip if ret
203
209
  getc(1000)
204
210
  ret
@@ -3,11 +3,29 @@ module DaFunk
3
3
  DEFAULT_HEARBEAT = "180"
4
4
 
5
5
  class << self
6
- attr_accessor :client, :app
6
+ attr_accessor :current, :app
7
7
  end
8
8
 
9
9
  attr_accessor :handshake_response, :handshake_request, :client, :host, :port
10
10
 
11
+ # Backward compatibility
12
+ def self.client
13
+ self.current
14
+ end
15
+
16
+ # Backward compatibility
17
+ def self.client=(obj)
18
+ self.current = obj
19
+ end
20
+
21
+ def self.current
22
+ @current
23
+ end
24
+
25
+ def self.current=(obj)
26
+ @current = obj
27
+ end
28
+
11
29
  def self.ready?
12
30
  Device::Network.connected? && self.configured?
13
31
  end
@@ -22,8 +40,8 @@ module DaFunk
22
40
  if @app != application
23
41
  @app = application
24
42
  # if Context::CommunicationChannel send application name thought threads
25
- if @client == Context::CommunicationChannel
26
- @client.app = application
43
+ if self.current == Context::CommunicationChannel
44
+ self.current.app = application
27
45
  else
28
46
  Device::System.klass = application
29
47
  end
@@ -48,11 +66,11 @@ module DaFunk
48
66
  self.print_info(I18n.t(:attach_attaching), display_message)
49
67
  create
50
68
  self.print_info(I18n.t(:attach_authenticate), display_message)
51
- @client.handshake
69
+ self.current.handshake
52
70
  else
53
71
  client_clear!
54
72
  end
55
- @client
73
+ self.current
56
74
  end
57
75
 
58
76
  def self.payment_channel_limit?
@@ -84,18 +102,16 @@ module DaFunk
84
102
  if self.dead?
85
103
  unless self.channel_limit_exceed?
86
104
  PaymentChannel.connect(display_message)
87
- if @client
105
+ if self.current
88
106
  self.print_info(I18n.t(:attach_waiting), display_message)
89
- if message = @client.check || @client.handshake?
107
+ if message = self.current.check || self.current.handshake?
90
108
  self.print_info(I18n.t(:attach_connected), display_message)
91
109
  message
92
110
  end
93
111
  end
94
112
  end
95
113
  else
96
- if @client
97
- @client.check
98
- end
114
+ self.current&.check
99
115
  end
100
116
  end
101
117
 
@@ -104,11 +120,11 @@ module DaFunk
104
120
  end
105
121
 
106
122
  def self.alive?
107
- Device::Network.connected? && @client && @client.connected?
123
+ Device::Network.connected? && self.current&.connected?
108
124
  end
109
125
 
110
126
  def self.close!
111
- @client && @client.close
127
+ self.current&.close
112
128
  ensure
113
129
  client_clear!
114
130
  end
@@ -133,16 +149,16 @@ module DaFunk
133
149
  end
134
150
 
135
151
  def self.create
136
- if @client != Context::CommunicationChannel
152
+ if self.current != Context::CommunicationChannel
137
153
  payment_channel_increment_attempts
138
- @client = PaymentChannel.new
154
+ self.current = PaymentChannel.new
139
155
  else
140
- @client.connect
156
+ self.current.connect
141
157
  end
142
158
  end
143
159
 
144
160
  def self.client_clear!
145
- @client = nil unless @client == Context::CommunicationChannel
161
+ self.current = nil unless self.current == Context::CommunicationChannel
146
162
  end
147
163
 
148
164
  def initialize(client = nil)
@@ -180,13 +196,13 @@ module DaFunk
180
196
  end
181
197
 
182
198
  def close
183
- @client.close if @client
199
+ @client&.close
184
200
  @client = nil
185
- PaymentChannel.client = nil
201
+ PaymentChannel.current = nil
186
202
  end
187
203
 
188
204
  def connected?
189
- self.client && self.client.connected?
205
+ self.client&.connected?
190
206
  end
191
207
 
192
208
  def handshake?
@@ -215,7 +231,7 @@ module DaFunk
215
231
  if Context.development?
216
232
  ContextLog.exception(exception, exception.backtrace, "PaymentChannel error")
217
233
  end
218
- PaymentChannel.client = nil
234
+ PaymentChannel.current = nil
219
235
  @client = nil
220
236
  end
221
237
 
@@ -1,4 +1,4 @@
1
1
  module DaFunk
2
- VERSION="3.16.3"
2
+ VERSION="3.21.0"
3
3
  end
4
4
 
@@ -14,7 +14,6 @@ class Device
14
14
  # @param json [String] Parameters to confifure new aplication.
15
15
  # @return [Object] From the new runtime instance.
16
16
  def self.execute(app, json = nil)
17
- processing(:processing)
18
17
  buf = "#{json.dup}" if json.is_a?(String)
19
18
  mrb_eval("Context.execute('#{app.dup}', '#{Device.adapter}', '#{buf}')", "#{app.dup}")
20
19
  ensure
@@ -62,6 +62,8 @@ class Device
62
62
  "payment_channel_date" => "",
63
63
  "infinitepay_authorizer" => "0",
64
64
  "infinitepay_api" => "0",
65
+ "infinitepay_cw_endpoint" => "0",
66
+ "infinitepay_google_endpoint" => "1",
65
67
  "transaction_http_enabled" => "1",
66
68
  "transaction_http_host" => HTTP_HOST_PRODUCTION,
67
69
  "transaction_http_port" => HTTP_PORT,
@@ -0,0 +1,187 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Device
4
+ class VirtualKeyboard
5
+ class << self
6
+ attr_accessor :attributes, :type, :text
7
+ end
8
+
9
+ self.attributes = {
10
+ keyboard_capital: [
11
+ { x: 0..34, y: 191..209, char: 'q' },
12
+ { x: 0..46, y: 191..209, char: 'w' },
13
+ { x: 0..65, y: 191..209, char: 'e' },
14
+ { x: 0..96, y: 191..209, char: 'r' },
15
+ { x: 0..115, y: 191..209, char: 't' },
16
+ { x: 0..145, y: 191..209, char: 'y' },
17
+ { x: 0..161, y: 191..209, char: 'u' },
18
+ { x: 0..191, y: 191..209, char: 'i' },
19
+ { x: 0..216, y: 191..209, char: 'o' },
20
+ { x: 0..255, y: 191..209, char: 'p' },
21
+ { x: 0..34, y: 223..241, char: 'a' },
22
+ { x: 0..59, y: 223..241, char: 's' },
23
+ { x: 0..83, y: 223..241, char: 'd' },
24
+ { x: 0..106, y: 223..241, char: 'f' },
25
+ { x: 0..131, y: 223..241, char: 'g' },
26
+ { x: 0..153, y: 223..241, char: 'h' },
27
+ { x: 0..178, y: 223..241, char: 'j' },
28
+ { x: 0..201, y: 223..241, char: 'k' },
29
+ { x: 0..230, y: 223..241, char: 'l' },
30
+ { x: 0..30, y: 223..273, char: :keyboard_uppercase },
31
+ { x: 0..56, y: 223..273, char: 'y' },
32
+ { x: 0..82, y: 223..273, char: 'x' },
33
+ { x: 0..109, y: 223..273, char: 'c' },
34
+ { x: 0..130, y: 223..273, char: 'v' },
35
+ { x: 0..154, y: 223..273, char: 'b' },
36
+ { x: 0..176, y: 223..273, char: 'n' },
37
+ { x: 0..201, y: 223..273, char: 'm' },
38
+ { x: 0..240, y: 223..273, char: :erase },
39
+ { x: 0..34, y: 223..315, char: :keyboard_symbol_number },
40
+ { x: 0..58, y: 223..315, char: '@' },
41
+ { x: 0..83, y: 223..315, char: ',' },
42
+ { x: 0..148, y: 223..315, char: :space },
43
+ { x: 0..177, y: 223..315, char: '.' },
44
+ { x: 0..255, y: 223..315, char: :enter }
45
+ ],
46
+
47
+ keyboard_uppercase: [
48
+ { x: 0..34, y: 191..209, char: 'Q' },
49
+ { x: 0..46, y: 191..209, char: 'W' },
50
+ { x: 0..65, y: 191..209, char: 'E' },
51
+ { x: 0..96, y: 191..209, char: 'R' },
52
+ { x: 0..115, y: 191..209, char: 'T' },
53
+ { x: 0..145, y: 191..209, char: 'Y' },
54
+ { x: 0..161, y: 191..209, char: 'U' },
55
+ { x: 0..191, y: 191..209, char: 'I' },
56
+ { x: 0..216, y: 191..209, char: 'O' },
57
+ { x: 0..255, y: 191..209, char: 'P' },
58
+ { x: 0..34, y: 223..241, char: 'A' },
59
+ { x: 0..59, y: 223..241, char: 'S' },
60
+ { x: 0..83, y: 223..241, char: 'D' },
61
+ { x: 0..106, y: 223..241, char: 'F' },
62
+ { x: 0..131, y: 223..241, char: 'G' },
63
+ { x: 0..153, y: 223..241, char: 'H' },
64
+ { x: 0..178, y: 223..241, char: 'J' },
65
+ { x: 0..201, y: 223..241, char: 'K' },
66
+ { x: 0..230, y: 223..241, char: 'L' },
67
+ { x: 0..30, y: 223..273, char: :keyboard_capital },
68
+ { x: 0..56, y: 223..273, char: 'Y' },
69
+ { x: 0..82, y: 223..273, char: 'X' },
70
+ { x: 0..109, y: 223..273, char: 'C' },
71
+ { x: 0..130, y: 223..273, char: 'V' },
72
+ { x: 0..154, y: 223..273, char: 'B' },
73
+ { x: 0..176, y: 223..273, char: 'N' },
74
+ { x: 0..201, y: 223..273, char: 'M' },
75
+ { x: 0..240, y: 223..273, char: :erase },
76
+ { x: 0..34, y: 223..315, char: :keyboard_symbol_number },
77
+ { x: 0..58, y: 223..315, char: '@' },
78
+ { x: 0..83, y: 223..315, char: ',' },
79
+ { x: 0..148, y: 223..315, char: :space },
80
+ { x: 0..177, y: 223..315, char: '.' },
81
+ { x: 0..255, y: 223..315, char: :enter }
82
+ ],
83
+
84
+ keyboard_symbol_number: [
85
+ { x: 0..35, y: 190..210, char: '(' },
86
+ { x: 0..68, y: 190..210, char: ')' },
87
+ { x: 0..104, y: 190..210, char: '1' },
88
+ { x: 0..138, y: 190..210, char: '2' },
89
+ { x: 0..169, y: 190..210, char: '3' },
90
+ { x: 0..203, y: 190..210, char: '+' },
91
+ { x: 0..239, y: 190..210, char: '-' },
92
+ { x: 0..35, y: 220..245, char: '?' },
93
+ { x: 0..68, y: 220..245, char: '$' },
94
+ { x: 0..104, y: 220..245, char: '4' },
95
+ { x: 0..138, y: 220..245, char: '5' },
96
+ { x: 0..169, y: 220..245, char: '6' },
97
+ { x: 0..203, y: 220..245, char: '*' },
98
+ { x: 0..239, y: 220..245, char: '/' },
99
+ { x: 0..35, y: 255..275, char: '!' },
100
+ { x: 0..68, y: 255..275, char: ';' },
101
+ { x: 0..104, y: 255..275, char: '7' },
102
+ { x: 0..138, y: 255..275, char: '8' },
103
+ { x: 0..169, y: 255..275, char: '9' },
104
+ { x: 0..203, y: 255..275, char: '=' },
105
+ { x: 0..239, y: 255..275, char: :erase },
106
+ { x: 0..35, y: 290..315, char: :keyboard_capital },
107
+ { x: 0..68, y: 290..315, char: '@' },
108
+ { x: 0..104, y: 290..315, char: '%' },
109
+ { x: 0..138, y: 290..315, char: '0' },
110
+ { x: 0..169, y: 290..315, char: '#' },
111
+ { x: 0..203, y: 290..315, char: '_' },
112
+ { x: 0..239, y: 290..315, char: :enter }
113
+ ]
114
+ }
115
+
116
+ def self.type_text(params = {})
117
+ change_keyboard
118
+ Device::Display.print_line("#{self.text}", params[:line], params[:column])
119
+ time = Time.now + (params[:timeout] || Device::IO.timeout) / 1000
120
+ key = nil
121
+
122
+ while text_not_ready?(key)
123
+ line_x, line_y = getxy_stream(100)
124
+
125
+ if line_x && line_y
126
+ touch_clear
127
+ key = parse(line_x, line_y, params)
128
+ else
129
+ break(Device::IO::KEY_TIMEOUT) if Time.now > time
130
+
131
+ key = getc(100)
132
+ end
133
+ end
134
+
135
+ [key, self.text]
136
+ end
137
+
138
+ def self.text_not_ready?(key)
139
+ key != :enter && key != Device::IO::ENTER && key != Device::IO::CANCEL
140
+ end
141
+
142
+ def self.parse(line_x, line_y, params)
143
+ key = attributes[type].find do |value|
144
+ value[:x].include?(line_x) && value[:y].include?(line_y)
145
+ end
146
+ return if key.nil?
147
+
148
+ Device::Audio.beep(7, 60)
149
+ show_text(key, params)
150
+
151
+ key[:char]
152
+ end
153
+
154
+ def self.show_text(key, params)
155
+ case key[:char]
156
+ when :keyboard_uppercase, :keyboard_symbol_number, :keyboard_capital
157
+ self.type = key[:char]
158
+ change_keyboard
159
+ when :erase
160
+ self.text += '' if text.nil?
161
+ self.text = text[0..-2]
162
+ when :space
163
+ self.text += ' '
164
+ else
165
+ self.text << key[:char] unless key[:char] == :enter
166
+ end
167
+ Device::Display.print_line("#{self.text}", params[:line], params[:column])
168
+ end
169
+
170
+ def self.change_keyboard
171
+ if type.nil?
172
+ self.type = :keyboard_capital
173
+ Device::Display.print_bitmap('./shared/keyboard_capital.bmp')
174
+ else
175
+ Device::Display.print_bitmap("./shared/#{type}.bmp")
176
+ end
177
+ end
178
+
179
+ def self.wifi_password
180
+ self.text = if Device::Setting.wifi_password == 'false'
181
+ ''
182
+ else
183
+ Device::Setting.wifi_password
184
+ end
185
+ end
186
+ end
187
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: da_funk
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.16.3
4
+ version: 3.21.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thiago Scalone
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-31 00:00:00.000000000 Z
11
+ date: 2020-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -192,6 +192,7 @@ files:
192
192
  - lib/device/support.rb
193
193
  - lib/device/system.rb
194
194
  - lib/device/version.rb
195
+ - lib/device/virtual_keyboard.rb
195
196
  - lib/ext/array.rb
196
197
  - lib/ext/float.rb
197
198
  - lib/ext/hash.rb