OXYGENHUB

Android: Hook up Rust FFI greeting to Compose UI 5edf011e4d10

Author
Andy McCall @andymccall <[email protected]>
When
· 2026-09-30 12:41 UTC
Signature
✔ signed by Andy McCall
Hash
5edf011e4d10e6cc3f6e99b2fd9d92281b6f2390c2d67e751e77b9ecf9a7fbb4
Depends on
e0e4a1c48a77 f821ee741b9f
Depended on by
57c0824300db 19e1dbc01b93 490d18066788 e845c208d516 e955ae0c1342 7045183e3d2c 66127df36f3a
In bookmarks
main
In tags
v0.1.0 v0.1.1 v0.1.2 v0.1.3 v0.1.4 v0.1.5 v0.1.6 v0.1.7 v0.1.8 v0.1.9
Edits
31 atoms, 42 tree operations, 29 files

Browse the tree at this change

added .gradle/9.6.0/checksums/checksums.lock +0 −0

No line changes.

added .gradle/9.6.0/executionHistory/executionHistory.lock +0 −0

No line changes.

added .gradle/9.6.0/fileChanges/last-build.bin +0 −0

No line changes.

added .gradle/9.6.0/fileHashes/fileHashes.bin +0 −0

No line changes.

added .gradle/9.6.0/fileHashes/fileHashes.lock +0 −0

No line changes.

added .gradle/9.6.0/fileHashes/resourceHashesCache.bin +0 −0

No line changes.

added .gradle/9.6.0/gc.properties +0 −0

No line changes.

added .gradle/buildOutputCleanup/buildOutputCleanup.lock +0 −0

No line changes.

added .gradle/buildOutputCleanup/cache.properties +2 −0
1 +
#Wed Sep 30 13:07:43 BST 2026
2 +
gradle.version=9.6.0
added .gradle/vcs-1/gc.properties +0 −0

No line changes.

added .idea/.gitignore +3 −0
1 +
# Default ignored files
2 +
/shelf/
3 +
/workspace.xml
added .idea/.name +1 −0
1 +
OxygenHub
added .idea/AndroidProjectSystem.xml +6 −0
1 +
<?xml version="1.0" encoding="UTF-8"?>
2 +
<project version="4">
3 +
  <component name="AndroidProjectSystem">
4 +
    <option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
5 +
  </component>
6 +
</project>
added .idea/caches/deviceStreaming.xml +2385 −0
1 +
<?xml version="1.0" encoding="UTF-8"?>
2 +
<project version="4">
3 +
  <component name="DeviceStreaming">
4 +
    <option name="deviceSelectionList">
5 +
      <list>
6 +
        <PersistentDeviceSelectionData>
7 +
          <option name="api" value="34" />
8 +
          <option name="brand" value="Sony" />
9 +
          <option name="codename" value="A402SO" />
10 +
          <option name="id" value="A402SO" />
11 +
          <option name="labId" value="google" />
12 +
          <option name="manufacturer" value="Sony" />
13 +
          <option name="name" value="Xperia 10 VI" />
14 +
          <option name="screenDensity" value="450" />
15 +
          <option name="screenX" value="1080" />
16 +
          <option name="screenY" value="2520" />
17 +
        </PersistentDeviceSelectionData>
18 +
        <PersistentDeviceSelectionData>
19 +
          <option name="api" value="27" />
20 +
          <option name="brand" value="DOCOMO" />
21 +
          <option name="codename" value="F01L" />
22 +
          <option name="id" value="F01L" />
23 +
          <option name="labId" value="google" />
24 +
          <option name="manufacturer" value="FUJITSU" />
25 +
          <option name="name" value="F-01L" />
26 +
          <option name="screenDensity" value="360" />
27 +
          <option name="screenX" value="720" />
28 +
          <option name="screenY" value="1280" />
29 +
        </PersistentDeviceSelectionData>
30 +
        <PersistentDeviceSelectionData>
31 +
          <option name="api" value="36" />
32 +
          <option name="brand" value="qti" />
33 +
          <option name="codename" value="Frogger" />
34 +
          <option name="id" value="Frogger" />
35 +
          <option name="labId" value="google" />
36 +
          <option name="manufacturer" value="Nothing" />
37 +
          <option name="name" value="Phone (4a)" />
38 +
          <option name="screenDensity" value="480" />
39 +
          <option name="screenX" value="1224" />
40 +
          <option name="screenY" value="2720" />
41 +
        </PersistentDeviceSelectionData>
42 +
        <PersistentDeviceSelectionData>
43 +
          <option name="api" value="33" />
44 +
          <option name="brand" value="Infinix" />
45 +
          <option name="codename" value="Infinix-X6525" />
46 +
          <option name="id" value="Infinix-X6525" />
47 +
          <option name="labId" value="google" />
48 +
          <option name="manufacturer" value="INFINIX MOBILITY LIMITED" />
49 +
          <option name="name" value="Infinix SMART 8" />
50 +
          <option name="screenDensity" value="320" />
51 +
          <option name="screenX" value="720" />
52 +
          <option name="screenY" value="1612" />
53 +
        </PersistentDeviceSelectionData>
54 +
        <PersistentDeviceSelectionData>
55 +
          <option name="api" value="34" />
56 +
          <option name="brand" value="OnePlus" />
57 +
          <option name="codename" value="OP535DL1" />
58 +
          <option name="id" value="OP535DL1" />
59 +
          <option name="labId" value="google" />
60 +
          <option name="manufacturer" value="OnePlus" />
61 +
          <option name="name" value="Nord CE 2 Lite 5G" />
62 +
          <option name="screenDensity" value="401" />
63 +
          <option name="screenX" value="1080" />
64 +
          <option name="screenY" value="2412" />
65 +
        </PersistentDeviceSelectionData>
66 +
        <PersistentDeviceSelectionData>
67 +
          <option name="api" value="34" />
68 +
          <option name="brand" value="OnePlus" />
69 +
          <option name="codename" value="OP5552L1" />
70 +
          <option name="id" value="OP5552L1" />
71 +
          <option name="labId" value="google" />
72 +
          <option name="manufacturer" value="OnePlus" />
73 +
          <option name="name" value="10T 5G" />
74 +
          <option name="screenDensity" value="480" />
75 +
          <option name="screenX" value="1080" />
76 +
          <option name="screenY" value="2412" />
77 +
        </PersistentDeviceSelectionData>
78 +
        <PersistentDeviceSelectionData>
79 +
          <option name="api" value="34" />
80 +
          <option name="brand" value="OPPO" />
81 +
          <option name="codename" value="OP573DL1" />
82 +
          <option name="id" value="OP573DL1" />
83 +
          <option name="labId" value="google" />
84 +
          <option name="manufacturer" value="OPPO" />
85 +
          <option name="name" value="A79 5G" />
86 +
          <option name="screenDensity" value="480" />
87 +
          <option name="screenX" value="1080" />
88 +
          <option name="screenY" value="2400" />
89 +
        </PersistentDeviceSelectionData>
90 +
        <PersistentDeviceSelectionData>
91 +
          <option name="api" value="34" />
92 +
          <option name="brand" value="OPPO" />
93 +
          <option name="codename" value="OP5759L1" />
94 +
          <option name="id" value="OP5759L1" />
95 +
          <option name="labId" value="google" />
96 +
          <option name="manufacturer" value="OPPO" />
97 +
          <option name="name" value="A38" />
98 +
          <option name="screenDensity" value="320" />
99 +
          <option name="screenX" value="720" />
100 +
          <option name="screenY" value="1612" />
101 +
        </PersistentDeviceSelectionData>
102 +
        <PersistentDeviceSelectionData>
103 +
          <option name="api" value="35" />
104 +
          <option name="brand" value="realme" />
105 +
          <option name="codename" value="RE58C2" />
106 +
          <option name="id" value="RE58C2" />
107 +
          <option name="labId" value="google" />
108 +
          <option name="manufacturer" value="realme" />
109 +
          <option name="name" value="C53" />
110 +
          <option name="screenDensity" value="320" />
111 +
          <option name="screenX" value="720" />
112 +
          <option name="screenY" value="1600" />
113 +
        </PersistentDeviceSelectionData>
114 +
        <PersistentDeviceSelectionData>
115 +
          <option name="api" value="30" />
116 +
          <option name="brand" value="realme" />
117 +
          <option name="codename" value="RMX3231" />
118 +
          <option name="id" value="RMX3231" />
119 +
          <option name="labId" value="google" />
120 +
          <option name="manufacturer" value="realme" />
121 +
          <option name="name" value="RMX3231" />
122 +
          <option name="screenDensity" value="320" />
123 +
          <option name="screenX" value="720" />
124 +
          <option name="screenY" value="1600" />
125 +
        </PersistentDeviceSelectionData>
126 +
        <PersistentDeviceSelectionData>
127 +
          <option name="api" value="36" />
128 +
          <option name="brand" value="samsung" />
129 +
          <option name="codename" value="SC-51C" />
130 +
          <option name="id" value="SC-51C" />
131 +
          <option name="labId" value="google" />
132 +
          <option name="manufacturer" value="Samsung" />
133 +
          <option name="name" value="Galaxy S22" />
134 +
          <option name="screenDensity" value="480" />
135 +
          <option name="screenX" value="1080" />
136 +
          <option name="screenY" value="2340" />
137 +
        </PersistentDeviceSelectionData>
138 +
        <PersistentDeviceSelectionData>
139 +
          <option name="api" value="36" />
140 +
          <option name="brand" value="samsung" />
141 +
          <option name="codename" value="SC-51E" />
142 +
          <option name="id" value="SC-51E" />
143 +
          <option name="labId" value="google" />
144 +
          <option name="manufacturer" value="Samsung" />
145 +
          <option name="name" value="Galaxy S24" />
146 +
          <option name="screenDensity" value="480" />
147 +
          <option name="screenX" value="1080" />
148 +
          <option name="screenY" value="2340" />
149 +
        </PersistentDeviceSelectionData>
150 +
        <PersistentDeviceSelectionData>
151 +
          <option name="api" value="36" />
152 +
          <option name="brand" value="samsung" />
153 +
          <option name="codename" value="SC-53C" />
154 +
          <option name="id" value="SC-53C" />
155 +
          <option name="labId" value="google" />
156 +
          <option name="manufacturer" value="Samsung" />
157 +
          <option name="name" value="Galaxy A53 5G" />
158 +
          <option name="screenDensity" value="450" />
159 +
          <option name="screenX" value="1080" />
160 +
          <option name="screenY" value="2400" />
161 +
        </PersistentDeviceSelectionData>
162 +
        <PersistentDeviceSelectionData>
163 +
          <option name="api" value="36" />
164 +
          <option name="brand" value="samsung" />
165 +
          <option name="codename" value="SCG13" />
166 +
          <option name="id" value="SCG13" />
167 +
          <option name="labId" value="google" />
168 +
          <option name="manufacturer" value="Samsung" />
169 +
          <option name="name" value="Galaxy S22" />
170 +
          <option name="screenDensity" value="480" />
171 +
          <option name="screenX" value="1080" />
172 +
          <option name="screenY" value="2340" />
173 +
        </PersistentDeviceSelectionData>
174 +
        <PersistentDeviceSelectionData>
175 +
          <option name="api" value="28" />
176 +
          <option name="brand" value="DOCOMO" />
177 +
          <option name="codename" value="SH-01L" />
178 +
          <option name="id" value="SH-01L" />
179 +
          <option name="labId" value="google" />
180 +
          <option name="manufacturer" value="SHARP" />
181 +
          <option name="name" value="AQUOS sense2 SH-01L" />
182 +
          <option name="screenDensity" value="480" />
183 +
          <option name="screenX" value="1080" />
184 +
          <option name="screenY" value="2160" />
185 +
        </PersistentDeviceSelectionData>
186 +
        <PersistentDeviceSelectionData>
187 +
          <option name="api" value="31" />
188 +
          <option name="brand" value="TECNO" />
189 +
          <option name="codename" value="TECNO-BF6" />
190 +
          <option name="id" value="TECNO-BF6" />
191 +
          <option name="labId" value="google" />
192 +
          <option name="manufacturer" value="TECNO" />
193 +
          <option name="name" value="POP 7" />
194 +
          <option name="screenDensity" value="320" />
195 +
          <option name="screenX" value="720" />
196 +
          <option name="screenY" value="1612" />
197 +
        </PersistentDeviceSelectionData>
198 +
        <PersistentDeviceSelectionData>
199 +
          <option name="api" value="31" />
200 +
          <option name="brand" value="TECNO" />
201 +
          <option name="codename" value="TECNO-BF7" />
202 +
          <option name="id" value="TECNO-BF7" />
203 +
          <option name="labId" value="google" />
204 +
          <option name="manufacturer" value="TECNO" />
205 +
          <option name="name" value="TECNO" />
206 +
          <option name="screenDensity" value="320" />
207 +
          <option name="screenX" value="720" />
208 +
          <option name="screenY" value="1612" />
209 +
        </PersistentDeviceSelectionData>
210 +
        <PersistentDeviceSelectionData>
211 +
          <option name="api" value="33" />
212 +
          <option name="brand" value="TECNO" />
213 +
          <option name="codename" value="TECNO-BG6" />
214 +
          <option name="id" value="TECNO-BG6" />
215 +
          <option name="labId" value="google" />
216 +
          <option name="manufacturer" value="TECNO MOBILE LIMITED" />
217 +
          <option name="name" value="SPARK Go 2024" />
218 +
          <option name="screenDensity" value="320" />
219 +
          <option name="screenX" value="720" />
220 +
          <option name="screenY" value="1612" />
221 +
        </PersistentDeviceSelectionData>
222 +
        <PersistentDeviceSelectionData>
223 +
          <option name="api" value="31" />
224 +
          <option name="brand" value="TECNO" />
225 +
          <option name="codename" value="TECNO-KI5k" />
226 +
          <option name="id" value="TECNO-KI5k" />
227 +
          <option name="labId" value="google" />
228 +
          <option name="manufacturer" value="TECNO" />
229 +
          <option name="name" value="SPARK 10C" />
230 +
          <option name="screenDensity" value="320" />
231 +
          <option name="screenX" value="720" />
232 +
          <option name="screenY" value="1612" />
233 +
        </PersistentDeviceSelectionData>
234 +
        <PersistentDeviceSelectionData>
235 +
          <option name="api" value="33" />
236 +
          <option name="brand" value="samsung" />
237 +
          <option name="codename" value="a03su" />
238 +
          <option name="id" value="a03su" />
239 +
          <option name="labId" value="google" />
240 +
          <option name="manufacturer" value="Samsung" />
241 +
          <option name="name" value="Galaxy A03s" />
242 +
          <option name="screenDensity" value="280" />
243 +
          <option name="screenX" value="720" />
244 +
          <option name="screenY" value="1600" />
245 +
        </PersistentDeviceSelectionData>
246 +
        <PersistentDeviceSelectionData>
247 +
          <option name="api" value="33" />
248 +
          <option name="brand" value="samsung" />
249 +
          <option name="codename" value="a03sutfn" />
250 +
          <option name="id" value="a03sutfn" />
251 +
          <option name="labId" value="google" />
252 +
          <option name="manufacturer" value="Samsung" />
253 +
          <option name="name" value="Galaxy A03s" />
254 +
          <option name="screenDensity" value="280" />
255 +
          <option name="screenX" value="720" />
256 +
          <option name="screenY" value="1600" />
257 +
        </PersistentDeviceSelectionData>
258 +
        <PersistentDeviceSelectionData>
259 +
          <option name="api" value="34" />
260 +
          <option name="brand" value="samsung" />
261 +
          <option name="codename" value="a04s" />
262 +
          <option name="id" value="a04s" />
263 +
          <option name="labId" value="google" />
264 +
          <option name="manufacturer" value="Samsung" />
265 +
          <option name="name" value="Galaxy A04s" />
266 +
          <option name="screenDensity" value="300" />
267 +
          <option name="screenX" value="720" />
268 +
          <option name="screenY" value="1600" />
269 +
        </PersistentDeviceSelectionData>
270 +
        <PersistentDeviceSelectionData>
271 +
          <option name="api" value="35" />
272 +
          <option name="brand" value="samsung" />
273 +
          <option name="codename" value="a05s" />
274 +
          <option name="id" value="a05s" />
275 +
          <option name="labId" value="google" />
276 +
          <option name="manufacturer" value="Samsung" />
277 +
          <option name="name" value="Galaxy A05s" />
278 +
          <option name="screenDensity" value="450" />
279 +
          <option name="screenX" value="1080" />
280 +
          <option name="screenY" value="2400" />
281 +
        </PersistentDeviceSelectionData>
282 +
        <PersistentDeviceSelectionData>
283 +
          <option name="api" value="35" />
284 +
          <option name="brand" value="samsung" />
285 +
          <option name="codename" value="a06" />
286 +
          <option name="id" value="a06" />
287 +
          <option name="labId" value="google" />
288 +
          <option name="manufacturer" value="Samsung" />
289 +
          <option name="name" value="Galaxy A06" />
290 +
          <option name="screenDensity" value="300" />
291 +
          <option name="screenX" value="720" />
292 +
          <option name="screenY" value="1600" />
293 +
        </PersistentDeviceSelectionData>
294 +
        <PersistentDeviceSelectionData>
295 +
          <option name="api" value="34" />
296 +
          <option name="brand" value="samsung" />
297 +
          <option name="codename" value="a13" />
298 +
          <option name="id" value="a13" />
299 +
          <option name="labId" value="google" />
300 +
          <option name="manufacturer" value="Samsung" />
301 +
          <option name="name" value="Galaxy A13" />
302 +
          <option name="screenDensity" value="450" />
303 +
          <option name="screenX" value="1080" />
304 +
          <option name="screenY" value="2408" />
305 +
        </PersistentDeviceSelectionData>
306 +
        <PersistentDeviceSelectionData>
307 +
          <option name="api" value="33" />
308 +
          <option name="brand" value="samsung" />
309 +
          <option name="codename" value="a13x" />
310 +
          <option name="id" value="a13x" />
311 +
          <option name="labId" value="google" />
312 +
          <option name="manufacturer" value="Samsung" />
313 +
          <option name="name" value="Galaxy A13 5G" />
314 +
          <option name="screenDensity" value="300" />
315 +
          <option name="screenX" value="720" />
316 +
          <option name="screenY" value="1600" />
317 +
        </PersistentDeviceSelectionData>
318 +
        <PersistentDeviceSelectionData>
319 +
          <option name="api" value="34" />
320 +
          <option name="brand" value="samsung" />
321 +
          <option name="codename" value="a14m" />
322 +
          <option name="id" value="a14m" />
323 +
          <option name="labId" value="google" />
324 +
          <option name="manufacturer" value="Samsung" />
325 +
          <option name="name" value="Galaxy A14" />
326 +
          <option name="screenDensity" value="450" />
327 +
          <option name="screenX" value="1080" />
328 +
          <option name="screenY" value="2408" />
329 +
        </PersistentDeviceSelectionData>
330 +
        <PersistentDeviceSelectionData>
331 +
          <option name="api" value="35" />
332 +
          <option name="brand" value="samsung" />
333 +
          <option name="codename" value="a14xmsq" />
334 +
          <option name="id" value="a14xmsq" />
335 +
          <option name="labId" value="google" />
336 +
          <option name="manufacturer" value="Samsung" />
337 +
          <option name="name" value="Galaxy A14 5G" />
338 +
          <option name="screenDensity" value="450" />
339 +
          <option name="screenX" value="1080" />
340 +
          <option name="screenY" value="2408" />
341 +
        </PersistentDeviceSelectionData>
342 +
        <PersistentDeviceSelectionData>
343 +
          <option name="api" value="35" />
344 +
          <option name="brand" value="samsung" />
345 +
          <option name="codename" value="a14xmtfn" />
346 +
          <option name="id" value="a14xmtfn" />
347 +
          <option name="labId" value="google" />
348 +
          <option name="manufacturer" value="Samsung" />
349 +
          <option name="name" value="Galaxy A14 5G" />
350 +
          <option name="screenDensity" value="450" />
351 +
          <option name="screenX" value="1080" />
352 +
          <option name="screenY" value="2408" />
353 +
        </PersistentDeviceSelectionData>
354 +
        <PersistentDeviceSelectionData>
355 +
          <option name="api" value="34" />
356 +
          <option name="brand" value="samsung" />
357 +
          <option name="codename" value="a15" />
358 +
          <option name="id" value="a15" />
359 +
          <option name="labId" value="google" />
360 +
          <option name="manufacturer" value="Samsung" />
361 +
          <option name="name" value="Galaxy A15" />
362 +
          <option name="screenDensity" value="450" />
363 +
          <option name="screenX" value="1080" />
364 +
          <option name="screenY" value="2340" />
365 +
        </PersistentDeviceSelectionData>
366 +
        <PersistentDeviceSelectionData>
367 +
          <option name="api" value="34" />
368 +
          <option name="brand" value="samsung" />
369 +
          <option name="codename" value="a15x" />
370 +
          <option name="id" value="a15x" />
371 +
          <option name="labId" value="google" />
372 +
          <option name="manufacturer" value="Samsung" />
373 +
          <option name="name" value="Galaxy A15 5G" />
374 +
          <option name="screenDensity" value="450" />
375 +
          <option name="screenX" value="1080" />
376 +
          <option name="screenY" value="2340" />
377 +
        </PersistentDeviceSelectionData>
378 +
        <PersistentDeviceSelectionData>
379 +
          <option name="api" value="36" />
380 +
          <option name="brand" value="samsung" />
381 +
          <option name="codename" value="a15x" />
382 +
          <option name="id" value="a15x" />
383 +
          <option name="labId" value="google" />
384 +
          <option name="manufacturer" value="Samsung" />
385 +
          <option name="name" value="Galaxy A15 5G" />
386 +
          <option name="screenDensity" value="450" />
387 +
          <option name="screenX" value="1080" />
388 +
          <option name="screenY" value="2340" />
389 +
        </PersistentDeviceSelectionData>
390 +
        <PersistentDeviceSelectionData>
391 +
          <option name="api" value="36" />
392 +
          <option name="brand" value="samsung" />
393 +
          <option name="codename" value="a15xtfn" />
394 +
          <option name="id" value="a15xtfn" />
395 +
          <option name="labId" value="google" />
396 +
          <option name="manufacturer" value="Samsung" />
397 +
          <option name="name" value="Galaxy A15 5G" />
398 +
          <option name="screenDensity" value="450" />
399 +
          <option name="screenX" value="1080" />
400 +
          <option name="screenY" value="2340" />
401 +
        </PersistentDeviceSelectionData>
402 +
        <PersistentDeviceSelectionData>
403 +
          <option name="api" value="35" />
