ruby-macrodroid 0.9.12 → 0.9.17

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,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f551fa79f564fe3e791b75d0bd3b5dabafd8c90b47980c5c77ab344d8b5612db
4
- data.tar.gz: 2f5b9fe15f59cf9abfd628c7050d40229104ac1137780be6d7a9723214dbff73
3
+ metadata.gz: d2a2688ed5b9d38f47749aa2f3e2d08002d7250d2690189f6034dec81b5d2ee5
4
+ data.tar.gz: 95d917dc64a5322caeacd5abd64f2b1cb9013e34908536860424f9cc47de6d1f
5
5
  SHA512:
6
- metadata.gz: fecd36b6b6da15005cfde4259886dfde7f37538d3217026958174b53a8eab4bf4af3f8903f3504f6291fdb5bce2435292d65f41904a47640486a97e1dc72be9c
7
- data.tar.gz: 59b920327286062d098054a4225c36c0b4ab054ae98bac8c8100f5beb55cc45ee87c8f8d51cc10506a12b172fcaed6024ba4d4384233b5215062b2d127fd5e38
6
+ metadata.gz: '0765669d573b157239bdb0ecfde3f34f1717160976e38e870fa1d20b105af0e5919370812e16e81232cb627bf32b2b833a732cf8ec4647ab2445e9aba0767014'
7
+ data.tar.gz: e1317255ded299969e64fef30d7f67b8706c1163202b032e190969f275b23524fa5ad81a1481eefc3c786153cd00a04d409a414316d3022674ae6e9fa5b7514a
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -32,6 +32,30 @@
32
32
  #
33
33
 
34
34
 
35
+ APPS = {
36
+ 'AutoBoy' => 'com.happyconz.blackbox',
37
+ 'Amazon Alexa' => 'com.amazon.dee.app',
38
+ 'Brave' => 'com.brave.browser',
39
+ 'Camera' => 'com.google.android.camera',
40
+ 'Cast to TV' => 'cast.video.screenmirroring.casttotv',
41
+ 'File Manager' => 'com.alphainventor.filemanager',
42
+ 'Firefox' => 'org.mozilla.firefox',
43
+ 'Google Chrome' => 'com.google.android.chrome',
44
+ 'Chrome' => 'com.google.android.chrome',
45
+ 'Google Home' => 'com.google.android.apps.chromecast.app',
46
+ 'Google Play Music' => 'com.google.android.music',
47
+ 'MacroDroid' => 'com.arlosoft.macrodroid',
48
+ 'QuickEdit Text Editor Pro' => 'com.rhmsoft.edit.pro',
49
+ 'QR & Barcode Reader' => 'com.teacapps.barcodescanner',
50
+ 'Settings' => 'com.google.android.settings',
51
+ 'tinyCam PRO' => 'com.alexvas.dvr.pro',
52
+ 'Tor Browser' => 'org.torproject.torbrowser',
53
+ 'VLC' => 'org.videolan.vlc',
54
+ 'WiFi FTP Server' => 'com.medhaapps.wififtpserver',
55
+ 'YouTube' => 'com.google.android.youtube'
56
+ }
57
+
58
+
35
59
  class Action < MacroObject
36
60
  using ColouredText
37
61
  using Params
@@ -76,19 +100,28 @@ class LaunchActivityAction < ApplicationAction
76
100
 
77
101
  def initialize(h={})
78
102
 
103
+ # option 0 is by application name, 1 is launch by package name
104
+ #
79
105
  options = {
80
106
  application_name: 'Chrome',
81
107
  package_to_launch: 'com.android.chrome',
82
108
  exclude_from_recents: false,
83
- start_new: false
109
+ start_new: false,
110
+ option: 0,
111
+ launch_by_package_name: ''
84
112
  }
85
113
 
86
114
  super(options.merge h)
115
+
116
+ @list = %w(option launchByPackageName)
87
117
 
88
118
  end
89
119
 
90
120
  def to_s(colour: false, indent: 0)
91
- 'Launch ' + @h[:application_name]
121
+ option = @h[:option] == 0 ? @h[:application_name] : \
122
+ @h[:launch_by_package_name]
123
+ @s = 'Launch ' + option
124
+ super()
92
125
  end
93
126
 
94
127
  end
@@ -150,17 +183,17 @@ class OpenWebPageAction < ApplicationAction
150
183
 
151
184
  def initialize(obj={}, macro=nil)
152
185
 
153
- $debug = false
186
+ $debug = true
154
187
  puts ('obj: ' + obj.inspect).debug if $debug
155
188
 
156
189
  h = if obj.is_a? Hash then
157
190
 
158
- obj.merge({macro: macro})
191
+ obj.merge({macro: macro}) #unless obj and obj[:macro]
159
192
 
160
193
  elsif obj.is_a? Array
161
194
 
162
195
  puts ('obj: ' + obj.inspect).debug if $debug
163
- e, macro = obj
196
+ e, macro, h3 = obj
164
197
 
165
198
  a = e.xpath('item/*')
166
199
 
