ruby-macrodroid 0.8.9 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -42,15 +42,15 @@ class Action < MacroObject
42
42
  macro = h[:macro]
43
43
  h.delete :macro
44
44
  super(h)
45
-
46
- # fetch the constraints
45
+
47
46
  @constraints = @h[:constraint_list].map do |constraint|
48
47
  object(constraint.to_snake_case.merge(macro: macro))
49
- end
48
+ end
49
+
50
50
  end
51
51
 
52
- def invoke(s='')
53
- "%s/%s: %s" % [@group, @type, s]
52
+ def invoke(h={})
53
+ "%s/%s: %s" % [@group, @type, h.to_json]
54
54
  end
55
55
 
56
56
 
@@ -136,26 +136,79 @@ class LaunchShortcutAction < ApplicationAction
136
136
 
137
137
  end
138
138
 
139
+ class OpenWebPageActionError < Exception
140
+ end
141
+
139
142
  # Category: Applications
140
143
  #
141
144
  class OpenWebPageAction < ApplicationAction
142
145
 
143
- def initialize(h={})
146
+ def initialize(obj={}, macro=nil)
147
+
148
+ h = if obj.is_a? Hash then
144
149
 
145
- h[:url_to_open] = h[:url] if h[:url]
150
+ obj
151
+
152
+ elsif obj.is_a? Array
153
+ puts 'obj: ' + obj.inspect if @debug
154
+ e, macro = obj
155
+
156
+ a = e.xpath('item/*')
157
+
158
+ h2 = if a.any? then
159
+ a.map {|node| [node.name.to_sym, node.text.to_s]}.to_h
160
+ else
161
+ txt = e.text('item/description')
162
+ {url: (txt || e.text)}
163
+ end
164
+
165
+ h2.merge(macro: macro)
166
+
167
+ end
168
+
169
+ puts 'h:' + h.inspect if @debug
170
+
171
+ h[:url_to_open] = h[:url] if h[:url] and h[:url].length > 1
146
172
 
147
173
  options = {
148
- variable_to_save_response: {:m_stringValue=>"", :m_name=>"", :m_decimalValue=>0.0, :isLocal=>true, :m_booleanValue=>false, :excludeFromLog=>false, :m_intValue=>0, :m_type=>2},
174
+ variable_to_save_response: {:m_stringValue=>"", :m_name=>"",
175
+ m_decimalValue: 0.0, isLocal: true, m_booleanValue: false,
176
+ excludeFromLog: false, m_intValue: 0, m_type: 2},
149
177
  url_to_open: '',
150
178
  http_get: true,
151
179
  disable_url_encode: false,
152
180
  block_next_action: false
153
181
  }
154
-
155
- super(options.merge filter(options,h))
182
+
183
+ if h[:macro].remote_url.nil? and (h[:url_to_open].nil? or
184
+ h[:url_to_open].empty?) then
185
+ raise OpenWebPageActionError, 'remote_url not found'
186
+ end
187
+
188
+ if (h[:identifier].nil? or h[:identifier].empty?) and
189
+ (h[:url_to_open].nil? or h[:url_to_open].empty?) then
190
+
191
+ h[:url_to_open] = h[:macro].remote_url.sub(/\/$/,'') + '/' +
192
+ h[:macro].title.downcase.gsub(/ +/,'-')
193
+
194
+ elsif h2 and h[:macro].remote_url and h[:identifier]
195
+
196
+ url = "%s/%s" % [h[:macro].remote_url.sub(/\/$/,''), h[:identifier]]
197
+ h2.delete :identifier
198
+ url += '?' + \
199
+ URI.escape(h2.map {|key,value| "%s=%s" % [key, value]}.join('&'))
200
+ h[:url_to_open] = url
201
+
202
+ end
203
+
204
+ super(options.merge h)
156
205
 
157
206
  end
158
207
 
208
+ def invoke()
209
+ super(url: @h[:url_to_open])
210
+ end
211
+
159
212
  def to_s(colour: false, indent: 0)
160
213
  @s = "HTTP GET\nurl: " + @h[:url_to_open]
161
214
  super()
@@ -317,25 +370,50 @@ end
317
370
  # Conditions/Loops
318
371
  #
319
372
  class IfConditionAction < Action
320
-
373
+
321
374
  def initialize(obj=nil)
375
+
376
+ options = {
377
+ a: true,
378
+ constraint_list: []
379
+ }
322
380
 
323
- h = if obj.is_a? Hash then
324
- obj
381
+ if obj.is_a? Hash then
382
+
383
+ h = obj
384
+ macro = h[:macro]
385
+ h2 = options.merge(filter(options,h).merge(macro: macro))
386
+ super(h2)
387
+
388
+ elsif obj.is_a? Array
389
+ e, macro = obj
390
+ super()
391
+ raw_txt = e.text('item/description') || e.text.to_s
392
+ puts 'raw_txt: ' + raw_txt.inspect if $debug
393
+
394
+ clause = raw_txt[/^if (.*)/i,1]
395
+ conditions = clause.split(/\s+\b(?:AND|OR)\b\s+/i)
396
+
397
+ cp = ConstraintsNlp.new
398
+
399
+ @constraints = conditions.map do |c|
400
+ puts 'c: ' + c.inspect
401
+ r = cp.find_constraint c
402
+ puts 'found constraint ' + r.inspect if $debug
403
+
404
+ r[0].new(r[1]) if r
405
+
406
+ end
407
+ puts '@constraints: ' + @constraints.inspect if $debug
408
+ {}
325
409
  else
326
410
  # get the constraints
327
411
 
328
412
  end
329
413
 
330
- options = {
331
- a: true,
332
- constraint_list: ''
333
- }
414
+
334
415
 
335
- macro = h[:macro]
336
- h2 = options.merge(filter(options,h).merge(macro: macro))
337
416
 
338
- super(h2)
339
417
 