404 +
          <option name="brand" value="samsung" />
405 +
          <option name="codename" value="a16" />
406 +
          <option name="id" value="a16" />
407 +
          <option name="labId" value="google" />
408 +
          <option name="manufacturer" value="Samsung" />
409 +
          <option name="name" value="Galaxy A16" />
410 +
          <option name="screenDensity" value="450" />
411 +
          <option name="screenX" value="1080" />
412 +
          <option name="screenY" value="2340" />
413 +
        </PersistentDeviceSelectionData>
414 +
        <PersistentDeviceSelectionData>
415 +
          <option name="api" value="34" />
416 +
          <option name="brand" value="samsung" />
417 +
          <option name="codename" value="a16x" />
418 +
          <option name="id" value="a16x" />
419 +
          <option name="labId" value="google" />
420 +
          <option name="manufacturer" value="Samsung" />
421 +
          <option name="name" value="Galaxy A16 5G" />
422 +
          <option name="screenDensity" value="450" />
423 +
          <option name="screenX" value="1080" />
424 +
          <option name="screenY" value="2340" />
425 +
        </PersistentDeviceSelectionData>
426 +
        <PersistentDeviceSelectionData>
427 +
          <option name="api" value="36" />
428 +
          <option name="brand" value="samsung" />
429 +
          <option name="codename" value="a16x" />
430 +
          <option name="id" value="a16x" />
431 +
          <option name="labId" value="google" />
432 +
          <option name="manufacturer" value="Samsung" />
433 +
          <option name="name" value="Galaxy A16 5G" />
434 +
          <option name="screenDensity" value="450" />
435 +
          <option name="screenX" value="1080" />
436 +
          <option name="screenY" value="2340" />
437 +
        </PersistentDeviceSelectionData>
438 +
        <PersistentDeviceSelectionData>
439 +
          <option name="api" value="35" />
440 +
          <option name="brand" value="samsung" />
441 +
          <option name="codename" value="a16xeea" />
442 +
          <option name="id" value="a16xeea" />
443 +
          <option name="labId" value="google" />
444 +
          <option name="manufacturer" value="Samsung" />
445 +
          <option name="name" value="Galaxy A16 5G" />
446 +
          <option name="screenDensity" value="450" />
447 +
          <option name="screenX" value="1080" />
448 +
          <option name="screenY" value="2340" />
449 +
        </PersistentDeviceSelectionData>
450 +
        <PersistentDeviceSelectionData>
451 +
          <option name="api" value="31" />
452 +
          <option name="brand" value="samsung" />
453 +
          <option name="codename" value="a21" />
454 +
          <option name="id" value="a21" />
455 +
          <option name="labId" value="google" />
456 +
          <option name="manufacturer" value="Samsung" />
457 +
          <option name="name" value="Galaxy A21" />
458 +
          <option name="screenDensity" value="300" />
459 +
          <option name="screenX" value="720" />
460 +
          <option name="screenY" value="1600" />
461 +
        </PersistentDeviceSelectionData>
462 +
        <PersistentDeviceSelectionData>
463 +
          <option name="api" value="34" />
464 +
          <option name="brand" value="samsung" />
465 +
          <option name="codename" value="a23xq" />
466 +
          <option name="id" value="a23xq" />
467 +
          <option name="labId" value="google" />
468 +
          <option name="manufacturer" value="Samsung" />
469 +
          <option name="name" value="Galaxy A23 5G" />
470 +
          <option name="screenDensity" value="450" />
471 +
          <option name="screenX" value="1080" />
472 +
          <option name="screenY" value="2408" />
473 +
        </PersistentDeviceSelectionData>
474 +
        <PersistentDeviceSelectionData>
475 +
          <option name="api" value="36" />
476 +
          <option name="brand" value="samsung" />
477 +
          <option name="codename" value="a26x" />
478 +
          <option name="id" value="a26x" />
479 +
          <option name="labId" value="google" />
480 +
          <option name="manufacturer" value="Samsung" />
481 +
          <option name="name" value="Galaxy A26 5G" />
482 +
          <option name="screenDensity" value="450" />
483 +
          <option name="screenX" value="1080" />
484 +
          <option name="screenY" value="2340" />
485 +
        </PersistentDeviceSelectionData>
486 +
        <PersistentDeviceSelectionData>
487 +
          <option name="api" value="31" />
488 +
          <option name="brand" value="samsung" />
489 +
          <option name="codename" value="a31" />
490 +
          <option name="id" value="a31" />
491 +
          <option name="labId" value="google" />
492 +
          <option name="manufacturer" value="Samsung" />
493 +
          <option name="name" value="Galaxy A31" />
494 +
          <option name="screenDensity" value="420" />
495 +
          <option name="screenX" value="1080" />
496 +
          <option name="screenY" value="2400" />
497 +
        </PersistentDeviceSelectionData>
498 +
        <PersistentDeviceSelectionData>
499 +
          <option name="api" value="33" />
500 +
          <option name="brand" value="samsung" />
501 +
          <option name="codename" value="a32" />
502 +
          <option name="id" value="a32" />
503 +
          <option name="labId" value="google" />
504 +
          <option name="manufacturer" value="Samsung" />
505 +
          <option name="name" value="Galaxy A32" />
506 +
          <option name="screenDensity" value="420" />
507 +
          <option name="screenX" value="1080" />
508 +
          <option name="screenY" value="2400" />
509 +
        </PersistentDeviceSelectionData>
510 +
        <PersistentDeviceSelectionData>
511 +
          <option name="api" value="36" />
512 +
          <option name="brand" value="samsung" />
513 +
          <option name="codename" value="a34x" />
514 +
          <option name="id" value="a34x" />
515 +
          <option name="labId" value="google" />
516 +
          <option name="manufacturer" value="Samsung" />
517 +
          <option name="name" value="Galaxy A34 5G" />
518 +
          <option name="screenDensity" value="450" />
519 +
          <option name="screenX" value="1080" />
520 +
          <option name="screenY" value="2340" />
521 +
        </PersistentDeviceSelectionData>
522 +
        <PersistentDeviceSelectionData>
523 +
          <option name="api" value="34" />
524 +
          <option name="brand" value="samsung" />
525 +
          <option name="codename" value="a35x" />
526 +
          <option name="id" value="a35x" />
527 +
          <option name="labId" value="google" />
528 +
          <option name="manufacturer" value="Samsung" />
529 +
          <option name="name" value="Galaxy A35 5G" />
530 +
          <option name="screenDensity" value="450" />
531 +
          <option name="screenX" value="1080" />
532 +
          <option name="screenY" value="2340" />
533 +
        </PersistentDeviceSelectionData>
534 +
        <PersistentDeviceSelectionData>
535 +
          <option name="api" value="35" />
536 +
          <option name="brand" value="samsung" />
537 +
          <option name="codename" value="a35x" />
538 +
          <option name="id" value="a35x" />
539 +
          <option name="labId" value="google" />
540 +
          <option name="manufacturer" value="Samsung" />
541 +
          <option name="name" value="Galaxy A35 5G" />
542 +
          <option name="screenDensity" value="450" />
543 +
          <option name="screenX" value="1080" />
544 +
          <option name="screenY" value="2340" />
545 +
        </PersistentDeviceSelectionData>
546 +
        <PersistentDeviceSelectionData>
547 +
          <option name="api" value="36" />
548 +
          <option name="brand" value="samsung" />
549 +
          <option name="codename" value="a35x" />
550 +
          <option name="id" value="a35x" />
551 +
          <option name="labId" value="google" />
552 +
          <option name="manufacturer" value="Samsung" />
553 +
          <option name="name" value="Galaxy A35 5G" />
554 +
          <option name="screenDensity" value="450" />
555 +
          <option name="screenX" value="1080" />
556 +
          <option name="screenY" value="2340" />
557 +
        </PersistentDeviceSelectionData>
558 +
        <PersistentDeviceSelectionData>
559 +
          <option name="api" value="35" />
560 +
          <option name="brand" value="samsung" />
561 +
          <option name="codename" value="a36xq" />
562 +
          <option name="id" value="a36xq" />
563 +
          <option name="labId" value="google" />
564 +
          <option name="manufacturer" value="Samsung" />
565 +
          <option name="name" value="Galaxy A36 5G" />
566 +
          <option name="screenDensity" value="450" />
567 +
          <option name="screenX" value="1080" />
568 +
          <option name="screenY" value="2340" />
569 +
        </PersistentDeviceSelectionData>
570 +
        <PersistentDeviceSelectionData>
571 +
          <option name="api" value="36" />
572 +
          <option name="brand" value="samsung" />
573 +
          <option name="codename" value="a36xq" />
574 +
          <option name="id" value="a36xq" />
575 +
          <option name="labId" value="google" />
576 +
          <option name="manufacturer" value="Samsung" />
577 +
          <option name="name" value="Galaxy A36 5G" />
578 +
          <option name="screenDensity" value="450" />
579 +
          <option name="screenX" value="1080" />
580 +
          <option name="screenY" value="2340" />
581 +
        </PersistentDeviceSelectionData>
582 +
        <PersistentDeviceSelectionData>
583 +
          <option name="api" value="34" />
584 +
          <option name="brand" value="samsung" />
585 +
          <option name="codename" value="a52xq" />
586 +
          <option name="id" value="a52xq" />
587 +
          <option name="labId" value="google" />
588 +
          <option name="manufacturer" value="Samsung" />
589 +
          <option name="name" value="Galaxy A52 5G" />
590 +
          <option name="screenDensity" value="420" />
591 +
          <option name="screenX" value="1080" />
592 +
          <option name="screenY" value="2400" />
593 +
        </PersistentDeviceSelectionData>
594 +
        <PersistentDeviceSelectionData>
595 +
          <option name="api" value="36" />
596 +
          <option name="brand" value="samsung" />
597 +
          <option name="codename" value="a54xue" />
598 +
          <option name="id" value="a54xue" />
599 +
          <option name="labId" value="google" />
600 +
          <option name="manufacturer" value="Samsung" />
601 +
          <option name="name" value="Galaxy A54 5G" />
602 +
          <option name="screenDensity" value="450" />
603 +
          <option name="screenX" value="1080" />
604 +
          <option name="screenY" value="2340" />
605 +
        </PersistentDeviceSelectionData>
606 +
        <PersistentDeviceSelectionData>
607 +
          <option name="api" value="36" />
608 +
          <option name="brand" value="samsung" />
609 +
          <option name="codename" value="a55xzh" />
610 +
          <option name="id" value="a55xzh" />
611 +
          <option name="labId" value="google" />
612 +
          <option name="manufacturer" value="Samsung" />
613 +
          <option name="name" value="Galaxy A55 5G" />
614 +
          <option name="screenDensity" value="450" />
615 +
          <option name="screenX" value="1080" />
616 +
          <option name="screenY" value="2340" />
617 +
        </PersistentDeviceSelectionData>
618 +
        <PersistentDeviceSelectionData>
619 +
          <option name="api" value="35" />
620 +
          <option name="brand" value="samsung" />
621 +
          <option name="codename" value="a56x" />
622 +
          <option name="id" value="a56x" />
623 +
          <option name="labId" value="google" />
624 +
          <option name="manufacturer" value="Samsung" />
625 +
          <option name="name" value="Galaxy A56 5G" />
626 +
          <option name="screenDensity" value="450" />
627 +
          <option name="screenX" value="1080" />
628 +
          <option name="screenY" value="2340" />
629 +
        </PersistentDeviceSelectionData>
630 +
        <PersistentDeviceSelectionData>
631 +
          <option name="api" value="34" />
632 +
          <option name="brand" value="google" />
633 +
          <option name="codename" value="akita" />
634 +
          <option name="id" value="akita" />
635 +
          <option name="labId" value="google" />
636 +
          <option name="manufacturer" value="Google" />
637 +
          <option name="name" value="Pixel 8a" />
638 +
          <option name="screenDensity" value="420" />
639 +
          <option name="screenX" value="1080" />
640 +
          <option name="screenY" value="2400" />
641 +
        </PersistentDeviceSelectionData>
642 +
        <PersistentDeviceSelectionData>
643 +
          <option name="api" value="35" />
644 +
          <option name="brand" value="google" />
645 +
          <option name="codename" value="akita" />
646 +
          <option name="id" value="akita" />
647 +
          <option name="labId" value="google" />
648 +
          <option name="manufacturer" value="Google" />
649 +
          <option name="name" value="Pixel 8a" />
650 +
          <option name="screenDensity" value="420" />
651 +
          <option name="screenX" value="1080" />
652 +
          <option name="screenY" value="2400" />
653 +
        </PersistentDeviceSelectionData>
654 +
        <PersistentDeviceSelectionData>
655 +
          <option name="api" value="34" />
656 +
          <option name="brand" value="motorola" />
657 +
          <option name="codename" value="arcfox" />
658 +
          <option name="id" value="arcfox" />
659 +
          <option name="labId" value="google" />
660 +
          <option name="manufacturer" value="Motorola" />
661 +
          <option name="name" value="razr plus 2024" />
662 +
          <option name="screenDensity" value="360" />
663 +
          <option name="screenX" value="1080" />
664 +
          <option name="screenY" value="1272" />
665 +
        </PersistentDeviceSelectionData>
666 +
        <PersistentDeviceSelectionData>
667 +
          <option name="api" value="30" />
668 +
          <option name="brand" value="motorola" />
669 +
          <option name="codename" value="aruba" />
670 +
          <option name="id" value="aruba" />
671 +
          <option name="labId" value="google" />
672 +
          <option name="manufacturer" value="Motorola" />
673 +
          <option name="name" value="moto e20" />
674 +
          <option name="screenDensity" value="280" />
675 +
          <option name="screenX" value="720" />
676 +
          <option name="screenY" value="1600" />
677 +
        </PersistentDeviceSelectionData>
678 +
        <PersistentDeviceSelectionData>
679 +
          <option name="api" value="33" />
680 +
          <option name="brand" value="motorola" />
681 +
          <option name="codename" value="austin" />
682 +
          <option name="id" value="austin" />
683 +
          <option name="labId" value="google" />
684 +
          <option name="manufacturer" value="Motorola" />
685 +
          <option name="name" value="moto g 5G (2022)" />
686 +
          <option name="screenDensity" value="280" />
687 +
          <option name="screenX" value="720" />
688 +
          <option name="screenY" value="1600" />
689 +
        </PersistentDeviceSelectionData>
690 +
        <PersistentDeviceSelectionData>
691 +
          <option name="api" value="33" />
692 +
          <option name="brand" value="samsung" />
693 +
          <option name="codename" value="b0q" />
694 +
          <option name="id" value="b0q" />
695 +
          <option name="labId" value="google" />
696 +
          <option name="manufacturer" value="Samsung" />
697 +
          <option name="name" value="Galaxy S22 Ultra" />
698 +
          <option name="screenDensity" value="600" />
699 +
          <option name="screenX" value="1440" />
700 +
          <option name="screenY" value="3088" />
701 +
        </PersistentDeviceSelectionData>
702 +
        <PersistentDeviceSelectionData>
703 +
          <option name="api" value="36" />
704 +
          <option name="brand" value="samsung" />
705 +
          <option name="codename" value="b0q" />
706 +
          <option name="id" value="b0q" />
707 +
          <option name="labId" value="google" />
708 +
          <option name="manufacturer" value="Samsung" />
709 +
          <option name="name" value="Galaxy S22 Ultra" />
710 +
          <option name="screenDensity" value="600" />
711 +
          <option name="screenX" value="1440" />
712 +
          <option name="screenY" value="3088" />
713 +
        </PersistentDeviceSelectionData>
714 +
        <PersistentDeviceSelectionData>
715 +
          <option name="api" value="36" />
716 +
          <option name="brand" value="samsung" />
717 +
          <option name="codename" value="b0qksx" />
718 +
          <option name="id" value="b0qksx" />
719 +
          <option name="labId" value="google" />
720 +
          <option name="manufacturer" value="Samsung" />
721 +
          <option name="name" value="Galaxy S22 Ultra" />
722 +
          <option name="screenDensity" value="450" />
723 +
          <option name="screenX" value="1080" />
724 +
          <option name="screenY" value="2316" />
725 +
        </PersistentDeviceSelectionData>
726 +
        <PersistentDeviceSelectionData>
727 +
          <option name="api" value="36" />
728 +
          <option name="brand" value="samsung" />
729 +
          <option name="codename" value="b0qxxx" />
730 +
          <option name="id" value="b0qxxx" />
731 +
          <option name="labId" value="google" />
732 +
          <option name="manufacturer" value="Samsung" />
733 +
          <option name="name" value="Galaxy S22 Ultra" />
734 +
          <option name="screenDensity" value="450" />
735 +
          <option name="screenX" value="1080" />
736 +
          <option name="screenY" value="2316" />
737 +
        </PersistentDeviceSelectionData>
738 +
        <PersistentDeviceSelectionData>
739 +
          <option name="api" value="36" />
740 +
          <option name="brand" value="samsung" />
741 +
          <option name="codename" value="b4qsqw" />
742 +
          <option name="id" value="b4qsqw" />
743 +
          <option name="labId" value="google" />
744 +
          <option name="manufacturer" value="Samsung" />
745 +
          <option name="name" value="Galaxy Z Flip4" />
746 +
          <option name="screenDensity" value="480" />
747 +
          <option name="screenX" value="1080" />
748 +
          <option name="screenY" value="2640" />
749 +
        </PersistentDeviceSelectionData>
750 +
        <PersistentDeviceSelectionData>
751 +
          <option name="api" value="36" />
752 +
          <option name="brand" value="samsung" />
753 +
          <option name="codename" value="b5qsqw" />
754 +
          <option name="id" value="b5qsqw" />
755 +
          <option name="labId" value="google" />
756 +
          <option name="manufacturer" value="Samsung" />
757 +
          <option name="name" value="Galaxy Z Flip5" />
758 +
          <option name="screenDensity" value="340" />
759 +
          <option name="screenX" value="748" />
760 +
          <option name="screenY" value="720" />
761 +
        </PersistentDeviceSelectionData>
762 +
        <PersistentDeviceSelectionData>
763 +
          <option name="api" value="36" />
764 +
          <option name="brand" value="samsung" />
765 +
          <option name="codename" value="b5qxeea" />
766 +
          <option name="id" value="b5qxeea" />
767 +
          <option name="labId" value="google" />
768 +
          <option name="manufacturer" value="Samsung" />
769 +
          <option name="name" value="Galaxy Z Flip5" />
770 +
          <option name="screenDensity" value="340" />
771 +
          <option name="screenX" value="748" />
772 +
          <option name="screenY" value="720" />
773 +
        </PersistentDeviceSelectionData>
774 +
        <PersistentDeviceSelectionData>
775 +
          <option name="api" value="34" />
776 +
          <option name="brand" value="samsung" />
777 +
          <option name="codename" value="b6q" />
778 +
          <option name="id" value="b6q" />
779 +
          <option name="labId" value="google" />
780 +
          <option name="manufacturer" value="Samsung" />
781 +
          <option name="name" value="Galaxy Z Flip6" />
782 +
          <option name="screenDensity" value="340" />
783 +
          <option name="screenX" value="1080" />
784 +
          <option name="screenY" value="2640" />
785 +
        </PersistentDeviceSelectionData>
786 +
        <PersistentDeviceSelectionData>
787 +
          <option name="api" value="36" />
788 +
          <option name="brand" value="samsung" />
789 +
          <option name="codename" value="b6qksx" />
790 +
          <option name="id" value="b6qksx" />
791 +
          <option name="labId" value="google" />
792 +
          <option name="manufacturer" value="Samsung" />
793 +
          <option name="name" value="Galaxy Z Flip6" />
794 +
          <option name="screenDensity" value="340" />
795 +
          <option name="screenX" value="1080" />
796 +
          <option name="screenY" value="2640" />
797 +
        </PersistentDeviceSelectionData>
798 +
        <PersistentDeviceSelectionData>
799 +
          <option name="api" value="36" />
800 +
          <option name="brand" value="samsung" />
801 +
          <option name="codename" value="b6qsqw" />
802 +
          <option name="id" value="b6qsqw" />
803 +
          <option name="labId" value="google" />
804 +
          <option name="manufacturer" value="Samsung" />
805 +
          <option name="name" value="Galaxy Z Flip6" />
806 +
          <option name="screenDensity" value="480" />
807 +
          <option name="screenX" value="1080" />
808 +
          <option name="screenY" value="2640" />
809 +
        </PersistentDeviceSelectionData>
810 +
        <PersistentDeviceSelectionData>
811 +
          <option name="api" value="36" />
812 +
          <option name="brand" value="google" />
813 +
          <option name="codename" value="blazer" />
814 +
          <option name="default" value="true" />
815 +
          <option name="id" value="blazer" />
816 +
          <option name="labId" value="google" />
817 +
          <option name="manufacturer" value="Google" />
818 +
          <option name="name" value="Pixel 10 Pro" />
819 +
          <option name="screenDensity" value="420" />
820 +
          <option name="screenX" value="1080" />
821 +
          <option name="screenY" value="2410" />
822 +
          <option name="tags">
823 +
            <list>
824 +
              <option value="dda-default" />
825 +
            </list>
826 +
          </option>
827 +
        </PersistentDeviceSelectionData>
828 +
        <PersistentDeviceSelectionData>
829 +
          <option name="api" value="32" />
830 +
          <option name="brand" value="google" />
831 +
          <option name="codename" value="bluejay" />
832 +
          <option name="id" value="bluejay" />
833 +
          <option name="labId" value="google" />
834 +
          <option name="manufacturer" value="Google" />
835 +
          <option name="name" value="Pixel 6a" />
836 +
          <option name="screenDensity" value="420" />
837 +
          <option name="screenX" value="1080" />
838 +
          <option name="screenY" value="2400" />
839 +
        </PersistentDeviceSelectionData>
840 +
        <PersistentDeviceSelectionData>
841 +
          <option name="api" value="33" />
842 +
          <option name="brand" value="samsung" />
843 +
          <option name="codename" value="c1q" />
844 +
          <option name="id" value="c1q" />
845 +
          <option name="labId" value="google" />
846 +
          <option name="manufacturer" value="Samsung" />
847 +
          <option name="name" value="Galaxy Note20 5G" />
848 +
          <option name="screenDensity" value="450" />
849 +
          <option name="screenX" value="1080" />
850 +
          <option name="screenY" value="2400" />
851 +
        </PersistentDeviceSelectionData>
852 +
        <PersistentDeviceSelectionData>
853 +
          <option name="api" value="33" />
854 +
          <option name="brand" value="samsung" />
855 +
          <option name="codename" value="c1qksw" />
856 +
          <option name="id" value="c1qksw" />
