Add MetadataMangasPage and Compose genre tags Introduce MetadataMangasPage for sources (EHentai) to carry metadata and nextKey, update EHentai to return MetadataMangasPage and pass page param to popular requests. Add nextCursor handling to Pager and use it in BrowseSourcePager to derive the next page. UI/UX tweaks: normalize search queries for EH-based sources, set BrowseSourceController snackbar anchor to bottomNav and localize unknown error text. Migrate manga genre chips from ChipGroup to a ComposeVi... #36
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: Build app | |
| run-name: ${{ github.event_name == 'workflow_dispatch' && format('Build and Release v{0}', github.event.inputs.version) || github.event.commits[0].message }} | |
| on: | |
| push: | |
| branches: | |
| - master | |
| - backport/** | |
| workflow_dispatch: | |
| inputs: | |
| version: | |
| description: 'Version (without "v" prefix)' | |
| required: true | |
| type: string | |
| beta: | |
| description: 'Beta release' | |
| default: false | |
| required: false | |
| type: boolean | |
| message: | |
| description: 'Message for releases (the text at the top of changelog)' | |
| default: '' | |
| required: false | |
| type: string | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name == 'workflow_dispatch' }} | |
| cancel-in-progress: true | |
| jobs: | |
| build: | |
| name: Build app | |
| runs-on: ubuntu-latest | |
| environment: build | |
| steps: | |
| - name: Clone repo | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Setup Android SDK | |
| run: | | |
| ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager "build-tools;35.0.0" | |
| - name: Setup Gradle | |
| uses: null2264/actions/gradle-java-setup@363cb9cf3d66bd9c72ed6860142c6b2c121d7e94 | |
| with: | |
| java: 17 | |
| distro: temurin | |
| - name: Setup CHANGELOG parser | |
| uses: taiki-e/install-action@parse-changelog | |
| - name: Copy CI gradle.properties | |
| run: | | |
| mkdir -p ~/.gradle | |
| cp .github/runner-files/ci-gradle.properties ~/.gradle/gradle.properties | |
| - name: Extract branch name | |
| id: branch_name | |
| shell: bash | |
| run: echo "NAME=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT | |
| - name: Get changelog | |
| id: changelog | |
| shell: bash | |
| run: | | |
| # extended SemVer (major.minor.patch.hotfix) | |
| VERSION_FORMAT='^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*))?(-[0-9A-Za-z\.-]+)?(\+[0-9A-Za-z\.-]+)?$|^Unreleased$' | |
| { | |
| echo "CHANGELOG<<END_OF_FILE" | |
| parse-changelog CHANGELOG.md ${{ github.event.inputs.version == '' && 'Unreleased' || github.event.inputs.version }} --version-format $VERSION_FORMAT || parse-changelog CHANGELOG.md Unreleased --version-format $VERSION_FORMAT || echo "No documented changes so far..." | |
| echo "" | |
| echo "END_OF_FILE" | |
| } >> "$GITHUB_OUTPUT" 2> /dev/null | |
| # PROD | |
| - name: Prepare release build | |
| if: github.event.inputs.version != '' && github.event.inputs.beta != 'true' | |
| run: | | |
| set -x | |
| echo "VERSION_TAG=v${{github.event.inputs.version}}" >> $GITHUB_ENV | |
| echo "BUILD_TYPE=StandardRelease" >> $GITHUB_ENV | |
| # BETA | |
| - name: Prepare beta build | |
| if: github.event.inputs.version != '' && github.event.inputs.beta == 'true' | |
| run: | | |
| set -x | |
| BETA_COUNT=$(git tag -l --sort=refname "v${{github.event.inputs.version}}-b*" | tail -n1 | sed "s/^\S*-b//g") | |
| if [ -z "$BETA_COUNT" ]; then | |
| BETA_COUNT="1" | |
| else | |
| BETA_COUNT=$((BETA_COUNT+1)) | |
| fi | |
| echo "VERSION_TAG=v${{github.event.inputs.version}}-b${BETA_COUNT}" >> $GITHUB_ENV | |
| echo "BUILD_TYPE=StandardBeta" >> $GITHUB_ENV | |
| # NIGHTLY | |
| - name: Prepare nightly build | |
| if: steps.branch_name.outputs.NAME == 'master' && github.event.inputs.version == '' | |
| run: | | |
| set -x | |
| echo "VERSION_TAG=r$(git rev-list --count HEAD)" >> $GITHUB_ENV | |
| echo "BUILD_TYPE=StandardNightly" >> $GITHUB_ENV | |
| echo "COMMIT_HASH=$(git rev-parse HEAD)" >> $GITHUB_ENV | |
| echo "COMMIT_SHORT_HASH=$(git rev-parse --short HEAD)" >> $GITHUB_ENV | |
| - name: Build the app | |
| if: startsWith(env.BUILD_TYPE, 'Standard') | |
| run: ./gradlew assemble${{ env.BUILD_TYPE }} | |
| - name: Run unit tests | |
| if: startsWith(env.BUILD_TYPE, 'Standard') | |
| run: ./gradlew testReleaseUnitTest test${{ env.BUILD_TYPE }}UnitTest | |
| - name: Upload R8 APK to artifact | |
| uses: actions/upload-artifact@v4 | |
| if: env.VERSION_TAG != '' | |
| with: | |
| name: arm64-v8a-${{ github.sha }} | |
| path: app/build/outputs/apk/standard/*/app*-arm64-v8a-*.apk | |
| - name: Upload R8 mapping | |
| uses: actions/upload-artifact@v4 | |
| if: env.VERSION_TAG != '' | |
| with: | |
| name: mapping-${{ github.sha }} | |
| path: app/build/outputs/mapping/standard* | |
| - name: Publish test report | |
| uses: mikepenz/action-junit-report@v5 | |
| if: success() || failure() | |
| with: | |
| include_passed: true | |
| detailed_summary: true | |
| report_paths: '**/build/test-results/test*/TEST-*.xml' | |
| - name: Get version stage | |
| id: version_stage | |
| shell: bash | |
| run: | | |
| stage="" | |
| case "${{ env.VERSION_TAG }}" in | |
| v*) | |
| [ "$(echo '${{ env.VERSION_TAG }}' | grep 'v*-b')" = "" ] && stage="release" || stage="beta" | |
| ;; | |
| r*) stage="nightly" ;; | |
| esac | |
| [ "$stage" = "" ] && exit 1 # something went wrong | |
| echo "STAGE=${stage}" >> $GITHUB_OUTPUT | |
| - name: Sign APK | |
| uses: null2264/actions/android-signer@363cb9cf3d66bd9c72ed6860142c6b2c121d7e94 | |
| if: env.VERSION_TAG != '' | |
| with: | |
| releaseDir: app/build/outputs/apk/standard/${{ steps.version_stage.outputs.STAGE }} | |
| signingKeyBase64: ${{ secrets.SIGNING_KEY }} | |
| keyAlias: ${{ secrets.ALIAS }} | |
| keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }} | |
| keyPassword: ${{ secrets.KEY_PASSWORD }} | |
| summarise: true | |
| buildToolsVersion: 35.0.0 | |
| - name: Clean up build artifacts | |
| if: env.VERSION_TAG != '' | |
| run: | | |
| set -e | |
| dir="app/build/outputs/apk/standard/${{ steps.version_stage.outputs.STAGE }}" | |
| mv $dir/app-standard-universal-*-signed.apk hayai-${{ env.VERSION_TAG }}.apk | |
| sha=`sha256sum hayai-${{ env.VERSION_TAG }}.apk | awk '{ print $1 }'` | |
| echo "APK_UNIVERSAL_SHA=$sha" >> $GITHUB_ENV | |
| cp $dir/app-standard-arm64-v8a-*-signed.apk hayai-arm64-v8a-${{ env.VERSION_TAG }}.apk | |
| sha=`sha256sum hayai-arm64-v8a-${{ env.VERSION_TAG }}.apk | awk '{ print $1 }'` | |
| echo "APK_ARM64_V8A_SHA=$sha" >> $GITHUB_ENV | |
| cp $dir/app-standard-armeabi-v7a-*-signed.apk hayai-armeabi-v7a-${{ env.VERSION_TAG }}.apk | |
| sha=`sha256sum hayai-armeabi-v7a-${{ env.VERSION_TAG }}.apk | awk '{ print $1 }'` | |
| echo "APK_ARMEABI_V7A_SHA=$sha" >> $GITHUB_ENV | |
| cp $dir/app-standard-x86-*-signed.apk hayai-x86-${{ env.VERSION_TAG }}.apk | |
| sha=`sha256sum hayai-x86-${{ env.VERSION_TAG }}.apk | awk '{ print $1 }'` | |
| echo "APK_X86_SHA=$sha" >> $GITHUB_ENV | |
| cp $dir/app-standard-x86_64-*-signed.apk hayai-x86_64-${{ env.VERSION_TAG }}.apk | |
| sha=`sha256sum hayai-x86_64-${{ env.VERSION_TAG }}.apk | awk '{ print $1 }'` | |
| echo "APK_X86_64_SHA=$sha" >> $GITHUB_ENV | |
| - name: Create Release | |
| if: startsWith(env.VERSION_TAG, 'v') | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: ${{ env.VERSION_TAG }} | |
| name: Hayai ${{ env.VERSION_TAG }} | |
| body: | | |
| ${{ github.event.inputs.message }} | |
| ${{ steps.changelog.outputs.CHANGELOG }} | |
| --- | |
| ### Checksums | |
| | Variant | SHA-256 | | |
| | ------- | ------- | | |
| | Universal | ${{ env.APK_UNIVERSAL_SHA }} | |
| | arm64-v8a | ${{ env.APK_ARM64_V8A_SHA }} | |
| | armeabi-v7a | ${{ env.APK_ARMEABI_V7A_SHA }} | |
| | x86 | ${{ env.APK_X86_SHA }} | | |
| | x86_64 | ${{ env.APK_X86_64_SHA }} | | |
| > [!TIP] | |
| > | |
| > If you are unsure which version to download then go with **hayai-${{ env.VERSION_TAG }}.apk** | |
| files: | | |
| hayai-${{ env.VERSION_TAG }}.apk | |
| hayai-arm64-v8a-${{ env.VERSION_TAG }}.apk | |
| hayai-armeabi-v7a-${{ env.VERSION_TAG }}.apk | |
| hayai-x86-${{ env.VERSION_TAG }}.apk | |
| hayai-x86_64-${{ env.VERSION_TAG }}.apk | |
| draft: true | |
| prerelease: ${{ github.event.inputs.beta }} | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Create Nightly | |
| if: startsWith(env.VERSION_TAG, 'r') | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| repository: ig4e/hayai-nightly | |
| tag_name: ${{ env.VERSION_TAG }} | |
| name: Hayai Nightly (${{ env.VERSION_TAG }}) | |
| body: | | |
| > [!CAUTION] | |
| > _**This alpha version is for testing only!**_ | |
| > | |
| > This build is triggered by commit [`${{ env.COMMIT_SHORT_HASH }}`](https://github.com/ig4e/hayai/commit/${{ env.COMMIT_HASH }}) | |
| It is not ready for daily use and we do not guarantee its usability. Please download the latest stable releases instead (https://github.com/ig4e/hayai/releases/latest). If you insist, please be sure to ALWAYS backup before updating. | |
| ${{ steps.changelog.outputs.CHANGELOG }} | |
| --- | |
| ### Checksums | |
| | Variant | SHA-256 | | |
| | ------- | ------- | | |
| | Universal | ${{ env.APK_UNIVERSAL_SHA }} | |
| | arm64-v8a | ${{ env.APK_ARM64_V8A_SHA }} | |
| | armeabi-v7a | ${{ env.APK_ARMEABI_V7A_SHA }} | |
| | x86 | ${{ env.APK_X86_SHA }} | | |
| | x86_64 | ${{ env.APK_X86_64_SHA }} | | |
| > [!TIP] | |
| > | |
| > If you are unsure which version to download then go with **hayai-${{ env.VERSION_TAG }}.apk** | |
| files: | | |
| hayai-${{ env.VERSION_TAG }}.apk | |
| hayai-arm64-v8a-${{ env.VERSION_TAG }}.apk | |
| hayai-armeabi-v7a-${{ env.VERSION_TAG }}.apk | |
| hayai-x86-${{ env.VERSION_TAG }}.apk | |
| hayai-x86_64-${{ env.VERSION_TAG }}.apk | |
| draft: false | |
| prerelease: false | |
| token: ${{ secrets.NIGHTLY_PAT }} |