@@ -181,7 +214,7 @@ class OpenWebPageAction < ApplicationAction
181
214
  {url: (txt || e.text)}
182
215
  end
183
216
 
184
- h2.merge(macro: macro)
217
+ h2.merge(macro: macro).merge(h3)
185
218
 
186
219
  end
187
220
 
@@ -219,6 +252,7 @@ class OpenWebPageAction < ApplicationAction
219
252
  h[:macro].title.downcase.gsub(/ +/,'-')
220
253
 
221
254
  end
255
+ puts 'url: ' + url.inspect if $debug
222
256
 
223
257
  if h2 then
224
258
 
@@ -242,7 +276,8 @@ class OpenWebPageAction < ApplicationAction
242
276
  end
243
277
 
244
278
  def to_s(colour: false, indent: 0)
245
- @s = "HTTP GET\nurl: " + @h[:url_to_open]
279
+ s = @h[:http_get] ? '' : 'Open Website / '
280
+ @s = s + "HTTP GET\nurl: " + @h[:url_to_open]
246
281
  super()
247
282
  end
248
283
 
@@ -378,6 +413,61 @@ class TakePictureAction < CameraAction
378
413
  end
379
414
 
380
415
 
416
+ class TakeScreenshotAction < CameraAction
417
+
418
+ def initialize(obj=nil)
419
+
420
+ h = if obj.is_a? Hash then
421
+ obj
422
+ elsif obj.is_a? Array
423
+
424
+ e, macro = obj
425
+
426
+ a = [
427
+ 'Save to device',
428
+ 'Send via email',
429
+ 'Share via intent'
430
+ ]
431
+
432
+ s = e.text('item/description').to_s
433
+ index = a.map(&:downcase).index s.downcase
434
+
435
+ {option: index}
436
+
437
+ end
438
+
439
+ options = {
440
+ option: 0,
441
+ use_smtp_email: false,
442
+ mechanism_option: 0,
443
+ save_to_jpeg: false
444
+ }
445
+
446
+ super(options.merge h)
447
+
448
+ end
449
+
450
+ def to_s(colour: false, indent: 0)
451
+
452
+ @s = 'Take Screenshot' #+ @h.inspect
453
+
454
+ options = [
455
+ 'Save to device',
456
+ 'Send via email',
457
+ 'Share via intent'
458
+ ]
459
+
460
+ option = options[@h[:option]]
461
+
462
+ @s += "\n" + option
463
+ super()
464
+
465
+ end
466
+
467
+ alias to_summary to_s
468
+ end
469
+
470
+
381
471
  # Conditions/Loops
382
472
  #
383
473
  class IfConfirmedThenAction < Action
@@ -888,8 +978,17 @@ end
888
978
  #
889
979
  class SayTimeAction < DateTimeAction
890
980
 
891
- def initialize(h={})
892
-
981
+ def initialize(obj=nil)
982
+
983
+ h = if obj.is_a? Hash then
984
+ obj
985
+ elsif obj.is_a? Array
986
+
987
+ e, macro = obj
988
+ {:'12_hour' => e.text('item/description').to_s[/^\d+/] == '12'}
989
+
990
+ end
991
+
893
992
  options = {
894
993
  :'12_hour' => true
895
994
  }
@@ -910,7 +1009,9 @@ class SayTimeAction < DateTimeAction
910
1009
  end
911
1010
 
912
1011
  def to_s(colour: false, indent: 0)
913
- 'Say Current Time'
1012
+ @s = 'Say Current Time'
1013
+ @s += "\n%s hour clock" % (@h[:'12_hour'] ? '12' : '24')
1014
+ super()
914
1015
  end
915
1016
 
916
1017
  end
@@ -950,8 +1051,15 @@ end
950
1051
  #
951
1052
  class ClipboardAction < DeviceAction
952
1053
 
953
- def initialize(h={})
1054
+ def initialize(obj=nil)
954
1055
 
1056
+ h = if obj.is_a? Hash then
1057
+ obj
1058
+ elsif obj.is_a? Array
1059
+ e, macro = obj
1060
+ {clipboard_text: e.text('item/description').to_s}
1061
+ end
1062
+
955
1063
  options = {
956
1064
  clipboard_text: ''
957
1065
  }
@@ -1031,14 +1139,60 @@ end
1031
1139
  #
1032
1140
  class UIInteractionAction < DeviceAction
1033
1141
 
1034
- def initialize(h={})
1142
+ def initialize(obj=nil)
1143
+
1144
+ if obj.is_a? Hash then
1145
+ h = obj
1146
+ elsif obj.is_a? Array
1147
+
1148
+ e, macro = obj
1149
+ s = e.text('item/description').to_s
1150
+
1151
+ r = s.match(/^(Click|Long Click) \[(.*)\]$/)
1152
+
1153
+ # [Current focus] # Current focus
1154
+ # [0,0] # x,y location
1155
+ # [274,186] # Identify in app
1156
+ # [fooo] # Text content
1157
+
1158
+ h = {
1159
+ ui_interaction_configuration: {
1160
+ :xy_point=>{:x=>0, :y=>0},
1161
+ :type=>"Click"}
1162
+ }
1163
+ h2 = h[:ui_interaction_configuration]
1164
+
1165
+ if r then
1166
+
1167
+ h[:action] = 0
1168
+
1169
+ click, detail = r.captures
1170
+ h2[:long_click] = false if click.downcase.to_sym == :click
1171
+
1172
+ if detail == 'Current focus' then
1173
+ h2[:click_option] = 0
1174
+ elsif detail =~ /\d+,\d+/
1175
+ # to-do
1176
+ else
1177
+ # text content
1178
+ h2[:click_option] = 1
1179
+ h2[:text_content] = detail
1180
+ end
1181
+
1182
+ #h[:ui_interaction_configuration] = h2
1183
+ end
1035
1184
 
