Skip to content

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

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...

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

Workflow file for this run

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 }}