├── .gitignore
├── .idea
├── .gitignore
├── .name
├── codeStyles
│ ├── Project.xml
│ └── codeStyleConfig.xml
├── compiler.xml
├── jarRepositories.xml
└── misc.xml
├── LICENSE
├── android
├── build.gradle.kts
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── openastrotech
│ │ └── openastrotracker
│ │ └── android
│ │ └── MainActivity.kt
│ └── res
│ ├── layout
│ └── activity_main.xml
│ └── values
│ ├── colors.xml
│ └── styles.xml
├── build.gradle.kts
├── gradle.properties
├── gradle
└── wrapper
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── ios
├── ios.xcodeproj
│ └── project.pbxproj
├── ios
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ └── Contents.json
│ │ └── Contents.json
│ ├── Base.lproj
│ │ └── LaunchScreen.storyboard
│ ├── ContentView.swift
│ ├── Info.plist
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ └── SceneDelegate.swift
├── iosTests
│ ├── Info.plist
│ └── iosTests.swift
└── iosUITests
│ ├── Info.plist
│ └── iosUITests.swift
├── oat
├── build.gradle.kts
└── src
│ ├── androidMain
│ ├── AndroidManifest.xml
│ └── kotlin
│ │ └── com
│ │ └── openastrotech
│ │ └── openastrotracker
│ │ └── oat
│ │ └── network
│ │ └── TCPConnection.kt
│ ├── androidTest
│ └── kotlin
│ │ └── com
│ │ └── openastrotech
│ │ └── openastrotracker
│ │ └── oat
│ │ └── androidTest.kt
│ ├── commonMain
│ └── kotlin
│ │ └── com
│ │ └── openastrotech
│ │ └── openastrotracker
│ │ └── oat
│ │ ├── MeadeTelescope.kt
│ │ ├── network
│ │ ├── Connection.kt
│ │ ├── TCPConnection.kt
│ │ ├── TCPSocketDelegate.kt
│ │ ├── UDPSocket.kt
│ │ └── skyfi
│ │ │ └── SkyFiDiscovery.kt
│ │ ├── response
│ │ ├── DEC.kt
│ │ └── RA.kt
│ │ └── utils
│ │ └── Logger.kt
│ ├── iosMain
│ └── kotlin
│ │ └── com
│ │ └── openastrotech
│ │ └── openastrotracker
│ │ └── oat
│ │ └── network
│ │ └── TCPConnection.kt
│ ├── iosTest
│ └── kotlin
│ │ └── com
│ │ └── openastrotech
│ │ └── openastrotracker
│ │ └── oat
│ │ └── iosTest.kt
│ └── windowsMain
│ └── kotlin
│ └── com
│ └── openastrotech
│ └── openastrotracker
│ └── oat
│ └── network
│ └── TCPConnection.kt
└── settings.gradle.kts
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/caches
5 | /.idea/libraries
6 | /.idea/modules.xml
7 | /.idea/workspace.xml
8 | /.idea/navEditor.xml
9 | /.idea/assetWizardSettings.xml
10 | .DS_Store
11 | /build
12 | /captures
13 | .externalNativeBuild
14 | .cxx
15 | local.properties
16 | ### Android template
17 | # Built application files
18 | *.apk
19 | *.aar
20 | *.ap_
21 | *.aab
22 |
23 | # Files for the ART/Dalvik VM
24 | *.dex
25 |
26 | # Java class files
27 | *.class
28 |
29 | # Generated files
30 | bin/
31 | gen/
32 | out/
33 | # Uncomment the following line in case you need and you don't have the release build type files in your app
34 | # release/
35 |
36 | # Gradle files
37 | .gradle/
38 | build/
39 |
40 | # Local configuration file (sdk path, etc)
41 | local.properties
42 |
43 | # Proguard folder generated by Eclipse
44 | proguard/
45 |
46 | # Log Files
47 | *.log
48 |
49 | # Android Studio Navigation editor temp files
50 | .navigation/
51 |
52 | # Android Studio captures folder
53 | captures/
54 |
55 | # IntelliJ
56 | *.iml
57 | .idea/workspace.xml
58 | .idea/tasks.xml
59 | .idea/gradle.xml
60 | .idea/assetWizardSettings.xml
61 | .idea/dictionaries
62 | .idea/libraries
63 | # Android Studio 3 in .gitignore file.
64 | .idea/caches
65 | .idea/modules.xml
66 | # Comment next line if keeping position of elements in Navigation Editor is relevant for you
67 | .idea/navEditor.xml
68 |
69 | # Keystore files
70 | # Uncomment the following lines if you do not want to check your keystore files in.
71 | #*.jks
72 | #*.keystore
73 |
74 | # External native build folder generated in Android Studio 2.2 and later
75 | .externalNativeBuild
76 | .cxx/
77 |
78 | # Google Services (e.g. APIs or Firebase)
79 | # google-services.json
80 |
81 | # Freeline
82 | freeline.py
83 | freeline/
84 | freeline_project_description.json
85 |
86 | # fastlane
87 | fastlane/report.xml
88 | fastlane/Preview.html
89 | fastlane/screenshots
90 | fastlane/test_output
91 | fastlane/readme.md
92 |
93 | # Version control
94 | vcs.xml
95 |
96 | # lint
97 | lint/intermediates/
98 | lint/generated/
99 | lint/outputs/
100 | lint/tmp/
101 | # lint/reports/
102 |
103 | # Android Profiling
104 | *.hprof
105 |
106 | ### Xcode template
107 | # Xcode
108 | #
109 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
110 |
111 | ## User settings
112 | xcuserdata/
113 |
114 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
115 | *.xcscmblueprint
116 | *.xccheckout
117 |
118 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
119 | build/
120 | DerivedData/
121 | *.moved-aside
122 | *.pbxuser
123 | !default.pbxuser
124 | *.mode1v3
125 | !default.mode1v3
126 | *.mode2v3
127 | !default.mode2v3
128 | *.perspectivev3
129 | !default.perspectivev3
130 |
131 | ## Gcc Patch
132 | /*.gcno
133 |
134 | ### Java template
135 | # Compiled class file
136 | *.class
137 |
138 | # Log file
139 | *.log
140 |
141 | # BlueJ files
142 | *.ctxt
143 |
144 | # Mobile Tools for Java (J2ME)
145 | .mtj.tmp/
146 |
147 | # Package Files #
148 | *.jar
149 | *.war
150 | *.nar
151 | *.ear
152 | *.zip
153 | *.tar.gz
154 | *.rar
155 |
156 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
157 | hs_err_pid*
158 |
159 | ### Objective-C template
160 | # Xcode
161 | #
162 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
163 |
164 | ## User settings
165 | xcuserdata/
166 |
167 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
168 | *.xcscmblueprint
169 | *.xccheckout
170 |
171 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
172 | build/
173 | DerivedData/
174 | *.moved-aside
175 | *.pbxuser
176 | !default.pbxuser
177 | *.mode1v3
178 | !default.mode1v3
179 | *.mode2v3
180 | !default.mode2v3
181 | *.perspectivev3
182 | !default.perspectivev3
183 |
184 | ## Obj-C/Swift specific
185 | *.hmap
186 |
187 | ## App packaging
188 | *.ipa
189 | *.dSYM.zip
190 | *.dSYM
191 |
192 | # CocoaPods
193 | #
194 | # We recommend against adding the Pods directory to your .gitignore. However
195 | # you should judge for yourself, the pros and cons are mentioned at:
196 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
197 | #
198 | # Pods/
199 | #
200 | # Add this line if you want to avoid checking in source code from the Xcode workspace
201 | # *.xcworkspace
202 |
203 | # Carthage
204 | #
205 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
206 | # Carthage/Checkouts
207 |
208 | Carthage/Build/
209 |
210 | # fastlane
211 | #
212 | # It is recommended to not store the screenshots in the git repo.
213 | # Instead, use fastlane to re-generate the screenshots whenever they are needed.
214 | # For more information about the recommended setup visit:
215 | # https://docs.fastlane.tools/best-practices/source-control/#source-control
216 |
217 | fastlane/report.xml
218 | fastlane/Preview.html
219 | fastlane/screenshots/**/*.png
220 | fastlane/test_output
221 |
222 | # Code Injection
223 | #
224 | # After new code Injection tools there's a generated folder /iOSInjectionProject
225 | # https://github.com/johnno1962/injectionforxcode
226 |
227 | iOSInjectionProject/
228 |
229 | ### macOS template
230 | # General
231 | .DS_Store
232 | .AppleDouble
233 | .LSOverride
234 |
235 | # Icon must end with two \r
236 | Icon
237 |
238 | # Thumbnails
239 | ._*
240 |
241 | # Files that might appear in the root of a volume
242 | .DocumentRevisions-V100
243 | .fseventsd
244 | .Spotlight-V100
245 | .TemporaryItems
246 | .Trashes
247 | .VolumeIcon.icns
248 | .com.apple.timemachine.donotpresent
249 |
250 | # Directories potentially created on remote AFP share
251 | .AppleDB
252 | .AppleDesktop
253 | Network Trash Folder
254 | Temporary Items
255 | .apdisk
256 |
257 | ### C template
258 | # Prerequisites
259 | *.d
260 |
261 | # Object files
262 | *.o
263 | *.ko
264 | *.obj
265 | *.elf
266 |
267 | # Linker output
268 | *.ilk
269 | *.map
270 | *.exp
271 |
272 | # Precompiled Headers
273 | *.gch
274 | *.pch
275 |
276 | # Libraries
277 | *.lib
278 | *.a
279 | *.la
280 | *.lo
281 |
282 | # Shared objects (inc. Windows DLLs)
283 | *.dll
284 | *.so
285 | *.so.*
286 | *.dylib
287 |
288 | # Executables
289 | *.exe
290 | *.out
291 | *.app
292 | *.i*86
293 | *.x86_64
294 | *.hex
295 |
296 | # Debug files
297 | *.dSYM/
298 | *.su
299 | *.idb
300 | *.pdb
301 |
302 | # Kernel Module Compile Results
303 | *.mod*
304 | *.cmd
305 | .tmp_versions/
306 | modules.order
307 | Module.symvers
308 | Mkfile.old
309 | dkms.conf
310 |
311 | ### Linux template
312 | *~
313 |
314 | # temporary files which can be created if a process still has a handle open of a deleted file
315 | .fuse_hidden*
316 |
317 | # KDE directory preferences
318 | .directory
319 |
320 | # Linux trash folder which might appear on any partition or disk
321 | .Trash-*
322 |
323 | # .nfs files are created when an open file is removed but is still being accessed
324 | .nfs*
325 |
326 | ### JetBrains template
327 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
328 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
329 |
330 | # User-specific stuff
331 | .idea/**/workspace.xml
332 | .idea/**/tasks.xml
333 | .idea/**/usage.statistics.xml
334 | .idea/**/dictionaries
335 | .idea/**/shelf
336 |
337 | # Generated files
338 | .idea/**/contentModel.xml
339 |
340 | # Sensitive or high-churn files
341 | .idea/**/dataSources/
342 | .idea/**/dataSources.ids
343 | .idea/**/dataSources.local.xml
344 | .idea/**/sqlDataSources.xml
345 | .idea/**/dynamic.xml
346 | .idea/**/uiDesigner.xml
347 | .idea/**/dbnavigator.xml
348 |
349 | # Gradle
350 | .idea/**/gradle.xml
351 | .idea/**/libraries
352 |
353 | # Gradle and Maven with auto-import
354 | # When using Gradle or Maven with auto-import, you should exclude module files,
355 | # since they will be recreated, and may cause churn. Uncomment if using
356 | # auto-import.
357 | # .idea/artifacts
358 | # .idea/compiler.xml
359 | # .idea/jarRepositories.xml
360 | # .idea/modules.xml
361 | # .idea/*.iml
362 | # .idea/modules
363 | # *.iml
364 | # *.ipr
365 |
366 | # CMake
367 | cmake-build-*/
368 |
369 | # Mongo Explorer plugin
370 | .idea/**/mongoSettings.xml
371 |
372 | # File-based project format
373 | *.iws
374 |
375 | # IntelliJ
376 | out/
377 |
378 | # mpeltonen/sbt-idea plugin
379 | .idea_modules/
380 |
381 | # JIRA plugin
382 | atlassian-ide-plugin.xml
383 |
384 | # Cursive Clojure plugin
385 | .idea/replstate.xml
386 |
387 | # Crashlytics plugin (for Android Studio and IntelliJ)
388 | com_crashlytics_export_strings.xml
389 | crashlytics.properties
390 | crashlytics-build.properties
391 | fabric.properties
392 |
393 | # Editor-based Rest Client
394 | .idea/httpRequests
395 |
396 | # Android studio 3.1+ serialized cache file
397 | .idea/caches/build_file_checksums.ser
398 |
399 | ### Windows template
400 | # Windows thumbnail cache files
401 | Thumbs.db
402 | Thumbs.db:encryptable
403 | ehthumbs.db
404 | ehthumbs_vista.db
405 |
406 | # Dump file
407 | *.stackdump
408 |
409 | # Folder config file
410 | [Dd]esktop.ini
411 |
412 | # Recycle Bin used on file shares
413 | $RECYCLE.BIN/
414 |
415 | # Windows Installer files
416 | *.cab
417 | *.msi
418 | *.msix
419 | *.msm
420 | *.msp
421 |
422 | # Windows shortcuts
423 | *.lnk
424 |
425 | ### Swift template
426 | # Xcode
427 | #
428 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
429 |
430 | ## User settings
431 | xcuserdata/
432 |
433 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
434 | *.xcscmblueprint
435 | *.xccheckout
436 |
437 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
438 | build/
439 | DerivedData/
440 | *.moved-aside
441 | *.pbxuser
442 | !default.pbxuser
443 | *.mode1v3
444 | !default.mode1v3
445 | *.mode2v3
446 | !default.mode2v3
447 | *.perspectivev3
448 | !default.perspectivev3
449 |
450 | ## Obj-C/Swift specific
451 | *.hmap
452 |
453 | ## App packaging
454 | *.ipa
455 | *.dSYM.zip
456 | *.dSYM
457 |
458 | ## Playgrounds
459 | timeline.xctimeline
460 | playground.xcworkspace
461 |
462 | # Swift Package Manager
463 | #
464 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
465 | # Packages/
466 | # Package.pins
467 | # Package.resolved
468 | # *.xcodeproj
469 | #
470 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
471 | # hence it is not needed unless you have added a package configuration file to your project
472 | # .swiftpm
473 |
474 | .build/
475 |
476 | # CocoaPods
477 | #
478 | # We recommend against adding the Pods directory to your .gitignore. However
479 | # you should judge for yourself, the pros and cons are mentioned at:
480 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
481 | #
482 | # Pods/
483 | #
484 | # Add this line if you want to avoid checking in source code from the Xcode workspace
485 | # *.xcworkspace
486 |
487 | # Carthage
488 | #
489 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
490 | # Carthage/Checkouts
491 |
492 | Carthage/Build/
493 |
494 | # Accio dependency management
495 | Dependencies/
496 | .accio/
497 |
498 | # fastlane
499 | #
500 | # It is recommended to not store the screenshots in the git repo.
501 | # Instead, use fastlane to re-generate the screenshots whenever they are needed.
502 | # For more information about the recommended setup visit:
503 | # https://docs.fastlane.tools/best-practices/source-control/#source-control
504 |
505 | fastlane/report.xml
506 | fastlane/Preview.html
507 | fastlane/screenshots/**/*.png
508 | fastlane/test_output
509 |
510 | # Code Injection
511 | #
512 | # After new code Injection tools there's a generated folder /iOSInjectionProject
513 | # https://github.com/johnno1962/injectionforxcode
514 |
515 | iOSInjectionProject/
516 |
517 | ### Qt template
518 | # C++ objects and libs
519 | *.slo
520 | *.lo
521 | *.o
522 | *.a
523 | *.la
524 | *.lai
525 | *.so
526 | *.so.*
527 | *.dll
528 | *.dylib
529 |
530 | # Qt-es
531 | object_script.*.Release
532 | object_script.*.Debug
533 | *_plugin_import.cpp
534 | /.qmake.cache
535 | /.qmake.stash
536 | *.pro.user
537 | *.pro.user.*
538 | *.qbs.user
539 | *.qbs.user.*
540 | *.moc
541 | moc_*.cpp
542 | moc_*.h
543 | qrc_*.cpp
544 | ui_*.h
545 | *.qmlc
546 | *.jsc
547 | Makefile*
548 | *build-*
549 | *.qm
550 | *.prl
551 |
552 | # Qt unit tests
553 | target_wrapper.*
554 |
555 | # QtCreator
556 | *.autosave
557 |
558 | # QtCreator Qml
559 | *.qmlproject.user
560 | *.qmlproject.user.*
561 |
562 | # QtCreator CMake
563 | CMakeLists.txt.user*
564 |
565 | # QtCreator 4.8< compilation database
566 | compile_commands.json
567 |
568 | # QtCreator local machine specific files for imported projects
569 | *creator.user*
570 |
571 | *_qmlcache.qrc
572 |
573 | ### C++ template
574 | # Prerequisites
575 | *.d
576 |
577 | # Compiled Object files
578 | *.slo
579 | *.lo
580 | *.o
581 | *.obj
582 |
583 | # Precompiled Headers
584 | *.gch
585 | *.pch
586 |
587 | # Compiled Dynamic libraries
588 | *.so
589 | *.dylib
590 | *.dll
591 |
592 | # Fortran module files
593 | *.mod
594 | *.smod
595 |
596 | # Compiled Static libraries
597 | *.lai
598 | *.la
599 | *.a
600 | *.lib
601 |
602 | # Executables
603 | *.exe
604 | *.out
605 | *.app
606 |
607 | ### Kotlin template
608 | # Compiled class file
609 | *.class
610 |
611 | # Log file
612 | *.log
613 |
614 | # BlueJ files
615 | *.ctxt
616 |
617 | # Mobile Tools for Java (J2ME)
618 | .mtj.tmp/
619 |
620 | # Package Files #
621 | *.jar
622 | *.war
623 | *.nar
624 | *.ear
625 | *.zip
626 | *.tar.gz
627 | *.rar
628 |
629 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
630 | hs_err_pid*
631 |
632 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 |
--------------------------------------------------------------------------------
/.idea/.name:
--------------------------------------------------------------------------------
1 | OpenAstroTracker
--------------------------------------------------------------------------------
/.idea/codeStyles/Project.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | xmlns:android
34 |
35 | ^$
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 | xmlns:.*
45 |
46 | ^$
47 |
48 |
49 | BY_NAME
50 |
51 |
52 |
53 |
54 |
55 |
56 | .*:id
57 |
58 | http://schemas.android.com/apk/res/android
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 | .*:name
68 |
69 | http://schemas.android.com/apk/res/android
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 | name
79 |
80 | ^$
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 | style
90 |
91 | ^$
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 | .*
101 |
102 | ^$
103 |
104 |
105 | BY_NAME
106 |
107 |
108 |
109 |
110 |
111 |
112 | .*
113 |
114 | http://schemas.android.com/apk/res/android
115 |
116 |
117 | ANDROID_ATTRIBUTE_ORDER
118 |
119 |
120 |
121 |
122 |
123 |
124 | .*
125 |
126 | .*
127 |
128 |
129 | BY_NAME
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/jarRepositories.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/android/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | id("com.android.application")
3 | kotlin("android")
4 | id("kotlin-android-extensions")
5 | }
6 | group = "com.openastrotech.openastrotracker"
7 | version = "1.0-SNAPSHOT"
8 |
9 | repositories {
10 | gradlePluginPortal()
11 | google()
12 | jcenter()
13 | mavenCentral()
14 | }
15 | dependencies {
16 | implementation(project(":oat"))
17 | implementation("com.google.android.material:material:1.2.0")
18 | implementation("androidx.appcompat:appcompat:1.2.0")
19 | implementation("androidx.constraintlayout:constraintlayout:1.1.3")
20 | }
21 | android {
22 | compileSdkVersion(29)
23 | defaultConfig {
24 | applicationId = "com.openastrotech.openastrotracker.android"
25 | minSdkVersion(24)
26 | targetSdkVersion(29)
27 | versionCode = 1
28 | versionName = "1.0"
29 | }
30 | buildTypes {
31 | getByName("release") {
32 | isMinifyEnabled = false
33 | }
34 | }
35 | }
--------------------------------------------------------------------------------
/android/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/android/src/main/java/com/openastrotech/openastrotracker/android/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.openastrotech.openastrotracker.android
2 |
3 | import android.os.Bundle
4 | import android.widget.TextView
5 | import androidx.appcompat.app.AppCompatActivity
6 |
7 | fun greet(): String {
8 | return "Hello world"
9 | }
10 |
11 | class MainActivity : AppCompatActivity() {
12 | override fun onCreate(savedInstanceState: Bundle?) {
13 | super.onCreate(savedInstanceState)
14 | setContentView(R.layout.activity_main)
15 |
16 | val tv: TextView = findViewById(R.id.text_view)
17 | tv.text = greet()
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/android/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
20 |
21 |
--------------------------------------------------------------------------------
/android/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #6200EE
4 | #3700B3
5 | #03DAC5
6 |
--------------------------------------------------------------------------------
/android/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
--------------------------------------------------------------------------------
/build.gradle.kts:
--------------------------------------------------------------------------------
1 | buildscript {
2 | repositories {
3 | gradlePluginPortal()
4 | jcenter()
5 | google()
6 | mavenCentral()
7 | }
8 | dependencies {
9 | classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.10")
10 | classpath("com.android.tools.build:gradle:4.2.0-alpha16")
11 | }
12 | }
13 | group = "com.openastrotech.openastrotracker"
14 | version = "1.0-SNAPSHOT"
15 |
16 | repositories {
17 | mavenCentral()
18 | }
19 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | kotlin.code.style=official
2 | xcodeproj=./ios
3 | android.useAndroidX=true
4 | kotlin.mpp.enableGranularSourceSetsMetadata=true
5 | kotlin.native.enableDependencyPropagation=false
6 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Mon Nov 16 01:23:17 CET 2020
2 | distributionBase=GRADLE_USER_HOME
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip
4 | distributionPath=wrapper/dists
5 | zipStorePath=wrapper/dists
6 | zipStoreBase=GRADLE_USER_HOME
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Attempt to set APP_HOME
10 | # Resolve links: $0 may be a link
11 | PRG="$0"
12 | # Need this for relative symlinks.
13 | while [ -h "$PRG" ] ; do
14 | ls=`ls -ld "$PRG"`
15 | link=`expr "$ls" : '.*-> \(.*\)$'`
16 | if expr "$link" : '/.*' > /dev/null; then
17 | PRG="$link"
18 | else
19 | PRG=`dirname "$PRG"`"/$link"
20 | fi
21 | done
22 | SAVED="`pwd`"
23 | cd "`dirname \"$PRG\"`/" >/dev/null
24 | APP_HOME="`pwd -P`"
25 | cd "$SAVED" >/dev/null
26 |
27 | APP_NAME="Gradle"
28 | APP_BASE_NAME=`basename "$0"`
29 |
30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31 | DEFAULT_JVM_OPTS=""
32 |
33 | # Use the maximum available, or set MAX_FD != -1 to use that value.
34 | MAX_FD="maximum"
35 |
36 | warn () {
37 | echo "$*"
38 | }
39 |
40 | die () {
41 | echo
42 | echo "$*"
43 | echo
44 | exit 1
45 | }
46 |
47 | # OS specific support (must be 'true' or 'false').
48 | cygwin=false
49 | msys=false
50 | darwin=false
51 | nonstop=false
52 | case "`uname`" in
53 | CYGWIN* )
54 | cygwin=true
55 | ;;
56 | Darwin* )
57 | darwin=true
58 | ;;
59 | MINGW* )
60 | msys=true
61 | ;;
62 | NONSTOP* )
63 | nonstop=true
64 | ;;
65 | esac
66 |
67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68 |
69 | # Determine the Java command to use to start the JVM.
70 | if [ -n "$JAVA_HOME" ] ; then
71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72 | # IBM's JDK on AIX uses strange locations for the executables
73 | JAVACMD="$JAVA_HOME/jre/sh/java"
74 | else
75 | JAVACMD="$JAVA_HOME/bin/java"
76 | fi
77 | if [ ! -x "$JAVACMD" ] ; then
78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79 |
80 | Please set the JAVA_HOME variable in your environment to match the
81 | location of your Java installation."
82 | fi
83 | else
84 | JAVACMD="java"
85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86 |
87 | Please set the JAVA_HOME variable in your environment to match the
88 | location of your Java installation."
89 | fi
90 |
91 | # Increase the maximum file descriptors if we can.
92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93 | MAX_FD_LIMIT=`ulimit -H -n`
94 | if [ $? -eq 0 ] ; then
95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96 | MAX_FD="$MAX_FD_LIMIT"
97 | fi
98 | ulimit -n $MAX_FD
99 | if [ $? -ne 0 ] ; then
100 | warn "Could not set maximum file descriptor limit: $MAX_FD"
101 | fi
102 | else
103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104 | fi
105 | fi
106 |
107 | # For Darwin, add options to specify how the application appears in the dock
108 | if $darwin; then
109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110 | fi
111 |
112 | # For Cygwin, switch paths to Windows format before running java
113 | if $cygwin ; then
114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116 | JAVACMD=`cygpath --unix "$JAVACMD"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Escape application args
158 | save () {
159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160 | echo " "
161 | }
162 | APP_ARGS=$(save "$@")
163 |
164 | # Collect all arguments for the java command, following the shell quoting and substitution rules
165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166 |
167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169 | cd "$(dirname "$0")"
170 | fi
171 |
172 | exec "$JAVACMD" "$@"
173 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 |
53 | :win9xME_args
54 | @rem Slurp the command line arguments.
55 | set CMD_LINE_ARGS=
56 | set _SKIP=2
57 |
58 | :win9xME_args_slurp
59 | if "x%~1" == "x" goto execute
60 |
61 | set CMD_LINE_ARGS=%*
62 |
63 | :execute
64 | @rem Setup the command line
65 |
66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 |
68 | @rem Execute Gradle
69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 |
71 | :end
72 | @rem End local scope for the variables with windows NT shell
73 | if "%ERRORLEVEL%"=="0" goto mainEnd
74 |
75 | :fail
76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 | rem the _cmd.exe /c_ return code!
78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 | exit /b 1
80 |
81 | :mainEnd
82 | if "%OS%"=="Windows_NT" endlocal
83 |
84 | :omega
85 |
--------------------------------------------------------------------------------
/ios/ios.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 50;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 7555FF7F242A565900829871 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF7E242A565900829871 /* AppDelegate.swift */; };
11 | 7555FF81242A565900829871 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF80242A565900829871 /* SceneDelegate.swift */; };
12 | 7555FF83242A565900829871 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF82242A565900829871 /* ContentView.swift */; };
13 | 7555FF85242A565B00829871 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7555FF84242A565B00829871 /* Assets.xcassets */; };
14 | 7555FF88242A565B00829871 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7555FF87242A565B00829871 /* Preview Assets.xcassets */; };
15 | 7555FF8B242A565B00829871 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7555FF89242A565B00829871 /* LaunchScreen.storyboard */; };
16 | 7555FF96242A565B00829871 /* iosTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF95242A565B00829871 /* iosTests.swift */; };
17 | 7555FFA1242A565B00829871 /* iosUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FFA0242A565B00829871 /* iosUITests.swift */; };
18 | 7555FFB2242A642300829871 /* oat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7555FFB1242A642300829871 /* oat.framework */; };
19 | 7555FFB3242A642300829871 /* oat.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7555FFB1242A642300829871 /* oat.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
20 | /* End PBXBuildFile section */
21 |
22 | /* Begin PBXContainerItemProxy section */
23 | 7555FF92242A565B00829871 /* PBXContainerItemProxy */ = {
24 | isa = PBXContainerItemProxy;
25 | containerPortal = 7555FF73242A565900829871 /* Project object */;
26 | proxyType = 1;
27 | remoteGlobalIDString = 7555FF7A242A565900829871;
28 | remoteInfo = ios;
29 | };
30 | 7555FF9D242A565B00829871 /* PBXContainerItemProxy */ = {
31 | isa = PBXContainerItemProxy;
32 | containerPortal = 7555FF73242A565900829871 /* Project object */;
33 | proxyType = 1;
34 | remoteGlobalIDString = 7555FF7A242A565900829871;
35 | remoteInfo = ios;
36 | };
37 | /* End PBXContainerItemProxy section */
38 |
39 | /* Begin PBXCopyFilesBuildPhase section */
40 | 7555FFB4242A642300829871 /* Embed Frameworks */ = {
41 | isa = PBXCopyFilesBuildPhase;
42 | buildActionMask = 2147483647;
43 | dstPath = "";
44 | dstSubfolderSpec = 10;
45 | files = (
46 | 7555FFB3242A642300829871 /* oat.framework in Embed Frameworks */,
47 | );
48 | name = "Embed Frameworks";
49 | runOnlyForDeploymentPostprocessing = 0;
50 | };
51 | /* End PBXCopyFilesBuildPhase section */
52 |
53 | /* Begin PBXFileReference section */
54 | 7555FF7B242A565900829871 /* ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ios.app; sourceTree = BUILT_PRODUCTS_DIR; };
55 | 7555FF7E242A565900829871 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
56 | 7555FF80242A565900829871 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
57 | 7555FF82242A565900829871 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
58 | 7555FF84242A565B00829871 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
59 | 7555FF87242A565B00829871 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
60 | 7555FF8A242A565B00829871 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
61 | 7555FF8C242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
62 | 7555FF91242A565B00829871 /* iosTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iosTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
63 | 7555FF95242A565B00829871 /* iosTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iosTests.swift; sourceTree = ""; };
64 | 7555FF97242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
65 | 7555FF9C242A565B00829871 /* iosUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iosUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
66 | 7555FFA0242A565B00829871 /* iosUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iosUITests.swift; sourceTree = ""; };
67 | 7555FFA2242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
68 | 7555FFB1242A642300829871 /* oat.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = oat.framework; path = "../oat/build/xcode-frameworks/oat.framework"; sourceTree = ""; };
69 | /* End PBXFileReference section */
70 |
71 | /* Begin PBXFrameworksBuildPhase section */
72 | 7555FF78242A565900829871 /* Frameworks */ = {
73 | isa = PBXFrameworksBuildPhase;
74 | buildActionMask = 2147483647;
75 | files = (
76 | 7555FFB2242A642300829871 /* oat.framework in Frameworks */,
77 | );
78 | runOnlyForDeploymentPostprocessing = 0;
79 | };
80 | 7555FF8E242A565B00829871 /* Frameworks */ = {
81 | isa = PBXFrameworksBuildPhase;
82 | buildActionMask = 2147483647;
83 | files = (
84 | );
85 | runOnlyForDeploymentPostprocessing = 0;
86 | };
87 | 7555FF99242A565B00829871 /* Frameworks */ = {
88 | isa = PBXFrameworksBuildPhase;
89 | buildActionMask = 2147483647;
90 | files = (
91 | );
92 | runOnlyForDeploymentPostprocessing = 0;
93 | };
94 | /* End PBXFrameworksBuildPhase section */
95 |
96 | /* Begin PBXGroup section */
97 | 7555FF72242A565900829871 = {
98 | isa = PBXGroup;
99 | children = (
100 | 7555FF7D242A565900829871 /* ios */,
101 | 7555FF94242A565B00829871 /* iosTests */,
102 | 7555FF9F242A565B00829871 /* iosUITests */,
103 | 7555FF7C242A565900829871 /* Products */,
104 | 7555FFB0242A642200829871 /* Frameworks */,
105 | );
106 | sourceTree = "";
107 | };
108 | 7555FF7C242A565900829871 /* Products */ = {
109 | isa = PBXGroup;
110 | children = (
111 | 7555FF7B242A565900829871 /* ios.app */,
112 | 7555FF91242A565B00829871 /* iosTests.xctest */,
113 | 7555FF9C242A565B00829871 /* iosUITests.xctest */,
114 | );
115 | name = Products;
116 | sourceTree = "";
117 | };
118 | 7555FF7D242A565900829871 /* ios */ = {
119 | isa = PBXGroup;
120 | children = (
121 | 7555FF7E242A565900829871 /* AppDelegate.swift */,
122 | 7555FF80242A565900829871 /* SceneDelegate.swift */,
123 | 7555FF82242A565900829871 /* ContentView.swift */,
124 | 7555FF84242A565B00829871 /* Assets.xcassets */,
125 | 7555FF89242A565B00829871 /* LaunchScreen.storyboard */,
126 | 7555FF8C242A565B00829871 /* Info.plist */,
127 | 7555FF86242A565B00829871 /* Preview Content */,
128 | );
129 | path = ios;
130 | sourceTree = "";
131 | };
132 | 7555FF86242A565B00829871 /* Preview Content */ = {
133 | isa = PBXGroup;
134 | children = (
135 | 7555FF87242A565B00829871 /* Preview Assets.xcassets */,
136 | );
137 | path = "Preview Content";
138 | sourceTree = "";
139 | };
140 | 7555FF94242A565B00829871 /* iosTests */ = {
141 | isa = PBXGroup;
142 | children = (
143 | 7555FF95242A565B00829871 /* iosTests.swift */,
144 | 7555FF97242A565B00829871 /* Info.plist */,
145 | );
146 | path = iosTests;
147 | sourceTree = "";
148 | };
149 | 7555FF9F242A565B00829871 /* iosUITests */ = {
150 | isa = PBXGroup;
151 | children = (
152 | 7555FFA0242A565B00829871 /* iosUITests.swift */,
153 | 7555FFA2242A565B00829871 /* Info.plist */,
154 | );
155 | path = iosUITests;
156 | sourceTree = "";
157 | };
158 | 7555FFB0242A642200829871 /* Frameworks */ = {
159 | isa = PBXGroup;
160 | children = (
161 | 7555FFB1242A642300829871 /* oat.framework */,
162 | );
163 | name = Frameworks;
164 | sourceTree = "";
165 | };
166 | /* End PBXGroup section */
167 |
168 | /* Begin PBXNativeTarget section */
169 | 7555FF7A242A565900829871 /* ios */ = {
170 | isa = PBXNativeTarget;
171 | buildConfigurationList = 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "ios" */;
172 | buildPhases = (
173 | 7555FFB5242A651A00829871 /* ShellScript */,
174 | 7555FF77242A565900829871 /* Sources */,
175 | 7555FF78242A565900829871 /* Frameworks */,
176 | 7555FF79242A565900829871 /* Resources */,
177 | 7555FFB4242A642300829871 /* Embed Frameworks */,
178 | );
179 | buildRules = (
180 | );
181 | dependencies = (
182 | );
183 | name = ios;
184 | productName = ios;
185 | productReference = 7555FF7B242A565900829871 /* ios.app */;
186 | productType = "com.apple.product-type.application";
187 | };
188 | 7555FF90242A565B00829871 /* iosTests */ = {
189 | isa = PBXNativeTarget;
190 | buildConfigurationList = 7555FFA8242A565B00829871 /* Build configuration list for PBXNativeTarget "iosTests" */;
191 | buildPhases = (
192 | 7555FF8D242A565B00829871 /* Sources */,
193 | 7555FF8E242A565B00829871 /* Frameworks */,
194 | 7555FF8F242A565B00829871 /* Resources */,
195 | );
196 | buildRules = (
197 | );
198 | dependencies = (
199 | 7555FF93242A565B00829871 /* PBXTargetDependency */,
200 | );
201 | name = iosTests;
202 | productName = iosTests;
203 | productReference = 7555FF91242A565B00829871 /* iosTests.xctest */;
204 | productType = "com.apple.product-type.bundle.unit-test";
205 | };
206 | 7555FF9B242A565B00829871 /* iosUITests */ = {
207 | isa = PBXNativeTarget;
208 | buildConfigurationList = 7555FFAB242A565B00829871 /* Build configuration list for PBXNativeTarget "iosUITests" */;
209 | buildPhases = (
210 | 7555FF98242A565B00829871 /* Sources */,
211 | 7555FF99242A565B00829871 /* Frameworks */,
212 | 7555FF9A242A565B00829871 /* Resources */,
213 | );
214 | buildRules = (
215 | );
216 | dependencies = (
217 | 7555FF9E242A565B00829871 /* PBXTargetDependency */,
218 | );
219 | name = iosUITests;
220 | productName = iosUITests;
221 | productReference = 7555FF9C242A565B00829871 /* iosUITests.xctest */;
222 | productType = "com.apple.product-type.bundle.ui-testing";
223 | };
224 | /* End PBXNativeTarget section */
225 |
226 | /* Begin PBXProject section */
227 | 7555FF73242A565900829871 /* Project object */ = {
228 | isa = PBXProject;
229 | attributes = {
230 | LastSwiftUpdateCheck = 1130;
231 | LastUpgradeCheck = 1130;
232 | ORGANIZATIONNAME = orgName;
233 | TargetAttributes = {
234 | 7555FF7A242A565900829871 = {
235 | CreatedOnToolsVersion = 11.3.1;
236 | };
237 | 7555FF90242A565B00829871 = {
238 | CreatedOnToolsVersion = 11.3.1;
239 | TestTargetID = 7555FF7A242A565900829871;
240 | };
241 | 7555FF9B242A565B00829871 = {
242 | CreatedOnToolsVersion = 11.3.1;
243 | TestTargetID = 7555FF7A242A565900829871;
244 | };
245 | };
246 | };
247 | buildConfigurationList = 7555FF76242A565900829871 /* Build configuration list for PBXProject "ios" */;
248 | compatibilityVersion = "Xcode 9.3";
249 | developmentRegion = en;
250 | hasScannedForEncodings = 0;
251 | knownRegions = (
252 | en,
253 | Base,
254 | );
255 | mainGroup = 7555FF72242A565900829871;
256 | productRefGroup = 7555FF7C242A565900829871 /* Products */;
257 | projectDirPath = "";
258 | projectRoot = "";
259 | targets = (
260 | 7555FF7A242A565900829871 /* ios */,
261 | 7555FF90242A565B00829871 /* iosTests */,
262 | 7555FF9B242A565B00829871 /* iosUITests */,
263 | );
264 | };
265 | /* End PBXProject section */
266 |
267 | /* Begin PBXResourcesBuildPhase section */
268 | 7555FF79242A565900829871 /* Resources */ = {
269 | isa = PBXResourcesBuildPhase;
270 | buildActionMask = 2147483647;
271 | files = (
272 | 7555FF8B242A565B00829871 /* LaunchScreen.storyboard in Resources */,
273 | 7555FF88242A565B00829871 /* Preview Assets.xcassets in Resources */,
274 | 7555FF85242A565B00829871 /* Assets.xcassets in Resources */,
275 | );
276 | runOnlyForDeploymentPostprocessing = 0;
277 | };
278 | 7555FF8F242A565B00829871 /* Resources */ = {
279 | isa = PBXResourcesBuildPhase;
280 | buildActionMask = 2147483647;
281 | files = (
282 | );
283 | runOnlyForDeploymentPostprocessing = 0;
284 | };
285 | 7555FF9A242A565B00829871 /* Resources */ = {
286 | isa = PBXResourcesBuildPhase;
287 | buildActionMask = 2147483647;
288 | files = (
289 | );
290 | runOnlyForDeploymentPostprocessing = 0;
291 | };
292 | /* End PBXResourcesBuildPhase section */
293 |
294 | /* Begin PBXShellScriptBuildPhase section */
295 | 7555FFB5242A651A00829871 /* ShellScript */ = {
296 | isa = PBXShellScriptBuildPhase;
297 | buildActionMask = 2147483647;
298 | files = (
299 | );
300 | inputFileListPaths = (
301 | );
302 | inputPaths = (
303 | );
304 | outputFileListPaths = (
305 | );
306 | outputPaths = (
307 | );
308 | runOnlyForDeploymentPostprocessing = 0;
309 | shellPath = /bin/sh;
310 | shellScript = "cd \"$SRCROOT/..\"\n./gradlew :oat:packForXCode -PXCODE_CONFIGURATION=${CONFIGURATION}\n";
311 | };
312 | /* End PBXShellScriptBuildPhase section */
313 |
314 | /* Begin PBXSourcesBuildPhase section */
315 | 7555FF77242A565900829871 /* Sources */ = {
316 | isa = PBXSourcesBuildPhase;
317 | buildActionMask = 2147483647;
318 | files = (
319 | 7555FF7F242A565900829871 /* AppDelegate.swift in Sources */,
320 | 7555FF81242A565900829871 /* SceneDelegate.swift in Sources */,
321 | 7555FF83242A565900829871 /* ContentView.swift in Sources */,
322 | );
323 | runOnlyForDeploymentPostprocessing = 0;
324 | };
325 | 7555FF8D242A565B00829871 /* Sources */ = {
326 | isa = PBXSourcesBuildPhase;
327 | buildActionMask = 2147483647;
328 | files = (
329 | 7555FF96242A565B00829871 /* iosTests.swift in Sources */,
330 | );
331 | runOnlyForDeploymentPostprocessing = 0;
332 | };
333 | 7555FF98242A565B00829871 /* Sources */ = {
334 | isa = PBXSourcesBuildPhase;
335 | buildActionMask = 2147483647;
336 | files = (
337 | 7555FFA1242A565B00829871 /* iosUITests.swift in Sources */,
338 | );
339 | runOnlyForDeploymentPostprocessing = 0;
340 | };
341 | /* End PBXSourcesBuildPhase section */
342 |
343 | /* Begin PBXTargetDependency section */
344 | 7555FF93242A565B00829871 /* PBXTargetDependency */ = {
345 | isa = PBXTargetDependency;
346 | target = 7555FF7A242A565900829871 /* ios */;
347 | targetProxy = 7555FF92242A565B00829871 /* PBXContainerItemProxy */;
348 | };
349 | 7555FF9E242A565B00829871 /* PBXTargetDependency */ = {
350 | isa = PBXTargetDependency;
351 | target = 7555FF7A242A565900829871 /* ios */;
352 | targetProxy = 7555FF9D242A565B00829871 /* PBXContainerItemProxy */;
353 | };
354 | /* End PBXTargetDependency section */
355 |
356 | /* Begin PBXVariantGroup section */
357 | 7555FF89242A565B00829871 /* LaunchScreen.storyboard */ = {
358 | isa = PBXVariantGroup;
359 | children = (
360 | 7555FF8A242A565B00829871 /* Base */,
361 | );
362 | name = LaunchScreen.storyboard;
363 | sourceTree = "";
364 | };
365 | /* End PBXVariantGroup section */
366 |
367 | /* Begin XCBuildConfiguration section */
368 | 7555FFA3242A565B00829871 /* Debug */ = {
369 | isa = XCBuildConfiguration;
370 | buildSettings = {
371 | ALWAYS_SEARCH_USER_PATHS = NO;
372 | CLANG_ANALYZER_NONNULL = YES;
373 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
374 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
375 | CLANG_CXX_LIBRARY = "libc++";
376 | CLANG_ENABLE_MODULES = YES;
377 | CLANG_ENABLE_OBJC_ARC = YES;
378 | CLANG_ENABLE_OBJC_WEAK = YES;
379 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
380 | CLANG_WARN_BOOL_CONVERSION = YES;
381 | CLANG_WARN_COMMA = YES;
382 | CLANG_WARN_CONSTANT_CONVERSION = YES;
383 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
384 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
385 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
386 | CLANG_WARN_EMPTY_BODY = YES;
387 | CLANG_WARN_ENUM_CONVERSION = YES;
388 | CLANG_WARN_INFINITE_RECURSION = YES;
389 | CLANG_WARN_INT_CONVERSION = YES;
390 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
391 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
392 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
393 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
394 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
395 | CLANG_WARN_STRICT_PROTOTYPES = YES;
396 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
397 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
398 | CLANG_WARN_UNREACHABLE_CODE = YES;
399 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
400 | COPY_PHASE_STRIP = NO;
401 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
402 | ENABLE_STRICT_OBJC_MSGSEND = YES;
403 | ENABLE_TESTABILITY = YES;
404 | GCC_C_LANGUAGE_STANDARD = gnu11;
405 | GCC_DYNAMIC_NO_PIC = NO;
406 | GCC_NO_COMMON_BLOCKS = YES;
407 | GCC_OPTIMIZATION_LEVEL = 0;
408 | GCC_PREPROCESSOR_DEFINITIONS = (
409 | "DEBUG=1",
410 | "$(inherited)",
411 | );
412 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
413 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
414 | GCC_WARN_UNDECLARED_SELECTOR = YES;
415 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
416 | GCC_WARN_UNUSED_FUNCTION = YES;
417 | GCC_WARN_UNUSED_VARIABLE = YES;
418 | IPHONEOS_DEPLOYMENT_TARGET = 13.2;
419 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
420 | MTL_FAST_MATH = YES;
421 | ONLY_ACTIVE_ARCH = YES;
422 | SDKROOT = iphoneos;
423 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
424 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
425 | };
426 | name = Debug;
427 | };
428 | 7555FFA4242A565B00829871 /* Release */ = {
429 | isa = XCBuildConfiguration;
430 | buildSettings = {
431 | ALWAYS_SEARCH_USER_PATHS = NO;
432 | CLANG_ANALYZER_NONNULL = YES;
433 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
434 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
435 | CLANG_CXX_LIBRARY = "libc++";
436 | CLANG_ENABLE_MODULES = YES;
437 | CLANG_ENABLE_OBJC_ARC = YES;
438 | CLANG_ENABLE_OBJC_WEAK = YES;
439 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
440 | CLANG_WARN_BOOL_CONVERSION = YES;
441 | CLANG_WARN_COMMA = YES;
442 | CLANG_WARN_CONSTANT_CONVERSION = YES;
443 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
444 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
445 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
446 | CLANG_WARN_EMPTY_BODY = YES;
447 | CLANG_WARN_ENUM_CONVERSION = YES;
448 | CLANG_WARN_INFINITE_RECURSION = YES;
449 | CLANG_WARN_INT_CONVERSION = YES;
450 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
451 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
452 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
453 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
454 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
455 | CLANG_WARN_STRICT_PROTOTYPES = YES;
456 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
457 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
458 | CLANG_WARN_UNREACHABLE_CODE = YES;
459 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
460 | COPY_PHASE_STRIP = NO;
461 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
462 | ENABLE_NS_ASSERTIONS = NO;
463 | ENABLE_STRICT_OBJC_MSGSEND = YES;
464 | GCC_C_LANGUAGE_STANDARD = gnu11;
465 | GCC_NO_COMMON_BLOCKS = YES;
466 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
467 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
468 | GCC_WARN_UNDECLARED_SELECTOR = YES;
469 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
470 | GCC_WARN_UNUSED_FUNCTION = YES;
471 | GCC_WARN_UNUSED_VARIABLE = YES;
472 | IPHONEOS_DEPLOYMENT_TARGET = 13.2;
473 | MTL_ENABLE_DEBUG_INFO = NO;
474 | MTL_FAST_MATH = YES;
475 | SDKROOT = iphoneos;
476 | SWIFT_COMPILATION_MODE = wholemodule;
477 | SWIFT_OPTIMIZATION_LEVEL = "-O";
478 | VALIDATE_PRODUCT = YES;
479 | };
480 | name = Release;
481 | };
482 | 7555FFA6242A565B00829871 /* Debug */ = {
483 | isa = XCBuildConfiguration;
484 | buildSettings = {
485 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
486 | CODE_SIGN_STYLE = Automatic;
487 | DEVELOPMENT_ASSET_PATHS = "\"ios/Preview Content\"";
488 | ENABLE_PREVIEWS = YES;
489 | FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../oat/build/xcode-frameworks";
490 | INFOPLIST_FILE = ios/Info.plist;
491 | LD_RUNPATH_SEARCH_PATHS = (
492 | "$(inherited)",
493 | "@executable_path/Frameworks",
494 | );
495 | PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.ios;
496 | PRODUCT_NAME = "$(TARGET_NAME)";
497 | SWIFT_VERSION = 5.0;
498 | TARGETED_DEVICE_FAMILY = "1,2";
499 | };
500 | name = Debug;
501 | };
502 | 7555FFA7242A565B00829871 /* Release */ = {
503 | isa = XCBuildConfiguration;
504 | buildSettings = {
505 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
506 | CODE_SIGN_STYLE = Automatic;
507 | DEVELOPMENT_ASSET_PATHS = "\"ios/Preview Content\"";
508 | ENABLE_PREVIEWS = YES;
509 | FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../oat/build/xcode-frameworks";
510 | INFOPLIST_FILE = ios/Info.plist;
511 | LD_RUNPATH_SEARCH_PATHS = (
512 | "$(inherited)",
513 | "@executable_path/Frameworks",
514 | );
515 | PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.ios;
516 | PRODUCT_NAME = "$(TARGET_NAME)";
517 | SWIFT_VERSION = 5.0;
518 | TARGETED_DEVICE_FAMILY = "1,2";
519 | };
520 | name = Release;
521 | };
522 | 7555FFA9242A565B00829871 /* Debug */ = {
523 | isa = XCBuildConfiguration;
524 | buildSettings = {
525 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
526 | BUNDLE_LOADER = "$(TEST_HOST)";
527 | CODE_SIGN_STYLE = Automatic;
528 | INFOPLIST_FILE = iosTests/Info.plist;
529 | IPHONEOS_DEPLOYMENT_TARGET = 13.2;
530 | LD_RUNPATH_SEARCH_PATHS = (
531 | "$(inherited)",
532 | "@executable_path/Frameworks",
533 | "@loader_path/Frameworks",
534 | );
535 | PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosTests;
536 | PRODUCT_NAME = "$(TARGET_NAME)";
537 | SWIFT_VERSION = 5.0;
538 | TARGETED_DEVICE_FAMILY = "1,2";
539 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ios.app/ios";
540 | };
541 | name = Debug;
542 | };
543 | 7555FFAA242A565B00829871 /* Release */ = {
544 | isa = XCBuildConfiguration;
545 | buildSettings = {
546 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
547 | BUNDLE_LOADER = "$(TEST_HOST)";
548 | CODE_SIGN_STYLE = Automatic;
549 | INFOPLIST_FILE = iosTests/Info.plist;
550 | IPHONEOS_DEPLOYMENT_TARGET = 13.2;
551 | LD_RUNPATH_SEARCH_PATHS = (
552 | "$(inherited)",
553 | "@executable_path/Frameworks",
554 | "@loader_path/Frameworks",
555 | );
556 | PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosTests;
557 | PRODUCT_NAME = "$(TARGET_NAME)";
558 | SWIFT_VERSION = 5.0;
559 | TARGETED_DEVICE_FAMILY = "1,2";
560 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ios.app/ios";
561 | };
562 | name = Release;
563 | };
564 | 7555FFAC242A565B00829871 /* Debug */ = {
565 | isa = XCBuildConfiguration;
566 | buildSettings = {
567 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
568 | CODE_SIGN_STYLE = Automatic;
569 | INFOPLIST_FILE = iosUITests/Info.plist;
570 | LD_RUNPATH_SEARCH_PATHS = (
571 | "$(inherited)",
572 | "@executable_path/Frameworks",
573 | "@loader_path/Frameworks",
574 | );
575 | PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosUITests;
576 | PRODUCT_NAME = "$(TARGET_NAME)";
577 | SWIFT_VERSION = 5.0;
578 | TARGETED_DEVICE_FAMILY = "1,2";
579 | TEST_TARGET_NAME = ios;
580 | };
581 | name = Debug;
582 | };
583 | 7555FFAD242A565B00829871 /* Release */ = {
584 | isa = XCBuildConfiguration;
585 | buildSettings = {
586 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
587 | CODE_SIGN_STYLE = Automatic;
588 | INFOPLIST_FILE = iosUITests/Info.plist;
589 | LD_RUNPATH_SEARCH_PATHS = (
590 | "$(inherited)",
591 | "@executable_path/Frameworks",
592 | "@loader_path/Frameworks",
593 | );
594 | PRODUCT_BUNDLE_IDENTIFIER = orgIdentifier.iosUITests;
595 | PRODUCT_NAME = "$(TARGET_NAME)";
596 | SWIFT_VERSION = 5.0;
597 | TARGETED_DEVICE_FAMILY = "1,2";
598 | TEST_TARGET_NAME = ios;
599 | };
600 | name = Release;
601 | };
602 | /* End XCBuildConfiguration section */
603 |
604 | /* Begin XCConfigurationList section */
605 | 7555FF76242A565900829871 /* Build configuration list for PBXProject "ios" */ = {
606 | isa = XCConfigurationList;
607 | buildConfigurations = (
608 | 7555FFA3242A565B00829871 /* Debug */,
609 | 7555FFA4242A565B00829871 /* Release */,
610 | );
611 | defaultConfigurationIsVisible = 0;
612 | defaultConfigurationName = Release;
613 | };
614 | 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "ios" */ = {
615 | isa = XCConfigurationList;
616 | buildConfigurations = (
617 | 7555FFA6242A565B00829871 /* Debug */,
618 | 7555FFA7242A565B00829871 /* Release */,
619 | );
620 | defaultConfigurationIsVisible = 0;
621 | defaultConfigurationName = Release;
622 | };
623 | 7555FFA8242A565B00829871 /* Build configuration list for PBXNativeTarget "iosTests" */ = {
624 | isa = XCConfigurationList;
625 | buildConfigurations = (
626 | 7555FFA9242A565B00829871 /* Debug */,
627 | 7555FFAA242A565B00829871 /* Release */,
628 | );
629 | defaultConfigurationIsVisible = 0;
630 | defaultConfigurationName = Release;
631 | };
632 | 7555FFAB242A565B00829871 /* Build configuration list for PBXNativeTarget "iosUITests" */ = {
633 | isa = XCConfigurationList;
634 | buildConfigurations = (
635 | 7555FFAC242A565B00829871 /* Debug */,
636 | 7555FFAD242A565B00829871 /* Release */,
637 | );
638 | defaultConfigurationIsVisible = 0;
639 | defaultConfigurationName = Release;
640 | };
641 | /* End XCConfigurationList section */
642 | };
643 | rootObject = 7555FF73242A565900829871 /* Project object */;
644 | }
645 |
--------------------------------------------------------------------------------
/ios/ios/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 |
3 | @UIApplicationMain
4 | class AppDelegate: UIResponder, UIApplicationDelegate {
5 |
6 |
7 |
8 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
9 | // Override point for customization after application launch.
10 | return true
11 | }
12 |
13 | // MARK: UISceneSession Lifecycle
14 |
15 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
16 | // Called when a new scene session is being created.
17 | // Use this method to select a configuration to create the new scene with.
18 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
19 | }
20 |
21 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
22 | // Called when the user discards a scene session.
23 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
24 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
25 | }
26 |
27 |
28 | }
29 |
30 |
--------------------------------------------------------------------------------
/ios/ios/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/ios/ios/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/ios/ios/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/ios/ios/ContentView.swift:
--------------------------------------------------------------------------------
1 | import SwiftUI
2 | import oat
3 |
4 | func greet() -> String {
5 | return "Hello world!"
6 | }
7 |
8 | struct ContentView: View {
9 | var body: some View {
10 | Text(greet())
11 | }
12 | }
13 |
14 | struct ContentView_Previews: PreviewProvider {
15 | static var previews: some View {
16 | ContentView()
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/ios/ios/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UIApplicationSceneManifest
24 |
25 | UIApplicationSupportsMultipleScenes
26 |
27 | UISceneConfigurations
28 |
29 | UIWindowSceneSessionRoleApplication
30 |
31 |
32 | UISceneConfigurationName
33 | Default Configuration
34 | UISceneDelegateClassName
35 | $(PRODUCT_MODULE_NAME).SceneDelegate
36 |
37 |
38 |
39 |
40 | UILaunchStoryboardName
41 | LaunchScreen
42 | UIRequiredDeviceCapabilities
43 |
44 | armv7
45 |
46 | UISupportedInterfaceOrientations
47 |
48 | UIInterfaceOrientationPortrait
49 | UIInterfaceOrientationLandscapeLeft
50 | UIInterfaceOrientationLandscapeRight
51 |
52 | UISupportedInterfaceOrientations~ipad
53 |
54 | UIInterfaceOrientationPortrait
55 | UIInterfaceOrientationPortraitUpsideDown
56 | UIInterfaceOrientationLandscapeLeft
57 | UIInterfaceOrientationLandscapeRight
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/ios/ios/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/ios/ios/SceneDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import SwiftUI
3 |
4 | class SceneDelegate: UIResponder, UIWindowSceneDelegate {
5 |
6 | var window: UIWindow?
7 |
8 |
9 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
10 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
11 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
12 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
13 |
14 | // Create the SwiftUI view that provides the window contents.
15 | let contentView = ContentView()
16 |
17 | // Use a UIHostingController as window root view controller.
18 | if let windowScene = scene as? UIWindowScene {
19 | let window = UIWindow(windowScene: windowScene)
20 | window.rootViewController = UIHostingController(rootView: contentView)
21 | self.window = window
22 | window.makeKeyAndVisible()
23 | }
24 | }
25 |
26 | func sceneDidDisconnect(_ scene: UIScene) {
27 | // Called as the scene is being released by the system.
28 | // This occurs shortly after the scene enters the background, or when its session is discarded.
29 | // Release any resources associated with this scene that can be re-created the next time the scene connects.
30 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
31 | }
32 |
33 | func sceneDidBecomeActive(_ scene: UIScene) {
34 | // Called when the scene has moved from an inactive state to an active state.
35 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
36 | }
37 |
38 | func sceneWillResignActive(_ scene: UIScene) {
39 | // Called when the scene will move from an active state to an inactive state.
40 | // This may occur due to temporary interruptions (ex. an incoming phone call).
41 | }
42 |
43 | func sceneWillEnterForeground(_ scene: UIScene) {
44 | // Called as the scene transitions from the background to the foreground.
45 | // Use this method to undo the changes made on entering the background.
46 | }
47 |
48 | func sceneDidEnterBackground(_ scene: UIScene) {
49 | // Called as the scene transitions from the foreground to the background.
50 | // Use this method to save data, release shared resources, and store enough scene-specific state information
51 | // to restore the scene back to its current state.
52 | }
53 |
54 |
55 | }
56 |
57 |
--------------------------------------------------------------------------------
/ios/iosTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/ios/iosTests/iosTests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 | @testable import ios
3 |
4 | class iosTests: XCTestCase {
5 |
6 | override func setUp() {
7 | // Put setup code here. This method is called before the invocation of each test method in the class.
8 | }
9 |
10 | override func tearDown() {
11 | // Put teardown code here. This method is called after the invocation of each test method in the class.
12 | }
13 |
14 | func testExample() {
15 | // This is an example of a functional test case.
16 | // Use XCTAssert and related functions to verify your tests produce the correct results.
17 | }
18 |
19 | func testPerformanceExample() {
20 | // This is an example of a performance test case.
21 | self.measure {
22 | // Put the code you want to measure the time of here.
23 | }
24 | }
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/ios/iosUITests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/ios/iosUITests/iosUITests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 |
3 | class appNameUITests: XCTestCase {
4 |
5 | override func setUp() {
6 | // Put setup code here. This method is called before the invocation of each test method in the class.
7 |
8 | // In UI tests it is usually best to stop immediately when a failure occurs.
9 | continueAfterFailure = false
10 |
11 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
12 | }
13 |
14 | override func tearDown() {
15 | // Put teardown code here. This method is called after the invocation of each test method in the class.
16 | }
17 |
18 | func testExample() {
19 | // UI tests must launch the application that they test.
20 | let app = XCUIApplication()
21 | app.launch()
22 |
23 | // Use recording to get started writing UI tests.
24 | // Use XCTAssert and related functions to verify your tests produce the correct results.
25 | }
26 |
27 | func testLaunchPerformance() {
28 | if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) {
29 | // This measures how long it takes to launch your application.
30 | measure(metrics: [XCTOSSignpostMetric.applicationLaunch]) {
31 | XCUIApplication().launch()
32 | }
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/oat/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
2 | import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
3 |
4 | plugins {
5 | kotlin("multiplatform")
6 | id("com.android.library")
7 | id("kotlin-android-extensions")
8 | }
9 | group = "com.openastrotech.openastrotracker"
10 | version = "1.0-SNAPSHOT"
11 |
12 | repositories {
13 | gradlePluginPortal()
14 | google()
15 | jcenter()
16 | mavenCentral()
17 | }
18 | kotlin {
19 | android()
20 |
21 | ios {
22 | binaries {
23 | framework {
24 | baseName = "oat"
25 | }
26 | }
27 | }
28 |
29 | mingwX64("windows") {
30 | binaries {
31 | sharedLib {
32 | baseName = "oat"
33 | }
34 | }
35 | }
36 |
37 | sourceSets {
38 | val commonMain by getting {
39 | dependencies {
40 | implementation(kotlin("stdlib-jdk8"))
41 | implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1")
42 | implementation("io.ktor:ktor-network:1.4.2")
43 | implementation("io.ktor:ktor-client-core:1.4.2")
44 | }
45 | }
46 | val commonTest by getting {
47 | dependencies {
48 | implementation(kotlin("test-common"))
49 | implementation(kotlin("test-annotations-common"))
50 | }
51 | }
52 | val androidMain by getting {
53 | dependencies {
54 | implementation("com.google.android.material:material:1.2.1")
55 | implementation("io.ktor:ktor-client-android:1.4.2")
56 | }
57 | }
58 | val androidTest by getting {
59 | dependencies {
60 | implementation(kotlin("test-junit"))
61 | implementation("junit:junit:4.13.1")
62 | }
63 | }
64 | val iosMain by getting {
65 | dependencies {
66 | implementation("io.ktor:ktor-client-ios:1.4.2")
67 | }
68 | }
69 | val iosTest by getting
70 | val windowsMain by getting {
71 | dependencies {
72 | implementation("io.ktor:ktor-client-curl:1.4.2")
73 | }
74 | }
75 | }
76 | }
77 |
78 | tasks.withType().configureEach {
79 | kotlinOptions {
80 | jvmTarget = "1.8"
81 | // need use-experimental for Ktor CIO
82 | @Suppress("SuspiciousCollectionReassignment")
83 | freeCompilerArgs += listOf("-Xuse-experimental=kotlin.Experimental", "-progressive")
84 | // disable -Werror with: ./gradlew -PwarningsAsErrors=false
85 | allWarningsAsErrors = project.findProperty("warningsAsErrors") != "false"
86 | }
87 | }
88 |
89 | android {
90 | compileSdkVersion(30)
91 | sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
92 | defaultConfig {
93 | minSdkVersion(24)
94 | targetSdkVersion(30)
95 | versionCode = 1
96 | versionName = "1.0"
97 | }
98 | buildTypes {
99 | getByName("release") {
100 | isMinifyEnabled = false
101 | }
102 | }
103 | }
104 |
105 | val packForXcode by tasks.creating(Sync::class) {
106 | group = "build"
107 | val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
108 | val sdkName = System.getenv("SDK_NAME") ?: "iphonesimulator"
109 | val targetName = "ios" + if (sdkName.startsWith("iphoneos")) "Arm64" else "X64"
110 | val framework = kotlin.targets.getByName(targetName).binaries.getFramework(mode)
111 | inputs.property("mode", mode)
112 | dependsOn(framework.linkTask)
113 | val targetDir = File(buildDir, "xcode-frameworks")
114 | from({ framework.outputDirectory })
115 | into(targetDir)
116 | }
117 |
118 | tasks.getByName("build").dependsOn(packForXcode)
--------------------------------------------------------------------------------
/oat/src/androidMain/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/oat/src/androidMain/kotlin/com/openastrotech/openastrotracker/oat/network/TCPConnection.kt:
--------------------------------------------------------------------------------
1 | package com.openastrotech.openastrotracker.oat.network
2 |
3 | import io.ktor.network.selector.*
4 | import io.ktor.network.sockets.*
5 | import kotlinx.coroutines.Dispatchers
6 |
7 | //actual class TCPConnection(
8 | // override val address: String,
9 | // override val protocol: Connection.Protocol
10 | //) : Connection {
11 | //
12 | // override suspend fun command(command: String) {
13 | // aSocket(ActorSelectorManager(Dispatchers.IO)).udp().bind(
14 | // configure =
15 | // )
16 | // TODO("Not yet implemented")
17 | // }
18 | //
19 | // override suspend fun commandWithResponse(command: String): String {
20 | // TODO("Not yet implemented")
21 | // }
22 | //
23 | //}
--------------------------------------------------------------------------------
/oat/src/androidTest/kotlin/com/openastrotech/openastrotracker/oat/androidTest.kt:
--------------------------------------------------------------------------------
1 | package com.openastrotech.openastrotracker.oat
2 |
3 | import org.junit.Assert.assertTrue
4 | import org.junit.Test
5 |
6 | class AndroidGreetingTest {
7 |
8 |
9 |
10 | }
--------------------------------------------------------------------------------
/oat/src/commonMain/kotlin/com/openastrotech/openastrotracker/oat/MeadeTelescope.kt:
--------------------------------------------------------------------------------
1 | package com.openastrotech.openastrotracker.oat
2 |
3 | import com.openastrotech.openastrotracker.oat.network.Connection
4 | import com.openastrotech.openastrotracker.oat.response.DEC
5 | import com.openastrotech.openastrotracker.oat.response.RA
6 | import kotlinx.coroutines.flow.flow
7 |
8 | /**
9 | * Meade LX200 classic protocol client implementation with some extensions.
10 | */
11 | @Suppress("MemberVisibilityCanBePrivate")
12 | data class MeadeTelescope(val name: String, val connection: Connection) {
13 |
14 | // Initialize family
15 |
16 | /**
17 | * Put the Arduino in Serial Control Mode.
18 | */
19 | fun initializeScope() = command(":I#")
20 |
21 | // Sync control family
22 |
23 | /**
24 | * Synchronize Declination and Right Ascension. The values to be used have to be previously set
25 | * by [setRA] and [setDEC].
26 | */
27 | fun syncScope() = commandWithResponse(
28 | command = ":CM#",
29 | regex = Regex("""(NONE)"""),
30 | factory = { true }
31 | )
32 |
33 | // Distance family
34 |
35 | fun getSlewingStatus() = commandWithResponse(
36 | command = ":D#",
37 | regex = Regex("""(\s?)""")
38 | ) {
39 | it.first().isNotEmpty()
40 | }
41 |
42 | // GPS family
43 |
44 | // GET family
45 |
46 | fun getDEC() = commandWithResponse(
47 | command = ":GD#",
48 | regex = Regex("""([-+]?\d{2})\*(\d{2})'(\d{2})""")
49 | ) {
50 | val (degrees, minutes, seconds) = it.map(String::toInt)
51 | DEC(degrees, minutes, seconds)
52 | }
53 |
54 | fun getRA() = commandWithResponse(
55 | command = ":GR#",
56 | regex = Regex("""(\d{2}):(\d{2}):(\d{2})""")
57 | ) {
58 | val (hours, minutes, seconds) = it.map(String::toInt)
59 | RA(hours, minutes, seconds)
60 | }
61 |
62 | // SET family
63 |
64 | fun setDEC(dec: DEC) = commandWithStatus(
65 | command = with(dec) { ":Sd$degrees*$minutes:$seconds#" }
66 | )
67 |
68 | fun setRA(ra: RA) = commandWithStatus(
69 | command = with(ra) { ":Sd$hours:$minutes:$seconds#" }
70 | )
71 |
72 | // SET family extensions
73 |
74 | // Rate control family
75 |
76 | // Movement family
77 |
78 | // Movement extensions
79 |
80 | // Home family
81 |
82 | // Quit movement family
83 |
84 | // Extra OAT family
85 |
86 | fun setTrackingMode(track: Boolean) = commandWithStatus(
87 | command = ":MT${if (track) 1 else 0}#"
88 | )
89 |
90 |
91 | private fun command(command: String) = flow {
92 | emit(connection.command(command))
93 | }
94 |
95 | private fun commandWithResponse(
96 | command: String,
97 | regex: Regex,
98 | factory: (List) -> T
99 | ) = flow {
100 | val response = connection.commandWithResponse(command)
101 | regex.find(response.removeSuffix("#"))?.run {
102 | emit(factory(destructured.toList()))
103 | } ?: throw IllegalArgumentException(
104 | "Failed to deserialize response $response with regex $regex"
105 | )
106 | }
107 |
108 | private fun commandWithStatus(command: String) = commandWithResponse(
109 | command = command,
110 | regex = COMMAND_STATUS_REGEX,
111 | factory = COMMAND_STATUS_FACTORY
112 | )
113 |
114 | companion object {
115 | private val COMMAND_STATUS_REGEX = Regex("""(\d)""")
116 | private val COMMAND_STATUS_FACTORY: (List) -> Boolean = {
117 | when (it.first()) {
118 | "0" -> false
119 | "1" -> true
120 | else -> throw IllegalArgumentException("Failed to map String \"$this\" to Boolean")
121 | }
122 | }
123 | }
124 | }
--------------------------------------------------------------------------------
/oat/src/commonMain/kotlin/com/openastrotech/openastrotracker/oat/network/Connection.kt:
--------------------------------------------------------------------------------
1 | package com.openastrotech.openastrotracker.oat.network
2 |
3 | interface Connection {
4 |
5 | interface Factory {
6 | fun create(address: String): Connection
7 | }
8 |
9 | enum class Protocol(val factory: Factory) {
10 | // TCP(TCPConnection.FACTORY)
11 | }
12 |
13 | val address: String
14 |
15 | val protocol: Protocol
16 |
17 | suspend fun command(command: String)
18 |
19 | suspend fun commandWithResponse(command: String): String
20 |
21 | companion object {
22 | fun from(type: String, address: String) = Protocol.valueOf(type).factory.create(address)
23 | }
24 | }
--------------------------------------------------------------------------------
/oat/src/commonMain/kotlin/com/openastrotech/openastrotracker/oat/network/TCPConnection.kt:
--------------------------------------------------------------------------------
1 | package com.openastrotech.openastrotracker.oat.network
2 |
3 |
4 | import com.openastrotech.openastrotracker.oat.utils.logv
5 | import io.ktor.util.network.*
6 | import kotlinx.coroutines.Dispatchers
7 | import kotlin.coroutines.CoroutineContext
8 |
9 | @Suppress("EXPERIMENTAL_API_USAGE")
10 | data class TCPConnection(private val host: String, private val port: Int) : Connection {
11 |
12 | companion object {
13 | private const val TAG = "TCPClient"
14 | }
15 |
16 | object FACTORY : Connection.Factory {
17 | override fun create(address: String): Connection {
18 | val regex = Regex("""(.*):(.*)""")
19 | val (host, port) = regex.find(address)?.destructured
20 | ?: throw Exception("failed to parse address")
21 | return TCPConnection(host, port.toInt())
22 | }
23 | }
24 |
25 | override suspend fun command(command: String) {
26 | logv(TAG, "command() called with: command = $command")
27 | aSocket(ActorSelectorManager(Dispatchers.Default))
28 | .tcp()
29 | .connect(NetworkAddress(host, port))
30 | .use { socket ->
31 | logv(TAG, "sending command: $command")
32 | socket.openWriteChannel(true).write(command)
33 | }
34 | }
35 |
36 | override suspend fun commandWithResponse(command: String): String {
37 | logv(TAG, "preparing command with response: $command@$address")
38 |
39 | aSocket(ActorSelectorManager(Dispatchers.IO))
40 | .tcp()
41 | .connect(NetworkAddress(host, port))
42 | .use { socket ->
43 | val writeChannel = socket.openWriteChannel(true)
44 |
45 |
46 | logv(TAG, "sending command: $command")
47 | writeChannel.write(command)
48 | writeChannel.close()
49 |
50 | val readChannel = socket.openReadChannel()
51 | logv(TAG, "waiting for response")
52 | val packet = readChannel.readRemaining()
53 | return packet.readerUTF8().readText()
54 | }
55 | }
56 |
57 | override val address: String
58 | get() = "$host:$port"
59 |
60 | override val protocol: Connection.Protocol
61 | get() = Connection.Protocol.TCP
62 |
63 | }
--------------------------------------------------------------------------------
/oat/src/commonMain/kotlin/com/openastrotech/openastrotracker/oat/network/TCPSocketDelegate.kt:
--------------------------------------------------------------------------------
1 | package com.openastrotech.openastrotracker.oat.network
2 |
3 | interface TCPSocketDelegate {
4 |
5 | fun send(host: String, port: Int, message: String)
6 |
7 | fun sendAndRead(host: String, port: Int, bufferSize: Int): String
8 |
9 | }
--------------------------------------------------------------------------------
/oat/src/commonMain/kotlin/com/openastrotech/openastrotracker/oat/network/UDPSocket.kt:
--------------------------------------------------------------------------------
1 | package com.openastrotech.openastrotracker.oat.network
2 |
3 | import io.ktor.util.network.*
4 | import io.ktor.utils.io.core.*
5 |
6 | interface UDPSocket : Closeable {
7 |
8 | suspend fun send(data: ByteArray)
9 |
10 | suspend fun receive(buffer: ByteArray): Int
11 |
12 | interface Factory {
13 |
14 | fun create(address: NetworkAddress): UDPSocket
15 |
16 | }
17 |
18 | }
19 |
20 |
--------------------------------------------------------------------------------
/oat/src/commonMain/kotlin/com/openastrotech/openastrotracker/oat/network/skyfi/SkyFiDiscovery.kt:
--------------------------------------------------------------------------------
1 | package com.openastrotech.openastrotracker.oat.network.skyfi
2 |
3 | import com.openastrotech.openastrotracker.oat.MeadeTelescope
4 | import com.openastrotech.openastrotracker.oat.network.Connection
5 | import com.openastrotech.openastrotracker.oat.network.UDPSocket
6 | import com.openastrotech.openastrotracker.oat.utils.loge
7 | import com.openastrotech.openastrotracker.oat.utils.logv
8 | import io.ktor.util.network.*
9 | import io.ktor.utils.io.core.*
10 | import io.ktor.utils.io.errors.*
11 | import kotlinx.coroutines.channels.awaitClose
12 | import kotlinx.coroutines.delay
13 | import kotlinx.coroutines.flow.callbackFlow
14 | import kotlinx.coroutines.isActive
15 | import kotlinx.coroutines.launch
16 |
17 | @Suppress("EXPERIMENTAL_API_USAGE")
18 | class SkyFiDiscovery(private val udpSocketFactory: UDPSocket.Factory) {
19 |
20 | companion object {
21 |
22 | private const val TAG = "SkyFiDiscovery"
23 |
24 | private const val COMMUNICATION_PORT = 4030
25 |
26 | private const val BROADCAST_DELAY = 1000L
27 | }
28 |
29 | fun discover(
30 | remoteAddress: NetworkAddress
31 | ) = callbackFlow {
32 | val socket = udpSocketFactory.create(remoteAddress)
33 |
34 | // send discovery packets (broadcast)
35 | launch {
36 | do {
37 | logv(TAG, "Sending discovery datagram")
38 |
39 | val message = "skyfi:?"
40 | socket.send(message.toByteArray())
41 |
42 | delay(BROADCAST_DELAY)
43 | } while (isActive and (BROADCAST_DELAY > 0))
44 | }
45 |
46 | var closed = false
47 |
48 | // receive incoming packets
49 | launch {
50 | while (isActive) {
51 | logv(TAG, "Waiting for incoming datagram")
52 |
53 | val buffer = ByteArray(1024)
54 |
55 | val size: Int = try {
56 | socket.receive(buffer)
57 | } catch (e: IOException) {
58 | if (!closed) throw e else continue
59 | }
60 | val message = String(buffer, 0, size)
61 |
62 | logv(TAG, "Received message $message")
63 |
64 | // check if the datagram matches expected response regex
65 | // this way we ignore our own broadcast and not parsable datagrams
66 | // expected result of form: skyfi:OATerScope@192.168.178.76
67 | val regex = Regex("""skyfi:(.*)@(.*)""")
68 | if (!regex.matches(message)) {
69 | logv(TAG, "message does not match regex, skip")
70 | continue
71 | }
72 |
73 | logv(TAG, "A device answered with: $message")
74 |
75 | // parse the message by using regex
76 | regex.find(message)?.let { result ->
77 | val (name, _) = result.destructured
78 | val telescope = MeadeTelescope(
79 | name,
80 | // TCPConnection(host, COMMUNICATION_PORT)
81 | object : Connection {
82 | override val address: String
83 | get() = TODO("Not yet implemented")
84 | override val protocol: Connection.Protocol
85 | get() = TODO("Not yet implemented")
86 |
87 | override suspend fun command(command: String) {
88 | TODO("Not yet implemented")
89 | }
90 |
91 | override suspend fun commandWithResponse(command: String): String {
92 | TODO("Not yet implemented")
93 | }
94 |
95 | }
96 | )
97 |
98 | logv(TAG, "Discovered $telescope")
99 |
100 | offer(telescope)
101 | } ?: run {
102 | loge(TAG, "Failed to parse message=\"$message\"")
103 | }
104 |
105 | }
106 | }
107 |
108 | awaitClose {
109 | logv(TAG, "Closing")
110 | closed = true
111 | socket.close()
112 | }
113 | }
114 |
115 | }
--------------------------------------------------------------------------------
/oat/src/commonMain/kotlin/com/openastrotech/openastrotracker/oat/response/DEC.kt:
--------------------------------------------------------------------------------
1 | package com.openastrotech.openastrotracker.oat.response
2 |
3 | import kotlin.math.abs
4 |
5 | data class DEC(
6 | val degrees: Int,
7 | val minutes: Int,
8 | val seconds: Int
9 | ) {
10 |
11 | companion object {
12 | private const val MAX_DEGREES = 90
13 | private const val MINUTES_PER_DEGREE = 60
14 | private const val SECONDS_PER_MINUTE = 60
15 | private const val SECONDS_PER_HOUR = MINUTES_PER_DEGREE * SECONDS_PER_MINUTE
16 | }
17 |
18 | private constructor(totalSeconds: Int) : this(
19 | degrees = (totalSeconds / SECONDS_PER_HOUR) % MAX_DEGREES,
20 | minutes = abs(totalSeconds) % SECONDS_PER_HOUR / SECONDS_PER_MINUTE,
21 | seconds = abs(totalSeconds) % SECONDS_PER_MINUTE
22 | )
23 |
24 | fun add(degrees: Int = 0, minutes: Int = 0, seconds: Int = 0) = DEC(
25 | (degrees + this.degrees) * SECONDS_PER_HOUR +
26 | (minutes + this.minutes) * SECONDS_PER_MINUTE +
27 | seconds + this.seconds
28 | )
29 |
30 | }
--------------------------------------------------------------------------------
/oat/src/commonMain/kotlin/com/openastrotech/openastrotracker/oat/response/RA.kt:
--------------------------------------------------------------------------------
1 | package com.openastrotech.openastrotracker.oat.response
2 |
3 | import kotlin.math.abs
4 |
5 | data class RA(
6 | val hours: Int,
7 | val minutes: Int,
8 | val seconds: Int
9 | ) {
10 |
11 | companion object {
12 | private const val MAX_HOURS = 24
13 | private const val MINUTES_PER_HOUR = 60
14 | private const val SECONDS_PER_MINUTE = 60
15 | private const val SECONDS_PER_HOUR = MINUTES_PER_HOUR * SECONDS_PER_MINUTE
16 | }
17 |
18 | private constructor(totalSeconds: Int) : this(
19 | hours = (totalSeconds / SECONDS_PER_HOUR) % MAX_HOURS,
20 | minutes = abs(totalSeconds) % SECONDS_PER_HOUR / SECONDS_PER_MINUTE,
21 | seconds = abs(totalSeconds) % SECONDS_PER_MINUTE
22 | )
23 |
24 | fun add(hours: Int = 0, minutes: Int = 0, seconds: Int = 0) = RA(
25 | (hours + this.hours) * SECONDS_PER_HOUR +
26 | (minutes + this.minutes) * SECONDS_PER_MINUTE +
27 | seconds + this.seconds
28 | )
29 |
30 | }
--------------------------------------------------------------------------------
/oat/src/commonMain/kotlin/com/openastrotech/openastrotracker/oat/utils/Logger.kt:
--------------------------------------------------------------------------------
1 | package com.openastrotech.openastrotracker.oat.utils
2 |
3 | var MEADE_LOGGER: Logger? = null
4 |
5 | internal fun logv(tag: String, message: String) =
6 | MEADE_LOGGER?.logv(tag, message)
7 |
8 | internal fun loge(tag: String, message: String, exception: Exception? = null) =
9 | MEADE_LOGGER?.loge(tag, message, exception)
10 |
11 | interface Logger {
12 | fun logv(tag: String, message: String)
13 | fun loge(tag: String, message: String, exception: Exception? = null)
14 | }
--------------------------------------------------------------------------------
/oat/src/iosMain/kotlin/com/openastrotech/openastrotracker/oat/network/TCPConnection.kt:
--------------------------------------------------------------------------------
1 | package com.openastrotech.openastrotracker.oat.network
2 |
3 | actual class TCPConnection(
4 | override val address: String
5 | ) : Connection {
6 |
7 | override suspend fun command(command: String) {
8 | TODO("Not yet implemented")
9 | }
10 |
11 | override suspend fun commandWithResponse(command: String): String {
12 | TODO("Not yet implemented")
13 | }
14 |
15 | }
--------------------------------------------------------------------------------
/oat/src/iosTest/kotlin/com/openastrotech/openastrotracker/oat/iosTest.kt:
--------------------------------------------------------------------------------
1 | package com.openastrotech.openastrotracker.oat
2 |
3 | import kotlin.test.Test
4 | import kotlin.test.assertTrue
5 |
6 | class IosGreetingTest {
7 |
8 | }
--------------------------------------------------------------------------------
/oat/src/windowsMain/kotlin/com/openastrotech/openastrotracker/oat/network/TCPConnection.kt:
--------------------------------------------------------------------------------
1 | package com.openastrotech.openastrotracker.oat.network
2 |
3 | actual class TCPConnection(
4 | override val address: String,
5 | override val protocol: Connection.Protocol
6 | ) : Connection {
7 | override suspend fun command(command: String) {
8 | TODO("Not yet implemented")
9 | }
10 |
11 | override suspend fun commandWithResponse(command: String): String {
12 | TODO("Not yet implemented")
13 | }
14 |
15 | }
--------------------------------------------------------------------------------
/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | gradlePluginPortal()
4 | google()
5 | jcenter()
6 | mavenCentral()
7 | }
8 | resolutionStrategy {
9 | eachPlugin {
10 | if (requested.id.namespace == "com.android" || requested.id.name == "kotlin-android-extensions") {
11 | useModule("com.android.tools.build:gradle:4.0.1")
12 | }
13 | }
14 | }
15 | }
16 | rootProject.name = "OpenAstroTracker"
17 |
18 |
19 | include(":android")
20 | include(":oat")
21 |
22 |
--------------------------------------------------------------------------------