1185
+ end
1186
+
1036
1187
  options = {
1037
1188
  ui_interaction_configuration: {:type=>"Copy"},
1038
1189
  action: 2
1039
1190
  }
1040
1191
 
1041
- super(options.merge h)
1192
+
1193
+ super(options.merge h)
1194
+
1195
+ @list = %w(uiInteractionConfiguration action xyPoint textContent clickOption type longClick)
1042
1196
 
1043
1197
  end
1044
1198
 
@@ -1078,7 +1232,8 @@ class UIInteractionAction < DeviceAction
1078
1232
  "Gesture [%s]" % detail
1079
1233
  end
1080
1234
 
1081
- 'UI Interaction' + "\n " + s #+ ' ' + @h.inspect
1235
+ @s = 'UI Interaction' + "\n" + s #+ ' ' + @h.inspect
1236
+ super()
1082
1237
  end
1083
1238
 
1084
1239
  alias to_summary to_s
@@ -1098,7 +1253,10 @@ class VoiceSearchAction < DeviceAction
1098
1253
  end
1099
1254
 
1100
1255
  def to_s(colour: false, indent: 0)
1101
- 'VoiceSearchAction ' + @h.inspect
1256
+
1257
+ @s = 'Voice Search' # + @h.inspect
1258
+ super()
1259
+
1102
1260
  end
1103
1261
 
1104
1262
  alias to_summary to_s
@@ -1656,9 +1814,18 @@ class ClearLogAction < LoggingAction
1656
1814
  end
1657
1815
 
1658
1816
 
1817
+ class MacroDroidAction < Action
1818
+
1819
+ def initialize(h={})
1820
+ super(h)
1821
+ @group = 'macrodroid'
1822
+ end
1823
+
1824
+ end
1825
+
1659
1826
  # MacroDroid Specific
1660
1827
  #
1661
- class CancelActiveMacroAction < Action
1828
+ class CancelActiveMacroAction < MacroDroidAction
1662
1829
 
1663
1830
  def initialize(h={})
1664
1831
 
@@ -1682,7 +1849,7 @@ end
1682
1849
 
1683
1850
  # MacroDroid Specific
1684
1851
  #
1685
- class ConfirmNextAction < Action
1852
+ class ConfirmNextAction < MacroDroidAction
1686
1853
 
1687
1854
  def initialize(h={})
1688
1855
 
@@ -1706,7 +1873,7 @@ class ConfirmNextAction < Action
1706
1873
 
1707
1874
  end
1708
1875
 
1709
- class DisableMacroAction < Action
1876
+ class DisableMacroAction < MacroDroidAction
1710
1877
 
1711
1878
  def initialize(obj=nil)
1712
1879
 
@@ -1753,7 +1920,7 @@ end
1753
1920
 
1754
1921
  # MacroDroid Specific
1755
1922
  #
1756
- class ExportMacrosAction < Action
1923
+ class ExportMacrosAction < MacroDroidAction
1757
1924
 
1758
1925
  def initialize(h={})
1759
1926
 
@@ -1775,9 +1942,61 @@ class ExportMacrosAction < Action
1775
1942
  end
1776
1943
 
1777
1944
 