340
418
  @label = 'If '
341
419
 
@@ -344,7 +422,7 @@ class IfConditionAction < Action
344
422
  def to_s(colour: false, indent: 0)
345
423
 
346
424
  h = @h.clone
347
- h.delete :macro
425
+ #h.delete :macro
348
426
  @s = 'If '
349
427
  operator = @h[:is_or_condition] ? 'OR' : 'AND'
350
428
  constraints = @constraints.map \
@@ -418,13 +496,22 @@ end
418
496
 
419
497
  class EndIfAction < Action
420
498
 
421
- def initialize(h={})
422
-
499
+ def initialize(obj={})
500
+
501
+ h = if obj.is_a? Hash then
502
+ obj
503
+ elsif obj.is_a? Rexle::Element
504
+ {}
505
+ else
506
+ {}
507
+ end
508
+
509
+
423
510
  options = {
424
- constraint_list: ''
511
+ constraint_list: []
425
512
  }
426
513
 
427
- super(options.merge h)
514
+ super()
428
515
 
429
516
  end
430
517
 
@@ -432,6 +519,8 @@ class EndIfAction < Action
432
519
  'End If'
433
520
  end
434
521
 
522
+ alias to_summary to_s
523
+
435
524
  end
436
525
 
437
526
  class ConnectivityAction < Action
@@ -667,9 +756,10 @@ class SayTimeAction < DateTimeAction
667
756
  end
668
757
 
669
758
  def invoke()
670
- time = ($env and $env[:time]) ? $env[:time] : Time.now
759
+ #time = ($env and $env[:time]) ? $env[:time] : Time.now
760
+ time = Time.now
671
761
  tformat = @h['12_hour'] ? "%-I:%M%P" : "%H:%M"
672
- super(time.strftime(tformat))
762
+ super(txt: time.strftime(tformat))
673
763
  end
674
764
 
675
765
  def to_pc()
@@ -758,10 +848,18 @@ end
758
848
  #
759
849
  class SpeakTextAction < DeviceAction
760
850
 
