diff --git a/.github/utils/_get_password.py b/.github/utils/_get_password.py
index 33071b6c..9b120c17 100644
--- a/.github/utils/_get_password.py
+++ b/.github/utils/_get_password.py
@@ -23,8 +23,6 @@ def get_password(
auth_plugin="mysql_native_password",
)
- print(f"Generating passwords for version {version_name} ({version_code})")
-
password = base64.b64encode(secrets.token_bytes(16)).decode()
iv = secrets.token_bytes(16)
diff --git a/.github/utils/_utils.py b/.github/utils/_utils.py
index 09b59f4a..0ad46d54 100644
--- a/.github/utils/_utils.py
+++ b/.github/utils/_utils.py
@@ -102,7 +102,9 @@ def get_commit_log(project_dir: str, format: str, max_lines: int = None) -> str:
)
log = subprocess.run(
- args=f"git log {last_tag}..HEAD --format=%an%x00%at%x00%h%x00%s%x00%D".split(" "),
+ args=f"git log {last_tag}..HEAD --format=%an%x00%at%x00%h%x00%s%x00%D".split(
+ " "
+ ),
cwd=project_dir,
stdout=subprocess.PIPE,
)
diff --git a/.github/utils/bump_nightly.py b/.github/utils/bump_nightly.py
index 88b4798c..3fb74fa4 100644
--- a/.github/utils/bump_nightly.py
+++ b/.github/utils/bump_nightly.py
@@ -1,11 +1,8 @@
-import json
import os
import re
import sys
from datetime import datetime, timedelta
-import requests
-
from _utils import (
get_commit_log,
get_project_dir,
@@ -25,17 +22,6 @@ if __name__ == "__main__":
print("Missing GitHub environment variables.")
exit(-1)
- with requests.get(
- f"https://api.github.com/repos/{repo}/actions/runs?per_page=5&status=success"
- ) as r:
- data = json.loads(r.text)
- runs = [run for run in data["workflow_runs"] if run["head_sha"] == sha]
- if runs:
- print("::set-output name=hasNewChanges::false")
- exit(0)
-
- print("::set-output name=hasNewChanges::true")
-
project_dir = get_project_dir()
(version_code, version_name) = read_gradle_version(project_dir)
@@ -48,8 +34,8 @@ if __name__ == "__main__":
date -= timedelta(days=1)
version_name += "+nightly." + date.strftime("%Y%m%d")
- print("::set-output name=appVersionName::" + version_name)
- print("::set-output name=appVersionCode::" + str(version_code))
+ print("appVersionName=" + version_name)
+ print("appVersionCode=" + str(version_code))
write_gradle_version(project_dir, version_code, version_name)
diff --git a/.github/utils/check_nightly.py b/.github/utils/check_nightly.py
new file mode 100644
index 00000000..bf8b56cf
--- /dev/null
+++ b/.github/utils/check_nightly.py
@@ -0,0 +1,23 @@
+import json
+import os
+
+import requests
+
+if __name__ == "__main__":
+ repo = os.getenv("GITHUB_REPOSITORY")
+ sha = os.getenv("GITHUB_SHA")
+
+ if not repo or not sha:
+ print("Missing GitHub environment variables.")
+ exit(-1)
+
+ with requests.get(
+ f"https://api.github.com/repos/{repo}/actions/runs?per_page=5&status=success"
+ ) as r:
+ data = json.loads(r.text)
+ runs = [run for run in data["workflow_runs"] if run["head_sha"] == sha]
+ if runs:
+ print("hasNewChanges=false")
+ exit(0)
+
+ print("hasNewChanges=true")
diff --git a/.github/utils/extract_changelogs.py b/.github/utils/extract_changelogs.py
index 25d346c1..544df813 100644
--- a/.github/utils/extract_changelogs.py
+++ b/.github/utils/extract_changelogs.py
@@ -12,24 +12,24 @@ if __name__ == "__main__":
(version_code, version_name) = read_gradle_version(project_dir)
- print("::set-output name=appVersionName::" + version_name)
- print("::set-output name=appVersionCode::" + str(version_code))
+ print("appVersionName=" + version_name)
+ print("appVersionCode=" + str(version_code))
dir = f"{project_dir}/app/release/whatsnew-{version_name}/"
os.makedirs(dir, exist_ok=True)
- print("::set-output name=changelogDir::" + dir)
+ print("changelogDir=" + dir)
(title, changelog) = get_changelog(project_dir, format="plain")
# plain text changelog - Firebase App Distribution
- with open(dir + "whatsnew-titled.txt", "w", encoding="utf-8") as f:
+ with open(dir + "whatsnew_titled.txt", "w", encoding="utf-8") as f:
f.write(title)
f.write("\n")
f.write(changelog)
- print("::set-output name=changelogPlainTitledFile::" + dir + "whatsnew-titled.txt")
+ print("changelogPlainTitledFile=" + dir + "whatsnew_titled.txt")
- print("::set-output name=changelogTitle::" + title)
+ print("changelogTitle=" + title)
# plain text changelog, max 500 chars - Google Play
with open(dir + "whatsnew-pl-PL", "w", encoding="utf-8") as f:
@@ -41,32 +41,31 @@ if __name__ == "__main__":
changelog = changelog.strip()
f.write(changelog)
- print("::set-output name=changelogPlainFile::" + dir + "whatsnew-pl-PL")
+ print("changelogPlainFile=" + dir + "whatsnew-pl-PL")
# markdown changelog - Discord webhook
(_, changelog) = get_changelog(project_dir, format="markdown")
with open(dir + "whatsnew.md", "w", encoding="utf-8") as f:
f.write(changelog)
- print("::set-output name=changelogMarkdownFile::" + dir + "whatsnew.md")
+ print("changelogMarkdownFile=" + dir + "whatsnew.md")
# html changelog - version info in DB
(_, changelog) = get_changelog(project_dir, format="html")
with open(dir + "whatsnew.html", "w", encoding="utf-8") as f:
f.write(changelog)
- print("::set-output name=changelogHtmlFile::" + dir + "whatsnew.html")
-
+ print("changelogHtmlFile=" + dir + "whatsnew.html")
changelog = get_commit_log(project_dir, format="plain", max_lines=10)
with open(dir + "commit_log.txt", "w", encoding="utf-8") as f:
f.write(changelog)
- print("::set-output name=commitLogPlainFile::" + dir + "commit_log.txt")
+ print("commitLogPlainFile=" + dir + "commit_log.txt")
changelog = get_commit_log(project_dir, format="markdown", max_lines=10)
with open(dir + "commit_log.md", "w", encoding="utf-8") as f:
f.write(changelog)
- print("::set-output name=commitLogMarkdownFile::" + dir + "commit_log.md")
+ print("commitLogMarkdownFile=" + dir + "commit_log.md")
changelog = get_commit_log(project_dir, format="html", max_lines=10)
with open(dir + "commit_log.html", "w", encoding="utf-8") as f:
f.write(changelog)
- print("::set-output name=commitLogHtmlFile::" + dir + "commit_log.html")
+ print("commitLogHtmlFile=" + dir + "commit_log.html")
diff --git a/.github/utils/rename_artifacts.py b/.github/utils/find_artifacts.py
similarity index 73%
rename from .github/utils/rename_artifacts.py
rename to .github/utils/find_artifacts.py
index 4eeabfaf..286836ae 100644
--- a/.github/utils/rename_artifacts.py
+++ b/.github/utils/find_artifacts.py
@@ -13,7 +13,7 @@ if __name__ == "__main__":
files = glob.glob(f"{project_dir}/app/release/*.*")
for file in files:
- file_relative = file.replace(os.getenv("GITHUB_WORKSPACE") + "/", "")
+ file_relative = file.replace(project_dir + "/", "")
if "-aligned.apk" in file:
os.unlink(file)
elif "-signed.apk" in file:
@@ -22,5 +22,5 @@ if __name__ == "__main__":
os.unlink(new_file)
os.rename(file, new_file)
elif ".apk" in file or ".aab" in file:
- print("::set-output name=signedReleaseFile::" + file)
- print("::set-output name=signedReleaseFileRelative::" + file_relative)
+ print("signedReleaseFile=" + file)
+ print("signedReleaseFileRelative=" + file_relative)
diff --git a/.github/utils/save_version.py b/.github/utils/save_version.py
index 01de17a7..a0eacb49 100644
--- a/.github/utils/save_version.py
+++ b/.github/utils/save_version.py
@@ -64,7 +64,14 @@ def save_version(
if build_type in ["nightly", "daily"]:
download_url = apk_server_nightly + apk_name if apk_name else None
else:
- download_url = apk_server_release + apk_name if apk_name else None
+ # download_url = apk_server_release + apk_name if apk_name else None
+ download_url = (
+ f"https://github.com/szkolny-eu/szkolny-android/releases/download/v{version_name}/{apk_name}"
+ if apk_name
+ else None
+ )
+ if download_url:
+ print("downloadUrl=" + download_url)
cols = [
"versionCode",
@@ -119,4 +126,12 @@ if __name__ == "__main__":
APK_SERVER_RELEASE = os.getenv("APK_SERVER_RELEASE")
APK_SERVER_NIGHTLY = os.getenv("APK_SERVER_NIGHTLY")
- save_version(project_dir, DB_HOST, DB_USER, DB_PASS, DB_NAME, APK_SERVER_RELEASE, APK_SERVER_NIGHTLY)
+ save_version(
+ project_dir,
+ DB_HOST,
+ DB_USER,
+ DB_PASS,
+ DB_NAME,
+ APK_SERVER_RELEASE,
+ APK_SERVER_NIGHTLY,
+ )
diff --git a/.github/utils/sign.py b/.github/utils/sign.py
index 026d819b..bdf417d9 100644
--- a/.github/utils/sign.py
+++ b/.github/utils/sign.py
@@ -31,8 +31,6 @@ def sign(
SIGNING_FORMAT = "$param1.{}.$param2"
CPP_FORMAT = "/*{}*/\nstatic toys AES_IV[16] = {{\n\t{} }};"
- print(f"Writing passwords for version {version_name} ({version_code})")
-
iv_hex = " ".join(["{:02x}".format(x) for x in iv])
iv_cpp = ", ".join(["0x{:02x}".format(x) for x in iv])
@@ -71,8 +69,8 @@ if __name__ == "__main__":
version_name, version_code, DB_HOST, DB_USER, DB_PASS, DB_NAME
)
- print("::set-output name=appVersionName::" + version_name)
- print("::set-output name=appVersionCode::" + str(version_code))
+ print("appVersionName=" + version_name)
+ print("appVersionCode=" + str(version_code))
sign(
project_dir,
diff --git a/.github/utils/webhook_discord.py b/.github/utils/webhook_discord.py
index 3c1404ae..cb1e6a0b 100644
--- a/.github/utils/webhook_discord.py
+++ b/.github/utils/webhook_discord.py
@@ -11,8 +11,7 @@ from _utils import get_changelog, get_commit_log, get_project_dir, read_gradle_v
def post_webhook(
project_dir: str,
apk_file: str,
- apk_server_release: str,
- apk_server_nightly: str,
+ download_url: str,
webhook_release: str,
webhook_testing: str,
):
@@ -25,12 +24,6 @@ def post_webhook(
testing = ["dev", "beta", "nightly", "daily"]
testing = build_type in testing
- apk_name = os.path.basename(apk_file)
- if build_type in ["nightly", "daily"]:
- download_url = apk_server_nightly + apk_name
- else:
- download_url = apk_server_release + apk_name
-
if testing:
build_date = int(os.stat(apk_file).st_mtime)
if build_date:
@@ -48,13 +41,17 @@ def post_webhook(
requests.post(url=webhook_testing, json=webhook)
else:
changelog = get_changelog(project_dir, format="markdown")
- webhook = get_webhook_release(changelog, download_url)
+ webhook = get_webhook_release(version_name, changelog, download_url)
requests.post(url=webhook_release, json=webhook)
-def get_webhook_release(changelog: str, download_url: str):
+def get_webhook_release(version_name: str, changelog: str, download_url: str):
(title, content) = changelog
- return {"content": f"__**{title}**__\n{content}\n{download_url}"}
+ return {
+ "content": (
+ f"__**{title}**__\n{content}\n[Szkolny.eu {version_name}]({download_url})"
+ ),
+ }
def get_webhook_testing(
@@ -73,9 +70,11 @@ def get_webhook_testing(
"fields": [
{
"name": f"Wersja `{version_name}`",
- "value": f"[Pobierz .APK]({download_url})"
- if download_url
- else "*Pobieranie niedostępne*",
+ "value": (
+ f"[Pobierz .APK]({download_url})"
+ if download_url
+ else "*Pobieranie niedostępne*"
+ ),
"inline": False,
},
{
@@ -103,16 +102,14 @@ if __name__ == "__main__":
load_dotenv()
APK_FILE = os.getenv("APK_FILE")
- APK_SERVER_RELEASE = os.getenv("APK_SERVER_RELEASE")
- APK_SERVER_NIGHTLY = os.getenv("APK_SERVER_NIGHTLY")
+ DOWNLOAD_URL = os.getenv("DOWNLOAD_URL")
WEBHOOK_RELEASE = os.getenv("WEBHOOK_RELEASE")
WEBHOOK_TESTING = os.getenv("WEBHOOK_TESTING")
post_webhook(
project_dir,
APK_FILE,
- APK_SERVER_RELEASE,
- APK_SERVER_NIGHTLY,
+ DOWNLOAD_URL,
WEBHOOK_RELEASE,
WEBHOOK_TESTING,
)
diff --git a/.github/workflows/_build.yml b/.github/workflows/_build.yml
new file mode 100644
index 00000000..c43a4972
--- /dev/null
+++ b/.github/workflows/_build.yml
@@ -0,0 +1,195 @@
+name: "[reusable] Szkolny.eu Build"
+
+on:
+ workflow_call:
+ inputs:
+ nightly:
+ type: boolean
+ default: false
+ build-apk:
+ type: boolean
+ default: false
+ build-aab:
+ type: boolean
+ default: false
+
+ release-ssh:
+ type: boolean
+ default: false
+ release-github:
+ type: boolean
+ default: false
+ release-firebase:
+ type: boolean
+ default: false
+ release-google-play:
+ type: boolean
+ default: false
+ release-discord:
+ type: boolean
+ default: false
+ secrets:
+ APK_SERVER_NIGHTLY:
+ APK_SERVER_RELEASE:
+ DB_HOST:
+ DB_NAME:
+ DB_PASS:
+ DB_USER:
+ FIREBASE_APP_ID:
+ FIREBASE_GROUPS_NIGHTLY:
+ FIREBASE_GROUPS_RELEASE:
+ FIREBASE_SERVICE_ACCOUNT_JSON:
+ KEY_ALIAS_PASSWORD:
+ KEY_ALIAS:
+ KEY_STORE_PASSWORD:
+ KEY_STORE:
+ PLAY_RELEASE_TRACK:
+ PLAY_SERVICE_ACCOUNT_JSON:
+ SSH_IP:
+ SSH_KEY:
+ SSH_PATH_NIGHTLY:
+ SSH_PATH_RELEASE:
+ SSH_USERNAME:
+ WEBHOOK_RELEASE:
+ WEBHOOK_TESTING:
+
+permissions:
+ contents: write
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+ clean: false
+ - name: Setup JDK 17
+ uses: actions/setup-java@v3
+ with:
+ distribution: "temurin"
+ java-version: "17"
+ - name: Setup Python
+ uses: actions/setup-python@v4
+ - name: Install Python packages
+ uses: BSFishy/pip-action@v1
+ with:
+ packages: |
+ python-dotenv
+ pycryptodome
+ mysql-connector-python
+ requests
+ - name: Setup Gradle
+ uses: gradle/actions/setup-gradle@v3
+
+ - name: Bump nightly version
+ if: ${{ inputs.nightly }}
+ run: python $GITHUB_WORKSPACE/.github/utils/bump_nightly.py $GITHUB_WORKSPACE >> $GITHUB_OUTPUT
+ - name: Write signing passwords and keystore
+ env:
+ DB_HOST: ${{ secrets.DB_HOST }}
+ DB_USER: ${{ secrets.DB_USER }}
+ DB_PASS: ${{ secrets.DB_PASS }}
+ DB_NAME: ${{ secrets.DB_NAME }}
+ KEY_STORE: ${{ secrets.KEY_STORE }}
+ run: |
+ python $GITHUB_WORKSPACE/.github/utils/sign.py $GITHUB_WORKSPACE commit >> $GITHUB_OUTPUT
+ echo $KEY_STORE | base64 --decode > keystore.jks
+ - name: Clean build artifacts
+ run: |
+ rm -rf app/release/*
+ rm -rf app/build/outputs/apk/*
+ rm -rf app/build/outputs/bundle/*
+
+ - name: Build app with Gradle
+ if: ${{ inputs.build-apk || inputs.build-aab }}
+ run: |
+ chmod +x ./gradlew
+ ./gradlew \
+ ${{ inputs.build-apk && 'assembleOfficialRelease' || '' }} \
+ ${{ inputs.build-aab && 'bundlePlayRelease' || '' }} \
+ -P android.injected.signing.store.file=${{ github.workspace }}/keystore.jks \
+ -P android.injected.signing.store.password=${{ secrets.KEY_STORE_PASSWORD }} \
+ -P android.injected.signing.key.alias=${{ secrets.KEY_ALIAS }} \
+ -P android.injected.signing.key.password=${{ secrets.KEY_ALIAS_PASSWORD }}
+
+ - name: Upload release to server
+ if: ${{ inputs.release-ssh }}
+ uses: easingthemes/ssh-deploy@v2.1.6
+ env:
+ REMOTE_HOST: ${{ secrets.SSH_IP }}
+ REMOTE_USER: ${{ secrets.SSH_USERNAME }}
+ SSH_PRIVATE_KEY: ${{ secrets.SSH_KEY }}
+ SOURCE: app/release/
+ TARGET: ${{ inputs.nightly && secrets.SSH_PATH_NIGHTLY || secrets.SSH_PATH_RELEASE }}
+
+ - name: Find signed artifacts
+ id: artifacts
+ run: python $GITHUB_WORKSPACE/.github/utils/find_artifacts.py $GITHUB_WORKSPACE >> $GITHUB_OUTPUT
+ - name: Extract release changelogs
+ id: changelog
+ run: python $GITHUB_WORKSPACE/.github/utils/extract_changelogs.py $GITHUB_WORKSPACE >> $GITHUB_OUTPUT
+ - name: Save version to database
+ id: save
+ env:
+ DB_HOST: ${{ secrets.DB_HOST }}
+ DB_USER: ${{ secrets.DB_USER }}
+ DB_PASS: ${{ secrets.DB_PASS }}
+ DB_NAME: ${{ secrets.DB_NAME }}
+ APK_SERVER_RELEASE: ${{ secrets.APK_SERVER_RELEASE }}
+ APK_SERVER_NIGHTLY: ${{ secrets.APK_SERVER_NIGHTLY }}
+ run: python $GITHUB_WORKSPACE/.github/utils/save_version.py $GITHUB_WORKSPACE >> $GITHUB_OUTPUT
+
+ - name: Release on GitHub
+ if: ${{ inputs.release-github }}
+ uses: softprops/action-gh-release@v1
+ with:
+ name: ${{ steps.changelog.outputs.changelogTitle }}
+ body_path: ${{ steps.changelog.outputs.changelogMarkdownFile }}
+ files: ${{ steps.artifacts.outputs.signedReleaseFile }}
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Distribute to App Distribution
+ if: ${{ inputs.release-firebase }}
+ uses: wzieba/Firebase-Distribution-Github-Action@v1
+ with:
+ appId: ${{ secrets.FIREBASE_APP_ID }}
+ serviceCredentialsFileContent: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_JSON }}
+ file: ${{ steps.artifacts.outputs.signedReleaseFile }}
+ groups: ${{ inputs.nightly && secrets.FIREBASE_GROUPS_NIGHTLY || secrets.FIREBASE_GROUPS_RELEASE }}
+ releaseNotesFile: ${{ inputs.nightly && steps.changelog.outputs.commitLogPlainFile || steps.changelog.outputs.changelogPlainTitledFile }}
+
+ - name: Publish AAB to Google Play
+ if: ${{ inputs.release-google-play }}
+ uses: r0adkll/upload-google-play@v1
+ with:
+ serviceAccountJsonPlainText: ${{ secrets.PLAY_SERVICE_ACCOUNT_JSON }}
+ packageName: pl.szczodrzynski.edziennik
+ releaseFiles: ${{ steps.artifacts.outputs.signedReleaseFile }}
+ releaseName: ${{ steps.changelog.outputs.appVersionName }}
+ track: ${{ secrets.PLAY_RELEASE_TRACK }}
+ whatsNewDirectory: ${{ steps.changelog.outputs.changelogDir }}
+ status: completed
+
+ - name: Post Discord webhook
+ if: ${{ inputs.release-discord }}
+ env:
+ APK_FILE: ${{ steps.artifacts.outputs.signedReleaseFile }}
+ DOWNLOAD_URL: ${{ steps.save.outputs.downloadUrl }}
+ WEBHOOK_RELEASE: ${{ secrets.WEBHOOK_RELEASE }}
+ WEBHOOK_TESTING: ${{ secrets.WEBHOOK_TESTING }}
+ run: python $GITHUB_WORKSPACE/.github/utils/webhook_discord.py $GITHUB_WORKSPACE >> $GITHUB_OUTPUT
+
+ - name: Upload workflow artifact
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: ${{ steps.changelog.outputs.appVersionName }}
+ path: |
+ app/release/whatsnew*/
+ app/release/*.apk
+ app/release/*.aab
+ app/release/*.json
+ app/release/*.txt
diff --git a/.github/workflows/build-nightly-apk.yml b/.github/workflows/build-nightly-apk.yml
deleted file mode 100644
index 0951149e..00000000
--- a/.github/workflows/build-nightly-apk.yml
+++ /dev/null
@@ -1,154 +0,0 @@
-name: Nightly build
-
-on:
- schedule:
- # 23:30 UTC, 0:30 or 1:30 CET/CEST
- - cron: "30 23 * * *"
- workflow_dispatch:
-
-jobs:
- prepare:
- name: Prepare build environment
- runs-on: self-hosted
- outputs:
- hasNewChanges: ${{ steps.nightly.outputs.hasNewChanges }}
- steps:
- - name: Checkout repository
- uses: actions/checkout@v2
- with:
- fetch-depth: 0
- clean: false
- - name: Set executable permissions to gradlew
- run: chmod +x ./gradlew
- - name: Setup Python
- uses: actions/setup-python@v2
- - name: Install packages
- uses: BSFishy/pip-action@v1
- with:
- packages: |
- python-dotenv
- pycryptodome
- mysql-connector-python
- requests
- - name: Bump nightly version
- id: nightly
- run: python $GITHUB_WORKSPACE/.github/utils/bump_nightly.py $GITHUB_WORKSPACE
- - name: Write signing passwords
- if: steps.nightly.outputs.hasNewChanges
- env:
- DB_HOST: ${{ secrets.DB_HOST }}
- DB_USER: ${{ secrets.DB_USER }}
- DB_PASS: ${{ secrets.DB_PASS }}
- DB_NAME: ${{ secrets.DB_NAME }}
- run: python $GITHUB_WORKSPACE/.github/utils/sign.py $GITHUB_WORKSPACE commit
- build:
- name: Build APK
- runs-on: self-hosted
- needs:
- - prepare
- if: ${{ needs.prepare.outputs.hasNewChanges == 'true' }}
- outputs:
- androidHome: ${{ env.ANDROID_HOME }}
- androidSdkRoot: ${{ env.ANDROID_SDK_ROOT }}
- steps:
- - name: Setup JDK 11
- uses: actions/setup-java@v2
- with:
- distribution: 'temurin'
- java-version: '11'
- - name: Setup Android SDK
- uses: android-actions/setup-android@v2
- - name: Clean build artifacts
- run: |
- rm -rf app/release/*
- rm -rf app/build/outputs/apk/*
- rm -rf app/build/outputs/bundle/*
- - name: Assemble official release with Gradle
- uses: gradle/gradle-build-action@v2
- with:
- arguments: assembleOfficialRelease
- sign:
- name: Sign APK
- runs-on: self-hosted
- needs:
- - build
- outputs:
- signedReleaseFile: ${{ steps.artifacts.outputs.signedReleaseFile }}
- signedReleaseFileRelative: ${{ steps.artifacts.outputs.signedReleaseFileRelative }}
- steps:
- - name: Sign build artifacts
- id: sign_app
- uses: r0adkll/sign-android-release@v1
- with:
- releaseDirectory: app/release
- signingKeyBase64: ${{ secrets.KEY_STORE }}
- alias: ${{ secrets.KEY_ALIAS }}
- keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
- keyPassword: ${{ secrets.KEY_ALIAS_PASSWORD }}
- env:
- ANDROID_HOME: ${{ needs.build.outputs.androidHome }}
- ANDROID_SDK_ROOT: ${{ needs.build.outputs.androidSdkRoot }}
- BUILD_TOOLS_VERSION: "30.0.2"
- - name: Rename signed artifacts
- id: artifacts
- run: python $GITHUB_WORKSPACE/.github/utils/rename_artifacts.py $GITHUB_WORKSPACE
- publish:
- name: Publish APK
- runs-on: self-hosted
- needs:
- - sign
- steps:
- - name: Setup Python
- uses: actions/setup-python@v2
-
- - name: Extract changelogs
- id: changelog
- run: python $GITHUB_WORKSPACE/.github/utils/extract_changelogs.py $GITHUB_WORKSPACE
-
- - name: Upload APK to SFTP
- uses: easingthemes/ssh-deploy@v2.1.6
- env:
- REMOTE_HOST: ${{ secrets.SSH_IP }}
- REMOTE_USER: ${{ secrets.SSH_USERNAME }}
- SSH_PRIVATE_KEY: ${{ secrets.SSH_KEY }}
- SOURCE: ${{ needs.sign.outputs.signedReleaseFileRelative }}
- TARGET: ${{ secrets.SSH_PATH_NIGHTLY }}
- - name: Save version metadata
- env:
- DB_HOST: ${{ secrets.DB_HOST }}
- DB_USER: ${{ secrets.DB_USER }}
- DB_PASS: ${{ secrets.DB_PASS }}
- DB_NAME: ${{ secrets.DB_NAME }}
- APK_SERVER_RELEASE: ${{ secrets.APK_SERVER_RELEASE }}
- APK_SERVER_NIGHTLY: ${{ secrets.APK_SERVER_NIGHTLY }}
- run: python $GITHUB_WORKSPACE/.github/utils/save_version.py $GITHUB_WORKSPACE
-
- - name: Distribute to App Distribution
- uses: wzieba/Firebase-Distribution-Github-Action@v1
- with:
- appId: ${{ secrets.FIREBASE_APP_ID }}
- token: ${{ secrets.FIREBASE_TOKEN }}
- groups: ${{ secrets.FIREBASE_GROUPS_NIGHTLY }}
- file: ${{ needs.sign.outputs.signedReleaseFile }}
- releaseNotesFile: ${{ steps.changelog.outputs.commitLogPlainFile }}
-
- - name: Post Discord webhook
- env:
- APK_FILE: ${{ needs.sign.outputs.signedReleaseFile }}
- APK_SERVER_RELEASE: ${{ secrets.APK_SERVER_RELEASE }}
- APK_SERVER_NIGHTLY: ${{ secrets.APK_SERVER_NIGHTLY }}
- WEBHOOK_RELEASE: ${{ secrets.WEBHOOK_RELEASE }}
- WEBHOOK_TESTING: ${{ secrets.WEBHOOK_TESTING }}
- run: python $GITHUB_WORKSPACE/.github/utils/webhook_discord.py $GITHUB_WORKSPACE
-
- - name: Upload workflow artifact
- uses: actions/upload-artifact@v2
- if: true
- with:
- name: ${{ steps.changelog.outputs.appVersionName }}
- path: |
- app/release/whatsnew*/
- app/release/*.apk
- app/release/*.aab
- app/release/*.json
- app/release/*.txt
diff --git a/.github/workflows/build-release-aab-play.yml b/.github/workflows/build-release-aab-play.yml
deleted file mode 100644
index 95fec5cb..00000000
--- a/.github/workflows/build-release-aab-play.yml
+++ /dev/null
@@ -1,131 +0,0 @@
-name: Release build - Google Play [AAB]
-
-on:
- push:
- branches:
- - "master"
-
-jobs:
- prepare:
- name: Prepare build environment
- runs-on: self-hosted
- steps:
- - name: Checkout repository
- uses: actions/checkout@v2
- with:
- fetch-depth: 0
- clean: false
- - name: Set executable permissions to gradlew
- run: chmod +x ./gradlew
- - name: Setup Python
- uses: actions/setup-python@v2
- - name: Install packages
- uses: BSFishy/pip-action@v1
- with:
- packages: |
- python-dotenv
- pycryptodome
- mysql-connector-python
- requests
- - name: Write signing passwords
- env:
- DB_HOST: ${{ secrets.DB_HOST }}
- DB_USER: ${{ secrets.DB_USER }}
- DB_PASS: ${{ secrets.DB_PASS }}
- DB_NAME: ${{ secrets.DB_NAME }}
- run: python $GITHUB_WORKSPACE/.github/utils/sign.py $GITHUB_WORKSPACE commit
- build:
- name: Build App Bundle
- runs-on: self-hosted
- needs:
- - prepare
- outputs:
- androidHome: ${{ env.ANDROID_HOME }}
- androidSdkRoot: ${{ env.ANDROID_SDK_ROOT }}
- steps:
- - name: Setup JDK 11
- uses: actions/setup-java@v2
- with:
- distribution: 'temurin'
- java-version: '11'
- - name: Setup Android SDK
- uses: android-actions/setup-android@v2
- - name: Clean build artifacts
- run: |
- rm -rf app/release/*
- rm -rf app/build/outputs/apk/*
- rm -rf app/build/outputs/bundle/*
- - name: Bundle play release with Gradle
- uses: gradle/gradle-build-action@v2
- with:
- arguments: bundlePlayRelease
- sign:
- name: Sign App Bundle
- runs-on: self-hosted
- needs:
- - build
- outputs:
- signedReleaseFile: ${{ steps.artifacts.outputs.signedReleaseFile }}
- signedReleaseFileRelative: ${{ steps.artifacts.outputs.signedReleaseFileRelative }}
- steps:
- - name: Sign build artifacts
- id: sign_app
- uses: r0adkll/sign-android-release@v1
- with:
- releaseDirectory: app/release
- signingKeyBase64: ${{ secrets.KEY_STORE }}
- alias: ${{ secrets.KEY_ALIAS }}
- keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
- keyPassword: ${{ secrets.KEY_ALIAS_PASSWORD }}
- env:
- ANDROID_HOME: ${{ needs.build.outputs.androidHome }}
- ANDROID_SDK_ROOT: ${{ needs.build.outputs.androidSdkRoot }}
- BUILD_TOOLS_VERSION: "30.0.2"
- - name: Rename signed artifacts
- id: artifacts
- run: python $GITHUB_WORKSPACE/.github/utils/rename_artifacts.py $GITHUB_WORKSPACE
- publish:
- name: Publish App Bundle
- runs-on: self-hosted
- needs:
- - sign
- steps:
- - name: Setup Python
- uses: actions/setup-python@v2
-
- - name: Extract changelogs
- id: changelog
- run: python $GITHUB_WORKSPACE/.github/utils/extract_changelogs.py $GITHUB_WORKSPACE
-
- - name: Save version metadata
- env:
- DB_HOST: ${{ secrets.DB_HOST }}
- DB_USER: ${{ secrets.DB_USER }}
- DB_PASS: ${{ secrets.DB_PASS }}
- DB_NAME: ${{ secrets.DB_NAME }}
- APK_SERVER_RELEASE: ${{ secrets.APK_SERVER_RELEASE }}
- APK_SERVER_NIGHTLY: ${{ secrets.APK_SERVER_NIGHTLY }}
- run: python $GITHUB_WORKSPACE/.github/utils/save_version.py $GITHUB_WORKSPACE
-
- - name: Publish AAB to Google Play
- uses: r0adkll/upload-google-play@v1
- if: ${{ endsWith(needs.sign.outputs.signedReleaseFile, '.aab') }}
- with:
- serviceAccountJsonPlainText: ${{ secrets.PLAY_SERVICE_ACCOUNT_JSON }}
- packageName: pl.szczodrzynski.edziennik
- releaseFile: ${{ needs.sign.outputs.signedReleaseFile }}
- releaseName: ${{ steps.changelog.outputs.appVersionName }}
- track: ${{ secrets.PLAY_RELEASE_TRACK }}
- whatsNewDirectory: ${{ steps.changelog.outputs.changelogDir }}
-
- - name: Upload workflow artifact
- uses: actions/upload-artifact@v2
- if: always()
- with:
- name: ${{ steps.changelog.outputs.appVersionName }}
- path: |
- app/release/whatsnew*/
- app/release/*.apk
- app/release/*.aab
- app/release/*.json
- app/release/*.txt
diff --git a/.github/workflows/build-release-apk.yml b/.github/workflows/build-release-apk.yml
deleted file mode 100644
index 5ca055b9..00000000
--- a/.github/workflows/build-release-apk.yml
+++ /dev/null
@@ -1,154 +0,0 @@
-name: Release build - official
-
-on:
- push:
- tags:
- - "*"
-
-jobs:
- prepare:
- name: Prepare build environment
- runs-on: self-hosted
- steps:
- - name: Checkout repository
- uses: actions/checkout@v2
- with:
- fetch-depth: 0
- clean: false
- - name: Set executable permissions to gradlew
- run: chmod +x ./gradlew
- - name: Setup Python
- uses: actions/setup-python@v2
- - name: Install packages
- uses: BSFishy/pip-action@v1
- with:
- packages: |
- python-dotenv
- pycryptodome
- mysql-connector-python
- requests
- - name: Write signing passwords
- env:
- DB_HOST: ${{ secrets.DB_HOST }}
- DB_USER: ${{ secrets.DB_USER }}
- DB_PASS: ${{ secrets.DB_PASS }}
- DB_NAME: ${{ secrets.DB_NAME }}
- run: python $GITHUB_WORKSPACE/.github/utils/sign.py $GITHUB_WORKSPACE commit
- build:
- name: Build APK
- runs-on: self-hosted
- needs:
- - prepare
- outputs:
- androidHome: ${{ env.ANDROID_HOME }}
- androidSdkRoot: ${{ env.ANDROID_SDK_ROOT }}
- steps:
- - name: Setup JDK 11
- uses: actions/setup-java@v2
- with:
- distribution: 'temurin'
- java-version: '11'
- - name: Setup Android SDK
- uses: android-actions/setup-android@v2
- - name: Clean build artifacts
- run: |
- rm -rf app/release/*
- rm -rf app/build/outputs/apk/*
- rm -rf app/build/outputs/bundle/*
- - name: Assemble official release with Gradle
- uses: gradle/gradle-build-action@v2
- with:
- arguments: assembleOfficialRelease
- sign:
- name: Sign APK
- runs-on: self-hosted
- needs:
- - build
- outputs:
- signedReleaseFile: ${{ steps.artifacts.outputs.signedReleaseFile }}
- signedReleaseFileRelative: ${{ steps.artifacts.outputs.signedReleaseFileRelative }}
- steps:
- - name: Sign build artifacts
- id: sign_app
- uses: r0adkll/sign-android-release@v1
- with:
- releaseDirectory: app/release
- signingKeyBase64: ${{ secrets.KEY_STORE }}
- alias: ${{ secrets.KEY_ALIAS }}
- keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
- keyPassword: ${{ secrets.KEY_ALIAS_PASSWORD }}
- env:
- ANDROID_HOME: ${{ needs.build.outputs.androidHome }}
- ANDROID_SDK_ROOT: ${{ needs.build.outputs.androidSdkRoot }}
- BUILD_TOOLS_VERSION: "30.0.2"
- - name: Rename signed artifacts
- id: artifacts
- run: python $GITHUB_WORKSPACE/.github/utils/rename_artifacts.py $GITHUB_WORKSPACE
- publish:
- name: Publish APK
- runs-on: self-hosted
- needs:
- - sign
- steps:
- - name: Setup Python
- uses: actions/setup-python@v2
-
- - name: Extract changelogs
- id: changelog
- run: python $GITHUB_WORKSPACE/.github/utils/extract_changelogs.py $GITHUB_WORKSPACE
-
- - name: Upload APK to SFTP
- uses: easingthemes/ssh-deploy@v2.1.6
- env:
- REMOTE_HOST: ${{ secrets.SSH_IP }}
- REMOTE_USER: ${{ secrets.SSH_USERNAME }}
- SSH_PRIVATE_KEY: ${{ secrets.SSH_KEY }}
- SOURCE: ${{ needs.sign.outputs.signedReleaseFileRelative }}
- TARGET: ${{ secrets.SSH_PATH_RELEASE }}
- - name: Save version metadata
- env:
- DB_HOST: ${{ secrets.DB_HOST }}
- DB_USER: ${{ secrets.DB_USER }}
- DB_PASS: ${{ secrets.DB_PASS }}
- DB_NAME: ${{ secrets.DB_NAME }}
- APK_SERVER_RELEASE: ${{ secrets.APK_SERVER_RELEASE }}
- APK_SERVER_NIGHTLY: ${{ secrets.APK_SERVER_NIGHTLY }}
- run: python $GITHUB_WORKSPACE/.github/utils/save_version.py $GITHUB_WORKSPACE
-
- - name: Distribute to App Distribution
- uses: wzieba/Firebase-Distribution-Github-Action@v1
- with:
- appId: ${{ secrets.FIREBASE_APP_ID }}
- token: ${{ secrets.FIREBASE_TOKEN }}
- groups: ${{ secrets.FIREBASE_GROUPS_RELEASE }}
- file: ${{ needs.sign.outputs.signedReleaseFile }}
- releaseNotesFile: ${{ steps.changelog.outputs.changelogPlainTitledFile }}
- - name: Release on GitHub
- uses: softprops/action-gh-release@v1
- with:
- name: ${{ steps.changelog.outputs.changelogTitle }}
- body_path: ${{ steps.changelog.outputs.changelogMarkdownFile }}
- files: ${{ needs.sign.outputs.signedReleaseFile }}
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-
- - name: Post Discord webhook
- env:
- APK_FILE: ${{ needs.sign.outputs.signedReleaseFile }}
- APK_SERVER_RELEASE: ${{ secrets.APK_SERVER_RELEASE }}
- APK_SERVER_NIGHTLY: ${{ secrets.APK_SERVER_NIGHTLY }}
- WEBHOOK_RELEASE: ${{ secrets.WEBHOOK_RELEASE }}
- WEBHOOK_TESTING: ${{ secrets.WEBHOOK_TESTING }}
- run: python $GITHUB_WORKSPACE/.github/utils/webhook_discord.py $GITHUB_WORKSPACE
-
- - name: Upload workflow artifact
- uses: actions/upload-artifact@v2
- if: true
- with:
- name: ${{ steps.changelog.outputs.appVersionName }}
- path: |
- app/release/whatsnew*/
- app/release/*.apk
- app/release/*.aab
- app/release/*.json
- app/release/*.txt
diff --git a/.github/workflows/push-master.yml b/.github/workflows/push-master.yml
new file mode 100644
index 00000000..f8452a25
--- /dev/null
+++ b/.github/workflows/push-master.yml
@@ -0,0 +1,13 @@
+name: Push (master)
+on:
+ push:
+ branches: ["master"]
+jobs:
+ build:
+ name: Build for Google Play (AAB)
+ uses: szkolny-eu/szkolny-android/.github/workflows/_build.yml@develop
+ with:
+ build-aab: true
+ release-ssh: true
+ release-google-play: true
+ secrets: inherit
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 00000000..a64a8bdf
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,15 @@
+name: Release
+on:
+ push:
+ tags: ["v*.*"]
+jobs:
+ build:
+ name: Build release (APK)
+ uses: szkolny-eu/szkolny-android/.github/workflows/_build.yml@develop
+ with:
+ build-apk: true
+ release-ssh: true
+ release-github: true
+ release-firebase: true
+ release-discord: true
+ secrets: inherit
diff --git a/.github/workflows/schedule-dispatch.yml b/.github/workflows/schedule-dispatch.yml
new file mode 100644
index 00000000..9b2ca12e
--- /dev/null
+++ b/.github/workflows/schedule-dispatch.yml
@@ -0,0 +1,42 @@
+name: Schedule/dispatch
+on:
+ schedule:
+ # 23:30 UTC, 0:30 or 1:30 CET/CEST
+ - cron: "30 23 * * *"
+ workflow_dispatch:
+jobs:
+ check:
+ name: Check new changes
+ runs-on: ubuntu-latest
+ outputs:
+ hasNewChanges: ${{ steps.nightly.outputs.hasNewChanges }}
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+ clean: false
+ - name: Setup Python
+ uses: actions/setup-python@v4
+ - name: Install packages
+ uses: BSFishy/pip-action@v1
+ with:
+ packages: |
+ requests
+ - name: Check new changes
+ id: nightly
+ run: python $GITHUB_WORKSPACE/.github/utils/check_nightly.py $GITHUB_WORKSPACE >> $GITHUB_OUTPUT
+
+ build:
+ name: Build nightly release (APK)
+ needs:
+ - check
+ if: ${{ needs.check.outputs.hasNewChanges == 'true' }}
+ uses: szkolny-eu/szkolny-android/.github/workflows/_build.yml@develop
+ with:
+ nightly: true
+ build-apk: true
+ release-ssh: true
+ release-firebase: true
+ release-discord: true
+ secrets: inherit
diff --git a/app/build.gradle b/app/build.gradle
index c6e8ef86..cf7b500b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -104,7 +104,6 @@ android {
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
- version "3.10.2"
}
}
lint {
@@ -113,8 +112,9 @@ android {
}
tasks.whenTaskAdded { task ->
- if (!task.name.endsWith("Release") && !task.name.endsWith("ReleaseWithR8"))
+ if (!(task.name == "assembleUnofficialRelease" || task.name == "assembleOfficialRelease" || task.name == "signPlayReleaseBundle"))
return
+
def renameTaskName = "rename${task.name.capitalize()}"
def flavor = ""
@@ -124,17 +124,22 @@ tasks.whenTaskAdded { task ->
flavor = task.name.substring("assemble".length(), task.name.indexOf("Release")).uncapitalize()
if (task.name.startsWith("minify"))
flavor = task.name.substring("minify".length(), task.name.indexOf("Release")).uncapitalize()
+ if (task.name.startsWith("sign"))
+ flavor = task.name.substring("sign".length(), task.name.indexOf("Release")).uncapitalize()
if (flavor != "") {
- tasks.create(renameTaskName, Copy) {
+ tasks.register(renameTaskName, Copy) {
+ dependsOn(task.name)
+ duplicatesStrategy DuplicatesStrategy.FAIL
from file("${projectDir}/${flavor}/release/"),
- file("${buildDir}/outputs/mapping/${flavor}Release/"),
- file("${buildDir}/outputs/apk/${flavor}/release/"),
- file("${buildDir}/outputs/bundle/${flavor}Release/")
- include "*.aab", "*.apk", "mapping.txt", "output-metadata.json"
+ file("${projectDir}/build/outputs/apk/${flavor}/release/"),
+ file("${projectDir}/build/outputs/mapping/${flavor}Release/"),
+ file("${projectDir}/build/outputs/bundle/${flavor}Release/")
+ include "*-release.aab", "*-release.apk", "mapping.txt", "output-metadata.json"
destinationDir file("${projectDir}/release/")
rename ".+?\\.(.+)", "Edziennik_${android.defaultConfig.versionName}_${flavor}." + '$1'
}
+
task.finalizedBy(renameTaskName)
}
}
@@ -156,6 +161,7 @@ dependencies {
implementation "androidx.navigation:navigation-fragment-ktx:2.5.2"
implementation "androidx.recyclerview:recyclerview:1.2.1"
implementation "androidx.room:room-runtime:2.4.3"
+ implementation "androidx.room:room-ktx:2.4.3"
implementation "androidx.work:work-runtime-ktx:2.7.1"
kapt "androidx.room:room-compiler:2.4.3"
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2c24b426..cee95fe3 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -13,6 +13,7 @@
+
@@ -84,7 +85,7 @@
android:resource="@xml/widget_timetable_info" />
+ android:permission="android.permission.BIND_REMOTEVIEWS" android:foregroundServiceType="dataSync" />
+ android:permission="android.permission.BIND_REMOTEVIEWS" android:foregroundServiceType="dataSync" />
+ android:theme="@style/Theme.MaterialComponents.Light.DarkActionBar" />
+
@@ -198,15 +203,15 @@
____) | __/ | \ V /| | (_| __/\__ \
|_____/ \___|_| \_/ |_|\___\___||___/
-->
-
+
+ android:exported="false" android:foregroundServiceType="dataSync">
-
+
-
\ No newline at end of file
+ android:id="@+id/noTimetableLayout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center"
+ android:orientation="vertical">
+
+
+
+
+
diff --git a/app/src/main/res/raw/app_data.json b/app/src/main/res/raw/app_data.json
index 7fbbee2d..3b11b915 100644
--- a/app/src/main/res/raw/app_data.json
+++ b/app/src/main/res/raw/app_data.json
@@ -12,7 +12,8 @@
"uiConfig": {
"lessonHeight": 60,
"enableMarkAsReadAnnouncements": true,
- "enableNoticePoints": false
+ "enableNoticePoints": false,
+ "eventManualShowSubjectDropdown": false
},
"eventTypes": [
{
@@ -83,43 +84,40 @@
},
"university": {
"configOverrides": {
+ "agendaSubjectImportant": true,
"shareByDefault": true,
"timetableColorSubjectName": true,
"timetableTrimHourRange": true
},
"uiConfig": {
- "lessonHeight": 45
+ "lessonHeight": 45,
+ "eventManualShowSubjectDropdown": true
},
"eventTypes": [
{
- "id": 1,
- "color": "#f44336",
- "name": "egzamin"
+ "id": 3,
+ "color": "#76ff03",
+ "name": "kartkówka"
},
{
"id": 2,
"color": "#e91e63",
"name": "kolokwium"
},
- {
- "id": 3,
- "color": "#76ff03",
- "name": "kartkówka"
- },
- {
- "id": 4,
- "color": "#ffeb3b",
- "name": "wejściówka"
- },
{
"id": 5,
"color": "#90caf9",
"name": "zaliczenie"
},
{
- "id": 6,
- "color": "#4050b5",
- "name": "zadanie"
+ "id": 1,
+ "color": "#f44336",
+ "name": "egzamin"
+ },
+ {
+ "id": 11,
+ "color": "#3d5afe",
+ "name": "poprawka"
},
{
"id": 7,
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index b86e1309..24486d1e 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -847,7 +847,7 @@
Open-Source-Lizenzen
Datenschutzrichtlinie
E-Klassenbuch
- © Kuba Szczodrzyński, September 2018 - 2022
+ © Kuba Szczodrzyński, September 2018 - 2023
Klicken Sie hier, um nach Aktualisierungen zu suchen
Aktualisierung
Version
diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml
index 50043dac..dea85350 100644
--- a/app/src/main/res/values-en/strings.xml
+++ b/app/src/main/res/values-en/strings.xml
@@ -849,7 +849,7 @@
Open-source licenses
Privacy policy
E-register
- © Kuba Szczodrzyński, September 2018 – 2022
+ © Kuba Szczodrzyński, September 2018 – 2023
Click to check for updates
Update
Version
@@ -1353,7 +1353,6 @@
Child %s does not have a profile on this account in the current school year. Probably this profile has been deleted or the student no longer attends this class.\n\nTo go to the current profile, select a student from the list or log in to their account with the Add student button.
A reference to a remote repository was not found. Make sure you are using the official repository fork and verify your Gradle configuration.
"Enter the data you use to log in to the MobiDziennik website. As the server address, you can enter the address of the website where you have MobiDziennik. "
- In order to be able to save the generated timetable, you must grant access rights to the device\'s memory.\n\nClick OK to grant permissions.
(Child)
(Parent)
Teachers
@@ -1434,4 +1433,6 @@
Agenda settings
Share notes
All lessons:
+ Use without login
+ Demo version
diff --git a/app/src/main/res/values/errors.xml b/app/src/main/res/values/errors.xml
index 557eaea8..03634d36 100644
--- a/app/src/main/res/values/errors.xml
+++ b/app/src/main/res/values/errors.xml
@@ -120,6 +120,7 @@
ERROR_LOGIN_LIBRUS_API_INVALID_REQUEST
ERROR_LIBRUS_MESSAGES_ATTACHMENT_NOT_FOUND
ERROR_LOGIN_LIBRUS_MESSAGES_TIMEOUT
+ ERROR_LIBRUS_API_TEACHER_FREE_DAYS_NOT_PUBLIC
ERROR_LOGIN_MOBIDZIENNIK_WEB_INVALID_LOGIN
ERROR_LOGIN_MOBIDZIENNIK_WEB_OLD_PASSWORD
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 487b9c09..79c9cfb2 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -445,9 +445,12 @@
Oceny oddziel przecinkiem
Podaj oceny…
Ukrywaj oceny poprawione z listy
+ Licz ECTS przed zaliczeniem całego przedmiotu
+ Ukrywaj pozycje \"brak oceny\"
Własna wartość minusa
Własna wartość plusa
Konfiguracja ocen
+ Punkty ECTS: %#.2f
Dodaj ocenę
Dodawanie oceny
Podaj wagę oceny
@@ -474,9 +477,11 @@
semestr %d: %spkt
Semestr %d
Semestr %d
+ wszystkie oceny
Aktualne ustawienia ocen mogą wpływać na średnią. Jeśli uważasz, że się ona nie zgadza, kliknij Konfiguruj.
Została ustawiona własna wartość plusa/minusa. Jeśli uważasz, że się ona nie zgadza, kliknij Konfiguruj.
*średnie ocen są poglądowe i mogą się różnić, w zależności od ustawień szkoły
+ punkty ECTS
*przewidywana średnia
*z ocen końcowych\nPrzewidywana: %s
*z ocen końcowych
@@ -490,11 +495,14 @@
Śr. ocen proponowanych:\n%s
semestr 1
semestr 2
+ ten semestr
Statystyka ocen
+ Średnia ocen za studia
całoroczna
wartość: %s
waga %s
nie liczona do śr.
+ brak oceny
koniec roku: %s
koniec roku: %s%%
koniec roku: %spkt
@@ -689,6 +697,7 @@
Ustawienia ocen
Symulator edycji ocen
Sortuj oceny
+ Sposób obliczania średniej za studia
Pomoc
Strona główna
Zadania domowe
@@ -916,7 +925,7 @@
Licencje open-source
Polityka prywatności
E-dziennik
- © Kuba Szczodrzyński, wrzesień 2018 - 2022
+ © Kuba Szczodrzyński, wrzesień 2018 - 2023
Kliknij, aby sprawdzić aktualizacje
Aktualizacja
Wersja
@@ -970,6 +979,8 @@
Nie wliczaj oceny 0 do średniej
Ten e-dziennik nie został jeszcze zaimplementowany w aplikacji.
Pokazuj nieobecności nauczycieli w Terminarzu
+ Średnia arytmetyczna ocen
+ Średnia ważona ocen (ECTS = waga)
Tablica ogłoszeń
Obecności/nieobecności
Dni wolne klasy
@@ -1241,7 +1252,7 @@
Skontaktuj się z wychowawcą w celu udostępnienia planu lekcji.
Plan lekcji nie został opublikowany przez szkołę.
Brak planu lekcji
- Wybierz dzień
+ Przejdź do daty
Pobieranie planu lekcji na wybrany tydzień…
Dzisiaj
Synchronizuj wszystko
@@ -1416,7 +1427,6 @@
Sprawdź kod
Brak dostępu do API
Data kompilacji
- Aby móc zapisać wygenerowany plan lekcji musisz przyznać uprawnienia dostępu do pamięci urządzenia.\n\nKliknij OK, aby przyznać uprawnienia.
przeczytanie Polityki prywatności i akceptujesz jej postanowienia.
Autorzy aplikacji nie biorą odpowiedzialności za korzystanie z aplikacji Szkolny.eu.]]>
Szkolny.eu v%s\n%s
Ustawienia terminarza
@@ -1544,6 +1554,7 @@
TODO
USOS - wymagane logowanie z użyciem przeglądarki
Zaloguj się
+ reCAPTCHA
Nie można załadować danych aplikacji
{cmd-share-variant} udostępnione w klasie
{cmd-share-variant} udostępnione przez Ciebie
@@ -1551,4 +1562,8 @@
Ustaw tworzone wydarzenia domyślnie jako udostępnione
Rejestracja
Wszystkie lekcje:
+ Wyświetl nazwę przedmiotu zamiast rodzaju
+ Odśwież wybrany tydzień
+ Użyj bez logowania
+ Wersja demonstracyjna
diff --git a/build.gradle b/build.gradle
index d51f1fec..45956ab1 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,14 +5,14 @@ buildscript {
kotlin_version = '1.6.10'
release = [
- versionName: "4.13.2",
- versionCode: 4130299
+ versionName: "4.14.2",
+ versionCode: 4140299
]
setup = [
- compileSdk: 33,
+ compileSdk: 34,
minSdk : 16,
- targetSdk : 33
+ targetSdk : 34
]
}