Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8a26587250 | ||
|
|
bb68869fe1 | ||
|
|
e60ca7115a | ||
|
|
e03a200c32 | ||
|
|
8713faa487 |
114
.github/workflows/auto_release.yml
vendored
114
.github/workflows/auto_release.yml
vendored
@@ -1,114 +0,0 @@
|
|||||||
name: Build automatic release
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 0 * * *'
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check:
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
outputs:
|
|
||||||
should_build: ${{ steps.check-updates.outputs.has_changes }}
|
|
||||||
steps:
|
|
||||||
- name: Check for updates 🌏
|
|
||||||
id: check-updates
|
|
||||||
run: |
|
|
||||||
last_run=$(curl -s "https://api.github.com/repos/${{ github.repository }}/releases/latest" | jq -r '.created_at')
|
|
||||||
kotatsu_updated=$(curl -s "https://api.github.com/repos/KotatsuApp/Kotatsu/commits?since=$last_run" | jq '. | length')
|
|
||||||
parsers_updated=$(curl -s "https://api.github.com/repos/KotatsuApp/kotatsu-parsers/commits?since=$last_run" | jq '. | length')
|
|
||||||
if [ "$kotatsu_updated" -gt "0" ] || [ "$parsers_updated" -gt "0" ]; then
|
|
||||||
echo "has_changes=true" >> $GITHUB_OUTPUT
|
|
||||||
else
|
|
||||||
echo "has_changes=false" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
|
|
||||||
build:
|
|
||||||
needs: check
|
|
||||||
if: needs.check.outputs.should_build == 'true'
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
outputs:
|
|
||||||
new_tag: ${{ steps.tagger.outputs.new_tag }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
ref: autobuild
|
|
||||||
|
|
||||||
- uses: actions/setup-java@v4
|
|
||||||
with:
|
|
||||||
distribution: 'temurin'
|
|
||||||
java-version: '17'
|
|
||||||
cache: 'gradle'
|
|
||||||
|
|
||||||
- name: Setup Android SDK 💻
|
|
||||||
uses: android-actions/setup-android@v3
|
|
||||||
|
|
||||||
- name: Grant permissions 💻
|
|
||||||
run: chmod a+x gradlew
|
|
||||||
|
|
||||||
- name: Generate build number 📆
|
|
||||||
id: tagger
|
|
||||||
run: |
|
|
||||||
echo "new_tag=$(./gradlew -q versionInfo -DbuildNumberIncrement=true)" >> $GITHUB_OUTPUT
|
|
||||||
echo "formatted_date=$(date +'%Y/%m/%d')" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Decode Keystore
|
|
||||||
id: decode_keystore
|
|
||||||
uses: timheuer/base64-to-file@v1
|
|
||||||
with:
|
|
||||||
fileName: 'keystore/kotatsu.jks'
|
|
||||||
encodedString: ${{ secrets.ANDROID_SIGNING_KEY }}
|
|
||||||
|
|
||||||
- name: Building new APK 💻
|
|
||||||
run: >-
|
|
||||||
./gradlew assembleRelease
|
|
||||||
-DparsersVersionOverride=$(curl -s https://api.github.com/repos/kotatsuapp/kotatsu-parsers/commits/master -H "Accept: application/vnd.github.sha" | cut -c -10)
|
|
||||||
|
|
||||||
- name: Prepare to Upload 🌏
|
|
||||||
run: |
|
|
||||||
mv ${{steps.sign_app.outputs.signedFile}} app/build/outputs/apk/release/release.apk
|
|
||||||
echo "SIGNED_APK=app/build/outputs/apk/release/release.apk" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Get latest changes 📑
|
|
||||||
id: changelog
|
|
||||||
run: |
|
|
||||||
CHANGELOG=$(cat CHANGELOG.txt)
|
|
||||||
echo "content<<EOF" >> $GITHUB_OUTPUT
|
|
||||||
echo "$CHANGELOG" >> $GITHUB_OUTPUT
|
|
||||||
echo "EOF" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Create new GH Release + Uploading 🌏
|
|
||||||
uses: softprops/action-gh-release@v2
|
|
||||||
with:
|
|
||||||
tag_name: v${{ steps.tagger.outputs.new_tag }}
|
|
||||||
name: "Build ${{ steps.tagger.outputs.new_tag }}"
|
|
||||||
body: |
|
|
||||||
Automated build generated on ${{ steps.tagger.outputs.formatted_date }}
|
|
||||||
|
|
||||||
${{ steps.changelog.outputs.content }}
|
|
||||||
files: ${{ env.SIGNED_APK }}
|
|
||||||
prerelease: false
|
|
||||||
|
|
||||||
update:
|
|
||||||
needs: build
|
|
||||||
if: needs.check.outputs.should_build == 'true'
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
ref: autobuild
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Commit 🌏
|
|
||||||
run: |
|
|
||||||
git config --local user.email "autorelease@users.noreply.github.com"
|
|
||||||
git config --local user.name "autorelease"
|
|
||||||
if [[ -n $(git status -s) ]]; then
|
|
||||||
git add README.md
|
|
||||||
git commit -m "Automatic release v${{ needs.build.outputs.new_tag }}"
|
|
||||||
git push origin autobuild
|
|
||||||
else
|
|
||||||
echo "No changes to push!"
|
|
||||||
fi
|
|
||||||
@@ -9,24 +9,17 @@ plugins {
|
|||||||
id 'dagger.hilt.android.plugin'
|
id 'dagger.hilt.android.plugin'
|
||||||
}
|
}
|
||||||
|
|
||||||
def Properties versionProps = getVersionProps()
|
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdk = 35
|
compileSdk = 35
|
||||||
buildToolsVersion = '35.0.0'
|
buildToolsVersion = '35.0.0'
|
||||||
namespace = 'org.koitharu.kotatsu'
|
namespace = 'org.koitharu.kotatsu'
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
def code = versionProps['code'].toInteger()
|
|
||||||
def base = versionProps['base'].trim()
|
|
||||||
def build = versionProps['build'].toInteger()
|
|
||||||
def variant = versionProps['variant'].trim()
|
|
||||||
|
|
||||||
applicationId 'org.koitharu.kotatsu'
|
applicationId 'org.koitharu.kotatsu'
|
||||||
minSdk = 21
|
minSdk = 21
|
||||||
targetSdk = 35
|
targetSdk = 35
|
||||||
versionCode = code * 1000 + build
|
versionCode = 702
|
||||||
versionName = base + (build == 0 ? '' : '.' + build) + (variant == '' ? '' : '-') + variant
|
versionName = '7.7.10'
|
||||||
generatedDensities = []
|
generatedDensities = []
|
||||||
testInstrumentationRunner 'org.koitharu.kotatsu.HiltTestRunner'
|
testInstrumentationRunner 'org.koitharu.kotatsu.HiltTestRunner'
|
||||||
ksp {
|
ksp {
|
||||||
@@ -37,22 +30,6 @@ android {
|
|||||||
generateLocaleConfig true
|
generateLocaleConfig true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
signingConfigs {
|
|
||||||
release {
|
|
||||||
def tmpFilePath = System.getProperty("user.home") + "/work/_temp/keystore/"
|
|
||||||
def allFilesFromDir = new File(tmpFilePath).listFiles()
|
|
||||||
|
|
||||||
if (allFilesFromDir != null) {
|
|
||||||
def keystoreFile = allFilesFromDir.first()
|
|
||||||
keystoreFile.renameTo("keystore/kotatsu.jks")
|
|
||||||
}
|
|
||||||
|
|
||||||
storeFile = file("keystore/kotatsu.jks")
|
|
||||||
storePassword System.getenv("SIGNING_STORE_PASSWORD")
|
|
||||||
keyAlias System.getenv("SIGNING_KEY_ALIAS")
|
|
||||||
keyPassword System.getenv("SIGNING_KEY_PASSWORD")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
debug {
|
debug {
|
||||||
applicationIdSuffix = '.debug'
|
applicationIdSuffix = '.debug'
|
||||||
@@ -61,7 +38,6 @@ android {
|
|||||||
minifyEnabled true
|
minifyEnabled true
|
||||||
shrinkResources true
|
shrinkResources true
|
||||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
signingConfig signingConfigs.release
|
|
||||||
}
|
}
|
||||||
nightly {
|
nightly {
|
||||||
initWith release
|
initWith release
|
||||||
@@ -218,22 +194,3 @@ dependencies {
|
|||||||
androidTestImplementation libs.hilt.android.testing
|
androidTestImplementation libs.hilt.android.testing
|
||||||
kaptAndroidTest libs.hilt.android.compiler
|
kaptAndroidTest libs.hilt.android.compiler
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.register('versionInfo') {
|
|
||||||
def base = versionProps['base'].trim()
|
|
||||||
def build = versionProps['build'].toInteger()
|
|
||||||
def variant = versionProps['variant'].trim()
|
|
||||||
println base + (build == 0 ? '' : '.' + build) + (variant == '' ? '' : '-') + variant
|
|
||||||
}
|
|
||||||
|
|
||||||
def getVersionProps() {
|
|
||||||
def versionPropsFile = file('version.properties')
|
|
||||||
def Properties versionProps = new Properties()
|
|
||||||
versionProps.load(new FileInputStream(versionPropsFile))
|
|
||||||
if (System.getProperty('buildNumberIncrement') == 'true') {
|
|
||||||
def code = versionProps['build'].toInteger() + 1
|
|
||||||
versionProps['build'] = code.toString()
|
|
||||||
versionProps.store(versionPropsFile.newWriter(), null)
|
|
||||||
}
|
|
||||||
return versionProps
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import org.koitharu.kotatsu.core.ui.list.fastscroll.FastScroller
|
|||||||
import org.koitharu.kotatsu.list.ui.adapter.ListHeaderClickListener
|
import org.koitharu.kotatsu.list.ui.adapter.ListHeaderClickListener
|
||||||
import org.koitharu.kotatsu.list.ui.adapter.ListItemType
|
import org.koitharu.kotatsu.list.ui.adapter.ListItemType
|
||||||
import org.koitharu.kotatsu.list.ui.adapter.emptyStateListAD
|
import org.koitharu.kotatsu.list.ui.adapter.emptyStateListAD
|
||||||
|
import org.koitharu.kotatsu.list.ui.adapter.errorStateListAD
|
||||||
import org.koitharu.kotatsu.list.ui.adapter.listHeaderAD
|
import org.koitharu.kotatsu.list.ui.adapter.listHeaderAD
|
||||||
import org.koitharu.kotatsu.list.ui.adapter.loadingFooterAD
|
import org.koitharu.kotatsu.list.ui.adapter.loadingFooterAD
|
||||||
import org.koitharu.kotatsu.list.ui.adapter.loadingStateAD
|
import org.koitharu.kotatsu.list.ui.adapter.loadingStateAD
|
||||||
@@ -25,6 +26,7 @@ class BookmarksAdapter(
|
|||||||
init {
|
init {
|
||||||
addDelegate(ListItemType.PAGE_THUMB, bookmarkLargeAD(coil, lifecycleOwner, clickListener))
|
addDelegate(ListItemType.PAGE_THUMB, bookmarkLargeAD(coil, lifecycleOwner, clickListener))
|
||||||
addDelegate(ListItemType.HEADER, listHeaderAD(headerClickListener))
|
addDelegate(ListItemType.HEADER, listHeaderAD(headerClickListener))
|
||||||
|
addDelegate(ListItemType.STATE_ERROR, errorStateListAD(null))
|
||||||
addDelegate(ListItemType.FOOTER_LOADING, loadingFooterAD())
|
addDelegate(ListItemType.FOOTER_LOADING, loadingFooterAD())
|
||||||
addDelegate(ListItemType.STATE_LOADING, loadingStateAD())
|
addDelegate(ListItemType.STATE_LOADING, loadingStateAD())
|
||||||
addDelegate(ListItemType.STATE_EMPTY, emptyStateListAD(coil, lifecycleOwner, null))
|
addDelegate(ListItemType.STATE_EMPTY, emptyStateListAD(coil, lifecycleOwner, null))
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import org.koitharu.kotatsu.core.db.migrations.Migration1To2
|
|||||||
import org.koitharu.kotatsu.core.db.migrations.Migration20To21
|
import org.koitharu.kotatsu.core.db.migrations.Migration20To21
|
||||||
import org.koitharu.kotatsu.core.db.migrations.Migration21To22
|
import org.koitharu.kotatsu.core.db.migrations.Migration21To22
|
||||||
import org.koitharu.kotatsu.core.db.migrations.Migration22To23
|
import org.koitharu.kotatsu.core.db.migrations.Migration22To23
|
||||||
|
import org.koitharu.kotatsu.core.db.migrations.Migration24To23
|
||||||
import org.koitharu.kotatsu.core.db.migrations.Migration2To3
|
import org.koitharu.kotatsu.core.db.migrations.Migration2To3
|
||||||
import org.koitharu.kotatsu.core.db.migrations.Migration3To4
|
import org.koitharu.kotatsu.core.db.migrations.Migration3To4
|
||||||
import org.koitharu.kotatsu.core.db.migrations.Migration4To5
|
import org.koitharu.kotatsu.core.db.migrations.Migration4To5
|
||||||
@@ -128,6 +129,7 @@ fun getDatabaseMigrations(context: Context): Array<Migration> = arrayOf(
|
|||||||
Migration20To21(),
|
Migration20To21(),
|
||||||
Migration21To22(),
|
Migration21To22(),
|
||||||
Migration22To23(),
|
Migration22To23(),
|
||||||
|
Migration24To23(),
|
||||||
)
|
)
|
||||||
|
|
||||||
fun MangaDatabase(context: Context): MangaDatabase = Room
|
fun MangaDatabase(context: Context): MangaDatabase = Room
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package org.koitharu.kotatsu.core.db.migrations
|
||||||
|
|
||||||
|
import androidx.room.migration.Migration
|
||||||
|
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||||
|
|
||||||
|
class Migration24To23 : Migration(24, 23) {
|
||||||
|
|
||||||
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
|
db.execSQL("DROP TABLE IF EXISTS `chapters`")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -62,7 +62,7 @@ class LocalMangaParser(private val uri: Uri) {
|
|||||||
mangaInfo.copy(
|
mangaInfo.copy(
|
||||||
source = LocalMangaSource,
|
source = LocalMangaSource,
|
||||||
url = rootFile.toUri().toString(),
|
url = rootFile.toUri().toString(),
|
||||||
coverUrl = coverEntry?.let { uri.child(it, resolve = true).toString() }.orEmpty(),
|
coverUrl = coverEntry?.let { uri.child(it, resolve = true).toString() },
|
||||||
largeCoverUrl = null,
|
largeCoverUrl = null,
|
||||||
chapters = if (withDetails) {
|
chapters = if (withDetails) {
|
||||||
mangaInfo.chapters?.mapNotNull { c ->
|
mangaInfo.chapters?.mapNotNull { c ->
|
||||||
@@ -92,9 +92,7 @@ class LocalMangaParser(private val uri: Uri) {
|
|||||||
url = rootFile.toUri().toString(),
|
url = rootFile.toUri().toString(),
|
||||||
publicUrl = rootFile.toUri().toString(),
|
publicUrl = rootFile.toUri().toString(),
|
||||||
source = LocalMangaSource,
|
source = LocalMangaSource,
|
||||||
coverUrl = coverEntry?.let {
|
coverUrl = coverEntry?.let { uri.child(it, resolve = true).toString() },
|
||||||
uri.child(it, resolve = true).toString()
|
|
||||||
}.orEmpty(),
|
|
||||||
chapters = if (withDetails) {
|
chapters = if (withDetails) {
|
||||||
val chapters = fileSystem.listRecursively(rootPath)
|
val chapters = fileSystem.listRecursively(rootPath)
|
||||||
.mapNotNullTo(HashSet()) { path ->
|
.mapNotNullTo(HashSet()) { path ->
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
#Wed Jan 22 19:14:17 EET 2025
|
|
||||||
code=1
|
|
||||||
build=8
|
|
||||||
variant=
|
|
||||||
base=7.7
|
|
||||||
@@ -31,7 +31,7 @@ material = "1.12.0"
|
|||||||
moshi = "1.15.2"
|
moshi = "1.15.2"
|
||||||
okhttp = "4.12.0"
|
okhttp = "4.12.0"
|
||||||
okio = "3.9.1"
|
okio = "3.9.1"
|
||||||
parsers = "51ed1b2db8"
|
parsers = "794a737b6d"
|
||||||
preference = "1.2.1"
|
preference = "1.2.1"
|
||||||
recyclerview = "1.3.2"
|
recyclerview = "1.3.2"
|
||||||
room = "2.6.1"
|
room = "2.6.1"
|
||||||
|
|||||||
Reference in New Issue
Block a user