857 +
          <option name="labId" value="google" />
858 +
          <option name="manufacturer" value="Samsung" />
859 +
          <option name="name" value="Galaxy Note20 5G" />
860 +
          <option name="screenDensity" value="450" />
861 +
          <option name="screenX" value="1080" />
862 +
          <option name="screenY" value="2400" />
863 +
        </PersistentDeviceSelectionData>
864 +
        <PersistentDeviceSelectionData>
865 +
          <option name="api" value="33" />
866 +
          <option name="brand" value="samsung" />
867 +
          <option name="codename" value="c2q" />
868 +
          <option name="id" value="c2q" />
869 +
          <option name="labId" value="google" />
870 +
          <option name="manufacturer" value="Samsung" />
871 +
          <option name="name" value="Galaxy Note20 Ultra 5G" />
872 +
          <option name="screenDensity" value="560" />
873 +
          <option name="screenX" value="1440" />
874 +
          <option name="screenY" value="3088" />
875 +
        </PersistentDeviceSelectionData>
876 +
        <PersistentDeviceSelectionData>
877 +
          <option name="api" value="33" />
878 +
          <option name="brand" value="samsung" />
879 +
          <option name="codename" value="c2qksw" />
880 +
          <option name="id" value="c2qksw" />
881 +
          <option name="labId" value="google" />
882 +
          <option name="manufacturer" value="Samsung" />
883 +
          <option name="name" value="Galaxy Note20 Ultra 5G" />
884 +
          <option name="screenDensity" value="560" />
885 +
          <option name="screenX" value="1440" />
886 +
          <option name="screenY" value="3088" />
887 +
        </PersistentDeviceSelectionData>
888 +
        <PersistentDeviceSelectionData>
889 +
          <option name="api" value="33" />
890 +
          <option name="brand" value="samsung" />
891 +
          <option name="codename" value="c2s" />
892 +
          <option name="id" value="c2s" />
893 +
          <option name="labId" value="google" />
894 +
          <option name="manufacturer" value="Samsung" />
895 +
          <option name="name" value="Galaxy Note20 Ultra 5G" />
896 +
          <option name="screenDensity" value="560" />
897 +
          <option name="screenX" value="1440" />
898 +
          <option name="screenY" value="3088" />
899 +
        </PersistentDeviceSelectionData>
900 +
        <PersistentDeviceSelectionData>
901 +
          <option name="api" value="34" />
902 +
          <option name="brand" value="google" />
903 +
          <option name="codename" value="caiman" />
904 +
          <option name="id" value="caiman" />
905 +
          <option name="labId" value="google" />
906 +
          <option name="manufacturer" value="Google" />
907 +
          <option name="name" value="Pixel 9 Pro" />
908 +
          <option name="screenDensity" value="360" />
909 +
          <option name="screenX" value="960" />
910 +
          <option name="screenY" value="2142" />
911 +
        </PersistentDeviceSelectionData>
912 +
        <PersistentDeviceSelectionData>
913 +
          <option name="api" value="35" />
914 +
          <option name="brand" value="google" />
915 +
          <option name="codename" value="caiman" />
916 +
          <option name="id" value="caiman" />
917 +
          <option name="labId" value="google" />
918 +
          <option name="manufacturer" value="Google" />
919 +
          <option name="name" value="Pixel 9 Pro" />
920 +
          <option name="screenDensity" value="360" />
921 +
          <option name="screenX" value="960" />
922 +
          <option name="screenY" value="2142" />
923 +
        </PersistentDeviceSelectionData>
924 +
        <PersistentDeviceSelectionData>
925 +
          <option name="api" value="34" />
926 +
          <option name="brand" value="motorola" />
927 +
          <option name="codename" value="cancun" />
928 +
          <option name="id" value="cancun" />
929 +
          <option name="labId" value="google" />
930 +
          <option name="manufacturer" value="Motorola" />
931 +
          <option name="name" value="moto g14" />
932 +
          <option name="screenDensity" value="400" />
933 +
          <option name="screenX" value="1080" />
934 +
          <option name="screenY" value="2400" />
935 +
        </PersistentDeviceSelectionData>
936 +
        <PersistentDeviceSelectionData>
937 +
          <option name="api" value="34" />
938 +
          <option name="brand" value="google" />
939 +
          <option name="codename" value="comet" />
940 +
          <option name="id" value="comet" />
941 +
          <option name="labId" value="google" />
942 +
          <option name="manufacturer" value="Google" />
943 +
          <option name="name" value="Pixel 9 Pro Fold" />
944 +
          <option name="screenDensity" value="390" />
945 +
          <option name="screenX" value="2076" />
946 +
          <option name="screenY" value="2152" />
947 +
        </PersistentDeviceSelectionData>
948 +
        <PersistentDeviceSelectionData>
949 +
          <option name="api" value="35" />
950 +
          <option name="brand" value="google" />
951 +
          <option name="codename" value="comet" />
952 +
          <option name="id" value="comet" />
953 +
          <option name="labId" value="google" />
954 +
          <option name="manufacturer" value="Google" />
955 +
          <option name="name" value="Pixel 9 Pro Fold" />
956 +
          <option name="screenDensity" value="390" />
957 +
          <option name="screenX" value="2076" />
958 +
          <option name="screenY" value="2152" />
959 +
        </PersistentDeviceSelectionData>
960 +
        <PersistentDeviceSelectionData>
961 +
          <option name="api" value="36" />
962 +
          <option name="brand" value="google" />
963 +
          <option name="codename" value="comet" />
964 +
          <option name="id" value="comet" />
965 +
          <option name="labId" value="google" />
966 +
          <option name="manufacturer" value="Google" />
967 +
          <option name="name" value="Pixel 9 Pro Fold" />
968 +
          <option name="screenDensity" value="390" />
969 +
          <option name="screenX" value="2076" />
970 +
          <option name="screenY" value="2152" />
971 +
        </PersistentDeviceSelectionData>
972 +
        <PersistentDeviceSelectionData>
973 +
          <option name="api" value="37" />
974 +
          <option name="brand" value="google" />
975 +
          <option name="codename" value="cubs" />
976 +
          <option name="id" value="cubs" />
977 +
          <option name="labId" value="google" />
978 +
          <option name="manufacturer" value="Google" />
979 +
          <option name="name" value="Pixel 11" />
980 +
          <option name="screenDensity" value="420" />
981 +
          <option name="screenX" value="1080" />
982 +
          <option name="screenY" value="2424" />
983 +
        </PersistentDeviceSelectionData>
984 +
        <PersistentDeviceSelectionData>
985 +
          <option name="api" value="35" />
986 +
          <option name="brand" value="motorola" />
987 +
          <option name="codename" value="cuscoi" />
988 +
          <option name="id" value="cuscoi" />
989 +
          <option name="labId" value="google" />
990 +
          <option name="manufacturer" value="Motorola" />
991 +
          <option name="name" value="moto g96 5G" />
992 +
          <option name="screenDensity" value="400" />
993 +
          <option name="screenX" value="1080" />
994 +
          <option name="screenY" value="2400" />
995 +
        </PersistentDeviceSelectionData>
996 +
        <PersistentDeviceSelectionData>
997 +
          <option name="api" value="35" />
998 +
          <option name="brand" value="samsung" />
999 +
          <option name="codename" value="dm1q" />
1000 +
          <option name="id" value="dm1q" />
1001 +
          <option name="labId" value="google" />
1002 +
          <option name="manufacturer" value="Samsung" />
1003 +
          <option name="name" value="Galaxy S23" />
1004 +
          <option name="screenDensity" value="480" />
1005 +
          <option name="screenX" value="1080" />
1006 +
          <option name="screenY" value="2340" />
1007 +
        </PersistentDeviceSelectionData>
1008 +
        <PersistentDeviceSelectionData>
1009 +
          <option name="api" value="36" />
1010 +
          <option name="brand" value="samsung" />
1011 +
          <option name="codename" value="dm1q-SM-S911U" />
1012 +
          <option name="id" value="dm1q-SM-S911U" />
1013 +
          <option name="labId" value="google" />
1014 +
          <option name="manufacturer" value="Samsung" />
1015 +
          <option name="name" value="Galaxy S23" />
1016 +
          <option name="screenDensity" value="480" />
1017 +
          <option name="screenX" value="1080" />
1018 +
          <option name="screenY" value="2340" />
1019 +
        </PersistentDeviceSelectionData>
1020 +
        <PersistentDeviceSelectionData>
1021 +
          <option name="api" value="36" />
1022 +
          <option name="brand" value="samsung" />
1023 +
          <option name="codename" value="dm1qcsx" />
1024 +
          <option name="id" value="dm1qcsx" />
1025 +
          <option name="labId" value="google" />
1026 +
          <option name="manufacturer" value="Samsung" />
1027 +
          <option name="name" value="Galaxy S23" />
1028 +
          <option name="screenDensity" value="480" />
1029 +
          <option name="screenX" value="1080" />
1030 +
          <option name="screenY" value="2340" />
1031 +
        </PersistentDeviceSelectionData>
1032 +
        <PersistentDeviceSelectionData>
1033 +
          <option name="api" value="34" />
1034 +
          <option name="brand" value="samsung" />
1035 +
          <option name="codename" value="dm2q" />
1036 +
          <option name="id" value="dm2q" />
1037 +
          <option name="labId" value="google" />
1038 +
          <option name="manufacturer" value="Samsung" />
1039 +
          <option name="name" value="Galaxy S23+" />
1040 +
          <option name="screenDensity" value="450" />
1041 +
          <option name="screenX" value="1080" />
1042 +
          <option name="screenY" value="2340" />
1043 +
        </PersistentDeviceSelectionData>
1044 +
        <PersistentDeviceSelectionData>
1045 +
          <option name="api" value="36" />
1046 +
          <option name="brand" value="samsung" />
1047 +
          <option name="codename" value="dm2qksx" />
1048 +
          <option name="id" value="dm2qksx" />
1049 +
          <option name="labId" value="google" />
1050 +
          <option name="manufacturer" value="Samsung" />
1051 +
          <option name="name" value="Galaxy S23+" />
1052 +
          <option name="screenDensity" value="450" />
1053 +
          <option name="screenX" value="1080" />
1054 +
          <option name="screenY" value="2340" />
1055 +
        </PersistentDeviceSelectionData>
1056 +
        <PersistentDeviceSelectionData>
1057 +
          <option name="api" value="34" />
1058 +
          <option name="brand" value="samsung" />
1059 +
          <option name="codename" value="dm3q" />
1060 +
          <option name="id" value="dm3q" />
1061 +
          <option name="labId" value="google" />
1062 +
          <option name="manufacturer" value="Samsung" />
1063 +
          <option name="name" value="Galaxy S23 Ultra" />
1064 +
          <option name="screenDensity" value="600" />
1065 +
          <option name="screenX" value="1440" />
1066 +
          <option name="screenY" value="3088" />
1067 +
        </PersistentDeviceSelectionData>
1068 +
        <PersistentDeviceSelectionData>
1069 +
          <option name="api" value="36" />
1070 +
          <option name="brand" value="samsung" />
1071 +
          <option name="codename" value="dm3qksx" />
1072 +
          <option name="id" value="dm3qksx" />
1073 +
          <option name="labId" value="google" />
1074 +
          <option name="manufacturer" value="Samsung" />
1075 +
          <option name="name" value="Galaxy S23 Ultra" />
1076 +
          <option name="screenDensity" value="450" />
1077 +
          <option name="screenX" value="1080" />
1078 +
          <option name="screenY" value="2316" />
1079 +
        </PersistentDeviceSelectionData>
1080 +
        <PersistentDeviceSelectionData>
1081 +
          <option name="api" value="34" />
1082 +
          <option name="brand" value="motorola" />
1083 +
          <option name="codename" value="dubai" />
1084 +
          <option name="id" value="dubai" />
1085 +
          <option name="labId" value="google" />
1086 +
          <option name="manufacturer" value="Motorola" />
1087 +
          <option name="name" value="edge 30" />
1088 +
          <option name="screenDensity" value="405" />
1089 +
          <option name="screenX" value="1080" />
1090 +
          <option name="screenY" value="2400" />
1091 +
        </PersistentDeviceSelectionData>
1092 +
        <PersistentDeviceSelectionData>
1093 +
          <option name="api" value="34" />
1094 +
          <option name="brand" value="samsung" />
1095 +
          <option name="codename" value="e1q" />
1096 +
          <option name="id" value="e1q" />
1097 +
          <option name="labId" value="google" />
1098 +
          <option name="manufacturer" value="Samsung" />
1099 +
          <option name="name" value="Galaxy S24" />
1100 +
          <option name="screenDensity" value="480" />
1101 +
          <option name="screenX" value="1080" />
1102 +
          <option name="screenY" value="2340" />
1103 +
        </PersistentDeviceSelectionData>
1104 +
        <PersistentDeviceSelectionData>
1105 +
          <option name="api" value="36" />
1106 +
          <option name="brand" value="samsung" />
1107 +
          <option name="codename" value="e1q" />
1108 +
          <option name="id" value="e1q" />
1109 +
          <option name="labId" value="google" />
1110 +
          <option name="manufacturer" value="Samsung" />
1111 +
          <option name="name" value="Galaxy S24" />
1112 +
          <option name="screenDensity" value="480" />
1113 +
          <option name="screenX" value="1080" />
1114 +
          <option name="screenY" value="2340" />
1115 +
        </PersistentDeviceSelectionData>
1116 +
        <PersistentDeviceSelectionData>
1117 +
          <option name="api" value="36" />
1118 +
          <option name="brand" value="samsung" />
1119 +
          <option name="codename" value="e1s" />
1120 +
          <option name="id" value="e1s" />
1121 +
          <option name="labId" value="google" />
1122 +
          <option name="manufacturer" value="Samsung" />
1123 +
          <option name="name" value="Galaxy S24" />
1124 +
          <option name="screenDensity" value="480" />
1125 +
          <option name="screenX" value="1080" />
1126 +
          <option name="screenY" value="2340" />
1127 +
        </PersistentDeviceSelectionData>
1128 +
        <PersistentDeviceSelectionData>
1129 +
          <option name="api" value="36" />
1130 +
          <option name="brand" value="samsung" />
1131 +
          <option name="codename" value="e2q" />
1132 +
          <option name="id" value="e2q" />
1133 +
          <option name="labId" value="google" />
1134 +
          <option name="manufacturer" value="Samsung" />
1135 +
          <option name="name" value="Galaxy S24+" />
1136 +
          <option name="screenDensity" value="450" />
1137 +
          <option name="screenX" value="1080" />
1138 +
          <option name="screenY" value="2340" />
1139 +
        </PersistentDeviceSelectionData>
1140 +
        <PersistentDeviceSelectionData>
1141 +
          <option name="api" value="36" />
1142 +
          <option name="brand" value="samsung" />
1143 +
          <option name="codename" value="e2s" />
1144 +
          <option name="id" value="e2s" />
1145 +
          <option name="labId" value="google" />
1146 +
          <option name="manufacturer" value="Samsung" />
1147 +
          <option name="name" value="Galaxy S24+" />
1148 +
          <option name="screenDensity" value="450" />
1149 +
          <option name="screenX" value="1080" />
1150 +
          <option name="screenY" value="2340" />
1151 +
        </PersistentDeviceSelectionData>
1152 +
        <PersistentDeviceSelectionData>
1153 +
          <option name="api" value="36" />
1154 +
          <option name="brand" value="samsung" />
1155 +
          <option name="codename" value="e2sksx" />
1156 +
          <option name="id" value="e2sksx" />
1157 +
          <option name="labId" value="google" />
1158 +
          <option name="manufacturer" value="Samsung" />
1159 +
          <option name="name" value="Galaxy S24+" />
1160 +
          <option name="screenDensity" value="450" />
1161 +
          <option name="screenX" value="1080" />
1162 +
          <option name="screenY" value="2340" />
1163 +
        </PersistentDeviceSelectionData>
1164 +
        <PersistentDeviceSelectionData>
1165 +
          <option name="api" value="34" />
1166 +
          <option name="brand" value="samsung" />
1167 +
          <option name="codename" value="e3q" />
1168 +
          <option name="id" value="e3q" />
1169 +
          <option name="labId" value="google" />
1170 +
          <option name="manufacturer" value="Samsung" />
1171 +
          <option name="name" value="Galaxy S24 Ultra" />
1172 +
          <option name="screenDensity" value="450" />
1173 +
          <option name="screenX" value="1440" />
1174 +
          <option name="screenY" value="3120" />
1175 +
        </PersistentDeviceSelectionData>
1176 +
        <PersistentDeviceSelectionData>
1177 +
          <option name="api" value="36" />
1178 +
          <option name="brand" value="samsung" />
1179 +
          <option name="codename" value="e3q" />
1180 +
          <option name="id" value="e3q" />
1181 +
          <option name="labId" value="google" />
1182 +
          <option name="manufacturer" value="Samsung" />
1183 +
          <option name="name" value="Galaxy S24 Ultra" />
1184 +
          <option name="screenDensity" value="450" />
1185 +
          <option name="screenX" value="1440" />
1186 +
          <option name="screenY" value="3120" />
1187 +
        </PersistentDeviceSelectionData>
1188 +
        <PersistentDeviceSelectionData>
1189 +
          <option name="api" value="36" />
1190 +
          <option name="brand" value="samsung" />
1191 +
          <option name="codename" value="e3qcsx" />
1192 +
          <option name="id" value="e3qcsx" />
1193 +
          <option name="labId" value="google" />
1194 +
          <option name="manufacturer" value="Samsung" />
1195 +
          <option name="name" value="Galaxy S24 Ultra" />
1196 +
          <option name="screenDensity" value="450" />
1197 +
          <option name="screenX" value="1440" />
1198 +
          <option name="screenY" value="3120" />
1199 +
        </PersistentDeviceSelectionData>
1200 +
        <PersistentDeviceSelectionData>
1201 +
          <option name="api" value="36" />
1202 +
          <option name="brand" value="samsung" />
1203 +
          <option name="codename" value="e3qksx" />
1204 +
          <option name="id" value="e3qksx" />
1205 +
          <option name="labId" value="google" />
1206 +
          <option name="manufacturer" value="Samsung" />
1207 +
          <option name="name" value="Galaxy S24 Ultra" />
1208 +
          <option name="screenDensity" value="450" />
1209 +
          <option name="screenX" value="1440" />
1210 +
          <option name="screenY" value="3120" />
1211 +
        </PersistentDeviceSelectionData>
1212 +
        <PersistentDeviceSelectionData>
1213 +
          <option name="api" value="33" />
1214 +
          <option name="brand" value="google" />
1215 +
          <option name="codename" value="eos" />
1216 +
          <option name="id" value="eos" />
1217 +
          <option name="labId" value="google" />
1218 +
          <option name="manufacturer" value="Google" />
1219 +
          <option name="name" value="Eos" />
1220 +
          <option name="screenDensity" value="320" />
1221 +
          <option name="screenX" value="384" />
1222 +
          <option name="screenY" value="384" />
1223 +
        </PersistentDeviceSelectionData>
1224 +
        <PersistentDeviceSelectionData>
1225 +
          <option name="api" value="33" />
1226 +
          <option name="brand" value="google" />
1227 +
          <option name="codename" value="felix" />
1228 +
          <option name="id" value="felix" />
1229 +
          <option name="labId" value="google" />
1230 +
          <option name="manufacturer" value="Google" />
1231 +
          <option name="name" value="Pixel Fold" />
1232 +
          <option name="screenDensity" value="420" />
1233 +
          <option name="screenX" value="2208" />
1234 +
          <option name="screenY" value="1840" />
1235 +
        </PersistentDeviceSelectionData>
1236 +
        <PersistentDeviceSelectionData>
1237 +
          <option name="api" value="34" />
1238 +
          <option name="brand" value="google" />
1239 +
          <option name="codename" value="felix" />
1240 +
          <option name="id" value="felix" />
1241 +
          <option name="labId" value="google" />
1242 +
          <option name="manufacturer" value="Google" />
1243 +
          <option name="name" value="Pixel Fold" />
1244 +
          <option name="screenDensity" value="420" />
1245 +
          <option name="screenX" value="2208" />
1246 +
          <option name="screenY" value="1840" />
1247 +
        </PersistentDeviceSelectionData>
1248 +
        <PersistentDeviceSelectionData>
1249 +
          <option name="api" value="36" />
1250 +
          <option name="brand" value="google" />
1251 +
          <option name="codename" value="felix" />
1252 +
          <option name="id" value="felix" />
1253 +
          <option name="labId" value="google" />
1254 +
          <option name="manufacturer" value="Google" />
1255 +
          <option name="name" value="Pixel Fold" />
1256 +
          <option name="screenDensity" value="420" />
1257 +
          <option name="screenX" value="2208" />
1258 +
          <option name="screenY" value="1840" />
1259 +
        </PersistentDeviceSelectionData>
1260 +
        <PersistentDeviceSelectionData>
1261 +
          <option name="api" value="33" />
1262 +
          <option name="brand" value="google" />
1263 +
          <option name="codename" value="felix_camera" />
1264 +
          <option name="id" value="felix_camera" />
1265 +
          <option name="labId" value="google" />
1266 +
          <option name="manufacturer" value="Google" />
1267 +
          <option name="name" value="Pixel Fold (Camera-enabled)" />
1268 +
          <option name="screenDensity" value="420" />
1269 +
          <option name="screenX" value="2208" />
1270 +
          <option name="screenY" value="1840" />
1271 +
        </PersistentDeviceSelectionData>
1272 +
        <PersistentDeviceSelectionData>
1273 +
          <option name="api" value="34" />
1274 +
          <option name="brand" value="motorola" />
1275 +
          <option name="codename" value="fogona" />
1276 +
          <option name="id" value="fogona" />
1277 +
          <option name="labId" value="google" />
1278 +
          <option name="manufacturer" value="Motorola" />
1279 +
          <option name="name" value="moto g play - 2024" />
1280 +
          <option name="screenDensity" value="280" />
1281 +
          <option name="screenX" value="720" />
1282 +
          <option name="screenY" value="1600" />
1283 +
        </PersistentDeviceSelectionData>
1284 +
        <PersistentDeviceSelectionData>
1285 +
          <option name="api" value="34" />
1286 +
          <option name="brand" value="motorola" />
1287 +
          <option name="codename" value="fogorow" />
1288 +
          <option name="id" value="fogorow" />
1289 +
          <option name="labId" value="google" />
1290 +
          <option name="manufacturer" value="Motorola" />
1291 +
          <option name="name" value="moto g24" />
1292 +
          <option name="screenDensity" value="280" />
1293 +
          <option name="screenX" value="720" />
1294 +
          <option name="screenY" value="1612" />
