ruby-macrodroid 0.8.9 → 0.9.1
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/ruby-macrodroid.rb +28 -758
- data/lib/ruby-macrodroid/actions.rb +142 -34
- data/lib/ruby-macrodroid/constraints.rb +1338 -0
- data/lib/ruby-macrodroid/macro.rb +630 -0
- data/lib/ruby-macrodroid/triggers.rb +42 -9
- metadata +12 -10
- metadata.gz.sig +0 -0
@@ -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(
|
53
|
-
"%s/%s: %s" % [@group, @type,
|
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(
|
146
|
+
def initialize(obj={}, macro=nil)
|
147
|
+
|
148
|
+
h = if obj.is_a? Hash then
|
144
149
|
|
145
|
-
|
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=>"",
|
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
|
-
|
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
|
-
|
324
|
-
|
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
|
-
|
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(
|
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(
|
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(
|
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
|
-
|
1942
|
-
|
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
|