Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
4e695c1
Refresh PureNote to v2: multi-note app + retro restyle + CI
Jun 15, 2026
9922bc1
CI: auto-accept Android SDK licenses to fix aidl/build-tools failure
Jun 15, 2026
aebde27
CI: let buildozer download SDK itself; rely on accept_sdk_license; bu…
Jun 15, 2026
4d89ba5
CI: use JDK 17 so Android Gradle Plugin (compileSdk 35) applies
Jun 15, 2026
47dd9a2
CI: cache across failed builds (restore/save if:always), build arm64 …
Jun 15, 2026
32aa144
Fix Android 15 edge-to-edge: pad content for status/nav bar insets
Jun 15, 2026
d4794c0
Editor redesign: robust body/preview, auto-save, icon+label toolbar, …
Jun 16, 2026
d374315
Fix body input unreachable on Android: remove preview pane from tree …
Jun 16, 2026
6b0feaf
Fix crash on reopening editor: collapse preview pane to 0x0 instead o…
Jun 16, 2026
f7f507b
Add interactive checklists, trash/undo, runtime seed, and release AAB…
Jun 23, 2026
b60d35c
Pin release versionCode to 10215 for the first Play Store upload of v2
Jun 23, 2026
534f653
Simplify PureNote editor and add reliable local autosave and portable…
Oct 26, 2026
e33b847
Pin pure Python charset-normalizer for Android packaging
Oct 26, 2026
b94e82f
Recreate cached p4a installer environments before Android builds
Oct 26, 2026
16b40f1
Constrain p4a cross-platform dependency resolution to portable wheels
Oct 26, 2026
b4d37e4
Omit empty Android permission and verify packaged APKs in CI
Oct 26, 2026
245389b
Rework mobile layout and add emulator APK builds with density checks
Oct 27, 2026
fb28aae
Keep phone and emulator builds in separate concurrency groups
Oct 27, 2026
3ebd0e0
Anchor note list above footer and check save error typography
Oct 27, 2026
afc70e5
Keep dialogs above keyboard and verify visible popup bounds
Oct 27, 2026
6028e33
Fix Android density and native nonlinear font scaling across devices
Oct 27, 2026
5bee362
Size note total from its text at large accessibility scales
Oct 27, 2026
295551f
Keep note total readable with native accessibility fonts
Oct 27, 2026
0f6ce2e
Sign debug artifacts with an explicit persistent key and verify identity
Oct 27, 2026
db8594a
Add approved PureNote icon and verify release signing identity
bbnss Oct 27, 2026
13dcba8
Allow inspection of existing release certificate without exposing the…
bbnss Oct 27, 2026
4d026a2
Prepare release APK and AAB for local signing with the original key
bbnss Oct 27, 2026
1d83459
Distinguish app signing certificate from the Google source stamp
bbnss Oct 27, 2026
37befc2
Keep signing keys out of CI and fix pip environment reuse between ABIs
bbnss Oct 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions .github/actions/android-build/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
name: Android build environment
description: Shared Buildozer dependencies and cache for APK and AAB builds.
runs:
using: composite
steps:
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'
- name: Install system dependencies
shell: bash
run: |
sudo apt-get update
sudo apt-get install -y git zip unzip autoconf automake autopoint gettext \
libtool pkg-config zlib1g-dev libncurses-dev libtinfo6 cmake libffi-dev \
libssl-dev build-essential ccache libltdl-dev
- name: Install pinned Buildozer toolchain
shell: bash
run: python -m pip install -r requirements-build.txt
- name: Constrain both p4a dependency resolution and installation
shell: bash
run: echo "PIP_CONSTRAINT=$GITHUB_WORKSPACE/constraints-android.txt" >> "$GITHUB_ENV"
- name: Restore Buildozer cache
uses: actions/cache/restore@v4
with:
path: |
~/.buildozer
~/.android
.buildozer
key: purenote-android-v4-${{ runner.os }}-${{ hashFiles('buildozer.spec', 'requirements-build.txt', 'constraints-android.txt') }}-${{ github.run_id }}-${{ github.run_attempt }}
restore-keys: |
purenote-android-v4-${{ runner.os }}-${{ hashFiles('buildozer.spec', 'requirements-build.txt', 'constraints-android.txt') }}-
purenote-android-v4-${{ runner.os }}-
buildozer-v3-
- name: Recreate disposable p4a installer environments
shell: bash
run: |
python - <<'PY'
import shutil
from pathlib import Path