1295 +
        </PersistentDeviceSelectionData>
1296 +
        <PersistentDeviceSelectionData>
1297 +
          <option name="api" value="34" />
1298 +
          <option name="brand" value="motorola" />
1299 +
          <option name="codename" value="fogos" />
1300 +
          <option name="id" value="fogos" />
1301 +
          <option name="labId" value="google" />
1302 +
          <option name="manufacturer" value="Motorola" />
1303 +
          <option name="name" value="moto g34 5G" />
1304 +
          <option name="screenDensity" value="280" />
1305 +
          <option name="screenX" value="720" />
1306 +
          <option name="screenY" value="1600" />
1307 +
        </PersistentDeviceSelectionData>
1308 +
        <PersistentDeviceSelectionData>
1309 +
          <option name="api" value="36" />
1310 +
          <option name="brand" value="google" />
1311 +
          <option name="codename" value="frankel" />
1312 +
          <option name="default" value="true" />
1313 +
          <option name="id" value="frankel" />
1314 +
          <option name="labId" value="google" />
1315 +
          <option name="manufacturer" value="Google" />
1316 +
          <option name="name" value="Pixel 10" />
1317 +
          <option name="screenDensity" value="420" />
1318 +
          <option name="screenX" value="1080" />
1319 +
          <option name="screenY" value="2424" />
1320 +
          <option name="tags">
1321 +
            <list>
1322 +
              <option value="dda-default" />
1323 +
            </list>
1324 +
          </option>
1325 +
        </PersistentDeviceSelectionData>
1326 +
        <PersistentDeviceSelectionData>
1327 +
          <option name="api" value="34" />
1328 +
          <option name="brand" value="samsung" />
1329 +
          <option name="codename" value="g0q" />
1330 +
          <option name="id" value="g0q" />
1331 +
          <option name="labId" value="google" />
1332 +
          <option name="manufacturer" value="Samsung" />
1333 +
          <option name="name" value="Galaxy S22+" />
1334 +
          <option name="screenDensity" value="450" />
1335 +
          <option name="screenX" value="1080" />
1336 +
          <option name="screenY" value="2340" />
1337 +
        </PersistentDeviceSelectionData>
1338 +
        <PersistentDeviceSelectionData>
1339 +
          <option name="api" value="36" />
1340 +
          <option name="brand" value="samsung" />
1341 +
          <option name="codename" value="g0q" />
1342 +
          <option name="id" value="g0q" />
1343 +
          <option name="labId" value="google" />
1344 +
          <option name="manufacturer" value="Samsung" />
1345 +
          <option name="name" value="Galaxy S22+" />
1346 +
          <option name="screenDensity" value="450" />
1347 +
          <option name="screenX" value="1080" />
1348 +
          <option name="screenY" value="2340" />
1349 +
        </PersistentDeviceSelectionData>
1350 +
        <PersistentDeviceSelectionData>
1351 +
          <option name="api" value="36" />
1352 +
          <option name="brand" value="samsung" />
1353 +
          <option name="codename" value="g0qksx" />
1354 +
          <option name="id" value="g0qksx" />
1355 +
          <option name="labId" value="google" />
1356 +
          <option name="manufacturer" value="Samsung" />
1357 +
          <option name="name" value="Galaxy S22+" />
1358 +
          <option name="screenDensity" value="450" />
1359 +
          <option name="screenX" value="1080" />
1360 +
          <option name="screenY" value="2340" />
1361 +
        </PersistentDeviceSelectionData>
1362 +
        <PersistentDeviceSelectionData>
1363 +
          <option name="api" value="33" />
1364 +
          <option name="brand" value="motorola" />
1365 +
          <option name="codename" value="gnevan" />
1366 +
          <option name="id" value="gnevan" />
1367 +
          <option name="labId" value="google" />
1368 +
          <option name="manufacturer" value="Motorola" />
1369 +
          <option name="name" value="moto g stylus (2023)" />
1370 +
          <option name="screenDensity" value="280" />
1371 +
          <option name="screenX" value="720" />
1372 +
          <option name="screenY" value="1600" />
1373 +
        </PersistentDeviceSelectionData>
1374 +
        <PersistentDeviceSelectionData>
1375 +
          <option name="api" value="37" />
1376 +
          <option name="brand" value="google" />
1377 +
          <option name="codename" value="grizzly" />
1378 +
          <option name="id" value="grizzly" />
1379 +
          <option name="labId" value="google" />
1380 +
          <option name="manufacturer" value="Google" />
1381 +
          <option name="name" value="Pixel 11 Pro" />
1382 +
          <option name="screenDensity" value="480" />
1383 +
          <option name="screenX" value="1080" />
1384 +
          <option name="screenY" value="2410" />
1385 +
        </PersistentDeviceSelectionData>
1386 +
        <PersistentDeviceSelectionData>
1387 +
          <option name="api" value="31" />
1388 +
          <option name="brand" value="samsung" />
1389 +
          <option name="codename" value="gta4lwifi" />
1390 +
          <option name="id" value="gta4lwifi" />
1391 +
          <option name="labId" value="google" />
1392 +
          <option name="manufacturer" value="Samsung" />
1393 +
          <option name="name" value="Galaxy Tab A7" />
1394 +
          <option name="screenDensity" value="240" />
1395 +
          <option name="screenX" value="1200" />
1396 +
          <option name="screenY" value="2000" />
1397 +
        </PersistentDeviceSelectionData>
1398 +
        <PersistentDeviceSelectionData>
1399 +
          <option name="api" value="34" />
1400 +
          <option name="brand" value="samsung" />
1401 +
          <option name="codename" value="gta9pwifi" />
1402 +
          <option name="id" value="gta9pwifi" />
1403 +
          <option name="labId" value="google" />
1404 +
          <option name="manufacturer" value="Samsung" />
1405 +
          <option name="name" value="Galaxy Tab A9+" />
1406 +
          <option name="screenDensity" value="240" />
1407 +
          <option name="screenX" value="800" />
1408 +
          <option name="screenY" value="1280" />
1409 +
        </PersistentDeviceSelectionData>
1410 +
        <PersistentDeviceSelectionData>
1411 +
          <option name="api" value="36" />
1412 +
          <option name="brand" value="samsung" />
1413 +
          <option name="codename" value="gts10pwifi" />
1414 +
          <option name="formFactor" value="Tablet" />
1415 +
          <option name="id" value="gts10pwifi" />
1416 +
          <option name="labId" value="google" />
1417 +
          <option name="manufacturer" value="Samsung" />
1418 +
          <option name="name" value="Galaxy Tab S10+" />
1419 +
          <option name="screenDensity" value="320" />
1420 +
          <option name="screenX" value="1752" />
1421 +
          <option name="screenY" value="2800" />
1422 +
        </PersistentDeviceSelectionData>
1423 +
        <PersistentDeviceSelectionData>
1424 +
          <option name="api" value="33" />
1425 +
          <option name="brand" value="samsung" />
1426 +
          <option name="codename" value="gts7lwifi" />
1427 +
          <option name="id" value="gts7lwifi" />
1428 +
          <option name="labId" value="google" />
1429 +
          <option name="manufacturer" value="Samsung" />
1430 +
          <option name="name" value="Galaxy Tab S7" />
1431 +
          <option name="screenDensity" value="340" />
1432 +
          <option name="screenX" value="1600" />
1433 +
          <option name="screenY" value="2560" />
1434 +
        </PersistentDeviceSelectionData>
1435 +
        <PersistentDeviceSelectionData>
1436 +
          <option name="api" value="34" />
1437 +
          <option name="brand" value="samsung" />
1438 +
          <option name="codename" value="gts7xllite" />
1439 +
          <option name="id" value="gts7xllite" />
1440 +
          <option name="labId" value="google" />
1441 +
          <option name="manufacturer" value="Samsung" />
1442 +
          <option name="name" value="Galaxy Tab S7 FE 5G" />
1443 +
          <option name="screenDensity" value="340" />
1444 +
          <option name="screenX" value="1600" />
1445 +
          <option name="screenY" value="2560" />
1446 +
        </PersistentDeviceSelectionData>
1447 +
        <PersistentDeviceSelectionData>
1448 +
          <option name="api" value="33" />
1449 +
          <option name="brand" value="samsung" />
1450 +
          <option name="codename" value="gts7xlwifi" />
1451 +
          <option name="id" value="gts7xlwifi" />
1452 +
          <option name="labId" value="google" />
1453 +
          <option name="manufacturer" value="Samsung" />
1454 +
          <option name="name" value="Galaxy Tab S7+" />
1455 +
          <option name="screenDensity" value="340" />
1456 +
          <option name="screenX" value="1752" />
1457 +
          <option name="screenY" value="2800" />
1458 +
        </PersistentDeviceSelectionData>
1459 +
        <PersistentDeviceSelectionData>
1460 +
          <option name="api" value="33" />
1461 +
          <option name="brand" value="samsung" />
1462 +
          <option name="codename" value="gts8uwifi" />
1463 +
          <option name="formFactor" value="Tablet" />
1464 +
          <option name="id" value="gts8uwifi" />
1465 +
          <option name="labId" value="google" />
1466 +
          <option name="manufacturer" value="Samsung" />
1467 +
          <option name="name" value="Galaxy Tab S8 Ultra" />
1468 +
          <option name="screenDensity" value="320" />
1469 +
          <option name="screenX" value="1848" />
1470 +
          <option name="screenY" value="2960" />
1471 +
        </PersistentDeviceSelectionData>
1472 +
        <PersistentDeviceSelectionData>
1473 +
          <option name="api" value="34" />
1474 +
          <option name="brand" value="samsung" />
1475 +
          <option name="codename" value="gts8wifi" />
1476 +
          <option name="formFactor" value="Tablet" />
1477 +
          <option name="id" value="gts8wifi" />
1478 +
          <option name="labId" value="google" />
1479 +
          <option name="manufacturer" value="Samsung" />
1480 +
          <option name="name" value="Galaxy Tab S8" />
1481 +
          <option name="screenDensity" value="274" />
1482 +
          <option name="screenX" value="1600" />
1483 +
          <option name="screenY" value="2560" />
1484 +
        </PersistentDeviceSelectionData>
1485 +
        <PersistentDeviceSelectionData>
1486 +
          <option name="api" value="34" />
1487 +
          <option name="brand" value="samsung" />
1488 +
          <option name="codename" value="gts9fe" />
1489 +
          <option name="id" value="gts9fe" />
1490 +
          <option name="labId" value="google" />
1491 +
          <option name="manufacturer" value="Samsung" />
1492 +
          <option name="name" value="Galaxy Tab S9 FE 5G" />
1493 +
          <option name="screenDensity" value="280" />
1494 +
          <option name="screenX" value="1440" />
1495 +
          <option name="screenY" value="2304" />
1496 +
        </PersistentDeviceSelectionData>
1497 +
        <PersistentDeviceSelectionData>
1498 +
          <option name="api" value="34" />
1499 +
          <option name="brand" value="samsung" />
1500 +
          <option name="codename" value="gts9wifi" />
1501 +
          <option name="id" value="gts9wifi" />
1502 +
          <option name="labId" value="google" />
1503 +
          <option name="manufacturer" value="Samsung" />
1504 +
          <option name="name" value="Galaxy Tab S9" />
1505 +
          <option name="screenDensity" value="340" />
1506 +
          <option name="screenX" value="1600" />
1507 +
          <option name="screenY" value="2560" />
1508 +
        </PersistentDeviceSelectionData>
1509 +
        <PersistentDeviceSelectionData>
1510 +
          <option name="api" value="30" />
1511 +
          <option name="brand" value="motorola" />
1512 +
          <option name="codename" value="guamna" />
1513 +
          <option name="id" value="guamna" />
1514 +
          <option name="labId" value="google" />
1515 +
          <option name="manufacturer" value="Motorola" />
1516 +
          <option name="name" value="moto g play (2021)" />
1517 +
          <option name="screenDensity" value="280" />
1518 +
          <option name="screenX" value="720" />
1519 +
          <option name="screenY" value="1600" />
1520 +
        </PersistentDeviceSelectionData>
1521 +
        <PersistentDeviceSelectionData>
1522 +
          <option name="api" value="30" />
1523 +
          <option name="brand" value="motorola" />
1524 +
          <option name="codename" value="guamp" />
1525 +
          <option name="id" value="guamp" />
1526 +
          <option name="labId" value="google" />
1527 +
          <option name="manufacturer" value="Motorola" />
1528 +
          <option name="name" value="moto g(9) play" />
1529 +
          <option name="screenDensity" value="280" />
1530 +
          <option name="screenX" value="720" />
1531 +
          <option name="screenY" value="1600" />
1532 +
        </PersistentDeviceSelectionData>
1533 +
        <PersistentDeviceSelectionData>
1534 +
          <option name="api" value="35" />
1535 +
          <option name="brand" value="Xiaomi" />
1536 +
          <option name="codename" value="houji" />
1537 +
          <option name="id" value="houji" />
1538 +
          <option name="labId" value="google" />
1539 +
          <option name="manufacturer" value="Xiaomi" />
1540 +
          <option name="name" value="14" />
1541 +
          <option name="screenDensity" value="480" />
1542 +
          <option name="screenX" value="1200" />
1543 +
          <option name="screenY" value="2670" />
1544 +
        </PersistentDeviceSelectionData>
1545 +
        <PersistentDeviceSelectionData>
1546 +
          <option name="api" value="34" />
1547 +
          <option name="brand" value="google" />
1548 +
          <option name="codename" value="husky" />
1549 +
          <option name="id" value="husky" />
1550 +
          <option name="labId" value="google" />
1551 +
          <option name="manufacturer" value="Google" />
1552 +
          <option name="name" value="Pixel 8 Pro" />
1553 +
          <option name="screenDensity" value="390" />
1554 +
          <option name="screenX" value="1008" />
1555 +
          <option name="screenY" value="2244" />
1556 +
        </PersistentDeviceSelectionData>
1557 +
        <PersistentDeviceSelectionData>
1558 +
          <option name="api" value="35" />
1559 +
          <option name="brand" value="google" />
1560 +
          <option name="codename" value="husky" />
1561 +
          <option name="id" value="husky" />
1562 +
          <option name="labId" value="google" />
1563 +
          <option name="manufacturer" value="Google" />
1564 +
          <option name="name" value="Pixel 8 Pro" />
1565 +
          <option name="screenDensity" value="390" />
1566 +
          <option name="screenX" value="1008" />
1567 +
          <option name="screenY" value="2244" />
1568 +
        </PersistentDeviceSelectionData>
1569 +
        <PersistentDeviceSelectionData>
1570 +
          <option name="api" value="30" />
1571 +
          <option name="brand" value="motorola" />
1572 +
          <option name="codename" value="java" />
1573 +
          <option name="id" value="java" />
1574 +
          <option name="labId" value="google" />
1575 +
          <option name="manufacturer" value="Motorola" />
1576 +
          <option name="name" value="G20" />
1577 +
          <option name="screenDensity" value="280" />
1578 +
          <option name="screenX" value="720" />
1579 +
          <option name="screenY" value="1600" />
1580 +
        </PersistentDeviceSelectionData>
1581 +
        <PersistentDeviceSelectionData>
1582 +
          <option name="api" value="35" />
1583 +
          <option name="brand" value="motorola" />
1584 +
          <option name="codename" value="kansas" />
1585 +
          <option name="id" value="kansas" />
1586 +
          <option name="labId" value="google" />
1587 +
          <option name="manufacturer" value="Motorola" />
1588 +
          <option name="name" value="moto g - 2025" />
1589 +
          <option name="screenDensity" value="280" />
1590 +
          <option name="screenX" value="720" />
1591 +
          <option name="screenY" value="1604" />
1592 +
        </PersistentDeviceSelectionData>
1593 +
        <PersistentDeviceSelectionData>
1594 +
          <option name="api" value="34" />
1595 +
          <option name="brand" value="google" />
1596 +
          <option name="codename" value="komodo" />
1597 +
          <option name="id" value="komodo" />
1598 +
          <option name="labId" value="google" />
1599 +
          <option name="manufacturer" value="Google" />
1600 +
          <option name="name" value="Pixel 9 Pro XL" />
1601 +
          <option name="screenDensity" value="360" />
1602 +
          <option name="screenX" value="1008" />
1603 +
          <option name="screenY" value="2244" />
1604 +
        </PersistentDeviceSelectionData>
1605 +
        <PersistentDeviceSelectionData>
1606 +
          <option name="api" value="35" />
1607 +
          <option name="brand" value="google" />
1608 +
          <option name="codename" value="komodo" />
1609 +
          <option name="id" value="komodo" />
1610 +
          <option name="labId" value="google" />
1611 +
          <option name="manufacturer" value="Google" />
1612 +
          <option name="name" value="Pixel 9 Pro XL" />
1613 +
          <option name="screenDensity" value="360" />
1614 +
          <option name="screenX" value="1008" />
1615 +
          <option name="screenY" value="2244" />
1616 +
        </PersistentDeviceSelectionData>
1617 +
        <PersistentDeviceSelectionData>
1618 +
          <option name="api" value="35" />
1619 +
          <option name="brand" value="motorola" />
1620 +
          <option name="codename" value="lamul" />
1621 +
          <option name="id" value="lamul" />
1622 +
          <option name="labId" value="google" />
1623 +
          <option name="manufacturer" value="Motorola" />
1624 +
          <option name="name" value="moto g05" />
1625 +
          <option name="screenDensity" value="280" />
1626 +
          <option name="screenX" value="720" />
1627 +
          <option name="screenY" value="1604" />
1628 +
        </PersistentDeviceSelectionData>
1629 +
        <PersistentDeviceSelectionData>
1630 +
          <option name="api" value="34" />
1631 +
          <option name="brand" value="motorola" />
1632 +
          <option name="codename" value="lion" />
1633 +
          <option name="id" value="lion" />
1634 +
          <option name="labId" value="google" />
1635 +
          <option name="manufacturer" value="Motorola" />
1636 +
          <option name="name" value="moto g04" />
1637 +
          <option name="screenDensity" value="280" />
1638 +
          <option name="screenX" value="720" />
1639 +
          <option name="screenY" value="1612" />
1640 +
        </PersistentDeviceSelectionData>
1641 +
        <PersistentDeviceSelectionData>
1642 +
          <option name="api" value="33" />
1643 +
          <option name="brand" value="google" />
1644 +
          <option name="codename" value="lynx" />
1645 +
          <option name="id" value="lynx" />
1646 +
          <option name="labId" value="google" />
1647 +
          <option name="manufacturer" value="Google" />
1648 +
          <option name="name" value="Pixel 7a" />
1649 +
          <option name="screenDensity" value="420" />
1650 +
          <option name="screenX" value="1080" />
1651 +
          <option name="screenY" value="2400" />
1652 +
        </PersistentDeviceSelectionData>
1653 +
        <PersistentDeviceSelectionData>
1654 +
          <option name="api" value="34" />
1655 +
          <option name="brand" value="motorola" />
1656 +
          <option name="codename" value="lyriq" />
1657 +
          <option name="id" value="lyriq" />
1658 +
          <option name="labId" value="google" />
1659 +
          <option name="manufacturer" value="Motorola" />
1660 +
          <option name="name" value="edge 40" />
1661 +
          <option name="screenDensity" value="400" />
1662 +
          <option name="screenX" value="1080" />
1663 +
          <option name="screenY" value="2400" />
1664 +
        </PersistentDeviceSelectionData>
1665 +
        <PersistentDeviceSelectionData>
1666 +
          <option name="api" value="36" />
1667 +
          <option name="brand" value="samsung" />
1668 +
          <option name="codename" value="m1q" />
1669 +
          <option name="id" value="m1q" />
1670 +
          <option name="labId" value="google" />
1671 +
          <option name="manufacturer" value="Samsung" />
1672 +
          <option name="name" value="Galaxy S26" />
1673 +
          <option name="screenDensity" value="480" />
1674 +
          <option name="screenX" value="1080" />
1675 +
          <option name="screenY" value="2340" />
1676 +
        </PersistentDeviceSelectionData>
1677 +
        <PersistentDeviceSelectionData>
1678 +
          <option name="api" value="36" />
1679 +
          <option name="brand" value="samsung" />
1680 +
          <option name="codename" value="m2q" />
1681 +
          <option name="id" value="m2q" />
1682 +
          <option name="labId" value="google" />
1683 +
          <option name="manufacturer" value="Samsung" />
1684 +
          <option name="name" value="Galaxy S26+" />
1685 +
          <option name="screenDensity" value="450" />
1686 +
          <option name="screenX" value="1080" />
1687 +
          <option name="screenY" value="2340" />
1688 +
        </PersistentDeviceSelectionData>
1689 +
        <PersistentDeviceSelectionData>
1690 +
          <option name="api" value="36" />
1691 +
          <option name="brand" value="motorola" />
1692 +
          <option name="codename" value="malmo" />
1693 +
          <option name="id" value="malmo" />
1694 +
          <option name="labId" value="google" />
1695 +
          <option name="manufacturer" value="Motorola" />
1696 +
          <option name="name" value="moto g85 5G" />
1697 +
          <option name="screenDensity" value="400" />
1698 +
          <option name="screenX" value="1080" />
1699 +
          <option name="screenY" value="2400" />
1700 +
        </PersistentDeviceSelectionData>
1701 +
        <PersistentDeviceSelectionData>
1702 +
          <option name="api" value="34" />
1703 +
          <option name="brand" value="motorola" />
1704 +
          <option name="codename" value="manaus" />
1705 +
          <option name="id" value="manaus" />
1706 +
          <option name="labId" value="google" />
1707 +
          <option name="manufacturer" value="Motorola" />
1708 +
          <option name="name" value="edge 40 neo" />
1709 +
          <option name="screenDensity" value="400" />
1710 +
          <option name="screenX" value="1080" />
1711 +
          <option name="screenY" value="2400" />
1712 +
        </PersistentDeviceSelectionData>
1713 +
        <PersistentDeviceSelectionData>
1714 +
          <option name="api" value="33" />
1715 +
          <option name="brand" value="motorola" />
1716 +
          <option name="codename" value="maui" />
1717 +
          <option name="id" value="maui" />
1718 +
          <option name="labId" value="google" />
1719 +
          <option name="manufacturer" value="Motorola" />
1720 +
          <option name="name" value="moto g play - 2023" />
1721 +
          <option name="screenDensity" value="280" />
1722 +
          <option name="screenX" value="720" />
1723 +
          <option name="screenY" value="1600" />
1724 +
        </PersistentDeviceSelectionData>
1725 +
        <PersistentDeviceSelectionData>
1726 +
          <option name="api" value="36" />
1727 +
          <option name="brand" value="google" />
