From af2f25ed28f74fbeef706e30ddefcc5a524a7c30 Mon Sep 17 00:00:00 2001 From: PianoNic <79938743+Pianonic@users.noreply.github.com> Date: Fri, 6 Nov 2026 16:45:24 +0100 Subject: [PATCH] Add the tool that captures and frames the app screenshots --- README.md | 2 + tools/store-screenshots/.gitattributes | 1 + tools/store-screenshots/.gitignore | 2 + tools/store-screenshots/README.md | 65 ++++++ tools/store-screenshots/capture.sh | 117 ++++++++++ tools/store-screenshots/deviceart/LICENSE.txt | 177 ++++++++++++++ tools/store-screenshots/deviceart/back.webp | Bin 0 -> 99652 bytes tools/store-screenshots/fake-api/avatar.py | 35 +++ tools/store-screenshots/fake-api/server.ts | 219 ++++++++++++++++++ .../store-screenshots/fake-api/static/mia.jpg | Bin 0 -> 16501 bytes tools/store-screenshots/frame.py | 47 ++++ tools/store-screenshots/requirements.txt | 2 + tools/store-screenshots/ui.sh | 16 ++ 13 files changed, 683 insertions(+) create mode 100644 tools/store-screenshots/.gitattributes create mode 100644 tools/store-screenshots/.gitignore create mode 100644 tools/store-screenshots/README.md create mode 100644 tools/store-screenshots/capture.sh create mode 100644 tools/store-screenshots/deviceart/LICENSE.txt create mode 100644 tools/store-screenshots/deviceart/back.webp create mode 100644 tools/store-screenshots/fake-api/avatar.py create mode 100644 tools/store-screenshots/fake-api/server.ts create mode 100644 tools/store-screenshots/fake-api/static/mia.jpg create mode 100644 tools/store-screenshots/frame.py create mode 100644 tools/store-screenshots/requirements.txt create mode 100644 tools/store-screenshots/ui.sh diff --git a/README.md b/README.md index 83819a1..0807d98 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,8 @@ bun run dev You need Flutter and [bun](https://bun.sh). The dev build talks to a server on `http://localhost:5033`. The rest is in [the app docs](https://docs.schuly.dev/Schuly/). +The app screenshots for the website and store listings come from [`tools/store-screenshots`](tools/store-screenshots). + ## License [PolyForm Noncommercial 1.0.0](LICENSE) diff --git a/tools/store-screenshots/.gitattributes b/tools/store-screenshots/.gitattributes new file mode 100644 index 0000000..dfdb8b7 --- /dev/null +++ b/tools/store-screenshots/.gitattributes @@ -0,0 +1 @@ +*.sh text eol=lf diff --git a/tools/store-screenshots/.gitignore b/tools/store-screenshots/.gitignore new file mode 100644 index 0000000..cc0899e --- /dev/null +++ b/tools/store-screenshots/.gitignore @@ -0,0 +1,2 @@ +.venv/ +out/ diff --git a/tools/store-screenshots/README.md b/tools/store-screenshots/README.md new file mode 100644 index 0000000..a832a96 --- /dev/null +++ b/tools/store-screenshots/README.md @@ -0,0 +1,65 @@ +# Store screenshots + +Takes the app screenshots on an Android emulator and frames them in a Pixel phone. The website uses the five framed images: `public/assets/schuly-{start,agenda,grades,absences,account}-page-v2.{png,webp}` in SchulyWebsite. The same raw shots can go into store listings. + +The app runs against a fake API with made-up data (Mia Muster, Berufsfachschule Beispielstadt), so no real account or school is involved. + +| File | What it does | +|---|---| +| `fake-api/server.ts` | Bun server that answers the app's `/auth` and `/api` calls with fixed data on port 5591 (`PORT=` to change). It accepts any sign-in. | +| `fake-api/avatar.py` | Draws the made-up profile picture `fake-api/static/mia.jpg` (already committed). | +| `capture.sh` | Emulator, build, sign-in, capture and framing steps. | +| `ui.sh` | Lists the on-screen elements and their bounds, for when the tap coordinates in `capture.sh` need updating. | +| `frame.py` | Puts a 1080×2400 screenshot into the Pixel 9 Pro XL device art and scales it to 660×1394. | +| `deviceart/` | The device art (`back.webp`, 100 kB) and its licence. | + +## Prerequisites + +- Bun. +- Flutter, as for building the app. +- The Android SDK with `sdkmanager`, `avdmanager`, `emulator` and `adb` on `PATH`, and hardware acceleration for the emulator. +- Python 3 with a virtual environment for the framing: + + ```sh + cd tools/store-screenshots + python -m venv .venv + .venv/Scripts/pip install -r requirements.txt # on macOS/Linux: .venv/bin/pip + ``` + +- A bash shell. On Windows, use Git Bash. + +## Regenerate + +Run these from the repo root. Start the fake API in its own terminal and leave it running: + +```sh +bun tools/store-screenshots/fake-api/server.ts +``` + +Then run the steps, all at once or one by one: + +```sh +tools/store-screenshots/capture.sh all # avd boot build prepare login shoot frame +tools/store-screenshots/capture.sh cleanup # stop the emulator and delete the AVD +``` + +| Step | What it does | +|---|---| +| `avd` | Creates `SchulyShots_Pixel8_API35`: a Pixel 8 (1080×2400) with `system-images;android-35;google_apis;x86_64`, 2 GB RAM. The Google APIs image is needed because `adb root` must work to set the clock. | +| `boot` | Starts it on port 5580 (`emulator-5580`) with `-no-snapshot -gpu host -memory 2048` and waits for the boot to finish. | +| `build` | `flutter build apk --flavor dev --release --target-platform android-x64 --dart-define=BACKEND_BASE_URL=http://10.0.2.2:5591`. `10.0.2.2` is how the emulator reaches the host. | +| `prepare` | Installs the APK, turns off automatic time, sets the timezone to Europe/Zurich, the clock to Fri 6.11.2026 09:41 and 24-hour format, turns dark mode on and enters the status bar demo mode. | +| `login` | Taps through onboarding and signs in as `mia.muster` in account mode. | +| `shoot` | Restarts the app, then saves home, grades, absences, account and the timetable on Tue 10.11. to `out/raw/*.png` with `adb exec-out screencap`. Before each shot it resets the clock to 09:41, full Wi-Fi, no mobile signal and no notifications. | +| `frame` | Writes `out/framed/schuly--page-v2.png` and `.webp`. | + +Copy `out/framed/*` to SchulyWebsite's `public/assets/`. If the images change, give them a new name suffix (`-v3`) and update the references, so that caches load the new ones. The hero phone image on the website is `out/raw/home-dark.png`; see SchulyWebsite's `tools/hero-images`. + +Settings you can override with environment variables: `AVD`, `IMAGE`, `EMU_PORT`, `API_PORT`, `CLOCK` (`MMDDhhmmYYYY.ss`), `OUT` and `PY`. `DRY_RUN=1` prints every command without running it. + +The taps in `login` and `shoot` are screen coordinates for the Pixel 8. If the app's layout changes, run `tools/store-screenshots/ui.sh` on the screen you're stuck at, and update the coordinates. To frame a single screenshot by hand, run `python frame.py `. + +## Licences + +- `deviceart/back.webp` is the Pixel 9 Pro XL device art from the Android Open Source Project / Android Studio, under the Apache License 2.0 (`deviceart/LICENSE.txt`). `frame.py` shortens the frame to the screenshot's aspect ratio. SchulyWebsite credits it in `CREDITS.txt`. +- The fake data and `static/mia.jpg` are made up for these screenshots. diff --git a/tools/store-screenshots/capture.sh b/tools/store-screenshots/capture.sh new file mode 100644 index 0000000..aa3a974 --- /dev/null +++ b/tools/store-screenshots/capture.sh @@ -0,0 +1,117 @@ +#!/usr/bin/env bash +# Captures the app screenshots on an Android emulator against the fake API, then frames them. +# Usage: tools/store-screenshots/capture.sh ... (run from the repo root; steps: avd boot build prepare login shoot frame cleanup, or all) +# DRY_RUN=1 prints the commands instead of running them. +set -euo pipefail + +HERE="$(cd "$(dirname "$0")" && pwd)" +ROOT="$(cd "$HERE/../.." && pwd)" +OUT="${OUT:-$HERE/out}" +AVD="${AVD:-SchulyShots_Pixel8_API35}" +IMAGE="${IMAGE:-system-images;android-35;google_apis;x86_64}" +PORT="${EMU_PORT:-5580}" +SERIAL="emulator-$PORT" +API_PORT="${API_PORT:-5591}" +PKG=com.schuly.app.dev +CLOCK="${CLOCK:-110609412026.00}" # MMDDhhmmYYYY.ss: Fri 6.11.2026, 09:41 +PY="${PY:-$HERE/.venv/Scripts/python}"; [ -x "$PY" ] || PY="$HERE/.venv/bin/python" + +run() { if [ -n "${DRY_RUN:-}" ]; then echo "+ $*"; else "$@"; fi; } +# MSYS_NO_PATHCONV stops Git Bash on Windows from rewriting device paths such as /sdcard/... for adb. +adbs() { if [ -n "${DRY_RUN:-}" ]; then echo "+ adb -s $SERIAL $*"; else MSYS_NO_PATHCONV=1 adb -s "$SERIAL" "$@"; fi; } +quiet() { if [ -n "${DRY_RUN:-}" ]; then adbs "$@"; else adbs "$@" >/dev/null; fi; } +demo() { quiet shell am broadcast -a com.android.systemui.demo -e command "$@"; } +tap() { adbs shell input tap "$1" "$2"; sleep "${3:-1.5}"; } +tab() { tap "$1" 2256; } # bottom navigation: 118 home, 330 timetable, 540 grades, 750 absences, 961 account + +# Resets the clock and status bar, then saves a 1080x2400 PNG. +shot() { + quiet shell date "$CLOCK" + demo network -e wifi show -e level 4 -e fully true + demo network -e mobile hide + demo clock -e hhmm 0941 + demo notifications -e visible false + sleep "${WAIT:-1}" + mkdir -p "$OUT/raw" + if [ -n "${DRY_RUN:-}" ]; then echo "+ adb -s $SERIAL exec-out screencap -p > $OUT/raw/$1.png"; else MSYS_NO_PATHCONV=1 adb -s "$SERIAL" exec-out screencap -p > "$OUT/raw/$1.png"; fi + echo "saved $1" +} + +step_avd() { + # Pixel 8 (1080x2400, 420 dpi) on API 35 with Google APIs, so adb root works for setting the clock. + run sdkmanager "$IMAGE" + if [ -n "${DRY_RUN:-}" ]; then echo "+ echo no | avdmanager create avd -n $AVD -k $IMAGE -d pixel_8"; else echo no | avdmanager create avd -n "$AVD" -k "$IMAGE" -d pixel_8; fi + local cfg="$HOME/.android/avd/$AVD.avd/config.ini" + run sed -i 's/^hw.ramSize=.*/hw.ramSize=2048/; s/^hw.keyboard=.*/hw.keyboard=yes/; s/^hw.gpu.enabled=.*/hw.gpu.enabled=yes/' "$cfg" +} + +step_boot() { + if [ -n "${DRY_RUN:-}" ]; then echo "+ emulator -avd $AVD -port $PORT -no-snapshot -no-boot-anim -gpu host -memory 2048 &"; else emulator -avd "$AVD" -port "$PORT" -no-snapshot -no-boot-anim -gpu host -memory 2048 >"$OUT/emulator.log" 2>&1 & fi + adbs wait-for-device + [ -n "${DRY_RUN:-}" ] && return + until [ "$(adb -s "$SERIAL" shell getprop sys.boot_completed 2>/dev/null | tr -d '\r')" = "1" ]; do sleep 3; done + echo booted +} + +step_build() { + # Dev flavor, release mode, pointed at the fake API through the emulator's host alias. + (cd "$ROOT" && run flutter build apk --flavor dev --release --target-platform android-x64 --dart-define=BACKEND_BASE_URL="http://10.0.2.2:$API_PORT") +} + +step_prepare() { + quiet root; sleep 3 + adbs install -r "$ROOT/build/app/outputs/flutter-apk/app-dev-release.apk" + adbs shell settings put global auto_time 0 + adbs shell settings put global auto_time_zone 0 + adbs shell cmd alarm set-timezone Europe/Zurich + adbs shell setprop persist.sys.timezone Europe/Zurich + adbs shell date "$CLOCK" + adbs shell settings put system time_12_24 24 + adbs shell cmd uimode night yes + adbs shell settings put global sysui_demo_allowed 1 + demo enter + demo battery -e level 100 -e plugged false +} + +step_login() { + # Coordinates are for the Pixel 8 screen. If the app's onboarding changed, find the new ones with ui.sh. + quiet shell monkey -p "$PKG" -c android.intent.category.LAUNCHER 1; sleep 10 + for _ in 1 2 3 4; do tap 540 2238 1.2; done # through the onboarding pages + tap 540 850 0.5; tap 540 2240 # account mode, continue + tap 540 1764 # pick the school system + tap 540 790 0.5; adbs shell input text mia.muster + tap 540 990 0.5; adbs shell input text Beispiel2026 + adbs shell input keyevent 111; sleep 0.5 # hide the keyboard + tap 540 1147 5 # sign in (the fake API accepts any login) +} + +step_shoot() { + adbs shell am force-stop "$PKG" + quiet shell monkey -p "$PKG" -c android.intent.category.LAUNCHER 1; sleep 7 + shot home-dark + tab 540; shot grades-dark + tab 750; shot absences-dark + tab 961; WAIT=2 shot account-dark + # Timetable on Tue 10.11.: swipe the date strip one week on, then tap the day. + tab 330 + adbs shell input swipe 900 430 300 430 300; sleep 1.5 + tap 326 430 1.2; shot agenda-dark +} + +step_frame() { + mkdir -p "$OUT/framed" + for p in "home-dark start" "agenda-dark agenda" "grades-dark grades" "absences-dark absences" "account-dark account"; do + set -- $p + run "$PY" "$HERE/frame.py" "$OUT/raw/$1.png" "$OUT/framed/schuly-$2-page-v2.png" "$OUT/framed/schuly-$2-page-v2.webp" + done +} + +step_cleanup() { + adbs emu kill || true + run avdmanager delete avd -n "$AVD" +} + +[ $# -gt 0 ] || { sed -n '2,4p' "$0"; exit 1; } +[ "$1" = all ] && set -- avd boot build prepare login shoot frame +mkdir -p "$OUT" +for s in "$@"; do "step_$s"; done diff --git a/tools/store-screenshots/deviceart/LICENSE.txt b/tools/store-screenshots/deviceart/LICENSE.txt new file mode 100644 index 0000000..f433b1a --- /dev/null +++ b/tools/store-screenshots/deviceart/LICENSE.txt @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/tools/store-screenshots/deviceart/back.webp b/tools/store-screenshots/deviceart/back.webp new file mode 100644 index 0000000000000000000000000000000000000000..54e897339ce1e3ecfda12e529ba4322a90fd86f4 GIT binary patch literal 99652 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 _m2c%QM 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

(F3Y76-&~ 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 literal 0 HcmV?d00001 diff --git a/tools/store-screenshots/fake-api/avatar.py b/tools/store-screenshots/fake-api/avatar.py new file mode 100644 index 0000000..2831066 --- /dev/null +++ b/tools/store-screenshots/fake-api/avatar.py @@ -0,0 +1,35 @@ +"""Draws the made-up profile picture static/mia.jpg (a sunset over hills), so no real photo is used.""" +import sys +from PIL import Image, ImageDraw, ImageFilter +import random, math +W=512; random.seed(7) +img=Image.new('RGB',(W,W)) +px=img.load() +top=(48,58,120); mid=(232,120,110); low=(250,196,130) +for y in range(W): + t=y/(W*0.62) + if t<0.6: a,b,u=top,mid,t/0.6 + else: a,b,u=mid,low,min(1,(t-0.6)/0.4) + c=tuple(int(a[i]+(b[i]-a[i])*u) for i in range(3)) + for x in range(W): px[x,y]=c +d=ImageDraw.Draw(img) +# sun +sun=Image.new('L',(W,W),0); ImageDraw.Draw(sun).ellipse((300,230,380,310),fill=255) +img.paste((255,226,170),(0,0),sun.filter(ImageFilter.GaussianBlur(2))) +def ridge(base,amp,seed,col,peaks): + random.seed(seed); pts=[(0,W)] + for x in range(0,W+8,8): + h=base-sum(a*math.exp(-((x-p)/w)**2) for p,a,w in peaks)+random.uniform(-amp,amp) + pts.append((x,h)) + pts.append((W,W)); d.polygon(pts,fill=col) +ridge(330,3,1,(120,82,120),[(90,120,70),(250,150,60),(420,100,80)]) +ridge(360,4,2,(78,56,96),[(40,70,60),(180,110,55),(360,80,70),(500,60,50)]) +ridge(395,3,3,(44,36,68),[(120,40,90),(330,55,80)]) +# lake +for y in range(400,W): + for x in range(W): + r,g,b=px[x,800-y] if 800-y>0 else (40,40,60) + f=0.55 + px[x,y]=(int(r*f+20*(1-f)),int(g*f+30*(1-f)),int(b*f+60*(1-f))) +img=img.filter(ImageFilter.GaussianBlur(0.8)) +img.save(sys.path[0] + '/static/mia.jpg', quality=90) diff --git a/tools/store-screenshots/fake-api/server.ts b/tools/store-screenshots/fake-api/server.ts new file mode 100644 index 0000000..c25778e --- /dev/null +++ b/tools/store-screenshots/fake-api/server.ts @@ -0,0 +1,219 @@ +// Fake Schuly API with made-up data for the app screenshots. Nothing here is real. +// Usage: bun tools/store-screenshots/fake-api/server.ts (PORT=5591 by default; the emulator reaches it at http://10.0.2.2:5591) +const PORT = Number(process.env.PORT ?? 5591); +const STATIC = import.meta.dir + "/static"; + +// Europe/Zurich offset: CEST between last Sunday of March and last Sunday of October. +function lastSunday(y: number, m: number) { const d = new Date(Date.UTC(y, m + 1, 0)); d.setUTCDate(d.getUTCDate() - d.getUTCDay()); return d; } +function off(y: number, mo: number, d: number) { const t = Date.UTC(y, mo - 1, d); return t >= lastSunday(y, 2).getTime() && t < lastSunday(y, 9).getTime() ? "+02:00" : "+01:00"; } +const p2 = (n: number) => String(n).padStart(2, "0"); +const ymd = (y: number, m: number, d: number) => `${y}-${p2(m)}-${p2(d)}`; +const at = (date: string, hm: string) => { const [y, m, d] = date.split("-").map(Number); return `${date}T${hm}:00${off(y, m, d)}`; }; + +const SCHOOL = "sch-bfs"; +const ME = "su-mia"; +const APP_USER = "au-mia"; +const ACC = "acc-portal"; +const BASE = "/api/plugins/schulportal"; + +const classes = [ + { id: "cls-mat", name: "Mathematik" }, + { id: "cls-eng", name: "Englisch" }, + { id: "cls-abu", name: "Allgemeinbildung" }, + { id: "cls-m164", name: "Modul 164 Datenbanken erstellen" }, + { id: "cls-m223", name: "Modul 223 Multi-User-Applikationen" }, + { id: "cls-spo", name: "Sport" }, + { id: "cls-m162", name: "Modul 162 Daten analysieren" }, +]; +const currentClassIds = ["cls-mat", "cls-eng", "cls-abu", "cls-m164", "cls-m223", "cls-spo"]; + +const teachers = [ + { code: "KeTh", firstName: "Thomas", lastName: "Keller" }, + { code: "BrCl", firstName: "Claire", lastName: "Brunner" }, + { code: "MeLu", firstName: "Lukas", lastName: "Meier" }, + { code: "HuSa", firstName: "Sandra", lastName: "Huber" }, + { code: "StRe", firstName: "Reto", lastName: "Steiner" }, + { code: "FrMa", firstName: "Marco", lastName: "Frei" }, +].map((t, i) => ({ id: `t-${i}`, schoolId: SCHOOL, schoolName: "Berufsfachschule Beispielstadt", ...t })); +const tName = (code: string) => { const t = teachers.find((x) => x.code === code)!; return `${t.lastName} ${t.firstName} (${t.code})`; }; + +// Weekly timetable: Tuesday and Friday are school days. +type Slot = { from: string; to: string; cls: string; title: string; room: string; teacher: string }; +const week: Record = { + 2: [ + { from: "08:15", to: "09:50", cls: "cls-m164", title: "M164 Datenbanken", room: "C311", teacher: "HuSa" }, + { from: "10:10", to: "11:45", cls: "cls-eng", title: "Englisch", room: "B112", teacher: "BrCl" }, + { from: "12:45", to: "14:20", cls: "cls-spo", title: "Sport", room: "Turnhalle 2", teacher: "FrMa" }, + ], + 5: [ + { from: "08:15", to: "09:50", cls: "cls-mat", title: "Mathematik", room: "B204", teacher: "KeTh" }, + { from: "10:10", to: "11:45", cls: "cls-m223", title: "M223 Multi-User-Apps", room: "C312", teacher: "StRe" }, + { from: "12:45", to: "14:20", cls: "cls-abu", title: "Allgemeinbildung", room: "A105", teacher: "MeLu" }, + { from: "14:30", to: "15:15", cls: "cls-abu", title: "Klassenstunde", room: "A105", teacher: "MeLu" }, + ], +}; +const holidays = [ + { id: "h-herbst", title: "Herbstferien", from: "2026-09-28", to: "2026-10-09" }, + { id: "h-weihnacht", title: "Weihnachtsferien", from: "2026-12-21", to: "2027-01-01" }, + { id: "h-sport", title: "Sportferien", from: "2027-02-08", to: "2027-02-19" }, +]; +// Tests replace the lesson in their slot; key = date|from. +const tests: Record = { + "2026-11-06|12:45": { title: "ABU – Test Mietrecht" }, + "2026-11-10|10:10": { title: "Englisch – Vocabulary Unit 5" }, + "2026-11-13|08:15": { title: "Mathematik – Prüfung Funktionen" }, + "2026-11-17|08:15": { title: "M164 – LB3 Datenbankprojekt" }, + "2026-11-20|10:10": { title: "M223 – LB2 Transaktionen" }, +}; +const events = [ + { id: "ev-messe", title: "Exkursion Berufsmesse", date: "2026-11-24", from: "08:15", to: "15:00", place: "Messezentrum Beispielstadt", cls: null }, + { id: "ev-eltern", title: "Elternabend 2. Lehrjahr", date: "2026-11-19", from: "19:00", to: "20:30", place: "Aula", cls: null }, +]; + +function inHoliday(date: string) { return holidays.some((h) => date >= h.from && date <= h.to); } + +const agenda: any[] = []; +for (let t = Date.UTC(2026, 7, 17); t <= Date.UTC(2026, 11, 18); t += 86400000) { + const d = new Date(t); + const date = ymd(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate()); + const slots = week[d.getUTCDay()]; + if (!slots || inHoliday(date)) continue; + for (const s of slots) { + const test = tests[`${date}|${s.from}`]; + agenda.push({ + id: `ag-${date}-${s.from}`, + entryType: test ? "Test" : "Lesson", + title: test ? test.title : s.title, + description: tName(s.teacher), + place: s.room, + date: at(date, s.from), + endDate: at(date, s.to), + classId: s.cls, + schoolId: SCHOOL, + schoolUserId: ME, + }); + } +} +for (const e of events) agenda.push({ id: e.id, entryType: "Event", title: e.title, place: e.place, date: at(e.date, e.from), endDate: at(e.date, e.to), schoolId: SCHOOL, schoolUserId: ME }); +for (const h of holidays) agenda.push({ id: h.id, entryType: "Holiday", title: h.title, date: at(h.from, "00:00"), endDate: at(h.to, "23:59"), schoolId: SCHOOL }); + +// Exams and Mia's grades. +const examDefs: [string, string, string, number, number, number, string?][] = [ + // id, class, name, date, score, classAverage, weighting, description + ["ex-mat-1", "cls-mat", "Lineare Gleichungssysteme", "2026-09-04", 4.5, 4.4, 1], + ["ex-mat-2", "cls-mat", "Potenzen und Wurzeln", "2026-10-16", 5.0, 4.6, 1], + ["ex-mat-3", "cls-mat", "Kurztest Funktionen", "2026-10-30", 3.75, 4.1, 0.5], + ["ex-eng-1", "cls-eng", "Vocabulary Test Unit 3", "2026-09-08", 5.5, 4.9, 0.5], + ["ex-eng-2", "cls-eng", "Reading Comprehension", "2026-10-20", 5.0, 4.7, 1], + ["ex-eng-3", "cls-eng", "Vocabulary Test Unit 4", "2026-11-03", 6, 5.0, 0.5], + ["ex-abu-1", "cls-abu", "Vertragsrecht", "2026-09-11", 4.75, 4.5, 1], + ["ex-abu-2", "cls-abu", "Präsentation Steuern", "2026-10-23", 5.25, 5.0, 1], + ["ex-m164-1", "cls-m164", "LB1 ERD und Normalisierung", "2026-09-15", 5.5, 4.8, 1], + ["ex-m164-2", "cls-m164", "LB2 SQL-Abfragen", "2026-11-03", 5.0, 4.6, 1], + ["ex-m223-1", "cls-m223", "LB1 Mehrbenutzer-Konzept", "2026-10-16", 5.25, 4.9, 1], + ["ex-spo-1", "cls-spo", "Ausdauerlauf 12 Minuten", "2026-09-22", 5.5, 5.0, 1], + // 2. semester 25/26 + ["ex-mat-0", "cls-mat", "Bruchrechnen und Terme", "2026-03-13", 5.0, 4.5, 1], + ["ex-eng-0", "cls-eng", "Grammar Test Tenses", "2026-04-21", 4.5, 4.4, 1], + ["ex-abu-0", "cls-abu", "Arbeitsvertrag", "2026-05-29", 5.5, 4.8, 1], + ["ex-m162-0", "cls-m162", "LB1 Datenmodelle", "2026-06-16", 5.0, 4.7, 1], +]; +const descriptions: Record = { + "ex-mat-3": "Lineare und quadratische Funktionen, Scheitelpunktform", + "ex-m164-2": "SELECT, JOIN, GROUP BY und Unterabfragen", + "ex-eng-3": "Unit 4: Work and careers", + "ex-abu-2": "Gruppenpräsentation zur Steuererklärung", +}; +const grades = examDefs.map(([id, , , , score, , w]) => ({ id: `g-${id}`, score, weighting: w, examId: id, schoolUserId: ME })); +const exams = examDefs.map(([id, cls, name, date, , avg]) => ({ id, name, description: descriptions[id] ?? null, type: "Classic", date, classAverage: avg, classId: cls, schoolId: SCHOOL, grades: [] })); + +const absences = [ + { id: "ab-1", reason: "Krankheit", type: "Absence", from: at("2026-11-03", "08:15"), until: at("2026-11-03", "14:20"), isExcused: false, schoolUserId: ME, schoolId: SCHOOL }, + { id: "ab-2", reason: "Zug verspätet", type: "Delay", from: at("2026-10-20", "08:15"), until: at("2026-10-20", "08:35"), isExcused: true, schoolUserId: ME, schoolId: SCHOOL }, + { id: "ab-3", reason: "Arzttermin", type: "Absence", from: at("2026-10-13", "10:10"), until: at("2026-10-13", "11:45"), isExcused: true, schoolUserId: ME, schoolId: SCHOOL }, + { id: "ab-5", reason: "Zahnarzt", type: "Absence", from: at("2026-09-15", "10:10"), until: at("2026-09-15", "11:45"), isExcused: true, schoolUserId: ME, schoolId: SCHOOL }, + { id: "ab-6", reason: "Bus verpasst", type: "Delay", from: at("2026-08-25", "08:15"), until: at("2026-08-25", "08:25"), isExcused: true, schoolUserId: ME, schoolId: SCHOOL }, + { id: "ab-4", reason: "Grippe", type: "Absence", from: at("2026-09-01", "08:15"), until: at("2026-09-04", "15:15"), isExcused: true, schoolUserId: ME, schoolId: SCHOOL }, +]; +const reported = [ + { ids: ["rep-1", "rep-2"], dateFrom: "2026-11-10", dateTo: "2026-11-10", hourFrom: "08:15", hourTo: "11:45", reason: "Arzttermin", comment: "Zeugnis folgt", profiles: ["M164", "Englisch"], reportedAt: at("2026-11-05", "18:12") }, +]; + +const classmates = [ + ["Luca", "Baumann"], ["Noah", "Fischer"], ["Lea", "Gerber"], ["Elena", "Schmid"], ["Jan", "Weber"], ["Sara", "Rossi"], ["Timo", "Zürcher"], ["Nina", "Frei"], ["Mia", "Muster"], ["Jonas", "Ammann"], ["Aline", "Kälin"], ["David", "Hofmann"], +].map(([f, l], i) => ({ id: l === "Muster" ? ME : `cm-${i}`, schoolId: SCHOOL, firstName: f, lastName: l, profilePictureUrl: l === "Muster" ? "/static/mia.jpg" : null, role: "Student", absences: [], grades: [] })); + +const myClasses = currentClassIds.map((id) => ({ classId: id, className: classes.find((c) => c.id === id)!.name })); +const schoolUser = { + id: ME, applicationUserId: APP_USER, schoolId: SCHOOL, schoolName: "Berufsfachschule Beispielstadt", + firstName: "Mia", lastName: "Muster", email: "mia.muster@bfs-beispielstadt.ch", profilePictureUrl: "/static/mia.jpg", + entryDate: "2025-08-11", role: "Student", state: "Active", + absences, grades, classes: myClasses, +}; +const classDtos = classes.map((c) => ({ id: c.id, name: c.name, description: null, schoolId: SCHOOL, schoolName: "Berufsfachschule Beispielstadt", students: [], agenda: [], exams: exams.filter((e) => e.classId === c.id) })); + +const documents = [ + { id: "doc-1", schoolUserId: ME, title: "Semesterzeugnis 2. Semester 25/26", category: "Zeugnis", enteredBy: "Sekretariat", fileName: "Zeugnis_2_25-26.pdf", fileSizeBytes: 184320, createdAt: at("2026-07-03", "10:00") }, + { id: "doc-2", schoolUserId: ME, title: "Bestätigung Lehrverhältnis", category: "Bestätigung", enteredBy: "Sekretariat", fileName: "Bestaetigung.pdf", fileSizeBytes: 92160, createdAt: at("2026-08-17", "09:30") }, +]; + +const nowIso = () => new Date().toISOString(); +const minutesAgo = (m: number) => new Date(Date.now() - m * 60000).toISOString(); +const linkedAccount = () => ({ + providerId: "schulportal", providerName: "Schulportal", id: ACC, title: "Berufsfachschule Beispielstadt", detail: "mia.muster", status: "ok", + linkedAt: "2025-08-20T08:00:00Z", lastSyncedAt: minutesAgo(12), canReauth: true, + capabilities: [{ kind: "school_data", label: "School data" }, { kind: "absence_reporting", label: "Absence reporting", basePath: `${BASE}/accounts` }], +}); + +const tokens = () => ({ access_token: "fake-access-" + Date.now(), refresh_token: "fake-refresh", expires_in: 86400, token_type: "Bearer" }); + +const routes: Record any> = { + "GET /api/app": () => ({ registrationEnabled: true, version: "3.2.0", policyVersion: "2026-05", policyUrl: "https://schuly.dev/en/privacy", swissSchoolConfirmationRequired: false }), + "GET /api/app/school-systems": () => [{ key: "schulportal", displayName: "Schulportal", loginMethod: "credentials", enabled: true, sortOrder: 0, pluginBasePath: BASE, loginFields: [] }], + "GET /auth/providers": () => [], + "POST /auth/login": () => tokens(), + "POST /auth/refresh": () => tokens(), + "POST /auth/logout": () => null, + "GET /api/Auth/me": () => ({ id: APP_USER, externalId: "mia.muster", email: "mia.muster@bfs-beispielstadt.ch", displayName: "Mia Muster", profilePictureUrl: "/static/mia.jpg", createdAt: "2025-08-20T08:00:00Z", schoolUsers: [{ id: ME, firstName: "Mia", lastName: "Muster", email: "mia.muster@bfs-beispielstadt.ch", role: "Student" }] }), + "GET /api/Auth/me/privacy-notice": () => ({ policyVersion: "2026-05", policyUrl: "https://schuly.dev/en/privacy", acceptanceRequired: false, swissSchoolConfirmationRequired: false, acceptedVersion: "2026-05", acceptedAt: "2026-05-12T07:00:00Z", swissSchoolConfirmedAt: "2026-05-12T07:00:00Z" }), + "GET /api/Schools/my-schools": () => [{ id: SCHOOL, name: "BFS Beispielstadt", fullName: "Berufsfachschule Beispielstadt", email: "mia.muster@bfs-beispielstadt.ch", logoUrl: null, schoolSystemKey: "schulportal", profilePictureUrl: "/static/mia.jpg" }], + "GET /api/SchoolUsers": () => [schoolUser], + "GET /api/Exams": () => exams, + "GET /api/Agendas": () => agenda, + "GET /api/Absences": () => absences, + "GET /api/Class": () => classDtos, + "GET /api/Class/search": (_r, u) => { const c = classDtos.find((x) => x.id === u.searchParams.get("classId")); return c ? { ...c, students: classmates, agenda: agenda.filter((a) => a.classId === c.id) } : null; }, + "GET /api/SemesterReports": () => [], + "GET /api/Teachers": () => teachers, + "GET /api/documents": () => documents, + "GET /api/notifications/preferences": () => ({ grades: true, absences: true, agenda: true, includeGradeValue: true, includeDetails: false }), + "POST /api/notifications/devices": () => null, + "GET /api/linking/providers": () => [{ id: "schulportal", displayName: "Schulportal", description: "Grades, timetable and absences from your school", capabilities: [{ kind: "school_data", label: "School data" }, { kind: "absence_reporting", label: "Absence reporting" }], flows: [], sortOrder: 0 }], + "GET /api/linking/accounts": () => [linkedAccount()], + [`GET ${BASE}/accounts`]: () => [{ id: ACC, schoolUserId: ME }], + [`GET ${BASE}/status`]: () => ({ version: "1.8.2" }), + [`GET ${BASE}/accounts/${ACC}/sync`]: () => ({ lastSync: minutesAgo(12), syncStatus: "Up to date", syncError: null }), + [`POST ${BASE}/accounts/${ACC}/sync`]: () => null, + [`GET ${BASE}/accounts/${ACC}/absences/reported`]: () => reported, + [`GET ${BASE}/accounts/${ACC}/absences/reasons`]: () => ["Krankheit", "Arzttermin", "Unfall", "Familiäre Gründe", "Militär / Zivilschutz"], +}; + +Bun.serve({ + port: PORT, + hostname: "0.0.0.0", + async fetch(req) { + const url = new URL(req.url); + if (url.pathname.startsWith("/static/")) { + const f = Bun.file(STATIC + url.pathname.slice(7)); + return (await f.exists()) ? new Response(f, { headers: { "Content-Type": "image/jpeg" } }) : new Response("", { status: 404 }); + } + const key = `${req.method} ${url.pathname}`; + const h = routes[key]; + console.log(`${new Date().toISOString().slice(11, 19)} ${key}${h ? "" : " <-- UNHANDLED"}`); + if (!h) return new Response(JSON.stringify({ message: "not found" }), { status: 404, headers: { "Content-Type": "application/json" } }); + const body = h(req, url); + if (body === null) return new Response(null, { status: 204 }); + return Response.json(body); + }, +}); +console.log(`fake api on :${PORT}`); diff --git a/tools/store-screenshots/fake-api/static/mia.jpg b/tools/store-screenshots/fake-api/static/mia.jpg new file mode 100644 index 0000000000000000000000000000000000000000..97ba507697f80d89585241e9bbcd4078f77fcf91 GIT binary patch literal 16501 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≪`8CcrH)i{C;>2Y)i|{%{k8D2A+({hP26p=6WA(e_TKvy>vM$&>jB0x-^>}tx z6#LzNxbLdzK1`Z5!Y6IqbDt}yWD=6WKK(cWf{}_J^u&kAgCHRK* z4WU{))%M~%%z&R&k_J(ufq14A-Q!0|RB0kX@SjaC#T(D=+h+1A)3o*WQ^-m$ zzgy#vu|@K+YaC0y@g7`&P<8qxbry)z#ph4@qk=$HmF=;o+hrQu-8G$@QtxXDVqRM{ ziD&?5hjYOzAvWC9_ga-bxYW@PhcIpJ*o9+V)u59b9h~5x;?W`(C&2OSioG1WDvKc{BkRU zE8L6HS?8=Red?1GZl_UKP{ds~iIp^>IAv7D%C}BV`_0O3GqQAA_r_hku7~U4 zIsWlSrb8}Lm=sI+)pK??i?F1f7fPg_zr+6}(lcaR4Nk+-iH3oXX#6E51~V)JXH|>O zwYqu{kJy{?3pM4ORiBi3VOy=Y*RgaWfJD;Y@`OvXyzUJ zkW-XfXnFE!OQPc%xZ~<85j1xYB=a|!Mh*2VM3X;}z_h>4>lm8P-%#7>D*t7(@)Kcx z8yCziio%EulpWLnsy?H90fLNvRA=#N28m_kv4x&QRDd+}^rUiZ?@F;D;tm`4;N(NT zglkG;^5inC)JPcnQqK1ek`z2*(w`h$>AG7btFJbRXT4prse1R+&cNdMciT^tLUrZt ioFpOA>E!4~B%Tx3`NzsdE^HitSaL!s_g7mF`u+oUmS +""" +import sys +from pathlib import Path + +import numpy as np +from PIL import Image, ImageDraw + +ART = Path(__file__).resolve().parent / "deviceart" / "back.webp" # 1466x3101, screen 1344x2992 at (57, 56) +OUT_W = 660 + + +def phone_frame(src_w, src_h): + """The device art, shortened in the middle of the body so its screen matches the screenshot's aspect ratio.""" + art = Image.open(ART).convert("RGBA") + sw = 1344 + sh = round(sw * src_h / src_w) + cut = 2992 - sh + a = np.asarray(art) + if cut > 0: + a = np.concatenate([a[:1900], a[1900 + cut:]]) + return Image.fromarray(a), (57, 56, sw, sh) + + +def framed(src, dst_png, dst_webp): + shot = Image.open(src).convert("RGB") + frame, (x, y, sw, sh) = phone_frame(*shot.size) + shot = shot.resize((sw, sh), Image.LANCZOS) + mask = Image.new("L", (sw * 2, sh * 2), 0) + ImageDraw.Draw(mask).rounded_rectangle((0, 0, sw * 2 - 1, sh * 2 - 1), 216, fill=255) + mask = mask.resize((sw, sh), Image.LANCZOS) + out = Image.new("RGBA", frame.size, (0, 0, 0, 0)) + out.paste(shot, (x, y), mask) + out.alpha_composite(frame) + fw, fh = out.size + out = out.resize((OUT_W, round(fh * OUT_W / fw)), Image.LANCZOS) + out.save(dst_png, optimize=True) + out.save(dst_webp, "WEBP", quality=85, method=6) + print(dst_png, out.size) + + +if __name__ == "__main__": + if len(sys.argv) != 4: + sys.exit(__doc__) + framed(*sys.argv[1:4]) diff --git a/tools/store-screenshots/requirements.txt b/tools/store-screenshots/requirements.txt new file mode 100644 index 0000000..70d52c0 --- /dev/null +++ b/tools/store-screenshots/requirements.txt @@ -0,0 +1,2 @@ +Pillow>=10 +numpy>=1.26 diff --git a/tools/store-screenshots/ui.sh b/tools/store-screenshots/ui.sh new file mode 100644 index 0000000..43eeb6b --- /dev/null +++ b/tools/store-screenshots/ui.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# Lists the text and clickable nodes on the emulator screen with their bounds, to find tap coordinates for capture.sh. +# Usage: tools/store-screenshots/ui.sh (EMU_PORT=5580 by default) +export MSYS_NO_PATHCONV=1 +SERIAL="emulator-${EMU_PORT:-5580}" +adb -s "$SERIAL" shell uiautomator dump /sdcard/ui.xml >/dev/null 2>&1 +adb -s "$SERIAL" exec-out cat /sdcard/ui.xml | python -c " +import sys, re +x = sys.stdin.read() +for m in re.finditer(r']*>', x): + n = m.group(0) + g = lambda k: (re.search(k + '=\"([^\"]*)\"', n) or [None, ''])[1] + t = g('text') or g('content-desc') + if t or g('clickable') == 'true': + print(repr(t[:60]), g('clickable'), g('bounds')) +"