-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStateManager.bas
254 lines (244 loc) · 6.82 KB
/
StateManager.bas
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=StaticCode
Version=5.5
@EndOfDesignText@
'StateManager v1.20
'Code module
Sub Process_Globals
Dim states As Map
Dim listPosition As Int
Dim statesFileName, settingsFileName As String
statesFileName = Application.PackageName&"state.dat"
settingsFileName = "settings.properties"
Dim settings As Map
End Sub
'Gets the setting value associated with the given key.
'Returns the DefaultValue parameter if the key was not found.
Public Sub GetSetting2(Key As String, DefaultValue As String) As String
If settings.IsInitialized = False Then
'load the stored settings
If File.Exists(File.DirInternal, settingsFileName) Then
settings = File.ReadMap(File.DirInternal, settingsFileName)
Else
Return DefaultValue
End If
End If
Dim v As String
v = settings.GetDefault(Key.ToLowerCase, DefaultValue)
Return v
End Sub
'Gets the setting value associated with the given key.
'Returns an empty string if the key was not found.
Public Sub GetSetting(Key As String) As String
Return GetSetting2(Key, "")
End Sub
Public Sub SetSetting(Key As String, Value As String)
If settings.IsInitialized = False Then
'load the stored settings
If File.Exists(File.DirInternal, settingsFileName) Then
settings = File.ReadMap(File.DirInternal, settingsFileName)
Else
settings.Initialize
End If
End If
settings.Put(Key.ToLowerCase, Value)
End Sub
'Stored the settings in a file
Public Sub SaveSettings
If settings.IsInitialized Then
File.WriteMap(File.DirInternal, settingsFileName, settings)
End If
End Sub
'Resets the stored state data for this activity.
Public Sub ResetState(ActivityName As String)
loadStateFile
If states.IsInitialized Then
states.Remove(ActivityName.ToLowerCase)
writeStateToFile
End If
End Sub
'Saves the activity state. ActivityName - Used for handling multiple activities.
Public Sub SaveState(Activity As Activity, ActivityName As String)
If states.IsInitialized = False Then states.Initialize
Dim list1 As List
list1.Initialize
list1.Add(DateTime.Now)
For i = 0 To Activity.NumberOfViews - 1
innerSaveState(Activity.GetView(i), list1)
Next
states.Put(ActivityName.ToLowerCase, list1)
writeStateToFile
End Sub
Private Sub writeStateToFile
Dim raf As RandomAccessFile
raf.Initialize(File.DirInternal, statesFileName, False)
raf.WriteObject(states, True, raf.CurrentPosition)
raf.Close
End Sub
Private Sub innerSaveState(v As View, list1 As List)
Dim data() As Object
If v Is EditText Then
Dim edit As EditText
edit = v
data = Array As Object(edit.Text, edit.SelectionStart)
Else If v Is Spinner Then
Dim spinner1 As Spinner
spinner1 = v
data = Array As Object(spinner1.SelectedIndex)
Else If v Is CheckBox Then
Dim check As CheckBox
check = v
data = Array As Object(check.Checked)
Else If v Is RadioButton Then
Dim radio As RadioButton
radio = v
data = Array As Object(radio.Checked)
Else If v Is ToggleButton Then
Dim toggle As ToggleButton
toggle = v
data = Array As Object(toggle.Checked)
Else If v Is SeekBar Then
Dim seek As SeekBar
seek = v
data = Array As Object(seek.Value)
Else If v Is TabHost Then
Dim th As TabHost
th = v
data = Array As Object(th.CurrentTab)
For i = 0 To th.TabCount - 1
th.CurrentTab = i
Next
list1.Add(data)
Dim data() As Object
Dim r As Reflector
r.Target = th
Dim tabParentPanel As Panel
tabParentPanel = r.RunMethod("getTabContentView")
For i = 0 To tabParentPanel.NumberOfViews - 1
innerSaveState(tabParentPanel.GetView(i), list1)
Next
Else If v Is ScrollView Then
Dim sv As ScrollView
sv = v
data = Array As Object(sv.ScrollPosition)
list1.Add(data)
Dim data() As Object
innerSaveState(sv.Panel, list1)
Else If v Is Panel Then
Dim panel1 As Panel
panel1 = v
For i = 0 To panel1.NumberOfViews - 1
innerSaveState(panel1.GetView(i), list1)
Next
End If
If data.Length > 0 Then list1.Add(data)
End Sub
Private Sub innerRestoreState(v As View, list1 As List)
Dim data() As Object
If v Is EditText Then
Dim edit As EditText
edit = v
data = getNextItem(list1)
edit.Text = data(0)
edit.SelectionStart = data(1)
Else If v Is Spinner Then
Dim spinner1 As Spinner
spinner1 = v
data = getNextItem(list1)
spinner1.SelectedIndex = data(0)
Else If v Is CheckBox Then
Dim check As CheckBox
check = v
data = getNextItem(list1)
check.Checked = data(0)
Else If v Is RadioButton Then
Dim radio As RadioButton
radio = v
data = getNextItem(list1)
radio.Checked = data(0)
Else If v Is ToggleButton Then
Dim toggle As ToggleButton
toggle = v
data = getNextItem(list1)
toggle.Checked = data(0)
Else If v Is SeekBar Then
Dim seek As SeekBar
seek = v
data = getNextItem(list1)
seek.Value = data(0)
Else If v Is TabHost Then
Dim th As TabHost
th = v
data = getNextItem(list1)
For i = 0 To th.TabCount - 1
th.CurrentTab = i
Next
th.CurrentTab = data(0)
Dim r As Reflector
r.Target = th
Dim tabParentPanel As Panel
tabParentPanel = r.RunMethod("getTabContentView")
For i = 0 To tabParentPanel.NumberOfViews - 1
innerRestoreState(tabParentPanel.GetView(i), list1)
Next
Else If v Is ScrollView Then
Dim sv As ScrollView
sv = v
data = getNextItem(list1)
sv.ScrollPosition = data(0)
DoEvents
sv.ScrollPosition = data(0)
innerRestoreState(sv.Panel, list1)
Else If v Is Panel Then
Dim panel1 As Panel
panel1 = v
For i = 0 To panel1.NumberOfViews - 1
innerRestoreState(panel1.GetView(i), list1)
Next
End If
End Sub
Private Sub getNextItem(list1 As List) As Object()
listPosition = listPosition + 1
Return list1.Get(listPosition)
End Sub
'Loads the stored state (if such is available)
'ActivityName - Should match the value use in SaveState
'ValidPeriodInMinutes - The validity period of this state measured in minutes. Pass 0 for an unlimited period.
'Returns true if the state was loaded
Public Sub RestoreState(Activity As Activity, ActivityName As String, ValidPeriodInMinutes As Int) As Boolean
Try
loadStateFile
If states.IsInitialized = False Then
Return False
End If
Dim list1 As List
list1 = states.Get(ActivityName.ToLowerCase)
If list1.IsInitialized = False Then Return False
Dim time As Long
time = list1.Get(0)
If ValidPeriodInMinutes > 0 And time + ValidPeriodInMinutes * DateTime.TicksPerMinute < DateTime.Now Then
Return False
End If
listPosition = 0
For i = 0 To Activity.NumberOfViews - 1
innerRestoreState(Activity.GetView(i), list1)
Next
Return True
Catch
Log("Error loading state.")
Log(LastException.Message)
Return False
End Try
End Sub
Private Sub loadStateFile
'only load the state if it is not already available in memory.
If states.IsInitialized Then Return
If File.Exists(File.DirInternal, statesFileName) Then
Dim raf As RandomAccessFile
raf.Initialize(File.DirInternal, statesFileName, False)
states = raf.ReadObject(0)
raf.Close
End If
End Sub