1728 +
          <option name="codename" value="mustang" />
1729 +
          <option name="default" value="true" />
1730 +
          <option name="id" value="mustang" />
1731 +
          <option name="labId" value="google" />
1732 +
          <option name="manufacturer" value="Google" />
1733 +
          <option name="name" value="Pixel 10 Pro XL" />
1734 +
          <option name="screenDensity" value="390" />
1735 +
          <option name="screenX" value="1080" />
1736 +
          <option name="screenY" value="2404" />
1737 +
          <option name="tags">
1738 +
            <list>
1739 +
              <option value="dda-default" />
1740 +
            </list>
1741 +
          </option>
1742 +
        </PersistentDeviceSelectionData>
1743 +
        <PersistentDeviceSelectionData>
1744 +
          <option name="api" value="34" />
1745 +
          <option name="brand" value="samsung" />
1746 +
          <option name="codename" value="o1q" />
1747 +
          <option name="id" value="o1q" />
1748 +
          <option name="labId" value="google" />
1749 +
          <option name="manufacturer" value="Samsung" />
1750 +
          <option name="name" value="Galaxy S21 5G" />
1751 +
          <option name="screenDensity" value="421" />
1752 +
          <option name="screenX" value="1080" />
1753 +
          <option name="screenY" value="2400" />
1754 +
        </PersistentDeviceSelectionData>
1755 +
        <PersistentDeviceSelectionData>
1756 +
          <option name="api" value="35" />
1757 +
          <option name="brand" value="samsung" />
1758 +
          <option name="codename" value="o1q" />
1759 +
          <option name="id" value="o1q" />
1760 +
          <option name="labId" value="google" />
1761 +
          <option name="manufacturer" value="Samsung" />
1762 +
          <option name="name" value="Galaxy S21 5G" />
1763 +
          <option name="screenDensity" value="421" />
1764 +
          <option name="screenX" value="1080" />
1765 +
          <option name="screenY" value="2400" />
1766 +
        </PersistentDeviceSelectionData>
1767 +
        <PersistentDeviceSelectionData>
1768 +
          <option name="api" value="35" />
1769 +
          <option name="brand" value="samsung" />
1770 +
          <option name="codename" value="o1s" />
1771 +
          <option name="id" value="o1s" />
1772 +
          <option name="labId" value="google" />
1773 +
          <option name="manufacturer" value="Samsung" />
1774 +
          <option name="name" value="Galaxy S21 5G" />
1775 +
          <option name="screenDensity" value="480" />
1776 +
          <option name="screenX" value="1080" />
1777 +
          <option name="screenY" value="2400" />
1778 +
        </PersistentDeviceSelectionData>
1779 +
        <PersistentDeviceSelectionData>
1780 +
          <option name="api" value="31" />
1781 +
          <option name="brand" value="google" />
1782 +
          <option name="codename" value="oriole" />
1783 +
          <option name="id" value="oriole" />
1784 +
          <option name="labId" value="google" />
1785 +
          <option name="manufacturer" value="Google" />
1786 +
          <option name="name" value="Pixel 6" />
1787 +
          <option name="screenDensity" value="420" />
1788 +
          <option name="screenX" value="1080" />
1789 +
          <option name="screenY" value="2400" />
1790 +
        </PersistentDeviceSelectionData>
1791 +
        <PersistentDeviceSelectionData>
1792 +
          <option name="api" value="35" />
1793 +
          <option name="brand" value="samsung" />
1794 +
          <option name="codename" value="p3q" />
1795 +
          <option name="id" value="p3q" />
1796 +
          <option name="labId" value="google" />
1797 +
          <option name="manufacturer" value="Samsung" />
1798 +
          <option name="name" value="Galaxy S21 Ultra 5G" />
1799 +
          <option name="screenDensity" value="600" />
1800 +
          <option name="screenX" value="1440" />
1801 +
          <option name="screenY" value="3200" />
1802 +
        </PersistentDeviceSelectionData>
1803 +
        <PersistentDeviceSelectionData>
1804 +
          <option name="api" value="35" />
1805 +
          <option name="brand" value="samsung" />
1806 +
          <option name="codename" value="p3s" />
1807 +
          <option name="id" value="p3s" />
1808 +
          <option name="labId" value="google" />
1809 +
          <option name="manufacturer" value="Samsung" />
1810 +
          <option name="name" value="Galaxy S21 Ultra 5G" />
1811 +
          <option name="screenDensity" value="600" />
1812 +
          <option name="screenX" value="1440" />
1813 +
          <option name="screenY" value="3200" />
1814 +
        </PersistentDeviceSelectionData>
1815 +
        <PersistentDeviceSelectionData>
1816 +
          <option name="api" value="36" />
1817 +
          <option name="brand" value="samsung" />
1818 +
          <option name="codename" value="pa1qksx" />
1819 +
          <option name="id" value="pa1qksx" />
1820 +
          <option name="labId" value="google" />
1821 +
          <option name="manufacturer" value="Samsung" />
1822 +
          <option name="name" value="Galaxy S25" />
1823 +
          <option name="screenDensity" value="480" />
1824 +
          <option name="screenX" value="1080" />
1825 +
          <option name="screenY" value="2340" />
1826 +
        </PersistentDeviceSelectionData>
1827 +
        <PersistentDeviceSelectionData>
1828 +
          <option name="api" value="36" />
1829 +
          <option name="brand" value="samsung" />
1830 +
          <option name="codename" value="pa2q" />
1831 +
          <option name="id" value="pa2q" />
1832 +
          <option name="labId" value="google" />
1833 +
          <option name="manufacturer" value="Samsung" />
1834 +
          <option name="name" value="Galaxy S25+" />
1835 +
          <option name="screenDensity" value="450" />
1836 +
          <option name="screenX" value="1080" />
1837 +
          <option name="screenY" value="2340" />
1838 +
        </PersistentDeviceSelectionData>
1839 +
        <PersistentDeviceSelectionData>
1840 +
          <option name="api" value="36" />
1841 +
          <option name="brand" value="samsung" />
1842 +
          <option name="codename" value="pa2qxxx" />
1843 +
          <option name="id" value="pa2qxxx" />
1844 +
          <option name="labId" value="google" />
1845 +
          <option name="manufacturer" value="Samsung" />
1846 +
          <option name="name" value="Galaxy S25+" />
1847 +
          <option name="screenDensity" value="450" />
1848 +
          <option name="screenX" value="1080" />
1849 +
          <option name="screenY" value="2340" />
1850 +
        </PersistentDeviceSelectionData>
1851 +
        <PersistentDeviceSelectionData>
1852 +
          <option name="api" value="35" />
1853 +
          <option name="brand" value="samsung" />
1854 +
          <option name="codename" value="pa3q" />
1855 +
          <option name="default" value="true" />
1856 +
          <option name="id" value="pa3q" />
1857 +
          <option name="labId" value="google" />
1858 +
          <option name="manufacturer" value="Samsung" />
1859 +
          <option name="name" value="Galaxy S25 Ultra" />
1860 +
          <option name="screenDensity" value="450" />
1861 +
          <option name="screenX" value="1080" />
1862 +
          <option name="screenY" value="2340" />
1863 +
          <option name="tags">
1864 +
            <list>
1865 +
              <option value="dda-default" />
1866 +
            </list>
1867 +
          </option>
1868 +
        </PersistentDeviceSelectionData>
1869 +
        <PersistentDeviceSelectionData>
1870 +
          <option name="api" value="36" />
1871 +
          <option name="brand" value="samsung" />
1872 +
          <option name="codename" value="pa3q" />
1873 +
          <option name="default" value="true" />
1874 +
          <option name="id" value="pa3q" />
1875 +
          <option name="labId" value="google" />
1876 +
          <option name="manufacturer" value="Samsung" />
1877 +
          <option name="name" value="Galaxy S25 Ultra" />
1878 +
          <option name="screenDensity" value="450" />
1879 +
          <option name="screenX" value="1080" />
1880 +
          <option name="screenY" value="2340" />
1881 +
          <option name="tags">
1882 +
            <list>
1883 +
              <option value="dda-default" />
1884 +
            </list>
1885 +
          </option>
1886 +
        </PersistentDeviceSelectionData>
1887 +
        <PersistentDeviceSelectionData>
1888 +
          <option name="api" value="33" />
1889 +
          <option name="brand" value="google" />
1890 +
          <option name="codename" value="panther" />
1891 +
          <option name="id" value="panther" />
1892 +
          <option name="labId" value="google" />
1893 +
          <option name="manufacturer" value="Google" />
1894 +
          <option name="name" value="Pixel 7" />
1895 +
          <option name="screenDensity" value="420" />
1896 +
          <option name="screenX" value="1080" />
1897 +
          <option name="screenY" value="2400" />
1898 +
        </PersistentDeviceSelectionData>
1899 +
        <PersistentDeviceSelectionData>
1900 +
          <option name="api" value="34" />
1901 +
          <option name="brand" value="motorola" />
1902 +
          <option name="codename" value="penang" />
1903 +
          <option name="id" value="penang" />
1904 +
          <option name="labId" value="google" />
1905 +
          <option name="manufacturer" value="Motorola" />
1906 +
          <option name="name" value="moto g53 5G" />
1907 +
          <option name="screenDensity" value="280" />
1908 +
          <option name="screenX" value="720" />
1909 +
          <option name="screenY" value="1600" />
1910 +
        </PersistentDeviceSelectionData>
1911 +
        <PersistentDeviceSelectionData>
1912 +
          <option name="api" value="35" />
1913 +
          <option name="brand" value="samsung" />
1914 +
          <option name="codename" value="psq" />
1915 +
          <option name="id" value="psq" />
1916 +
          <option name="labId" value="google" />
1917 +
          <option name="manufacturer" value="Samsung" />
1918 +
          <option name="name" value="Galaxy S25 Edge" />
1919 +
          <option name="screenDensity" value="450" />
1920 +
          <option name="screenX" value="1440" />
1921 +
          <option name="screenY" value="3120" />
1922 +
        </PersistentDeviceSelectionData>
1923 +
        <PersistentDeviceSelectionData>
1924 +
          <option name="api" value="35" />
1925 +
          <option name="brand" value="samsung" />
1926 +
          <option name="codename" value="q2qsqw" />
1927 +
          <option name="id" value="q2qsqw" />
1928 +
          <option name="labId" value="google" />
1929 +
          <option name="manufacturer" value="Samsung" />
1930 +
          <option name="name" value="Galaxy Z Fold3 5G" />
1931 +
          <option name="screenDensity" value="420" />
1932 +
          <option name="screenX" value="832" />
1933 +
          <option name="screenY" value="2268" />
1934 +
        </PersistentDeviceSelectionData>
1935 +
        <PersistentDeviceSelectionData>
1936 +
          <option name="api" value="36" />
1937 +
          <option name="brand" value="samsung" />
1938 +
          <option name="codename" value="q4qksx" />
1939 +
          <option name="id" value="q4qksx" />
1940 +
          <option name="labId" value="google" />
1941 +
          <option name="manufacturer" value="Samsung" />
1942 +
          <option name="name" value="Galaxy Z Fold4" />
1943 +
          <option name="screenDensity" value="420" />
1944 +
          <option name="screenX" value="1812" />
1945 +
          <option name="screenY" value="2176" />
1946 +
        </PersistentDeviceSelectionData>
1947 +
        <PersistentDeviceSelectionData>
1948 +
          <option name="api" value="34" />
1949 +
          <option name="brand" value="samsung" />
1950 +
          <option name="codename" value="q5q" />
1951 +
          <option name="id" value="q5q" />
1952 +
          <option name="labId" value="google" />
1953 +
          <option name="manufacturer" value="Samsung" />
1954 +
          <option name="name" value="Galaxy Z Fold5" />
1955 +
          <option name="screenDensity" value="420" />
1956 +
          <option name="screenX" value="1812" />
1957 +
          <option name="screenY" value="2176" />
1958 +
        </PersistentDeviceSelectionData>
1959 +
        <PersistentDeviceSelectionData>
1960 +
          <option name="api" value="36" />
1961 +
          <option name="brand" value="samsung" />
1962 +
          <option name="codename" value="q5qksx" />
1963 +
          <option name="id" value="q5qksx" />
1964 +
          <option name="labId" value="google" />
1965 +
          <option name="manufacturer" value="Samsung" />
1966 +
          <option name="name" value="Galaxy Z Fold5" />
1967 +
          <option name="screenDensity" value="420" />
1968 +
          <option name="screenX" value="1812" />
1969 +
          <option name="screenY" value="2176" />
1970 +
        </PersistentDeviceSelectionData>
1971 +
        <PersistentDeviceSelectionData>
1972 +
          <option name="api" value="34" />
1973 +
          <option name="brand" value="samsung" />
1974 +
          <option name="codename" value="q6q" />
1975 +
          <option name="id" value="q6q" />
1976 +
          <option name="labId" value="google" />
1977 +
          <option name="manufacturer" value="Samsung" />
1978 +
          <option name="name" value="Galaxy Z Fold6" />
1979 +
          <option name="screenDensity" value="420" />
1980 +
          <option name="screenX" value="1856" />
1981 +
          <option name="screenY" value="2160" />
1982 +
        </PersistentDeviceSelectionData>
1983 +
        <PersistentDeviceSelectionData>
1984 +
          <option name="api" value="36" />
1985 +
          <option name="brand" value="samsung" />
1986 +
          <option name="codename" value="q6qksx" />
1987 +
          <option name="id" value="q6qksx" />
1988 +
          <option name="labId" value="google" />
1989 +
          <option name="manufacturer" value="Samsung" />
1990 +
          <option name="name" value="Galaxy Z Fold6" />
1991 +
          <option name="screenDensity" value="420" />
1992 +
          <option name="screenX" value="1856" />
1993 +
          <option name="screenY" value="2160" />
1994 +
        </PersistentDeviceSelectionData>
1995 +
        <PersistentDeviceSelectionData>
1996 +
          <option name="api" value="36" />
1997 +
          <option name="brand" value="samsung" />
1998 +
          <option name="codename" value="q6qsqw" />
1999 +
          <option name="id" value="q6qsqw" />
2000 +
          <option name="labId" value="google" />
2001 +
          <option name="manufacturer" value="Samsung" />
2002 +
          <option name="name" value="Galaxy Z Fold6" />
2003 +
          <option name="screenDensity" value="420" />
2004 +
          <option name="screenX" value="1856" />
2005 +
          <option name="screenY" value="2160" />
2006 +
        </PersistentDeviceSelectionData>
2007 +
        <PersistentDeviceSelectionData>
2008 +
          <option name="api" value="36" />
2009 +
          <option name="brand" value="samsung" />
2010 +
          <option name="codename" value="q7mq" />
2011 +
          <option name="id" value="q7mq" />
2012 +
          <option name="labId" value="google" />
2013 +
          <option name="manufacturer" value="Samsung" />
2014 +
          <option name="name" value="Galaxy Z TriFold" />
2015 +
          <option name="screenDensity" value="320" />
2016 +
          <option name="screenX" value="2160" />
2017 +
          <option name="screenY" value="1584" />
2018 +
        </PersistentDeviceSelectionData>
2019 +
        <PersistentDeviceSelectionData>
2020 +
          <option name="api" value="36" />
2021 +
          <option name="brand" value="samsung" />
2022 +
          <option name="codename" value="r0q" />
2023 +
          <option name="id" value="r0q" />
2024 +
          <option name="labId" value="google" />
2025 +
          <option name="manufacturer" value="Samsung" />
2026 +
          <option name="name" value="Galaxy S22" />
2027 +
          <option name="screenDensity" value="425" />
2028 +
          <option name="screenX" value="1080" />
2029 +
          <option name="screenY" value="2340" />
2030 +
        </PersistentDeviceSelectionData>
2031 +
        <PersistentDeviceSelectionData>
2032 +
          <option name="api" value="36" />
2033 +
          <option name="brand" value="samsung" />
2034 +
          <option name="codename" value="r0qcsx" />
2035 +
          <option name="id" value="r0qcsx" />
2036 +
          <option name="labId" value="google" />
2037 +
          <option name="manufacturer" value="Samsung" />
2038 +
          <option name="name" value="Galaxy S22" />
2039 +
          <option name="screenDensity" value="480" />
2040 +
          <option name="screenX" value="1080" />
2041 +
          <option name="screenY" value="2340" />
2042 +
        </PersistentDeviceSelectionData>
2043 +
        <PersistentDeviceSelectionData>
2044 +
          <option name="api" value="36" />
2045 +
          <option name="brand" value="samsung" />
2046 +
          <option name="codename" value="r0qksx" />
2047 +
          <option name="id" value="r0qksx" />
2048 +
          <option name="labId" value="google" />
2049 +
          <option name="manufacturer" value="Samsung" />
2050 +
          <option name="name" value="Galaxy S22" />
2051 +
          <option name="screenDensity" value="480" />
2052 +
          <option name="screenX" value="1080" />
2053 +
          <option name="screenY" value="2340" />
2054 +
        </PersistentDeviceSelectionData>
2055 +
        <PersistentDeviceSelectionData>
2056 +
          <option name="api" value="30" />
2057 +
          <option name="brand" value="google" />
2058 +
          <option name="codename" value="r11" />
2059 +
          <option name="formFactor" value="Wear OS" />
2060 +
          <option name="id" value="r11" />
2061 +
          <option name="labId" value="google" />
2062 +
          <option name="manufacturer" value="Google" />
2063 +
          <option name="name" value="Pixel Watch" />
2064 +
          <option name="screenDensity" value="320" />
2065 +
          <option name="screenX" value="384" />
2066 +
          <option name="screenY" value="384" />
2067 +
          <option name="type" value="WEAR_OS" />
2068 +
        </PersistentDeviceSelectionData>
2069 +
        <PersistentDeviceSelectionData>
2070 +
          <option name="api" value="34" />
2071 +
          <option name="brand" value="samsung" />
2072 +
          <option name="codename" value="r11q" />
2073 +
          <option name="id" value="r11q" />
2074 +
          <option name="labId" value="google" />
2075 +
          <option name="manufacturer" value="Samsung" />
2076 +
          <option name="name" value="Galaxy S23 FE" />
2077 +
          <option name="screenDensity" value="450" />
2078 +
          <option name="screenX" value="1080" />
2079 +
          <option name="screenY" value="2340" />
2080 +
        </PersistentDeviceSelectionData>
2081 +
        <PersistentDeviceSelectionData>
2082 +
          <option name="api" value="36" />
2083 +
          <option name="brand" value="samsung" />
2084 +
          <option name="codename" value="r11qcs" />
2085 +
          <option name="id" value="r11qcs" />
2086 +
          <option name="labId" value="google" />
2087 +
          <option name="manufacturer" value="Samsung" />
2088 +
          <option name="name" value="Galaxy S23 FE" />
2089 +
          <option name="screenDensity" value="450" />
2090 +
          <option name="screenX" value="1080" />
2091 +
          <option name="screenY" value="2340" />
2092 +
        </PersistentDeviceSelectionData>
2093 +
        <PersistentDeviceSelectionData>
2094 +
          <option name="api" value="36" />
2095 +
          <option name="brand" value="samsung" />
2096 +
          <option name="codename" value="r11s" />
2097 +
          <option name="id" value="r11s" />
2098 +
          <option name="labId" value="google" />
2099 +
          <option name="manufacturer" value="Samsung" />
2100 +
          <option name="name" value="Galaxy S23 FE" />
2101 +
          <option name="screenDensity" value="450" />
2102 +
          <option name="screenX" value="1080" />
2103 +
          <option name="screenY" value="2340" />
2104 +
        </PersistentDeviceSelectionData>
2105 +
        <PersistentDeviceSelectionData>
2106 +
          <option name="api" value="33" />
2107 +
          <option name="brand" value="samsung" />
2108 +
          <option name="codename" value="r8q" />
2109 +
          <option name="id" value="r8q" />
2110 +
          <option name="labId" value="google" />
2111 +
          <option name="manufacturer" value="Samsung" />
2112 +
          <option name="name" value="Galaxy S20 FE 5G" />
2113 +
          <option name="screenDensity" value="480" />
2114 +
          <option name="screenX" value="1080" />
2115 +
          <option name="screenY" value="2400" />
2116 +
        </PersistentDeviceSelectionData>
2117 +
        <PersistentDeviceSelectionData>
2118 +
          <option name="api" value="33" />
2119 +
          <option name="brand" value="samsung" />
2120 +
          <option name="codename" value="r8qcsx" />
2121 +
          <option name="id" value="r8qcsx" />
2122 +
          <option name="labId" value="google" />
2123 +
          <option name="manufacturer" value="Samsung" />
2124 +
          <option name="name" value="Galaxy S20 FE 5G" />
2125 +
          <option name="screenDensity" value="480" />
2126 +
          <option name="screenX" value="1080" />
2127 +
          <option name="screenY" value="2400" />
2128 +
        </PersistentDeviceSelectionData>
2129 +
        <PersistentDeviceSelectionData>
2130 +
          <option name="api" value="33" />
2131 +
          <option name="brand" value="samsung" />
2132 +
          <option name="codename" value="r8qksx" />
2133 +
          <option name="id" value="r8qksx" />
2134 +
          <option name="labId" value="google" />
2135 +
          <option name="manufacturer" value="Samsung" />
2136 +
          <option name="name" value="Galaxy S20 FE 5G" />
2137 +
          <option name="screenDensity" value="480" />
2138 +
          <option name="screenX" value="1080" />
2139 +
          <option name="screenY" value="2400" />
2140 +
        </PersistentDeviceSelectionData>
2141 +
        <PersistentDeviceSelectionData>
2142 +
          <option name="api" value="36" />
2143 +
          <option name="brand" value="samsung" />
2144 +
          <option name="codename" value="r9q" />
2145 +
          <option name="id" value="r9q" />
2146 +
          <option name="labId" value="google" />
2147 +
          <option name="manufacturer" value="Samsung" />
2148 +
          <option name="name" value="Galaxy S21 FE 5G" />
2149 +
          <option name="screenDensity" value="480" />
2150 +
          <option name="screenX" value="1080" />
2151 +
          <option name="screenY" value="2340" />
2152 +
        </PersistentDeviceSelectionData>
2153 +
        <PersistentDeviceSelectionData>
2154 +
          <option name="api" value="36" />
2155 +
          <option name="brand" value="samsung" />
2156 +
          <option name="codename" value="r9q-SM-G990U" />
2157 +
          <option name="id" value="r9q-SM-G990U" />
2158 +
          <option name="labId" value="google" />
2159 +
          <option name="manufacturer" value="Samsung" />
2160 +
          <option name="name" value="Galaxy S21 FE 5G" />
2161 +
          <option name="screenDensity" value="480" />