1945
+
1946
+ class ForceMacroRunAction < MacroDroidAction
1947
+
1948
+ def initialize(obj=nil)
1949
+
1950
+ h = if obj.is_a? Hash then
1951
+
1952
+ obj
1953
+
1954
+ elsif obj.is_a? Array
1955
+
1956
+ e, macro, h2 = obj
1957
+
1958
+ # find the macro guid for the given name
1959
+ name = e.text('item/description').to_s
1960
+ found = macro.parent.macros.find {|macro| macro.title =~ /#{name}/ }
1961
+
1962
+ h3 = if found then
1963
+ {macro_name: found.title, GUID: found.guid}
1964
+ else
1965
+ {macro_name: name}
1966
+ end
1967
+
1968
+ h3.merge h2
1969
+
1970
+ end
1971
+
1972
+ options = {
1973
+ guid: nil, ignore_constraints: true,
1974
+ macro_name: "", use_off_status: false,
1975
+ user_prompt_title: "Run Macro"
1976
+ }
1977
+ super(options.merge h)
1978
+
1979
+ end
1980
+
1981
+ def invoke()
1982
+ super(macro_name: @h[:macro_name])
1983
+ end
1984
+
1985
+ def to_s(colour: false, indent: 0)
1986
+
1987
+ @s = 'Macro Run'# + @h.inspect
1988
+ @s += "\n" + @h[:macro_name]
1989
+ super()
1990
+
1991
+ end
1992
+
1993
+ alias to_summary to_s
1994
+
1995
+ end
1996
+
1778
1997
  # MacroDroid Specific
1779
1998
  #
1780
- class SetVariableAction < Action
1999
+ class SetVariableAction < MacroDroidAction
1781
2000
  using ColouredText
1782
2001
 
1783
2002
  def initialize(obj=nil)
@@ -1867,7 +2086,7 @@ end
1867
2086
 
1868
2087
  # MacroDroid Specific
1869
2088
  #
1870
- class TextManipulationAction < Action
2089
+ class TextManipulationAction < MacroDroidAction
1871
2090
 
1872
2091
  def initialize(h={})
1873
2092
 
@@ -1910,7 +2129,7 @@ end
1910
2129
 
1911
2130
 
1912
2131
 
1913
- class PauseAction < Action
2132
+ class PauseAction < MacroDroidAction
1914
2133
 
1915
2134
  def initialize(h={})
1916
2135
 
@@ -1950,6 +2169,62 @@ end
1950
2169
 
1951
2170
  # Category: Media
1952
2171
  #
2172
+
2173
+
2174
+ # note: to find a package id from an App name, try searching for the name on
2175
+ # the Google Play Store and the id will be returned in the URL once the
2176
+ # correct app has been clicked. e.g.
2177
+ # https://play.google.com/store/apps/details?id=com.google.android.music
2178
+ #
2179
+ class ControlMediaAction < MediaAction
2180
+
2181
+ def initialize(obj=nil)
2182
+
2183
+ h = if obj.is_a? Hash then
2184
+ obj
2185
+ elsif obj.is_a? Array
2186
+
2187
+ e, macro = obj
2188
+ s = e.text('item/description').to_s
2189
+ app = s[/Simulate Media Button \(([^\)]+)/,1]
2190
+
2191
+ if app then
2192
+
2193
+ {
2194
+ application_name: app, package_name: APPS[app],
2195
+ simulate_media_button: true
2196
+ }
2197
+
2198
+ else
2199
+ {}
2200
+ end
2201
+ end
2202
+
2203
+ options = {
2204
+ application_name: "Google Play Music", option: "Play/Pause",
2205
+ package_name: "com.google.android.music",
2206
+ send_media_player_commands: false,
2207
+ simulate_media_button: true,
2208
+ }
2209
+
2210
+ super(options.merge h)
2211
+
2212
+ end
2213
+
2214
+ def to_s(colour: false, indent: 0)
2215
+
2216
+ @s = 'Media ' + @h[:option] #+ @h.inspect
2217
+
2218
+ if @h[:simulate_media_button] then
2219
+ @s += "\nSimulate Media Button (%s)" % @h[:application_name]
2220
+ end
2221
+
2222
+ super()
2223
+ end
2224
+
2225
+ alias to_summary to_s
2226
+ end
2227
+
1953
2228
  class RecordMicrophoneAction < MediaAction
1954
2229
 
1955
2230
  def initialize(h={})
@@ -86,10 +86,15 @@ class ActionsNlp
86
86
 
87
87
  get /^take_picture/i do
88
88
  [TakePictureAction, {}]
89
- end
89
+ end
90
+
91
+ get /^Take Screenshot/i do
92
+ [TakeScreenshotAction, {}]
93
+ end
90
94
 
91
95
  # -- DEVICE ACTIONS ------------------------------------------------------
92
96
 
97
+ #
93
98
  get /^Speak text \(([^\)]+)\)/i do |text|
94
99
  [SpeakTextAction, {text: text}]
95
100
  end
@@ -100,7 +105,11 @@ class ActionsNlp
100
105
 
101
106
  get /^Speak text$/i do |text|
102
107
  [SpeakTextAction, {}]
103
- end
108
+ end
109
+
110
+ get /^UI Interaction$/i do
111
+ [UIInteractionAction, {}]
112
+ end
104
113
 
105
114
  get /^Vibrate \(([^\)]+)/i do |pattern|
106
115
  [VibrateAction, {pattern: pattern}]
@@ -109,6 +118,11 @@ class ActionsNlp
109
118
  get /^Vibrate$/i do |pattern|
110
119
  [VibrateAction, {pattern: 'short buzz'}]
111
120
  end
121
+
122
+ get /^Voice Search$/i do
123
+ [VoiceSearchAction, {}]
124
+ end
125
+
112
126
 
113
127
  # e.g. Display Notification: Hi there: This is the body of the message
114
128
  get /^Display Notification: ([^:]+): [^$]+$/i do |subject, text|
@@ -123,6 +137,10 @@ class ActionsNlp
123
137
  [SetWifiAction, {state: state}]
124
138
 
125
139
  end
140
+
141
+ get /^Fill Clipboard$/i do
142
+ [ClipboardAction, {}]
143
+ end
126
144
 
127
145
  # e.g. Play: Altair
