Forgejo's releases API and asset downloads both work unauthenticated
for a public repo. check_latest_release() no longer raises if
FORGEJO_TOKEN is blank; it only attaches the Authorization header when
one is actually set (e.g. if this repo ever goes private again).
LICENSE: verbatim copy of android-app-template's (official SPDX text,
not retyped) — GPL-3.0 as previously decided.
Update checker: check_latest_release()/download_and_install()/
MessagePopup ported from the template, wired to a new "Check for
Updates" button next to Settings. Requires certifi added to
p4a-recipes/kivy's python_depends (HTTPS on Android needs an explicit
CA bundle) and INTERNET/REQUEST_INSTALL_PACKAGES added to
buildozer.spec. FORGEJO_TOKEN at the top of main.py ships blank —
update checking is inert until it's set to a repo-scoped read-only
token. download_and_install() is the standard p4a pattern but not yet
verified on real hardware, same caveat as the template it came from.
Dropped the previously-agreed config.json split (event list vs. data
path) — decided it's not needed after all.
CLAUDE.md was out of date after this session's two on-device fixes
(commit d276f88): still described the kivy recipe as python_depends=[]
(filetype is back), and didn't mention the p4a dist-caching trap that
made the filetype fix silently ineffective until the stale dist
directory was deleted, or the Settings popup label wrapping bug.
Cross-referenced with android-app-template's CLAUDE.md, which hit the
same label bug in more places.
python_depends was emptied too aggressively in an earlier fix (dodging
the requests/charset-normalizer Android-wheel bug) and took filetype
with it — kivy/core/image imports it directly, causing a startup crash.
Restored just filetype (pure Python, no dependency chain, safe).
Settings popup's info label set text_size=(self.width, None) at
__init__ time, before layout ever runs — self was the Popup at its
default ~100px pre-layout width, not its real on-screen size, so the
label rendered as a 1-character-wide column. Now binds text_size to
the label's own width so it updates once real layout happens.
- build.sh: pin JAVA_HOME to java-17-openjdk for the build only (Gradle
8.14.3 can't parse this machine's default java-26 class files).
- build.sh: delete p4a's internal pymodules venv before every run — it
re-runs `python -m venv` without --clear on each build and corrupts
its own pip (confirmed two dist-info dirs coexisting).
- CLAUDE.md / android/README.md: document all three build-tooling fixes
from this session (kivy python_depends, p4a venv corruption, JDK pin)
so a future session/rebuild doesn't have to re-diagnose them.
Confirmed: full BUILD SUCCESSFUL Gradle run, APK produced at
android/bin/eventtracker-0.1-arm64-v8a-debug.apk.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Desktop: GTK3 + matplotlib app tracking arbitrary events (button ->
timestamp -> CSV), with per-event stats, trend charts, settings
(rename/add events, relocate data file), and a reset-with-backup flow.
Portable desktop launcher via a .desktop.in template + install script,
no machine-specific paths baked in.
Android: minimal Kivy v1 companion reading/writing the same CSV format,
plus buildozer build tooling isolated in a venv and a local p4a recipe
override for kivy (see CLAUDE.md for why).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>