2162 +
          <option name="screenX" value="1080" />
2163 +
          <option name="screenY" value="2340" />
2164 +
        </PersistentDeviceSelectionData>
2165 +
        <PersistentDeviceSelectionData>
2166 +
          <option name="api" value="36" />
2167 +
          <option name="brand" value="samsung" />
2168 +
          <option name="codename" value="r9q2csx" />
2169 +
          <option name="id" value="r9q2csx" />
2170 +
          <option name="labId" value="google" />
2171 +
          <option name="manufacturer" value="Samsung" />
2172 +
          <option name="name" value="Galaxy S21 FE 5G" />
2173 +
          <option name="screenDensity" value="480" />
2174 +
          <option name="screenX" value="1080" />
2175 +
          <option name="screenY" value="2340" />
2176 +
        </PersistentDeviceSelectionData>
2177 +
        <PersistentDeviceSelectionData>
2178 +
          <option name="api" value="36" />
2179 +
          <option name="brand" value="google" />
2180 +
          <option name="codename" value="rango" />
2181 +
          <option name="default" value="true" />
2182 +
          <option name="id" value="rango" />
2183 +
          <option name="labId" value="google" />
2184 +
          <option name="manufacturer" value="Google" />
2185 +
          <option name="name" value="Pixel 10 Pro Fold" />
2186 +
          <option name="screenDensity" value="390" />
2187 +
          <option name="screenX" value="2076" />
2188 +
          <option name="screenY" value="2152" />
2189 +
          <option name="tags">
2190 +
            <list>
2191 +
              <option value="dda-default" />
2192 +
            </list>
2193 +
          </option>
2194 +
        </PersistentDeviceSelectionData>
2195 +
        <PersistentDeviceSelectionData>
2196 +
          <option name="api" value="30" />
2197 +
          <option name="brand" value="google" />
2198 +
          <option name="codename" value="redfin" />
2199 +
          <option name="id" value="redfin" />
2200 +
          <option name="labId" value="google" />
2201 +
          <option name="manufacturer" value="Google" />
2202 +
          <option name="name" value="Pixel 5" />
2203 +
          <option name="screenDensity" value="440" />
2204 +
          <option name="screenX" value="1080" />
2205 +
          <option name="screenY" value="2340" />
2206 +
          <option name="tags">
2207 +
            <list>
2208 +
              <option value="default" />
2209 +
            </list>
2210 +
          </option>
2211 +
        </PersistentDeviceSelectionData>
2212 +
        <PersistentDeviceSelectionData>
2213 +
          <option name="api" value="34" />
2214 +
          <option name="brand" value="google" />
2215 +
          <option name="codename" value="shiba" />
2216 +
          <option name="id" value="shiba" />
2217 +
          <option name="labId" value="google" />
2218 +
          <option name="manufacturer" value="Google" />
2219 +
          <option name="name" value="Pixel 8" />
2220 +
          <option name="screenDensity" value="420" />
2221 +
          <option name="screenX" value="1080" />
2222 +
          <option name="screenY" value="2400" />
2223 +
        </PersistentDeviceSelectionData>
2224 +
        <PersistentDeviceSelectionData>
2225 +
          <option name="api" value="36" />
2226 +
          <option name="brand" value="google" />
2227 +
          <option name="codename" value="shiba" />
2228 +
          <option name="id" value="shiba" />
2229 +
          <option name="labId" value="google" />
2230 +
          <option name="manufacturer" value="Google" />
2231 +
          <option name="name" value="Pixel 8" />
2232 +
          <option name="screenDensity" value="420" />
2233 +
          <option name="screenX" value="1080" />
2234 +
          <option name="screenY" value="2400" />
2235 +
        </PersistentDeviceSelectionData>
2236 +
        <PersistentDeviceSelectionData>
2237 +
          <option name="api" value="34" />
2238 +
          <option name="brand" value="samsung" />
2239 +
          <option name="codename" value="t2q" />
2240 +
          <option name="id" value="t2q" />
2241 +
          <option name="labId" value="google" />
2242 +
          <option name="manufacturer" value="Samsung" />
2243 +
          <option name="name" value="Galaxy S21+ 5G" />
2244 +
          <option name="screenDensity" value="394" />
2245 +
          <option name="screenX" value="1080" />
2246 +
          <option name="screenY" value="2400" />
2247 +
        </PersistentDeviceSelectionData>
2248 +
        <PersistentDeviceSelectionData>
2249 +
          <option name="api" value="35" />
2250 +
          <option name="brand" value="samsung" />
2251 +
          <option name="codename" value="t2q" />
2252 +
          <option name="id" value="t2q" />
2253 +
          <option name="labId" value="google" />
2254 +
          <option name="manufacturer" value="Samsung" />
2255 +
          <option name="name" value="Galaxy S21+ 5G" />
2256 +
          <option name="screenDensity" value="394" />
2257 +
          <option name="screenX" value="1080" />
2258 +
          <option name="screenY" value="2400" />
2259 +
        </PersistentDeviceSelectionData>
2260 +
        <PersistentDeviceSelectionData>
2261 +
          <option name="api" value="33" />
2262 +
          <option name="brand" value="google" />
2263 +
          <option name="codename" value="tangorpro" />
2264 +
          <option name="formFactor" value="Tablet" />
2265 +
          <option name="id" value="tangorpro" />
2266 +
          <option name="labId" value="google" />
2267 +
          <option name="manufacturer" value="Google" />
2268 +
          <option name="name" value="Pixel Tablet" />
2269 +
          <option name="screenDensity" value="320" />
2270 +
          <option name="screenX" value="1600" />
2271 +
          <option name="screenY" value="2560" />
2272 +
        </PersistentDeviceSelectionData>
2273 +
        <PersistentDeviceSelectionData>
2274 +
          <option name="api" value="36" />
2275 +
          <option name="brand" value="google" />
2276 +
          <option name="codename" value="tangorpro" />
2277 +
          <option name="formFactor" value="Tablet" />
2278 +
          <option name="id" value="tangorpro" />
2279 +
          <option name="labId" value="google" />
2280 +
          <option name="manufacturer" value="Google" />
2281 +
          <option name="name" value="Pixel Tablet" />
2282 +
          <option name="screenDensity" value="320" />
2283 +
          <option name="screenX" value="1600" />
2284 +
          <option name="screenY" value="2560" />
2285 +
        </PersistentDeviceSelectionData>
2286 +
        <PersistentDeviceSelectionData>
2287 +
          <option name="api" value="35" />
2288 +
          <option name="brand" value="google" />
2289 +
          <option name="codename" value="tegu" />
2290 +
          <option name="id" value="tegu" />
2291 +
          <option name="labId" value="google" />
2292 +
          <option name="manufacturer" value="Google" />
2293 +
          <option name="name" value="Pixel 9a" />
2294 +
          <option name="screenDensity" value="420" />
2295 +
          <option name="screenX" value="1080" />
2296 +
          <option name="screenY" value="2424" />
2297 +
        </PersistentDeviceSelectionData>
2298 +
        <PersistentDeviceSelectionData>
2299 +
          <option name="api" value="34" />
2300 +
          <option name="brand" value="google" />
2301 +
          <option name="codename" value="tokay" />
2302 +
          <option name="id" value="tokay" />
2303 +
          <option name="labId" value="google" />
2304 +
          <option name="manufacturer" value="Google" />
2305 +
          <option name="name" value="Pixel 9" />
2306 +
          <option name="screenDensity" value="420" />
2307 +
          <option name="screenX" value="1080" />
2308 +
          <option name="screenY" value="2424" />
2309 +
        </PersistentDeviceSelectionData>
2310 +
        <PersistentDeviceSelectionData>
2311 +
          <option name="api" value="35" />
2312 +
          <option name="brand" value="google" />
2313 +
          <option name="codename" value="tokay" />
2314 +
          <option name="id" value="tokay" />
2315 +
          <option name="labId" value="google" />
2316 +
          <option name="manufacturer" value="Google" />
2317 +
          <option name="name" value="Pixel 9" />
2318 +
          <option name="screenDensity" value="420" />
2319 +
          <option name="screenX" value="1080" />
2320 +
          <option name="screenY" value="2424" />
2321 +
        </PersistentDeviceSelectionData>
2322 +
        <PersistentDeviceSelectionData>
2323 +
          <option name="api" value="36" />
2324 +
          <option name="brand" value="google" />
2325 +
          <option name="codename" value="tokay" />
2326 +
          <option name="id" value="tokay" />
2327 +
          <option name="labId" value="google" />
2328 +
          <option name="manufacturer" value="Google" />
2329 +
          <option name="name" value="Pixel 9" />
2330 +
          <option name="screenDensity" value="420" />
2331 +
          <option name="screenX" value="1080" />
2332 +
          <option name="screenY" value="2424" />
2333 +
        </PersistentDeviceSelectionData>
2334 +
        <PersistentDeviceSelectionData>
2335 +
          <option name="api" value="34" />
2336 +
          <option name="brand" value="samsung" />
2337 +
          <option name="codename" value="xcover7" />
2338 +
          <option name="id" value="xcover7" />
2339 +
          <option name="labId" value="google" />
2340 +
          <option name="manufacturer" value="Samsung" />
2341 +
          <option name="name" value="Galaxy XCover7" />
2342 +
          <option name="screenDensity" value="450" />
2343 +
          <option name="screenX" value="1080" />
2344 +
          <option name="screenY" value="2408" />
2345 +
        </PersistentDeviceSelectionData>
2346 +
        <PersistentDeviceSelectionData>
2347 +
          <option name="api" value="33" />
2348 +
          <option name="brand" value="samsung" />
2349 +
          <option name="codename" value="y2q" />
2350 +
          <option name="id" value="y2q" />
2351 +
          <option name="labId" value="google" />
2352 +
          <option name="manufacturer" value="Samsung" />
2353 +
          <option name="name" value="Galaxy S20+ 5G" />
2354 +
          <option name="screenDensity" value="600" />
2355 +
          <option name="screenX" value="1440" />
2356 +
          <option name="screenY" value="3200" />
2357 +
        </PersistentDeviceSelectionData>
2358 +
        <PersistentDeviceSelectionData>
2359 +
          <option name="api" value="37" />
2360 +
          <option name="brand" value="google" />
2361 +
          <option name="codename" value="yogi" />
2362 +
          <option name="id" value="yogi" />
2363 +
          <option name="labId" value="google" />
2364 +
          <option name="manufacturer" value="Google" />
2365 +
          <option name="name" value="Pixel 11 Pro Fold" />
2366 +
          <option name="screenDensity" value="390" />
2367 +
          <option name="screenX" value="2076" />
2368 +
          <option name="screenY" value="2152" />
2369 +
        </PersistentDeviceSelectionData>
2370 +
        <PersistentDeviceSelectionData>
2371 +
          <option name="api" value="33" />
2372 +
          <option name="brand" value="samsung" />
2373 +
          <option name="codename" value="z3q" />
2374 +
          <option name="id" value="z3q" />
2375 +
          <option name="labId" value="google" />
2376 +
          <option name="manufacturer" value="Samsung" />
2377 +
          <option name="name" value="Galaxy S20 Ultra 5G" />
2378 +
          <option name="screenDensity" value="560" />
2379 +
          <option name="screenX" value="1440" />
2380 +
          <option name="screenY" value="3200" />
2381 +
        </PersistentDeviceSelectionData>
2382 +
      </list>
2383 +
    </option>
2384 +
  </component>
2385 +
</project>
added .idea/compiler.xml +6 −0
1 +
<?xml version="1.0" encoding="UTF-8"?>
2 +
<project version="4">
3 +
  <component name="CompilerConfiguration">
4 +
    <bytecodeTargetLevel target="25" />
5 +
  </component>
6 +
</project>
added .idea/deploymentTargetSelector.xml +11 −0
1 +
<?xml version="1.0" encoding="UTF-8"?>
2 +
<project version="4">
3 +
  <component name="deploymentTargetSelector">
4 +
    <selectionStates>
5 +
      <SelectionState runConfigName="app">
6 +
        <option name="selectionMode" value="DROPDOWN" />
7 +
        <DialogSelection />
8 +
      </SelectionState>
9 +
    </selectionStates>
10 +
  </component>
11 +
</project>
added .idea/gradle.xml +17 −0
1 +
<?xml version="1.0" encoding="UTF-8"?>
2 +
<project version="4">
3 +
  <component name="GradleSettings">
4 +
    <option name="linkedExternalProjectsSettings">
5 +
      <GradleProjectSettings>
6 +
        <option name="testRunner" value="CHOOSE_PER_TEST" />
7 +
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
8 +
        <option name="modules">
9 +
          <set>
10 +
            <option value="$PROJECT_DIR$" />
11 +
            <option value="$PROJECT_DIR$/app" />
12 +
          </set>
13 +
        </option>
14 +
      </GradleProjectSettings>
15 +
    </option>
16 +
  </component>
17 +
</project>
added .idea/markdown.xml +8 −0
1 +
<?xml version="1.0" encoding="UTF-8"?>
2 +
<project version="4">
3 +
  <component name="MarkdownSettings">
4 +
    <option name="previewPanelProviderInfo">
5 +
      <ProviderInfo name="Compose (experimental)" className="com.intellij.markdown.compose.preview.ComposePanelProvider" />
6 +
    </option>
7 +
  </component>
8 +
</project>
added .idea/misc.xml +10 −0
1 +
<?xml version="1.0" encoding="UTF-8"?>
2 +
<project version="4">
3 +
  <component name="ExternalStorageConfigurationManager" enabled="true" />
4 +
  <component name="ProjectRootManager" version="2" languageLevel="JDK_25" project-jdk-name="jbr-25" project-jdk-type="JavaSDK">
5 +
    <output url="file://$PROJECT_DIR$/build/classes" />
6 +
  </component>
7 +
  <component name="ProjectType">
8 +
    <option name="id" value="Android" />
9 +
  </component>
10 +
</project>
added .idea/runConfigurations.xml +17 −0
1 +
<?xml version="1.0" encoding="UTF-8"?>
2 +
<project version="4">
3 +
  <component name="RunConfigurationProducerService">
4 +
    <option name="ignoredProducers">
5 +
      <set>
6 +
        <option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
7 +
        <option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
8 +
        <option value="com.intellij.execution.junit.PatternConfigurationProducer" />
9 +
        <option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
10 +
        <option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
11 +
        <option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
12 +
        <option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
13 +
        <option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
14 +
      </set>
15 +
    </option>
16 +
  </component>
17 +
</project>
added .idea/vcs.xml +6 −0
1 +
<?xml version="1.0" encoding="UTF-8"?>
2 +
<project version="4">
3 +
  <component name="VcsDirectoryMappings">
4 +
    <mapping directory="$PROJECT_DIR$/rust-core" vcs="Git" />
5 +
  </component>
6 +
</project>
added .idea/workspace.xml +126 −0
1 +
<?xml version="1.0" encoding="UTF-8"?>
2 +
<project version="4">
3 +
  <component name="AutoImportSettings">
4 +
    <option name="autoReloadType" value="NONE" />
5 +
  </component>
6 +
  <component name="ChangeListManager">
7 +
    <list default="true" id="31b5901e-d9de-4181-863a-67b67047c6fd" name="Changes" comment="" />
8 +
    <option name="SHOW_DIALOG" value="false" />
9 +
    <option name="HIGHLIGHT_CONFLICTS" value="true" />
10 +
    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
11 +
    <option name="LAST_RESOLUTION" value="IGNORE" />
12 +
  </component>
13 +
  <component name="ClangdSettings">
14 +
    <option name="formatViaClangd" value="false" />
15 +
  </component>
16 +
  <component name="ExecutionTargetManager" SELECTED_TARGET="device_and_snapshot_combo_box_target[]" />
17 +
  <component name="ExternalProjectsData">
18 +
    <projectState path="$PROJECT_DIR$">
19 +
      <ProjectState />
20 +
    </projectState>
21 +
  </component>
22 +
  <component name="Git.Settings">
23 +
    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/rust-core" />
24 +
  </component>
25 +
  <component name="ProjectColorInfo">{
26 +
  &quot;associatedIndex&quot;: 1,
27 +
  &quot;fromUser&quot;: false
28 +
}</component>
29 +
  <component name="ProjectId" id="3K2yeIvqLCGD5BgH7WffEGHsEBo" />
30 +
  <component name="ProjectViewState">
31 +
    <option name="hideEmptyMiddlePackages" value="true" />
32 +
    <option name="showLibraryContents" value="true" />
33 +
  </component>
34 +
  <component name="PropertiesComponent"><![CDATA[{
35 +
  "keyToString": {
36 +
    "ModuleVcsDetector.initialDetectionPerformed": "true",
37 +
    "RunOnceActivity.ShowReadmeOnStart": "true",
38 +
    "RunOnceActivity.cidr.known.project.marker": "true",
39 +
    "RunOnceActivity.readMode.enableVisualFormatting": "true",
40 +
    "cf.first.check.clang-format": "false",
41 +
    "cidr.known.project.marker": "true",
42 +
    "git-widget-placeholder": "main",
43 +
    "kotlin-language-version-configured": "true",
44 +
    "last_opened_file_path": "/home/andymccall/development/oxygenhub-android",
45 +
    "settings.editor.selected.configurable": "AndroidSdkUpdater"
46 +
  }
47 +
}]]></component>
48 +
  <component name="RunManager">
49 +
    <configuration name="app" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
50 +
      <module name="OxygenHub.app" />
51 +
      <option name="ANDROID_RUN_CONFIGURATION_SCHEMA_VERSION" value="1" />
52 +
      <option name="DEPLOY" value="true" />
53 +
      <option name="DEPLOY_APK_FROM_BUNDLE" value="false" />
54 +
      <option name="DEPLOY_AS_INSTANT" value="false" />
55 +
      <option name="ARTIFACT_NAME" value="" />
56 +
      <option name="PM_INSTALL_OPTIONS" value="" />
57 +
      <option name="ALL_USERS" value="false" />
58 +
      <option name="ALWAYS_INSTALL_WITH_PM" value="false" />
59 +
      <option name="ALLOW_ASSUME_VERIFIED" value="false" />
60 +
      <option name="CLEAR_APP_STORAGE" value="false" />
61 +
      <option name="DYNAMIC_FEATURES_DISABLED_LIST" value="" />
62 +
      <option name="ACTIVITY_EXTRA_FLAGS" value="" />
63 +
      <option name="MODE" value="default_activity" />
64 +
      <option name="RESTORE_ENABLED" value="false" />
65 +
      <option name="RESTORE_FILE" value="" />
66 +
      <option name="RESTORE_FRESH_INSTALL_ONLY" value="false" />
67 +
      <option name="CLEAR_LOGCAT" value="false" />
68 +
      <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
69 +
      <option name="TARGET_SELECTION_MODE" value="DEVICE_AND_SNAPSHOT_COMBO_BOX" />
70 +
      <option name="DEBUGGER_TYPE" value="Auto" />
71 +
      <Auto>
72 +
        <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
73 +
        <option name="SHOW_STATIC_VARS" value="true" />
74 +
        <option name="WORKING_DIR" value="" />
75 +
        <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
76 +
        <option name="SHOW_OPTIMIZED_WARNING" value="true" />
77 +
        <option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
78 +
      </Auto>
79 +
      <Hybrid>
80 +
        <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
81 +
        <option name="SHOW_STATIC_VARS" value="true" />
82 +
        <option name="WORKING_DIR" value="" />
83 +
        <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
84 +
        <option name="SHOW_OPTIMIZED_WARNING" value="true" />
85 +
        <option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
86 +
      </Hybrid>
87 +
      <Java>
88 +
        <option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
89 +
      </Java>
90 +
      <Native>
91 +
        <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
92 +
        <option name="SHOW_STATIC_VARS" value="true" />
93 +
        <option name="WORKING_DIR" value="" />
94 +
        <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
95 +
        <option name="SHOW_OPTIMIZED_WARNING" value="true" />
96 +
        <option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
97 +
      </Native>
98 +
      <Profilers>
99 +
        <option name="ADVANCED_PROFILING_ENABLED" value="false" />
100 +
        <option name="STARTUP_PROFILING_ENABLED" value="false" />
101 +
        <option name="STARTUP_CPU_PROFILING_ENABLED" value="false" />
102 +
        <option name="STARTUP_CPU_PROFILING_CONFIGURATION_NAME" value="Java/Kotlin Method Trace" />
103 +
        <option name="STARTUP_NATIVE_MEMORY_PROFILING_ENABLED" value="false" />
104 +
        <option name="NATIVE_MEMORY_SAMPLE_RATE_BYTES" value="2048" />
105 +
      </Profilers>
106 +
      <option name="DEEP_LINK" value="" />
107 +
      <option name="ACTIVITY" value="" />
108 +
      <option name="ACTIVITY_CLASS" value="" />
109 +
      <option name="SEARCH_ACTIVITY_IN_GLOBAL_SCOPE" value="false" />
110 +
      <option name="SKIP_ACTIVITY_VALIDATION" value="false" />
111 +
      <method v="2">
112 +
        <option name="Android.Gradle.BeforeRunTask" enabled="true" />
113 +
      </method>
114 +
    </configuration>
115 +
  </component>
116 +
  <component name="TaskManager">
117 +
    <task active="true" id="Default" summary="Default task">
118 +
      <changelist id="31b5901e-d9de-4181-863a-67b67047c6fd" name="Changes" comment="" />
119 +
      <created>1790770053328</created>
120 +
      <option name="number" value="Default" />
121 +
      <option name="presentableId" value="Default" />
122 +
      <updated>1790770053328</updated>
123 +
    </task>
124 +
    <servers />
125 +
  </component>
126 +
</project>
added app/src/main/java/uniffi/rust_core/rust_core.kt +979 −0
1 +
// This file was autogenerated by some hot garbage in the `uniffi` crate.
2 +
// Trust me, you don't want to mess with it!
3 +
4 +
@file:Suppress("NAME_SHADOWING")
5 +
6 +
package uniffi.rust_core
7 +
8 +
// Common helper code.
9 +
//
10 +
// Ideally this would live in a separate .kt file where it can be unittested etc
11 +
// in isolation, and perhaps even published as a re-useable package.
12 +
//
13 +
// However, it's important that the details of how this helper code works (e.g. the
14 +
// way that different builtin types are passed across the FFI) exactly match what's
15 +
// expected by the Rust code on the other side of the interface. In practice right
16 +
// now that means coming from the exact some version of `uniffi` that was used to
17 +
// compile the Rust component. The easiest way to ensure this is to bundle the Kotlin
18 +
// helpers directly inline like we're doing here.
19 +
20 +
import com.sun.jna.Library
21 +
import com.sun.jna.IntegerType
22 +
import com.sun.jna.Native
23 +
import com.sun.jna.Pointer
24 +
import com.sun.jna.Structure
25 +
import com.sun.jna.Callback
26 +
import com.sun.jna.ptr.*
27 +
import java.nio.ByteBuffer
28 +
import java.nio.ByteOrder
29 +
import java.nio.CharBuffer
30 +
import java.nio.charset.CodingErrorAction
31 +
import java.util.concurrent.atomic.AtomicLong
32 +
import java.util.concurrent.ConcurrentHashMap
33 +
34 +
// This is a helper for safely working with byte buffers returned from the Rust code.
35 +
// A rust-owned buffer is represented by its capacity, its current length, and a
36 +
// pointer to the underlying data.
37 +
38 +
/**
39 +
 * @suppress
40 +
 */