761
- def initialize(h={})
762
-
851
+ def initialize(obj=nil)
852
+
853
+ h = if obj.is_a? Hash then
854
+ obj
855
+ elsif obj.is_a? Array
856
+ e, macro = obj
857
+ txt = e.text('item/description')
858
+ {text: (txt || e.text)}
859
+ end
860
+
763
861
  options = {
764
- text_to_say: '',
862
+ text_to_say: h[:text] || '',
765
863
  queue: false,
766
864
  read_numbers_individually: false,
767
865
  specify_audio_stream: false,
@@ -775,8 +873,13 @@ class SpeakTextAction < DeviceAction
775
873
 
776
874
  end
777
875
 
876
+ def invoke()
877
+ super(text: @h[:text_to_say])
878
+ end
879
+
778
880
  def to_s(colour: false, indent: 0)
779
- "Speak Text (%s)" % @h[:text_to_say]
881
+ @s = "Speak Text (%s)" % @h[:text_to_say]
882
+ super()
780
883
  end
781
884
 
782
885
  end
@@ -928,6 +1031,9 @@ class CameraFlashLightAction < DeviceSettingsAction
928
1031
  super(options.merge h)
929
1032
 
930
1033
  end
1034
+ def invoke()
1035
+ super(state: @h[:state])
1036
+ end
931
1037
 
932
1038
  def to_pc()
933
1039
  ['torch :on', 'torch :off', 'torch :toggle'][@h[:state]]
@@ -1938,8 +2044,10 @@ class ToastAction < NotificationsAction
1938
2044
 
1939
2045
  h = if obj.is_a? Hash then
1940
2046
  obj
1941
- else
1942
- {msg: obj}
2047
+ elsif obj.is_a? Array
2048
+ e, macro = obj
2049
+ txt = e.text('item/description')
2050
+ {msg: (txt || e.text)}
1943
2051
  end
1944
2052
 
1945
2053
  if h[:msg] then
@@ -1963,7 +2071,7 @@ class ToastAction < NotificationsAction
1963
2071
  end
1964
2072
 
1965
2073
  def invoke()
1966
- super(@h[:message_text])
2074
+ super(msg: @h[:message_text])
1967
2075
  end
1968
2076
 
1969
2077
  def to_pc()
@@ -0,0 +1,1338 @@
1
+ # file: ruby-macrodroid/constraints.rb
2
+
3
+ # This file contains the following classes:
4
+ #
5
+ #
6
+ # ## Constraint classes
7
+ #
8
+ # Constraint TimeOfDayConstraint BatteryLevelConstraint
9
+ # BatterySaverStateConstraint BatteryTemperatureConstraint
10
+ # ExternalPowerConstraint BluetoothConstraint GPSEnabledConstraint
11
+ # LocationModeConstraint SignalOnOffConstraint WifiConstraint
12
+ # CellTowerConstraint IsRoamingConstraint DataOnOffConstraint
13
+ # WifiHotSpotConstraint CalendarConstraint DayOfWeekConstraint
14
+ # TimeOfDayConstraint DayOfMonthConstraint MonthOfYearConstraint
15
+ # SunsetSunriseConstraint AirplaneModeConstraint AutoRotateConstraint
16
+ # DeviceLockedConstraint RoamingOnOffConstraint TimeSinceBootConstraint
17
+ # AutoSyncConstraint NFCStateConstraint IsRootedConstraint VpnConstraint
18
+ # MacroEnabledConstraint ModeConstraint TriggerThatInvokedConstraint
19
+ # LastRunTimeConstraint HeadphonesConnectionConstraint MusicActiveConstraint
20
+ # NotificationPresentConstraint PriorityModeConstraint
21
+ # NotificationVolumeConstraint InCallConstraint PhoneRingingConstraint
22
+ # BrightnessConstraint VolumeConstraint SpeakerPhoneConstraint
23
+ # DarkThemeConstraint ScreenOnOffConstraint VolumeLevelConstraint
24
+ # FaceUpDownConstraint LightLevelConstraint DeviceOrientationConstraint
25
+ # ProximitySensorConstraint
26
+ #
27
+
28
+ class Constraint < MacroObject
29
+
30
+ def initialize(h={})
31
+ super(h)
32
+ end
33
+
34
+ def match?(detail={}, model=nil)
35
+
36
+ detail.select {|k,v| @h.include? k }.all? {|key,value| @h[key] == value}
37
+
38
+ end
39
+
40
+ #def to_s()
41
+ # ''
42
+ #end
43
+
44
+ protected
45
+
46
+ def toggle_match?(key, val)
47
+
48
+ if @h[key] == true and val == key.to_s then
49
+ true
50
+ elsif @h[key] == false and val != key.to_s
51
+ true
52
+ else
53
+ false
54
+ end
55
+
56
+ end
57
+
58
+ end
59
+
60
+
61
+ # Category: application
62
+ #
63
+ class ActiveApplicationConstraint < Constraint
64
+
65
+ def initialize(h={})
66
+
67
+ options = {
68
+ :application_name_list=>["YouTube"],
69
+ :foreground=>true,
70
+ :package_name_list=>["com.google.android.youtube"]
71
+ }
72
+
73
+ super(options.merge h)
74
+
75
+ end
76
+
77
+ def to_s(colour: false, indent: 0)
78
+
79
+ indentx = ' ' * indent
80
+ mode = @h[:foreground] ? 'foreground' : 'not foreground'
81
+ apps = @h[:application_name_list]
82
+ indentx + 'App ' + mode + "\n " + indentx + apps.join(', ') #+ @h.inspect
83
+ end
84
+
85
+ def to_summary(colour: false, indent: 0)
86
+
87
+ mode = @h[:foreground] ? 'foreground' : 'not foreground'
88
+ apps = @h[:application_name_list]
89
+ 'App ' + mode + " (%s)" % apps.join(', ') #+ @h.inspect
90
+ end
91
+ end
92
+
93
+ # Category: Battery/Power
94
+ #
95
+ class BatteryLevelConstraint < Constraint
96
+
97
+ def initialize(h={})
98
+
99
+ options = {
100
+ battery_level: 23,
101
+ equals: false,
102
+ greater_than: false
103
+ }
104
+
105
+ super(options.merge h)
106
+
107
+ end
108
+
109
+ def to_s(colour: false, indent: 0)
110
+
111
+ operator = if @h[:greater_than] then
112
+ '>'
113
+ elsif @h[:equals]
114
+ '='
115
+ else
116
+ '<'
117
+ end
118
+
119
+ level = @h[:battery_level]
120
+
121
+ "Battery %s %s%%" % [operator, level]
122
+ end
123
+
124
+ alias to_summary to_s
125
+
126
+ end
127
+
128
+ # Category: Battery/Power
129
+ #
130
+ class BatterySaverStateConstraint < Constraint
131
+
132
+ def initialize(h={})
133
+
134
+ options = {
135
+ option: 0
136
+ }
137
+
138
+ super(options.merge h)
139
+
140
+ end
141
+
142
+ def to_s(colour: false, indent: 0)
143
+ 'BatterySaverStateConstraint ' + @h.inspect
144
+ end
145
+
146
+ alias to_summary to_s
147
+ end
148
+
149
+ # Category: Battery/Power
150
+ #
151
+ class BatteryTemperatureConstraint < Constraint
152
+
153
+ def initialize(h={})
154
+
155
+ options = {
156
+ equals: false,
157
+ greater_than: false,
158
+ temperature: 30
159
+ }
160
+
161
+ super(options.merge h)
162
+
163
+ end
164
+
165
+ def to_s(colour: false, indent: 0)
166
+ 'BatteryTemperatureConstraint ' + @h.inspect
167
+ end
168
+
169
+ alias to_summary to_s
170
+ end
171
+
172
+ # Category: Battery/Power
173
+ #
174
+ class ExternalPowerConstraint < Constraint
175
+
176
+ def initialize(h={})
177
+
178
+ options = {
179
+ external_power: true,
180
+ power_connected_options: [false, true, false]
181
+ }
182
+
183
+ super(options.merge h)
184
+
185
+ end
186
+
187
+ def to_s(colour: false, indent: 0)
188
+ connection = @h[:external_power] ? 'Connected' : 'Disconnected'
189
+ 'Power ' + connection
190
+ end
191
+
192
+ end
193
+
194
+ # Category: Connectivity
195
+ #
196
+ class BluetoothConstraint < Constraint
197
+
198
+ def initialize(h={})
199
+
200
+ options = {
201
+ any_device: false,
202
+ bt_state: 0,
203
+ device_name: 'Any Device'
204
+ }
205
+
206
+ super(options.merge h)
207
+
208
+ end
209
+
210
+ def to_s(colour: false, indent: 0)
211
+ device = @h[:device_name] #== 'Any Device' ? 'Any' : @h[:device_name]
212
+ "Device Connected\n %s" % device
213
+ end
214
+
215
+ def to_summary(colour: false)
216
+ device = @h[:device_name] #== 'Any Device' ? 'Any' : @h[:device_name]
217
+ "Device Connected (%s)" % device
218
+ end
219
+
220
+ end
221
+
222
+ # Category: Connectivity
223
+ #
224
+ class GPSEnabledConstraint < Constraint
225
+
226
+ def initialize(h={})
227
+
228
+ options = {
229
+ enabled: true
230
+ }
231
+
232
+ super(options.merge h)
233
+
234
+ end
235
+
236
+ def to_s(colour: false, indent: 0)
237
+ 'GPSEnabledConstraint ' + @h.inspect
238
+ end
239
+
240
+ alias to_summary to_s
241
+ end
242
+
243
+ # Category: Connectivity
244
+ #
245
+ class LocationModeConstraint < Constraint
246
+
247
+ def initialize(h={})
248
+
249
+ options = {
250
+ options: [false, false, false, true]
251
+ }
252
+
253
+ super(options.merge h)
254
+
255
+ end
256
+
257
+ def to_s(colour: false, indent: 0)
258
+ 'LocationModeConstraint ' + @h.inspect
259
+ end
260
+
261
+ alias to_summary to_s
262
+ end
263
+
264
+ # Category: Connectivity
265
+ #
266
+ class SignalOnOffConstraint < Constraint
267
+
268
+ def initialize(h={})
269
+
270
+ options = {
271
+ option: 0
272
+ }
273
+
274
+ super(options.merge h)
275
+
276
+ end
277
+
278
+ def to_s(colour: false, indent: 0)
279
+ 'SignalOnOffConstraint ' + @h.inspect
280
+ end
281
+
282
+ alias to_summary to_s
283
+ end
284
+
285
+ # Category: Connectivity
286
+ #
287
+ class WifiConstraint < Constraint
288
+
289
+
290
+ def initialize(h={})
291
+
292
+ options = {
293
+ ssid_list: [],
294
+ wifi_state: 0
295
+ }
296
+
297
+ super(options.merge h)
298
+
299
+ end
300
+
301
+ def to_s(colour: false, indent: 0)
302
+
303
+ state = ['Enabled','Disabled','Connected', 'Not Connected'][@h[:wifi_state]]
304
+ @s = 'Wifi ' + state + ': '
305
+
306
+ if @h[:ssid_list].length > 1 then
307
+ @s += "[%s]" % @h[:ssid_list].join(', ')
308
+ elsif @h[:ssid_list].length > 0
309
+ @s += @h[:ssid_list].first
310
+ end
311
+
312
+ end
313
+
314
+ alias to_summary to_s
315
+ end
316
+
317
+ # Category: Connectivity
318
+ #
319
+ class CellTowerConstraint < Constraint
320
+
321
+ def initialize(h={})
322
+
323
+ options = {
324
+ cell_group_name: 'test group',
325
+ cell_ids: ["524,14,41070731"],
326
+ in_range: true
327
+ }
328
+
329
+ super(options.merge h)
330
+
331
+ end
332
+
333
+ def to_s(colour: false, indent: 0)
334
+ 'CellTowerConstraint ' + @h.inspect
335
+ end
336
+
337
+ alias to_summary to_s
338
+ end
339
+
340
+ # Category: Connectivity
341
+ #
342
+ class IsRoamingConstraint < Constraint
343
+
344
+ def initialize(h={})
345
+
346
+ options = {
347
+ is_roaming: true
348
+ }
349
+
350
+ super(options.merge h)
351
+
352
+ end
353
+
354
+ def to_s(colour: false, indent: 0)
355
+ 'IsRoamingConstraint ' + @h.inspect
356
+ end
357
+
358
+ alias to_summary to_s
359
+ end
360
+
361
+ # Category: Connectivity
362
+ #
363
+ class DataOnOffConstraint < Constraint
364
+
365
+ def initialize(h={})
366
+
367
+ options = {
368
+ data_on: true
369
+ }
370
+
371
+ super(options.merge h)
372
+
373
+ end
374
+
375
+ def to_s(colour: false, indent: 0)
376
+ 'DataOnOffConstraint ' + @h.inspect
377
+ end
378
+
379
+ alias to_summary to_s
380
+ end
381
+
382
+ # Category: Connectivity
383
+ #
384
+ class WifiHotSpotConstraint < Constraint
385
+
386
+ def initialize(h={})
387
+
388
+ options = {
389
+ check_connections: false,
390
+ comparison_value: 0,
391
+ connected_count: 0,
392
+ enabled: true
393
+ }
394
+
395
+ super(options.merge h)
396
+
397
+ end
398
+
399
+ def to_s(colour: false, indent: 0)
400
+ 'WifiHotSpotConstraint ' + @h.inspect
401
+ end
402
+
403
+ alias to_summary to_s
404
+ end
405
+
406
+ # Category: Date/Time
407
+ #
408
+ class CalendarConstraint < Constraint
409
+
410
+ def initialize(h={})
411
+
412
+ options = {
413
+ enable_regex: false,
414
+ availability: 0,
415
+ calendar_id: '1',
416
+ calendar_name: 'PC Sync',
417
+ detail_text: '',
418
+ entry_set: true,
419
+ ignore_all_day: false,
420
+ title_text: ''
421
+ }
422
+
423
+ super(options.merge h)
424
+
425
+ end
426
+
427
+ def to_s(colour: false, indent: 0)
428
+ 'CalendarConstraint ' + @h.inspect
429
+ end
430
+
431
+ alias to_summary to_s
432
+ end
433
+
434
+ # Category: Date/Time
435
+ #
436
+ class DayOfWeekConstraint < Constraint
437
+
438
+ def initialize(h={})
439
+
440
+ options = {
441
+ days_of_week: [false, false, true, false, false, false, false]
442
+ }
443
+
444
+ super(options.merge h)
445
+
446
+ end
447
+
448
+ def to_s(colour: false, indent: 0)
449
+ 'DayOfWeekConstraint ' + @h.inspect
450
+ end
451
+
452
+ alias to_summary to_s
453
+ end
454
+
455
+ # Category: Date/Time
456
+ #
457
+ class StopWatchConstraint < Constraint
458
+
459
+ def initialize(h={})
460
+
461
+ options = {
462
+ days_of_week: [false, false, true, false, false, false, false]
463
+ }
464
+
465
+ super(options.merge h)
466
+
467
+ end
468
+
469
+ def to_s(colour: false, indent: 0)
470
+ #'StopWatchConstraint ' + @h.inspect
471
+ operator = @h[:greater_than] ? '>' : '<'
472
+ "%s %s %s" % [@h[:stopwatch_name], operator, @h[:variable_name] ] #+ @h.inspect
473
+ end
474
+
475
+ alias to_summary to_s
476
+ end
477
+
478
+ # Category: Date/Time
479
+ #
480
+ class TimeOfDayConstraint < Constraint
481
+
482
+ def initialize(h={})
483
+
484
+ options = {
485
+ end_hour: 8,
486
+ end_minute: 0,
487
+ start_hour: 22,
488
+ start_minute: 0
489
+ }
490
+
491
+ super(options.merge h)
492
+
493
+ end
494
+
495
+ def to_s(colour: false, indent: 0)
496
+ a = @h[:start_hour], @h[:start_minute], @h[:end_hour], @h[:start_minute]
497
+ 'Time of Day ' + "%02d:%02d - %02d:%02d" % a
498
+ end
499
+
500
+ alias to_summary to_s
501
+ end
502
+
503
+ # Category: Date/Time
504
+ #
505
+ class DayOfMonthConstraint < Constraint
506
+
507
+ def initialize(h={})
508
+
509
+ options = {
510
+ day_names: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"],
511
+ days_of_month: [false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
512
+ }
513
+
514
+ super(options.merge h)
515
+
516
+ end
517
+
518
+ def to_s(colour: false, indent: 0)
519
+ 'DayOfMonthConstraint ' + @h.inspect
520
+ end
521
+
522
+ alias to_summary to_s
523
+ end
524
+
525
+ # Category: Date/Time
526
+ #
527
+ class MonthOfYearConstraint < Constraint
528
+
529
+ def initialize(h={})
530
+
531
+ options = {
532
+ months: [false, false, false, false, false, false, false, true, false, false, false, false]
533
+ }
534
+
535
+ super(options.merge h)
536
+
537
+ end
538
+
539
+ def to_s(colour: false, indent: 0)
540
+ 'MonthOfYearConstraint ' + @h.inspect
541
+ end
542
+
543
+ alias to_summary to_s
544
+ end
545
+
546
+ # Category: Date/Time
547
+ #
548
+ class SunsetSunriseConstraint < Constraint
549
+
550
+ def initialize(h={})
551
+
552
+ options = {
553
+ option: 0
554
+ }
555
+
556
+ super(options.merge h)
557
+
558
+ end
559
+
560
+ def to_s(colour: false, indent: 0)
561
+ 'SunsetSunriseConstraint ' + @h.inspect
562
+ end
563
+
564
+ alias to_summary to_s
565
+ end
566
+
567
+ # Category: Device State
568
+ #
569
+ class AirplaneModeConstraint < Constraint
570
+
571
+ def initialize(h={})
572
+
573
+ options = {
574
+ enabled: true
575
+ }
576
+
577
+ super(options.merge h)
578
+
579
+ end
580
+
581
+ def match?(detail={}, model=nil)
582
+
583
+ puts 'inside airplaneModeConstraint#match?' if $debug
584
+
585
+ if detail.has_key? :enabled then
586
+
587
+ puts 'detail has the key' if $debug
588
+ super(detail)
589
+
590
+ elsif model
591
+
592
+ if $debug then
593
+ puts 'checking the model'
594
+ switch = model.connectivity.airplane_mode.switch
595
+ puts 'switch: ' + switch.inspect
596
+ end
597
+
598
+ toggle_match?(:enabled, switch)
599
+
600
+ end
601
+
602
+ end
603
+
604
+ def to_pc()
605
+ status = @h[:enabled] ? 'enabled?' : 'disabled?'
606
+ 'airplane_mode.' + status
607
+ end
608
+
609
+ def to_s(colour: false, indent: 0)
610
+
611
+ status = @h[:enabled] ? 'Enabled' : 'Disabled'
612
+ 'Airplane Mode ' + status
613
+
614
+ end
615
+
616
+ alias to_summary to_s
617
+
618
+ end
619
+
620
+ # Category: Device State
621
+ #
622
+ class AutoRotateConstraint < Constraint
623
+
624
+ def initialize(h={})
625
+
626
+ options = {
627
+ enabled: true
628
+ }
629
+
630
+ super(options.merge h)
631
+
632
+ end
633
+
634
+ def to_s(colour: false, indent: 0)
635
+ 'AutoRotateConstraint ' + @h.inspect
636
+ end
637
+
638
+ alias to_summary to_s
639
+ end
640
+
641
+ # Category: Device State
642
+ #
643
+ class DeviceLockedConstraint < Constraint
644
+
645
+ def initialize(h={})
646
+
647
+ options = {
648
+ locked: true
649
+ }
650
+
651
+ super(options.merge h)
652
+
653
+ end
654
+
655
+ def to_s(colour: false, indent: 0)
656
+ 'Device ' + (@h[:locked] ? 'Locked' : 'Unlocked')
657
+ end
658
+
659
+ alias to_summary to_s
660
+
661
+ end
662
+
663
+ # Category: Device State
664
+ #
665
+ class RoamingOnOffConstraint < Constraint
666
+
667
+ def initialize(h={})
668
+
669
+ options = {
670
+ roaming_on: true
671
+ }
672
+
673
+ super(options.merge h)
674
+
675
+ end
676
+
677
+ def to_s(colour: false, indent: 0)
678
+ 'RoamingOnOffConstraint ' + @h.inspect
679
+ end
680
+
681
+ alias to_summary to_s
682
+ end
683
+
684
+ # Category: Device State
685
+ #
686
+ class TimeSinceBootConstraint < Constraint
687
+
688
+ def initialize(h={})
689
+
690
+ options = {
691
+ less_than: true,
692
+ time_period_seconds: 10921
693
+ }
694
+
695
+ super(options.merge h)
696
+
697
+ end
698
+
699
+ def to_s(colour: false, indent: 0)
700
+ 'TimeSinceBootConstraint ' + @h.inspect
701
+ end
702
+
703
+ alias to_summary to_s
704
+ end
705
+
706
+ # Category: Device State
707
+ #
708
+ class AutoSyncConstraint < Constraint
709
+
710
+ def initialize(h={})
711
+
712
+ options = {
713
+ enabled: false
714
+ }
715
+
716
+ super(options.merge h)
717
+
718
+ end
719
+
720
+ def to_s(colour: false, indent: 0)
721
+ 'AutoSyncConstraint ' + @h.inspect
722
+ end
723
+
724
+ alias to_summary to_s
725
+ end
726
+
727
+ # Category: Device State
728
+ #
729
+ class NFCStateConstraint < Constraint
730
+
731
+ def initialize(h={})
732
+
733
+ options = {
734
+ enabled: true
735
+ }
736
+
737
+ super(options.merge h)
738
+
739
+ end
740
+
741
+ def to_s(colour: false, indent: 0)
742
+ 'NFCStateConstraint ' + @h.inspect
743
+ end
744
+
745
+ alias to_summary to_s
746
+ end
747
+
748
+ # Category: Device State
749
+ #
750
+ class IsRootedConstraint < Constraint
751
+
752
+ def initialize(h={})
753
+
754
+ options = {
755
+ rooted: true
756
+ }
757
+
758
+ super(options.merge h)
759
+
760
+ end
761
+
762
+ def to_s(colour: false, indent: 0)
763
+ 'IsRootedConstraint ' + @h.inspect
764
+ end
765
+
766
+ alias to_summary to_s
767
+ end
768
+
769
+ # Category: Device State
770
+ #
771
+ class VpnConstraint < Constraint
772
+
773
+ def initialize(h={})
774
+
775
+ options = {
776
+ option: 0
777
+ }
778
+
779
+ super(options.merge h)
780
+
781
+ end
782
+
783
+ def to_s(colour: false, indent: 0)
784
+ 'VpnConstraint ' + @h.inspect
785
+ end
786
+
787
+ alias to_summary to_s
788
+ end
789
+
790
+
791
+ # Category: MacroDroid Specific
792
+ #
793
+ class MacroDroidVariableConstraint < Constraint
794
+
795
+ def initialize(h={})
796
+
797
+ options = {
798
+
799
+ :enable_regex=>false,
800
+ :boolean_value=>false,
801
+ :double_value=>0.0,
802
+ :int_compare_variable=>false,
803
+ :int_greater_than=>false,
804
+ :int_less_than=>false,
805
+ :int_not_equal=>false,
806
+ :int_value=>1,
807
+ :string_comparison_type=>0,
808
+ :string_equal=>true,
809
+ :variable=>{
810
+ :exclude_from_log=>false,
811
+ :is_local=>true,
812
+ :boolean_value=>false,
813
+ :decimal_value=>0.0,
814
+ :int_value=>2,
815
+ :name=>"torch",
816
+ :string_value=>"",
817
+ :type=>1
818
+ }
819
+
820
+ }
821
+
822
+ super(options.merge h)
823
+
824
+ end
825
+
826
+ def to_s(colour: false, indent: 0)
827
+
828
+ a = [:int_greater_than, :int_less_than, :int_not_equal,
829
+ :string_equal].zip(['>','<','!=', '='])
830
+ operator = a.find {|label,_| @h[label]}.last
831
+
832
+ @s = "%s %s %s" % [@h[:variable][:name], operator, @h[:int_value]]
833
+ super()
834
+ end
835
+
836
+ alias to_summary to_s
837
+ end
838
+
839
+ # Category: MacroDroid Specific
840
+ #
841
+ class MacroEnabledConstraint < Constraint
842
+
843
+ def initialize(h={})
844
+
845
+ options = {
846
+ enabled: true,
847
+ macro_ids: [-8016812002629322290],
848
+ macro_names: ["Intruder photo "]
849
+ }
850
+
851
+ super(options.merge h)
852
+
853
+ end
854
+
855
+ def to_s(colour: false, indent: 0)
856
+ 'MacroEnabledConstraint ' + @h.inspect
857
+ end
858
+
859
+ alias to_summary to_s
860
+ end
861
+
862
+ # Category: MacroDroid Specific
863
+ #
864
+ class ModeConstraint < Constraint
865
+
866
+ def initialize(h={})
867
+
868
+ options = {
869
+ mode: 'Away',
870
+ mode_selected: true
871
+ }
872
+
873
+ super(options.merge h)
874
+
875
+ end
876
+
877
+ def to_s(colour: false, indent: 0)
878
+ 'ModeConstraint ' + @h.inspect
879
+ end
880
+
881
+ alias to_summary to_s
882
+ end
883
+
884
+ # Category: MacroDroid Specific
885
+ #
886
+ class TriggerThatInvokedConstraint < Constraint
887
+ using ColouredText
888
+
889
+ def initialize(h={})
890
+
891
+ puts ('h: ' + h.inspect).green
892
+ @trigger = h[:macro].triggers.find {|x| x.siguid == h[:si_guid_that_invoked] }
893
+
894
+ options = {
895
+ not: false,
896
+ si_guid_that_invoked: -4951291100076165433,
897
+ trigger_name: 'Shake Device'
898
+ }
899
+
900
+ #super(options.merge filter(options,h))
901
+ super(options.merge h)
902
+
903
+ end
904
+
905
+ def to_s(colour: false, indent: 0)
906
+ 'Trigger Fired: ' + @trigger.to_s(colour: colour)
907
+ end
908
+
909
+ def to_summary(colour: false)
910
+ #puts '@trigger' + @trigger.inspect
911
+ if @trigger then
912
+ 'Trigger Fired: ' + @trigger.to_summary(colour: colour)
913
+ else
914
+ 'Trigger Fired: Trigger not found; guid: ' + @h[:si_guid_that_invoked].inspect
915
+ end
916
+ end
917
+
918
+ end
919
+
920
+ # Category: MacroDroid Specific
921
+ #
922
+ class LastRunTimeConstraint < Constraint
923
+
924
+ def initialize(h={})
925
+
926
+ options = {
927
+ check_this_macro: false,
928
+ invoked: true,
929
+ macro_ids: [-6922688338672048267],
930
+ macro_names: ["Opendoor"],
931
+ time_period_seconds: 7260
932
+ }
933
+
934
+ super(options.merge h)
935
+
936
+ end
937
+
938
+ def to_s(colour: false, indent: 0)
939
+
940
+ macro = if @h[:check_this_macro] then
941
+ '[This Macro]'
942
+ end
943
+
944
+ invoked = @h[:invoked] ? ' Invoked' : 'Not Invoked'
945
+
946
+ duration = Subunit.seconds(@h[:time_period_seconds]).strfunit("%x")
947
+ "Macro(s) %s\n %s: %s for %s" % [invoked, macro, invoked, duration]
948
+
949
+ end
950
+
951
+ alias to_summary to_s
952
+ end
953
+
954
+ # Category: Media
955
+ #
956
+ class HeadphonesConnectionConstraint < Constraint
957
+
958
+ def initialize(h={})
959
+
960
+ options = {
961
+ connected: true
962
+ }
963
+
964
+ super(options.merge h)
965
+
966
+ end
967
+
968
+ def to_s(colour: false, indent: 0)
969
+ connection = @h[:connected] ? 'Connected' : 'Disconnected'
970
+ 'Headphones ' + connection
971
+ end
972
+
973
+ alias to_summary to_s
974
+
975
+ end
976
+
977
+ # Category: Media
978
+ #
979
+ class MusicActiveConstraint < Constraint
980
+
981
+ def initialize(h={})
982
+
983
+ options = {
984
+ music_active: true
985
+ }
986
+
987
+ super(options.merge h)
988
+
989
+ end
990
+
991
+ def to_s(colour: false, indent: 0)
992
+ active = @h[:music_active] ? 'Playing' : 'Stopped'
993
+ 'Music ' + active #+ @h.inspect
994
+ end
995
+
996
+ alias to_summary to_s
997
+ end
998
+
999
+ # Category: Notification
1000
+ #
1001
+ class NotificationPresentConstraint < Constraint
1002
+
1003
+ def initialize(h={})
1004
+
1005
+ options = {
1006
+ enable_regex: false,
1007
+ application_name_list: ["All applications"],
1008
+ exact_match: false,
1009
+ excludes: false,
1010
+ excludes_apps: -1,
1011
+ option: 0,
1012
+ package_name_list: ["allApplications"],
1013
+ text_content: ''
1014
+ }
1015
+
1016
+ super(options.merge h)
1017
+
1018
+ end
1019
+
1020
+ def to_s(colour: false, indent: 0)
1021
+ 'NotificationPresentConstraint ' + @h.inspect
1022
+ end
1023
+
1024
+ alias to_summary to_s
1025
+ end
1026
+
1027
+ # Category: Notification
1028
+ #
1029
+ class PriorityModeConstraint < Constraint
1030
+
1031
+ def initialize(h={})
1032
+
1033
+ options = {
1034
+ in_mode: true,
1035
+ selected_index: 0
1036
+ }
1037
+
1038
+ super(options.merge h)
1039
+
1040
+ end
1041
+
1042
+ def to_s(colour: false, indent: 0)
1043
+ 'PriorityModeConstraint ' + @h.inspect
1044
+ end
1045
+
1046
+ alias to_summary to_s
1047
+ end
1048
+
1049
+ # Category: Notification
1050
+ #
1051
+ class NotificationVolumeConstraint < Constraint
1052
+
1053
+ def initialize(h={})
1054
+
1055
+ options = {
1056
+ option: 1
1057
+ }
1058
+
1059
+ super(options.merge h)
1060
+
1061
+ end
1062
+
1063
+ def to_s(colour: false, indent: 0)
1064
+ 'NotificationVolumeConstraint ' + @h.inspect
1065
+ end
1066
+
1067
+ alias to_summary to_s
1068
+ end
1069
+
1070
+ # Category: Phone
1071
+ #
1072
+ class InCallConstraint < Constraint
1073
+
1074
+ def initialize(h={})
1075
+
1076
+ options = {
1077
+ in_call: true
1078
+ }
1079
+
1080
+ super(options.merge h)
1081
+
1082
+ end
1083
+
1084
+ def to_s(colour: false, indent: 0)
1085
+ 'InCallConstraint ' + @h.inspect
1086
+ end
1087
+
1088
+ alias to_summary to_s
1089
+ end
1090
+
1091
+ # Category: Phone
1092
+ #
1093
+ class PhoneRingingConstraint < Constraint
1094
+
1095
+ def initialize(h={})
1096
+
1097
+ options = {
1098
+ ringing: true
1099
+ }
1100
+
1101
+ super(options.merge h)
1102
+
1103
+ end
1104
+
1105
+ def to_s(colour: false, indent: 0)
1106
+ @s = @h[:ringing] ? 'Phone Ringing' : 'Not Ringing'
1107
+ super(colour: colour)
1108
+ end
1109
+
1110
+ end
1111
+
1112
+ # Category: Screen and Speaker
1113
+ #
1114
+ class BrightnessConstraint < Constraint
1115
+
1116
+ def initialize(h={})
1117
+
1118
+ options = {
1119
+ brightness: 35,
1120
+ equals: false,
1121
+ force_pie_mode: false,
1122
+ greater_than: false,
1123
+ is_auto_brightness: false
1124
+ }
1125
+
1126
+ super(options.merge h)
1127
+
1128
+ end
1129
+
1130
+ def to_s(colour: false, indent: 0)
1131
+ 'BrightnessConstraint ' + @h.inspect
1132
+ end
1133
+
1134
+ alias to_summary to_s
1135
+ end
1136
+
1137
+ # Category: Screen and Speaker
1138
+ #
1139
+ class VolumeConstraint < Constraint
1140
+
1141
+ def initialize(h={})
1142
+
1143
+ options = {
1144
+ option: 0
1145
+ }
1146
+
1147
+ super(options.merge filter(options, h))
1148
+
1149
+ end
1150
+
1151
+ def to_s(colour: false, indent: 0)
1152
+ a = ['Volume On', 'Vibrate Only' 'Silent', 'Vibrate or Silent']
1153
+
1154
+ "Ringer Volume\n " + a[@h[:option]]
1155
+ end
1156
+
1157
+ end
1158
+
1159
+ # Category: Screen and Speaker
1160
+ #
1161
+ class SpeakerPhoneConstraint < Constraint
1162
+
1163
+ def initialize(h={})
1164
+
1165
+ options = {
1166
+ enabled: true
1167
+ }
1168
+
1169
+ super(options.merge h)
1170
+
1171
+ end
1172
+
1173
+ def to_s(colour: false, indent: 0)
1174
+ 'SpeakerPhoneConstraint ' + @h.inspect
1175
+ end
1176
+
1177
+ alias to_summary to_s
1178
+ end
1179
+
1180
+ # Category: Screen and Speaker
1181
+ #
1182
+ class DarkThemeConstraint < Constraint
1183
+
1184
+ def initialize(h={})
1185
+
1186
+ options = {
1187
+ option: 0
1188
+ }
1189
+
1190
+ super(options.merge h)
1191
+
1192
+ end
1193
+
1194
+ def to_s(colour: false, indent: 0)
1195
+ 'DarkThemeConstraint ' + @h.inspect
1196
+ end
1197
+
1198
+ alias to_summary to_s
1199
+ end
1200
+
1201
+ # Category: Screen and Speaker
1202
+ #
1203
+ class ScreenOnOffConstraint < Constraint
1204
+
1205
+ def initialize(h={})
1206
+
1207
+ options = {
1208
+ a: true,
1209
+ screen_on: true
1210
+ }
1211
+
1212
+ super(options.merge h)
1213
+
1214
+ end
1215
+
1216
+ def to_s(colour: false, indent: 0)
1217
+ 'Screen ' + (@h[:screen_on] ? 'On' : 'Off')
1218
+ end
1219
+
1220
+ alias to_summary to_s
1221
+
1222
+ end
1223
+
1224
+ # Category: Screen and Speaker
1225
+ #
1226
+ class VolumeLevelConstraint < Constraint
1227
+
1228
+ def initialize(h={})
1229
+
1230
+ options = {
1231
+ comparison: 0,
1232
+ stream_index_array: [false, true, false, false, false, false, false],
1233
+ volume: 42
1234
+ }
1235
+
1236
+ super(options.merge h)
1237
+
1238
+ end
1239
+
1240
+ def to_s(colour: false, indent: 0)
1241
+ 'VolumeLevelConstraint ' + @h.inspect
1242
+ end
1243
+
1244
+ alias to_summary to_s
1245
+ end
1246
+
1247
+ # Category: Sensors
1248
+ #
1249
+ class FaceUpDownConstraint < Constraint
1250
+
1251
+ def initialize(h={})
1252
+
1253
+ options = {
1254
+ option: -1,
1255
+ selected_options: [true, false, true, false, false, false]
1256
+ }
1257
+
1258
+ super(options.merge h)
1259
+
1260
+ end
1261
+
1262
+ def to_s(colour: false, indent: 0)
1263
+ a = ['Face Up', 'Face Down', 'Vertical Upright', 'Vertical Upside Down',
1264
+ 'Sideways Left', 'Sideways Right']
1265
+ s = @h[:selected_options].zip(a).select(&:first).map(&:last).join(', ')
1266
+
1267
+ 'Device Facing' + "\n " + s #+ @h.inspect
1268
+ end
1269
+
1270
+ alias to_summary to_s
1271
+ end
1272
+
1273
+ # Category: Sensors
1274
+ #
1275
+ class LightLevelConstraint < Constraint
1276
+
1277
+ def initialize(h={})
1278
+
1279
+ options = {
1280
+ light_level: -1,
1281
+ light_level_float: 5000.0,
1282
+ option: 1
1283
+ }
1284
+
1285
+ super(options.merge h)
1286
+
1287
+ end
1288
+
1289
+ def to_s(colour: false, indent: 0)
1290
+
1291
+ operator = @h[:light_level] == -1 ? 'Less than' : 'Greater than'
1292
+ condition = operator + ' ' + @h[:light_level_float].to_s + 'lx'
1293
+ 'Light Sensor ' + condition
1294
+
1295
+ end
1296
+
1297
+ end
1298
+
1299
+ # Category: Sensors
1300
+ #
1301
+ class DeviceOrientationConstraint < Constraint
1302
+
1303
+ def initialize(h={})
1304
+
1305
+ options = {
1306
+ portrait: true
1307
+ }
1308
+
1309
+ super(options.merge h)
1310
+
1311
+ end
1312
+
1313
+ def to_s(colour: false, indent: 0)
1314
+ 'DeviceOrientationConstraint ' + @h.inspect
1315
+ end
1316
+
1317
+ alias to_summary to_s
1318
+ end
1319
+
1320
+ # Category: Sensors
1321
+ #
1322
+ class ProximitySensorConstraint < Constraint
1323
+
1324
+ def initialize(h={})
1325
+
1326
+ options = {
1327
+ near: true
1328
+ }
1329
+
1330
+ super(options.merge h)
1331
+
1332
+ end
1333
+
1334
+ def to_s(colour: false, indent: 0)
1335
+ 'Proximity Sensor: ' + (@h[:near] ? 'Near' : 'Far')
1336
+ end
1337
+
1338
+ end