# Re-running venv over a cached, upgraded pip can leave mixed pip files.
# Keep compiled recipes; only discard the pure-Python installer venv.
for environment in Path('.buildozer/android/platform').glob('build-*/build/venv'):
shutil.rmtree(environment)
PY
- name: Use a fresh pip environment for each ABI
shell: bash
run: |
python - <<'PY'
import configparser
import os
import subprocess
from pathlib import Path

config = configparser.ConfigParser(interpolation=None)
config.read('buildozer.spec')
commit = config['app']['p4a.commit']
source = Path('.buildozer/android/platform/python-for-android').resolve()
if not (source / '.git').is_dir():
source.parent.mkdir(parents=True, exist_ok=True)
subprocess.run(['git', 'clone', '--no-checkout',
'https://github.com/kivy/python-for-android.git', str(source)], check=True)
if subprocess.run(['git', '-C', str(source), 'cat-file', '-e', commit + '^{commit}'],
capture_output=True).returncode:
subprocess.run(['git', '-C', str(source), 'fetch', 'origin', commit], check=True)
subprocess.run(['git', '-C', str(source), 'reset', '--hard', commit], check=True)
build = source / 'pythonforandroid/build.py'
before = "shprint(host_python, '-m', 'venv', 'venv')"
after = "shprint(host_python, '-m', 'venv', '--clear', 'venv')"
text = build.read_text()
if text.count(before) != 1:
raise RuntimeError('The pinned p4a venv code changed; review the workaround')
build.write_text(text.replace(before, after))
with open(os.environ['GITHUB_ENV'], 'a') as environment:
environment.write(f'APP_P4A_SOURCE_DIR={source}\n')
PY
71 changes: 71 additions & 0 deletions .github/workflows/build-apk.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
name: Build PureNote APK
on:
push:
branches: ['**']
pull_request:
workflow_dispatch:
inputs:
architecture:
description: 'ARM64 per telefono oppure x86_64 per emulatore'
type: choice
default: arm64-v8a
options:
- arm64-v8a
- x86_64
permissions:
contents: read
concurrency:
group: apk-${{ github.ref }}-${{ inputs.architecture || 'arm64-v8a' }}
cancel-in-progress: true
jobs:
checks:
uses: ./.github/workflows/test.yml
build-android:
needs: checks
runs-on: ubuntu-24.04
timeout-minutes: 90
env:
PYTHONFORANDROID_PREREQUISITES_INSTALL_INTERACTIVE: '0'
steps:
- uses: actions/checkout@v4
- name: Select emulator architecture
if: inputs.architecture == 'x86_64'
run: sed -i 's/^android.archs = .*/android.archs = x86_64/' buildozer.spec
- uses: ./.github/actions/android-build
- name: Restore optional persistent debug signing key
shell: bash
env:
ANDROID_DEBUG_KEYSTORE_B64: ${{ secrets.ANDROID_DEBUG_KEYSTORE_B64 }}
run: |
if [ -n "$ANDROID_DEBUG_KEYSTORE_B64" ]; then
key_path="$RUNNER_TEMP/purenote-debug.keystore"
printf '%s' "$ANDROID_DEBUG_KEYSTORE_B64" | base64 --decode > "$key_path"
chmod 600 "$key_path"
echo "PURENOTE_DEBUG_KEYSTORE=$key_path" >> "$GITHUB_ENV"
fi
- name: Build debug APK
shell: bash
run: buildozer -v android debug
- name: Sign APK with persistent debug identity
if: env.PURENOTE_DEBUG_KEYSTORE != ''
run: python tests/sign_apk.py --keystore "$PURENOTE_DEBUG_KEYSTORE" bin/*.apk
- name: Verify APK signature and permissions
run: python tests/verify_apk.py bin/*.apk
- name: Upload APK
uses: actions/upload-artifact@v4
with:
name: purenote-debug-apk
path: bin/*.apk
if-no-files-found: error
- name: Save build progress
if: always()
uses: actions/cache/save@v4
with:
path: |
~/.buildozer
~/.android
.buildozer
key: purenote-android-v4-${{ runner.os }}-${{ hashFiles('buildozer.spec', 'requirements-build.txt', 'constraints-android.txt') }}-${{ github.run_id }}-${{ github.run_attempt }}
- name: Remove temporary signing key
if: always()
run: rm -f "$RUNNER_TEMP/purenote-debug.keystore"
47 changes: 47 additions & 0 deletions .github/workflows/build-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Build PureNote Release AAB
on:
workflow_dispatch:
push:
tags: ['v*']
permissions:
contents: read
jobs:
checks:
uses: ./.github/workflows/test.yml
build-release:
needs: checks
runs-on: ubuntu-24.04
timeout-minutes: 120
env:
PYTHONFORANDROID_PREREQUISITES_INSTALL_INTERACTIVE: '0'
steps:
- uses: actions/checkout@v4
- name: Select release architectures before computing the cache key
run: sed -i 's/^android.archs = .*/android.archs = arm64-v8a,armeabi-v7a/' buildozer.spec
- uses: ./.github/actions/android-build
- name: Build release AAB and APK for local signing
shell: bash
run: |
buildozer -v android release
buildozer --profile release-apk -v android release
- name: Upload AAB for local signing
uses: actions/upload-artifact@v4
with:
name: purenote-release-aab-for-local-signing
path: bin/*.aab
if-no-files-found: error
- name: Upload APK for local signing
uses: actions/upload-artifact@v4
with:
name: purenote-release-apk-for-local-signing
path: bin/*.apk
if-no-files-found: error
- name: Save build progress
if: always()
uses: actions/cache/save@v4
with:
path: |
~/.buildozer
~/.android
.buildozer
key: purenote-android-v4-${{ runner.os }}-${{ hashFiles('buildozer.spec', 'requirements-build.txt', 'constraints-android.txt') }}-${{ github.run_id }}-${{ github.run_attempt }}
42 changes: 42 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: Test PureNote
on:
workflow_call:
workflow_dispatch:
permissions:
contents: read
jobs:
tests:
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: pip
cache-dependency-path: requirements-dev.txt
- run: python -m pip install -r requirements-dev.txt
- run: ruff check .
- run: python -m pytest -q
- name: Install UI test dependencies
run: sudo apt-get update && sudo apt-get install -y xvfb xauth libgl1-mesa-dri libegl1 libmtdev1
- name: Exercise the real Kivy interface
env:
KIVY_NO_CONSOLELOG: '1'
LIBGL_ALWAYS_SOFTWARE: '1'
PURENOTE_SCREENSHOTS: ${{ runner.temp }}/purenote-preview
run: xvfb-run -a python tests/ui_smoke.py
- name: Check Android density and text at 200 percent
env:
KIVY_NO_CONSOLELOG: '1'
LIBGL_ALWAYS_SOFTWARE: '1'
KIVY_METRICS_DENSITY: '2.625'
KIVY_METRICS_FONTSCALE: '2'
PURENOTE_SCREENSHOTS: ${{ runner.temp }}/purenote-preview/enlarged-text
run: xvfb-run -a -s '-screen 0 1440x2560x24' python tests/ui_smoke.py
- name: Upload UI previews
if: always()
uses: actions/upload-artifact@v4
with:
name: purenote-ui-preview
path: ${{ runner.temp }}/purenote-preview/
32 changes: 32 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
.venv/
.build-venv/
__pycache__/
*.pyc
*.bak
*.orig
notes.db
notes.db.orig.bak
PureNote_export/
.buildozer/
bin/
.DS_Store
.pytest_cache/
.ruff_cache/
*.db-wal
*.db-shm
*.keystore
*.jks
build.log
*.aab
*.apk
*.apks
*.idsig
.env
.env.*
*.pem
*.p12
*.pfx
secrets/
credentials*.json
*service-account*.json
notes.db.*
Loading
Loading