41 +
@Structure.FieldOrder("capacity", "len", "data")
42 +
open class RustBuffer : Structure() {
43 +
    // Note: `capacity` and `len` are actually `ULong` values, but JVM only supports signed values.
44 +
    // When dealing with these fields, make sure to call `toULong()`.
45 +
    @JvmField var capacity: Long = 0
46 +
    @JvmField var len: Long = 0
47 +
    @JvmField var data: Pointer? = null
48 +
49 +
    class ByValue: RustBuffer(), Structure.ByValue
50 +
    class ByReference: RustBuffer(), Structure.ByReference
51 +
52 +
   internal fun setValue(other: RustBuffer) {
53 +
        capacity = other.capacity
54 +
        len = other.len
55 +
        data = other.data
56 +
    }
57 +
58 +
    companion object {
59 +
        internal fun alloc(size: ULong = 0UL) = uniffiRustCall() { status ->
60 +
            // Note: need to convert the size to a `Long` value to make this work with JVM.
61 +
            UniffiLib.INSTANCE.ffi_rust_core_rustbuffer_alloc(size.toLong(), status)
62 +
        }.also {
63 +
            if(it.data == null) {
64 +
               throw RuntimeException("RustBuffer.alloc() returned null data pointer (size=${size})")
65 +
           }
66 +
        }
67 +
68 +
        internal fun create(capacity: ULong, len: ULong, data: Pointer?): RustBuffer.ByValue {
69 +
            var buf = RustBuffer.ByValue()
70 +
            buf.capacity = capacity.toLong()
71 +
            buf.len = len.toLong()
72 +
            buf.data = data
73 +
            return buf
74 +
        }
75 +
76 +
        internal fun free(buf: RustBuffer.ByValue) = uniffiRustCall() { status ->
77 +
            UniffiLib.INSTANCE.ffi_rust_core_rustbuffer_free(buf, status)
78 +
        }
79 +
    }
80 +
81 +
    @Suppress("TooGenericExceptionThrown")
82 +
    fun asByteBuffer() =
83 +
        this.data?.getByteBuffer(0, this.len.toLong())?.also {
84 +
            it.order(ByteOrder.BIG_ENDIAN)
85 +
        }
86 +
}
87 +
88 +
/**
89 +
 * The equivalent of the `*mut RustBuffer` type.
90 +
 * Required for callbacks taking in an out pointer.
91 +
 *
92 +
 * Size is the sum of all values in the struct.
93 +
 *
94 +
 * @suppress
95 +
 */
96 +
class RustBufferByReference : ByReference(16) {
97 +
    /**
98 +
     * Set the pointed-to `RustBuffer` to the given value.
99 +
     */
100 +
    fun setValue(value: RustBuffer.ByValue) {
101 +
        // NOTE: The offsets are as they are in the C-like struct.
102 +
        val pointer = getPointer()
103 +
        pointer.setLong(0, value.capacity)
104 +
        pointer.setLong(8, value.len)
105 +
        pointer.setPointer(16, value.data)
106 +
    }
107 +
108 +
    /**
109 +
     * Get a `RustBuffer.ByValue` from this reference.
110 +
     */
111 +
    fun getValue(): RustBuffer.ByValue {
112 +
        val pointer = getPointer()
113 +
        val value = RustBuffer.ByValue()
114 +
        value.writeField("capacity", pointer.getLong(0))
115 +
        value.writeField("len", pointer.getLong(8))
116 +
        value.writeField("data", pointer.getLong(16))
117 +
118 +
        return value
119 +
    }
120 +
}
121 +
122 +
// This is a helper for safely passing byte references into the rust code.
123 +
// It's not actually used at the moment, because there aren't many things that you
124 +
// can take a direct pointer to in the JVM, and if we're going to copy something
125 +
// then we might as well copy it into a `RustBuffer`. But it's here for API
126 +
// completeness.
127 +
128 +
@Structure.FieldOrder("len", "data")
129 +
internal open class ForeignBytes : Structure() {
130 +
    @JvmField var len: Int = 0
131 +
    @JvmField var data: Pointer? = null
132 +
133 +
    class ByValue : ForeignBytes(), Structure.ByValue
134 +
}
135 +
/**
136 +
 * The FfiConverter interface handles converter types to and from the FFI
137 +
 *
138 +
 * All implementing objects should be public to support external types.  When a
139 +
 * type is external we need to import it's FfiConverter.
140 +
 *
141 +
 * @suppress
142 +
 */
143 +
public interface FfiConverter<KotlinType, FfiType> {
144 +
    // Convert an FFI type to a Kotlin type
145 +
    fun lift(value: FfiType): KotlinType
146 +
147 +
    // Convert an Kotlin type to an FFI type
148 +
    fun lower(value: KotlinType): FfiType
149 +
150 +
    // Read a Kotlin type from a `ByteBuffer`
151 +
    fun read(buf: ByteBuffer): KotlinType
152 +
153 +
    // Calculate bytes to allocate when creating a `RustBuffer`
154 +
    //
155 +
    // This must return at least as many bytes as the write() function will
156 +
    // write. It can return more bytes than needed, for example when writing
157 +
    // Strings we can't know the exact bytes needed until we the UTF-8
158 +
    // encoding, so we pessimistically allocate the largest size possible (3
159 +
    // bytes per codepoint).  Allocating extra bytes is not really a big deal
160 +
    // because the `RustBuffer` is short-lived.
161 +
    fun allocationSize(value: KotlinType): ULong
162 +
163 +
    // Write a Kotlin type to a `ByteBuffer`
164 +
    fun write(value: KotlinType, buf: ByteBuffer)
165 +
166 +
    // Lower a value into a `RustBuffer`
167 +
    //
168 +
    // This method lowers a value into a `RustBuffer` rather than the normal
169 +
    // FfiType.  It's used by the callback interface code.  Callback interface
170 +
    // returns are always serialized into a `RustBuffer` regardless of their
171 +
    // normal FFI type.
172 +
    fun lowerIntoRustBuffer(value: KotlinType): RustBuffer.ByValue {
173 +
        val rbuf = RustBuffer.alloc(allocationSize(value))
174 +
        try {
175 +
            val bbuf = rbuf.data!!.getByteBuffer(0, rbuf.capacity).also {
176 +
                it.order(ByteOrder.BIG_ENDIAN)
177 +
            }
178 +
            write(value, bbuf)
179 +
            rbuf.writeField("len", bbuf.position().toLong())
180 +
            return rbuf
181 +
        } catch (e: Throwable) {
182 +
            RustBuffer.free(rbuf)
183 +
            throw e
184 +
        }
185 +
    }
186 +
187 +
    // Lift a value from a `RustBuffer`.
188 +
    //
189 +
    // This here mostly because of the symmetry with `lowerIntoRustBuffer()`.
190 +
    // It's currently only used by the `FfiConverterRustBuffer` class below.
191 +
    fun liftFromRustBuffer(rbuf: RustBuffer.ByValue): KotlinType {
192 +
        val byteBuf = rbuf.asByteBuffer()!!
193 +
        try {
194 +
           val item = read(byteBuf)
195 +
           if (byteBuf.hasRemaining()) {
196 +
               throw RuntimeException("junk remaining in buffer after lifting, something is very wrong!!")
197 +
           }
198 +
           return item
199 +
        } finally {
200 +
            RustBuffer.free(rbuf)
201 +
        }
202 +
    }
203 +
}
204 +
205 +
/**
206 +
 * FfiConverter that uses `RustBuffer` as the FfiType
207 +
 *
208 +
 * @suppress
209 +
 */
210 +
public interface FfiConverterRustBuffer<KotlinType>: FfiConverter<KotlinType, RustBuffer.ByValue> {
211 +
    override fun lift(value: RustBuffer.ByValue) = liftFromRustBuffer(value)
212 +
    override fun lower(value: KotlinType) = lowerIntoRustBuffer(value)
213 +
}
214 +
// A handful of classes and functions to support the generated data structures.
215 +
// This would be a good candidate for isolating in its own ffi-support lib.
216 +
217 +
internal const val UNIFFI_CALL_SUCCESS = 0.toByte()
218 +
internal const val UNIFFI_CALL_ERROR = 1.toByte()
219 +
internal const val UNIFFI_CALL_UNEXPECTED_ERROR = 2.toByte()
220 +
221 +
@Structure.FieldOrder("code", "error_buf")
222 +
internal open class UniffiRustCallStatus : Structure() {
223 +
    @JvmField var code: Byte = 0
224 +
    @JvmField var error_buf: RustBuffer.ByValue = RustBuffer.ByValue()
225 +
226 +
    class ByValue: UniffiRustCallStatus(), Structure.ByValue
227 +
228 +
    fun isSuccess(): Boolean {
229 +
        return code == UNIFFI_CALL_SUCCESS
230 +
    }
231 +
232 +
    fun isError(): Boolean {
233 +
        return code == UNIFFI_CALL_ERROR
234 +
    }
235 +
236 +
    fun isPanic(): Boolean {
237 +
        return code == UNIFFI_CALL_UNEXPECTED_ERROR
238 +
    }
239 +
240 +
    companion object {
241 +
        fun create(code: Byte, errorBuf: RustBuffer.ByValue): UniffiRustCallStatus.ByValue {
242 +
            val callStatus = UniffiRustCallStatus.ByValue()
243 +
            callStatus.code = code
244 +
            callStatus.error_buf = errorBuf
245 +
            return callStatus
246 +
        }
247 +
    }
248 +
}
249 +
250 +
class InternalException(message: String) : kotlin.Exception(message)
251 +
252 +
/**
253 +
 * Each top-level error class has a companion object that can lift the error from the call status's rust buffer
254 +
 *
255 +
 * @suppress
256 +
 */
257 +
interface UniffiRustCallStatusErrorHandler<E> {
258 +
    fun lift(error_buf: RustBuffer.ByValue): E;
259 +
}
260 +
261 +
// Helpers for calling Rust
262 +
// In practice we usually need to be synchronized to call this safely, so it doesn't
263 +
// synchronize itself
264 +
265 +
// Call a rust function that returns a Result<>.  Pass in the Error class companion that corresponds to the Err
266 +
private inline fun <U, E: kotlin.Exception> uniffiRustCallWithError(errorHandler: UniffiRustCallStatusErrorHandler<E>, callback: (UniffiRustCallStatus) -> U): U {
267 +
    var status = UniffiRustCallStatus()
268 +
    val return_value = callback(status)
269 +
    uniffiCheckCallStatus(errorHandler, status)
270 +
    return return_value
271 +
}
272 +
273 +
// Check UniffiRustCallStatus and throw an error if the call wasn't successful
274 +
private fun<E: kotlin.Exception> uniffiCheckCallStatus(errorHandler: UniffiRustCallStatusErrorHandler<E>, status: UniffiRustCallStatus) {
275 +
    if (status.isSuccess()) {
276 +
        return
277 +
    } else if (status.isError()) {
278 +
        throw errorHandler.lift(status.error_buf)
279 +
    } else if (status.isPanic()) {
280 +
        // when the rust code sees a panic, it tries to construct a rustbuffer
281 +
        // with the message.  but if that code panics, then it just sends back
282 +
        // an empty buffer.
283 +
        if (status.error_buf.len > 0) {
284 +
            throw InternalException(FfiConverterString.lift(status.error_buf))
285 +
        } else {
286 +
            throw InternalException("Rust panic")
287 +
        }
288 +
    } else {
289 +
        throw InternalException("Unknown rust call status: $status.code")
290 +
    }
291 +
}
292 +
293 +
/**
294 +
 * UniffiRustCallStatusErrorHandler implementation for times when we don't expect a CALL_ERROR
295 +
 *
296 +
 * @suppress
297 +
 */
