[app] title = Event Tracker package.name = eventtracker package.domain = net.tastech source.dir = . source.include_exts = py version = 0.1 requirements = python3,kivy # Upstream p4a's kivy recipe declares python_depends on requests/certifi/ # chardet/idna/urllib3/filetype — mostly kivy.network.UrlRequest extras we # never call, EXCEPT filetype (kivy/core/image imports it directly for # real, confirmed by a startup crash when it was dropped too) and certifi # (needed by main.py's update checker for HTTPS on Android — see the # comment on check_latest_release() in main.py). p4a-recipes/kivy is a # copy of that recipe keeping only those two. It's not just cleanup: # requests pulls in charset-normalizer, whose newest release ships an # Android-tagged wheel; p4a's dependency resolver pins that exact wheel # into requirements.txt, then installs it with a plain host pip that has # no idea it's an Android wheel, and the build dies on "not a supported # wheel on this platform". Dropping the unused requests chain avoids the # bug entirely — filetype and certifi are both pure Python with no such # transitive dependency and install cleanly on their own. # # Reminder: editing p4a-recipes/kivy's python_depends alone doesn't take # effect on an existing build — p4a caches the built dist by name+recipe # list and won't re-derive python_depends for a dist that already # exists. Delete .buildozer/android/platform/build-/dists/eventtracker # after any python_depends change, or the change silently won't apply. # See CLAUDE.md for the full trace of this gotcha. p4a.local_recipes = p4a-recipes orientation = portrait fullscreen = 0 # READ/WRITE/MANAGE_EXTERNAL_STORAGE: broad file access is required to # reach whatever folder FolderSync/DAVx5 is syncing into — that folder is # picked by the user at runtime (Settings), not fixed at build time, so # scoped storage APIs alone aren't enough. INTERNET: the in-app update # checker (main.py) needs this to reach Forgejo's API and download a # release .apk. REQUEST_INSTALL_PACKAGES: lets Android prompt to install # that downloaded .apk in one tap instead of also making the user # manually enable "install unknown apps" first. android.permissions = READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE,MANAGE_EXTERNAL_STORAGE,INTERNET,REQUEST_INSTALL_PACKAGES android.api = 33 android.minapi = 24 android.archs = arm64-v8a [buildozer] log_level = 2 warn_on_root = 1