Jason Yao 2 лет назад
Родитель
Сommit
b3c9f5b03b

+ 25 - 5
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<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
     fun updateApp() {
         val body = okHttpClient.newCall(Request.Builder().url(lastReleaseUrl).build()).execute()
             .body!!.string()
 
-        val releaseList = Gson().fromJsonArray<GithubRelease>(body)
+        val releaseList = Gson().fromJsonObject<GithubRelease>(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() })
     }

+ 1 - 1
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) {

+ 1 - 1
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"

+ 0 - 2
app/src/main/java/io/legado/app/help/AppUpdate.kt

@@ -23,8 +23,6 @@ object AppUpdate {
 
         fun check(scope: CoroutineScope): Coroutine<UpdateInfo>
 
-        fun checkBeta(scope: CoroutineScope): Coroutine<UpdateInfo>
-
     }
 
 }

+ 23 - 45
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<AppReleaseInfo> {
-        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<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 {
             url(lastReleaseUrl)
         }.body
         if (body.isNullOrBlank()) {
             throw NoStackTraceException("获取新版本出错")
         }
-        return Gson().fromJsonArray<GithubRelease>(body)
+        return Gson().fromJsonObject<GithubRelease>(body)
             .getOrElse {
                 throw NoStackTraceException("获取新版本出错 " + it.localizedMessage)
             }
-            .flatMap { it.gitReleaseToAppReleaseInfo() }
+            .gitReleaseToAppReleaseInfo()
             .sortedByDescending { it.createdAt }
     }
 
@@ -38,9 +50,8 @@ object AppUpdateGitHub : AppUpdate.AppUpdateInterface {
         scope: CoroutineScope,
     ): Coroutine<AppUpdate.UpdateInfo> {
         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<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)
-    }
-
-
 }

+ 1 - 1
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)

+ 3 - 13
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,

+ 10 - 14
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()
+                }
         }
     }
 

+ 4 - 0
app/src/main/res/values-es-rES/strings.xml

@@ -1155,4 +1155,8 @@
     <string name="start_chapter">Cap. inicio</string>
     <string name="update_to_bata_title">更新至测试版</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>

+ 4 - 0
app/src/main/res/values-ja-rJP/strings.xml

@@ -1158,4 +1158,8 @@
     <string name="start_chapter">開始の章</string>
     <string name="update_to_bata_title">更新至测试版</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>

+ 4 - 0
app/src/main/res/values-pt-rBR/strings.xml

@@ -1158,4 +1158,8 @@
     <string name="start_chapter">Início</string>
     <string name="update_to_bata_title">更新至测试版</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>

+ 4 - 0
app/src/main/res/values-vi/strings.xml

@@ -1154,4 +1154,8 @@ Còn </string>
     <string name="start_chapter">Chương đầu</string>
     <string name="update_to_bata_title">更新至测试版</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>

+ 4 - 0
app/src/main/res/values-zh-rHK/strings.xml

@@ -1155,4 +1155,8 @@
     <string name="start_chapter">開始篇章</string>
     <string name="update_to_bata_title">更新至测试版</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>

+ 4 - 0
app/src/main/res/values-zh-rTW/strings.xml

@@ -1157,4 +1157,8 @@
     <string name="start_chapter">開始篇章</string>
     <string name="update_to_bata_title">更新至测试版</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>

+ 6 - 2
app/src/main/res/values-zh/strings.xml

@@ -1155,6 +1155,10 @@
     <string name="start_from">开始日期</string>
     <string name="daily_chapters">日更章数</string>
     <string name="start_chapter">起始章节</string>
-    <string name="update_to_bata_title">更新至测试版</string>
-    <string name="update_to_bata_summary">检查更新时查找最新的测试版本</string>
+    <string name="update_to_bata_title">检查更新查找版本</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>

+ 15 - 0
app/src/main/res/values/arrays.xml

@@ -151,6 +151,14 @@
 		<item>@string/my</item>
 	</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">
 		<item>bookshelf</item>
 		<item>explore</item>
@@ -158,6 +166,13 @@
 		<item>my</item>
 	</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">
 		<item>Same color as content</item>
 		<item>Customize</item>

+ 4 - 0
app/src/main/res/values/strings.xml

@@ -1158,4 +1158,8 @@
     <string name="start_chapter">Start Chapter</string>
     <string name="update_to_bata_title">更新至测试版</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>

+ 8 - 4
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" />
 
-        <io.legado.app.lib.prefs.SwitchPreference
-            android:defaultValue="false"
-            android:key="updateToBeta"
+        <io.legado.app.lib.prefs.NameListPreference
+            android:defaultValue="default_version"
+            android:key="updateToVariant"
             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
             android:key="webPort"