298 +
object UniffiNullRustCallStatusErrorHandler: UniffiRustCallStatusErrorHandler<InternalException> {
299 +
    override fun lift(error_buf: RustBuffer.ByValue): InternalException {
300 +
        RustBuffer.free(error_buf)
301 +
        return InternalException("Unexpected CALL_ERROR")
302 +
    }
303 +
}
304 +
305 +
// Call a rust function that returns a plain value
306 +
private inline fun <U> uniffiRustCall(callback: (UniffiRustCallStatus) -> U): U {
307 +
    return uniffiRustCallWithError(UniffiNullRustCallStatusErrorHandler, callback)
308 +
}
309 +
310 +
internal inline fun<T> uniffiTraitInterfaceCall(
311 +
    callStatus: UniffiRustCallStatus,
312 +
    makeCall: () -> T,
313 +
    writeReturn: (T) -> Unit,
314 +
) {
315 +
    try {
316 +
        writeReturn(makeCall())
317 +
    } catch(e: kotlin.Exception) {
318 +
        callStatus.code = UNIFFI_CALL_UNEXPECTED_ERROR
319 +
        callStatus.error_buf = FfiConverterString.lower(e.toString())
320 +
    }
321 +
}
322 +
323 +
internal inline fun<T, reified E: Throwable> uniffiTraitInterfaceCallWithError(
324 +
    callStatus: UniffiRustCallStatus,
325 +
    makeCall: () -> T,
326 +
    writeReturn: (T) -> Unit,
327 +
    lowerError: (E) -> RustBuffer.ByValue
328 +
) {
329 +
    try {
330 +
        writeReturn(makeCall())
331 +
    } catch(e: kotlin.Exception) {
332 +
        if (e is E) {
333 +
            callStatus.code = UNIFFI_CALL_ERROR
334 +
            callStatus.error_buf = lowerError(e)
335 +
        } else {
336 +
            callStatus.code = UNIFFI_CALL_UNEXPECTED_ERROR
337 +
            callStatus.error_buf = FfiConverterString.lower(e.toString())
338 +
        }
339 +
    }
340 +
}
341 +
// Map handles to objects
342 +
//
343 +
// This is used pass an opaque 64-bit handle representing a foreign object to the Rust code.
344 +
internal class UniffiHandleMap<T: Any> {
345 +
    private val map = ConcurrentHashMap<Long, T>()
346 +
    private val counter = java.util.concurrent.atomic.AtomicLong(0)
347 +
348 +
    val size: Int
349 +
        get() = map.size
350 +
351 +
    // Insert a new object into the handle map and get a handle for it
352 +
    fun insert(obj: T): Long {
353 +
        val handle = counter.getAndAdd(1)
354 +
        map.put(handle, obj)
355 +
        return handle
356 +
    }
357 +
358 +
    // Get an object from the handle map
359 +
    fun get(handle: Long): T {
360 +
        return map.get(handle) ?: throw InternalException("UniffiHandleMap.get: Invalid handle")
361 +
    }
362 +
363 +
    // Remove an entry from the handlemap and get the Kotlin object back
364 +
    fun remove(handle: Long): T {
365 +
        return map.remove(handle) ?: throw InternalException("UniffiHandleMap: Invalid handle")
366 +
    }
367 +
}
368 +
369 +
// Contains loading, initialization code,
370 +
// and the FFI Function declarations in a com.sun.jna.Library.
371 +
@Synchronized
372 +
private fun findLibraryName(componentName: String): String {
373 +
    val libOverride = System.getProperty("uniffi.component.$componentName.libraryOverride")
374 +
    if (libOverride != null) {
375 +
        return libOverride
376 +
    }
377 +
    return "rust_core"
378 +
}
379 +
380 +
private inline fun <reified Lib : Library> loadIndirect(
381 +
    componentName: String
382 +
): Lib {
383 +
    return Native.load<Lib>(findLibraryName(componentName), Lib::class.java)
384 +
}
385 +
386 +
// Define FFI callback types
387 +
internal interface UniffiRustFutureContinuationCallback : com.sun.jna.Callback {
388 +
    fun callback(`data`: Long,`pollResult`: Byte,)
389 +
}
390 +
internal interface UniffiForeignFutureFree : com.sun.jna.Callback {
391 +
    fun callback(`handle`: Long,)
392 +
}
393 +
internal interface UniffiCallbackInterfaceFree : com.sun.jna.Callback {
394 +
    fun callback(`handle`: Long,)
395 +
}
396 +
@Structure.FieldOrder("handle", "free")
397 +
internal open class UniffiForeignFuture(
398 +
    @JvmField internal var `handle`: Long = 0.toLong(),
399 +
    @JvmField internal var `free`: UniffiForeignFutureFree? = null,
400 +
) : Structure() {
401 +
    class UniffiByValue(
402 +
        `handle`: Long = 0.toLong(),
403 +
        `free`: UniffiForeignFutureFree? = null,
404 +
    ): UniffiForeignFuture(`handle`,`free`,), Structure.ByValue
405 +
406 +
   internal fun uniffiSetValue(other: UniffiForeignFuture) {
407 +
        `handle` = other.`handle`
408 +
        `free` = other.`free`
409 +
    }
410 +
411 +
}
412 +
@Structure.FieldOrder("returnValue", "callStatus")
413 +
internal open class UniffiForeignFutureStructU8(
414 +
    @JvmField internal var `returnValue`: Byte = 0.toByte(),
415 +
    @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
416 +
) : Structure() {
417 +
    class UniffiByValue(
418 +
        `returnValue`: Byte = 0.toByte(),
419 +
        `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
420 +
    ): UniffiForeignFutureStructU8(`returnValue`,`callStatus`,), Structure.ByValue
421 +
422 +
   internal fun uniffiSetValue(other: UniffiForeignFutureStructU8) {
423 +
        `returnValue` = other.`returnValue`
424 +
        `callStatus` = other.`callStatus`
425 +
    }
426 +
427 +
}
428 +
internal interface UniffiForeignFutureCompleteU8 : com.sun.jna.Callback {
429 +
    fun callback(`callbackData`: Long,`result`: UniffiForeignFutureStructU8.UniffiByValue,)
430 +
}
431 +
@Structure.FieldOrder("returnValue", "callStatus")
432 +
internal open class UniffiForeignFutureStructI8(
433 +
    @JvmField internal var `returnValue`: Byte = 0.toByte(),
434 +
    @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
435 +
) : Structure() {
436 +
    class UniffiByValue(
437 +
        `returnValue`: Byte = 0.toByte(),
438 +
        `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
439 +
    ): UniffiForeignFutureStructI8(`returnValue`,`callStatus`,), Structure.ByValue
440 +
441 +
   internal fun uniffiSetValue(other: UniffiForeignFutureStructI8) {
442 +
        `returnValue` = other.`returnValue`
443 +
        `callStatus` = other.`callStatus`
444 +
    }
445 +
446 +
}
447 +
internal interface UniffiForeignFutureCompleteI8 : com.sun.jna.Callback {
448 +
    fun callback(`callbackData`: Long,`result`: UniffiForeignFutureStructI8.UniffiByValue,)
449 +
}
450 +
@Structure.FieldOrder("returnValue", "callStatus")
451 +
internal open class UniffiForeignFutureStructU16(
452 +
    @JvmField internal var `returnValue`: Short = 0.toShort(),
453 +
    @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
454 +
) : Structure() {
455 +
    class UniffiByValue(
456 +
        `returnValue`: Short = 0.toShort(),
457 +
        `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
458 +
    ): UniffiForeignFutureStructU16(`returnValue`,`callStatus`,), Structure.ByValue
459 +
460 +
   internal fun uniffiSetValue(other: UniffiForeignFutureStructU16) {
461 +
        `returnValue` = other.`returnValue`
462 +
        `callStatus` = other.`callStatus`
463 +
    }
464 +
465 +
}
466 +
internal interface UniffiForeignFutureCompleteU16 : com.sun.jna.Callback {
467 +
    fun callback(`callbackData`: Long,`result`: UniffiForeignFutureStructU16.UniffiByValue,)
468 +
}
469 +
@Structure.FieldOrder("returnValue", "callStatus")
470 +
internal open class UniffiForeignFutureStructI16(
471 +
    @JvmField internal var `returnValue`: Short = 0.toShort(),
472 +
    @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
473 +
) : Structure() {
474 +
    class UniffiByValue(
475 +
        `returnValue`: Short = 0.toShort(),
476 +
        `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
477 +
    ): UniffiForeignFutureStructI16(`returnValue`,`callStatus`,), Structure.ByValue
478 +
479 +
   internal fun uniffiSetValue(other: UniffiForeignFutureStructI16) {
480 +
        `returnValue` = other.`returnValue`
481 +
        `callStatus` = other.`callStatus`
482 +
    }
483 +
484 +
}
485 +
internal interface UniffiForeignFutureCompleteI16 : com.sun.jna.Callback {
486 +
    fun callback(`callbackData`: Long,`result`: UniffiForeignFutureStructI16.UniffiByValue,)
487 +
}
488 +
@Structure.FieldOrder("returnValue", "callStatus")
489 +
internal open class UniffiForeignFutureStructU32(
490 +
    @JvmField internal var `returnValue`: Int = 0,
491 +
    @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
492 +
) : Structure() {
493 +
    class UniffiByValue(
494 +
        `returnValue`: Int = 0,
495 +
        `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
496 +
    ): UniffiForeignFutureStructU32(`returnValue`,`callStatus`,), Structure.ByValue
497 +
498 +
   internal fun uniffiSetValue(other: UniffiForeignFutureStructU32) {
499 +
        `returnValue` = other.`returnValue`
500 +
        `callStatus` = other.`callStatus`
501 +
    }
502 +
503 +
}
504 +
internal interface UniffiForeignFutureCompleteU32 : com.sun.jna.Callback {
505 +
    fun callback(`callbackData`: Long,`result`: UniffiForeignFutureStructU32.UniffiByValue,)
506 +
}
507 +
@Structure.FieldOrder("returnValue", "callStatus")
508 +
internal open class UniffiForeignFutureStructI32(
509 +
    @JvmField internal var `returnValue`: Int = 0,
510 +
    @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
511 +
) : Structure() {
512 +
    class UniffiByValue(
513 +
        `returnValue`: Int = 0,
514 +
        `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
515 +
    ): UniffiForeignFutureStructI32(`returnValue`,`callStatus`,), Structure.ByValue
516 +
517 +
   internal fun uniffiSetValue(other: UniffiForeignFutureStructI32) {
518 +
        `returnValue` = other.`returnValue`
519 +
        `callStatus` = other.`callStatus`
520 +
    }
521 +
522 +
}
523 +
internal interface UniffiForeignFutureCompleteI32 : com.sun.jna.Callback {
524 +
    fun callback(`callbackData`: Long,`result`: UniffiForeignFutureStructI32.UniffiByValue,)
525 +
}
526 +
@Structure.FieldOrder("returnValue", "callStatus")
527 +
internal open class UniffiForeignFutureStructU64(
528 +
    @JvmField internal var `returnValue`: Long = 0.toLong(),
529 +
    @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
530 +
) : Structure() {
531 +
    class UniffiByValue(
532 +
        `returnValue`: Long = 0.toLong(),
533 +
        `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
534 +
    ): UniffiForeignFutureStructU64(`returnValue`,`callStatus`,), Structure.ByValue
535 +
536 +
   internal fun uniffiSetValue(other: UniffiForeignFutureStructU64) {
537 +
        `returnValue` = other.`returnValue`
538 +
        `callStatus` = other.`callStatus`
539 +
    }
540 +
541 +
}
542 +
internal interface UniffiForeignFutureCompleteU64 : com.sun.jna.Callback {
543 +
    fun callback(`callbackData`: Long,`result`: UniffiForeignFutureStructU64.UniffiByValue,)
544 +
}
545 +
@Structure.FieldOrder("returnValue", "callStatus")
546 +
internal open class UniffiForeignFutureStructI64(
547 +
    @JvmField internal var `returnValue`: Long = 0.toLong(),
548 +
    @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
549 +
) : Structure() {
550 +
    class UniffiByValue(
551 +
        `returnValue`: Long = 0.toLong(),
552 +
        `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
553 +
    ): UniffiForeignFutureStructI64(`returnValue`,`callStatus`,), Structure.ByValue
554 +
555 +
   internal fun uniffiSetValue(other: UniffiForeignFutureStructI64) {
556 +
        `returnValue` = other.`returnValue`
557 +
        `callStatus` = other.`callStatus`
558 +
    }
559 +
560 +
}
561 +
internal interface UniffiForeignFutureCompleteI64 : com.sun.jna.Callback {
562 +
    fun callback(`callbackData`: Long,`result`: UniffiForeignFutureStructI64.UniffiByValue,)
563 +
}
564 +
@Structure.FieldOrder("returnValue", "callStatus")
565 +
internal open class UniffiForeignFutureStructF32(
566 +
    @JvmField internal var `returnValue`: Float = 0.0f,
567 +
    @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
568 +
) : Structure() {
569 +
    class UniffiByValue(
570 +
        `returnValue`: Float = 0.0f,
571 +
        `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
572 +
    ): UniffiForeignFutureStructF32(`returnValue`,`callStatus`,), Structure.ByValue
573 +
574 +
   internal fun uniffiSetValue(other: UniffiForeignFutureStructF32) {
575 +
        `returnValue` = other.`returnValue`
576 +
        `callStatus` = other.`callStatus`
577 +
    }
578 +
579 +
}
580 +
internal interface UniffiForeignFutureCompleteF32 : com.sun.jna.Callback {
581 +
    fun callback(`callbackData`: Long,`result`: UniffiForeignFutureStructF32.UniffiByValue,)
582 +
}
583 +
@Structure.FieldOrder("returnValue", "callStatus")
584 +
internal open class UniffiForeignFutureStructF64(
585 +
    @JvmField internal var `returnValue`: Double = 0.0,
586 +
    @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
587 +
) : Structure() {
588 +
    class UniffiByValue(
589 +
        `returnValue`: Double = 0.0,
590 +
        `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
591 +
    ): UniffiForeignFutureStructF64(`returnValue`,`callStatus`,), Structure.ByValue
592 +
593 +
   internal fun uniffiSetValue(other: UniffiForeignFutureStructF64) {
594 +
        `returnValue` = other.`returnValue`
595 +
        `callStatus` = other.`callStatus`
596 +
    }
597 +
598 +
}
599 +
internal interface UniffiForeignFutureCompleteF64 : com.sun.jna.Callback {
600 +
    fun callback(`callbackData`: Long,`result`: UniffiForeignFutureStructF64.UniffiByValue,)
601 +
}
602 +
@Structure.FieldOrder("returnValue", "callStatus")
603 +
internal open class UniffiForeignFutureStructPointer(
604 +
    @JvmField internal var `returnValue`: Pointer = Pointer.NULL,
605 +
    @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
606 +
) : Structure() {
607 +
    class UniffiByValue(
608 +
        `returnValue`: Pointer = Pointer.NULL,
609 +
        `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
610 +
    ): UniffiForeignFutureStructPointer(`returnValue`,`callStatus`,), Structure.ByValue
611 +
612 +
   internal fun uniffiSetValue(other: UniffiForeignFutureStructPointer) {
613 +
        `returnValue` = other.`returnValue`
614 +
        `callStatus` = other.`callStatus`
615 +
    }
616 +
617 +
}
618 +
internal interface UniffiForeignFutureCompletePointer : com.sun.jna.Callback {
619 +
    fun callback(`callbackData`: Long,`result`: UniffiForeignFutureStructPointer.UniffiByValue,)
620 +
}
621 +
@Structure.FieldOrder("returnValue", "callStatus")
622 +
internal open class UniffiForeignFutureStructRustBuffer(
623 +
    @JvmField internal var `returnValue`: RustBuffer.ByValue = RustBuffer.ByValue(),
624 +
    @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
625 +
) : Structure() {
626 +
    class UniffiByValue(
627 +
        `returnValue`: RustBuffer.ByValue = RustBuffer.ByValue(),
628 +
        `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
629 +
    ): UniffiForeignFutureStructRustBuffer(`returnValue`,`callStatus`,), Structure.ByValue
630 +
631 +
   internal fun uniffiSetValue(other: UniffiForeignFutureStructRustBuffer) {
632 +
        `returnValue` = other.`returnValue`
633 +
        `callStatus` = other.`callStatus`
634 +
    }
635 +
636 +
}
637 +
internal interface UniffiForeignFutureCompleteRustBuffer : com.sun.jna.Callback {
638 +
    fun callback(`callbackData`: Long,`result`: UniffiForeignFutureStructRustBuffer.UniffiByValue,)
639 +
}
640 +
@Structure.FieldOrder("callStatus")
641 +
internal open class UniffiForeignFutureStructVoid(
642 +
    @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
643 +
) : Structure() {
644 +
    class UniffiByValue(
645 +
        `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(),
646 +
    ): UniffiForeignFutureStructVoid(`callStatus`,), Structure.ByValue
647 +
648 +
   internal fun uniffiSetValue(other: UniffiForeignFutureStructVoid) {
649 +
        `callStatus` = other.`callStatus`
650 +
    }
651 +
652 +
}
653 +
internal interface UniffiForeignFutureCompleteVoid : com.sun.jna.Callback {
654 +
    fun callback(`callbackData`: Long,`result`: UniffiForeignFutureStructVoid.UniffiByValue,)
655 +
}
656 +
657 +
658 +
659 +
660 +
661 +
662 +
663 +
664 +
665 +
666 +
667 +
668 +
669 +
670 +
671 +
672 +
673 +
674 +
675 +
676 +
677 +
678 +
679 +
680 +
681 +
682 +
683 +
684 +
685 +
686 +
687 +
688 +
689 +
690 +
691 +
692 +
693 +
694 +
695 +
696 +
697 +
698 +
699 +
700 +
701 +
702 +
703 +
704 +
705 +
706 +
707 +
708 +
709 +
710 +
711 +
712 +
713 +
714 +
715 +
716 +
// A JNA Library to expose the extern-C FFI definitions.
717 +
// This is an implementation detail which will be called internally by the public API.
718 +
719 +
internal interface UniffiLib : Library {
720 +
    companion object {
721 +
        internal val INSTANCE: UniffiLib by lazy {
722 +
            loadIndirect<UniffiLib>(componentName = "rust_core")
723 +
            .also { lib: UniffiLib ->
724 +
                uniffiCheckContractApiVersion(lib)
725 +
                uniffiCheckApiChecksums(lib)
726 +
                }
727 +
        }
728 +
        
729 +
    }
730 +
731 +
    fun uniffi_rust_core_fn_func_oxygen_greeting(`name`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus, 
732 +
    ): RustBuffer.ByValue
733 +
    fun ffi_rust_core_rustbuffer_alloc(`size`: Long,uniffi_out_err: UniffiRustCallStatus, 
734 +
    ): RustBuffer.ByValue
735 +
    fun ffi_rust_core_rustbuffer_from_bytes(`bytes`: ForeignBytes.ByValue,uniffi_out_err: UniffiRustCallStatus, 
736 +
    ): RustBuffer.ByValue
737 +
    fun ffi_rust_core_rustbuffer_free(`buf`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus, 
738 +
    ): Unit
739 +
    fun ffi_rust_core_rustbuffer_reserve(`buf`: RustBuffer.ByValue,`additional`: Long,uniffi_out_err: UniffiRustCallStatus, 
740 +
    ): RustBuffer.ByValue
741 +
    fun ffi_rust_core_rust_future_poll_u8(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long,
742 +
    ): Unit
743 +
    fun ffi_rust_core_rust_future_cancel_u8(`handle`: Long,
744 +
    ): Unit
745 +
    fun ffi_rust_core_rust_future_free_u8(`handle`: Long,
746 +
    ): Unit
747 +
    fun ffi_rust_core_rust_future_complete_u8(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, 
748 +
    ): Byte
749 +
    fun ffi_rust_core_rust_future_poll_i8(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long,
750 +
    ): Unit
751 +
    fun ffi_rust_core_rust_future_cancel_i8(`handle`: Long,
752 +
    ): Unit
753 +
    fun ffi_rust_core_rust_future_free_i8(`handle`: Long,
754 +
    ): Unit
755 +
    fun ffi_rust_core_rust_future_complete_i8(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, 
756 +
    ): Byte
757 +
    fun ffi_rust_core_rust_future_poll_u16(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long,
758 +
    ): Unit
759 +
    fun ffi_rust_core_rust_future_cancel_u16(`handle`: Long,
760 +
    ): Unit
761 +
    fun ffi_rust_core_rust_future_free_u16(`handle`: Long,
762 +
    ): Unit
763 +
    fun ffi_rust_core_rust_future_complete_u16(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, 
764 +
    ): Short
765 +
    fun ffi_rust_core_rust_future_poll_i16(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long,
766 +
    ): Unit
767 +
    fun ffi_rust_core_rust_future_cancel_i16(`handle`: Long,
768 +
    ): Unit
769 +
    fun ffi_rust_core_rust_future_free_i16(`handle`: Long,
770 +
    ): Unit
771 +
    fun ffi_rust_core_rust_future_complete_i16(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, 
772 +
    ): Short
773 +
    fun ffi_rust_core_rust_future_poll_u32(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long,
774 +
    ): Unit
775 +
    fun ffi_rust_core_rust_future_cancel_u32(`handle`: Long,
776 +
    ): Unit
777 +
    fun ffi_rust_core_rust_future_free_u32(`handle`: Long,
778 +
    ): Unit
779 +
    fun ffi_rust_core_rust_future_complete_u32(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, 
780 +
    ): Int
781 +
    fun ffi_rust_core_rust_future_poll_i32(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long,
782 +
    ): Unit
783 +
    fun ffi_rust_core_rust_future_cancel_i32(`handle`: Long,
784 +
    ): Unit
785 +
    fun ffi_rust_core_rust_future_free_i32(`handle`: Long,
786 +
    ): Unit
787 +
    fun ffi_rust_core_rust_future_complete_i32(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, 
788 +
    ): Int
789 +
    fun ffi_rust_core_rust_future_poll_u64(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long,
790 +
    ): Unit
791 +
    fun ffi_rust_core_rust_future_cancel_u64(`handle`: Long,
792 +
    ): Unit
793 +
    fun ffi_rust_core_rust_future_free_u64(`handle`: Long,
794 +
    ): Unit
795 +
    fun ffi_rust_core_rust_future_complete_u64(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, 
796 +
    ): Long
797 +
    fun ffi_rust_core_rust_future_poll_i64(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long,
798 +
    ): Unit
799 +
    fun ffi_rust_core_rust_future_cancel_i64(`handle`: Long,
800 +
    ): Unit
801 +
    fun ffi_rust_core_rust_future_free_i64(`handle`: Long,
802 +
    ): Unit
803 +
    fun ffi_rust_core_rust_future_complete_i64(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, 
804 +
    ): Long
805 +
    fun ffi_rust_core_rust_future_poll_f32(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long,
806 +
    ): Unit
807 +
    fun ffi_rust_core_rust_future_cancel_f32(`handle`: Long,
808 +
    ): Unit
809 +
    fun ffi_rust_core_rust_future_free_f32(`handle`: Long,
810 +
    ): Unit
811 +
    fun ffi_rust_core_rust_future_complete_f32(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, 
812 +
    ): Float
813 +
    fun ffi_rust_core_rust_future_poll_f64(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long,
814 +
    ): Unit
815 +
    fun ffi_rust_core_rust_future_cancel_f64(`handle`: Long,
816 +
    ): Unit
817 +
    fun ffi_rust_core_rust_future_free_f64(`handle`: Long,
818 +
    ): Unit
819 +
    fun ffi_rust_core_rust_future_complete_f64(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, 
820 +
    ): Double
821 +
    fun ffi_rust_core_rust_future_poll_pointer(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long,
822 +
    ): Unit
823 +
    fun ffi_rust_core_rust_future_cancel_pointer(`handle`: Long,
824 +
    ): Unit
825 +
    fun ffi_rust_core_rust_future_free_pointer(`handle`: Long,
826 +
    ): Unit
827 +
    fun ffi_rust_core_rust_future_complete_pointer(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, 
828 +
    ): Pointer
829 +
    fun ffi_rust_core_rust_future_poll_rust_buffer(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long,
830 +
    ): Unit
831 +
    fun ffi_rust_core_rust_future_cancel_rust_buffer(`handle`: Long,
832 +
    ): Unit
833 +
    fun ffi_rust_core_rust_future_free_rust_buffer(`handle`: Long,
834 +
    ): Unit
835 +
    fun ffi_rust_core_rust_future_complete_rust_buffer(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, 
836 +
    ): RustBuffer.ByValue
837 +
    fun ffi_rust_core_rust_future_poll_void(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long,
838 +
    ): Unit
839 +
    fun ffi_rust_core_rust_future_cancel_void(`handle`: Long,
840 +
    ): Unit
841 +
    fun ffi_rust_core_rust_future_free_void(`handle`: Long,
842 +
    ): Unit
843 +
    fun ffi_rust_core_rust_future_complete_void(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, 
844 +
    ): Unit
845 +
    fun uniffi_rust_core_checksum_func_oxygen_greeting(
846 +
    ): Short
847 +
    fun ffi_rust_core_uniffi_contract_version(
848 +
    ): Int
849 +
    
850 +
}
851 +
852 +
private fun uniffiCheckContractApiVersion(lib: UniffiLib) {
853 +
    // Get the bindings contract version from our ComponentInterface
854 +
    val bindings_contract_version = 26
855 +
    // Get the scaffolding contract version by calling the into the dylib
856 +
    val scaffolding_contract_version = lib.ffi_rust_core_uniffi_contract_version()
857 +
    if (bindings_contract_version != scaffolding_contract_version) {
858 +
        throw RuntimeException("UniFFI contract version mismatch: try cleaning and rebuilding your project")
859 +
    }
860 +
}
861 +
862 +
@Suppress("UNUSED_PARAMETER")
863 +
private fun uniffiCheckApiChecksums(lib: UniffiLib) {
864 +
    if (lib.uniffi_rust_core_checksum_func_oxygen_greeting() != 8799.toShort()) {
865 +
        throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
866 +
    }
867 +
}
868 +
869 +
// Async support
870 +
871 +
// Public interface members begin here.
872 +
873 +
874 +
// Interface implemented by anything that can contain an object reference.
875 +
//
876 +
// Such types expose a `destroy()` method that must be called to cleanly
877 +
// dispose of the contained objects. Failure to call this method may result
878 +
// in memory leaks.
879 +
//
880 +
// The easiest way to ensure this method is called is to use the `.use`
881 +
// helper method to execute a block and destroy the object at the end.
882 +
interface Disposable {
883 +
    fun destroy()
884 +
    companion object {
885 +
        fun destroy(vararg args: Any?) {
886 +
            args.filterIsInstance<Disposable>()
887 +
                .forEach(Disposable::destroy)
888 +
        }
889 +
    }
890 +
}
891 +
892 +
/**
893 +
 * @suppress
894 +
 */
895 +
inline fun <T : Disposable?, R> T.use(block: (T) -> R) =
896 +
    try {
897 +
        block(this)
898 +
    } finally {
899 +
        try {
900 +
            // N.B. our implementation is on the nullable type `Disposable?`.
901 +
            this?.destroy()
902 +
        } catch (e: Throwable) {
903 +
            // swallow
904 +
        }
905 +
    }
906 +
907 +
/** 
908 +
 * Used to instantiate an interface without an actual pointer, for fakes in tests, mostly.
909 +
 *
910 +
 * @suppress
911 +
 * */
912 +
object NoPointer
913 +
914 +
/**
915 +
 * @suppress
916 +
 */
917 +
public object FfiConverterString: FfiConverter<String, RustBuffer.ByValue> {
918 +
    // Note: we don't inherit from FfiConverterRustBuffer, because we use a
919 +
    // special encoding when lowering/lifting.  We can use `RustBuffer.len` to
920 +
    // store our length and avoid writing it out to the buffer.
921 +
    override fun lift(value: RustBuffer.ByValue): String {
922 +
        try {
923 +
            val byteArr = ByteArray(value.len.toInt())
924 +
            value.asByteBuffer()!!.get(byteArr)
925 +
            return byteArr.toString(Charsets.UTF_8)
926 +
        } finally {
927 +
            RustBuffer.free(value)
928 +
        }
929 +
    }
930 +
931 +
    override fun read(buf: ByteBuffer): String {
932 +
        val len = buf.getInt()
933 +
        val byteArr = ByteArray(len)
934 +
        buf.get(byteArr)
935 +
        return byteArr.toString(Charsets.UTF_8)
936 +
    }
937 +
938 +
    fun toUtf8(value: String): ByteBuffer {
939 +
        // Make sure we don't have invalid UTF-16, check for lone surrogates.
940 +
        return Charsets.UTF_8.newEncoder().run {
941 +
            onMalformedInput(CodingErrorAction.REPORT)
942 +
            encode(CharBuffer.wrap(value))
943 +
        }
944 +
    }
945 +
946 +
    override fun lower(value: String): RustBuffer.ByValue {
947 +
        val byteBuf = toUtf8(value)
948 +
        // Ideally we'd pass these bytes to `ffi_bytebuffer_from_bytes`, but doing so would require us
949 +
        // to copy them into a JNA `Memory`. So we might as well directly copy them into a `RustBuffer`.
950 +
        val rbuf = RustBuffer.alloc(byteBuf.limit().toULong())
951 +
        rbuf.asByteBuffer()!!.put(byteBuf)
952 +
        return rbuf
953 +
    }
954 +
955 +
    // We aren't sure exactly how many bytes our string will be once it's UTF-8
956 +
    // encoded.  Allocate 3 bytes per UTF-16 code unit which will always be
957 +
    // enough.
958 +
    override fun allocationSize(value: String): ULong {
959 +
        val sizeForLength = 4UL
960 +
        val sizeForString = value.length.toULong() * 3UL
961 +
        return sizeForLength + sizeForString
962 +
    }
963 +
964 +
    override fun write(value: String, buf: ByteBuffer) {
965 +
        val byteBuf = toUtf8(value)
966 +
        buf.putInt(byteBuf.limit())
967 +
        buf.put(byteBuf)
968 +
    }
969 +
} fun `oxygenGreeting`(`name`: kotlin.String): kotlin.String {
970 +
            return FfiConverterString.lift(
971 +
    uniffiRustCall() { _status ->
972 +
    UniffiLib.INSTANCE.uniffi_rust_core_fn_func_oxygen_greeting(
973 +
        FfiConverterString.lower(`name`),_status)
974 +
}
975 +
    )
976 +
    }
977 +
    
978 +
979 +
added app/src/main/jniLibs/arm64-v8a/librust_core.so +0 −0

No line changes.

added app/src/main/jniLibs/armeabi-v7a/librust_core.so +0 −0

No line changes.

added app/src/main/jniLibs/x86_64/librust_core.so +0 −0

No line changes.

modified app/build.gradle.kts +1 −0
…
35 unchanged lines
36 36
}
37 37
38 38
dependencies {
39 +
    implementation("net.java.dev.jna:jna:5.14.0@aar")
39 40
    implementation(platform(libs.androidx.compose.bom))
40 41
    implementation(libs.androidx.activity.compose)
41 42
    implementation(libs.androidx.compose.material3)
…
13 unchanged lines
modified app/src/main/java/com/example/oxygenhub/MainActivity.kt +4 −2
…
12 unchanged lines
13 13
import androidx.compose.ui.tooling.preview.Preview
14 14
import com.example.oxygenhub.ui.theme.OxygenHubTheme
15 15
16 +
import uniffi.rust_core.oxygenGreeting
17 +
16 18
class MainActivity : ComponentActivity() {
17 19
    override fun onCreate(savedInstanceState: Bundle?) {
18 20
        super.onCreate(savedInstanceState)
…
2 unchanged lines
21 23
            OxygenHubTheme {
22 24
                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
23 25
                    Greeting(
24 -
                        name = "Android",
26 +
                        name = "Oxygen",
25 27
                        modifier = Modifier.padding(innerPadding)
26 28
                    )
27 29
                }
…
5 unchanged lines
33 35
@Composable
34 36
fun Greeting(name: String, modifier: Modifier = Modifier) {
35 37
    Text(
36 -
        text = "Hello $name!",
38 +
        text = oxygenGreeting(name),
37 39
        modifier = modifier
38 40
    )
39 41
}
…
8 unchanged lines
modified scripts/build_rust.sh +1 −1
…
31 unchanged lines
32 32
cargo run --features=uniffi/cli --bin uniffi-bindgen generate \
33 33
    --library ../app/src/main/jniLibs/arm64-v8a/librust_core.so \
34 34
    --language kotlin \
35 -
    --out-dir ../app/src/main/java/uniffi/rust_core
35 +
    --out-dir ../app/src/main/java
36 36
37 37
echo "✅ Rust build complete! The JNI libraries and Kotlin bindings are ready."