Compare commits
320 Commits
old-webpac
...
V1.0.6
| Author | SHA1 | Date | |
|---|---|---|---|
| f281289435 | |||
| 0bc9a4e83c | |||
| 0175e9120d | |||
|
|
5cff69fac7 | ||
|
|
c04c0dfd04 | ||
|
|
a3b72966c7 | ||
|
|
36ccf29eac | ||
| c742d037a6 | |||
| 8e127a1cb5 | |||
|
|
284f96a42d | ||
|
|
c9fd44c337 | ||
|
|
29ce117898 | ||
|
|
efee0b4a71 | ||
|
|
f2557e5bf6 | ||
|
|
74263ed71a | ||
|
|
cbbb7d200c | ||
|
|
4f7d945ad0 | ||
|
|
95af5357d5 | ||
| 0bafd9a96c | |||
|
|
f58a597b90 | ||
|
|
60b260c3e2 | ||
|
|
203fc1fdad | ||
|
|
86fe6b27f6 | ||
|
|
47b1bae815 | ||
|
|
5a5407920b | ||
| 45a38cb36b | |||
|
|
961fa5fc80 | ||
|
|
09633132e0 | ||
| c3e1411bfe | |||
|
|
35c4e89c9e | ||
|
|
359fca424c | ||
|
|
6846c187c3 | ||
|
|
0b0ddda4b9 | ||
|
|
0f5c652bd4 | ||
|
|
7b31b209e7 | ||
|
|
7243592d03 | ||
|
|
92d6065e01 | ||
| 3916aefe6b | |||
|
|
3ec9788163 | ||
| ddfb2ed5b9 | |||
| 6a181b0139 | |||
| bf24533cdd | |||
| 0d8f3d3e0a | |||
| f6e4d3f8e3 | |||
|
|
4e46f2dc3a | ||
|
|
acae6ba9c0 | ||
|
|
1aafb0550a | ||
|
|
811ab2727b | ||
|
|
7d61d084f1 | ||
|
|
160eaaa0ce | ||
|
|
5ee5c3695d | ||
|
|
77de93f9c3 | ||
|
|
cc4efce26d | ||
|
|
5fef565e4b | ||
|
|
d683f4a520 | ||
|
|
7ce024a768 | ||
| 0d8915930c | |||
| d9ca5bd7fc | |||
| 66f0042e1c | |||
| 451222ee5d | |||
| d66fdb7c58 | |||
|
|
ee6d73a4cf | ||
|
|
8750ea54a9 | ||
|
|
0134e984f0 | ||
| 60b53ec435 | |||
| 172659b1c4 | |||
| ffbb040f22 | |||
| 13cba558d2 | |||
|
|
255b5f503c | ||
| f02cb8cbc0 | |||
| f41e03ddf8 | |||
| c6778bd251 | |||
| 095567eb44 | |||
| 15bf96de3e | |||
| bdaf04e3b5 | |||
| a679c5915e | |||
| 9b6fd1355e | |||
| 98c5f4424e | |||
| 02dee5ad0d | |||
| b31667a77f | |||
| e61a425ba3 | |||
| debe7b8147 | |||
| 71a6cc6de3 | |||
| 9e07c493dc | |||
| 6fc1193119 | |||
| e1bc7579db | |||
| e09039f019 | |||
| e517ae4766 | |||
| 62c2d57606 | |||
| 1633cedec2 | |||
| e12a8cecee | |||
| 470e3f3e91 | |||
| ee8f6291cd | |||
| 13c09f5a8c | |||
| 96c09f4977 | |||
| ea5ea207a9 | |||
| 5245305daa | |||
| a82d954d77 | |||
| e5daaaee43 | |||
| 904a3e0b64 | |||
| 459c6fb316 | |||
| 839e118129 | |||
| 45562414e4 | |||
| ee5b70fd3c | |||
| 5644272d5e | |||
| ff87b8646a | |||
| 033fdf3483 | |||
| 5d55140681 | |||
| d5c7a96ad7 | |||
| e767c1fb3d | |||
| 97c68d9b17 | |||
|
|
6a60c3c93b | ||
|
|
dbb1e7a977 | ||
|
|
5c5462186f | ||
|
|
0352bb9051 | ||
|
|
46d565fbe7 | ||
|
|
7a34e36c4e | ||
|
|
63e5ff7afc | ||
| a9f1018add | |||
| 02e4446e78 | |||
| f7e3e2122a | |||
| 5887913f07 | |||
| 3850544ebb | |||
| fee562d6e7 | |||
| ee7b90cd93 | |||
| 5a3323a0ea | |||
| e8e0de3ae9 | |||
| a84e4197d4 | |||
| 9e9c4b0ec6 | |||
| fa5be769e2 | |||
| b5c88e6284 | |||
| bcc32f9b28 | |||
| 7e4b04570e | |||
| b3bfa36c77 | |||
|
|
6abc675d12 | ||
| 10da2d6ba0 | |||
| 167f1c8037 | |||
| e858daae64 | |||
| 009cf4aaf0 | |||
| 0019b25244 | |||
| a6c6a4feb0 | |||
|
|
d37fcda0db | ||
| 80b1c2c3ec | |||
| 203af48961 | |||
| 32baf07c39 | |||
|
|
e3f104ccf9 | ||
|
|
d7a293517d | ||
|
|
7eaa81ba14 | ||
|
|
8097ec6368 | ||
|
|
b76f832068 | ||
|
|
163564ae7d | ||
|
|
36ad4c5122 | ||
|
|
a856f227bc | ||
| 130831f050 | |||
| 9a4d38be31 | |||
|
|
5c6f189396 | ||
| 9c8278df37 | |||
| 2881d6a4fc | |||
| a9a12d0dc3 | |||
| fb8c3b1824 | |||
| cd9d6d5027 | |||
| daba3332e8 | |||
| 6dd11300d3 | |||
| 4d4bb81099 | |||
| 94ee69642a | |||
| 892772bcb9 | |||
| 364f1d4c38 | |||
| 196cc5aed9 | |||
| 086a9a9654 | |||
| d7eed47d2c | |||
|
|
24e54f7e5c | ||
|
|
2630a1707d | ||
| 9f75aaac99 | |||
| 171cba0833 | |||
| ebb55ffe5e | |||
| 51476afbb3 | |||
| c976f97e78 | |||
| 1d089c8d93 | |||
| defaafdd54 | |||
| 809a05c864 | |||
| 1ac4e1ce40 | |||
| 733cbf2dbb | |||
| 10d0703d78 | |||
| b91337f831 | |||
| 4afeb7a146 | |||
| 667b542893 | |||
| adf0133cd3 | |||
| cc57a8b80a | |||
|
|
1ad22482a4 | ||
|
|
a52ec14845 | ||
|
|
bebf53e5eb | ||
| 62f0ef1ce8 | |||
| 4a26a05cdc | |||
| b9b2898392 | |||
| fcd3f4a6bb | |||
| b784a6c605 | |||
| 043aa171ca | |||
| bac321f48e | |||
| e26369f133 | |||
| 6d68c2d55a | |||
|
|
b801417c01 | ||
|
|
1ecfbacc89 | ||
| 6ea687fa47 | |||
| f0d433a0eb | |||
| 6a3127a35a | |||
| 6ac4fd9cda | |||
|
|
466a4fbd8b | ||
| a0984782a8 | |||
| 8c4d70ac28 | |||
| 991b96d54d | |||
| c128b18418 | |||
| 97183cb304 | |||
| 9952566b6b | |||
|
|
59fa703595 | ||
| 86a7ec13ad | |||
| 1705128482 | |||
|
|
fa5d53aef4 | ||
| 920da0f321 | |||
| 17481ba03c | |||
| c3179194b8 | |||
|
|
eacaebd84b | ||
| 64af566b86 | |||
| e2440485d9 | |||
|
|
6743ed778e | ||
| 4bacd4aa8f | |||
| 5505313e3e | |||
| 71a2927372 | |||
| 6051b18796 | |||
| 4208ad44a2 | |||
| fbb96ba838 | |||
|
|
ec7ab0faee | ||
| c7b097fe23 | |||
| 3e7ff741a3 | |||
| 1beba0131a | |||
| 029181329a | |||
| e634ac5381 | |||
| 2c7e0f39bc | |||
| 887e905343 | |||
| dbfe89998e | |||
| d5c581170f | |||
| d2c0257b8f | |||
| 5c87a5a282 | |||
| 0a1dee882a | |||
| 0735224dd1 | |||
| dfda842c7b | |||
| adca2915b7 | |||
| 3e95dfeee3 | |||
| 234d809ebf | |||
| 4d27fc8c48 | |||
| ed991d3f57 | |||
| 18f6a5226f | |||
| e15057d682 | |||
| 9b7eb913ae | |||
| ed38edd880 | |||
| 5cbf624284 | |||
| 32ed36b93f | |||
| 2812ab9055 | |||
| 2c18ee6f61 | |||
| f9e6b8fc17 | |||
| d9adc91256 | |||
| 935c8e32da | |||
| 8784f79014 | |||
| 19874cd007 | |||
| 127bd5b630 | |||
| de3ab81be2 | |||
| 242bfa012e | |||
| 581e7143f7 | |||
| 836b56b69d | |||
| 9827bb2c69 | |||
| 6083ec262c | |||
| 0ef138c865 | |||
| b8b6467633 | |||
| 88f16c0421 | |||
| a2dac4bbbb | |||
| d624637e3e | |||
| 15217c640a | |||
| 7716f56ea1 | |||
| ee8aa52dd8 | |||
| d0b215f022 | |||
| 782a245c17 | |||
| ff277a41ae | |||
| c6313bafdf | |||
| 8e777ee281 | |||
| 84c0017e2a | |||
| 5e5e7fee49 | |||
| 4aa4602f69 | |||
| 29d5652834 | |||
| 3fe01239b3 | |||
| cbadd2a2c1 | |||
| d855f61347 | |||
| b20103d5f1 | |||
| e271ff091e | |||
| 21afcdb036 | |||
| 98ac5c8dfc | |||
| 7f08269796 | |||
| b30a3226a5 | |||
| 9da40f2528 | |||
| e5d3e08a75 | |||
| 8b6c190e15 | |||
| afdaf13048 | |||
| a8cf4ec9a4 | |||
| 5270317e2d | |||
| 9f5d5a3be3 | |||
| 399726d563 | |||
| 447533ed87 | |||
| cdaa6d76e5 | |||
| fbedf9e95e | |||
| 865141d945 | |||
| d0647ba1bb | |||
| d763448a12 | |||
| 72aae72dcf | |||
| 29a68edc0c | |||
| fc4b18274b | |||
| be263fcd6b | |||
| ca5ab2d74a | |||
| b86d7dd434 | |||
| 775a91351a | |||
| 2e0c9c49b5 | |||
| 77260542e1 | |||
| 3b8bec2f6c |
@@ -64,6 +64,7 @@ module.exports = {
|
|||||||
'space-in-parens': [
|
'space-in-parens': [
|
||||||
'error',
|
'error',
|
||||||
'always'
|
'always'
|
||||||
]
|
],
|
||||||
|
'no-var': 'error'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
11
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# To get started with Dependabot version updates, you'll need to specify which
|
||||||
|
# package ecosystems to update and where the package manifests are located.
|
||||||
|
# Please see the documentation for all configuration options:
|
||||||
|
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||||
|
|
||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "npm" # See documentation for possible values
|
||||||
|
directory: "/" # Location of package manifests
|
||||||
|
schedule:
|
||||||
|
interval: "weekly"
|
||||||
13
.gitignore
vendored
@@ -14,4 +14,15 @@
|
|||||||
node_modules
|
node_modules
|
||||||
|
|
||||||
# ignore dist folder (this repo only contains source code!)
|
# ignore dist folder (this repo only contains source code!)
|
||||||
/dist
|
/dist
|
||||||
|
|
||||||
|
*.secret.json
|
||||||
|
|
||||||
|
# ignore all latex files except .tex
|
||||||
|
*.aux
|
||||||
|
*.fls
|
||||||
|
*.synctex.gz
|
||||||
|
*.fdb_latexmk
|
||||||
|
._wordcount_selection.tex
|
||||||
|
|
||||||
|
AppMarketing
|
||||||
55
LICENSE
@@ -618,57 +618,4 @@ an absolute waiver of all civil liability in connection with the
|
|||||||
Program, unless a warranty or assumption of liability accompanies a
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
copy of the Program in return for a fee.
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
state the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program does terminal interaction, make it output a short
|
|
||||||
notice like this when it starts in an interactive mode:
|
|
||||||
|
|
||||||
<program> Copyright (C) <year> <name of author>
|
|
||||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, your program's commands
|
|
||||||
might be different; for a GUI interface, you would use an "about box".
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or school,
|
|
||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
|
||||||
For more information on this, and how to apply and follow the GNU GPL, see
|
|
||||||
<https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
The GNU General Public License does not permit incorporating your program
|
|
||||||
into proprietary programs. If your program is a subroutine library, you
|
|
||||||
may consider it more useful to permit linking proprietary applications with
|
|
||||||
the library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License. But first, please read
|
|
||||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
|
||||||
36
README.md
@@ -22,9 +22,19 @@
|
|||||||
<img alt="App Version" src="https://img.shields.io/github/package-json/v/simplePCBuilding/libreevent.svg?label=Development Version">
|
<img alt="App Version" src="https://img.shields.io/github/package-json/v/simplePCBuilding/libreevent.svg?label=Development Version">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
A fully featured, fully free and open source event management solution you can host yourself, to manage your event and sell tickets. All you need is a webserver that can run node.js!
|
<div id="donate" align="center">
|
||||||
|
<a href="https://store.janishutz.com/donate" target="_blank"><img src="https://store-cdn.janishutz.com/static/support-me.jpg" width="150px"></a>
|
||||||
|
</div>
|
||||||
|
|
||||||
Visit our [website](https://libreevent.janishutz.com)
|
A fully featured, free and open source event management solution you can host yourself, to manage your event and sell tickets. All you need is a webserver that can run node.js!
|
||||||
|
|
||||||
|
Visit the project's [website](https://libreevent.janishutz.com)
|
||||||
|
|
||||||
|
libreǝvent IS FREE SOFTWARE. IT IS PROVIDED "AS IS" AND AS SUCH COMES WITH ABSOLUTELY NO WARRANTY TO THE EXTENT PERMITTED BY APPLICABLE LAW. If anything does not work, please report it back, but do not expect it to be fixed immediately, as this software is developed by volunteers in their free time.
|
||||||
|
|
||||||
|
# Download
|
||||||
|
You may download this project using the GitHub releases page or the direct links on the [libreevent website](https://libreevent.janishutz.com/download) as this only downloads the ready-to-distribute version, not the development version.
|
||||||
|
Alternatively, you may download the project directly from GitHub (by cloning it or downloading the code) but you'll have to compile and package the project [manually](https://libreevent.janishutz.com/docs/contributing/packaging).
|
||||||
|
|
||||||
# System requirements
|
# System requirements
|
||||||
- node.js V16.0+
|
- node.js V16.0+
|
||||||
@@ -33,9 +43,8 @@ Visit our [website](https://libreevent.janishutz.com)
|
|||||||
- any CPU from the last 10 years
|
- any CPU from the last 10 years
|
||||||
- Any operating system that can run node.js
|
- Any operating system that can run node.js
|
||||||
|
|
||||||
# Download
|
# Roadmap
|
||||||
You may download this project using the GitHub releases page or the direct links on the [libreevent website](https://libreevent.janishutz.com/download) as this only downloads the ready-to-distribute version, not the development version.
|
There are a few features planned for libreevent. Please discuss other ideas in the issue I opened specifically for this. (see #12)
|
||||||
Alternatively, you may download the project directly from GitHub (by cloning it or downloading the code) but you'll have to compile and package the project [manually](https://libreevent.janishutz.com/docs/contributing/packaging).
|
|
||||||
|
|
||||||
# Contributing
|
# Contributing
|
||||||
If you want to contribute to this project, please read more [here](https://libreevent.janishutz.com/docs/contributing). Until the end of October 2023, no contributions can be accepted into master.
|
If you want to contribute to this project, please read more [here](https://libreevent.janishutz.com/docs/contributing). Until the end of October 2023, no contributions can be accepted into master.
|
||||||
@@ -52,19 +61,16 @@ If you like this project and it helped you save money, please consider donating
|
|||||||
- [website/](/website/): contains all of the website files:
|
- [website/](/website/): contains all of the website files:
|
||||||
- [website/dist/](/website/dist/): contains all the ready to distribute website files
|
- [website/dist/](/website/dist/): contains all the ready to distribute website files
|
||||||
- [website/src/](/website/src/): contains all of the source files (markdown format) for the website. These files are converted into HTML by the build script.
|
- [website/src/](/website/src/): contains all of the source files (markdown format) for the website. These files are converted into HTML by the build script.
|
||||||
- [package.js](/package.js): collects all of the files of the project and copies them into the [dist/](/dist/) folder. It also minifies the files in the process to reduce package size.
|
- [package.sh](/package.sh): collects all of the files of the project and copies them into the [dist/](/dist/) folder. It also automatically compiles the webapps and removes unnecessary files as well as resetting the databases and settings to the defaults.
|
||||||
- [.eslintrc.js](/.eslintrc.js): ESlint config, the linter used for the project
|
- [.eslintrc.js](/.eslintrc.js): ESlint config, the linter used for the project. Before starting a PR, make sure the linter is happy!
|
||||||
- [.gitignore](/.gitignore): ignored files, currently is node_modules & log files.
|
- [notes.md](./notes.md): Project notes, including future plans for it.
|
||||||
|
|
||||||
You may notice some additional folders appearing after running
|
You may notice some additional folders appearing after running
|
||||||
```
|
```
|
||||||
npm run package
|
./package.sh
|
||||||
```
|
```
|
||||||
This is to shrink the repository size. Distribution ready files can be found in the releases or on our [website](https://libreevent.janishutz.com/download).
|
This is to shrink the repository size. Distribution ready files can be found in the releases or on our [website](https://libreevent.janishutz.com/download).
|
||||||
|
|
||||||
## This project is currently NOT ready to be used!
|
<div id="donate" align="center">
|
||||||
Development of this project is currently ongoing and no stable version is available yet.
|
<img src="https://store-cdn.janishutz.com/static/support-me.jpg" width="150px">
|
||||||
|
</div>
|
||||||
|
|
||||||
## ROADMAP
|
|
||||||
The goal is to get this tool fully functioning by the End of September 2023.
|
|
||||||
|
|||||||
13
SECURITY.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
libreevent gets security updates as part of regular software updates. Since there is only one major version currently, only this one gets updates
|
||||||
|
|
||||||
|
| Version | Supported |
|
||||||
|
| ------- | ------------------ |
|
||||||
|
| 1.0.x | :white_check_mark: |
|
||||||
|
| 0.x.x | :x: |
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
Please open an issue if you have discovered a security problem or send a mail to [development@janishutz.com](mailto:development@janishutz.com)
|
||||||
BIN
assets/AppMarketing/Android/ScannerPixel7Pro.png
Normal file
|
After Width: | Height: | Size: 2.3 MiB |
BIN
assets/AppMarketing/Android/StartPagePixel7Pro.png
Normal file
|
After Width: | Height: | Size: 95 KiB |
3
assets/basicTicketTemplate/README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Ticket Template
|
||||||
|
|
||||||
|
This template can be used by libreevent if you do not edit the template. It is entirely copyleft and you can change it to your liking. The LaTex document is included with libreevent.
|
||||||
BIN
assets/basicTicketTemplate/basicTicketTemplate.pdf
Normal file
25
assets/basicTicketTemplate/basicTicketTemplate.tex
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
\documentclass[11pt]{article}
|
||||||
|
|
||||||
|
% Imports %
|
||||||
|
\usepackage{amsmath}
|
||||||
|
\usepackage{graphicx}
|
||||||
|
\usepackage{subcaption}
|
||||||
|
\usepackage[export]{adjustbox}
|
||||||
|
\usepackage{tcolorbox}
|
||||||
|
\usepackage{xcolor}
|
||||||
|
\usepackage[utf8]{inputenc}
|
||||||
|
\usepackage[a4paper]{geometry}
|
||||||
|
|
||||||
|
\addtolength{\oddsidemargin}{-0.5in}
|
||||||
|
\addtolength{\textwidth}{1in}
|
||||||
|
\addtolength{\evensidemargin}{-0.55in}
|
||||||
|
\addtolength{\topmargin}{-0.75in}
|
||||||
|
\addtolength{\textheight}{1.5in}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
\begin{tcolorbox}[colback=gray!5!white,colframe=black!75!black,title=Your Ticket - libreevent event management solution]
|
||||||
|
\vspace{6cm}
|
||||||
|
\end{tcolorbox}
|
||||||
|
|
||||||
|
\end{document}
|
||||||
BIN
assets/favicon.ico
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
assets/launchTrailerThumbnail.png
Normal file
|
After Width: | Height: | Size: 355 KiB |
BIN
assets/launchTrailerThumbnail.xcf
Normal file
BIN
assets/logo.png
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 698 KiB |
BIN
assets/logo.xcf
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
22
notes.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# DEPLOY
|
||||||
|
For deployment create the following items:
|
||||||
|
- libreevent-[VERSION HERE]-npm.zip (contains the node_modules folder from src/server)
|
||||||
|
- libreevent-[VERSION HERE]-prebuilt.zip (contains a ready-to-use compiled version of libreevent (main download))
|
||||||
|
- libreevent-[VERSION HERE]-full-icu.zip (contains the package.json file which can be used if full-icu is not enabled in Node.js)
|
||||||
|
-> This can be achieved by running the bash script `package.sh` in the root folder of the project
|
||||||
|
|
||||||
|
|
||||||
|
# Links to apps
|
||||||
|
- https://play.google.com/store/apps/details?id=com.janishutz.libreevent
|
||||||
|
- https://apps.apple.com/ch/app/libreevent-entry-control/id6464594870?l=en-GB
|
||||||
|
|
||||||
|
|
||||||
|
# PLANS
|
||||||
|
- Website: Add ids to titles
|
||||||
|
|
||||||
|
- FUTURE: Implement Permission system
|
||||||
|
- FUTURE: Add Admin profile (page to change account settings per person like changing pwd)
|
||||||
|
- FUTURE: add multi-language support
|
||||||
|
- FUTURE: Guest purchase
|
||||||
|
- FUTURE: Colour for event banner background
|
||||||
|
- FUTURE: add webpack (or any other minifying tool) to project website to decrease file size (OPTIONAL)
|
||||||
13
package-lock.json
generated
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"name": "libreevent",
|
||||||
|
"version": "1.0.1",
|
||||||
|
"lockfileVersion": 3,
|
||||||
|
"requires": true,
|
||||||
|
"packages": {
|
||||||
|
"": {
|
||||||
|
"name": "libreevent",
|
||||||
|
"version": "1.0.1",
|
||||||
|
"license": "GPL-3.0-or-later"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
/*
|
|
||||||
* libreevent - package.js
|
|
||||||
*
|
|
||||||
* Created by Janis Hutz 05/14/2023, Licensed under the GPL V3 License
|
|
||||||
* https://janishutz.com, development@janishutz.com
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "libreevent",
|
"name": "libreevent",
|
||||||
"version": "1.0.0",
|
"version": "1.0.6",
|
||||||
"description": "A free and open source event management solution",
|
"description": "A free and open source event management solution",
|
||||||
"main": "/dist/app.js",
|
"main": "/dist/app.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
181
package.sh
Executable file
@@ -0,0 +1,181 @@
|
|||||||
|
#
|
||||||
|
# libreevent - package.sh
|
||||||
|
#
|
||||||
|
# Created by Janis Hutz 10/12/2023, Licensed under the GPL V3 License
|
||||||
|
# https://janishutz.com, development@janishutz.com
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
v="V1.0.6"
|
||||||
|
|
||||||
|
echo "
|
||||||
|
_ _ _ _
|
||||||
|
| (_) | | |
|
||||||
|
| |_| |__ _ __ ___ _____ _____ _ __ | |_
|
||||||
|
| | | '_ \\| '__/ _ \\/ _ \\ \\ / / _ \\ '_ \\| __|
|
||||||
|
| | | |_) | | | __/ __/\\ V / __/ | | | |_
|
||||||
|
|_|_|_.__/|_| \\___|\\___| \\_/ \\___|_| |_|\\__|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
==> Preparing packages for libreevent
|
||||||
|
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
echo "
|
||||||
|
|
||||||
|
==> Compiling setup... <==
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
sleep 0.5
|
||||||
|
|
||||||
|
cd src/webapp/setup
|
||||||
|
npm i
|
||||||
|
npm audit fix
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
echo "
|
||||||
|
|
||||||
|
==> Compiling main webapp... <==
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
sleep 0.5
|
||||||
|
|
||||||
|
cd ../main
|
||||||
|
|
||||||
|
|
||||||
|
npm i
|
||||||
|
npm audit fix
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
echo "
|
||||||
|
|
||||||
|
==> Resetting databases <==
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
cd ../../server
|
||||||
|
node prepareDB.js
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
echo "
|
||||||
|
|
||||||
|
==> Collecting files to archive <==
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
cd ../../
|
||||||
|
|
||||||
|
rm -rf dist/
|
||||||
|
mkdir dist/
|
||||||
|
|
||||||
|
cd dist
|
||||||
|
|
||||||
|
shopt -s extglob
|
||||||
|
cp -r ../src/server/!(node_modules) .
|
||||||
|
|
||||||
|
rm webapp
|
||||||
|
mkdir webapp
|
||||||
|
mkdir webapp/main
|
||||||
|
mkdir webapp/setup
|
||||||
|
|
||||||
|
cp -rv ../src/webapp/main/dist ./webapp/main/dist
|
||||||
|
cp -rv ../src/webapp/setup/dist ./webapp/setup/dist
|
||||||
|
rm .gitignore
|
||||||
|
rm prepareDB.js
|
||||||
|
rm test.js
|
||||||
|
rm config/*.secret.json
|
||||||
|
rm backend/plugins/payments/*/*.secret.json
|
||||||
|
echo "agdhgasjlgagaldusaglueagelwadgl" >> setupkey.txt
|
||||||
|
|
||||||
|
echo "
|
||||||
|
|
||||||
|
==> Collected files to archive <==
|
||||||
|
==> Archiving... <==
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
cd ..
|
||||||
|
zip -9r libreevent-$v-prebuilt.zip dist
|
||||||
|
|
||||||
|
echo "
|
||||||
|
|
||||||
|
==> Created prebuilt archive <==
|
||||||
|
==> Creating archive for node_modules <==
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
cd src/server
|
||||||
|
npm i
|
||||||
|
|
||||||
|
npm audit fix
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
cd ../../
|
||||||
|
zip -9r libreevent-$v-npm.zip src/server/node_modules
|
||||||
|
|
||||||
|
echo "
|
||||||
|
|
||||||
|
==> Created npm archive <==
|
||||||
|
==> Creating archive for full-icu package.json <==
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
cd src/server
|
||||||
|
npm i full-icu
|
||||||
|
cd ../../
|
||||||
|
|
||||||
|
zip -9r libreevent-$v-full-icu.zip src/server/package.json src/server/package-lock.json
|
||||||
|
|
||||||
|
cd src/server
|
||||||
|
npm uninstall full-icu
|
||||||
|
|
||||||
|
cd ../../
|
||||||
|
rm -rf dist
|
||||||
|
|
||||||
|
echo "
|
||||||
|
|
||||||
|
_ _ _ _
|
||||||
|
| (_) | | |
|
||||||
|
| |_| |__ _ __ ___ _____ _____ _ __ | |_
|
||||||
|
| | | '_ \\| '__/ _ \\/ _ \\ \\ / / _ \\ '_ \\| __|
|
||||||
|
| | | |_) | | | __/ __/\\ V / __/ | | | |_
|
||||||
|
|_|_|_.__/|_| \\___|\\___| \\_/ \\___|_| |_|\\__|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
==> Done
|
||||||
|
==> Successfully packaged libreevent $v
|
||||||
|
|
||||||
|
Next steps:
|
||||||
|
- Check that everything was packaged correctly
|
||||||
|
- Create a release on GitHub
|
||||||
|
|
||||||
|
"
|
||||||
15
src/apps/Android/.gitignore
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
*.iml
|
||||||
|
.gradle
|
||||||
|
/local.properties
|
||||||
|
/.idea/caches
|
||||||
|
/.idea/libraries
|
||||||
|
/.idea/modules.xml
|
||||||
|
/.idea/workspace.xml
|
||||||
|
/.idea/navEditor.xml
|
||||||
|
/.idea/assetWizardSettings.xml
|
||||||
|
.DS_Store
|
||||||
|
/build
|
||||||
|
/captures
|
||||||
|
.externalNativeBuild
|
||||||
|
.cxx
|
||||||
|
local.properties
|
||||||
1
src/apps/Android/.idea/.name
generated
Normal file
@@ -0,0 +1 @@
|
|||||||
|
libreevent entry control
|
||||||
123
src/apps/Android/.idea/codeStyles/Project.xml
generated
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
|
<code_scheme name="Project" version="173">
|
||||||
|
<JetCodeStyleSettings>
|
||||||
|
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
||||||
|
</JetCodeStyleSettings>
|
||||||
|
<codeStyleSettings language="XML">
|
||||||
|
<option name="FORCE_REARRANGE_MODE" value="1" />
|
||||||
|
<indentOptions>
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||||
|
</indentOptions>
|
||||||
|
<arrangement>
|
||||||
|
<rules>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>xmlns:android</NAME>
|
||||||
|
<XML_ATTRIBUTE />
|
||||||
|
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>xmlns:.*</NAME>
|
||||||
|
<XML_ATTRIBUTE />
|
||||||
|
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
<order>BY_NAME</order>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>.*:id</NAME>
|
||||||
|
<XML_ATTRIBUTE />
|
||||||
|
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>.*:name</NAME>
|
||||||
|
<XML_ATTRIBUTE />
|
||||||
|
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>name</NAME>
|
||||||
|
<XML_ATTRIBUTE />
|
||||||
|
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>style</NAME>
|
||||||
|
<XML_ATTRIBUTE />
|
||||||
|
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>.*</NAME>
|
||||||
|
<XML_ATTRIBUTE />
|
||||||
|
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
<order>BY_NAME</order>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>.*</NAME>
|
||||||
|
<XML_ATTRIBUTE />
|
||||||
|
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
<order>ANDROID_ATTRIBUTE_ORDER</order>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<rule>
|
||||||
|
<match>
|
||||||
|
<AND>
|
||||||
|
<NAME>.*</NAME>
|
||||||
|
<XML_ATTRIBUTE />
|
||||||
|
<XML_NAMESPACE>.*</XML_NAMESPACE>
|
||||||
|
</AND>
|
||||||
|
</match>
|
||||||
|
<order>BY_NAME</order>
|
||||||
|
</rule>
|
||||||
|
</section>
|
||||||
|
</rules>
|
||||||
|
</arrangement>
|
||||||
|
</codeStyleSettings>
|
||||||
|
<codeStyleSettings language="kotlin">
|
||||||
|
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
||||||
|
</codeStyleSettings>
|
||||||
|
</code_scheme>
|
||||||
|
</component>
|
||||||
5
src/apps/Android/.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
|
<state>
|
||||||
|
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
||||||
|
</state>
|
||||||
|
</component>
|
||||||
6
src/apps/Android/.idea/compiler.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CompilerConfiguration">
|
||||||
|
<bytecodeTargetLevel target="17" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
17
src/apps/Android/.idea/deploymentTargetDropDown.xml
generated
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="deploymentTargetDropDown">
|
||||||
|
<targetSelectedWithDropDown>
|
||||||
|
<Target>
|
||||||
|
<type value="QUICK_BOOT_TARGET" />
|
||||||
|
<deviceKey>
|
||||||
|
<Key>
|
||||||
|
<type value="VIRTUAL_DEVICE_PATH" />
|
||||||
|
<value value="$USER_HOME$/.android/avd/Pixel_7_Pro_API_30.avd" />
|
||||||
|
</Key>
|
||||||
|
</deviceKey>
|
||||||
|
</Target>
|
||||||
|
</targetSelectedWithDropDown>
|
||||||
|
<timeTargetWasSelectedWithDropDown value="2023-10-10T15:22:18.675007998Z" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
20
src/apps/Android/.idea/gradle.xml
generated
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="GradleMigrationSettings" migrationVersion="1" />
|
||||||
|
<component name="GradleSettings">
|
||||||
|
<option name="linkedExternalProjectsSettings">
|
||||||
|
<GradleProjectSettings>
|
||||||
|
<option name="testRunner" value="GRADLE" />
|
||||||
|
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="gradleJvm" value="jbr-17" />
|
||||||
|
<option name="modules">
|
||||||
|
<set>
|
||||||
|
<option value="$PROJECT_DIR$" />
|
||||||
|
<option value="$PROJECT_DIR$/app" />
|
||||||
|
</set>
|
||||||
|
</option>
|
||||||
|
</GradleProjectSettings>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
6
src/apps/Android/.idea/kotlinc.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="KotlinJpsPluginSettings">
|
||||||
|
<option name="version" value="1.9.0" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
9
src/apps/Android/.idea/misc.xml
generated
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<project version="4">
|
||||||
|
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||||
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
|
||||||
|
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectType">
|
||||||
|
<option name="id" value="Android" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
6
src/apps/Android/.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$/../../.." vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
1
src/apps/Android/app/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/build
|
||||||
45
src/apps/Android/app/build.gradle.kts
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
plugins {
|
||||||
|
id("com.android.application")
|
||||||
|
id("org.jetbrains.kotlin.android")
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace = "com.janishutz.libreevent"
|
||||||
|
compileSdk = 33
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
applicationId = "com.janishutz.libreevent"
|
||||||
|
minSdk = 24
|
||||||
|
targetSdk = 33
|
||||||
|
versionCode = 2
|
||||||
|
versionName = "1.0"
|
||||||
|
|
||||||
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
isMinifyEnabled = false
|
||||||
|
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||||
|
targetCompatibility = JavaVersion.VERSION_1_8
|
||||||
|
}
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = "1.8"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
|
||||||
|
implementation("androidx.core:core-ktx:1.9.0")
|
||||||
|
implementation("androidx.appcompat:appcompat:1.6.1")
|
||||||
|
implementation("com.google.android.material:material:1.8.0")
|
||||||
|
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
|
||||||
|
implementation("com.journeyapps:zxing-android-embedded:4.2.0")
|
||||||
|
testImplementation("junit:junit:4.13.2")
|
||||||
|
androidTestImplementation("androidx.test.ext:junit:1.1.5")
|
||||||
|
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
|
||||||
|
}
|
||||||
21
src/apps/Android/app/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
BIN
src/apps/Android/app/release/app-release.aab
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
package com.janishutz.libreevent
|
||||||
|
|
||||||
|
import androidx.test.platform.app.InstrumentationRegistry
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
|
||||||
|
import org.junit.Assert.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instrumented test, which will execute on an Android device.
|
||||||
|
*
|
||||||
|
* See [testing documentation](http://d.android.com/tools/testing).
|
||||||
|
*/
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class ExampleInstrumentedTest {
|
||||||
|
@Test
|
||||||
|
fun useAppContext() {
|
||||||
|
// Context of the app under test.
|
||||||
|
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
||||||
|
assertEquals("com.janishutz.libreevent", appContext.packageName)
|
||||||
|
}
|
||||||
|
}
|
||||||
33
src/apps/Android/app/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:dataExtractionRules="@xml/data_extraction_rules"
|
||||||
|
android:fullBackupContent="@xml/backup_rules"
|
||||||
|
android:icon="@mipmap/ic_launcher"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/Theme.LibreeventEntryControl"
|
||||||
|
tools:targetApi="31">
|
||||||
|
<activity
|
||||||
|
android:name=".MainActivity"
|
||||||
|
android:exported="true">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
<activity
|
||||||
|
android:name=".ScannerActivity"
|
||||||
|
android:exported="true">
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
<uses-feature android:name="android.hardware.camera" android:required="true" />
|
||||||
|
<uses-feature android:name="android.hardware.camera.autofocus" android:required="true" />
|
||||||
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
</manifest>
|
||||||
BIN
src/apps/Android/app/src/main/ic_launcher-playstore.png
Normal file
|
After Width: | Height: | Size: 225 KiB |
@@ -0,0 +1,116 @@
|
|||||||
|
package com.janishutz.libreevent
|
||||||
|
|
||||||
|
import java.io.BufferedReader
|
||||||
|
import java.io.DataOutputStream
|
||||||
|
import java.io.InputStreamReader
|
||||||
|
import java.lang.Exception
|
||||||
|
import java.net.HttpURLConnection
|
||||||
|
import java.net.URL
|
||||||
|
|
||||||
|
class ApiClient {
|
||||||
|
fun authenticateUser(apiUrl: String, username: String, password: String): String {
|
||||||
|
try {
|
||||||
|
val url = URL("$apiUrl/app/authenticate")
|
||||||
|
println(url)
|
||||||
|
val connection = url.openConnection() as HttpURLConnection
|
||||||
|
|
||||||
|
// Set the request method to POST
|
||||||
|
connection.requestMethod = "POST"
|
||||||
|
|
||||||
|
// Set request headers (if needed)
|
||||||
|
connection.setRequestProperty("Content-Type", "application/json")
|
||||||
|
|
||||||
|
// Enable input and output streams for the connection
|
||||||
|
connection.doInput = true
|
||||||
|
connection.doOutput = true
|
||||||
|
|
||||||
|
// Create the JSON request body
|
||||||
|
val jsonRequest = "{\"email\":\"$username\",\"password\":\"$password\"}"
|
||||||
|
|
||||||
|
// Write the JSON data to the output stream
|
||||||
|
val outputStream = DataOutputStream(connection.outputStream)
|
||||||
|
outputStream.write(jsonRequest.toByteArray(Charsets.UTF_8))
|
||||||
|
outputStream.flush()
|
||||||
|
outputStream.close()
|
||||||
|
|
||||||
|
// Get the response code from the server
|
||||||
|
val responseCode = connection.responseCode
|
||||||
|
|
||||||
|
if (responseCode == HttpURLConnection.HTTP_OK) {
|
||||||
|
// Read and handle the response from the server
|
||||||
|
val reader = BufferedReader(InputStreamReader(connection.inputStream))
|
||||||
|
val response = StringBuilder()
|
||||||
|
var line: String?
|
||||||
|
while (reader.readLine().also { line = it } != null) {
|
||||||
|
response.append(line)
|
||||||
|
}
|
||||||
|
reader.close()
|
||||||
|
|
||||||
|
// Return the response as a String
|
||||||
|
return response.toString()
|
||||||
|
} else {
|
||||||
|
println(responseCode)
|
||||||
|
return "status-code-non-ok"
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
return "error"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun checkTicket(apiUrl: String, username: String, password: String, ticket: String): String {
|
||||||
|
var url = URL("$apiUrl/app/ticketLookup")
|
||||||
|
if ( !apiUrl.contains( "https://" )) {
|
||||||
|
url = URL("https://$apiUrl/app/ticketLookup")
|
||||||
|
}
|
||||||
|
|
||||||
|
val connection = url.openConnection() as HttpURLConnection
|
||||||
|
|
||||||
|
// Set the request method to POST
|
||||||
|
connection.requestMethod = "POST"
|
||||||
|
|
||||||
|
// Set request headers (if needed)
|
||||||
|
connection.setRequestProperty("Content-Type", "application/json")
|
||||||
|
|
||||||
|
// Enable input and output streams for the connection
|
||||||
|
connection.doInput = true
|
||||||
|
connection.doOutput = true
|
||||||
|
|
||||||
|
// Create the JSON request body
|
||||||
|
val jsonRequest = "{\"email\":\"$username\",\"password\":\"$password\",\"ticketID\":\"$ticket\"}"
|
||||||
|
|
||||||
|
// Write the JSON data to the output stream
|
||||||
|
val outputStream = DataOutputStream(connection.outputStream)
|
||||||
|
outputStream.write(jsonRequest.toByteArray(Charsets.UTF_8))
|
||||||
|
outputStream.flush()
|
||||||
|
outputStream.close()
|
||||||
|
|
||||||
|
// Get the response code from the server
|
||||||
|
val responseCode = connection.responseCode
|
||||||
|
|
||||||
|
if (responseCode == HttpURLConnection.HTTP_OK) {
|
||||||
|
// Read and handle the response from the server
|
||||||
|
val reader = BufferedReader(InputStreamReader(connection.inputStream))
|
||||||
|
val response = StringBuilder()
|
||||||
|
var line: String?
|
||||||
|
while (reader.readLine().also { line = it } != null) {
|
||||||
|
response.append(line)
|
||||||
|
}
|
||||||
|
reader.close()
|
||||||
|
|
||||||
|
// Return the response as a String
|
||||||
|
return response.toString()
|
||||||
|
} else {
|
||||||
|
val r = BufferedReader(InputStreamReader(connection.errorStream))
|
||||||
|
val res = StringBuilder()
|
||||||
|
var line: String?
|
||||||
|
while (r.readLine().also { line = it } != null) {
|
||||||
|
res.append(line)
|
||||||
|
}
|
||||||
|
r.close()
|
||||||
|
println(res.toString())
|
||||||
|
|
||||||
|
return "Error"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
package com.janishutz.libreevent
|
||||||
|
|
||||||
|
import android.Manifest
|
||||||
|
import android.content.pm.PackageManager
|
||||||
|
import android.app.AlertDialog
|
||||||
|
import android.content.Intent
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.os.StrictMode
|
||||||
|
import android.os.StrictMode.ThreadPolicy
|
||||||
|
import android.widget.Button
|
||||||
|
import android.widget.EditText
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.core.app.ActivityCompat
|
||||||
|
|
||||||
|
|
||||||
|
class MainActivity : AppCompatActivity() {
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setContentView(R.layout.activity_main)
|
||||||
|
|
||||||
|
val policy = ThreadPolicy.Builder().permitAll().build()
|
||||||
|
StrictMode.setThreadPolicy(policy)
|
||||||
|
|
||||||
|
val sharedPref = applicationContext.getSharedPreferences( "login", MODE_PRIVATE )
|
||||||
|
|
||||||
|
val hasSwitched = intent.hasExtra("hasSwitched")
|
||||||
|
|
||||||
|
val loginButton = findViewById<Button>(R.id.loginButton)
|
||||||
|
val urlEditText = findViewById<EditText>(R.id.url)
|
||||||
|
val usernameEditText = findViewById<EditText>(R.id.username)
|
||||||
|
val passwordEditText = findViewById<EditText>(R.id.password)
|
||||||
|
|
||||||
|
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
|
||||||
|
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), CAMERA_PERMISSION_REQUEST)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sharedPref.getString( "url", null ).toString() != "null" && sharedPref.getString( "username", null ).toString() != "null" ) {
|
||||||
|
urlEditText.setText(sharedPref.getString( "url", null ).toString())
|
||||||
|
usernameEditText.setText(sharedPref.getString( "username", null ).toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sharedPref.getString( "loginOk", null ).toString() != "null" && !hasSwitched) {
|
||||||
|
println(sharedPref.getString( "loginOk", null ).toString())
|
||||||
|
val switchIntent = Intent(this, ScannerActivity::class.java)
|
||||||
|
startActivity(switchIntent)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
loginButton.setOnClickListener {
|
||||||
|
val url = urlEditText.text.toString()
|
||||||
|
val username = usernameEditText.text.toString()
|
||||||
|
val password = passwordEditText.text.toString()
|
||||||
|
login( url, username, password )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun login( url: String, username: String, password: String ) {
|
||||||
|
val res = ApiClient().authenticateUser( url, username, password )
|
||||||
|
println( res )
|
||||||
|
if ( res == "authOk" ) {
|
||||||
|
val sharedPref = applicationContext.getSharedPreferences( "login", MODE_PRIVATE )
|
||||||
|
val editor = sharedPref.edit()
|
||||||
|
editor.putString( "username", username )
|
||||||
|
editor.putString( "password", password )
|
||||||
|
editor.putString( "url", url )
|
||||||
|
editor.putString( "loginOk", "true" )
|
||||||
|
editor.apply()
|
||||||
|
val switchIntent = Intent(this, ScannerActivity::class.java)
|
||||||
|
startActivity(switchIntent)
|
||||||
|
} else if ( res == "status-code-non-ok" ) {
|
||||||
|
val alertDialogBuilder = AlertDialog.Builder(this)
|
||||||
|
alertDialogBuilder.setTitle("Username or password incorrect")
|
||||||
|
alertDialogBuilder.setMessage("Please ensure that the values entered are correct and try again")
|
||||||
|
alertDialogBuilder.setIcon(android.R.drawable.ic_dialog_alert)
|
||||||
|
|
||||||
|
alertDialogBuilder.setPositiveButton("OK") { dialog, _ ->
|
||||||
|
dialog.dismiss()
|
||||||
|
}
|
||||||
|
alertDialogBuilder.show()
|
||||||
|
} else if ( res == "error") {
|
||||||
|
val alertDialogBuilder = AlertDialog.Builder(this)
|
||||||
|
alertDialogBuilder.setTitle("Unable to connect")
|
||||||
|
alertDialogBuilder.setMessage("Please ensure that the url specified is correct.")
|
||||||
|
alertDialogBuilder.setIcon(android.R.drawable.ic_dialog_alert)
|
||||||
|
|
||||||
|
alertDialogBuilder.setPositiveButton("OK") { dialog, _ ->
|
||||||
|
dialog.dismiss()
|
||||||
|
}
|
||||||
|
alertDialogBuilder.show()
|
||||||
|
} else if ( res == "wrong") {
|
||||||
|
val alertDialogBuilder = AlertDialog.Builder(this)
|
||||||
|
alertDialogBuilder.setTitle("Username or password incorrect")
|
||||||
|
alertDialogBuilder.setMessage("Please ensure that the values entered are correct and try again")
|
||||||
|
alertDialogBuilder.setIcon(android.R.drawable.ic_dialog_alert)
|
||||||
|
|
||||||
|
alertDialogBuilder.setPositiveButton("OK") { dialog, _ ->
|
||||||
|
dialog.dismiss()
|
||||||
|
}
|
||||||
|
alertDialogBuilder.show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val CAMERA_PERMISSION_REQUEST = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
package com.janishutz.libreevent
|
||||||
|
|
||||||
|
import android.Manifest
|
||||||
|
import android.app.AlertDialog
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.pm.PackageManager
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.widget.Button
|
||||||
|
import androidx.core.app.ActivityCompat
|
||||||
|
import com.journeyapps.barcodescanner.BarcodeCallback
|
||||||
|
import com.journeyapps.barcodescanner.BarcodeResult
|
||||||
|
import com.journeyapps.barcodescanner.CaptureActivity
|
||||||
|
import com.journeyapps.barcodescanner.CaptureManager
|
||||||
|
import com.journeyapps.barcodescanner.DecoratedBarcodeView
|
||||||
|
import java.util.Date
|
||||||
|
|
||||||
|
class ScannerActivity : CaptureActivity() {
|
||||||
|
|
||||||
|
private lateinit var barcodeView: DecoratedBarcodeView
|
||||||
|
private lateinit var captureManager: CaptureManager
|
||||||
|
|
||||||
|
private var lastScanned: String = ""
|
||||||
|
private var lastScanTimestamp: Long = 0
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setContentView(R.layout.activity_scanner)
|
||||||
|
|
||||||
|
barcodeView = findViewById(R.id.barcodeScannerView)
|
||||||
|
|
||||||
|
val logoutButton = findViewById<Button>(R.id.logoutButton)
|
||||||
|
logoutButton.setOnClickListener {
|
||||||
|
val sharedPref = applicationContext.getSharedPreferences( "login", MODE_PRIVATE )
|
||||||
|
val editor = sharedPref.edit()
|
||||||
|
editor.remove( "password" )
|
||||||
|
editor.remove( "loginOk" )
|
||||||
|
editor.apply()
|
||||||
|
val switchIntent = Intent(this, MainActivity::class.java)
|
||||||
|
switchIntent.putExtra("hasSwitched", true)
|
||||||
|
startActivity(switchIntent)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for camera permission and request if not granted
|
||||||
|
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
|
||||||
|
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), CAMERA_PERMISSION_REQUEST)
|
||||||
|
} else {
|
||||||
|
setupScanner()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setupScanner() {
|
||||||
|
captureManager = CaptureManager(this, barcodeView)
|
||||||
|
|
||||||
|
captureManager.initializeFromIntent(intent, null)
|
||||||
|
captureManager.decode()
|
||||||
|
barcodeView.decodeContinuous(object : BarcodeCallback {
|
||||||
|
override fun barcodeResult(result: BarcodeResult?) {
|
||||||
|
if (result != null) {
|
||||||
|
val scannedData = result.text // This is the scanned data (e.g., QR code content)
|
||||||
|
handleScanResult(scannedData)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleScanResult(result: String) {
|
||||||
|
if ( lastScanned != result || lastScanTimestamp + 2000 < System.currentTimeMillis()) {
|
||||||
|
lastScanTimestamp = System.currentTimeMillis()
|
||||||
|
val sharedPref = applicationContext.getSharedPreferences( "login", MODE_PRIVATE )
|
||||||
|
|
||||||
|
val status = ApiClient().checkTicket( sharedPref.getString( "url", null ).toString(),
|
||||||
|
sharedPref.getString( "username", null ).toString(),
|
||||||
|
sharedPref.getString( "password", null ).toString(), result )
|
||||||
|
lastScanned = result
|
||||||
|
val alertDialogBuilder = AlertDialog.Builder(this)
|
||||||
|
|
||||||
|
if ( status == "ticketValid" ) {
|
||||||
|
alertDialogBuilder.setTitle("Ticket is valid")
|
||||||
|
} else if ( status == "ticketInvalid" ) {
|
||||||
|
alertDialogBuilder.setTitle("Ticket is invalid")
|
||||||
|
} else if ( status == "Error" ) {
|
||||||
|
alertDialogBuilder.setTitle("There was an error connecting")
|
||||||
|
alertDialogBuilder.setMessage("Please log out and log in again")
|
||||||
|
}
|
||||||
|
|
||||||
|
alertDialogBuilder.setIcon(android.R.drawable.ic_dialog_alert)
|
||||||
|
|
||||||
|
alertDialogBuilder.setPositiveButton("OK") { dialog, _ ->
|
||||||
|
dialog.dismiss()
|
||||||
|
}
|
||||||
|
alertDialogBuilder.show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
captureManager.onResume()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPause() {
|
||||||
|
super.onPause()
|
||||||
|
captureManager.onPause()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pass savedInstanceState to onSaveInstanceState
|
||||||
|
override fun onSaveInstanceState(outState: Bundle) {
|
||||||
|
super.onSaveInstanceState(outState)
|
||||||
|
captureManager.onSaveInstanceState(outState)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
|
||||||
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
|
||||||
|
if (requestCode == CAMERA_PERMISSION_REQUEST) {
|
||||||
|
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||||
|
setupScanner()
|
||||||
|
} else {
|
||||||
|
val alertDialogBuilder = AlertDialog.Builder(this)
|
||||||
|
alertDialogBuilder.setTitle("Camera access required!")
|
||||||
|
alertDialogBuilder.setMessage("Please ensure that camera access is enabled in settings")
|
||||||
|
alertDialogBuilder.setIcon(android.R.drawable.ic_dialog_alert)
|
||||||
|
|
||||||
|
alertDialogBuilder.setPositiveButton("OK") { dialog, _ ->
|
||||||
|
dialog.dismiss()
|
||||||
|
}
|
||||||
|
alertDialogBuilder.show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val CAMERA_PERMISSION_REQUEST = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,170 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="108"
|
||||||
|
android:viewportHeight="108">
|
||||||
|
<path
|
||||||
|
android:fillColor="#3DDC84"
|
||||||
|
android:pathData="M0,0h108v108h-108z" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M9,0L9,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,0L19,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M29,0L29,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M39,0L39,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M49,0L49,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M59,0L59,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M69,0L69,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M79,0L79,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M89,0L89,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M99,0L99,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,9L108,9"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,19L108,19"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,29L108,29"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,39L108,39"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,49L108,49"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,59L108,59"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,69L108,69"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,79L108,79"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,89L108,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,99L108,99"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,29L89,29"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,39L89,39"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,49L89,49"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,59L89,59"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,69L89,69"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,79L89,79"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M29,19L29,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M39,19L39,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M49,19L49,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M59,19L59,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M69,19L69,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M79,19L79,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:aapt="http://schemas.android.com/aapt"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="108"
|
||||||
|
android:viewportHeight="108">
|
||||||
|
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:endX="85.84757"
|
||||||
|
android:endY="92.4963"
|
||||||
|
android:startX="42.9492"
|
||||||
|
android:startY="49.59793"
|
||||||
|
android:type="linear">
|
||||||
|
<item
|
||||||
|
android:color="#44000000"
|
||||||
|
android:offset="0.0" />
|
||||||
|
<item
|
||||||
|
android:color="#00000000"
|
||||||
|
android:offset="1.0" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
<path
|
||||||
|
android:fillColor="#FFFFFF"
|
||||||
|
android:fillType="nonZero"
|
||||||
|
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
|
||||||
|
android:strokeWidth="1"
|
||||||
|
android:strokeColor="#00000000" />
|
||||||
|
</vector>
|
||||||
82
src/apps/Android/app/src/main/res/layout/activity_main.xml
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".MainActivity">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:scaleX="2"
|
||||||
|
android:scaleY="2"
|
||||||
|
android:text="Welcome to libreevent!"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintVertical_bias="0.157" />
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/username"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="52dp"
|
||||||
|
android:ems="10"
|
||||||
|
android:hint="Your account email"
|
||||||
|
android:inputType="textEmailAddress"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintHorizontal_bias="0.497"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/url" />
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/url"
|
||||||
|
android:layout_width="302dp"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:layout_marginTop="32dp"
|
||||||
|
android:ems="10"
|
||||||
|
android:hint="link to libreevent instance"
|
||||||
|
android:inputType="text"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintHorizontal_bias="0.502"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textView2" />
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/password"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:ems="10"
|
||||||
|
android:hint="Password"
|
||||||
|
android:inputType="textPassword"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintHorizontal_bias="0.502"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/username" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/loginButton"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="84dp"
|
||||||
|
android:text="Log in"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/password" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView2"
|
||||||
|
android:layout_width="306dp"
|
||||||
|
android:layout_height="51dp"
|
||||||
|
android:layout_marginTop="40dp"
|
||||||
|
android:text="This app requires a libreevent server instance to work. Please log in below"
|
||||||
|
android:textAlignment="center"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/textView" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".MainActivity">
|
||||||
|
|
||||||
|
<com.journeyapps.barcodescanner.DecoratedBarcodeView
|
||||||
|
android:id="@+id/barcodeScannerView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent" >
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/logoutButton"
|
||||||
|
android:layout_width="122dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Log out" />
|
||||||
|
</com.journeyapps.barcodescanner.DecoratedBarcodeView>
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@color/ic_launcher_background"/>
|
||||||
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
|
</adaptive-icon>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@color/ic_launcher_background"/>
|
||||||
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
|
</adaptive-icon>
|
||||||
BIN
src/apps/Android/app/src/main/res/mipmap-hdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
BIN
src/apps/Android/app/src/main/res/mipmap-mdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
BIN
src/apps/Android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
BIN
src/apps/Android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 26 KiB |
@@ -0,0 +1,7 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Base.Theme.LibreeventEntryControl" parent="Theme.Material3.DayNight.NoActionBar">
|
||||||
|
<!-- Customize your dark theme here. -->
|
||||||
|
<!-- <item name="colorPrimary">@color/my_dark_primary</item> -->
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
5
src/apps/Android/app/src/main/res/values/colors.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<color name="black">#FF000000</color>
|
||||||
|
<color name="white">#FFFFFFFF</color>
|
||||||
|
</resources>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<color name="ic_launcher_background">#213A50</color>
|
||||||
|
</resources>
|
||||||
3
src/apps/Android/app/src/main/res/values/strings.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<resources>
|
||||||
|
<string name="app_name">libreevent entry control</string>
|
||||||
|
</resources>
|
||||||
9
src/apps/Android/app/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Base.Theme.LibreeventEntryControl" parent="Theme.Material3.DayNight.NoActionBar">
|
||||||
|
<!-- Customize your light theme here. -->
|
||||||
|
<!-- <item name="colorPrimary">@color/my_light_primary</item> -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="Theme.LibreeventEntryControl" parent="Base.Theme.LibreeventEntryControl" />
|
||||||
|
</resources>
|
||||||
13
src/apps/Android/app/src/main/res/xml/backup_rules.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?><!--
|
||||||
|
Sample backup rules file; uncomment and customize as necessary.
|
||||||
|
See https://developer.android.com/guide/topics/data/autobackup
|
||||||
|
for details.
|
||||||
|
Note: This file is ignored for devices older that API 31
|
||||||
|
See https://developer.android.com/about/versions/12/backup-restore
|
||||||
|
-->
|
||||||
|
<full-backup-content>
|
||||||
|
<!--
|
||||||
|
<include domain="sharedpref" path="."/>
|
||||||
|
<exclude domain="sharedpref" path="device.xml"/>
|
||||||
|
-->
|
||||||
|
</full-backup-content>
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?><!--
|
||||||
|
Sample data extraction rules file; uncomment and customize as necessary.
|
||||||
|
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
|
||||||
|
for details.
|
||||||
|
-->
|
||||||
|
<data-extraction-rules>
|
||||||
|
<cloud-backup>
|
||||||
|
<!-- TODO: Use <include> and <exclude> to control what is backed up.
|
||||||
|
<include .../>
|
||||||
|
<exclude .../>
|
||||||
|
-->
|
||||||
|
</cloud-backup>
|
||||||
|
<!--
|
||||||
|
<device-transfer>
|
||||||
|
<include .../>
|
||||||
|
<exclude .../>
|
||||||
|
</device-transfer>
|
||||||
|
-->
|
||||||
|
</data-extraction-rules>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package com.janishutz.libreevent
|
||||||
|
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
import org.junit.Assert.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example local unit test, which will execute on the development machine (host).
|
||||||
|
*
|
||||||
|
* See [testing documentation](http://d.android.com/tools/testing).
|
||||||
|
*/
|
||||||
|
class ExampleUnitTest {
|
||||||
|
@Test
|
||||||
|
fun addition_isCorrect() {
|
||||||
|
assertEquals(4, 2 + 2)
|
||||||
|
}
|
||||||
|
}
|
||||||
5
src/apps/Android/build.gradle.kts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
|
plugins {
|
||||||
|
id("com.android.application") version "8.1.1" apply false
|
||||||
|
id("org.jetbrains.kotlin.android") version "1.9.0" apply false
|
||||||
|
}
|
||||||
23
src/apps/Android/gradle.properties
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Project-wide Gradle settings.
|
||||||
|
# IDE (e.g. Android Studio) users:
|
||||||
|
# Gradle settings configured through the IDE *will override*
|
||||||
|
# any settings specified in this file.
|
||||||
|
# For more details on how to configure your build environment visit
|
||||||
|
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
||||||
|
# Specifies the JVM arguments used for the daemon process.
|
||||||
|
# The setting is particularly useful for tweaking memory settings.
|
||||||
|
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
|
||||||
|
# When configured, Gradle will run in incubating parallel mode.
|
||||||
|
# This option should only be used with decoupled projects. More details, visit
|
||||||
|
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
||||||
|
# org.gradle.parallel=true
|
||||||
|
# AndroidX package structure to make it clearer which packages are bundled with the
|
||||||
|
# Android operating system, and which are packaged with your app's APK
|
||||||
|
# https://developer.android.com/topic/libraries/support-library/androidx-rn
|
||||||
|
android.useAndroidX=true
|
||||||
|
# Kotlin code style for this project: "official" or "obsolete":
|
||||||
|
kotlin.code.style=official
|
||||||
|
# Enables namespacing of each library's R class so that its R class includes only the
|
||||||
|
# resources declared in the library itself and none from the library's dependencies,
|
||||||
|
# thereby reducing the size of the R class for that library
|
||||||
|
android.nonTransitiveRClass=true
|
||||||
BIN
src/apps/Android/gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
6
src/apps/Android/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#Sun Sep 03 11:15:46 CEST 2023
|
||||||
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionPath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
||||||
185
src/apps/Android/gradlew
vendored
Executable file
@@ -0,0 +1,185 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright 2015 the original author or authors.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
##
|
||||||
|
## Gradle start up script for UN*X
|
||||||
|
##
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
# Attempt to set APP_HOME
|
||||||
|
# Resolve links: $0 may be a link
|
||||||
|
PRG="$0"
|
||||||
|
# Need this for relative symlinks.
|
||||||
|
while [ -h "$PRG" ] ; do
|
||||||
|
ls=`ls -ld "$PRG"`
|
||||||
|
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||||
|
if expr "$link" : '/.*' > /dev/null; then
|
||||||
|
PRG="$link"
|
||||||
|
else
|
||||||
|
PRG=`dirname "$PRG"`"/$link"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
SAVED="`pwd`"
|
||||||
|
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||||
|
APP_HOME="`pwd -P`"
|
||||||
|
cd "$SAVED" >/dev/null
|
||||||
|
|
||||||
|
APP_NAME="Gradle"
|
||||||
|
APP_BASE_NAME=`basename "$0"`
|
||||||
|
|
||||||
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||||
|
|
||||||
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
|
MAX_FD="maximum"
|
||||||
|
|
||||||
|
warn () {
|
||||||
|
echo "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
die () {
|
||||||
|
echo
|
||||||
|
echo "$*"
|
||||||
|
echo
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# OS specific support (must be 'true' or 'false').
|
||||||
|
cygwin=false
|
||||||
|
msys=false
|
||||||
|
darwin=false
|
||||||
|
nonstop=false
|
||||||
|
case "`uname`" in
|
||||||
|
CYGWIN* )
|
||||||
|
cygwin=true
|
||||||
|
;;
|
||||||
|
Darwin* )
|
||||||
|
darwin=true
|
||||||
|
;;
|
||||||
|
MINGW* )
|
||||||
|
msys=true
|
||||||
|
;;
|
||||||
|
NONSTOP* )
|
||||||
|
nonstop=true
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
||||||
|
|
||||||
|
# Determine the Java command to use to start the JVM.
|
||||||
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
|
# IBM's JDK on AIX uses strange locations for the executables
|
||||||
|
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||||
|
else
|
||||||
|
JAVACMD="$JAVA_HOME/bin/java"
|
||||||
|
fi
|
||||||
|
if [ ! -x "$JAVACMD" ] ; then
|
||||||
|
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
JAVACMD="java"
|
||||||
|
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Increase the maximum file descriptors if we can.
|
||||||
|
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||||
|
MAX_FD_LIMIT=`ulimit -H -n`
|
||||||
|
if [ $? -eq 0 ] ; then
|
||||||
|
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||||
|
MAX_FD="$MAX_FD_LIMIT"
|
||||||
|
fi
|
||||||
|
ulimit -n $MAX_FD
|
||||||
|
if [ $? -ne 0 ] ; then
|
||||||
|
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Darwin, add options to specify how the application appears in the dock
|
||||||
|
if $darwin; then
|
||||||
|
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||||
|
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
||||||
|
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||||
|
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||||
|
|
||||||
|
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||||
|
|
||||||
|
# We build the pattern for arguments to be converted via cygpath
|
||||||
|
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||||
|
SEP=""
|
||||||
|
for dir in $ROOTDIRSRAW ; do
|
||||||
|
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||||
|
SEP="|"
|
||||||
|
done
|
||||||
|
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||||
|
# Add a user-defined pattern to the cygpath arguments
|
||||||
|
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||||
|
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||||
|
fi
|
||||||
|
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||||
|
i=0
|
||||||
|
for arg in "$@" ; do
|
||||||
|
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||||
|
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||||
|
|
||||||
|
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||||
|
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||||
|
else
|
||||||
|
eval `echo args$i`="\"$arg\""
|
||||||
|
fi
|
||||||
|
i=`expr $i + 1`
|
||||||
|
done
|
||||||
|
case $i in
|
||||||
|
0) set -- ;;
|
||||||
|
1) set -- "$args0" ;;
|
||||||
|
2) set -- "$args0" "$args1" ;;
|
||||||
|
3) set -- "$args0" "$args1" "$args2" ;;
|
||||||
|
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||||
|
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||||
|
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||||
|
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||||
|
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||||
|
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Escape application args
|
||||||
|
save () {
|
||||||
|
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||||
|
echo " "
|
||||||
|
}
|
||||||
|
APP_ARGS=`save "$@"`
|
||||||
|
|
||||||
|
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||||
|
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||||
|
|
||||||
|
exec "$JAVACMD" "$@"
|
||||||
89
src/apps/Android/gradlew.bat
vendored
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
@rem
|
||||||
|
@rem Copyright 2015 the original author or authors.
|
||||||
|
@rem
|
||||||
|
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@rem you may not use this file except in compliance with the License.
|
||||||
|
@rem You may obtain a copy of the License at
|
||||||
|
@rem
|
||||||
|
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
@rem
|
||||||
|
@rem Unless required by applicable law or agreed to in writing, software
|
||||||
|
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@rem See the License for the specific language governing permissions and
|
||||||
|
@rem limitations under the License.
|
||||||
|
@rem
|
||||||
|
|
||||||
|
@if "%DEBUG%" == "" @echo off
|
||||||
|
@rem ##########################################################################
|
||||||
|
@rem
|
||||||
|
@rem Gradle startup script for Windows
|
||||||
|
@rem
|
||||||
|
@rem ##########################################################################
|
||||||
|
|
||||||
|
@rem Set local scope for the variables with windows NT shell
|
||||||
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
|
set DIRNAME=%~dp0
|
||||||
|
if "%DIRNAME%" == "" set DIRNAME=.
|
||||||
|
set APP_BASE_NAME=%~n0
|
||||||
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
|
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||||
|
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||||
|
|
||||||
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||||
|
|
||||||
|
@rem Find java.exe
|
||||||
|
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||||
|
|
||||||
|
set JAVA_EXE=java.exe
|
||||||
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
|
if "%ERRORLEVEL%" == "0" goto execute
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:findJavaFromJavaHome
|
||||||
|
set JAVA_HOME=%JAVA_HOME:"=%
|
||||||
|
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||||
|
|
||||||
|
if exist "%JAVA_EXE%" goto execute
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:execute
|
||||||
|
@rem Setup the command line
|
||||||
|
|
||||||
|
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||||
|
|
||||||
|
|
||||||
|
@rem Execute Gradle
|
||||||
|
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||||
|
|
||||||
|
:end
|
||||||
|
@rem End local scope for the variables with windows NT shell
|
||||||
|
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||||
|
|
||||||
|
:fail
|
||||||
|
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||||
|
rem the _cmd.exe /c_ return code!
|
||||||
|
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||||
|
exit /b 1
|
||||||
|
|
||||||
|
:mainEnd
|
||||||
|
if "%OS%"=="Windows_NT" endlocal
|
||||||
|
|
||||||
|
:omega
|
||||||
17
src/apps/Android/settings.gradle.kts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
pluginManagement {
|
||||||
|
repositories {
|
||||||
|
google()
|
||||||
|
mavenCentral()
|
||||||
|
gradlePluginPortal()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dependencyResolutionManagement {
|
||||||
|
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
||||||
|
repositories {
|
||||||
|
google()
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rootProject.name = "libreevent entry control"
|
||||||
|
include(":app")
|
||||||
@@ -0,0 +1,393 @@
|
|||||||
|
// !$*UTF8*$!
|
||||||
|
{
|
||||||
|
archiveVersion = 1;
|
||||||
|
classes = {
|
||||||
|
};
|
||||||
|
objectVersion = 56;
|
||||||
|
objects = {
|
||||||
|
|
||||||
|
/* Begin PBXBuildFile section */
|
||||||
|
921EDBF82A827CF200F8965C /* libreevent_entry_controlApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 921EDBF72A827CF200F8965C /* libreevent_entry_controlApp.swift */; };
|
||||||
|
921EDBFA2A827CF200F8965C /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 921EDBF92A827CF200F8965C /* ContentView.swift */; };
|
||||||
|
921EDBFC2A827CF400F8965C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 921EDBFB2A827CF400F8965C /* Assets.xcassets */; };
|
||||||
|
921EDBFF2A827CF400F8965C /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 921EDBFE2A827CF400F8965C /* Preview Assets.xcassets */; };
|
||||||
|
92DBBD892AA9B6A6006F6094 /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92DBBD882AA9B6A6006F6094 /* LoginView.swift */; };
|
||||||
|
92DBBD8C2AA9C0C5006F6094 /* CodeScanner in Frameworks */ = {isa = PBXBuildFile; productRef = 92DBBD8B2AA9C0C5006F6094 /* CodeScanner */; };
|
||||||
|
92DBBD922AA9D0AF006F6094 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 92DBBD912AA9D0AF006F6094 /* Launch Screen.storyboard */; };
|
||||||
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
|
/* Begin PBXFileReference section */
|
||||||
|
921EDBF42A827CF200F8965C /* libreevent-entry-control.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "libreevent-entry-control.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
921EDBF72A827CF200F8965C /* libreevent_entry_controlApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = libreevent_entry_controlApp.swift; sourceTree = "<group>"; };
|
||||||
|
921EDBF92A827CF200F8965C /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
||||||
|
921EDBFB2A827CF400F8965C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
|
921EDBFE2A827CF400F8965C /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
|
||||||
|
92DBBD882AA9B6A6006F6094 /* LoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginView.swift; sourceTree = "<group>"; };
|
||||||
|
92DBBD912AA9D0AF006F6094 /* Launch Screen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = "<group>"; };
|
||||||
|
92DBBD932AA9D5AD006F6094 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
921EDBF12A827CF200F8965C /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
92DBBD8C2AA9C0C5006F6094 /* CodeScanner in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXGroup section */
|
||||||
|
921EDBEB2A827CF200F8965C = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
921EDBF62A827CF200F8965C /* libreevent-entry-control */,
|
||||||
|
921EDBF52A827CF200F8965C /* Products */,
|
||||||
|
);
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
921EDBF52A827CF200F8965C /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
921EDBF42A827CF200F8965C /* libreevent-entry-control.app */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
921EDBF62A827CF200F8965C /* libreevent-entry-control */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
92DBBD932AA9D5AD006F6094 /* Info.plist */,
|
||||||
|
921EDBF72A827CF200F8965C /* libreevent_entry_controlApp.swift */,
|
||||||
|
921EDBF92A827CF200F8965C /* ContentView.swift */,
|
||||||
|
92DBBD882AA9B6A6006F6094 /* LoginView.swift */,
|
||||||
|
921EDBFB2A827CF400F8965C /* Assets.xcassets */,
|
||||||
|
921EDBFD2A827CF400F8965C /* Preview Content */,
|
||||||
|
92DBBD912AA9D0AF006F6094 /* Launch Screen.storyboard */,
|
||||||
|
);
|
||||||
|
path = "libreevent-entry-control";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
921EDBFD2A827CF400F8965C /* Preview Content */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
921EDBFE2A827CF400F8965C /* Preview Assets.xcassets */,
|
||||||
|
);
|
||||||
|
path = "Preview Content";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXGroup section */
|
||||||
|
|
||||||
|
/* Begin PBXNativeTarget section */
|
||||||
|
921EDBF32A827CF200F8965C /* libreevent-entry-control */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 921EDC022A827CF400F8965C /* Build configuration list for PBXNativeTarget "libreevent-entry-control" */;
|
||||||
|
buildPhases = (
|
||||||
|
921EDBF02A827CF200F8965C /* Sources */,
|
||||||
|
921EDBF12A827CF200F8965C /* Frameworks */,
|
||||||
|
921EDBF22A827CF200F8965C /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = "libreevent-entry-control";
|
||||||
|
packageProductDependencies = (
|
||||||
|
92DBBD8B2AA9C0C5006F6094 /* CodeScanner */,
|
||||||
|
);
|
||||||
|
productName = "libreevent-entry-control";
|
||||||
|
productReference = 921EDBF42A827CF200F8965C /* libreevent-entry-control.app */;
|
||||||
|
productType = "com.apple.product-type.application";
|
||||||
|
};
|
||||||
|
/* End PBXNativeTarget section */
|
||||||
|
|
||||||
|
/* Begin PBXProject section */
|
||||||
|
921EDBEC2A827CF200F8965C /* Project object */ = {
|
||||||
|
isa = PBXProject;
|
||||||
|
attributes = {
|
||||||
|
BuildIndependentTargetsInParallel = 1;
|
||||||
|
LastSwiftUpdateCheck = 1420;
|
||||||
|
LastUpgradeCheck = 1420;
|
||||||
|
TargetAttributes = {
|
||||||
|
921EDBF32A827CF200F8965C = {
|
||||||
|
CreatedOnToolsVersion = 14.2;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
buildConfigurationList = 921EDBEF2A827CF200F8965C /* Build configuration list for PBXProject "libreevent-entry-control" */;
|
||||||
|
compatibilityVersion = "Xcode 14.0";
|
||||||
|
developmentRegion = en;
|
||||||
|
hasScannedForEncodings = 0;
|
||||||
|
knownRegions = (
|
||||||
|
en,
|
||||||
|
Base,
|
||||||
|
);
|
||||||
|
mainGroup = 921EDBEB2A827CF200F8965C;
|
||||||
|
packageReferences = (
|
||||||
|
92DBBD8A2AA9C0C5006F6094 /* XCRemoteSwiftPackageReference "CodeScanner" */,
|
||||||
|
);
|
||||||
|
productRefGroup = 921EDBF52A827CF200F8965C /* Products */;
|
||||||
|
projectDirPath = "";
|
||||||
|
projectRoot = "";
|
||||||
|
targets = (
|
||||||
|
921EDBF32A827CF200F8965C /* libreevent-entry-control */,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
/* End PBXProject section */
|
||||||
|
|
||||||
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
|
921EDBF22A827CF200F8965C /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
92DBBD922AA9D0AF006F6094 /* Launch Screen.storyboard in Resources */,
|
||||||
|
921EDBFF2A827CF400F8965C /* Preview Assets.xcassets in Resources */,
|
||||||
|
921EDBFC2A827CF400F8965C /* Assets.xcassets in Resources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
921EDBF02A827CF200F8965C /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
92DBBD892AA9B6A6006F6094 /* LoginView.swift in Sources */,
|
||||||
|
921EDBFA2A827CF200F8965C /* ContentView.swift in Sources */,
|
||||||
|
921EDBF82A827CF200F8965C /* libreevent_entry_controlApp.swift in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin XCBuildConfiguration section */
|
||||||
|
921EDC002A827CF400F8965C /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_COMMA = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
ENABLE_TESTABILITY = YES;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
"DEBUG=1",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 16.2;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
|
MTL_FAST_MATH = YES;
|
||||||
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
921EDC012A827CF400F8965C /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_COMMA = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 16.2;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
MTL_FAST_MATH = YES;
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
SWIFT_COMPILATION_MODE = wholemodule;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||||
|
VALIDATE_PRODUCT = YES;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
921EDC032A827CF400F8965C /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
CURRENT_PROJECT_VERSION = 2;
|
||||||
|
DEVELOPMENT_ASSET_PATHS = "\"libreevent-entry-control/Preview Content\"";
|
||||||
|
DEVELOPMENT_TEAM = 8CRQNHKNVF;
|
||||||
|
ENABLE_PREVIEWS = YES;
|
||||||
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
INFOPLIST_FILE = "libreevent-entry-control/Info.plist";
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = libreevent;
|
||||||
|
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.business";
|
||||||
|
INFOPLIST_KEY_NSCameraUsageDescription = "We need to scan QR codes";
|
||||||
|
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
||||||
|
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||||
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||||
|
INFOPLIST_KEY_UILaunchStoryboardName = "Launch Screen.storyboard";
|
||||||
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||||
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
);
|
||||||
|
MARKETING_VERSION = 1;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "com.janishutz.libreevent-entry-control";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
921EDC042A827CF400F8965C /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
CURRENT_PROJECT_VERSION = 2;
|
||||||
|
DEVELOPMENT_ASSET_PATHS = "\"libreevent-entry-control/Preview Content\"";
|
||||||
|
DEVELOPMENT_TEAM = 8CRQNHKNVF;
|
||||||
|
ENABLE_PREVIEWS = YES;
|
||||||
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
INFOPLIST_FILE = "libreevent-entry-control/Info.plist";
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = libreevent;
|
||||||
|
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.business";
|
||||||
|
INFOPLIST_KEY_NSCameraUsageDescription = "We need to scan QR codes";
|
||||||
|
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
||||||
|
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||||
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||||
|
INFOPLIST_KEY_UILaunchStoryboardName = "Launch Screen.storyboard";
|
||||||
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||||
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
);
|
||||||
|
MARKETING_VERSION = 1;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "com.janishutz.libreevent-entry-control";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
|
/* Begin XCConfigurationList section */
|
||||||
|
921EDBEF2A827CF200F8965C /* Build configuration list for PBXProject "libreevent-entry-control" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
921EDC002A827CF400F8965C /* Debug */,
|
||||||
|
921EDC012A827CF400F8965C /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
921EDC022A827CF400F8965C /* Build configuration list for PBXNativeTarget "libreevent-entry-control" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
921EDC032A827CF400F8965C /* Debug */,
|
||||||
|
921EDC042A827CF400F8965C /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
/* End XCConfigurationList section */
|
||||||
|
|
||||||
|
/* Begin XCRemoteSwiftPackageReference section */
|
||||||
|
92DBBD8A2AA9C0C5006F6094 /* XCRemoteSwiftPackageReference "CodeScanner" */ = {
|
||||||
|
isa = XCRemoteSwiftPackageReference;
|
||||||
|
repositoryURL = "https://github.com/twostraws/CodeScanner";
|
||||||
|
requirement = {
|
||||||
|
kind = upToNextMajorVersion;
|
||||||
|
minimumVersion = 2.0.0;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
/* End XCRemoteSwiftPackageReference section */
|
||||||
|
|
||||||
|
/* Begin XCSwiftPackageProductDependency section */
|
||||||
|
92DBBD8B2AA9C0C5006F6094 /* CodeScanner */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = 92DBBD8A2AA9C0C5006F6094 /* XCRemoteSwiftPackageReference "CodeScanner" */;
|
||||||
|
productName = CodeScanner;
|
||||||
|
};
|
||||||
|
/* End XCSwiftPackageProductDependency section */
|
||||||
|
};
|
||||||
|
rootObject = 921EDBEC2A827CF200F8965C /* Project object */;
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Workspace
|
||||||
|
version = "1.0">
|
||||||
|
<FileRef
|
||||||
|
location = "self:">
|
||||||
|
</FileRef>
|
||||||
|
</Workspace>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>IDEDidComputeMac32BitWarning</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"pins" : [
|
||||||
|
{
|
||||||
|
"identity" : "codescanner",
|
||||||
|
"kind" : "remoteSourceControl",
|
||||||
|
"location" : "https://github.com/twostraws/CodeScanner",
|
||||||
|
"state" : {
|
||||||
|
"revision" : "bf5d7087015620b250ee6c865b3c9039fc159d1a",
|
||||||
|
"version" : "2.3.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"version" : 2
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>SchemeUserState</key>
|
||||||
|
<dict>
|
||||||
|
<key>libreevent-entry-control.xcscheme_^#shared#^_</key>
|
||||||
|
<dict>
|
||||||
|
<key>orderHint</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"colors" : [
|
||||||
|
{
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 9.7 KiB |
|
After Width: | Height: | Size: 920 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 801 B |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 4.4 KiB |