diff --git a/app/src/androidTest/java/io/legado/app/UpdateTest.kt b/app/src/androidTest/java/io/legado/app/UpdateTest.kt index 23a82ae8c..f9f1ac0a0 100644 --- a/app/src/androidTest/java/io/legado/app/UpdateTest.kt +++ b/app/src/androidTest/java/io/legado/app/UpdateTest.kt @@ -4,7 +4,7 @@ import com.google.gson.Gson import io.legado.app.exception.NoStackTraceException import io.legado.app.help.http.okHttpClient import io.legado.app.model.GithubRelease -import io.legado.app.utils.fromJsonArray +import io.legado.app.utils.fromJsonObject import okhttp3.Request import org.junit.Assert.assertTrue import org.junit.Test @@ -12,21 +12,41 @@ import org.junit.Test class UpdateTest { private val lastReleaseUrl = - "https://api.github.com/repos/gedoor/legado/releases?page=1?per_page=1" + "https://api.github.com/repos/gedoor/legado/releases/latest" + + private val lastBetaReleaseUrl = + "https://api.github.com/repos/gedoor/legado/releases/tags/beta" + + @Test + fun updateApp_beta() { + val body = okHttpClient.newCall(Request.Builder().url(lastBetaReleaseUrl).build()).execute() + .body!!.string() + + val releaseList = Gson().fromJsonObject(body) + .getOrElse { + throw NoStackTraceException("获取新版本出错 " + it.localizedMessage) + } + .gitReleaseToAppReleaseInfo() + .sortedByDescending { it.createdAt } + + assertTrue(releaseList.size == 2) + assertTrue(releaseList.all { it.downloadUrl.isNotBlank() }) + assertTrue(releaseList.all { it.versionName.isNotBlank() }) + } @Test fun updateApp() { val body = okHttpClient.newCall(Request.Builder().url(lastReleaseUrl).build()).execute() .body!!.string() - val releaseList = Gson().fromJsonArray(body) + val releaseList = Gson().fromJsonObject(body) .getOrElse { throw NoStackTraceException("获取新版本出错 " + it.localizedMessage) } - .flatMap { it.gitReleaseToAppReleaseInfo() } + .gitReleaseToAppReleaseInfo() .sortedByDescending { it.createdAt } - assertTrue(releaseList.isNotEmpty()) + assertTrue(releaseList.size == 1) assertTrue(releaseList.all { it.downloadUrl.isNotBlank() }) assertTrue(releaseList.all { it.versionName.isNotBlank() }) } diff --git a/app/src/main/java/io/legado/app/constant/AppConst.kt b/app/src/main/java/io/legado/app/constant/AppConst.kt index 0bd021452..8d627b8af 100644 --- a/app/src/main/java/io/legado/app/constant/AppConst.kt +++ b/app/src/main/java/io/legado/app/constant/AppConst.kt @@ -61,7 +61,7 @@ object AppConst { appInfo.versionName = it.versionName // TODO: 增加测试版还是正式版的检查 if (it.packageName.contains("releaseA")) { - appInfo.appVariant = AppVariant.COMPATIBLE + appInfo.appVariant = AppVariant.BETA_RELEASEA } if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) { diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index c389e90a3..5c5ec94d6 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -145,7 +145,7 @@ object PreferKey { const val mouseWheelPage = "mouseWheelPage" const val recordHeapDump = "recordHeapDump" const val optimizeRender = "optimizeRender" - const val updateToBeta = "updateToBeta" + const val updateToVariant = "updateToVariant" const val cPrimary = "colorPrimary" const val cAccent = "colorAccent" diff --git a/app/src/main/java/io/legado/app/help/AppUpdate.kt b/app/src/main/java/io/legado/app/help/AppUpdate.kt index 967795f32..af9b572f8 100644 --- a/app/src/main/java/io/legado/app/help/AppUpdate.kt +++ b/app/src/main/java/io/legado/app/help/AppUpdate.kt @@ -23,8 +23,6 @@ object AppUpdate { fun check(scope: CoroutineScope): Coroutine - fun checkBeta(scope: CoroutineScope): Coroutine - } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/AppUpdateGitHub.kt b/app/src/main/java/io/legado/app/help/AppUpdateGitHub.kt index 65c90fdb9..7bc860713 100644 --- a/app/src/main/java/io/legado/app/help/AppUpdateGitHub.kt +++ b/app/src/main/java/io/legado/app/help/AppUpdateGitHub.kt @@ -4,33 +4,45 @@ import androidx.annotation.Keep import com.google.gson.Gson import io.legado.app.constant.AppConst import io.legado.app.exception.NoStackTraceException +import io.legado.app.help.config.AppConfig import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.http.newCallStrResponse import io.legado.app.help.http.okHttpClient import io.legado.app.model.AppReleaseInfo +import io.legado.app.model.AppVariant import io.legado.app.model.GithubRelease -import io.legado.app.utils.fromJsonArray +import io.legado.app.utils.fromJsonObject import kotlinx.coroutines.CoroutineScope @Keep @Suppress("unused") object AppUpdateGitHub : AppUpdate.AppUpdateInterface { - // TODO:在关于->其他,添加其他版本选项,使用该函数 - private suspend fun getRecentReleases(): List { - val lastReleaseUrl = - "https://api.github.com/repos/gedoor/legado/releases?page=1?per_page=1" + private val checkVariant: AppVariant + get() = when (AppConfig.updateToVariant) { + "official_version" -> AppVariant.OFFICIAL + "beta_release_version" -> AppVariant.BETA_RELEASE + "beta_releaseA_version" -> AppVariant.BETA_RELEASEA + else -> AppConst.appInfo.appVariant + } + + private suspend fun getLatestRelease(): List { + val lastReleaseUrl = if (checkVariant.name.lowercase().contains("beta")) { + "https://api.github.com/repos/gedoor/legado/releases/tags/beta" + } else { + "https://api.github.com/repos/gedoor/legado/releases/latest" + } val body = okHttpClient.newCallStrResponse { url(lastReleaseUrl) }.body if (body.isNullOrBlank()) { throw NoStackTraceException("获取新版本出错") } - return Gson().fromJsonArray(body) + return Gson().fromJsonObject(body) .getOrElse { throw NoStackTraceException("获取新版本出错 " + it.localizedMessage) } - .flatMap { it.gitReleaseToAppReleaseInfo() } + .gitReleaseToAppReleaseInfo() .sortedByDescending { it.createdAt } } @@ -38,9 +50,8 @@ object AppUpdateGitHub : AppUpdate.AppUpdateInterface { scope: CoroutineScope, ): Coroutine { return Coroutine.async(scope) { - val recentReleases = getRecentReleases() - recentReleases - .filter { it.appVariant == AppConst.appInfo.appVariant } + getLatestRelease() + .filter { it.appVariant == checkVariant } .firstOrNull { it.versionName > AppConst.appInfo.versionName } ?.let { return@async AppUpdate.UpdateInfo( @@ -49,41 +60,8 @@ object AppUpdateGitHub : AppUpdate.AppUpdateInterface { it.downloadUrl, it.name ) - } ?: throw NoStackTraceException("已是最新版本") + } + ?: throw NoStackTraceException("已是最新版本") }.timeout(10000) } - - override fun checkBeta(scope: CoroutineScope): Coroutine { - return Coroutine.async(scope) { - val preReleaseUrl = "https://api.github.com/repos/gedoor/legado/releases/tags/beta" - val body = okHttpClient.newCallStrResponse { - url(preReleaseUrl) - }.body - if (body.isNullOrBlank()) { - throw NoStackTraceException("获取新版本出错") - } - val rootDoc = jsonPath.parse(body) - val path = "\$.assets[?(@.name =~ /legado_${appCtx.channel}_.*?apk\$/)]" - val name = rootDoc.readString("$.name") - ?: throw NoStackTraceException("获取新版本出错") - val tagName = name.replace("legado_app_", "") - if (tagName > AppConst.appInfo.versionName) { - val assetsMap = rootDoc.read>(path) - .firstOrNull() - ?: throw NoStackTraceException("获取新版本出错") - val assets = jsonPath.parse(assetsMap) - val updateBody = rootDoc.readString("$.body") - ?: throw NoStackTraceException("获取新版本出错") - val downloadUrl = assets.readString("$.browser_download_url") - ?: throw NoStackTraceException("获取新版本出错") - val fileName = assets.readString("$.name") - ?: throw NoStackTraceException("获取新版本出错") - return@async AppUpdate.UpdateInfo(tagName, updateBody, downloadUrl, fileName) - } else { - throw NoStackTraceException("已是最新版本") - } - }.timeout(10000) - } - - } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/config/AppConfig.kt b/app/src/main/java/io/legado/app/help/config/AppConfig.kt index ad945b350..ed3a3f43f 100644 --- a/app/src/main/java/io/legado/app/help/config/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/AppConfig.kt @@ -471,7 +471,7 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { val defaultHomePage get() = appCtx.getPrefString(PreferKey.defaultHomePage, "bookshelf") - val updateToBeta get() = appCtx.getPrefBoolean(PreferKey.updateToBeta, false) + val updateToVariant get() = appCtx.getPrefString(PreferKey.updateToVariant, "default_version") val doublePageHorizontal: String? get() = appCtx.getPrefString(PreferKey.doublePageHorizontal) diff --git a/app/src/main/java/io/legado/app/model/AppReleaseInfo.kt b/app/src/main/java/io/legado/app/model/AppReleaseInfo.kt index c1ea2dafb..eefa68a07 100644 --- a/app/src/main/java/io/legado/app/model/AppReleaseInfo.kt +++ b/app/src/main/java/io/legado/app/model/AppReleaseInfo.kt @@ -16,7 +16,7 @@ data class AppReleaseInfo( enum class AppVariant { OFFICIAL, - COMPATIBLE, + BETA_RELEASEA, BETA_RELEASE, UNKNOWN } @@ -58,7 +58,7 @@ data class Asset( return when { preRelease && name.contains("releaseA") -> AppReleaseInfo( - AppVariant.COMPATIBLE, + AppVariant.BETA_RELEASEA, timestamp, note, name, @@ -76,19 +76,9 @@ data class Asset( url ) - !preRelease && name.contains("release") -> - AppReleaseInfo( - AppVariant.OFFICIAL, - timestamp, - note, - name, - apkUrl, - url - ) - else -> AppReleaseInfo( - AppVariant.UNKNOWN, + AppVariant.OFFICIAL, timestamp, note, name, diff --git a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt index 1760138de..0fa7cb546 100644 --- a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt +++ b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt @@ -88,20 +88,16 @@ class AboutFragment : PreferenceFragmentCompat() { private fun checkUpdate() { waitDialog.show() AppUpdate.gitHubUpdate?.run { - val job = if (AppConfig.updateToBeta) { - checkBeta(lifecycleScope) - } else { - check(lifecycleScope) - } - job.onSuccess { - showDialogFragment( - UpdateDialog(it) - ) - }.onError { - appCtx.toastOnUi("${getString(R.string.check_update)}\n${it.localizedMessage}") - }.onFinally { - waitDialog.dismiss() - } + check(lifecycleScope) + .onSuccess { + showDialogFragment( + UpdateDialog(it) + ) + }.onError { + appCtx.toastOnUi("${getString(R.string.check_update)}\n${it.localizedMessage}") + }.onFinally { + waitDialog.dismiss() + } } } diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index fc7ef944e..44aaf4d31 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1155,4 +1155,8 @@ Cap. inicio 更新至测试版 检查更新时查找最新的测试版本 + 当前 + 正式版 + 测试版 + 共存版 diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 341968180..068b8bb4c 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -1158,4 +1158,8 @@ 開始の章 更新至测试版 检查更新时查找最新的测试版本 + 当前 + 正式版 + 测试版 + 共存版 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index d285259b8..77b7fe71c 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1158,4 +1158,8 @@ Início 更新至测试版 检查更新时查找最新的测试版本 + 当前 + 正式版 + 测试版 + 共存版 diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 6e7446aec..9510deecb 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1154,4 +1154,8 @@ Còn Chương đầu 更新至测试版 检查更新时查找最新的测试版本 + 当前 + 正式版 + 测试版 + 共存版 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 3f3d3847e..075c75f24 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1155,4 +1155,8 @@ 開始篇章 更新至测试版 检查更新时查找最新的测试版本 + 当前 + 正式版 + 测试版 + 共存版 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 630fafed1..cddf82c8b 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1157,4 +1157,8 @@ 開始篇章 更新至测试版 检查更新时查找最新的测试版本 + 当前 + 正式版 + 测试版 + 共存版 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 640a4128d..764d8dce9 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1155,6 +1155,10 @@ 开始日期 日更章数 起始章节 - 更新至测试版 - 检查更新时查找最新的测试版本 + 检查更新查找版本 + 检查更新查找其他签名版本 + 当前 + 正式版 + 测试版 + 共存版 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 2d3e5a0f1..5dc6bc30b 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -151,6 +151,14 @@ @string/my + + + @string/default_version + @string/official_version + @string/beta_release_version + @string/beta_releaseA_version + + bookshelf explore @@ -158,6 +166,13 @@ my + + default_version + official_version + beta_release_version + beta_releaseA_version + + Same color as content Customize diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 23643bbfb..fe8fea950 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1158,4 +1158,8 @@ Start Chapter 更新至测试版 检查更新时查找最新的测试版本 + 当前 + 正式版 + 测试版 + 共存版 diff --git a/app/src/main/res/xml/pref_config_other.xml b/app/src/main/res/xml/pref_config_other.xml index 650f070ad..cf3a05dbe 100644 --- a/app/src/main/res/xml/pref_config_other.xml +++ b/app/src/main/res/xml/pref_config_other.xml @@ -146,11 +146,15 @@ android:summary="@string/show_add_to_shelf_alert_summary" android:title="@string/show_add_to_shelf_alert_title" /> - + android:title="@string/update_to_bata_title" + app:allowDividerAbove="false" + app:allowDividerBelow="false" + app:entries="@array/default_app_variant" + app:entryValues="@array/default_app_variant_value" />