128
146
  get /^Play: (.*)$/i do |name|
@@ -132,12 +150,24 @@ class ActionsNlp
132
150
  end
133
151
 
134
152
  # e.g. Launch Settings
135
- get /^Launch (.*)$/i do |application|
153
+ get /^Launch (.*)$/i do |s|
136
154
 
137
- h = {
138
- application_name: application,
139
- package_to_launch: 'com.android.' + application.downcase
140
- }
155
+ h = {}
156
+
157
+ if s[0] == '[' then
158
+
159
+ h[:launch_by_package_name] = s
160
+ h[:option] = 1
161
+
162
+ else
163
+ application = s
164
+ h[:application_name] = application
165
+ h[:package_to_launch] = APPS[application] || 'com.android.' +
166
+ application.downcase.split().join('.')
167
+ h[:option] = 0
168
+
169
+ end
170
+
141
171
  [LaunchActivityAction, h]
142
172
 
143
173
  end
@@ -155,6 +185,19 @@ class ActionsNlp
155
185
 
156
186
  end
157
187
 
188
+
189
+ get /^Open Website \/ HTTP GET$/i do
190
+
191
+ [OpenWebPageAction, {http_get: false}]
192
+
193
+ end
194
+
195
+ get /^(?:open|goto) ((?:https?:\/\/|\[lv=)[^$]+)$/i do |url|
196
+
197
+ [OpenWebPageAction, url_to_open: url, http_get: false]
198
+
199
+ end
200
+
158
201
  # e.g. webhook entered_kitchen
159
202
  #
160
203
  get /(?:webhook|HTTP GET) ([^$]+)$/i do |s|
@@ -221,6 +264,14 @@ class ActionsNlp
221
264
  state = %w(enable disable toggle).index(rawstate.downcase)
222
265
  [DisableMacroAction, {state: state}]
223
266
  end
267
+
268
+ get /^Macro Run$/i do
269
+ [ForceMacroRunAction, {}]
270
+ end
271
+
272
+ get /^Run Macro$/i do
273
+ [ForceMacroRunAction, {}]
274
+ end
224
275
 
225
276
  get /^Set Variable$/i do
226
277
  [SetVariableAction, {}]
@@ -230,6 +281,14 @@ class ActionsNlp
230
281
  [PauseAction, {delay_in_seconds: seconds.to_i}]
231
282
  end
232
283
 
284
+ ## -- Media -----------------------------------------
285
+ #
286
+ # options: Play/Pause, Previous, Next, Play, Pause, Stop
287
+ #
288
+ get /^Media ([^$]+)$/i do |option|
289
+ [ControlMediaAction, {option: option}]
290
+ end
291
+
233
292
  # -- Screen ------------------------------------------------
234
293
  #
235
294
  get /^Screen (On|Off)$/i do |state|
@@ -12,7 +12,7 @@ module ObjectX
12
12
 
13
13
  def action_to_object(ap, e, item, macro)
14
14
 
15
- debug = false
15
+ debug = true
16
16
 
17
17
  puts 'inside action_to_object: item.xml: ' + item.xml if debug
18
18
 
@@ -34,7 +34,8 @@ module ObjectX
34
34
  r = ap.find_action action
35
35
  puts 'r: ' + r.inspect if debug
36
36
 
37
- nested = description.element('item/description')
37
+ nested = description.element('item/*')
38
+ puts 'nested: ' + nested.inspect if debug
38
39
 
39
40
  if r[1].any? and not nested then
40
41
 
@@ -132,7 +133,8 @@ class MacroObject
132
133
  end
133
134
 
134
135
  def to_h()
135
-
136
+
137
+ @h.delete :macro
136
138
  hashify(@h)
137
139
 
138
140
  end
@@ -193,6 +195,7 @@ class MacroObject
193
195
 
194
196
  end
195
197
 
198
+
196
199
  private
197
200
 
198
201
  def hashify(h)
@@ -204,6 +207,7 @@ class MacroObject
204
207
  new_key = key.to_s.gsub(/\w_\w/){|x| x[0] + x[-1].upcase}
205
208
  new_key = new_key.prepend 'm_' unless @list.include? new_key
206
209
  new_key = 'm_SIGUID' if new_key == 'm_siguid'
210
+ new_key = 'm_SSIDList' if new_key == 'm_ssidList'
207
211
  new_val = value.is_a?(Hash) ? hashify(value) : value
208
212
  r.merge(new_key => new_val)
209
213
  end
@@ -268,7 +268,7 @@ class Macro
268
268
  r = tp.find_trigger trigger
269
269
  puts 'r: ' + r.inspect if @debug
270
270
  #o = r[0].new([description, self]) if r
271
- o = object_create(r[0], [description, self]) if r
271
+ o = object_create(r[0], [description, self, r[1]]) if r
272
272
  puts 'after o' if @debug
273
273
  o
274
274
 
@@ -356,7 +356,7 @@ class Macro
356
356
 
357
357
  end
358
358
 
359
- def match?(triggerx, detail={time: $env[:time]}, model=nil )
359
+ def match?(triggerx, detail={}, model=nil )
360
360
 
361
361
  if @triggers.any? {|x| x.type == triggerx and x.match?(detail, model) } then
362
362
 
@@ -61,6 +61,7 @@ class Trigger < MacroObject
61
61
  {|x| 'c: ' + x.to_summary(colour: colour, indent: 1)}.join(" %s " % operator)
62
62
 
63
63
  @constraints.any? ? @s + "\n" + constraints : @s
64
+ super()
64
65
 
65
66
  end
66
67
 
@@ -85,7 +86,7 @@ end
85
86
  # ["Any Network"]
86
87
  # ["some Wifi SSID"] - 1 or more SSID can be supplied
87
88
 
88
- class WifiConnectionTrigger < Trigger
89
+ class WifiConnectionTrigger2 < Trigger
89
90
 
90
91
  def initialize(h={})
91
92
 
@@ -216,7 +217,7 @@ class PowerButtonToggleTrigger < Trigger
216
217
  end
217
218
 
218
219
  def to_s(colour: false)
219
- 'PowerButtonToggleTrigger ' + @h.inspect
220
+ "Power Button Toggle (%s)" % @h[:num_toggles] #+ @h.inspect
220
221
  end
221
222
 
222
223
  alias to_summary to_s
@@ -457,7 +458,7 @@ class WebHookTrigger < Trigger
457
458
 
458
459
  url = "https://trigger.macrodroid.com/%s/%s" % \
459
460
  [@deviceid, @h[:identifier]]
460
- @s = 'WebHook (Url)' + "\n " + url
461
+ @s = 'WebHook (Url)' + "\n" + url
461
462
  super()
462
463
 
463
464
  end
@@ -469,8 +470,15 @@ end
469
470
  #
470
471
  class WifiConnectionTrigger < Trigger
471
472
 
472
- def initialize(h={})
473
+ def initialize(obj=nil)
473
474
 
475
+ h = if obj.is_a? Hash then
476
+ obj
477
+ elsif obj.is_a? Array
478
+ e, macro = obj
479
+ {ssid_list: [e.text('item/description').to_s], wifi_state: 2}
480
+ end
481
+
474
482
  options = {
475
483
  ssid_list: [],
476
484
  wifi_state: 0
@@ -482,10 +490,15 @@ class WifiConnectionTrigger < Trigger
482
490
 
483
491
  def to_s(colour: false)
484
492
  access_point = @h[:ssid_list].first
485
- 'Connected to network ' + access_point
493
+ @s = 'Connected to network'
494
+ @s += "\n" + access_point
495
+ super()
486
496
  end
487
497
 
488
- alias to_summary to_s
498
+ def to_summary()
499
+ access_point = @h[:ssid_list].first
500
+ 'Connected to network' + access_point
501
+ end
489
502
  end
490
503
 
491
504
  # Category: Connectivity
@@ -1010,7 +1023,7 @@ class MusicPlayingTrigger < DeviceEventsTrigger
1010
1023
  def to_s(colour: false)
1011
1024
 
1012
1025
  event = @h[:option] == 0 ? 'Started' : 'Stopped'
1013
- @s = 'Music/Sound Playing' + "\n %s" % event #+ @h.inspect
1026
+ @s = 'Music/Sound Playing' + "\n%s" % event #+ @h.inspect
1014
1027
  super()
1015
1028
 
1016
1029
  end
@@ -1026,8 +1039,15 @@ end
1026
1039
  #
1027
1040
  class NFCTrigger < DeviceEventsTrigger
1028
1041
 
1029
- def initialize(h={})
1030
-
1042
+ def initialize(obj=nil)
1043
+
1044
+ h = if obj.is_a? Hash then
1045
+ obj
1046
+ elsif obj.is_a? Array
1047
+ e, macro = obj
1048
+ {tag_name: e.text('item/description').to_s}
1049
+ end
1050
+
1031
1051
  options = {
1032
1052
  }
1033
1053
 
@@ -1367,8 +1387,24 @@ end
1367
1387
  #
1368
1388
  class ActivityRecognitionTrigger < SensorsTrigger
1369
1389
 
1370
- def initialize(h={})
1371
-
1390
+ def initialize(obj=nil)
1391
+
1392
+ #puts 'obj: ' + obj.inspect
1393
+
1394
+ h = if obj.is_a? Hash then
1395
+
1396
+ obj
1397
+
1398
+ elsif obj.is_a? Array
1399
+
1400
+ e, macro, h2 = obj
1401
+ #puts 'h2: ' + h2.inspect
1402
+ #puts 'e: ' + e.xml
1403
+ s = e.text('item/description').to_s
1404
+ #puts 's: ' + s.inspect
1405
+ {confidence_level: s[/\d+%$/].to_i}.merge h2
1406
+ end
1407
+
1372
1408
  options = {
1373
1409
  confidence_level: 50,
1374
1410
  selected_index: 1
@@ -1380,9 +1416,18 @@ class ActivityRecognitionTrigger < SensorsTrigger
1380
1416
 
1381
1417
  end
1382
1418
 
1419
+ def match?(detail={})
1420
+ @h[:selected_index] == detail[:selected_index]
1421
+ end
1422
+
1383
1423
  def to_s(colour: false)
1424
+
1384
1425
  activity = @activity[@h[:selected_index]]
1385
- 'Activity - ' + activity
1426
+ @s = 'Activity - ' + activity #+ @h.inspect
1427
+ @s += "\nConfidence >= %s%%" % @h[:confidence_level]
1428
+
1429
+ super()
1430
+
1386
1431
  end
1387
1432
 
1388
1433
  def to_summary(colour: false)
@@ -1499,6 +1544,19 @@ class FlipDeviceTrigger < SensorsTrigger
1499
1544
 
1500
1545
  end
1501
1546
 
1547
+ def match?(detail={})
1548
+
1549
+ fd = detail[:face_down]
1550
+
1551
+ b = if fd.is_a? String then
1552
+ fd.downcase == 'true'
1553
+ else
1554
+ fd
1555
+ end
1556
+
1557
+ @h[:face_down] == b
1558
+ end
1559
+
1502
1560
  def to_pc()
1503
1561
  @h[:face_down] ? 'flip_device_down?' : 'flip_device_up?'
1504
1562
  end
@@ -1577,7 +1635,7 @@ class ShortcutTrigger < Trigger
1577
1635
  end
1578
1636
 
1579
1637
  def to_s(colour: false)
1580
- 'ShortcutTrigger ' + @h.inspect
1638
+ 'Shortcut Launched' #+ @h.inspect
1581
1639
  end
1582
1640
 
1583
1641
  alias to_summary to_s
@@ -1633,8 +1691,15 @@ end
1633
1691
  #
1634
1692
  class MediaButtonPressedTrigger < Trigger
1635
1693
 
1636
- def initialize(h={})
1694
+ def initialize(obj=nil)
1637
1695
 
1696
+ h = if obj.is_a? Hash then
1697
+ obj
1698
+ elsif obj.is_a? Array
1699
+ e, macro = obj
1700
+ {option: e.text('item/description').to_s}
1701
+ end
1702
+
1638
1703
  options = {
1639
1704
  option: 'Single Press',
1640
1705
  cancel_press: false
@@ -1645,7 +1710,50 @@ class MediaButtonPressedTrigger < Trigger
1645
1710
  end
1646
1711
 
1647
1712
  def to_s(colour: false)
1648
- 'MediaButtonPressedTrigger ' + @h.inspect
1713
+
1714
+ @s = 'Media Button Pressed ' #+ @h.inspect
1715
+ @s += "\n" + @h[:option]
1716
+ super()
1717
+
1718
+ end
1719
+
1720
+ alias to_summary to_s
1721
+ end
1722
+
1723
+ class MediaButtonV2Trigger < Trigger
1724
+
1725
+ def initialize(obj=nil)
1726
+
1727
+ @a = %w(Play Play/Pause Pause Stop Previous Next Headset Hook)
1728
+
1729
+ h = if obj.is_a? Hash then
1730
+ obj
1731
+ elsif obj.is_a? Array
1732
+ e, macro = obj
1733
+ s = e.text('item/description').to_s
1734
+ a = s.split(/, /)
1735
+ {options_enabled_array: @a.map {|x| a.include? x } }
1736
+ end
1737
+
1738
+
1739
+
1740
+ options = {
1741
+ options_enabled_array: [true, false, false, false, false, false, false]
1742
+ }
1743
+
1744
+ super(options.merge h)
1745
+
1746
+ end
1747
+
1748
+ def to_s(colour: false)
1749
+
1750
+
1751
+ options = @a.zip(@h[:options_enabled_array]).select(&:last).map(&:first)
1752
+
1753
+ @s = 'Media Button V2 ' #+ @h.inspect
1754
+ @s += "\n" + options.join(', ')
1755
+ super()
1756
+
1649
1757
  end
1650
1758
 
1651
1759
  alias to_summary to_s
@@ -1655,8 +1763,22 @@ end
1655
1763
  #
1656
1764
  class SwipeTrigger < Trigger
1657
1765
 
1658
- def initialize(h={})
1659
-
1766
+ def initialize(obj=nil)
1767
+
1768
+ h = if obj.is_a? Hash then
1769
+ obj
1770
+ elsif obj.is_a? Array
1771
+
1772
+ e, macro = obj
1773
+ s = e.text('item/description').to_s
1774
+ start, motion = s.split(/ - /,2)
1775
+
1776
+ {
1777
+ swipe_start_area: ['Top Left', 'Top Right'].index(start),
1778
+ swipe_motion: %w(Across Diagonal Down).index(motion)
1779
+ }
1780
+ end
1781
+
1660
1782
  options = {
1661
1783
  swipe_start_area: 0,
1662
1784
  swipe_motion: 0,
@@ -1666,9 +1788,29 @@ class SwipeTrigger < Trigger
1666
1788
  super(options.merge h)
1667
1789
 
1668
1790
  end
1791
+
1792
+ def match?(detail={}, model=nil)
1793
+
1794
+ puts 'detail : ' + detail.inspect
1795
+
1796
+ return false if detail.empty?
1797
+
1798
+ detail[:swipe_start_area] = detail[:start]
1799
+ detail[:swipe_motion] = detail[:motion]
1800
+ return unless detail[:swipe_start_area] and detail[:swipe_motion]
1801
+
1802
+ @h[:swipe_start_area] == detail[:swipe_start_area].to_i and \
1803
+ @h[:swipe_motion] == detail[:swipe_motion].to_i
1804
+
1805
+ end
1669
1806
 
1670
1807
  def to_s(colour: false)
1671
- 'SwipeTrigger ' + @h.inspect
1808
+
1809
+ direction = [['Top Left', 'Top Right'][@h[:swipe_start_area]],
1810
+ %w(Across Diagonal Down)[@h[:swipe_motion]]].join(' - ')
1811
+ @s = 'Swipe Screen'# + @h.inspect
1812
+ @s += "\n" + direction
1813
+ super()
1672
1814
  end
1673
1815
 
1674
1816
  alias to_summary to_s
@@ -19,6 +19,10 @@ class TriggersNlp
19
19
 
20
20
  # -- Battery/Power ---------------------------------------------
21
21
 
22
+ get /Power Button Toggle \((\d)\)/i do |num|
23
+ [PowerButtonToggleTrigger, {num_toggles: num.to_i}]
24
+ end
25
+
22
26
  get /^Power Connected: (Wired \([^\)]+\))/i do |s|
23
27
 
24
28
  h = {
@@ -50,7 +54,26 @@ class TriggersNlp
50
54
  [ExternalPowerTrigger, h]
51
55
  end
52
56
 
57
+ # -- Connectivity ----------------------------------------------------
58
+ #
59
+
60
+ # Wifi State Change
61
+
62
+ get /^Connected to network (.*)$/i do |network|
63
+ [WifiConnectionTrigger, {ssid_list: [network], wifi_state: 2 }]
64
+ end
65
+
66
+ get /^Connected to network$/i do
67
+ [WifiConnectionTrigger, {}]
68
+ end
69
+
70
+
71
+
53
72
  # -- Device Events ----------------------------------------------------
73
+
74
+ get /^NFC Tag$/i do |state|
75
+ [NFCTrigger, {}]
76
+ end
54
77
 
55
78
  get /^Screen[ _](On|Off)/i do |state|
56
79
  [ScreenOnOffTrigger, {screen_on: state.downcase == 'on'}]
@@ -132,11 +155,59 @@ class TriggersNlp
132
155
  [WebHookTrigger, params]
133
156
  end
134
157
 
135
- # MacroDroid specific ---------------------------------------------------------------
158
+ #-- MacroDroid specific ---------------------------------------------------------------
136
159
 
137
160
  get /^EmptyTrigger$/i do
138
161
  [EmptyTrigger, params]
139
- end
162
+ end
163
+
164
+ #-- Sensors ---------------------------------------------------------------
165
+
166
+ get /^Activity - (.*)$/i do |s|
167
+
168
+ a = ['In Vehicle', 'On Bicycle', 'Running', 'Walking', 'Still']
169
+ r = a.find {|x| x.downcase == s.downcase}
170
+ h = r ? {selected_index: a.index(r)} : {}
171
+ [ActivityRecognitionTrigger , h]
172
+ end
173
+
174
+ # -- User Input ---------------------------------------------------------------
175
+
176
+ get /^Media Button Pressed$/i do
177
+ [MediaButtonPressedTrigger, {}]
178
+ end
179
+
180
+ get /^Media Button V2$/i do
181
+ [MediaButtonV2Trigger, {}]
182
+ end
183
+
184
+ get /^Shortcut Launched$/i do
185
+ [ShortcutTrigger, {}]
186
+ end
187
+
188
+ get /^Swipe Screen$/i do
189
+ [SwipeTrigger, {}]
190
+ end
191
+
192
+ get /^Swipe (top left) (across|diagonal|down)$/i do |start, motion|
193
+
194
+ swipe_motion = case motion.downcase.to_sym
195
+ when :across
196
+ 0
197
+ when :diagonal
198
+ 1
199
+ when :down
200
+ 2
201
+ end
202
+
203
+ h = {
204
+ swipe_start_area: (start.downcase == 'top left' ? 0 : 1),
205
+ swipe_motion: swipe_motion
206
+ }
207
+
208
+ [SwipeTrigger, h]
209
+
210
+ end
140
211
 
141
212
  end
142
213
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-macrodroid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.12
4
+ version: 0.9.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -35,7 +35,7 @@ cert_chain:
35
35
  NZ2kdBIUDnAM24e0/wXdVxg4HnsZbdymxyzMQ4P5pKYcpI6oisBxI37p/Xy+wAg3
36
36
  SBHno3GEuuD8ZWj24IMJpfbp
37
37
  -----END CERTIFICATE-----
38
- date: 2020-10-19 00:00:00.000000000 Z
38
+ date: 2020-10-24 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: glw
metadata.gz.sig CHANGED
Binary file