BAOSP Nightly Bundle #12
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: BAOSP Nightly Bundle | |
| on: | |
| # Runs every night at midnight UTC | |
| schedule: | |
| - cron: '0 0 * * *' | |
| # Also runnable manually any time | |
| workflow_dispatch: | |
| permissions: | |
| contents: write | |
| jobs: | |
| # ────────────────────────────────────────────── | |
| # Job 1: Build baosp-screenreader APK | |
| # ────────────────────────────────────────────── | |
| build-screenreader: | |
| name: Build Screen Reader (baosp-screenreader) | |
| runs-on: ubuntu-22.04 | |
| steps: | |
| - name: Checkout baosp-screenreader — latest main | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: tech-master33/baosp-screenreader | |
| ref: main | |
| fetch-depth: 0 | |
| path: baosp-screenreader | |
| - name: Print commit being built | |
| run: | | |
| cd baosp-screenreader | |
| echo "baosp-screenreader commit:" | |
| git log -1 --format="%H %s (%ci)" | |
| echo "ANDRDSCREN_SHA=$(git rev-parse --short HEAD)" >> $GITHUB_ENV | |
| echo "ANDRDSCREN_MSG=$(git log -1 --format='%s')" >> $GITHUB_ENV | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| - name: Set up Android SDK | |
| uses: android-actions/setup-android@v3 | |
| - name: Grant Gradle execute permission | |
| run: chmod +x baosp-screenreader/gradlew | |
| - name: Build APK | |
| working-directory: baosp-screenreader | |
| run: ./gradlew clean assembleDebug --no-daemon --stacktrace | |
| - name: Rename APK with version info | |
| run: | | |
| APK=$(find baosp-screenreader/app/build/outputs/apk/debug -name "*.apk" | head -1) | |
| mkdir -p /tmp/bundle | |
| cp "$APK" "/tmp/bundle/baosp-screenreader-${{ env.ANDRDSCREN_SHA }}.apk" | |
| echo "Screen reader APK ready: $(ls -lh /tmp/bundle/baosp-screenreader-*.apk)" | |
| - name: Upload screen reader APK | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: bundle-screenreader | |
| path: /tmp/bundle/baosp-screenreader-*.apk | |
| retention-days: 3 | |
| if-no-files-found: error | |
| # ────────────────────────────────────────────── | |
| # Job 2: Build baosp-tts TTS engine APK | |
| # ────────────────────────────────────────────── | |
| build-baosp-tts: | |
| name: Build TTS Engine (baosp-tts) | |
| runs-on: ubuntu-22.04 | |
| steps: | |
| - name: Checkout baosp-tts — latest main | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: tech-master33/baosp-tts | |
| ref: main | |
| fetch-depth: 0 | |
| path: baosp-tts | |
| - name: Print commit being built | |
| run: | | |
| cd baosp-tts | |
| echo "baosp-tts commit:" | |
| git log -1 --format="%H %s (%ci)" | |
| echo "AOTTS_SHA=$(git rev-parse --short HEAD)" >> $GITHUB_ENV | |
| echo "AOTTS_MSG=$(git log -1 --format='%s')" >> $GITHUB_ENV | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| - name: Set up Android SDK | |
| uses: android-actions/setup-android@v3 | |
| - name: Install Android NDK and CMake | |
| run: | | |
| echo "y" | sdkmanager "ndk;23.1.7779620" "cmake;3.22.1" | |
| echo "NDK_HOME=$ANDROID_SDK_ROOT/ndk/23.1.7779620" >> $GITHUB_ENV | |
| - name: Download SVOX Pico native source | |
| working-directory: baosp-tts | |
| run: | | |
| mkdir -p src/main/cpp/pico | |
| git clone --depth=1 \ | |
| https://android.googlesource.com/platform/external/svox \ | |
| /tmp/svox_src | |
| cp -r /tmp/svox_src/pico/* src/main/cpp/pico/ | |
| - name: Download SVOX Pico language data | |
| working-directory: baosp-tts | |
| run: | | |
| mkdir -p src/main/assets/lang | |
| SVOX_LANG="https://android.googlesource.com/platform/external/svox/+archive/refs/heads/master/pico/lang.tar.gz" | |
| curl -L "$SVOX_LANG" -o /tmp/pico_lang.tar.gz 2>/dev/null || true | |
| if [ -f /tmp/pico_lang.tar.gz ] && [ -s /tmp/pico_lang.tar.gz ]; then | |
| tar -xzf /tmp/pico_lang.tar.gz -C src/main/assets/lang/ 2>/dev/null || true | |
| fi | |
| if [ -z "$(ls -A src/main/assets/lang/*.bin 2>/dev/null)" ]; then | |
| git clone --depth=1 --filter=blob:none --sparse \ | |
| https://android.googlesource.com/platform/external/svox /tmp/svox_lang || true | |
| if [ -d /tmp/svox_lang ]; then | |
| git -C /tmp/svox_lang sparse-checkout set pico/lang | |
| git -C /tmp/svox_lang checkout || true | |
| find /tmp/svox_lang/pico/lang -name "*.bin" \ | |
| -exec cp {} src/main/assets/lang/ \; 2>/dev/null || true | |
| fi | |
| fi | |
| echo "Language files:"; ls -lh src/main/assets/lang/ | |
| - name: Grant Gradle execute permission | |
| run: chmod +x baosp-tts/gradlew | |
| - name: Build APK | |
| working-directory: baosp-tts | |
| run: | | |
| ./gradlew clean assembleDebug \ | |
| -Pandroid.ndkVersion=23.1.7779620 \ | |
| --no-daemon --stacktrace | |
| - name: Rename APK with version info | |
| run: | | |
| APK=$(find baosp-tts/build/outputs/apk/debug -name "*.apk" | head -1) | |
| mkdir -p /tmp/bundle | |
| cp "$APK" "/tmp/bundle/baosp-tts-${{ env.AOTTS_SHA }}.apk" | |
| echo "TTS APK ready: $(ls -lh /tmp/bundle/baosp-tts-*.apk)" | |
| - name: Upload baosp-tts APK | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: bundle-baosp-tts | |
| path: /tmp/bundle/baosp-tts-*.apk | |
| retention-days: 3 | |
| if-no-files-found: error | |
| # ────────────────────────────────────────────── | |
| # Job 3: Build baosp-clock APK | |
| # ────────────────────────────────────────────── | |
| build-baosp-clock: | |
| name: Build Clock (baosp-clock) | |
| runs-on: ubuntu-22.04 | |
| steps: | |
| - name: Checkout baosp-clock — latest master | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: tech-master33/baosp-clock | |
| ref: master | |
| fetch-depth: 0 | |
| path: baosp-clock | |
| - name: Print commit being built | |
| run: | | |
| cd baosp-clock | |
| echo "baosp-clock commit:" | |
| git log -1 --format="%H %s (%ci)" | |
| echo "CLOCK_SHA=$(git rev-parse --short HEAD)" >> $GITHUB_ENV | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| - name: Set up Android SDK | |
| uses: android-actions/setup-android@v3 | |
| - name: Grant Gradle execute permission | |
| run: chmod +x baosp-clock/gradlew | |
| - name: Build APK | |
| working-directory: baosp-clock | |
| run: ./gradlew clean assembleDebug --no-daemon --stacktrace | |
| - name: Rename APK with version info | |
| run: | | |
| APK=$(find baosp-clock/app/build/outputs/apk/debug -name "*.apk" | head -1) | |
| mkdir -p /tmp/bundle | |
| cp "$APK" "/tmp/bundle/baosp-clock-${{ env.CLOCK_SHA }}.apk" | |
| echo "Clock APK ready: $(ls -lh /tmp/bundle/baosp-clock-*.apk)" | |
| - name: Upload baosp-clock APK | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: bundle-baosp-clock | |
| path: /tmp/bundle/baosp-clock-*.apk | |
| retention-days: 3 | |
| if-no-files-found: error | |
| # ────────────────────────────────────────────── | |
| # Job 4: Build baosp-calc APK | |
| # ────────────────────────────────────────────── | |
| build-baosp-calc: | |
| name: Build Calculator (baosp-calc) | |
| runs-on: ubuntu-22.04 | |
| steps: | |
| - name: Checkout baosp-calc — latest master | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: tech-master33/baosp-calc | |
| ref: master | |
| fetch-depth: 0 | |
| path: baosp-calc | |
| - name: Print commit being built | |
| run: | | |
| cd baosp-calc | |
| echo "baosp-calc commit:" | |
| git log -1 --format="%H %s (%ci)" | |
| echo "CALC_SHA=$(git rev-parse --short HEAD)" >> $GITHUB_ENV | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| - name: Set up Android SDK | |
| uses: android-actions/setup-android@v3 | |
| - name: Grant Gradle execute permission | |
| run: chmod +x baosp-calc/gradlew | |
| - name: Build APK | |
| working-directory: baosp-calc | |
| run: ./gradlew clean assembleDebug --no-daemon --stacktrace | |
| - name: Rename APK with version info | |
| run: | | |
| APK=$(find baosp-calc/app/build/outputs/apk/debug -name "*.apk" | head -1) | |
| mkdir -p /tmp/bundle | |
| cp "$APK" "/tmp/bundle/baosp-calc-${{ env.CALC_SHA }}.apk" | |
| echo "Calc APK ready: $(ls -lh /tmp/bundle/baosp-calc-*.apk)" | |
| - name: Upload baosp-calc APK | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: bundle-baosp-calc | |
| path: /tmp/bundle/baosp-calc-*.apk | |
| retention-days: 3 | |
| if-no-files-found: error | |
| # ────────────────────────────────────────────── | |
| # Job 5: Build baosp-panel APK | |
| # ────────────────────────────────────────────── | |
| build-baosp-panel: | |
| name: Build Panel (baosp-panel) | |
| runs-on: ubuntu-22.04 | |
| steps: | |
| - name: Checkout baosp-panel — latest master | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: tech-master33/baosp-panel | |
| ref: master | |
| fetch-depth: 0 | |
| path: baosp-panel | |
| - name: Print commit being built | |
| run: | | |
| cd baosp-panel | |
| echo "baosp-panel commit:" | |
| git log -1 --format="%H %s (%ci)" | |
| echo "PANEL_SHA=$(git rev-parse --short HEAD)" >> $GITHUB_ENV | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| - name: Set up Android SDK | |
| uses: android-actions/setup-android@v3 | |
| - name: Grant Gradle execute permission | |
| run: chmod +x baosp-panel/gradlew | |
| - name: Build APK | |
| working-directory: baosp-panel | |
| run: ./gradlew clean assembleDebug --no-daemon --stacktrace | |
| - name: Rename APK with version info | |
| run: | | |
| APK=$(find baosp-panel/app/build/outputs/apk/debug -name "*.apk" | head -1) | |
| mkdir -p /tmp/bundle | |
| cp "$APK" "/tmp/bundle/baosp-panel-${{ env.PANEL_SHA }}.apk" | |
| echo "Panel APK ready: $(ls -lh /tmp/bundle/baosp-panel-*.apk)" | |
| - name: Upload baosp-panel APK | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: bundle-baosp-panel | |
| path: /tmp/bundle/baosp-panel-*.apk | |
| retention-days: 3 | |
| if-no-files-found: error | |
| # ────────────────────────────────────────────── | |
| # Job 6: Build baosp-braille APK | |
| # ────────────────────────────────────────────── | |
| build-baosp-braille: | |
| name: Build Braille Driver (baosp-braille) | |
| runs-on: ubuntu-22.04 | |
| steps: | |
| - name: Checkout baosp-braille — latest main | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: tech-master33/baosp-braille | |
| ref: main | |
| fetch-depth: 0 | |
| path: baosp-braille | |
| - name: Print commit being built | |
| run: | | |
| cd baosp-braille | |
| echo "baosp-braille commit:" | |
| git log -1 --format="%H %s (%ci)" | |
| echo "BRAILLE_SHA=$(git rev-parse --short HEAD)" >> $GITHUB_ENV | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| - name: Set up Android SDK | |
| uses: android-actions/setup-android@v3 | |
| - name: Grant Gradle execute permission | |
| run: chmod +x baosp-braille/gradlew | |
| - name: Build APK | |
| working-directory: baosp-braille | |
| run: ./gradlew clean assembleDebug --no-daemon --stacktrace | |
| - name: Rename APK with version info | |
| run: | | |
| APK=$(find baosp-braille/app/build/outputs/apk/debug -name "*.apk" | head -1) | |
| mkdir -p /tmp/bundle | |
| cp "$APK" "/tmp/bundle/baosp-braille-${{ env.BRAILLE_SHA }}.apk" | |
| echo "Braille APK ready: $(ls -lh /tmp/bundle/baosp-braille-*.apk)" | |
| - name: Upload baosp-braille APK | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: bundle-baosp-braille | |
| path: /tmp/bundle/baosp-braille-*.apk | |
| retention-days: 3 | |
| if-no-files-found: error | |
| # ────────────────────────────────────────────── | |
| # Job 7: Publish combined nightly release | |
| # Waits for all 6 builds, then creates/updates a | |
| # single "nightly" release in the baosp repo | |
| # with all APKs attached. | |
| # ────────────────────────────────────────────── | |
| publish-nightly: | |
| name: Publish Nightly Bundle Release | |
| runs-on: ubuntu-22.04 | |
| needs: [build-screenreader, build-baosp-tts, build-baosp-clock, build-baosp-calc, build-baosp-panel, build-baosp-braille] | |
| steps: | |
| - name: Download all APKs | |
| uses: actions/download-artifact@v4 | |
| with: | |
| pattern: bundle-* | |
| path: /tmp/release | |
| merge-multiple: true | |
| - name: List release files | |
| run: ls -lh /tmp/release/ | |
| - name: Get today's date | |
| run: echo "TODAY=$(date -u '+%Y-%m-%d')" >> $GITHUB_ENV | |
| - name: Delete existing nightly release (if any) | |
| run: | | |
| RELEASE_ID=$(curl -s \ | |
| -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ | |
| -H "Accept: application/vnd.github+json" \ | |
| "https://api.github.com/repos/tech-master33/baosp/releases/tags/nightly" \ | |
| | tr ',' '\n' | grep '"id"' | head -1 | sed 's/[^0-9]//g') | |
| if [ -n "$RELEASE_ID" ]; then | |
| curl -s -X DELETE \ | |
| -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ | |
| -H "Accept: application/vnd.github+json" \ | |
| "https://api.github.com/repos/tech-master33/baosp/releases/$RELEASE_ID" | |
| echo "Deleted old nightly release (ID $RELEASE_ID)" | |
| fi | |
| curl -s -X DELETE \ | |
| -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ | |
| -H "Accept: application/vnd.github+json" \ | |
| "https://api.github.com/repos/tech-master33/baosp/git/refs/tags/nightly" || true | |
| - name: Collect recent commits from all repos | |
| run: | | |
| for repo in baosp-screenreader baosp-tts baosp-clock baosp-calc baosp-panel; do | |
| LOG=$(curl -s \ | |
| -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ | |
| -H "Accept: application/vnd.github+json" \ | |
| "https://api.github.com/repos/tech-master33/$repo/commits?per_page=5" \ | |
| | tr '{' '\n' | grep '"sha"\|"message"' | paste - - \ | |
| | sed 's/.*"sha": *"//;s/".*//' \ | |
| | head -5 || echo "- no commits") | |
| echo "### $repo" >> /tmp/new_entry.md | |
| echo "$LOG" >> /tmp/new_entry.md | |
| echo "" >> /tmp/new_entry.md | |
| done | |
| - name: Update CHANGELOG.md in baosp repo | |
| run: | | |
| RESPONSE=$(curl -s \ | |
| -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ | |
| -H "Accept: application/vnd.github+json" \ | |
| "https://api.github.com/repos/tech-master33/baosp/contents/CHANGELOG.md") | |
| CURRENT_SHA=$(echo "$RESPONSE" | tr ',' '\n' | grep '"sha"' | head -1 \ | |
| | sed 's/.*"sha": *"//;s/".*//') | |
| CURRENT_B64=$(echo "$RESPONSE" | tr ',' '\n' | grep '"content"' \ | |
| | sed 's/.*"content": *"//;s/","encoding".*//' | tr -d '\\n') | |
| DATE=$(date -u '+%Y-%m-%d') | |
| NEW_HEADER="## $DATE" | |
| NEW_ENTRY="$NEW_HEADER\n$(cat /tmp/new_entry.md)\n---\n" | |
| DECODED=$(echo "$CURRENT_B64" | base64 -d 2>/dev/null || echo "") | |
| MARKER="<!-- CHANGELOG_ENTRIES -->" | |
| if echo "$DECODED" | grep -q "$MARKER"; then | |
| UPDATED=$(echo "$DECODED" | sed "s|$MARKER|$MARKER\n\n$NEW_HEADER\n|") | |
| else | |
| UPDATED="$NEW_ENTRY\n$DECODED" | |
| fi | |
| ENCODED=$(printf '%s' "$UPDATED" | base64 -w 0) | |
| curl -s -X PUT \ | |
| -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ | |
| -H "Accept: application/vnd.github+json" \ | |
| "https://api.github.com/repos/tech-master33/baosp/contents/CHANGELOG.md" \ | |
| -d "{\"message\":\"changelog: nightly $DATE\",\"sha\":\"$CURRENT_SHA\",\"content\":\"$ENCODED\"}" \ | |
| | tr ',' '\n' | grep '"html_url"' | head -1 || echo "CHANGELOG update skipped" | |
| - name: Create nightly release with all APKs | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: nightly | |
| name: "BAOSP Nightly — ${{ env.TODAY }}" | |
| prerelease: true | |
| body: | | |
| ## BAOSP Nightly Bundle — ${{ env.TODAY }} | |
| Updated automatically every night with the latest builds of all BAOSP apps. | |
| Full commit history: [CHANGELOG.md](https://github.com/tech-master33/baosp/blob/main/CHANGELOG.md) | |
| ### What's included | |
| | File | Description | | |
| |------|-------------| | |
| | `baosp-screenreader-*.apk` | Screen reader — enable in Accessibility settings | | |
| | `baosp-tts-*.apk` | TTS engine with SVOX Pico voice data | | |
| | `aoler-*.apk` | Accessible home screen launcher | | |
| | `baosp-clock-*.apk` | Clock, alarm, timer, stopwatch | | |
| | `baosp-calc-*.apk` | Calculator with voice announcements | | |
| | `baosp-panel-*.apk` | Quick-access panel for speech rate, flashlight, volume | | |
| | `baosp-braille-*.apk` | Bluetooth Braille display driver | | |
| ### How to install on your Android device | |
| 1. Download all APKs from the files below | |
| 2. Transfer them to your device (email, cloud drive, USB) | |
| 3. Install each APK — allow "unknown sources" if prompted | |
| 4. **Enable screen reader:** Settings → Accessibility → Downloaded services → baosp-screenreader → turn on | |
| 5. **Set TTS engine:** Settings → Language & input → Text-to-speech output → select BAOSP TTS | |
| 6. **Set launcher:** Press Home → select aoler → Always | |
| 7. **Braille display:** pair via Bluetooth, then enable BAOSP Braille in Accessibility settings | |
| 8. **Other apps:** open from app drawer after install | |
| --- | |
| *Built automatically from the latest commit on each repo's master/main branch.* | |
| files: | | |
| /tmp/release/*.apk | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |