Compare commits
No commits in common. "develop" and "v4.7-rc.2" have entirely different histories.
2
.github/utils/_get_password.py
vendored
@ -23,6 +23,8 @@ def get_password(
|
|||||||
auth_plugin="mysql_native_password",
|
auth_plugin="mysql_native_password",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
print(f"Generating passwords for version {version_name} ({version_code})")
|
||||||
|
|
||||||
password = base64.b64encode(secrets.token_bytes(16)).decode()
|
password = base64.b64encode(secrets.token_bytes(16)).decode()
|
||||||
iv = secrets.token_bytes(16)
|
iv = secrets.token_bytes(16)
|
||||||
|
|
||||||
|
4
.github/utils/_utils.py
vendored
@ -102,9 +102,7 @@ def get_commit_log(project_dir: str, format: str, max_lines: int = None) -> str:
|
|||||||
)
|
)
|
||||||
|
|
||||||
log = subprocess.run(
|
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,
|
cwd=project_dir,
|
||||||
stdout=subprocess.PIPE,
|
stdout=subprocess.PIPE,
|
||||||
)
|
)
|
||||||
|
29
.github/utils/bump_nightly.py
vendored
@ -1,7 +1,10 @@
|
|||||||
|
import json
|
||||||
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from zoneinfo import ZoneInfo
|
|
||||||
|
import requests
|
||||||
|
|
||||||
from _utils import (
|
from _utils import (
|
||||||
get_commit_log,
|
get_commit_log,
|
||||||
@ -15,20 +18,38 @@ if __name__ == "__main__":
|
|||||||
print("usage: bump_nightly.py <project dir>")
|
print("usage: bump_nightly.py <project dir>")
|
||||||
exit(-1)
|
exit(-1)
|
||||||
|
|
||||||
|
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=1&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()
|
project_dir = get_project_dir()
|
||||||
|
|
||||||
(version_code, version_name) = read_gradle_version(project_dir)
|
(version_code, version_name) = read_gradle_version(project_dir)
|
||||||
version_name = version_name.split("+")[0]
|
version_name = version_name.split("+")[0]
|
||||||
|
|
||||||
date = datetime.now(tz=ZoneInfo("Europe/Warsaw"))
|
date = datetime.now()
|
||||||
if date.hour > 6:
|
if date.hour > 6:
|
||||||
version_name += "+daily." + date.strftime("%Y%m%d-%H%M")
|
version_name += "+daily." + date.strftime("%Y%m%d-%H%M")
|
||||||
else:
|
else:
|
||||||
date -= timedelta(days=1)
|
date -= timedelta(days=1)
|
||||||
version_name += "+nightly." + date.strftime("%Y%m%d")
|
version_name += "+nightly." + date.strftime("%Y%m%d")
|
||||||
|
|
||||||
print("appVersionName=" + version_name)
|
print("::set-output name=appVersionName::" + version_name)
|
||||||
print("appVersionCode=" + str(version_code))
|
print("::set-output name=appVersionCode::" + str(version_code))
|
||||||
|
|
||||||
write_gradle_version(project_dir, version_code, version_name)
|
write_gradle_version(project_dir, version_code, version_name)
|
||||||
|
|
||||||
|
23
.github/utils/check_nightly.py
vendored
@ -1,23 +0,0 @@
|
|||||||
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")
|
|
40
.github/utils/extract_changelogs.py
vendored
@ -12,60 +12,48 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
(version_code, version_name) = read_gradle_version(project_dir)
|
(version_code, version_name) = read_gradle_version(project_dir)
|
||||||
|
|
||||||
print("appVersionName=" + version_name)
|
print("::set-output name=appVersionName::" + version_name)
|
||||||
print("appVersionCode=" + str(version_code))
|
print("::set-output name=appVersionCode::" + str(version_code))
|
||||||
|
|
||||||
dir = f"{project_dir}/app/release/whatsnew-{version_name}/"
|
dir = f"{project_dir}/app/release/whatsnew-{version_name}/"
|
||||||
os.makedirs(dir, exist_ok=True)
|
os.makedirs(dir, exist_ok=True)
|
||||||
|
|
||||||
print("changelogDir=" + dir)
|
print("::set-output name=changelogDir::" + dir)
|
||||||
|
|
||||||
(title, changelog) = get_changelog(project_dir, format="plain")
|
(title, changelog) = get_changelog(project_dir, format="plain")
|
||||||
|
with open(dir + "whatsnew-pl-PL", "w", encoding="utf-8") as f:
|
||||||
|
f.write(changelog)
|
||||||
|
print("::set-output name=changelogPlainFile::" + dir + "whatsnew-pl-PL")
|
||||||
|
|
||||||
# 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(title)
|
||||||
f.write("\n")
|
f.write("\n")
|
||||||
f.write(changelog)
|
f.write(changelog)
|
||||||
print("changelogPlainTitledFile=" + dir + "whatsnew_titled.txt")
|
print("::set-output name=changelogPlainTitledFile::" + dir + "whatsnew-titled.txt")
|
||||||
|
|
||||||
print("changelogTitle=" + title)
|
print("::set-output name=changelogTitle::" + title)
|
||||||
|
|
||||||
# plain text changelog, max 500 chars - Google Play
|
|
||||||
with open(dir + "whatsnew-pl-PL", "w", encoding="utf-8") as f:
|
|
||||||
changelog_lines = changelog.split("\n")
|
|
||||||
changelog = ""
|
|
||||||
for line in changelog_lines:
|
|
||||||
if len(changelog) + len(line) < 500:
|
|
||||||
changelog += "\n" + line
|
|
||||||
changelog = changelog.strip()
|
|
||||||
f.write(changelog)
|
|
||||||
|
|
||||||
print("changelogPlainFile=" + dir + "whatsnew-pl-PL")
|
|
||||||
|
|
||||||
# markdown changelog - Discord webhook
|
|
||||||
(_, changelog) = get_changelog(project_dir, format="markdown")
|
(_, changelog) = get_changelog(project_dir, format="markdown")
|
||||||
with open(dir + "whatsnew.md", "w", encoding="utf-8") as f:
|
with open(dir + "whatsnew.md", "w", encoding="utf-8") as f:
|
||||||
f.write(changelog)
|
f.write(changelog)
|
||||||
print("changelogMarkdownFile=" + dir + "whatsnew.md")
|
print("::set-output name=changelogMarkdownFile::" + dir + "whatsnew.md")
|
||||||
|
|
||||||
# html changelog - version info in DB
|
|
||||||
(_, changelog) = get_changelog(project_dir, format="html")
|
(_, changelog) = get_changelog(project_dir, format="html")
|
||||||
with open(dir + "whatsnew.html", "w", encoding="utf-8") as f:
|
with open(dir + "whatsnew.html", "w", encoding="utf-8") as f:
|
||||||
f.write(changelog)
|
f.write(changelog)
|
||||||
print("changelogHtmlFile=" + dir + "whatsnew.html")
|
print("::set-output name=changelogHtmlFile::" + dir + "whatsnew.html")
|
||||||
|
|
||||||
changelog = get_commit_log(project_dir, format="plain", max_lines=10)
|
changelog = get_commit_log(project_dir, format="plain", max_lines=10)
|
||||||
with open(dir + "commit_log.txt", "w", encoding="utf-8") as f:
|
with open(dir + "commit_log.txt", "w", encoding="utf-8") as f:
|
||||||
f.write(changelog)
|
f.write(changelog)
|
||||||
print("commitLogPlainFile=" + dir + "commit_log.txt")
|
print("::set-output name=commitLogPlainFile::" + dir + "commit_log.txt")
|
||||||
|
|
||||||
changelog = get_commit_log(project_dir, format="markdown", max_lines=10)
|
changelog = get_commit_log(project_dir, format="markdown", max_lines=10)
|
||||||
with open(dir + "commit_log.md", "w", encoding="utf-8") as f:
|
with open(dir + "commit_log.md", "w", encoding="utf-8") as f:
|
||||||
f.write(changelog)
|
f.write(changelog)
|
||||||
print("commitLogMarkdownFile=" + dir + "commit_log.md")
|
print("::set-output name=commitLogMarkdownFile::" + dir + "commit_log.md")
|
||||||
|
|
||||||
changelog = get_commit_log(project_dir, format="html", max_lines=10)
|
changelog = get_commit_log(project_dir, format="html", max_lines=10)
|
||||||
with open(dir + "commit_log.html", "w", encoding="utf-8") as f:
|
with open(dir + "commit_log.html", "w", encoding="utf-8") as f:
|
||||||
f.write(changelog)
|
f.write(changelog)
|
||||||
print("commitLogHtmlFile=" + dir + "commit_log.html")
|
print("::set-output name=commitLogHtmlFile::" + dir + "commit_log.html")
|
||||||
|
@ -13,7 +13,7 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
files = glob.glob(f"{project_dir}/app/release/*.*")
|
files = glob.glob(f"{project_dir}/app/release/*.*")
|
||||||
for file in files:
|
for file in files:
|
||||||
file_relative = file.replace(project_dir + "/", "")
|
file_relative = file.replace(os.getenv("GITHUB_WORKSPACE") + "/", "")
|
||||||
if "-aligned.apk" in file:
|
if "-aligned.apk" in file:
|
||||||
os.unlink(file)
|
os.unlink(file)
|
||||||
elif "-signed.apk" in file:
|
elif "-signed.apk" in file:
|
||||||
@ -22,5 +22,5 @@ if __name__ == "__main__":
|
|||||||
os.unlink(new_file)
|
os.unlink(new_file)
|
||||||
os.rename(file, new_file)
|
os.rename(file, new_file)
|
||||||
elif ".apk" in file or ".aab" in file:
|
elif ".apk" in file or ".aab" in file:
|
||||||
print("signedReleaseFile=" + file)
|
print("::set-output name=signedReleaseFile::" + file)
|
||||||
print("signedReleaseFileRelative=" + file_relative)
|
print("::set-output name=signedReleaseFileRelative::" + file_relative)
|
25
.github/utils/save_version.py
vendored
@ -3,7 +3,6 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from time import time
|
from time import time
|
||||||
from zoneinfo import ZoneInfo
|
|
||||||
|
|
||||||
import mysql.connector as mysql
|
import mysql.connector as mysql
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
@ -60,22 +59,12 @@ def save_version(
|
|||||||
build_date = int(os.stat(file).st_mtime)
|
build_date = int(os.stat(file).st_mtime)
|
||||||
bundle_name_play = output_aab_play
|
bundle_name_play = output_aab_play
|
||||||
|
|
||||||
build_date = datetime.fromtimestamp(
|
build_date = datetime.fromtimestamp(build_date).strftime("%Y-%m-%d %H:%M:%S")
|
||||||
build_date,
|
|
||||||
tz=ZoneInfo("Europe/Warsaw"),
|
|
||||||
).strftime("%Y-%m-%d %H:%M:%S")
|
|
||||||
|
|
||||||
if build_type in ["nightly", "daily"]:
|
if build_type in ["nightly", "daily"]:
|
||||||
download_url = apk_server_nightly + apk_name if apk_name else None
|
download_url = apk_server_nightly + apk_name if apk_name else None
|
||||||
else:
|
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 = [
|
cols = [
|
||||||
"versionCode",
|
"versionCode",
|
||||||
@ -130,12 +119,4 @@ if __name__ == "__main__":
|
|||||||
APK_SERVER_RELEASE = os.getenv("APK_SERVER_RELEASE")
|
APK_SERVER_RELEASE = os.getenv("APK_SERVER_RELEASE")
|
||||||
APK_SERVER_NIGHTLY = os.getenv("APK_SERVER_NIGHTLY")
|
APK_SERVER_NIGHTLY = os.getenv("APK_SERVER_NIGHTLY")
|
||||||
|
|
||||||
save_version(
|
save_version(project_dir, DB_HOST, DB_USER, DB_PASS, DB_NAME, APK_SERVER_RELEASE, APK_SERVER_NIGHTLY)
|
||||||
project_dir,
|
|
||||||
DB_HOST,
|
|
||||||
DB_USER,
|
|
||||||
DB_PASS,
|
|
||||||
DB_NAME,
|
|
||||||
APK_SERVER_RELEASE,
|
|
||||||
APK_SERVER_NIGHTLY,
|
|
||||||
)
|
|
||||||
|
6
.github/utils/sign.py
vendored
@ -31,6 +31,8 @@ def sign(
|
|||||||
SIGNING_FORMAT = "$param1.{}.$param2"
|
SIGNING_FORMAT = "$param1.{}.$param2"
|
||||||
CPP_FORMAT = "/*{}*/\nstatic toys AES_IV[16] = {{\n\t{} }};"
|
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_hex = " ".join(["{:02x}".format(x) for x in iv])
|
||||||
iv_cpp = ", ".join(["0x{:02x}".format(x) for x in iv])
|
iv_cpp = ", ".join(["0x{:02x}".format(x) for x in iv])
|
||||||
|
|
||||||
@ -69,8 +71,8 @@ if __name__ == "__main__":
|
|||||||
version_name, version_code, DB_HOST, DB_USER, DB_PASS, DB_NAME
|
version_name, version_code, DB_HOST, DB_USER, DB_PASS, DB_NAME
|
||||||
)
|
)
|
||||||
|
|
||||||
print("appVersionName=" + version_name)
|
print("::set-output name=appVersionName::" + version_name)
|
||||||
print("appVersionCode=" + str(version_code))
|
print("::set-output name=appVersionCode::" + str(version_code))
|
||||||
|
|
||||||
sign(
|
sign(
|
||||||
project_dir,
|
project_dir,
|
||||||
|
39
.github/utils/webhook_discord.py
vendored
@ -1,7 +1,6 @@
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from zoneinfo import ZoneInfo
|
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
@ -12,7 +11,8 @@ from _utils import get_changelog, get_commit_log, get_project_dir, read_gradle_v
|
|||||||
def post_webhook(
|
def post_webhook(
|
||||||
project_dir: str,
|
project_dir: str,
|
||||||
apk_file: str,
|
apk_file: str,
|
||||||
download_url: str,
|
apk_server_release: str,
|
||||||
|
apk_server_nightly: str,
|
||||||
webhook_release: str,
|
webhook_release: str,
|
||||||
webhook_testing: str,
|
webhook_testing: str,
|
||||||
):
|
):
|
||||||
@ -25,13 +25,16 @@ def post_webhook(
|
|||||||
testing = ["dev", "beta", "nightly", "daily"]
|
testing = ["dev", "beta", "nightly", "daily"]
|
||||||
testing = build_type in testing
|
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:
|
if testing:
|
||||||
build_date = int(os.stat(apk_file).st_mtime)
|
build_date = int(os.stat(apk_file).st_mtime)
|
||||||
if build_date:
|
if build_date:
|
||||||
build_date = datetime.fromtimestamp(
|
build_date = datetime.fromtimestamp(build_date).strftime("%Y-%m-%d %H:%M")
|
||||||
build_date,
|
|
||||||
tz=ZoneInfo("Europe/Warsaw"),
|
|
||||||
).strftime("%Y-%m-%d %H:%M")
|
|
||||||
|
|
||||||
# untagged release, get commit log
|
# untagged release, get commit log
|
||||||
if build_type in ["nightly", "daily"]:
|
if build_type in ["nightly", "daily"]:
|
||||||
@ -45,17 +48,13 @@ def post_webhook(
|
|||||||
requests.post(url=webhook_testing, json=webhook)
|
requests.post(url=webhook_testing, json=webhook)
|
||||||
else:
|
else:
|
||||||
changelog = get_changelog(project_dir, format="markdown")
|
changelog = get_changelog(project_dir, format="markdown")
|
||||||
webhook = get_webhook_release(version_name, changelog, download_url)
|
webhook = get_webhook_release(changelog, download_url)
|
||||||
requests.post(url=webhook_release, json=webhook)
|
requests.post(url=webhook_release, json=webhook)
|
||||||
|
|
||||||
|
|
||||||
def get_webhook_release(version_name: str, changelog: str, download_url: str):
|
def get_webhook_release(changelog: str, download_url: str):
|
||||||
(title, content) = changelog
|
(title, content) = changelog
|
||||||
return {
|
return {"content": f"__**{title}**__\n{content}\n{download_url}"}
|
||||||
"content": (
|
|
||||||
f"__**{title}**__\n{content}\n[Szkolny.eu {version_name}]({download_url})"
|
|
||||||
),
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def get_webhook_testing(
|
def get_webhook_testing(
|
||||||
@ -74,11 +73,9 @@ def get_webhook_testing(
|
|||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
"name": f"Wersja `{version_name}`",
|
"name": f"Wersja `{version_name}`",
|
||||||
"value": (
|
"value": f"[Pobierz .APK]({download_url})"
|
||||||
f"[Pobierz .APK]({download_url})"
|
if download_url
|
||||||
if download_url
|
else "*Pobieranie niedostępne*",
|
||||||
else "*Pobieranie niedostępne*"
|
|
||||||
),
|
|
||||||
"inline": False,
|
"inline": False,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -106,14 +103,16 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
APK_FILE = os.getenv("APK_FILE")
|
APK_FILE = os.getenv("APK_FILE")
|
||||||
DOWNLOAD_URL = os.getenv("DOWNLOAD_URL")
|
APK_SERVER_RELEASE = os.getenv("APK_SERVER_RELEASE")
|
||||||
|
APK_SERVER_NIGHTLY = os.getenv("APK_SERVER_NIGHTLY")
|
||||||
WEBHOOK_RELEASE = os.getenv("WEBHOOK_RELEASE")
|
WEBHOOK_RELEASE = os.getenv("WEBHOOK_RELEASE")
|
||||||
WEBHOOK_TESTING = os.getenv("WEBHOOK_TESTING")
|
WEBHOOK_TESTING = os.getenv("WEBHOOK_TESTING")
|
||||||
|
|
||||||
post_webhook(
|
post_webhook(
|
||||||
project_dir,
|
project_dir,
|
||||||
APK_FILE,
|
APK_FILE,
|
||||||
DOWNLOAD_URL,
|
APK_SERVER_RELEASE,
|
||||||
|
APK_SERVER_NIGHTLY,
|
||||||
WEBHOOK_RELEASE,
|
WEBHOOK_RELEASE,
|
||||||
WEBHOOK_TESTING,
|
WEBHOOK_TESTING,
|
||||||
)
|
)
|
||||||
|
195
.github/workflows/_build.yml
vendored
@ -1,195 +0,0 @@
|
|||||||
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
|
|
151
.github/workflows/build-nightly-apk.yml
vendored
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
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
|
||||||
|
outputs:
|
||||||
|
androidHome: ${{ env.ANDROID_HOME }}
|
||||||
|
androidSdkRoot: ${{ env.ANDROID_SDK_ROOT }}
|
||||||
|
steps:
|
||||||
|
- name: Setup JDK 1.8
|
||||||
|
uses: actions/setup-java@v1
|
||||||
|
with:
|
||||||
|
java-version: 1.8
|
||||||
|
- 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
|
||||||
|
run: ./gradlew 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
|
129
.github/workflows/build-release-aab-play.yml
vendored
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
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 1.8
|
||||||
|
uses: actions/setup-java@v1
|
||||||
|
with:
|
||||||
|
java-version: 1.8
|
||||||
|
- 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
|
||||||
|
run: ./gradlew 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 }}
|
||||||
|
userFraction: 1.0
|
||||||
|
whatsNewDirectory: ${{ steps.changelog.outputs.changelogDir }}
|
||||||
|
|
||||||
|
- 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
|
151
.github/workflows/build-release-apk.yml
vendored
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
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 1.8
|
||||||
|
uses: actions/setup-java@v1
|
||||||
|
with:
|
||||||
|
java-version: 1.8
|
||||||
|
- 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
|
||||||
|
run: ./gradlew 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
|
13
.github/workflows/push-master.yml
vendored
@ -1,13 +0,0 @@
|
|||||||
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
|
|
15
.github/workflows/release.yml
vendored
@ -1,15 +0,0 @@
|
|||||||
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
|
|
42
.github/workflows/schedule-dispatch.yml
vendored
@ -1,42 +0,0 @@
|
|||||||
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
|
|
1
.gitignore
vendored
@ -265,4 +265,3 @@ fabric.properties
|
|||||||
# End of https://www.toptal.com/developers/gitignore/api/android,androidstudio,gradle,java,kotlin
|
# End of https://www.toptal.com/developers/gitignore/api/android,androidstudio,gradle,java,kotlin
|
||||||
|
|
||||||
signatures/
|
signatures/
|
||||||
.idea/*.xml
|
|
||||||
|
37
.idea/codeStyles/Project.xml
generated
@ -1,33 +1,8 @@
|
|||||||
<component name="ProjectCodeStyleConfiguration">
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
<code_scheme name="Project" version="173">
|
<code_scheme name="Project" version="173">
|
||||||
<AndroidXmlCodeStyleSettings>
|
|
||||||
<option name="LAYOUT_SETTINGS">
|
|
||||||
<value>
|
|
||||||
<option name="INSERT_LINE_BREAK_BEFORE_NAMESPACE_DECLARATION" value="true" />
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<option name="MANIFEST_SETTINGS">
|
|
||||||
<value>
|
|
||||||
<option name="INSERT_LINE_BREAK_BEFORE_NAMESPACE_DECLARATION" value="true" />
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<option name="OTHER_SETTINGS">
|
|
||||||
<value>
|
|
||||||
<option name="INSERT_LINE_BREAK_BEFORE_NAMESPACE_DECLARATION" value="true" />
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
</AndroidXmlCodeStyleSettings>
|
|
||||||
<JetCodeStyleSettings>
|
<JetCodeStyleSettings>
|
||||||
<option name="ALLOW_TRAILING_COMMA" value="true" />
|
|
||||||
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
||||||
</JetCodeStyleSettings>
|
</JetCodeStyleSettings>
|
||||||
<codeStyleSettings language="JSON">
|
|
||||||
<indentOptions>
|
|
||||||
<option name="INDENT_SIZE" value="4" />
|
|
||||||
<option name="USE_TAB_CHARACTER" value="true" />
|
|
||||||
<option name="SMART_TABS" value="true" />
|
|
||||||
</indentOptions>
|
|
||||||
</codeStyleSettings>
|
|
||||||
<codeStyleSettings language="XML">
|
<codeStyleSettings language="XML">
|
||||||
<option name="FORCE_REARRANGE_MODE" value="1" />
|
<option name="FORCE_REARRANGE_MODE" value="1" />
|
||||||
<indentOptions>
|
<indentOptions>
|
||||||
@ -40,7 +15,6 @@
|
|||||||
<match>
|
<match>
|
||||||
<AND>
|
<AND>
|
||||||
<NAME>xmlns:android</NAME>
|
<NAME>xmlns:android</NAME>
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||||
</AND>
|
</AND>
|
||||||
</match>
|
</match>
|
||||||
@ -51,7 +25,6 @@
|
|||||||
<match>
|
<match>
|
||||||
<AND>
|
<AND>
|
||||||
<NAME>xmlns:.*</NAME>
|
<NAME>xmlns:.*</NAME>
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||||
</AND>
|
</AND>
|
||||||
</match>
|
</match>
|
||||||
@ -63,7 +36,6 @@
|
|||||||
<match>
|
<match>
|
||||||
<AND>
|
<AND>
|
||||||
<NAME>.*:id</NAME>
|
<NAME>.*:id</NAME>
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||||
</AND>
|
</AND>
|
||||||
</match>
|
</match>
|
||||||
@ -74,7 +46,6 @@
|
|||||||
<match>
|
<match>
|
||||||
<AND>
|
<AND>
|
||||||
<NAME>.*:name</NAME>
|
<NAME>.*:name</NAME>
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||||
</AND>
|
</AND>
|
||||||
</match>
|
</match>
|
||||||
@ -85,7 +56,6 @@
|
|||||||
<match>
|
<match>
|
||||||
<AND>
|
<AND>
|
||||||
<NAME>name</NAME>
|
<NAME>name</NAME>
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||||
</AND>
|
</AND>
|
||||||
</match>
|
</match>
|
||||||
@ -96,7 +66,6 @@
|
|||||||
<match>
|
<match>
|
||||||
<AND>
|
<AND>
|
||||||
<NAME>style</NAME>
|
<NAME>style</NAME>
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||||
</AND>
|
</AND>
|
||||||
</match>
|
</match>
|
||||||
@ -107,7 +76,6 @@
|
|||||||
<match>
|
<match>
|
||||||
<AND>
|
<AND>
|
||||||
<NAME>.*</NAME>
|
<NAME>.*</NAME>
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||||
</AND>
|
</AND>
|
||||||
</match>
|
</match>
|
||||||
@ -119,7 +87,6 @@
|
|||||||
<match>
|
<match>
|
||||||
<AND>
|
<AND>
|
||||||
<NAME>.*</NAME>
|
<NAME>.*</NAME>
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||||
</AND>
|
</AND>
|
||||||
</match>
|
</match>
|
||||||
@ -131,7 +98,6 @@
|
|||||||
<match>
|
<match>
|
||||||
<AND>
|
<AND>
|
||||||
<NAME>.*</NAME>
|
<NAME>.*</NAME>
|
||||||
<XML_ATTRIBUTE />
|
|
||||||
<XML_NAMESPACE>.*</XML_NAMESPACE>
|
<XML_NAMESPACE>.*</XML_NAMESPACE>
|
||||||
</AND>
|
</AND>
|
||||||
</match>
|
</match>
|
||||||
@ -143,9 +109,6 @@
|
|||||||
</codeStyleSettings>
|
</codeStyleSettings>
|
||||||
<codeStyleSettings language="kotlin">
|
<codeStyleSettings language="kotlin">
|
||||||
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
||||||
<option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true" />
|
|
||||||
<option name="PARAMETER_ANNOTATION_WRAP" value="2" />
|
|
||||||
<option name="ENUM_CONSTANTS_WRAP" value="2" />
|
|
||||||
</codeStyleSettings>
|
</codeStyleSettings>
|
||||||
</code_scheme>
|
</code_scheme>
|
||||||
</component>
|
</component>
|
6
.idea/copyright/Antoni.xml
generated
@ -1,6 +0,0 @@
|
|||||||
<component name="CopyrightManager">
|
|
||||||
<copyright>
|
|
||||||
<option name="notice" value="Copyright (c) Antoni Czaplicki &#36;{today.year}-&#36;{today.month}-&#36;{today.day}. " />
|
|
||||||
<option name="myName" value="Antoni" />
|
|
||||||
</copyright>
|
|
||||||
</component>
|
|
4
.idea/dictionaries/Kuba.xml
generated
@ -4,10 +4,7 @@
|
|||||||
<w>autoryzacji</w>
|
<w>autoryzacji</w>
|
||||||
<w>ciasteczko</w>
|
<w>ciasteczko</w>
|
||||||
<w>csrf</w>
|
<w>csrf</w>
|
||||||
<w>daynight</w>
|
|
||||||
<w>edziennik</w>
|
<w>edziennik</w>
|
||||||
<w>eggfall</w>
|
|
||||||
<w>elearning</w>
|
|
||||||
<w>gson</w>
|
<w>gson</w>
|
||||||
<w>hebe</w>
|
<w>hebe</w>
|
||||||
<w>idziennik</w>
|
<w>idziennik</w>
|
||||||
@ -15,7 +12,6 @@
|
|||||||
<w>synergia</w>
|
<w>synergia</w>
|
||||||
<w>szczodrzyński</w>
|
<w>szczodrzyński</w>
|
||||||
<w>szkolny</w>
|
<w>szkolny</w>
|
||||||
<w>usos</w>
|
|
||||||
</words>
|
</words>
|
||||||
</dictionary>
|
</dictionary>
|
||||||
</component>
|
</component>
|
9
.idea/discord.xml
generated
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="DiscordProjectSettings">
|
||||||
|
<option name="show" value="PROJECT_FILES" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectNotificationSettings">
|
||||||
|
<option name="askShowProject" value="false" />
|
||||||
|
</component>
|
||||||
|
</project>
|
6
.idea/kotlinc.xml
generated
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Kotlin2JvmCompilerArguments">
|
||||||
|
<option name="jvmTarget" value="1.8" />
|
||||||
|
</component>
|
||||||
|
</project>
|
13
.idea/runConfigurations.xml
generated
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="RunConfigurationProducerService">
|
||||||
|
<option name="ignoredProducers">
|
||||||
|
<set>
|
||||||
|
<option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
|
||||||
|
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
|
||||||
|
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
|
||||||
|
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
|
||||||
|
</set>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -6,13 +6,13 @@
|
|||||||
[](https://szkolny.eu/)
|
[](https://szkolny.eu/)
|
||||||
[](https://szkolny.eu/facebook)
|
[](https://szkolny.eu/facebook)
|
||||||
|
|
||||||

|

|
||||||
[](https://github.com/szkolny-eu/szkolny-android/releases/latest)
|
[](https://github.com/szkolny-eu/szkolny-android/releases/latest)
|
||||||

|

|
||||||
|
|
||||||
[](https://github.com/szkolny-eu/szkolny-android/actions/workflows/release.yml)
|
[](https://github.com/szkolny-eu/szkolny-android/actions/workflows/build-release-apk.yml)
|
||||||
[](https://github.com/szkolny-eu/szkolny-android/actions/workflows/push-master.yml)
|
[](https://github.com/szkolny-eu/szkolny-android/actions/workflows/build-release-aab-play.yml)
|
||||||
[](https://github.com/szkolny-eu/szkolny-android/actions/workflows/schedule-dispatch.yml)
|
[](https://github.com/szkolny-eu/szkolny-android/actions/workflows/build-nightly-apk.yml)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
171
app/build.gradle
@ -1,7 +1,6 @@
|
|||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
apply plugin: 'kotlin-android'
|
apply plugin: 'kotlin-android'
|
||||||
apply plugin: 'kotlin-kapt'
|
apply plugin: 'kotlin-kapt'
|
||||||
apply plugin: 'kotlin-parcelize'
|
|
||||||
apply plugin: 'com.google.gms.google-services'
|
apply plugin: 'com.google.gms.google-services'
|
||||||
apply plugin: 'com.google.firebase.crashlytics'
|
apply plugin: 'com.google.firebase.crashlytics'
|
||||||
|
|
||||||
@ -10,10 +9,8 @@ apply from: 'git-info.gradle'
|
|||||||
android {
|
android {
|
||||||
compileSdkVersion setup.compileSdk
|
compileSdkVersion setup.compileSdk
|
||||||
|
|
||||||
namespace "pl.szczodrzynski.edziennik"
|
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "pl.szczodrzynski.edziennik"
|
applicationId 'pl.szczodrzynski.edziennik'
|
||||||
minSdkVersion setup.minSdk
|
minSdkVersion setup.minSdk
|
||||||
targetSdkVersion setup.targetSdk
|
targetSdkVersion setup.targetSdk
|
||||||
|
|
||||||
@ -22,9 +19,8 @@ android {
|
|||||||
|
|
||||||
buildConfigField "java.util.Map<String, String>", "GIT_INFO", gitInfoMap
|
buildConfigField "java.util.Map<String, String>", "GIT_INFO", gitInfoMap
|
||||||
buildConfigField "String", "VERSION_BASE", "\"${release.versionName}\""
|
buildConfigField "String", "VERSION_BASE", "\"${release.versionName}\""
|
||||||
|
|
||||||
manifestPlaceholders = [
|
manifestPlaceholders = [
|
||||||
buildTimestamp: String.valueOf(System.currentTimeMillis())
|
buildTimestamp: String.valueOf(System.currentTimeMillis())
|
||||||
]
|
]
|
||||||
|
|
||||||
multiDexEnabled = true
|
multiDexEnabled = true
|
||||||
@ -34,26 +30,12 @@ android {
|
|||||||
cppFlags "-std=c++11"
|
cppFlags "-std=c++11"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
kapt {
|
|
||||||
arguments {
|
|
||||||
arg("room.schemaLocation", "$projectDir/schemas")
|
|
||||||
}
|
|
||||||
|
|
||||||
correctErrorTypes = true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
debug {
|
debug {
|
||||||
getIsDefault().set(true)
|
|
||||||
minifyEnabled = false
|
minifyEnabled = false
|
||||||
applicationIdSuffix = ".debug"
|
|
||||||
manifestPlaceholders = [
|
|
||||||
buildTimestamp: "0"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
release {
|
release {
|
||||||
minifyEnabled = true
|
minifyEnabled = true
|
||||||
shrinkResources = true
|
shrinkResources = true
|
||||||
@ -61,82 +43,51 @@ android {
|
|||||||
proguardFiles fileTree('proguard').asList().toArray()
|
proguardFiles fileTree('proguard').asList().toArray()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
flavorDimensions "platform"
|
||||||
flavorDimensions += "platform"
|
|
||||||
|
|
||||||
productFlavors {
|
productFlavors {
|
||||||
unofficial {
|
main {
|
||||||
getIsDefault().set(true)
|
versionName gitInfo.versionHuman
|
||||||
versionName "${release.versionName}-${gitInfo.versionSuffix}"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
official {}
|
official {}
|
||||||
play {}
|
play {}
|
||||||
}
|
}
|
||||||
|
|
||||||
variantFilter { variant ->
|
variantFilter { variant ->
|
||||||
def flavors = variant.flavors*.name
|
def flavors = variant.flavors*.name
|
||||||
setIgnore(variant.buildType.name == "debug" && !flavors.contains("unofficial") || flavors.contains("main"))
|
setIgnore(variant.buildType.name == "debug" && !flavors.contains("main"))
|
||||||
}
|
|
||||||
|
|
||||||
sourceSets {
|
|
||||||
unofficial {
|
|
||||||
java.srcDirs = ["src/main/java", "src/play-not/java"]
|
|
||||||
manifest.srcFile("src/play-not/AndroidManifest.xml")
|
|
||||||
}
|
|
||||||
|
|
||||||
official {
|
|
||||||
java.srcDirs = ["src/main/java", "src/play-not/java"]
|
|
||||||
manifest.srcFile("src/play-not/AndroidManifest.xml")
|
|
||||||
}
|
|
||||||
|
|
||||||
play {
|
|
||||||
java.srcDirs = ["src/main/java", "src/play/java"]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
}
|
}
|
||||||
|
lintOptions {
|
||||||
|
checkReleaseBuilds = false
|
||||||
|
}
|
||||||
buildFeatures {
|
buildFeatures {
|
||||||
dataBinding = true
|
dataBinding = true
|
||||||
viewBinding = true
|
viewBinding = true
|
||||||
buildConfig = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
coreLibraryDesugaringEnabled = true
|
coreLibraryDesugaringEnabled = true
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
jvmTarget = "1.8"
|
jvmTarget = "1.8"
|
||||||
freeCompilerArgs += "-Xcontext-receivers"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
packagingOptions {
|
packagingOptions {
|
||||||
resources {
|
exclude 'META-INF/library-core_release.kotlin_module'
|
||||||
excludes += ['META-INF/library-core_release.kotlin_module']
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
cmake {
|
cmake {
|
||||||
path "src/main/cpp/CMakeLists.txt"
|
path "src/main/cpp/CMakeLists.txt"
|
||||||
|
version "3.10.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lint {
|
|
||||||
checkReleaseBuilds false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.whenTaskAdded { task ->
|
tasks.whenTaskAdded { task ->
|
||||||
if (!(task.name == "assembleUnofficialRelease" || task.name == "assembleOfficialRelease" || task.name == "signPlayReleaseBundle"))
|
if (!task.name.endsWith("Release") && !task.name.endsWith("ReleaseWithR8"))
|
||||||
return
|
return
|
||||||
|
|
||||||
def renameTaskName = "rename${task.name.capitalize()}"
|
def renameTaskName = "rename${task.name.capitalize()}"
|
||||||
|
|
||||||
def flavor = ""
|
def flavor = ""
|
||||||
@ -146,22 +97,17 @@ tasks.whenTaskAdded { task ->
|
|||||||
flavor = task.name.substring("assemble".length(), task.name.indexOf("Release")).uncapitalize()
|
flavor = task.name.substring("assemble".length(), task.name.indexOf("Release")).uncapitalize()
|
||||||
if (task.name.startsWith("minify"))
|
if (task.name.startsWith("minify"))
|
||||||
flavor = task.name.substring("minify".length(), task.name.indexOf("Release")).uncapitalize()
|
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 != "") {
|
if (flavor != "") {
|
||||||
tasks.register(renameTaskName, Copy) {
|
tasks.create(renameTaskName, Copy) {
|
||||||
dependsOn(task.name)
|
|
||||||
duplicatesStrategy DuplicatesStrategy.FAIL
|
|
||||||
from file("${projectDir}/${flavor}/release/"),
|
from file("${projectDir}/${flavor}/release/"),
|
||||||
file("${projectDir}/build/outputs/apk/${flavor}/release/"),
|
file("${buildDir}/outputs/mapping/${flavor}Release/"),
|
||||||
file("${projectDir}/build/outputs/mapping/${flavor}Release/"),
|
file("${buildDir}/outputs/apk/${flavor}/release/"),
|
||||||
file("${projectDir}/build/outputs/bundle/${flavor}Release/")
|
file("${buildDir}/outputs/bundle/${flavor}Release/")
|
||||||
include "*-release.aab", "*-release.apk", "mapping.txt", "output-metadata.json"
|
include "*.aab", "*.apk", "mapping.txt", "output-metadata.json"
|
||||||
destinationDir file("${projectDir}/release/")
|
destinationDir file("${projectDir}/release/")
|
||||||
rename ".+?\\.(.+)", "Edziennik_${android.defaultConfig.versionName}_${flavor}." + '$1'
|
rename ".+?\\.(.+)", "Edziennik_${android.defaultConfig.versionName}_${flavor}." + '$1'
|
||||||
}
|
}
|
||||||
|
|
||||||
task.finalizedBy(renameTaskName)
|
task.finalizedBy(renameTaskName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -171,30 +117,28 @@ dependencies {
|
|||||||
|
|
||||||
// Language cores
|
// Language cores
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||||
implementation "androidx.multidex:multidex:2.0.1"
|
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5"
|
||||||
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.0.4"
|
|
||||||
|
|
||||||
// Android Jetpack
|
// Android Jetpack
|
||||||
implementation "androidx.appcompat:appcompat:1.7.0"
|
implementation "androidx.appcompat:appcompat:1.2.0"
|
||||||
implementation "androidx.cardview:cardview:1.0.0"
|
implementation "androidx.cardview:cardview:1.0.0"
|
||||||
implementation "androidx.constraintlayout:constraintlayout:2.1.4"
|
implementation "androidx.constraintlayout:constraintlayout:2.0.4"
|
||||||
implementation "androidx.core:core-ktx:1.13.1"
|
implementation "androidx.core:core-ktx:1.3.2"
|
||||||
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.8.2"
|
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.0"
|
||||||
implementation "androidx.navigation:navigation-fragment-ktx:2.7.7"
|
implementation "androidx.navigation:navigation-fragment-ktx:2.3.4"
|
||||||
implementation "androidx.recyclerview:recyclerview:1.3.2"
|
implementation "androidx.recyclerview:recyclerview:1.1.0"
|
||||||
implementation "androidx.room:room-runtime:2.6.1"
|
implementation "androidx.room:room-runtime:2.2.6"
|
||||||
implementation "androidx.room:room-ktx:2.6.1"
|
implementation "androidx.work:work-runtime-ktx:2.5.0"
|
||||||
implementation "androidx.work:work-runtime-ktx:2.9.0"
|
kapt "androidx.room:room-compiler:2.2.6"
|
||||||
kapt "androidx.room:room-compiler:2.6.1"
|
|
||||||
|
|
||||||
// Google design libs
|
// Google design libs
|
||||||
implementation "com.google.android.material:material:1.12.0"
|
implementation "com.google.android.material:material:1.3.0"
|
||||||
implementation "com.google.android.flexbox:flexbox:3.0.0"
|
implementation "com.google.android:flexbox:2.0.1"
|
||||||
|
|
||||||
// Play Services/Firebase
|
// Play Services/Firebase
|
||||||
implementation "com.google.android.gms:play-services-wearable:18.2.0"
|
implementation "com.google.android.gms:play-services-wearable:17.0.0"
|
||||||
implementation("com.google.firebase:firebase-core") { version { strictly "19.0.2" } }
|
implementation "com.google.firebase:firebase-core:18.0.2"
|
||||||
implementation "com.google.firebase:firebase-crashlytics:19.0.1"
|
implementation "com.google.firebase:firebase-crashlytics:17.4.0"
|
||||||
implementation("com.google.firebase:firebase-messaging") { version { strictly "20.1.3" } }
|
implementation("com.google.firebase:firebase-messaging") { version { strictly "20.1.3" } }
|
||||||
|
|
||||||
// OkHttp, Retrofit, Gson, Jsoup
|
// OkHttp, Retrofit, Gson, Jsoup
|
||||||
@ -202,60 +146,55 @@ dependencies {
|
|||||||
implementation "com.squareup.retrofit2:retrofit:2.9.0"
|
implementation "com.squareup.retrofit2:retrofit:2.9.0"
|
||||||
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
|
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
|
||||||
implementation "com.squareup.retrofit2:converter-scalars:2.9.0"
|
implementation "com.squareup.retrofit2:converter-scalars:2.9.0"
|
||||||
implementation 'com.google.code.gson:gson:2.11.0'
|
implementation 'com.google.code.gson:gson:2.8.6'
|
||||||
implementation 'org.jsoup:jsoup:1.14.3'
|
implementation "org.jsoup:jsoup:1.13.1"
|
||||||
implementation "pl.droidsonroids:jspoon:1.3.2"
|
implementation "pl.droidsonroids:jspoon:1.3.2"
|
||||||
implementation "pl.droidsonroids.retrofit2:converter-jspoon:1.3.2"
|
implementation "pl.droidsonroids.retrofit2:converter-jspoon:1.3.2"
|
||||||
|
|
||||||
// Szkolny.eu libraries/forks
|
// Szkolny.eu libraries/forks
|
||||||
implementation project(":navlib")
|
implementation "eu.szkolny:agendacalendarview:1799f8ef47"
|
||||||
implementation "eu.szkolny:android-snowfall:1ca9ea2da3"
|
|
||||||
implementation "eu.szkolny:agendacalendarview:1.0.4"
|
|
||||||
implementation "eu.szkolny:cafebar:5bf0c618de"
|
implementation "eu.szkolny:cafebar:5bf0c618de"
|
||||||
implementation "eu.szkolny.fslogin:lib:2.0.0"
|
implementation "eu.szkolny.fslogin:lib:2.0.0"
|
||||||
implementation "eu.szkolny:material-about-library:1d5ebaf47c"
|
implementation "eu.szkolny:material-about-library:1d5ebaf47c"
|
||||||
implementation "eu.szkolny:mhttp:af4b62e6e9"
|
implementation "eu.szkolny:mhttp:af4b62e6e9"
|
||||||
implementation "eu.szkolny:nachos:0e5dfcaceb"
|
implementation "eu.szkolny:nachos:0e5dfcaceb"
|
||||||
implementation "eu.szkolny.selective-dao:annotation:6a337f9"
|
implementation "eu.szkolny.selective-dao:annotation:27f8f3f194"
|
||||||
officialImplementation "eu.szkolny:ssl-provider:1.0.0"
|
implementation "eu.szkolny:ssl-provider:1.0.0"
|
||||||
unofficialImplementation "eu.szkolny:ssl-provider:1.0.0"
|
implementation "pl.szczodrzynski:navlib:0.8.0"
|
||||||
|
|
||||||
implementation "pl.szczodrzynski:numberslidingpicker:2921225f76"
|
implementation "pl.szczodrzynski:numberslidingpicker:2921225f76"
|
||||||
implementation "pl.szczodrzynski:recyclertablayout:700f980584"
|
implementation "pl.szczodrzynski:recyclertablayout:700f980584"
|
||||||
implementation "pl.szczodrzynski:tachyon:551943a6b5"
|
implementation "pl.szczodrzynski:tachyon:551943a6b5"
|
||||||
kapt "eu.szkolny.selective-dao:codegen:6a337f9"
|
kapt "eu.szkolny.selective-dao:codegen:27f8f3f194"
|
||||||
|
|
||||||
// Iconics & related
|
// Iconics & related
|
||||||
implementation "com.mikepenz:iconics-core:5.3.2"
|
implementation "com.mikepenz:iconics-core:5.3.0-b01"
|
||||||
implementation "com.mikepenz:iconics-views:5.3.2"
|
implementation "com.mikepenz:iconics-views:5.3.0-b01"
|
||||||
implementation "com.mikepenz:materialdrawer:9.0.1"
|
|
||||||
implementation "com.mikepenz:community-material-typeface:5.8.55.0-kotlin@aar"
|
implementation "com.mikepenz:community-material-typeface:5.8.55.0-kotlin@aar"
|
||||||
implementation 'com.mikepenz:google-material-typeface:4.0.0.2-kotlin@aar'
|
implementation "eu.szkolny:szkolny-font:1.3"
|
||||||
implementation "eu.szkolny:szkolny-font:95eabe7"
|
|
||||||
|
|
||||||
// Other dependencies
|
// Other dependencies
|
||||||
implementation "cat.ereza:customactivityoncrash:2.3.0"
|
implementation "cat.ereza:customactivityoncrash:2.3.0"
|
||||||
implementation "com.android.volley:volley:1.2.1"
|
implementation "com.applandeo:material-calendar-view:1.5.0"
|
||||||
implementation "com.daimajia.swipelayout:library:1.2.0@aar"
|
implementation "com.daimajia.swipelayout:library:1.2.0@aar"
|
||||||
implementation "com.github.Applandeo:Material-Calendar-View:15de569cbc" // https://github.com/Applandeo/Material-Calendar-View
|
implementation "com.github.antonKozyriatskyi:CircularProgressIndicator:1.2.2"
|
||||||
implementation "com.github.CanHub:Android-Image-Cropper:2.2.2" // https://github.com/CanHub/Android-Image-Cropper
|
implementation "com.github.bassaer:chatmessageview:2.0.1"
|
||||||
implementation "com.github.ChuckerTeam.Chucker:library:3.5.2" // https://github.com/ChuckerTeam/chucker
|
implementation "com.github.CanHub:Android-Image-Cropper:2.2.2"
|
||||||
implementation "com.github.antonKozyriatskyi:CircularProgressIndicator:1.2.2" // https://github.com/antonKozyriatskyi/CircularProgressIndicator
|
implementation "com.github.ChuckerTeam.Chucker:library:3.0.1"
|
||||||
implementation "com.github.bassaer:chatmessageview:2.0.1" // https://github.com/bassaer/ChatMessageView
|
implementation "com.github.jetradarmobile:android-snowfall:1.2.0"
|
||||||
implementation "com.github.smuyyh:JsonViewer:V1.0.6" // https://github.com/smuyyh/JsonViewer
|
implementation "com.github.wulkanowy.uonet-request-signer:hebe-jvm:a99ca50a31"
|
||||||
implementation "com.github.underwindfall.PowerPermission:powerpermission-coroutines:1.4.0" // https://github.com/underwindfall/PowerPermission
|
implementation("com.heinrichreimersoftware:material-intro") { version { strictly "1.5.8" } }
|
||||||
implementation "com.github.underwindfall.PowerPermission:powerpermission:1.4.0" // https://github.com/underwindfall/PowerPermission
|
implementation "com.hypertrack:hyperlog:0.0.10"
|
||||||
implementation "com.github.wulkanowy.uonet-request-signer:hebe-jvm:a99ca50a31" // https://github.com/wulkanowy/uonet-request-signer
|
|
||||||
implementation 'com.jakewharton.timber:timber:5.0.1'
|
|
||||||
implementation "com.jaredrummler:colorpicker:1.1.0"
|
implementation "com.jaredrummler:colorpicker:1.1.0"
|
||||||
|
implementation "com.qifan.powerpermission:powerpermission-coroutines:1.3.0"
|
||||||
|
implementation "com.qifan.powerpermission:powerpermission:1.3.0"
|
||||||
|
implementation "com.yuyh.json:jsonviewer:1.0.6"
|
||||||
implementation "io.coil-kt:coil:1.1.1"
|
implementation "io.coil-kt:coil:1.1.1"
|
||||||
implementation "me.dm7.barcodescanner:zxing:1.9.8"
|
implementation "me.dm7.barcodescanner:zxing:1.9.8"
|
||||||
implementation "me.grantland:autofittextview:0.2.1"
|
implementation "me.grantland:autofittextview:0.2.1"
|
||||||
implementation "me.leolin:ShortcutBadger:1.1.22@aar"
|
implementation "me.leolin:ShortcutBadger:1.1.22@aar"
|
||||||
implementation "org.greenrobot:eventbus:3.2.0"
|
implementation "org.greenrobot:eventbus:3.2.0"
|
||||||
implementation("com.heinrichreimersoftware:material-intro") { version { strictly "1.5.8" } }
|
|
||||||
implementation("pl.droidsonroids.gif:android-gif-drawable") { version { strictly "1.2.15" } }
|
implementation("pl.droidsonroids.gif:android-gif-drawable") { version { strictly "1.2.15" } }
|
||||||
|
|
||||||
// Debug-only dependencies
|
// Debug-only dependencies
|
||||||
debugImplementation "com.github.amitshekhariitbhu.Android-Debug-Database:debug-db:v1.0.6"
|
debugImplementation "com.amitshekhar.android:debug-db:1.0.5"
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
buildscript {
|
buildscript {
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
jcenter()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath "org.eclipse.jgit:org.eclipse.jgit:5.5.+"
|
classpath "org.eclipse.jgit:org.eclipse.jgit:5.5.+"
|
||||||
@ -97,17 +97,18 @@ private def buildGitInfo() {
|
|||||||
def tag = getLastTag(repo, git, head)
|
def tag = getLastTag(repo, git, head)
|
||||||
def tagName = tag[1]
|
def tagName = tag[1]
|
||||||
def tagRevCount = tag[2]
|
def tagRevCount = tag[2]
|
||||||
|
def versionName = tagName.replace("v", "")
|
||||||
|
|
||||||
def result = [
|
def result = [
|
||||||
hash : head.objectId.name,
|
hash : head.objectId.name,
|
||||||
branch : repo.branch,
|
branch : repo.branch,
|
||||||
dirty : dirty,
|
dirty : dirty,
|
||||||
remotes : remotes,
|
remotes : remotes,
|
||||||
unstaged : status.uncommittedChanges.join("; "),
|
unstaged : status.uncommittedChanges.join("; "),
|
||||||
tag : tagName,
|
tag : tagName,
|
||||||
revCount : tagRevCount,
|
revCount : tagRevCount,
|
||||||
version : """$tagName-$tagRevCount-g${head.objectId.name.substring(0, 8)}""" + (dirty ? ".dirty" : ""),
|
version : """$tagName-$tagRevCount-g${head.objectId.name.substring(0, 8)}""" + (dirty ? ".dirty" : ""),
|
||||||
versionSuffix : """${repo.branch.replace("/", "_")}""" + (dirty ? ".dirty" : "")
|
versionHuman: """$versionName-${repo.branch.replace("/", "_")}""" + (dirty ? ".dirty" : "")
|
||||||
]
|
]
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
@ -36,37 +36,6 @@
|
|||||||
"status": 2
|
"status": 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
"client_info": {
|
|
||||||
"mobilesdk_app_id": "1:640759989760:android:4aa71407b25cdc8d",
|
|
||||||
"android_client_info": {
|
|
||||||
"package_name": "pl.szczodrzynski.edziennik.debug"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"oauth_client": [
|
|
||||||
{
|
|
||||||
"client_id": "640759989760-6f8q00u864lnuh3gh36e8g4cer9lv8pv.apps.googleusercontent.com",
|
|
||||||
"client_type": 3
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"api_key": [
|
|
||||||
{
|
|
||||||
"current_key": "AIzaSyAvq9HMPxulz9ntdAHZ0eZuPf2YQs4nDSU"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"services": {
|
|
||||||
"analytics_service": {
|
|
||||||
"status": 1
|
|
||||||
},
|
|
||||||
"appinvite_service": {
|
|
||||||
"status": 1,
|
|
||||||
"other_platform_oauth_client": []
|
|
||||||
},
|
|
||||||
"ads_service": {
|
|
||||||
"status": 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"configuration_version": "1"
|
"configuration_version": "1"
|
||||||
|
43
app/proguard-rules.pro
vendored
@ -19,46 +19,23 @@
|
|||||||
# If you keep the line number information, uncomment this to
|
# If you keep the line number information, uncomment this to
|
||||||
# hide the original source file name.
|
# hide the original source file name.
|
||||||
#-renamesourcefileattribute SourceFile
|
#-renamesourcefileattribute SourceFile
|
||||||
-keepattributes Signature
|
|
||||||
-keep class android.support.v7.widget.** { *; }
|
-keep class android.support.v7.widget.** { *; }
|
||||||
-keep class com.google.gson.reflect.TypeToken { *; }
|
|
||||||
-keep class * extends com.google.gson.reflect.TypeToken
|
|
||||||
|
|
||||||
-keep class pl.szczodrzynski.edziennik.utils.models.** { *; }
|
-keep class pl.szczodrzynski.edziennik.utils.models.** { *; }
|
||||||
-keep class pl.szczodrzynski.edziennik.data.enums.* { *; }
|
|
||||||
-keep class pl.szczodrzynski.edziennik.data.db.entity.Event { *; }
|
-keep class pl.szczodrzynski.edziennik.data.db.entity.Event { *; }
|
||||||
-keep class pl.szczodrzynski.edziennik.data.db.full.EventFull { *; }
|
-keep class pl.szczodrzynski.edziennik.data.db.full.EventFull { *; }
|
||||||
-keep class pl.szczodrzynski.edziennik.data.db.entity.FeedbackMessage { *; }
|
-keep class pl.szczodrzynski.edziennik.data.db.entity.FeedbackMessage { *; }
|
||||||
-keep class pl.szczodrzynski.edziennik.data.db.entity.Note { *; }
|
-keep class pl.szczodrzynski.edziennik.ui.modules.home.HomeCardModel { *; }
|
||||||
-keep class pl.szczodrzynski.edziennik.ui.home.HomeCardModel { *; }
|
|
||||||
-keepclassmembers class pl.szczodrzynski.edziennik.ui.widgets.WidgetConfig { public *; }
|
-keepclassmembers class pl.szczodrzynski.edziennik.ui.widgets.WidgetConfig { public *; }
|
||||||
-keepnames class pl.szczodrzynski.edziennik.ui.widgets.timetable.WidgetTimetableProvider
|
-keepnames class pl.szczodrzynski.edziennik.ui.widgets.timetable.WidgetTimetableProvider
|
||||||
-keepnames class pl.szczodrzynski.edziennik.ui.widgets.notifications.WidgetNotificationsProvider
|
-keepnames class pl.szczodrzynski.edziennik.ui.widgets.notifications.WidgetNotificationsProvider
|
||||||
-keepnames class pl.szczodrzynski.edziennik.ui.widgets.luckynumber.WidgetLuckyNumberProvider
|
-keepnames class pl.szczodrzynski.edziennik.ui.widgets.luckynumber.WidgetLuckyNumberProvider
|
||||||
-keep class pl.szczodrzynski.edziennik.data.config.AppData { *; }
|
|
||||||
-keep class pl.szczodrzynski.edziennik.data.config.AppData$** { *; }
|
|
||||||
-keep class pl.szczodrzynski.edziennik.core.manager.TextStylingManager$HtmlMode { *; }
|
|
||||||
|
|
||||||
-keepnames class androidx.appcompat.view.menu.MenuBuilder { setHeaderTitleInt(java.lang.CharSequence); }
|
-keepnames class androidx.appcompat.view.menu.MenuBuilder { setHeaderTitleInt(java.lang.CharSequence); }
|
||||||
-keepnames class androidx.appcompat.view.menu.MenuPopupHelper { showPopup(int, int, boolean, boolean); }
|
|
||||||
-keepclassmembernames class androidx.appcompat.view.menu.StandardMenuPopup { private *; }
|
-keepclassmembernames class androidx.appcompat.view.menu.StandardMenuPopup { private *; }
|
||||||
-keepclassmembernames class androidx.appcompat.view.menu.MenuItemImpl { private *; }
|
-keepnames class androidx.appcompat.view.menu.MenuPopupHelper { showPopup(int, int, boolean, boolean); }
|
||||||
|
|
||||||
-keepclassmembernames class com.mikepenz.materialdrawer.widget.MiniDrawerSliderView { private *; }
|
-keepclassmembernames class com.mikepenz.materialdrawer.widget.MiniDrawerSliderView { private *; }
|
||||||
-keepclassmembernames class com.mikepenz.iconics.internal.IconicsViewsAttrsApplier {
|
|
||||||
<fields>;
|
|
||||||
readIconicsTextView(android.content.Context, android.util.AttributeSet, com.mikepenz.iconics.internal.CompoundIconsBundle);
|
|
||||||
getIconicsImageViewDrawable(android.content.Context, android.util.AttributeSet);
|
|
||||||
}
|
|
||||||
|
|
||||||
-keepclassmembernames class com.mikepenz.iconics.internal.CompoundIconsBundle {
|
|
||||||
setIcons(android.widget.TextView);
|
|
||||||
}
|
|
||||||
|
|
||||||
# for RecyclerTabView
|
|
||||||
-keepclassmembernames class com.google.android.material.tabs.TabLayout { *; }
|
|
||||||
-keepclassmembernames class com.google.android.material.tabs.TabLayout$TabView { *; }
|
|
||||||
-keepclassmembernames class com.google.android.material.tabs.TabIndicatorInterpolator { *; }
|
|
||||||
|
|
||||||
-keep class .R
|
-keep class .R
|
||||||
-keep class **.R$* {
|
-keep class **.R$* {
|
||||||
@ -72,19 +49,8 @@
|
|||||||
|
|
||||||
-keep class com.google.android.material.tabs.** {*;}
|
-keep class com.google.android.material.tabs.** {*;}
|
||||||
|
|
||||||
# Exclude AgendaCalendarView
|
|
||||||
# Preserve generic type information for EventRenderer and its subclasses
|
|
||||||
-keepclassmembers class * extends com.github.tibolte.agendacalendarview.render.EventRenderer {
|
|
||||||
<fields>;
|
|
||||||
<methods>;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Keep the EventRenderer class itself and all its subclasses
|
|
||||||
-keep class com.github.tibolte.agendacalendarview.render.EventRenderer
|
|
||||||
-keep class * extends com.github.tibolte.agendacalendarview.render.EventRenderer
|
|
||||||
|
|
||||||
# ServiceLoader support
|
# ServiceLoader support
|
||||||
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
|
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
|
||||||
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
|
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
|
||||||
|
|
||||||
# Most of volatile fields are updated with AFU and should not be mangled
|
# Most of volatile fields are updated with AFU and should not be mangled
|
||||||
@ -98,10 +64,9 @@
|
|||||||
|
|
||||||
-keep class pl.szczodrzynski.edziennik.data.api.szkolny.interceptor.Signing { public final byte[] pleaseStopRightNow(java.lang.String, long); }
|
-keep class pl.szczodrzynski.edziennik.data.api.szkolny.interceptor.Signing { public final byte[] pleaseStopRightNow(java.lang.String, long); }
|
||||||
|
|
||||||
-keepclassmembers class pl.szczodrzynski.edziennik.ui.login.qr.* { *; }
|
|
||||||
-keepclassmembers class pl.szczodrzynski.edziennik.data.api.szkolny.request.** { *; }
|
-keepclassmembers class pl.szczodrzynski.edziennik.data.api.szkolny.request.** { *; }
|
||||||
-keepclassmembers class pl.szczodrzynski.edziennik.data.api.szkolny.response.** { *; }
|
-keepclassmembers class pl.szczodrzynski.edziennik.data.api.szkolny.response.** { *; }
|
||||||
-keepclassmembernames class pl.szczodrzynski.edziennik.ui.login.LoginInfo$Platform { *; }
|
-keepclassmembernames class pl.szczodrzynski.edziennik.ui.modules.login.LoginInfo$Platform { *; }
|
||||||
|
|
||||||
-keepclassmembernames class pl.szczodrzynski.fslogin.realm.RealmData { *; }
|
-keepclassmembernames class pl.szczodrzynski.fslogin.realm.RealmData { *; }
|
||||||
-keepclassmembernames class pl.szczodrzynski.fslogin.realm.RealmData$Type { *; }
|
-keepclassmembernames class pl.szczodrzynski.fslogin.realm.RealmData$Type { *; }
|
||||||
|
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 9.6 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 874 B |
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 5.1 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 6.9 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 7.0 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 7.3 KiB |
Before Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 9.2 KiB |
Before Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 9.4 KiB |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 24 KiB |
@ -1,7 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
package="pl.szczodrzynski.edziennik">
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
@ -11,21 +13,19 @@
|
|||||||
<uses-permission android:name="android.permission.VIBRATE" />
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
|
|
||||||
<!-- PowerPermission uses minSdk 21, it's safe to override as it is used only in >= 23 -->
|
<!-- PowerPermission uses minSdk 21, it's safe to override as it is used only in >= 23 -->
|
||||||
<uses-sdk
|
<uses-sdk tools:overrideLibrary="com.qifan.powerpermission.coroutines, com.qifan.powerpermission.core" />
|
||||||
tools:overrideLibrary="com.qifan.powerpermission.coroutines, com.qifan.powerpermission.core, com.mikepenz:materialdrawer, com.mikepenz.iconics.typeface.library.navlibfont, androidx.appcompat.resources, androidx.appcompat, com.google.android.gms.wearable, com.google.android.gms.base, com.google.firebase.crashlytics, com.google.firebase.sessions, com.google.firebase.ktx, com.google.firebase, com.google.android.gms.tasks, com.google.android.gms.common, com.google.firebase.components" />
|
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".App"
|
android:name=".App"
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:fullBackupContent="@xml/backup_descriptor"
|
android:fullBackupContent="@xml/backup_descriptor"
|
||||||
android:icon="@mipmap/ic_launcher_v5"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:networkSecurityConfig="@xml/network_security_config"
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/AppTheme.M3.Blue"
|
android:theme="@style/AppTheme.Dark"
|
||||||
android:usesCleartextTraffic="true"
|
android:usesCleartextTraffic="true"
|
||||||
tools:ignore="UnusedAttribute">
|
tools:ignore="UnusedAttribute">
|
||||||
|
|
||||||
@ -41,8 +41,8 @@
|
|||||||
|___/ -->
|
|___/ -->
|
||||||
<activity android:name=".MainActivity"
|
<activity android:name=".MainActivity"
|
||||||
android:configChanges="orientation|screenSize"
|
android:configChanges="orientation|screenSize"
|
||||||
|
android:label="@string/app_name"
|
||||||
android:launchMode="singleTop"
|
android:launchMode="singleTop"
|
||||||
android:exported="true"
|
|
||||||
android:theme="@style/SplashTheme">
|
android:theme="@style/SplashTheme">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
@ -66,16 +66,14 @@
|
|||||||
android:configChanges="orientation|keyboardHidden"
|
android:configChanges="orientation|keyboardHidden"
|
||||||
android:excludeFromRecents="true"
|
android:excludeFromRecents="true"
|
||||||
android:noHistory="true"
|
android:noHistory="true"
|
||||||
android:exported="true"
|
android:theme="@style/AppTheme.Dark.NoDisplay">
|
||||||
android:theme="@style/AppTheme.M3.NoDisplay">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
|
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<!-- TIMETABLE -->
|
<!-- TIMETABLE -->
|
||||||
<receiver android:name=".ui.widgets.timetable.WidgetTimetableProvider"
|
<receiver android:name=".ui.widgets.timetable.WidgetTimetableProvider"
|
||||||
android:label="@string/widget_timetable_title"
|
android:label="@string/widget_timetable_title">
|
||||||
android:exported="true">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
@ -84,18 +82,16 @@
|
|||||||
android:resource="@xml/widget_timetable_info" />
|
android:resource="@xml/widget_timetable_info" />
|
||||||
</receiver>
|
</receiver>
|
||||||
<service android:name=".ui.widgets.timetable.WidgetTimetableService"
|
<service android:name=".ui.widgets.timetable.WidgetTimetableService"
|
||||||
android:permission="android.permission.BIND_REMOTEVIEWS" android:foregroundServiceType="dataSync"/>
|
android:permission="android.permission.BIND_REMOTEVIEWS" />
|
||||||
<activity android:name=".ui.widgets.LessonDialogActivity"
|
<activity android:name=".ui.widgets.LessonDialogActivity"
|
||||||
android:label=""
|
android:label=""
|
||||||
android:configChanges="orientation|keyboardHidden"
|
android:configChanges="orientation|keyboardHidden"
|
||||||
android:excludeFromRecents="true"
|
android:excludeFromRecents="true"
|
||||||
android:noHistory="true"
|
android:noHistory="true"
|
||||||
android:exported="true"
|
android:theme="@style/AppTheme.Dark.NoDisplay" />
|
||||||
android:theme="@style/AppTheme.M3.NoDisplay" />
|
|
||||||
<!-- NOTIFICATIONS -->
|
<!-- NOTIFICATIONS -->
|
||||||
<receiver android:name=".ui.widgets.notifications.WidgetNotificationsProvider"
|
<receiver android:name=".ui.widgets.notifications.WidgetNotificationsProvider"
|
||||||
android:label="@string/widget_notifications_title"
|
android:label="@string/widget_notifications_title">
|
||||||
android:exported="true">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
@ -105,11 +101,10 @@
|
|||||||
android:resource="@xml/widget_notifications_info" />
|
android:resource="@xml/widget_notifications_info" />
|
||||||
</receiver>
|
</receiver>
|
||||||
<service android:name=".ui.widgets.notifications.WidgetNotificationsService"
|
<service android:name=".ui.widgets.notifications.WidgetNotificationsService"
|
||||||
android:permission="android.permission.BIND_REMOTEVIEWS" android:foregroundServiceType="dataSync"/>
|
android:permission="android.permission.BIND_REMOTEVIEWS" />
|
||||||
<!-- LUCKY NUMBER -->
|
<!-- LUCKY NUMBER -->
|
||||||
<receiver android:name=".ui.widgets.luckynumber.WidgetLuckyNumberProvider"
|
<receiver android:name=".ui.widgets.luckynumber.WidgetLuckyNumberProvider"
|
||||||
android:label="@string/widget_lucky_number_title"
|
android:label="@string/widget_lucky_number_title">
|
||||||
android:exported="true">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
@ -126,44 +121,31 @@
|
|||||||
/ ____ \ (__| |_| |\ V /| | |_| | __/\__ \
|
/ ____ \ (__| |_| |\ V /| | |_| | __/\__ \
|
||||||
/_/ \_\___|\__|_| \_/ |_|\__|_|\___||___/
|
/_/ \_\___|\__|_| \_/ |_|\__|_|\___||___/
|
||||||
-->
|
-->
|
||||||
<activity android:name=".ui.main.CrashActivity"
|
<activity android:name=".ui.modules.base.CrashActivity"
|
||||||
android:configChanges="orientation|screenSize|keyboardHidden"
|
android:configChanges="orientation|screenSize|keyboardHidden"
|
||||||
android:process=":error_activity"
|
android:process=":error_activity"
|
||||||
android:exported="false"
|
|
||||||
android:theme="@style/DeadTheme" />
|
android:theme="@style/DeadTheme" />
|
||||||
<activity android:name=".ui.intro.ChangelogIntroActivity"
|
<activity android:name=".ui.modules.intro.ChangelogIntroActivity"
|
||||||
android:configChanges="orientation|keyboardHidden"
|
android:configChanges="orientation|keyboardHidden"
|
||||||
android:exported="false"
|
android:label="@string/app_name"
|
||||||
android:theme="@style/Theme.Intro" />
|
android:theme="@style/Theme.Intro" />
|
||||||
<activity android:name=".ui.login.LoginActivity"
|
<activity android:name=".ui.modules.login.LoginActivity"
|
||||||
android:configChanges="orientation|screenSize"
|
android:configChanges="orientation|screenSize"
|
||||||
android:launchMode="singleTop"
|
android:launchMode="singleTop"
|
||||||
android:exported="false"
|
android:theme="@style/AppTheme.Light" />
|
||||||
android:theme="@style/AppTheme.M3" />
|
<activity android:name=".ui.modules.home.CounterActivity"
|
||||||
<activity android:name=".ui.home.CounterActivity"
|
android:theme="@style/AppTheme.Black" />
|
||||||
android:exported="false"
|
<activity android:name=".ui.modules.feedback.FeedbackActivity"
|
||||||
android:theme="@style/AppTheme.M3" />
|
|
||||||
<activity android:name=".ui.feedback.FeedbackActivity"
|
|
||||||
android:configChanges="orientation|screenSize|keyboardHidden"
|
android:configChanges="orientation|screenSize|keyboardHidden"
|
||||||
android:exported="false"
|
android:label="@string/app_name"
|
||||||
android:theme="@style/AppTheme.M3" />
|
android:theme="@style/AppTheme" />
|
||||||
<activity android:name=".ui.settings.SettingsLicenseActivity"
|
<activity android:name=".ui.modules.settings.SettingsLicenseActivity"
|
||||||
android:configChanges="orientation|keyboardHidden"
|
android:configChanges="orientation|keyboardHidden"
|
||||||
android:exported="false"
|
android:theme="@style/AppTheme" />
|
||||||
android:theme="@style/AppTheme.M3" />
|
|
||||||
<activity android:name="com.canhub.cropper.CropImageActivity"
|
<activity android:name="com.canhub.cropper.CropImageActivity"
|
||||||
android:configChanges="orientation|keyboardHidden"
|
android:configChanges="orientation|keyboardHidden"
|
||||||
android:exported="false"
|
|
||||||
android:theme="@style/Base.Theme.AppCompat" />
|
android:theme="@style/Base.Theme.AppCompat" />
|
||||||
<activity android:name=".ui.login.oauth.OAuthLoginActivity"
|
<activity android:name=".ui.modules.base.BuildInvalidActivity" />
|
||||||
android:configChanges="orientation|keyboardHidden"
|
|
||||||
android:exported="false"
|
|
||||||
android:theme="@style/Theme.MaterialComponents.Light.DarkActionBar" />
|
|
||||||
<activity android:name=".ui.login.recaptcha.RecaptchaActivity"
|
|
||||||
android:configChanges="orientation|keyboardHidden"
|
|
||||||
android:exported="false"
|
|
||||||
android:theme="@style/Theme.MaterialComponents.Light.DarkActionBar" />
|
|
||||||
<activity android:name=".ui.main.BuildInvalidActivity" android:exported="false" />
|
|
||||||
|
|
||||||
<!-- _____ _
|
<!-- _____ _
|
||||||
| __ \ (_)
|
| __ \ (_)
|
||||||
@ -172,20 +154,18 @@
|
|||||||
| | \ \ __/ (_| __/ |\ V / __/ | \__ \
|
| | \ \ __/ (_| __/ |\ V / __/ | \__ \
|
||||||
|_| \_\___|\___\___|_| \_/ \___|_| |___/
|
|_| \_\___|\___\___|_| \_/ \___|_| |___/
|
||||||
-->
|
-->
|
||||||
<receiver android:name=".core.receiver.UserPresentReceiver"
|
<receiver android:name=".receivers.UserPresentReceiver"
|
||||||
android:enabled="true"
|
android:enabled="true">
|
||||||
android:exported="true">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.USER_PRESENT" />
|
<action android:name="android.intent.action.USER_PRESENT" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
<receiver android:name=".sync.UpdateDownloaderService$DownloadProgressReceiver"
|
<receiver android:name=".sync.UpdateDownloaderService$DownloadProgressReceiver">
|
||||||
android:exported="true">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
|
<action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
<receiver android:name=".core.receiver.SzkolnyReceiver"
|
<receiver android:name=".receivers.SzkolnyReceiver"
|
||||||
android:exported="true">
|
android:exported="true">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="pl.szczodrzynski.edziennik.SZKOLNY_MAIN" />
|
<action android:name="pl.szczodrzynski.edziennik.SZKOLNY_MAIN" />
|
||||||
@ -199,15 +179,15 @@
|
|||||||
____) | __/ | \ V /| | (_| __/\__ \
|
____) | __/ | \ V /| | (_| __/\__ \
|
||||||
|_____/ \___|_| \_/ |_|\___\___||___/
|
|_____/ \___|_| \_/ |_|\___\___||___/
|
||||||
-->
|
-->
|
||||||
<service android:name=".data.api.ApiService" android:foregroundServiceType="dataSync"/>
|
<service android:name=".data.api.ApiService" />
|
||||||
<service android:name=".core.firebase.MyFirebaseService"
|
<service android:name=".data.firebase.MyFirebaseService"
|
||||||
android:exported="false" android:foregroundServiceType="dataSync">
|
android:exported="false">
|
||||||
<intent-filter android:priority="10000000">
|
<intent-filter android:priority="10000000">
|
||||||
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
|
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</service>
|
</service>
|
||||||
<service android:name=".sync.UpdateDownloaderService" android:foregroundServiceType="dataSync"/>
|
<service android:name=".sync.UpdateDownloaderService" />
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
_____ _ _
|
_____ _ _
|
||||||
|
@ -1,11 +1,15 @@
|
|||||||
<h3>Wersja 4.14, 2025-02-02</h3>
|
<h3>Wersja 4.7-rc.2, 2021-04-05</h3>
|
||||||
<ul>
|
<ul>
|
||||||
<li>USOS: <b>dodano obsługę ocen</b>.</li>
|
<li><u>Szkolny.eu jest teraz open source!</u> Zapraszamy na stronę <a href="https://szkolny.eu/">https://szkolny.eu/</a> po więcej ważnych informacji.</li>
|
||||||
<li>USOS: obliczanie średniej za studia oraz punktów ECTS.</li>
|
<li>Poprawiono wybieranie obrazków (tła nagłówka, tła aplikacji oraz profilu) z dowolnego źródła.</li>
|
||||||
<li>USOS: poprawiono brak planu zajęć po rozpoczęciu roku.</li>
|
<li>Zaktualizowano tłumaczenie na język angielski. @MarcinK50</li>
|
||||||
<li>Wyłączono archiwizator profili.</li>
|
<li>Dodano ekran informacji o kompilacji w Ustawieniach.</li>
|
||||||
|
<li>Zaktualizowano ekran licencji open source.</li>
|
||||||
|
<li>Naprawiono zatrzymanie aplikacji na Androidzie 4.4 i starszych.</li>
|
||||||
|
<li>Naprawiono problemy z połączeniem internetowym na Androidzie 4.4 i starszych.</li>
|
||||||
|
<li>Zoptymalizowano wielkość aplikacji.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
Dzięki za korzystanie ze Szkolnego!<br>
|
Dzięki za korzystanie ze Szkolnego!<br>
|
||||||
<i>© [Kuba Szczodrzyński](@kuba2k2) 2025</i>
|
<i>© [Kuba Szczodrzyński](@kuba2k2), [Kacper Ziubryniewicz](@kapi2289) 2021</i>
|
||||||
|