Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 36757d1fb9 | |||
| a99f5167a9 | |||
| 2ea8e9c58e | |||
| 40b013b2d6 | |||
| 67a9d5b024 | |||
| eb6890a603 | |||
| 5f0074ed37 | |||
| 5399b64cd5 | |||
| e4db4bb31e | |||
| 332fef0fd3 | |||
| 244aa8457a | |||
| 03bcb465cf | |||
| b2721c2ec3 | |||
| 1385b3ace0 | |||
| 66a028880c | |||
| 365b12b0eb | |||
| 5ef6747e4d | |||
| 7ce23309f6 | |||
| 6c4b5f4adf | |||
| b8b7b3860b |
+138
-10
@@ -27,17 +27,145 @@ jobs:
|
||||
- name: Grant execute permission
|
||||
run: chmod +x ./gradlew
|
||||
|
||||
- name: Package and upload webapp
|
||||
env:
|
||||
UPLOAD_WEBAPP_URL: ${{ secrets.UPLOAD_WEBAPP_URL }}
|
||||
UPLOAD_WEBAPP_TOKEN: ${{ secrets.UPLOAD_WEBAPP_TOKEN }}
|
||||
run: |
|
||||
set -e
|
||||
# create webapp zip and upload to configured URL (if provided)
|
||||
./gradlew zipWebApp uploadWebApp
|
||||
|
||||
- name: Update version in assets
|
||||
run: |
|
||||
set -e
|
||||
TAG="${{ github.ref_name }}"
|
||||
# Jeśli tag jest pusty (np. push nie na tag), użyjemy skróconego SHA
|
||||
if [ -z "$TAG" ] || [ "$TAG" = "main" ]; then
|
||||
TAG=$(git rev-parse --short HEAD)
|
||||
fi
|
||||
echo "Setting version to: $TAG"
|
||||
# Aktualizacja pliku js/version.js
|
||||
echo "const APP_VERSION = '$TAG';" > app/src/main/assets/js/version.js
|
||||
echo "document.addEventListener('DOMContentLoaded', () => {
|
||||
const el = document.getElementById('app-version') || document.getElementById('commit-sha');
|
||||
if (el) el.textContent = '$TAG';
|
||||
});" >> app/src/main/assets/js/version.js
|
||||
|
||||
- name: Build APK
|
||||
run: ./gradlew assembleRelease
|
||||
|
||||
- name: Upload APK
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: app-release
|
||||
path: app/build/outputs/apk/release/app-release.apk
|
||||
- name: Locate APK
|
||||
id: locate_apk
|
||||
run: |
|
||||
set -e
|
||||
APK_PATH=$(ls app/build/outputs/apk/release/*.apk | head -n1 || true)
|
||||
if [ -z "$APK_PATH" ]; then
|
||||
echo "No APK found in app/build/outputs/apk/release" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "APK_PATH=$APK_PATH" >> $GITHUB_ENV
|
||||
echo "Found $APK_PATH"
|
||||
|
||||
- name: Upload APK
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: app-release
|
||||
path: app/build/outputs/apk/release/app-release.apk
|
||||
# Note: uploading artifacts with actions/upload-artifact@v4 is not supported
|
||||
# on some self-hosted/enterprise runners (GHES). We skip storing artifacts
|
||||
# via that action and instead upload the APK directly to the Gitea release
|
||||
# in the steps below.
|
||||
|
||||
- name: Create Gitea release
|
||||
id: create_release
|
||||
env:
|
||||
GITEA_TOKEN: ${{ secrets.GIT_TOKEN }}
|
||||
GITEA_SERVER: ${{ secrets.GIT_SERVER }}
|
||||
run: |
|
||||
set -e
|
||||
SERVER_CLEAN=$(echo "$GITEA_SERVER" | sed 's#/$##')
|
||||
API_BASE="${SERVER_CLEAN}/api/v1"
|
||||
|
||||
OWNER="${{ github.repository_owner }}"
|
||||
REPO_NAME=$(echo "${{ github.repository }}" | cut -d/ -f2)
|
||||
TAG="${{ github.ref_name }}"
|
||||
|
||||
echo "Debug Info:"
|
||||
echo "- API URL: $API_BASE/repos/$OWNER/$REPO_NAME/releases"
|
||||
echo "- OWNER: $OWNER"
|
||||
echo "- REPO: $REPO_NAME"
|
||||
echo "- TAG: $TAG"
|
||||
|
||||
# Próba utworzenia release z przechwyceniem statusu HTTP
|
||||
RESPONSE_FILE=$(mktemp)
|
||||
HTTP_STATUS=$(curl -s -o "$RESPONSE_FILE" -w "%{http_code}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: token $GITEA_TOKEN" \
|
||||
-X POST \
|
||||
-d "{
|
||||
\"tag_name\": \"$TAG\",
|
||||
\"name\": \"$TAG\",
|
||||
\"body\": \"Automated release for $TAG\",
|
||||
\"draft\": false,
|
||||
\"prerelease\": false
|
||||
}" \
|
||||
"$API_BASE/repos/$OWNER/$REPO_NAME/releases")
|
||||
|
||||
RESPONSE_BODY=$(cat "$RESPONSE_FILE")
|
||||
echo "HTTP Status: $HTTP_STATUS"
|
||||
echo "Response: $RESPONSE_BODY"
|
||||
|
||||
if [ "$HTTP_STATUS" -eq 409 ]; then
|
||||
echo "Release already exists, fetching existing ID..."
|
||||
RESPONSE_BODY=$(curl -s -H "Authorization: token $GITEA_TOKEN" "$API_BASE/repos/$OWNER/$REPO_NAME/releases/tags/$TAG")
|
||||
RELEASE_ID=$(echo "$RESPONSE_BODY" | sed -n 's/.*"id":\([0-9]*\),.*/\1/p' | head -n1)
|
||||
elif [ "$HTTP_STATUS" -eq 201 ]; then
|
||||
RELEASE_ID=$(echo "$RESPONSE_BODY" | sed -n 's/.*"id":\([0-9]*\),.*/\1/p' | head -n1)
|
||||
else
|
||||
echo "Failed to create release. Expected 201 or 409, got $HTTP_STATUS"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$RELEASE_ID" ]; then
|
||||
echo "Failed to extract RELEASE_ID from response"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "RELEASE_ID=$RELEASE_ID" >> $GITHUB_ENV
|
||||
echo "Successfully processed release ID: $RELEASE_ID"
|
||||
|
||||
- name: Upload APK to Gitea release
|
||||
env:
|
||||
GITEA_TOKEN: ${{ secrets.GIT_TOKEN }}
|
||||
GITEA_SERVER: ${{ secrets.GIT_SERVER }}
|
||||
run: |
|
||||
set -e
|
||||
SERVER_CLEAN=$(echo "$GITEA_SERVER" | sed 's#/$##')
|
||||
API_BASE="${SERVER_CLEAN}/api/v1"
|
||||
|
||||
OWNER="${{ github.repository_owner }}"
|
||||
REPO_NAME=$(echo "${{ github.repository }}" | cut -d/ -f2)
|
||||
TAG="${{ github.ref_name }}"
|
||||
|
||||
if [ -z "$APK_PATH" ]; then
|
||||
echo "APK_PATH not set" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [ -z "$RELEASE_ID" ]; then
|
||||
echo "RELEASE_ID not set" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Tworzymy ładną nazwę dla pliku
|
||||
FRIENDLY_NAME="Matma-${TAG}.apk"
|
||||
cp "$APK_PATH" "./$FRIENDLY_NAME"
|
||||
|
||||
UPLOAD_URL="$API_BASE/repos/$OWNER/$REPO_NAME/releases/$RELEASE_ID/assets?name=$FRIENDLY_NAME"
|
||||
echo "Uploading $FRIENDLY_NAME to $UPLOAD_URL"
|
||||
|
||||
curl --fail -s -H "Authorization: token $GITEA_TOKEN" \
|
||||
-H "Content-Type: application/octet-stream" \
|
||||
--data-binary @"./$FRIENDLY_NAME" \
|
||||
"$UPLOAD_URL"
|
||||
|
||||
# Dodanie bezpośredniego linku do podsumowania buildu w Gitea
|
||||
DOWNLOAD_URL="${SERVER_CLEAN}/${OWNER}/${REPO_NAME}/releases/download/${TAG}/${FRIENDLY_NAME}"
|
||||
echo "### ✅ APK gotowy do pobrania!" >> $GITHUB_STEP_SUMMARY
|
||||
echo "[Pobierz plik $FRIENDLY_NAME]($DOWNLOAD_URL)" >> $GITHUB_STEP_SUMMARY
|
||||
echo "Adres: $DOWNLOAD_URL" >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
@@ -19,6 +19,28 @@ jobs:
|
||||
run: |
|
||||
echo "${{ env.GITHUB_SHA }}" > version.sha
|
||||
|
||||
- name: Create latest.zip
|
||||
run: |
|
||||
set -e
|
||||
# ensure a small staging dir for upload (absolute path so later cd won't affect it)
|
||||
mkdir -p "$GITHUB_WORKSPACE/dist/"
|
||||
# install zip utility (container may not have it)
|
||||
apt-get update && apt-get install -y zip
|
||||
# create latest.zip containing the assets directory (so zip root contains 'assets/')
|
||||
cd app/src/main
|
||||
zip -r "$GITHUB_WORKSPACE/latest.zip" assets
|
||||
# move zip into the workspace dist so the FTP action can upload just that file
|
||||
mv "$GITHUB_WORKSPACE/latest.zip" "$GITHUB_WORKSPACE/dist/"
|
||||
|
||||
- name: Upload latest.zip via FTP to releases
|
||||
uses: SamKirkland/FTP-Deploy-Action@v4.3.4
|
||||
with:
|
||||
server: ${{ secrets.FTP_HOST }}
|
||||
username: ${{ secrets.FTP_USER }}
|
||||
password: ${{ secrets.FTP_PASS }}
|
||||
local-dir: dist/
|
||||
server-dir: /releases/
|
||||
|
||||
- name: Upload via FTP
|
||||
uses: SamKirkland/FTP-Deploy-Action@v4.3.4
|
||||
with:
|
||||
|
||||
+36
-1
@@ -1,3 +1,38 @@
|
||||
.DS_Store
|
||||
./QuizzyTemplate
|
||||
./QuizzyTemplate/*
|
||||
/.QuizzyTemplate
|
||||
|
||||
# Android/Gradle
|
||||
/.gradle/
|
||||
/build/
|
||||
/app/build/
|
||||
/**/build/
|
||||
|
||||
# Gradle wrapper
|
||||
/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
# Local configuration
|
||||
/local.properties
|
||||
|
||||
# Keystore
|
||||
*.jks
|
||||
|
||||
# Generated APKs/outputs
|
||||
**/outputs/
|
||||
**/apk/**
|
||||
*.apk
|
||||
*.ap_
|
||||
|
||||
# IntelliJ / Android Studio
|
||||
.idea/
|
||||
*.iml
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
||||
|
||||
# NPM / Node
|
||||
node_modules/
|
||||
|
||||
# Misc
|
||||
*.log
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,2 +1,2 @@
|
||||
#Wed May 27 00:12:10 CEST 2026
|
||||
gradle.version=8.5
|
||||
#Sat Jun 13 15:33:08 CEST 2026
|
||||
gradle.version=9.4.1
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Generated
+160
-18
@@ -5,12 +5,65 @@
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="51538617-7e5b-4e71-9f47-7bda274cf4cc" name="Changes" comment="">
|
||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/checksums/checksums.lock" beforeDir="false" afterPath="$PROJECT_DIR$/.gradle/8.5/checksums/checksums.lock" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock" beforeDir="false" afterPath="$PROJECT_DIR$/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock" 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/checksums/checksums.lock" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/checksums/md5-checksums.bin" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/checksums/sha1-checksums.bin" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/dependencies-accessors/gc.properties" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/executionHistory/executionHistory.bin" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/executionHistory/executionHistory.lock" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/fileChanges/last-build.bin" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/fileHashes/fileHashes.bin" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/fileHashes/fileHashes.lock" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/fileHashes/resourceHashesCache.bin" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.gradle/8.5/gc.properties" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.gradle/buildOutputCleanup/buildOutputCleanup.lock" beforeDir="false" afterPath="$PROJECT_DIR$/.gradle/buildOutputCleanup/buildOutputCleanup.lock" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/MainActivity.kt" beforeDir="false" afterPath="$PROJECT_DIR$/MainActivity.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/build.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/app/build.gradle" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.gradle/buildOutputCleanup/cache.properties" beforeDir="false" afterPath="$PROJECT_DIR$/.gradle/buildOutputCleanup/cache.properties" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.gradle/buildOutputCleanup/outputFiles.bin" beforeDir="false" afterPath="$PROJECT_DIR$/.gradle/buildOutputCleanup/outputFiles.bin" 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$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" 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/incremental/packageDebug/tmp/debug/zip-cache/androidResources" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/androidResources" 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.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/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/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/outputs/logs/manifest-merger-debug-report.txt" beforeDir="false" afterPath="$PROJECT_DIR$/app/build/outputs/logs/manifest-merger-debug-report.txt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/AndroidManifest.xml" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/AndroidManifest.xml" 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" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/app/WebAppUpdater.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/app/WebAppUpdater.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/build.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/build.gradle" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/gradle.properties" beforeDir="false" afterPath="$PROJECT_DIR$/gradle.properties" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/gradle/wrapper/gradle-wrapper.properties" beforeDir="false" afterPath="$PROJECT_DIR$/gradle/wrapper/gradle-wrapper.properties" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/settings.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/settings.gradle" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
@@ -20,6 +73,24 @@
|
||||
<component name="ClangdSettings">
|
||||
<option name="formatViaClangd" value="false" />
|
||||
</component>
|
||||
<component name="ExecutionTargetManager" SELECTED_TARGET="device_and_snapshot_combo_box_target[LocalEmulator::path=/Users/aln/.android/avd/Pixel_10.avd]" />
|
||||
<component name="ExternalProjectsData">
|
||||
<projectState path="$PROJECT_DIR$">
|
||||
<ProjectState />
|
||||
</projectState>
|
||||
</component>
|
||||
<component name="ExternalProjectsManager">
|
||||
<system id="GRADLE">
|
||||
<state>
|
||||
<projects_view>
|
||||
<tree_state>
|
||||
<expand />
|
||||
<select />
|
||||
</tree_state>
|
||||
</projects_view>
|
||||
</state>
|
||||
</system>
|
||||
</component>
|
||||
<component name="Git.Settings">
|
||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||
</component>
|
||||
@@ -32,20 +103,91 @@
|
||||
<option name="hideEmptyMiddlePackages" value="true" />
|
||||
<option name="showLibraryContents" value="true" />
|
||||
</component>
|
||||
<component name="PropertiesComponent">{
|
||||
"keyToString": {
|
||||
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"RunOnceActivity.cidr.known.project.marker": "true",
|
||||
"RunOnceActivity.git.unshallow": "true",
|
||||
"RunOnceActivity.readMode.enableVisualFormatting": "true",
|
||||
"cf.first.check.clang-format": "false",
|
||||
"cidr.known.project.marker": "true",
|
||||
"git-widget-placeholder": "master",
|
||||
"kotlin-language-version-configured": "true",
|
||||
"last_opened_file_path": "/Users/aln/Work/Matma"
|
||||
<component name="PropertiesComponent"><![CDATA[{
|
||||
"keyToString": {
|
||||
"Android App.app.executor": "Debug",
|
||||
"Gradle.Configure Daemon JVM Criteria.executor": "Run",
|
||||
"GradleDaemonJvmCriteriaMigrationNotification.isNotificationDisabled": "true",
|
||||
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"RunOnceActivity.cidr.known.project.marker": "true",
|
||||
"RunOnceActivity.git.unshallow": "true",
|
||||
"RunOnceActivity.readMode.enableVisualFormatting": "true",
|
||||
"cf.first.check.clang-format": "false",
|
||||
"cidr.known.project.marker": "true",
|
||||
"git-widget-placeholder": "master",
|
||||
"kotlin-language-version-configured": "true",
|
||||
"last_opened_file_path": "/Users/aln/Work/Matma"
|
||||
}
|
||||
}</component>
|
||||
}]]></component>
|
||||
<component name="RunManager">
|
||||
<configuration name="app" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
|
||||
<module name="Matma.app" />
|
||||
<option name="ANDROID_RUN_CONFIGURATION_SCHEMA_VERSION" value="1" />
|
||||
<option name="DEPLOY" value="true" />
|
||||
<option name="DEPLOY_APK_FROM_BUNDLE" value="false" />
|
||||
<option name="DEPLOY_AS_INSTANT" value="false" />
|
||||
<option name="ARTIFACT_NAME" value="" />
|
||||
<option name="PM_INSTALL_OPTIONS" value="" />
|
||||
<option name="ALL_USERS" value="false" />
|
||||
<option name="ALWAYS_INSTALL_WITH_PM" value="false" />
|
||||
<option name="ALLOW_ASSUME_VERIFIED" value="false" />
|
||||
<option name="CLEAR_APP_STORAGE" value="false" />
|
||||
<option name="DYNAMIC_FEATURES_DISABLED_LIST" value="" />
|
||||
<option name="ACTIVITY_EXTRA_FLAGS" value="" />
|
||||
<option name="MODE" value="default_activity" />
|
||||
<option name="RESTORE_ENABLED" value="false" />
|
||||
<option name="RESTORE_FILE" value="" />
|
||||
<option name="RESTORE_FRESH_INSTALL_ONLY" value="false" />
|
||||
<option name="CLEAR_LOGCAT" value="false" />
|
||||
<option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
|
||||
<option name="TARGET_SELECTION_MODE" value="DEVICE_AND_SNAPSHOT_COMBO_BOX" />
|
||||
<option name="DEBUGGER_TYPE" value="Auto" />
|
||||
<Auto>
|
||||
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
|
||||
<option name="SHOW_STATIC_VARS" value="true" />
|
||||
<option name="WORKING_DIR" value="" />
|
||||
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
|
||||
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
|
||||
<option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
|
||||
</Auto>
|
||||
<Hybrid>
|
||||
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
|
||||
<option name="SHOW_STATIC_VARS" value="true" />
|
||||
<option name="WORKING_DIR" value="" />
|
||||
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
|
||||
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
|
||||
<option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
|
||||
</Hybrid>
|
||||
<Java>
|
||||
<option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
|
||||
</Java>
|
||||
<Native>
|
||||
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
|
||||
<option name="SHOW_STATIC_VARS" value="true" />
|
||||
<option name="WORKING_DIR" value="" />
|
||||
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
|
||||
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
|
||||
<option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
|
||||
</Native>
|
||||
<Profilers>
|
||||
<option name="ADVANCED_PROFILING_ENABLED" value="false" />
|
||||
<option name="STARTUP_PROFILING_ENABLED" value="false" />
|
||||
<option name="STARTUP_CPU_PROFILING_ENABLED" value="false" />
|
||||
<option name="STARTUP_CPU_PROFILING_CONFIGURATION_NAME" value="Java/Kotlin Method Sample (legacy)" />
|
||||
<option name="STARTUP_NATIVE_MEMORY_PROFILING_ENABLED" value="false" />
|
||||
<option name="NATIVE_MEMORY_SAMPLE_RATE_BYTES" value="2048" />
|
||||
</Profilers>
|
||||
<option name="DEEP_LINK" value="" />
|
||||
<option name="ACTIVITY" value="" />
|
||||
<option name="ACTIVITY_CLASS" value="" />
|
||||
<option name="SEARCH_ACTIVITY_IN_GLOBAL_SCOPE" value="false" />
|
||||
<option name="SKIP_ACTIVITY_VALIDATION" value="false" />
|
||||
<method v="2">
|
||||
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
<component name="TaskManager">
|
||||
<task active="true" id="Default" summary="Default task">
|
||||
<changelist id="51538617-7e5b-4e71-9f47-7bda274cf4cc" name="Changes" comment="" />
|
||||
|
||||
@@ -13,3 +13,33 @@ Pliki
|
||||
Jak uruchomić
|
||||
|
||||
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"
|
||||
}
|
||||
|
||||
// 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 {
|
||||
release {
|
||||
minifyEnabled false
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,4 +65,53 @@ dependencies {
|
||||
implementation 'androidx.appcompat:appcompat:1.6.1'
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.9.22"
|
||||
implementation 'androidx.webkit:webkit:1.8.0'
|
||||
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3'
|
||||
// JSONObject is provided by Android SDK (org.json)
|
||||
}
|
||||
|
||||
// Task: package webapp assets into a zip for release and optionally upload
|
||||
def webappSrc = file("src/main/assets")
|
||||
def webappZip = file("${buildDir}/outputs/webapp/webapp.zip")
|
||||
|
||||
tasks.register("zipWebApp") {
|
||||
group = "release"
|
||||
description = "Create zip of web assets (app/src/main/assets -> webapp.zip)"
|
||||
inputs.dir(webappSrc)
|
||||
outputs.file(webappZip)
|
||||
doLast {
|
||||
webappZip.parentFile.mkdirs()
|
||||
ant.zip(destfile: webappZip) {
|
||||
fileset(dir: webappSrc)
|
||||
}
|
||||
println "Created webapp zip: ${webappZip.absolutePath}"
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register("uploadWebApp") {
|
||||
group = "release"
|
||||
description = "Upload webapp zip to remote server if UPLOAD_WEBAPP_URL is set"
|
||||
dependsOn "zipWebApp"
|
||||
doLast {
|
||||
def uploadUrl = System.getenv('UPLOAD_WEBAPP_URL')
|
||||
def token = System.getenv('UPLOAD_WEBAPP_TOKEN')
|
||||
if (!uploadUrl) {
|
||||
println "UPLOAD_WEBAPP_URL not set, skipping upload"
|
||||
return
|
||||
}
|
||||
if (!webappZip.exists()) {
|
||||
throw new GradleException("webapp zip not found: ${webappZip}")
|
||||
}
|
||||
println "Uploading webapp to ${uploadUrl}"
|
||||
def cmd = ["curl", "--fail", "-X", "PUT", "-H", "Content-Type: application/zip"]
|
||||
if (token) {
|
||||
cmd += ["-H", "Authorization: Bearer ${token}"]
|
||||
}
|
||||
cmd += ["--data-binary", "@${webappZip.absolutePath}", uploadUrl]
|
||||
def process = cmd.execute()
|
||||
process.in.eachLine { println it }
|
||||
process.err.eachLine { System.err.println it }
|
||||
def rc = process.waitFor()
|
||||
if (rc != 0) throw new GradleException("Upload failed with exit code ${rc}")
|
||||
println "Upload successful"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,19 +55,19 @@ const statusEl = document.getElementById('status');
|
||||
// load settings from localStorage
|
||||
function loadSettings(){
|
||||
try{
|
||||
let progressInner = null
|
||||
const raw = (typeof localStorage !== 'undefined') ? localStorage.getItem('matma:settings') : null
|
||||
if (raw) {
|
||||
const s = JSON.parse(raw)
|
||||
state.settings = Object.assign(state.settings, s)
|
||||
}
|
||||
}catch(e){ console.warn('settings load failed', e) }
|
||||
// reflect to inputs
|
||||
settingTimed.value = state.settings.timedSeconds
|
||||
settingMaxResult.value = state.settings.maxResult
|
||||
settingMaxOperand.value = state.settings.maxOperand
|
||||
settingSessionProblems.value = state.settings.sessionProblems
|
||||
settingAllowNegative.checked = !!state.settings.allowNegative
|
||||
settingAllowFraction.checked = !!state.settings.allowFraction
|
||||
// reflect to inputs (guard in case some inputs are missing)
|
||||
if (settingTimed) settingTimed.value = state.settings.timedSeconds
|
||||
if (settingMaxResult) settingMaxResult.value = state.settings.maxResult
|
||||
if (settingMaxOperand) settingMaxOperand.value = state.settings.maxOperand
|
||||
if (settingSessionProblems) settingSessionProblems.value = state.settings.sessionProblems
|
||||
if (settingAllowNegative) settingAllowNegative.checked = !!state.settings.allowNegative
|
||||
if (settingAllowFraction) settingAllowFraction.checked = !!state.settings.allowFraction
|
||||
}
|
||||
|
||||
function saveSettings(){
|
||||
@@ -145,16 +145,16 @@ function startPlay(){
|
||||
renderProblem()
|
||||
|
||||
if (state.mode === 'timed'){
|
||||
progressInner.style.width = '0%'
|
||||
startTimer(state.settings.timedSeconds)
|
||||
statusEl.textContent = 'Na czas';
|
||||
timerEl.classList.remove('hidden');
|
||||
if (progressInner) progressInner.style.width = '0%'
|
||||
startTimer(state.settings.timedSeconds)
|
||||
if (statusEl) statusEl.textContent = 'Na czas';
|
||||
if (timerEl) timerEl.classList.remove('hidden');
|
||||
} else {
|
||||
progressInner.style.width = '0%'
|
||||
state.sessionSolved = 0
|
||||
state.sessionTarget = Math.max(1, state.settings.sessionProblems)
|
||||
updateProgress()
|
||||
timerEl.classList.add('hidden');
|
||||
if (progressInner) progressInner.style.width = '0%'
|
||||
state.sessionSolved = 0
|
||||
state.sessionTarget = Math.max(1, state.settings.sessionProblems)
|
||||
updateProgress()
|
||||
if (timerEl) timerEl.classList.add('hidden');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -311,14 +311,14 @@ backspaceBtn.addEventListener('click', ()=>{
|
||||
|
||||
function startTimer(seconds){
|
||||
state.timeLeft = seconds
|
||||
timerEl.textContent = state.timeLeft
|
||||
if (timerEl) timerEl.textContent = state.timeLeft
|
||||
|
||||
stopTimer();
|
||||
state.timerId = setInterval(()=>{
|
||||
state.timeLeft -= 1
|
||||
timerEl.textContent = state.timeLeft
|
||||
if (timerEl) timerEl.textContent = state.timeLeft
|
||||
const pct = Math.max(0, (state.timeLeft / seconds) * 100)
|
||||
progressInner.style.width = pct + '%'
|
||||
if (progressInner) progressInner.style.width = pct + '%'
|
||||
if (state.timeLeft <= 0) {
|
||||
stopTimer()
|
||||
endSession()
|
||||
@@ -357,9 +357,9 @@ summaryBack.addEventListener('click', ()=>{
|
||||
|
||||
function updateProgress(){
|
||||
if (state.mode === 'training'){
|
||||
const pct = Math.min(100, Math.round((state.sessionSolved/state.sessionTarget)*100))
|
||||
progressInner.style.width = pct + '%'
|
||||
statusEl.textContent = `${state.sessionSolved}/${state.sessionTarget}`
|
||||
const pct = Math.min(100, Math.round((state.sessionSolved/state.sessionTarget)*100))
|
||||
if (progressInner) progressInner.style.width = pct + '%'
|
||||
if (statusEl) statusEl.textContent = `${state.sessionSolved}/${state.sessionTarget}`
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,20 @@
|
||||
// Komponenty HTML loader
|
||||
function loadComponent(path, replaceMap = {}) {
|
||||
// If path is a full mapped origin used by WebViewAssetLoader, strip it to a relative path.
|
||||
const mappedOrigin = 'https://appassets.androidplatform.net/assets/';
|
||||
if (path.startsWith(mappedOrigin)) {
|
||||
path = path.slice(mappedOrigin.length);
|
||||
}
|
||||
|
||||
// If an absolute path starting with '/' is provided, remove leading slash to make it
|
||||
// relative to the current document (works under local http server and WebViewAssetLoader).
|
||||
if (path.startsWith('/')) path = path.slice(1);
|
||||
|
||||
return fetch(path)
|
||||
.then(r => r.text())
|
||||
.then(r => {
|
||||
if (!r.ok) throw new Error('Failed to load component: ' + path);
|
||||
return r.text();
|
||||
})
|
||||
.then(html => {
|
||||
Object.entries(replaceMap).forEach(([key, val]) => {
|
||||
html = html.replaceAll(key, val);
|
||||
|
||||
@@ -83,9 +83,8 @@
|
||||
}
|
||||
|
||||
// ── Back to list ──────────────────────────────────────────────────────────
|
||||
// Zakończ button: natychmiast wróć do listy bez potwierdzenia
|
||||
readBackBtn.addEventListener('click', () => {
|
||||
const active = yOffset > 0 || autoTimer !== null
|
||||
if (active && !confirm('Wrócić do listy tekstów?')) return
|
||||
clearInterval(autoTimer)
|
||||
autoTimer = null
|
||||
readWrap.classList.add('hidden')
|
||||
|
||||
@@ -296,9 +296,8 @@
|
||||
}
|
||||
|
||||
// ── Navigation ────────────────────────────────────────────────────────────
|
||||
// Zakończ button: natychmiast wracamy do listy bez potwierdzenia
|
||||
playBackBtn.addEventListener('click', () => {
|
||||
const inProgress = blanks.length > 0 && current < blanks.length
|
||||
if (inProgress && !confirm('Przerwać dyktando i wrócić do listy?')) return
|
||||
goToList()
|
||||
})
|
||||
|
||||
|
||||
@@ -136,7 +136,8 @@
|
||||
let sha = (window.COMMIT_SHA || '').toString().trim()
|
||||
if (!sha) {
|
||||
try {
|
||||
const res = await fetch('/version.sha', { cache: 'no-cache' })
|
||||
// use relative path so the request works under WebViewAssetLoader or a local server
|
||||
const res = await fetch('version.sha', { cache: 'no-cache' })
|
||||
if (res.ok) {
|
||||
const txt = await res.text()
|
||||
const first = txt.split(/\r?\n/).find(l => l.trim().length > 0)
|
||||
|
||||
@@ -136,7 +136,8 @@
|
||||
let sha = (window.COMMIT_SHA || '').toString().trim()
|
||||
if (!sha) {
|
||||
try {
|
||||
const res = await fetch('/version.sha', { cache: 'no-cache' })
|
||||
// use relative path so the request works under WebViewAssetLoader or a local server
|
||||
const res = await fetch('version.sha', { cache: 'no-cache' })
|
||||
if (res.ok) {
|
||||
const txt = await res.text()
|
||||
const first = txt.split(/\r?\n/).find(l => l.trim().length > 0)
|
||||
|
||||
@@ -4,14 +4,10 @@
|
||||
const backBtn = document.getElementById('back-to-hub')
|
||||
if (!backBtn) return
|
||||
|
||||
// Immediately navigate back to hub/menu without confirmation
|
||||
backBtn.addEventListener('click', (e) => {
|
||||
const playScreen = document.getElementById('play-screen')
|
||||
const taskActive = playScreen && !playScreen.classList.contains('hidden')
|
||||
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')
|
||||
}
|
||||
const href = backBtn.getAttribute('href')
|
||||
if (href) window.location.href = href
|
||||
})
|
||||
})
|
||||
})()
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
+14
-25
@@ -1,25 +1,14 @@
|
||||
#Wed May 27 14:04:06 CEST 2026
|
||||
com.example.app-main-22\:/mipmap-xhdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-xhdpi_ic_launcher.png.flat
|
||||
com.example.app-main-23\:/mipmap-hdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-hdpi_ic_launcher_foreground.png.flat
|
||||
com.example.app-main-22\:/mipmap-xxhdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-xxhdpi_ic_launcher.png.flat
|
||||
com.example.app-main-22\:/mipmap-xxxhdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-xxxhdpi_ic_launcher_foreground.png.flat
|
||||
com.example.app-main-22\:/drawable/ic_launcher_foreground.xml=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/drawable_ic_launcher_foreground.xml.flat
|
||||
com.example.app-main-22\:/mipmap-xxhdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-xxhdpi_ic_launcher_foreground.png.flat
|
||||
com.example.app-main-23\:/mipmap-xxhdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-xxhdpi_ic_launcher_foreground.png.flat
|
||||
com.example.app-main-22\:/mipmap-xhdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-xhdpi_ic_launcher_foreground.png.flat
|
||||
com.example.app-main-22\:/mipmap-mdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-mdpi_ic_launcher_foreground.png.flat
|
||||
com.example.app-main-23\:/mipmap-xhdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-xhdpi_ic_launcher_foreground.png.flat
|
||||
com.example.app-main-23\:/mipmap-anydpi-v26/ic_launcher.xml=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-anydpi-v26_ic_launcher.xml.flat
|
||||
com.example.app-main-23\:/mipmap-mdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-mdpi_ic_launcher.png.flat
|
||||
com.example.app-main-23\:/mipmap-hdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-hdpi_ic_launcher.png.flat
|
||||
com.example.app-main-22\:/mipmap-xxxhdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-xxxhdpi_ic_launcher.png.flat
|
||||
com.example.app-main-22\:/mipmap-mdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-mdpi_ic_launcher.png.flat
|
||||
com.example.app-main-22\:/mipmap-hdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-hdpi_ic_launcher_foreground.png.flat
|
||||
com.example.app-main-22\:/mipmap-hdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-hdpi_ic_launcher.png.flat
|
||||
com.example.app-main-23\:/mipmap-xxhdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-xxhdpi_ic_launcher.png.flat
|
||||
com.example.app-main-23\:/mipmap-xhdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-xhdpi_ic_launcher.png.flat
|
||||
com.example.app-main-23\:/mipmap-xxxhdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-xxxhdpi_ic_launcher.png.flat
|
||||
com.example.app-main-23\:/mipmap-xxxhdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-xxxhdpi_ic_launcher_foreground.png.flat
|
||||
com.example.app-main-23\:/mipmap-mdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-mdpi_ic_launcher_foreground.png.flat
|
||||
com.example.app-main-23\:/drawable/ic_launcher_foreground.xml=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/drawable_ic_launcher_foreground.xml.flat
|
||||
com.example.app-main-22\:/mipmap-anydpi-v26/ic_launcher.xml=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mipmap-anydpi-v26_ic_launcher.xml.flat
|
||||
#Sat Jun 13 17:10:52 CEST 2026
|
||||
com.example.app-main-23\:/drawable/ic_launcher_foreground.xml=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_ic_launcher_foreground.xml.flat
|
||||
com.example.app-main-23\:/layout/activity_splash.xml=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_splash.xml.flat
|
||||
com.example.app-main-23\:/mipmap-anydpi-v26/ic_launcher.xml=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mergeDebugResources/mipmap-anydpi-v26_ic_launcher.xml.flat
|
||||
com.example.app-main-23\:/mipmap-hdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mergeDebugResources/mipmap-hdpi_ic_launcher.png.flat
|
||||
com.example.app-main-23\:/mipmap-hdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mergeDebugResources/mipmap-hdpi_ic_launcher_foreground.png.flat
|
||||
com.example.app-main-23\:/mipmap-mdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mergeDebugResources/mipmap-mdpi_ic_launcher.png.flat
|
||||
com.example.app-main-23\:/mipmap-mdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mergeDebugResources/mipmap-mdpi_ic_launcher_foreground.png.flat
|
||||
com.example.app-main-23\:/mipmap-xhdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mergeDebugResources/mipmap-xhdpi_ic_launcher.png.flat
|
||||
com.example.app-main-23\:/mipmap-xhdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mergeDebugResources/mipmap-xhdpi_ic_launcher_foreground.png.flat
|
||||
com.example.app-main-23\:/mipmap-xxhdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mergeDebugResources/mipmap-xxhdpi_ic_launcher.png.flat
|
||||
com.example.app-main-23\:/mipmap-xxhdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mergeDebugResources/mipmap-xxhdpi_ic_launcher_foreground.png.flat
|
||||
com.example.app-main-23\:/mipmap-xxxhdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mergeDebugResources/mipmap-xxxhdpi_ic_launcher.png.flat
|
||||
com.example.app-main-23\:/mipmap-xxxhdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/merged_res/debug/mergeDebugResources/mipmap-xxxhdpi_ic_launcher_foreground.png.flat
|
||||
|
||||
File diff suppressed because one or more lines are too long
+14
-13
@@ -1,13 +1,14 @@
|
||||
#Wed May 27 13:49:11 CEST 2026
|
||||
com.example.app-main-5\:/mipmap-xxhdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/mipmap-xxhdpi-v4/ic_launcher.png
|
||||
com.example.app-main-5\:/mipmap-mdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/mipmap-mdpi-v4/ic_launcher.png
|
||||
com.example.app-main-5\:/mipmap-anydpi-v26/ic_launcher.xml=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/mipmap-anydpi-v26/ic_launcher.xml
|
||||
com.example.app-main-5\:/mipmap-hdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/mipmap-hdpi-v4/ic_launcher_foreground.png
|
||||
com.example.app-main-5\:/mipmap-xhdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/mipmap-xhdpi-v4/ic_launcher_foreground.png
|
||||
com.example.app-main-5\:/mipmap-xhdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/mipmap-xhdpi-v4/ic_launcher.png
|
||||
com.example.app-main-5\:/drawable/ic_launcher_foreground.xml=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/drawable/ic_launcher_foreground.xml
|
||||
com.example.app-main-5\:/mipmap-xxxhdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/mipmap-xxxhdpi-v4/ic_launcher.png
|
||||
com.example.app-main-5\:/mipmap-mdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/mipmap-mdpi-v4/ic_launcher_foreground.png
|
||||
com.example.app-main-5\:/mipmap-xxxhdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/mipmap-xxxhdpi-v4/ic_launcher_foreground.png
|
||||
com.example.app-main-5\:/mipmap-xxhdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/mipmap-xxhdpi-v4/ic_launcher_foreground.png
|
||||
com.example.app-main-5\:/mipmap-hdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/mipmap-hdpi-v4/ic_launcher.png
|
||||
#Sat Jun 13 17:10:52 CEST 2026
|
||||
com.example.app-main-5\:/drawable/ic_launcher_foreground.xml=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_launcher_foreground.xml
|
||||
com.example.app-main-5\:/layout/activity_splash.xml=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/activity_splash.xml
|
||||
com.example.app-main-5\:/mipmap-anydpi-v26/ic_launcher.xml=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/packageDebugResources/mipmap-anydpi-v26/ic_launcher.xml
|
||||
com.example.app-main-5\:/mipmap-hdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/packageDebugResources/mipmap-hdpi-v4/ic_launcher.png
|
||||
com.example.app-main-5\:/mipmap-hdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/packageDebugResources/mipmap-hdpi-v4/ic_launcher_foreground.png
|
||||
com.example.app-main-5\:/mipmap-mdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/packageDebugResources/mipmap-mdpi-v4/ic_launcher.png
|
||||
com.example.app-main-5\:/mipmap-mdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/packageDebugResources/mipmap-mdpi-v4/ic_launcher_foreground.png
|
||||
com.example.app-main-5\:/mipmap-xhdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/packageDebugResources/mipmap-xhdpi-v4/ic_launcher.png
|
||||
com.example.app-main-5\:/mipmap-xhdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/packageDebugResources/mipmap-xhdpi-v4/ic_launcher_foreground.png
|
||||
com.example.app-main-5\:/mipmap-xxhdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/packageDebugResources/mipmap-xxhdpi-v4/ic_launcher.png
|
||||
com.example.app-main-5\:/mipmap-xxhdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/packageDebugResources/mipmap-xxhdpi-v4/ic_launcher_foreground.png
|
||||
com.example.app-main-5\:/mipmap-xxxhdpi/ic_launcher.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/packageDebugResources/mipmap-xxxhdpi-v4/ic_launcher.png
|
||||
com.example.app-main-5\:/mipmap-xxxhdpi/ic_launcher_foreground.png=/Users/aln/Work/Matma/app/build/intermediates/packaged_res/debug/packageDebugResources/mipmap-xxxhdpi-v4/ic_launcher_foreground.png
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<merger version="3"><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/aln/Work/Matma/app/src/main/res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main" generated-set="main$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/aln/Work/Matma/app/src/main/res"><file path="/Users/aln/Work/Matma/app/src/main/res/values/styles.xml" qualifiers=""><style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
||||
<merger version="3"><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/aln/Work/Matma/app/src/main/res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main" generated-set="main$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~:!<dir>navigation"><source path="/Users/aln/Work/Matma/app/src/main/res"><file name="ic_launcher_foreground" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png" qualifiers="mdpi-v4" type="mipmap"/><file name="ic_launcher" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-mdpi/ic_launcher.png" qualifiers="mdpi-v4" type="mipmap"/><file name="ic_launcher_foreground" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png" qualifiers="hdpi-v4" type="mipmap"/><file name="ic_launcher" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-hdpi/ic_launcher.png" qualifiers="hdpi-v4" type="mipmap"/><file name="ic_launcher_foreground" path="/Users/aln/Work/Matma/app/src/main/res/drawable/ic_launcher_foreground.xml" qualifiers="" type="drawable"/><file name="ic_launcher_foreground" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png" qualifiers="xxxhdpi-v4" type="mipmap"/><file name="ic_launcher" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png" qualifiers="xxxhdpi-v4" type="mipmap"/><file name="activity_splash" path="/Users/aln/Work/Matma/app/src/main/res/layout/activity_splash.xml" qualifiers="" type="layout"/><file name="ic_launcher_foreground" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png" qualifiers="xxhdpi-v4" type="mipmap"/><file name="ic_launcher" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-xxhdpi/ic_launcher.png" qualifiers="xxhdpi-v4" type="mipmap"/><file path="/Users/aln/Work/Matma/app/src/main/res/values/colors.xml" qualifiers=""><color name="ic_launcher_background">#2196F3</color></file><file path="/Users/aln/Work/Matma/app/src/main/res/values/styles.xml" qualifiers=""><style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
||||
|
||||
</style></file><file path="/Users/aln/Work/Matma/app/src/main/res/values/strings.xml" qualifiers=""><string name="app_name">Mądrik</string></file><file name="ic_launcher_foreground" path="/Users/aln/Work/Matma/app/src/main/res/drawable/ic_launcher_foreground.xml" qualifiers="" type="drawable"/><file name="ic_launcher" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml" qualifiers="anydpi-v26" type="mipmap"/><file name="ic_launcher" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-mdpi/ic_launcher.png" qualifiers="mdpi-v4" type="mipmap"/><file path="/Users/aln/Work/Matma/app/src/main/res/values/colors.xml" qualifiers=""><color name="ic_launcher_background">#2196F3</color></file><file name="ic_launcher" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-hdpi/ic_launcher.png" qualifiers="hdpi-v4" type="mipmap"/><file name="ic_launcher_foreground" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png" qualifiers="hdpi-v4" type="mipmap"/><file name="ic_launcher_foreground" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png" qualifiers="mdpi-v4" type="mipmap"/><file name="ic_launcher" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-xhdpi/ic_launcher.png" qualifiers="xhdpi-v4" type="mipmap"/><file name="ic_launcher_foreground" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png" qualifiers="xhdpi-v4" type="mipmap"/><file name="ic_launcher" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-xxhdpi/ic_launcher.png" qualifiers="xxhdpi-v4" type="mipmap"/><file name="ic_launcher_foreground" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png" qualifiers="xxhdpi-v4" type="mipmap"/><file name="ic_launcher" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png" qualifiers="xxxhdpi-v4" type="mipmap"/><file name="ic_launcher_foreground" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png" qualifiers="xxxhdpi-v4" type="mipmap"/></source></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/aln/Work/Matma/app/src/debug/res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug" generated-set="debug$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/aln/Work/Matma/app/src/debug/res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="generated$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/aln/Work/Matma/app/build/generated/res/resValues/debug"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="generated" generated-set="generated$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/aln/Work/Matma/app/build/generated/res/resValues/debug"/></dataSet><mergedItems/></merger>
|
||||
</style></file><file path="/Users/aln/Work/Matma/app/src/main/res/values/strings.xml" qualifiers=""><string name="app_name">Mądrik</string></file><file name="ic_launcher_foreground" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png" qualifiers="xhdpi-v4" type="mipmap"/><file name="ic_launcher" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-xhdpi/ic_launcher.png" qualifiers="xhdpi-v4" type="mipmap"/><file name="ic_launcher" path="/Users/aln/Work/Matma/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml" qualifiers="anydpi-v26" type="mipmap"/></source></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/aln/Work/Matma/app/src/debug/res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug" generated-set="debug$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~:!<dir>navigation"><source path="/Users/aln/Work/Matma/app/src/debug/res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="generated$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/aln/Work/Matma/app/build/generated/res/resValues/debug"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="generated" generated-set="generated$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~:!<dir>navigation"><source path="/Users/aln/Work/Matma/app/build/generated/res/resValues/debug"/></dataSet><mergedItems/></merger>
|
||||
@@ -1,2 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/aln/Work/Matma/app/src/main/assets"><file name="czytanie.html" path="/Users/aln/Work/Matma/app/src/main/assets/czytanie.html"/><file name="index.html" path="/Users/aln/Work/Matma/app/src/main/assets/index.html"/><file name="styles.css" path="/Users/aln/Work/Matma/app/src/main/assets/styles.css"/><file name="css/styles.css" path="/Users/aln/Work/Matma/app/src/main/assets/css/styles.css"/><file name="css/fonts/inter.css" path="/Users/aln/Work/Matma/app/src/main/assets/css/fonts/inter.css"/><file name="js/mnozenie.js" path="/Users/aln/Work/Matma/app/src/main/assets/js/mnozenie.js"/><file name="js/dyktando.js" path="/Users/aln/Work/Matma/app/src/main/assets/js/dyktando.js"/><file name="js/version.js" path="/Users/aln/Work/Matma/app/src/main/assets/js/version.js"/><file name="js/components.js" path="/Users/aln/Work/Matma/app/src/main/assets/js/components.js"/><file name="js/czytanie.js" path="/Users/aln/Work/Matma/app/src/main/assets/js/czytanie.js"/><file name="js/nav.js" path="/Users/aln/Work/Matma/app/src/main/assets/js/nav.js"/><file name="js/app.js" path="/Users/aln/Work/Matma/app/src/main/assets/js/app.js"/><file name="js/dzielenie.js" path="/Users/aln/Work/Matma/app/src/main/assets/js/dzielenie.js"/><file name="mnozenie.html" path="/Users/aln/Work/Matma/app/src/main/assets/mnozenie.html"/><file name="dzielenie.html" path="/Users/aln/Work/Matma/app/src/main/assets/dzielenie.html"/><file name="components/progress-bar.html" path="/Users/aln/Work/Matma/app/src/main/assets/components/progress-bar.html"/><file name="components/footer.html" path="/Users/aln/Work/Matma/app/src/main/assets/components/footer.html"/><file name="components/header.html" path="/Users/aln/Work/Matma/app/src/main/assets/components/header.html"/><file name="json/dyktanda.json" path="/Users/aln/Work/Matma/app/src/main/assets/json/dyktanda.json"/><file name="dyktando.html" path="/Users/aln/Work/Matma/app/src/main/assets/dyktando.html"/><file name="testy.html" path="/Users/aln/Work/Matma/app/src/main/assets/testy.html"/><file name="fonts/Inter-Medium.ttf" path="/Users/aln/Work/Matma/app/src/main/assets/fonts/Inter-Medium.ttf"/><file name="fonts/Inter-Bold.ttf" path="/Users/aln/Work/Matma/app/src/main/assets/fonts/Inter-Bold.ttf"/><file name="fonts/Inter-Regular.ttf" path="/Users/aln/Work/Matma/app/src/main/assets/fonts/Inter-Regular.ttf"/><file name="fonts/Inter-ExtraBold.ttf" path="/Users/aln/Work/Matma/app/src/main/assets/fonts/Inter-ExtraBold.ttf"/></source></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/aln/Work/Matma/app/src/debug/assets"/></dataSet><dataSet config="generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/aln/Work/Matma/app/build/intermediates/shader_assets/debug/out"/></dataSet></merger>
|
||||
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/aln/Work/Matma/app/src/main/assets"><file name="czytanie.html" path="/Users/aln/Work/Matma/app/src/main/assets/czytanie.html"/><file name="index.html" path="/Users/aln/Work/Matma/app/src/main/assets/index.html"/><file name="styles.css" path="/Users/aln/Work/Matma/app/src/main/assets/styles.css"/><file name="css/styles.css" path="/Users/aln/Work/Matma/app/src/main/assets/css/styles.css"/><file name="css/fonts/inter.css" path="/Users/aln/Work/Matma/app/src/main/assets/css/fonts/inter.css"/><file name="js/mnozenie.js" path="/Users/aln/Work/Matma/app/src/main/assets/js/mnozenie.js"/><file name="js/dyktando.js" path="/Users/aln/Work/Matma/app/src/main/assets/js/dyktando.js"/><file name="js/version.js" path="/Users/aln/Work/Matma/app/src/main/assets/js/version.js"/><file name="js/components.js" path="/Users/aln/Work/Matma/app/src/main/assets/js/components.js"/><file name="js/czytanie.js" path="/Users/aln/Work/Matma/app/src/main/assets/js/czytanie.js"/><file name="js/nav.js" path="/Users/aln/Work/Matma/app/src/main/assets/js/nav.js"/><file name="js/app.js" path="/Users/aln/Work/Matma/app/src/main/assets/js/app.js"/><file name="js/dzielenie.js" path="/Users/aln/Work/Matma/app/src/main/assets/js/dzielenie.js"/><file name="mnozenie.html" path="/Users/aln/Work/Matma/app/src/main/assets/mnozenie.html"/><file name="dzielenie.html" path="/Users/aln/Work/Matma/app/src/main/assets/dzielenie.html"/><file name="components/progress-bar.html" path="/Users/aln/Work/Matma/app/src/main/assets/components/progress-bar.html"/><file name="components/footer.html" path="/Users/aln/Work/Matma/app/src/main/assets/components/footer.html"/><file name="components/header.html" path="/Users/aln/Work/Matma/app/src/main/assets/components/header.html"/><file name="json/dyktanda.json" path="/Users/aln/Work/Matma/app/src/main/assets/json/dyktanda.json"/><file name="dyktando.html" path="/Users/aln/Work/Matma/app/src/main/assets/dyktando.html"/><file name="testy.html" path="/Users/aln/Work/Matma/app/src/main/assets/testy.html"/><file name="fonts/Inter-Medium.ttf" path="/Users/aln/Work/Matma/app/src/main/assets/fonts/Inter-Medium.ttf"/><file name="fonts/Inter-Bold.ttf" path="/Users/aln/Work/Matma/app/src/main/assets/fonts/Inter-Bold.ttf"/><file name="fonts/Inter-Regular.ttf" path="/Users/aln/Work/Matma/app/src/main/assets/fonts/Inter-Regular.ttf"/><file name="fonts/Inter-ExtraBold.ttf" path="/Users/aln/Work/Matma/app/src/main/assets/fonts/Inter-ExtraBold.ttf"/></source></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/aln/Work/Matma/app/src/debug/assets"/></dataSet></merger>
|
||||
@@ -1,10 +1,13 @@
|
||||
#Wed May 27 14:04:13 CEST 2026
|
||||
base.2=/Users/aln/Work/Matma/app/build/intermediates/dex/debug/mergeProjectDexDebug/6/classes.dex
|
||||
path.2=6/classes.dex
|
||||
base.1=/Users/aln/Work/Matma/app/build/intermediates/dex/debug/mergeProjectDexDebug/0/classes.dex
|
||||
path.1=0/classes.dex
|
||||
#Sat Jun 13 17:25:09 CEST 2026
|
||||
base.0=/Users/aln/Work/Matma/app/build/intermediates/dex/debug/mergeExtDexDebug/classes.dex
|
||||
renamed.2=classes3.dex
|
||||
renamed.1=classes2.dex
|
||||
renamed.0=classes.dex
|
||||
base.1=/Users/aln/Work/Matma/app/build/intermediates/dex/debug/mergeProjectDexDebug/0/classes.dex
|
||||
base.2=/Users/aln/Work/Matma/app/build/intermediates/dex/debug/mergeProjectDexDebug/6/classes.dex
|
||||
base.3=/Users/aln/Work/Matma/app/build/intermediates/global_synthetics_dex/debug/generateDebugGlobalSynthetics/classes.dex
|
||||
path.0=classes.dex
|
||||
path.1=0/classes.dex
|
||||
path.2=6/classes.dex
|
||||
path.3=classes.dex
|
||||
renamed.0=classes.dex
|
||||
renamed.1=classes2.dex
|
||||
renamed.2=classes3.dex
|
||||
renamed.3=classes4.dex
|
||||
|
||||
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user