resolve PR comment

This commit is contained in:
Jason Yao
2024-07-24 22:47:23 -07:00
parent f896183309
commit b3c9f5b03b
18 changed files with 121 additions and 88 deletions
@@ -4,7 +4,7 @@ import com.google.gson.Gson
import io.legado.app.exception.NoStackTraceException import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.http.okHttpClient import io.legado.app.help.http.okHttpClient
import io.legado.app.model.GithubRelease import io.legado.app.model.GithubRelease
import io.legado.app.utils.fromJsonArray import io.legado.app.utils.fromJsonObject
import okhttp3.Request import okhttp3.Request
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Test import org.junit.Test
@@ -12,21 +12,41 @@ import org.junit.Test
class UpdateTest { class UpdateTest {
private val lastReleaseUrl = 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<GithubRelease>(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 @Test
fun updateApp() { fun updateApp() {
val body = okHttpClient.newCall(Request.Builder().url(lastReleaseUrl).build()).execute() val body = okHttpClient.newCall(Request.Builder().url(lastReleaseUrl).build()).execute()
.body!!.string() .body!!.string()
val releaseList = Gson().fromJsonArray<GithubRelease>(body) val releaseList = Gson().fromJsonObject<GithubRelease>(body)
.getOrElse { .getOrElse {
throw NoStackTraceException("获取新版本出错 " + it.localizedMessage) throw NoStackTraceException("获取新版本出错 " + it.localizedMessage)
} }
.flatMap { it.gitReleaseToAppReleaseInfo() } .gitReleaseToAppReleaseInfo()
.sortedByDescending { it.createdAt } .sortedByDescending { it.createdAt }
assertTrue(releaseList.isNotEmpty()) assertTrue(releaseList.size == 1)
assertTrue(releaseList.all { it.downloadUrl.isNotBlank() }) assertTrue(releaseList.all { it.downloadUrl.isNotBlank() })
assertTrue(releaseList.all { it.versionName.isNotBlank() }) assertTrue(releaseList.all { it.versionName.isNotBlank() })
} }
@@ -61,7 +61,7 @@ object AppConst {
appInfo.versionName = it.versionName appInfo.versionName = it.versionName
// TODO: 增加测试版还是正式版的检查 // TODO: 增加测试版还是正式版的检查
if (it.packageName.contains("releaseA")) { 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) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
@@ -145,7 +145,7 @@ object PreferKey {
const val mouseWheelPage = "mouseWheelPage" const val mouseWheelPage = "mouseWheelPage"
const val recordHeapDump = "recordHeapDump" const val recordHeapDump = "recordHeapDump"
const val optimizeRender = "optimizeRender" const val optimizeRender = "optimizeRender"
const val updateToBeta = "updateToBeta" const val updateToVariant = "updateToVariant"
const val cPrimary = "colorPrimary" const val cPrimary = "colorPrimary"
const val cAccent = "colorAccent" const val cAccent = "colorAccent"
@@ -23,8 +23,6 @@ object AppUpdate {
fun check(scope: CoroutineScope): Coroutine<UpdateInfo> fun check(scope: CoroutineScope): Coroutine<UpdateInfo>
fun checkBeta(scope: CoroutineScope): Coroutine<UpdateInfo>
} }
} }
@@ -4,33 +4,45 @@ import androidx.annotation.Keep
import com.google.gson.Gson import com.google.gson.Gson
import io.legado.app.constant.AppConst import io.legado.app.constant.AppConst
import io.legado.app.exception.NoStackTraceException 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.coroutine.Coroutine
import io.legado.app.help.http.newCallStrResponse import io.legado.app.help.http.newCallStrResponse
import io.legado.app.help.http.okHttpClient import io.legado.app.help.http.okHttpClient
import io.legado.app.model.AppReleaseInfo import io.legado.app.model.AppReleaseInfo
import io.legado.app.model.AppVariant
import io.legado.app.model.GithubRelease import io.legado.app.model.GithubRelease
import io.legado.app.utils.fromJsonArray import io.legado.app.utils.fromJsonObject
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@Keep @Keep
@Suppress("unused") @Suppress("unused")
object AppUpdateGitHub : AppUpdate.AppUpdateInterface { object AppUpdateGitHub : AppUpdate.AppUpdateInterface {
// TODO:在关于->其他,添加其他版本选项,使用该函数 private val checkVariant: AppVariant
private suspend fun getRecentReleases(): List<AppReleaseInfo> { get() = when (AppConfig.updateToVariant) {
val lastReleaseUrl = "official_version" -> AppVariant.OFFICIAL
"https://api.github.com/repos/gedoor/legado/releases?page=1?per_page=1" "beta_release_version" -> AppVariant.BETA_RELEASE
"beta_releaseA_version" -> AppVariant.BETA_RELEASEA
else -> AppConst.appInfo.appVariant
}
private suspend fun getLatestRelease(): List<AppReleaseInfo> {
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 { val body = okHttpClient.newCallStrResponse {
url(lastReleaseUrl) url(lastReleaseUrl)
}.body }.body
if (body.isNullOrBlank()) { if (body.isNullOrBlank()) {
throw NoStackTraceException("获取新版本出错") throw NoStackTraceException("获取新版本出错")
} }
return Gson().fromJsonArray<GithubRelease>(body) return Gson().fromJsonObject<GithubRelease>(body)
.getOrElse { .getOrElse {
throw NoStackTraceException("获取新版本出错 " + it.localizedMessage) throw NoStackTraceException("获取新版本出错 " + it.localizedMessage)
} }
.flatMap { it.gitReleaseToAppReleaseInfo() } .gitReleaseToAppReleaseInfo()
.sortedByDescending { it.createdAt } .sortedByDescending { it.createdAt }
} }
@@ -38,9 +50,8 @@ object AppUpdateGitHub : AppUpdate.AppUpdateInterface {
scope: CoroutineScope, scope: CoroutineScope,
): Coroutine<AppUpdate.UpdateInfo> { ): Coroutine<AppUpdate.UpdateInfo> {
return Coroutine.async(scope) { return Coroutine.async(scope) {
val recentReleases = getRecentReleases() getLatestRelease()
recentReleases .filter { it.appVariant == checkVariant }
.filter { it.appVariant == AppConst.appInfo.appVariant }
.firstOrNull { it.versionName > AppConst.appInfo.versionName } .firstOrNull { it.versionName > AppConst.appInfo.versionName }
?.let { ?.let {
return@async AppUpdate.UpdateInfo( return@async AppUpdate.UpdateInfo(
@@ -49,41 +60,8 @@ object AppUpdateGitHub : AppUpdate.AppUpdateInterface {
it.downloadUrl, it.downloadUrl,
it.name it.name
) )
} ?: throw NoStackTraceException("已是最新版本") }
?: throw NoStackTraceException("已是最新版本")
}.timeout(10000) }.timeout(10000)
} }
override fun checkBeta(scope: CoroutineScope): Coroutine<AppUpdate.UpdateInfo> {
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<List<Any>>(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)
}
} }
@@ -471,7 +471,7 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
val defaultHomePage get() = appCtx.getPrefString(PreferKey.defaultHomePage, "bookshelf") 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? val doublePageHorizontal: String?
get() = appCtx.getPrefString(PreferKey.doublePageHorizontal) get() = appCtx.getPrefString(PreferKey.doublePageHorizontal)
@@ -16,7 +16,7 @@ data class AppReleaseInfo(
enum class AppVariant { enum class AppVariant {
OFFICIAL, OFFICIAL,
COMPATIBLE, BETA_RELEASEA,
BETA_RELEASE, BETA_RELEASE,
UNKNOWN UNKNOWN
} }
@@ -58,7 +58,7 @@ data class Asset(
return when { return when {
preRelease && name.contains("releaseA") -> preRelease && name.contains("releaseA") ->
AppReleaseInfo( AppReleaseInfo(
AppVariant.COMPATIBLE, AppVariant.BETA_RELEASEA,
timestamp, timestamp,
note, note,
name, name,
@@ -76,7 +76,7 @@ data class Asset(
url url
) )
!preRelease && name.contains("release") -> else ->
AppReleaseInfo( AppReleaseInfo(
AppVariant.OFFICIAL, AppVariant.OFFICIAL,
timestamp, timestamp,
@@ -86,16 +86,6 @@ data class Asset(
url url
) )
else ->
AppReleaseInfo(
AppVariant.UNKNOWN,
timestamp,
note,
name,
apkUrl,
url
)
} }
} }
} }
@@ -88,12 +88,8 @@ class AboutFragment : PreferenceFragmentCompat() {
private fun checkUpdate() { private fun checkUpdate() {
waitDialog.show() waitDialog.show()
AppUpdate.gitHubUpdate?.run { AppUpdate.gitHubUpdate?.run {
val job = if (AppConfig.updateToBeta) {
checkBeta(lifecycleScope)
} else {
check(lifecycleScope) check(lifecycleScope)
} .onSuccess {
job.onSuccess {
showDialogFragment( showDialogFragment(
UpdateDialog(it) UpdateDialog(it)
) )
@@ -1155,4 +1155,8 @@
<string name="start_chapter">Cap. inicio</string> <string name="start_chapter">Cap. inicio</string>
<string name="update_to_bata_title">更新至测试版</string> <string name="update_to_bata_title">更新至测试版</string>
<string name="update_to_bata_summary">检查更新时查找最新的测试版本</string> <string name="update_to_bata_summary">检查更新时查找最新的测试版本</string>
<string name="default_version">当前</string>
<string name="official_version">正式版</string>
<string name="beta_release_version">测试版</string>
<string name="beta_releaseA_version">共存版</string>
</resources> </resources>
@@ -1158,4 +1158,8 @@
<string name="start_chapter">開始の章</string> <string name="start_chapter">開始の章</string>
<string name="update_to_bata_title">更新至测试版</string> <string name="update_to_bata_title">更新至测试版</string>
<string name="update_to_bata_summary">检查更新时查找最新的测试版本</string> <string name="update_to_bata_summary">检查更新时查找最新的测试版本</string>
<string name="default_version">当前</string>
<string name="official_version">正式版</string>
<string name="beta_release_version">测试版</string>
<string name="beta_releaseA_version">共存版</string>
</resources> </resources>
@@ -1158,4 +1158,8 @@
<string name="start_chapter">Início</string> <string name="start_chapter">Início</string>
<string name="update_to_bata_title">更新至测试版</string> <string name="update_to_bata_title">更新至测试版</string>
<string name="update_to_bata_summary">检查更新时查找最新的测试版本</string> <string name="update_to_bata_summary">检查更新时查找最新的测试版本</string>
<string name="default_version">当前</string>
<string name="official_version">正式版</string>
<string name="beta_release_version">测试版</string>
<string name="beta_releaseA_version">共存版</string>
</resources> </resources>
+4
View File
@@ -1154,4 +1154,8 @@ Còn </string>
<string name="start_chapter">Chương đầu</string> <string name="start_chapter">Chương đầu</string>
<string name="update_to_bata_title">更新至测试版</string> <string name="update_to_bata_title">更新至测试版</string>
<string name="update_to_bata_summary">检查更新时查找最新的测试版本</string> <string name="update_to_bata_summary">检查更新时查找最新的测试版本</string>
<string name="default_version">当前</string>
<string name="official_version">正式版</string>
<string name="beta_release_version">测试版</string>
<string name="beta_releaseA_version">共存版</string>
</resources> </resources>
@@ -1155,4 +1155,8 @@
<string name="start_chapter">開始篇章</string> <string name="start_chapter">開始篇章</string>
<string name="update_to_bata_title">更新至测试版</string> <string name="update_to_bata_title">更新至测试版</string>
<string name="update_to_bata_summary">检查更新时查找最新的测试版本</string> <string name="update_to_bata_summary">检查更新时查找最新的测试版本</string>
<string name="default_version">当前</string>
<string name="official_version">正式版</string>
<string name="beta_release_version">测试版</string>
<string name="beta_releaseA_version">共存版</string>
</resources> </resources>
@@ -1157,4 +1157,8 @@
<string name="start_chapter">開始篇章</string> <string name="start_chapter">開始篇章</string>
<string name="update_to_bata_title">更新至测试版</string> <string name="update_to_bata_title">更新至测试版</string>
<string name="update_to_bata_summary">检查更新时查找最新的测试版本</string> <string name="update_to_bata_summary">检查更新时查找最新的测试版本</string>
<string name="default_version">当前</string>
<string name="official_version">正式版</string>
<string name="beta_release_version">测试版</string>
<string name="beta_releaseA_version">共存版</string>
</resources> </resources>
+6 -2
View File
@@ -1155,6 +1155,10 @@
<string name="start_from">开始日期</string> <string name="start_from">开始日期</string>
<string name="daily_chapters">日更章数</string> <string name="daily_chapters">日更章数</string>
<string name="start_chapter">起始章节</string> <string name="start_chapter">起始章节</string>
<string name="update_to_bata_title">更新至测试版</string> <string name="update_to_bata_title">检查更新查找版本</string>
<string name="update_to_bata_summary">检查更新查找最新的测试版本</string> <string name="update_to_bata_summary">检查更新查找其他签名版本</string>
<string name="default_version">当前</string>
<string name="official_version">正式版</string>
<string name="beta_release_version">测试版</string>
<string name="beta_releaseA_version">共存版</string>
</resources> </resources>
+15
View File
@@ -151,6 +151,14 @@
<item>@string/my</item> <item>@string/my</item>
</string-array> </string-array>
<string-array name="default_app_variant">
<item>@string/default_version</item>
<item>@string/official_version</item>
<item>@string/beta_release_version</item>
<item>@string/beta_releaseA_version</item>
</string-array>
<string-array name="default_home_page_value"> <string-array name="default_home_page_value">
<item>bookshelf</item> <item>bookshelf</item>
<item>explore</item> <item>explore</item>
@@ -158,6 +166,13 @@
<item>my</item> <item>my</item>
</string-array> </string-array>
<string-array name="default_app_variant_value">
<item>default_version</item>
<item>official_version</item>
<item>beta_release_version</item>
<item>beta_releaseA_version</item>
</string-array>
<string-array name="tip_color"> <string-array name="tip_color">
<item>Same color as content</item> <item>Same color as content</item>
<item>Customize</item> <item>Customize</item>
+4
View File
@@ -1158,4 +1158,8 @@
<string name="start_chapter">Start Chapter</string> <string name="start_chapter">Start Chapter</string>
<string name="update_to_bata_title">更新至测试版</string> <string name="update_to_bata_title">更新至测试版</string>
<string name="update_to_bata_summary">检查更新时查找最新的测试版本</string> <string name="update_to_bata_summary">检查更新时查找最新的测试版本</string>
<string name="default_version">当前</string>
<string name="official_version">正式版</string>
<string name="beta_release_version">测试版</string>
<string name="beta_releaseA_version">共存版</string>
</resources> </resources>
+8 -4
View File
@@ -146,11 +146,15 @@
android:summary="@string/show_add_to_shelf_alert_summary" android:summary="@string/show_add_to_shelf_alert_summary"
android:title="@string/show_add_to_shelf_alert_title" /> android:title="@string/show_add_to_shelf_alert_title" />
<io.legado.app.lib.prefs.SwitchPreference <io.legado.app.lib.prefs.NameListPreference
android:defaultValue="false" android:defaultValue="default_version"
android:key="updateToBeta" android:key="updateToVariant"
android:summary="@string/update_to_bata_summary" android:summary="@string/update_to_bata_summary"
android:title="@string/update_to_bata_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" />
<io.legado.app.lib.prefs.Preference <io.legado.app.lib.prefs.Preference
android:key="webPort" android:key="webPort"