0.2.3
This commit is contained in:
@@ -0,0 +1,68 @@
|
|||||||
|
name: Release APK on Tag
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up JDK 17
|
||||||
|
uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
distribution: 'temurin'
|
||||||
|
java-version: '17'
|
||||||
|
|
||||||
|
- name: Cache Gradle
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.gradle/caches
|
||||||
|
~/.gradle/wrapper
|
||||||
|
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-gradle-
|
||||||
|
|
||||||
|
- name: Build release APK
|
||||||
|
run: ./gradlew :app:assembleRelease --no-daemon --stacktrace
|
||||||
|
|
||||||
|
- name: Find APK
|
||||||
|
id: find_apk
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
APK=$(ls app/build/outputs/apk/release/*.apk | head -n1 || true)
|
||||||
|
if [ -z "$APK" ]; then
|
||||||
|
echo "No APK found in app/build/outputs/apk/release"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "APK_PATH=$APK" >> $GITHUB_ENV
|
||||||
|
echo "apk=$APK"
|
||||||
|
|
||||||
|
- name: Upload artifact (for debugging)
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: app-release-apk
|
||||||
|
path: ${{ env.APK_PATH }}
|
||||||
|
|
||||||
|
- name: Create GitHub Release
|
||||||
|
id: create_release
|
||||||
|
uses: actions/create-release@v1
|
||||||
|
with:
|
||||||
|
tag_name: ${{ github.ref_name }}
|
||||||
|
release_name: Release ${{ github.ref_name }}
|
||||||
|
body: Automated release for tag ${{ github.ref_name }}
|
||||||
|
draft: false
|
||||||
|
prerelease: false
|
||||||
|
|
||||||
|
- name: Upload APK to Release
|
||||||
|
uses: actions/upload-release-asset@v1
|
||||||
|
with:
|
||||||
|
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
||||||
|
asset_path: ${{ env.APK_PATH }}
|
||||||
|
asset_name: app-release.apk
|
||||||
|
asset_content_type: application/vnd.android.package-archive
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Generated
+1
-64
@@ -4,70 +4,7 @@
|
|||||||
<option name="autoReloadType" value="NONE" />
|
<option name="autoReloadType" value="NONE" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="51538617-7e5b-4e71-9f47-7bda274cf4cc" name="Changes" comment="">
|
<list default="true" id="51538617-7e5b-4e71-9f47-7bda274cf4cc" name="Changes" comment="" />
|
||||||
<change beforePath="$PROJECT_DIR$/.gitea/workflows/build-apk.yml" beforeDir="false" afterPath="$PROJECT_DIR$/.gitea/workflows/build-apk.yml" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/executionHistory/executionHistory.bin" beforeDir="false" afterPath="$PROJECT_DIR$/.gradle/8.5/executionHistory/executionHistory.bin" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/executionHistory/executionHistory.lock" beforeDir="false" afterPath="$PROJECT_DIR$/.gradle/8.5/executionHistory/executionHistory.lock" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/fileHashes/fileHashes.bin" beforeDir="false" afterPath="$PROJECT_DIR$/.gradle/8.5/fileHashes/fileHashes.bin" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/fileHashes/fileHashes.lock" beforeDir="false" afterPath="$PROJECT_DIR$/.gradle/8.5/fileHashes/fileHashes.lock" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/fileHashes/resourceHashesCache.bin" beforeDir="false" afterPath="$PROJECT_DIR$/.gradle/8.5/fileHashes/resourceHashesCache.bin" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/.gradle/buildOutputCleanup/buildOutputCleanup.lock" beforeDir="false" afterPath="$PROJECT_DIR$/.gradle/buildOutputCleanup/buildOutputCleanup.lock" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/.gradle/file-system.probe" beforeDir="false" afterPath="$PROJECT_DIR$/.gradle/file-system.probe" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/intermediates/assets/debug/js/components.js" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/intermediates/assets/debug/js/components.js" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/intermediates/assets/debug/js/dzielenie.js" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/intermediates/assets/debug/js/dzielenie.js" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/intermediates/assets/debug/js/mnozenie.js" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/intermediates/assets/debug/js/mnozenie.js" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/intermediates/compressed_assets/debug/out/assets/js/components.js.jar" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/intermediates/compressed_assets/debug/out/assets/js/components.js.jar" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/intermediates/compressed_assets/debug/out/assets/js/dzielenie.js.jar" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/intermediates/compressed_assets/debug/out/assets/js/dzielenie.js.jar" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/intermediates/compressed_assets/debug/out/assets/js/mnozenie.js.jar" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/intermediates/compressed_assets/debug/out/assets/js/mnozenie.js.jar" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/intermediates/desugar_graph/debug/out/currentProject/dirs_bucket_3/graph.bin" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/intermediates/desugar_graph/debug/out/currentProject/dirs_bucket_3/graph.bin" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/intermediates/dex/debug/mergeProjectDexDebug/6/classes.dex" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/intermediates/dex/debug/mergeProjectDexDebug/6/classes.dex" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/intermediates/project_dex_archive/debug/out/com/example/app/MainActivity.dex" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/intermediates/project_dex_archive/debug/out/com/example/app/MainActivity.dex" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/last-build.bin" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/cacheable/last-build.bin" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/local-state/build-history.bin" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/kotlin/compileDebugKotlin/local-state/build-history.bin" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/outputs/apk/debug/app-debug.apk" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/outputs/apk/debug/app-debug.apk" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/build/tmp/kotlin-classes/debug/com/example/app/MainActivity.class" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/tmp/kotlin-classes/debug/com/example/app/MainActivity.class" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/src/main/assets/js/components.js" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/assets/js/components.js" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/src/main/assets/js/dzielenie.js" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/assets/js/dzielenie.js" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/src/main/assets/js/mnozenie.js" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/assets/js/mnozenie.js" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/app/MainActivity.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/app/MainActivity.kt" afterDir="false" />
|
|
||||||
</list>
|
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||||
|
|||||||
@@ -13,3 +13,33 @@ Pliki
|
|||||||
Jak uruchomić
|
Jak uruchomić
|
||||||
|
|
||||||
Otwórz plik `index.html` w przeglądarce (najlepiej na urządzeniu mobilnym lub w trybie responsywnym).
|
Otwórz plik `index.html` w przeglądarce (najlepiej na urządzeniu mobilnym lub w trybie responsywnym).
|
||||||
|
|
||||||
|
Signing a release APK/AAB
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
Aby uniknąć ostrzeżeń "nieznany deweloper" lub instalatora na Androidzie, zbuduj podpisany pakiet APK lub AAB i zainstaluj go zamiast debugowego APK.
|
||||||
|
|
||||||
|
1. Utwórz magazyn kluczy (jeśli go nie masz):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my_key_alias
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Skopiuj `gradle.properties.example` do swojego osobistego pliku `~/.gradle/gradle.properties` i uzupełnij wartości (nie commituj prawdziwych haseł do kontroli wersji).
|
||||||
|
|
||||||
|
3. Zbuduj podpisany pakiet APK lub AAB:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./gradlew assembleRelease # podpisany APK (jeśli podpisywanie jest skonfigurowane)
|
||||||
|
./gradlew bundleRelease # AAB do Sklepu Play
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Zainstaluj APK za pomocą adb:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
adb install -r app/build/outputs/apk/release/app-release.apk
|
||||||
|
```
|
||||||
|
|
||||||
|
Lub przesłać AAB do Google Play (testowanie wewnętrzne) — zalecane w celu najłatwiejszej dystrybucji.
|
||||||
|
|
||||||
|
Jeśli chcesz tylko przetestować lokalnie i zobaczyć ostrzeżenie "Nieznane źródła", możesz tymczasowo włączyć instalowanie z nieznanych źródeł na urządzeniu, ale dystrybucja podpisanego wydania jest bezpieczniejszym podejściem.
|
||||||
|
|||||||
@@ -14,10 +14,39 @@ android {
|
|||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Signing configuration for release builds.
|
||||||
|
// Configure the following properties in either your
|
||||||
|
// - ~/.gradle/gradle.properties (recommended for secrets), or
|
||||||
|
// - <project root>/gradle.properties (do NOT commit passwords)
|
||||||
|
//
|
||||||
|
// Example properties:
|
||||||
|
// MYAPP_STORE_FILE=keystores/my-release-key.jks
|
||||||
|
// MYAPP_STORE_PASSWORD=your_store_password
|
||||||
|
// MYAPP_KEY_ALIAS=my_key_alias
|
||||||
|
// MYAPP_KEY_PASSWORD=your_key_password
|
||||||
|
signingConfigs {
|
||||||
|
release {
|
||||||
|
// Only configure signing when the properties are provided.
|
||||||
|
if (project.hasProperty('MYAPP_STORE_FILE')) {
|
||||||
|
storeFile file(MYAPP_STORE_FILE)
|
||||||
|
storePassword MYAPP_STORE_PASSWORD
|
||||||
|
keyAlias MYAPP_KEY_ALIAS
|
||||||
|
keyPassword MYAPP_KEY_PASSWORD
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
minifyEnabled false
|
minifyEnabled false
|
||||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
// Apply signing config if available. This keeps debug and CI builds
|
||||||
|
// working even when signing properties are absent locally.
|
||||||
|
if (project.hasProperty('MYAPP_STORE_FILE')) {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
}
|
||||||
|
// Ensure release builds are not debuggable.
|
||||||
|
debuggable false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,19 +55,19 @@ const statusEl = document.getElementById('status');
|
|||||||
// load settings from localStorage
|
// load settings from localStorage
|
||||||
function loadSettings(){
|
function loadSettings(){
|
||||||
try{
|
try{
|
||||||
let progressInner = null
|
const raw = (typeof localStorage !== 'undefined') ? localStorage.getItem('matma:settings') : null
|
||||||
if (raw) {
|
if (raw) {
|
||||||
const s = JSON.parse(raw)
|
const s = JSON.parse(raw)
|
||||||
state.settings = Object.assign(state.settings, s)
|
state.settings = Object.assign(state.settings, s)
|
||||||
}
|
}
|
||||||
}catch(e){ console.warn('settings load failed', e) }
|
}catch(e){ console.warn('settings load failed', e) }
|
||||||
// reflect to inputs
|
// reflect to inputs (guard in case some inputs are missing)
|
||||||
settingTimed.value = state.settings.timedSeconds
|
if (settingTimed) settingTimed.value = state.settings.timedSeconds
|
||||||
settingMaxResult.value = state.settings.maxResult
|
if (settingMaxResult) settingMaxResult.value = state.settings.maxResult
|
||||||
settingMaxOperand.value = state.settings.maxOperand
|
if (settingMaxOperand) settingMaxOperand.value = state.settings.maxOperand
|
||||||
settingSessionProblems.value = state.settings.sessionProblems
|
if (settingSessionProblems) settingSessionProblems.value = state.settings.sessionProblems
|
||||||
settingAllowNegative.checked = !!state.settings.allowNegative
|
if (settingAllowNegative) settingAllowNegative.checked = !!state.settings.allowNegative
|
||||||
settingAllowFraction.checked = !!state.settings.allowFraction
|
if (settingAllowFraction) settingAllowFraction.checked = !!state.settings.allowFraction
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveSettings(){
|
function saveSettings(){
|
||||||
@@ -145,16 +145,16 @@ function startPlay(){
|
|||||||
renderProblem()
|
renderProblem()
|
||||||
|
|
||||||
if (state.mode === 'timed'){
|
if (state.mode === 'timed'){
|
||||||
progressInner.style.width = '0%'
|
if (progressInner) progressInner.style.width = '0%'
|
||||||
startTimer(state.settings.timedSeconds)
|
startTimer(state.settings.timedSeconds)
|
||||||
statusEl.textContent = 'Na czas';
|
if (statusEl) statusEl.textContent = 'Na czas';
|
||||||
timerEl.classList.remove('hidden');
|
if (timerEl) timerEl.classList.remove('hidden');
|
||||||
} else {
|
} else {
|
||||||
progressInner.style.width = '0%'
|
if (progressInner) progressInner.style.width = '0%'
|
||||||
state.sessionSolved = 0
|
state.sessionSolved = 0
|
||||||
state.sessionTarget = Math.max(1, state.settings.sessionProblems)
|
state.sessionTarget = Math.max(1, state.settings.sessionProblems)
|
||||||
updateProgress()
|
updateProgress()
|
||||||
timerEl.classList.add('hidden');
|
if (timerEl) timerEl.classList.add('hidden');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,14 +311,14 @@ backspaceBtn.addEventListener('click', ()=>{
|
|||||||
|
|
||||||
function startTimer(seconds){
|
function startTimer(seconds){
|
||||||
state.timeLeft = seconds
|
state.timeLeft = seconds
|
||||||
timerEl.textContent = state.timeLeft
|
if (timerEl) timerEl.textContent = state.timeLeft
|
||||||
|
|
||||||
stopTimer();
|
stopTimer();
|
||||||
state.timerId = setInterval(()=>{
|
state.timerId = setInterval(()=>{
|
||||||
state.timeLeft -= 1
|
state.timeLeft -= 1
|
||||||
timerEl.textContent = state.timeLeft
|
if (timerEl) timerEl.textContent = state.timeLeft
|
||||||
const pct = Math.max(0, (state.timeLeft / seconds) * 100)
|
const pct = Math.max(0, (state.timeLeft / seconds) * 100)
|
||||||
progressInner.style.width = pct + '%'
|
if (progressInner) progressInner.style.width = pct + '%'
|
||||||
if (state.timeLeft <= 0) {
|
if (state.timeLeft <= 0) {
|
||||||
stopTimer()
|
stopTimer()
|
||||||
endSession()
|
endSession()
|
||||||
@@ -357,9 +357,9 @@ summaryBack.addEventListener('click', ()=>{
|
|||||||
|
|
||||||
function updateProgress(){
|
function updateProgress(){
|
||||||
if (state.mode === 'training'){
|
if (state.mode === 'training'){
|
||||||
const pct = Math.min(100, Math.round((state.sessionSolved/state.sessionTarget)*100))
|
const pct = Math.min(100, Math.round((state.sessionSolved/state.sessionTarget)*100))
|
||||||
progressInner.style.width = pct + '%'
|
if (progressInner) progressInner.style.width = pct + '%'
|
||||||
statusEl.textContent = `${state.sessionSolved}/${state.sessionTarget}`
|
if (statusEl) statusEl.textContent = `${state.sessionSolved}/${state.sessionTarget}`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,14 +4,10 @@
|
|||||||
const backBtn = document.getElementById('back-to-hub')
|
const backBtn = document.getElementById('back-to-hub')
|
||||||
if (!backBtn) return
|
if (!backBtn) return
|
||||||
|
|
||||||
|
// Immediately navigate back to hub/menu without confirmation
|
||||||
backBtn.addEventListener('click', (e) => {
|
backBtn.addEventListener('click', (e) => {
|
||||||
const playScreen = document.getElementById('play-screen')
|
const href = backBtn.getAttribute('href')
|
||||||
const taskActive = playScreen && !playScreen.classList.contains('hidden')
|
if (href) window.location.href = href
|
||||||
if (taskActive) {
|
|
||||||
e.preventDefault()
|
|
||||||
const ok = confirm('Masz aktywne zadanie. Czy na pewno chcesz wyjść do menu?')
|
|
||||||
if (ok) window.location.href = backBtn.getAttribute('href')
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})()
|
})()
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1,4 +1,4 @@
|
|||||||
#Wed May 27 14:20:16 CEST 2026
|
#Wed May 27 14:53:22 CEST 2026
|
||||||
base.2=/Users/aln/Work/Matma/app/build/intermediates/dex/debug/mergeProjectDexDebug/6/classes.dex
|
base.2=/Users/aln/Work/Matma/app/build/intermediates/dex/debug/mergeProjectDexDebug/6/classes.dex
|
||||||
path.2=6/classes.dex
|
path.2=6/classes.dex
|
||||||
base.1=/Users/aln/Work/Matma/app/build/intermediates/dex/debug/mergeProjectDexDebug/0/classes.dex
|
base.1=/Users/aln/Work/Matma/app/build/intermediates/dex/debug/mergeProjectDexDebug/0/classes.dex
|
||||||
|
|||||||
Binary file not shown.
@@ -55,19 +55,19 @@ const statusEl = document.getElementById('status');
|
|||||||
// load settings from localStorage
|
// load settings from localStorage
|
||||||
function loadSettings(){
|
function loadSettings(){
|
||||||
try{
|
try{
|
||||||
let progressInner = null
|
const raw = (typeof localStorage !== 'undefined') ? localStorage.getItem('matma:settings') : null
|
||||||
if (raw) {
|
if (raw) {
|
||||||
const s = JSON.parse(raw)
|
const s = JSON.parse(raw)
|
||||||
state.settings = Object.assign(state.settings, s)
|
state.settings = Object.assign(state.settings, s)
|
||||||
}
|
}
|
||||||
}catch(e){ console.warn('settings load failed', e) }
|
}catch(e){ console.warn('settings load failed', e) }
|
||||||
// reflect to inputs
|
// reflect to inputs (guard in case some inputs are missing)
|
||||||
settingTimed.value = state.settings.timedSeconds
|
if (settingTimed) settingTimed.value = state.settings.timedSeconds
|
||||||
settingMaxResult.value = state.settings.maxResult
|
if (settingMaxResult) settingMaxResult.value = state.settings.maxResult
|
||||||
settingMaxOperand.value = state.settings.maxOperand
|
if (settingMaxOperand) settingMaxOperand.value = state.settings.maxOperand
|
||||||
settingSessionProblems.value = state.settings.sessionProblems
|
if (settingSessionProblems) settingSessionProblems.value = state.settings.sessionProblems
|
||||||
settingAllowNegative.checked = !!state.settings.allowNegative
|
if (settingAllowNegative) settingAllowNegative.checked = !!state.settings.allowNegative
|
||||||
settingAllowFraction.checked = !!state.settings.allowFraction
|
if (settingAllowFraction) settingAllowFraction.checked = !!state.settings.allowFraction
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveSettings(){
|
function saveSettings(){
|
||||||
@@ -145,16 +145,16 @@ function startPlay(){
|
|||||||
renderProblem()
|
renderProblem()
|
||||||
|
|
||||||
if (state.mode === 'timed'){
|
if (state.mode === 'timed'){
|
||||||
progressInner.style.width = '0%'
|
if (progressInner) progressInner.style.width = '0%'
|
||||||
startTimer(state.settings.timedSeconds)
|
startTimer(state.settings.timedSeconds)
|
||||||
statusEl.textContent = 'Na czas';
|
if (statusEl) statusEl.textContent = 'Na czas';
|
||||||
timerEl.classList.remove('hidden');
|
if (timerEl) timerEl.classList.remove('hidden');
|
||||||
} else {
|
} else {
|
||||||
progressInner.style.width = '0%'
|
if (progressInner) progressInner.style.width = '0%'
|
||||||
state.sessionSolved = 0
|
state.sessionSolved = 0
|
||||||
state.sessionTarget = Math.max(1, state.settings.sessionProblems)
|
state.sessionTarget = Math.max(1, state.settings.sessionProblems)
|
||||||
updateProgress()
|
updateProgress()
|
||||||
timerEl.classList.add('hidden');
|
if (timerEl) timerEl.classList.add('hidden');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,14 +311,14 @@ backspaceBtn.addEventListener('click', ()=>{
|
|||||||
|
|
||||||
function startTimer(seconds){
|
function startTimer(seconds){
|
||||||
state.timeLeft = seconds
|
state.timeLeft = seconds
|
||||||
timerEl.textContent = state.timeLeft
|
if (timerEl) timerEl.textContent = state.timeLeft
|
||||||
|
|
||||||
stopTimer();
|
stopTimer();
|
||||||
state.timerId = setInterval(()=>{
|
state.timerId = setInterval(()=>{
|
||||||
state.timeLeft -= 1
|
state.timeLeft -= 1
|
||||||
timerEl.textContent = state.timeLeft
|
if (timerEl) timerEl.textContent = state.timeLeft
|
||||||
const pct = Math.max(0, (state.timeLeft / seconds) * 100)
|
const pct = Math.max(0, (state.timeLeft / seconds) * 100)
|
||||||
progressInner.style.width = pct + '%'
|
if (progressInner) progressInner.style.width = pct + '%'
|
||||||
if (state.timeLeft <= 0) {
|
if (state.timeLeft <= 0) {
|
||||||
stopTimer()
|
stopTimer()
|
||||||
endSession()
|
endSession()
|
||||||
@@ -357,9 +357,9 @@ summaryBack.addEventListener('click', ()=>{
|
|||||||
|
|
||||||
function updateProgress(){
|
function updateProgress(){
|
||||||
if (state.mode === 'training'){
|
if (state.mode === 'training'){
|
||||||
const pct = Math.min(100, Math.round((state.sessionSolved/state.sessionTarget)*100))
|
const pct = Math.min(100, Math.round((state.sessionSolved/state.sessionTarget)*100))
|
||||||
progressInner.style.width = pct + '%'
|
if (progressInner) progressInner.style.width = pct + '%'
|
||||||
statusEl.textContent = `${state.sessionSolved}/${state.sessionTarget}`
|
if (statusEl) statusEl.textContent = `${state.sessionSolved}/${state.sessionTarget}`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
# Example properties for signing your release APK/AAB.
|
||||||
|
# DO NOT commit real passwords. Copy this to gradle.properties in your home
|
||||||
|
# directory (~/.gradle/gradle.properties) or to a secure CI secret store.
|
||||||
|
|
||||||
|
# Path to your keystore file (relative to project root or absolute path)
|
||||||
|
MYAPP_STORE_FILE=keystores/my-release-key.jks
|
||||||
|
# Your keystore password
|
||||||
|
MYAPP_STORE_PASSWORD=
|
||||||
|
# Your key alias inside the keystore
|
||||||
|
MYAPP_KEY_ALIAS=
|
||||||
|
# Your key password (often same as store password)
|
||||||
|
MYAPP_KEY_PASSWORD=
|
||||||
Reference in New Issue
Block a user