1
0
mirror of https://github.com/fumiama/copymanga.git synced 2026-06-04 23:10:23 +08:00
修复
1. 近期无法加载的问题 (fix #139)
This commit is contained in:
源文雨
2025-05-27 22:41:15 +09:00
parent 98b2d1a4ae
commit b4a6be8470
21 changed files with 84 additions and 63 deletions

View File

@@ -11,8 +11,8 @@ android {
applicationId 'top.fumiama.copymanga'
minSdkVersion 23
targetSdkVersion 34
versionCode 71
versionName '2.5.0'
versionCode 72
versionName '2.5.1'
resourceConfigurations += ['zh', 'zh-rCN']
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -55,7 +55,7 @@ object Config {
"region",
if (net_use_foreign.value) "1" else "0"
)
.addHeader("platform", "3")
.addHeader("platform", platform.value)
.build()
return field
}
@@ -78,7 +78,7 @@ object Config {
mHostApiUrlsMutex.withLock {
if (mHostApiUrls.isNotEmpty()) return@runBlocking
try {
val u = getString(R.string.networkApiUrl).format(networkApiUrl.value)
val u = getString(R.string.networkApiUrl).format(networkApiUrl.value, platform.value)
val r = Gson().fromJson((apiProxy?.comancry(u) {
DownloadTools.getHttpContent(it, referer, pc_ua)
}?:DownloadTools.getHttpContent(u, referer, pc_ua)).decodeToString(), NetworkStructure::class.java)
@@ -107,6 +107,7 @@ object Config {
val navTextInfo = UserPreferenceString("navTextInfo", R.string.navTextInfo)
val proxy_key = PreferenceString(R.string.imgProxyCodeKeyID)
val app_ver = PreferenceString("settings_cat_general_et_app_version", R.string.app_ver)
val platform = PreferenceString("settings_cat_general_et_platform", R.string.platform)
val token = UserPreferenceString("token", "", null)
val pc_ua get() = MainActivity.mainWeakReference?.get()?.getString(R.string.pc_ua)?.format(app_ver.value)?:""
val referer get() = MainActivity.mainWeakReference?.get()?.getString(R.string.referer)?.format(app_ver.value)?:""
@@ -143,5 +144,5 @@ object Config {
fun getChapterInfoApiUrl(path: String?, uuid: String?, version: Int) =
MainActivity.mainWeakReference?.get()?.getString(R.string.chapterInfoApiUrl)
?.format(myHostApiUrl.random(), path, if (version >= 2) "$version" else "" , uuid)
?.format(myHostApiUrl.random(), path, if (version >= 2) "$version" else "" , uuid, platform.value)
}

View File

@@ -15,7 +15,7 @@ import top.fumiama.dmzj.copymanga.R
import java.io.File
class Book(val path: String, private val getString: (Int) -> String, private val exDir: File, private val loadCache: Boolean = false, private val mPassName: String? = null) {
private val mBookApiUrl = getString(R.string.bookInfoApiUrl).format(Config.myHostApiUrl.random(), path)
private val mBookApiUrl = getString(R.string.bookInfoApiUrl).format(Config.myHostApiUrl.random(), path, Config.platform.value)
private val mUserAgent = getString(R.string.pc_ua).format(Config.app_ver.value)
private var mBook: BookInfoStructure? = null
private var mGroupPathWords = arrayOf<String>()

View File

@@ -12,8 +12,8 @@ import top.fumiama.dmzj.copymanga.R
class Shelf(private val getString: (Int) -> String) {
private val apiUrl: String get() = getString(R.string.shelfOperateApiUrl).format(Config.myHostApiUrl.random())
private val queryApiUrlTemplate = getString(R.string.bookUserQueryApiUrl)
private val addApiUrl get() = "$apiUrl?platform=3"
private val delApiUrl get() = "${apiUrl}s?platform=3"
private val addApiUrl get() = "$apiUrl?platform=${Config.platform.value}"
private val delApiUrl get() = "${apiUrl}s?platform=${Config.platform.value}"
suspend fun add(comicId: String): String = withContext(Dispatchers.IO) {
if (comicId.isEmpty()) {
return@withContext "空漫画ID"
@@ -68,7 +68,7 @@ class Shelf(private val getString: (Int) -> String) {
suspend fun query(pathWord: String): BookQueryStructure? = withContext(Dispatchers.IO) {
try {
val queryUrl = queryApiUrlTemplate.format(Config.myHostApiUrl.random(), pathWord)
val queryUrl = queryApiUrlTemplate.format(Config.myHostApiUrl.random(), pathWord, Config.platform.value)
(Config.apiProxy?.comancry(queryUrl) { url ->
DownloadTools.getHttpContent(url, Config.referer)
}?:DownloadTools.getHttpContent(queryUrl, Config.referer)).let {

View File

@@ -39,7 +39,7 @@ class Volume(private val path: String, private val groupPathWord: String, getStr
return@withContext mVolume
}
private fun getApiUrl(offset: Int) = mGroupInfoApiUrlTemplate.format(Config.myHostApiUrl.random(), path, groupPathWord, offset)
private fun getApiUrl(offset: Int) = mGroupInfoApiUrlTemplate.format(Config.myHostApiUrl.random(), path, groupPathWord, offset, Config.platform.value)
private suspend fun download(re: Array<VolumeStructure?>, offset: Int, c: Int) = withContext(Dispatchers.IO) {
Log.d("MyV", "下载偏移: $offset")
getApiUrl(offset).let {

View File

@@ -49,7 +49,7 @@ class Member(private val getString: (Int) -> String) {
}
try {
val u = getString(R.string.memberInfoApiUrl)
.format(Config.myHostApiUrl.random())
.format(Config.myHostApiUrl.random(), Config.platform.value)
val data = (Config.apiProxy?.comancry(u) {
DownloadTools.getHttpContent(it)
}?:DownloadTools.getHttpContent(u)).decodeToString()
@@ -97,7 +97,7 @@ class Member(private val getString: (Int) -> String) {
}
private suspend fun postLogin(username: String, pwd: String, salt: Int): ByteArray? =
getString(R.string.loginApiUrl).format(Config.myHostApiUrl.random()).let { u ->
getString(R.string.loginApiUrl).format(Config.myHostApiUrl.random(), Config.platform.value).let { u ->
val use: suspend (String) -> ByteArray? = { it: String ->
DownloadTools.getApiConnection(it, "POST").let { c ->
c.doOutput = true
@@ -105,7 +105,7 @@ class Member(private val getString: (Int) -> String) {
"content-type",
"application/x-www-form-urlencoded;charset=utf-8"
)
c.setRequestProperty("platform", "3")
c.setRequestProperty("platform", Config.platform.value)
c.setRequestProperty("accept", "application/json")
val r = if (!Config.net_use_foreign.value) "1" else "0"
val pwdEncoded =
@@ -116,7 +116,7 @@ class Member(private val getString: (Int) -> String) {
username,
Charset.defaultCharset().name()
)
}&password=$pwdEncoded&salt=$salt&platform=3&authorization=Token+&version=${Config.app_ver.value}&source=copyApp&region=$r&webp=1".toByteArray()
}&password=$pwdEncoded&salt=$salt&platform=${Config.platform.value}&authorization=Token+&version=${Config.app_ver.value}&source=copyApp&region=$r&webp=1".toByteArray()
)
c.outputStream.close()
val b = c.inputStream.readBytes()
@@ -129,11 +129,11 @@ class Member(private val getString: (Int) -> String) {
private suspend fun postComandyLogin(username: String, pwd: String, salt: Int) =
getString(R.string.loginApiUrl).format(Config.myHostApiUrl.random()).let { u ->
getString(R.string.loginApiUrl).format(Config.myHostApiUrl.random(), Config.platform.value).let { u ->
val use: suspend (String) -> ByteArray? = { it: String ->
DownloadTools.getComandyApiConnection(it, "POST", null, Config.pc_ua).apply {
headers["content-type"] = "application/x-www-form-urlencoded;charset=utf-8"
headers["platform"] = "3"
headers["platform"] = Config.platform.value
headers["accept"] = "application/json"
val r = if (!Config.net_use_foreign.value) "1" else "0"
val pwdEncoded =
@@ -143,7 +143,7 @@ class Member(private val getString: (Int) -> String) {
username,
Charset.defaultCharset().name()
)
}&password=$pwdEncoded&salt=$salt&platform=3&authorization=Token+&version=${Config.app_ver.value}&source=copyApp&region=$r&webp=1"
}&password=$pwdEncoded&salt=$salt&platform=${Config.platform.value}&authorization=Token+&version=${Config.app_ver.value}&source=copyApp&region=$r&webp=1"
}.let { capsule ->
try {
val para = Gson().toJson(capsule)

View File

@@ -46,7 +46,7 @@ object DownloadTools {
Config.token.value?.let { tk ->
setRequestProperty("authorization", "Token $tk")
}
setRequestProperty("platform", "3")
setRequestProperty("platform", Config.platform.value)
}
Log.d("MyDT", "getConnection: $url\n${connection.requestProperties.map { "${it.key}: ${it.value}" }.joinToString("\n")}")
return connection
@@ -74,7 +74,7 @@ object DownloadTools {
capsule.headers["authorization"] = "Token $tk"
}
}
capsule.headers["platform"] = "3"
capsule.headers["platform"] = Config.platform.value
capsule.headers["dt"] = SimpleDateFormat("yyyy.MM.dd", Locale.getDefault()).format(Calendar.getInstance().time)
Log.d("MyDT", "getComandyConnection: $url\n${capsule.headers.map { "${it.key}: ${it.value}" }.joinToString("\n")}")
capsule

View File

@@ -11,7 +11,7 @@ import top.fumiama.dmzj.copymanga.R
@OptIn(ExperimentalStdlibApi::class)
class HistoryFragment : InfoCardLoader(R.layout.fragment_history, R.id.action_nav_history_to_nav_book, isHistoryBook = true) {
override fun getApiUrl() =
getString(R.string.historyApiUrl).format(Config.myHostApiUrl.random(), page * 21)
getString(R.string.historyApiUrl).format(Config.myHostApiUrl.random(), page * 21, Config.platform.value)
override fun onCreate(savedInstanceState: Bundle?) {
if (MainActivity.member?.hasLogin != true) {

View File

@@ -7,5 +7,5 @@ import top.fumiama.dmzj.copymanga.R
@ExperimentalStdlibApi
class NewestFragment : InfoCardLoader(R.layout.fragment_newest, R.id.action_nav_newest_to_nav_book, true) {
override fun getApiUrl() =
getString(R.string.newestApiUrl).format(Config.myHostApiUrl.random(), page * 21)
getString(R.string.newestApiUrl).format(Config.myHostApiUrl.random(), page * 21, Config.platform.value)
}

View File

@@ -48,11 +48,12 @@ class RankFragment : InfoCardLoader(R.layout.fragment_rank, R.id.action_nav_rank
override fun getApiUrl() =
getString(R.string.rankApiUrl).format(
Config.myHostApiUrl.random(),
page * 21,
sortWay[sortValue],
audienceWay[audience]
)
Config.myHostApiUrl.random(),
page * 21,
sortWay[sortValue],
audienceWay[audience],
Config.platform.value
)
override fun setListeners() {
super.setListeners()

View File

@@ -7,5 +7,5 @@ import top.fumiama.dmzj.copymanga.R
@ExperimentalStdlibApi
class RecFragment : InfoCardLoader(R.layout.fragment_recommend, R.id.action_nav_recommend_to_nav_book, true) {
override fun getApiUrl() =
getString(R.string.recommendApiUrl).format(Config.myHostApiUrl.random(), page * 21)
getString(R.string.recommendApiUrl).format(Config.myHostApiUrl.random(), page * 21, Config.platform.value)
}

View File

@@ -13,7 +13,7 @@ class SearchFragment : InfoCardLoader(R.layout.fragment_search, R.id.action_nav_
private var query: String? = null
private var type: String? = null
override fun getApiUrl() =
getString(R.string.searchApiUrl).format(Config.myHostApiUrl.random(), page * 21, query, type)
getString(R.string.searchApiUrl).format(Config.myHostApiUrl.random(), page * 21, query, type, Config.platform.value)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

View File

@@ -28,7 +28,8 @@ class ShelfFragment : InfoCardLoader(R.layout.fragment_shelf, R.id.action_nav_su
getString(R.string.shelfApiUrl).format(
Config.myHostApiUrl.random(),
page * 21,
sortWay[sortValue]
sortWay[sortValue],
Config.platform.value,
)
override fun onCreate(savedInstanceState: Bundle?) {

View File

@@ -25,12 +25,13 @@ class SortFragment : StatusCardFlow(0, R.id.action_nav_sort_to_nav_book, R.layou
override fun getApiUrl() =
getString(R.string.sortApiUrl).format(
Config.myHostApiUrl.random(),
page * 21,
sortWay[sortValue],
if(theme >= 0 && theme < (filter?.results?.theme?.size ?: 0)) (filter?.results?.theme?.get(theme)?.path_word ?: "") else "",
if(region >= 0 && region < (filter?.results?.top?.size ?: 0)) (filter?.results?.top?.get(region)?.path_word ?: "") else "",
)
Config.myHostApiUrl.random(),
page * 21,
sortWay[sortValue],
if(theme >= 0 && theme < (filter?.results?.theme?.size ?: 0)) (filter?.results?.theme?.get(theme)?.path_word ?: "") else "",
if(region >= 0 && region < (filter?.results?.top?.size ?: 0)) (filter?.results?.top?.get(region)?.path_word ?: "") else "",
Config.platform.value,
)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -42,7 +43,7 @@ class SortFragment : StatusCardFlow(0, R.id.action_nav_sort_to_nav_book, R.layou
super.setListeners()
lifecycleScope.launch {
setProgress(5)
PausableDownloader(getString(R.string.filterApiUrl).format(Config.myHostApiUrl.random())) {
PausableDownloader(getString(R.string.filterApiUrl).format(Config.myHostApiUrl.random(), Config.platform.value)) {
if(ad?.exit == true) return@PausableDownloader
it.let {
it.inputStream().use { i ->

View File

@@ -18,13 +18,13 @@ import top.fumiama.dmzj.copymanga.R
class TopicFragment : InfoCardLoader(R.layout.fragment_topic, R.id.action_nav_topic_to_nav_book) {
private var type = 1
override fun getApiUrl() =
getString(R.string.topicContentApiUrl).format(Config.myHostApiUrl.random(), arguments?.getString("path"), type, offset)
getString(R.string.topicContentApiUrl).format(Config.myHostApiUrl.random(), arguments?.getString("path"), type, offset, Config.platform.value)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleScope.launch {
setProgress(5)
PausableDownloader(getString(R.string.topicApiUrl).format(Config.myHostApiUrl.random(), arguments?.getString("path"))) { data ->
PausableDownloader(getString(R.string.topicApiUrl).format(Config.myHostApiUrl.random(), arguments?.getString("path"), Config.platform.value)) { data ->
setProgress(10)
withContext(Dispatchers.IO) {
if(ad?.exit == true) return@withContext

View File

@@ -299,7 +299,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
query = q.toString()
activity?.apply {
PausableDownloader(getString(R.string.searchApiUrl).format(Config.myHostApiUrl.random(), 0,
URLEncoder.encode(q.toString(), Charset.defaultCharset().name()), type)) {
URLEncoder.encode(q.toString(), Charset.defaultCharset().name()), type, Config.platform.value)) {
results = Gson().fromJson(it.decodeToString(), BookListStructure::class.java)
count = results?.results?.total?:0
withContext(Dispatchers.Main) {

View File

@@ -40,7 +40,7 @@ import java.lang.ref.WeakReference
import java.util.concurrent.atomic.AtomicInteger
class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadHandler({
that.get()?.getString(R.string.mainPageApiUrl)!!.format(Config.myHostApiUrl.random())
that.get()?.getString(R.string.mainPageApiUrl)!!.format(Config.myHostApiUrl.random(), Config.platform.value)
},
IndexStructure::class.java,
that.get()

View File

@@ -20,7 +20,8 @@ open class StatusCardFlow(private val api: Int, nav: Int, inflateRes: Int,
getString(api).format(
Config.myHostApiUrl.random(),
page * 21,
sortWay[sortValue]
sortWay[sortValue],
Config.platform.value,
)
override fun setListeners() {

View File

@@ -15,7 +15,8 @@ open class ThemeCardFlow(private val api: Int, nav: Int) : StatusCardFlow(0, nav
Config.myHostApiUrl.random(),
page * 21,
sortWay[sortValue],
theme
theme,
Config.platform.value,
)
override fun onCreate(savedInstanceState: Bundle?) {

View File

@@ -3,6 +3,7 @@
<!ENTITY hosturl "api.copy-manga.com">
<!ENTITY appver "2.3.0">
<!ENTITY proxyurl "copymanga.azurewebsites.net">
<!ENTITY platform "1">
]>
<resources>
<string name="app_name">拷贝漫画</string>
@@ -63,30 +64,30 @@
<string name="touch_img_error">预载图片头失败</string>
<string name="analyze_img_size_error">读取图片大小失败</string>
<string name="networkApiUrl">https://%1$s/api/v3/system/network2?platform=3</string>
<string name="mainPageApiUrl">https://%1$s/api/v3/h5/homeIndex?platform=3</string>
<string name="networkApiUrl">https://%1$s/api/v3/system/network2?platform=%2$s</string>
<string name="mainPageApiUrl">https://%1$s/api/v3/h5/homeIndex?platform=%2$s</string>
<string name="referUrl">https://%1$s</string>
<string name="hostUrl">&hosturl;</string>
<string name="proxyUrl">&proxyurl;</string>
<string name="rankApiUrl">https://%1$s/api/v3/ranks?limit=21&amp;offset=%2$d&amp;date_type=%3$s&amp;audience_type=%4$s&amp;platform=3</string>
<string name="searchApiUrl">https://%1$s/api/v3/search/comic?limit=21&amp;offset=%2$d&amp;q=%3$s&amp;q_type=%4$s&amp;platform=3</string>
<string name="filterApiUrl">https://%1$s/api/v3/h5/filter/comic/tags?platform=3</string>
<string name="sortApiUrl">https://%1$s/api/v3/comics?limit=21&amp;offset=%2$d&amp;ordering=%3$s&amp;theme=%4$s&amp;top=%5$s&amp;platform=3</string>
<string name="bookInfoApiUrl">https://%1$s/api/v3/comic2/%2$s?platform=3</string>
<string name="bookUserQueryApiUrl">https://%1$s/api/v3/comic2/%2$s/query?platform=3</string>
<string name="groupInfoApiUrl">https://%1$s/api/v3/comic/%2$s/group/%3$s/chapters?limit=100&amp;offset=%4$d&amp;platform=3</string>
<string name="chapterInfoApiUrl">https://%1$s/api/v3/comic/%2$s/chapter%3$s/%4$s?platform=3</string>
<string name="topicApiUrl">https://%1$s/api/v3/topic/%2$s?platform=3</string>
<string name="topicContentApiUrl">https://%1$s/api/v3/topic/%2$s/contents?type=%3$d&amp;limit=21&amp;offset=%4$d&amp;platform=3</string>
<string name="recommendApiUrl">https://%1$s/api/v3/recs?pos=3200102&amp;limit=21&amp;offset=%2$d&amp;platform=3</string>
<string name="newestApiUrl">https://%1$s/api/v3/update/newest?limit=21&amp;offset=%2$d&amp;platform=3</string>
<string name="finishApiUrl">https://%1$s/api/v3/comics?limit=21&amp;offset=%2$d&amp;ordering=%3$s&amp;top=finish&amp;platform=3</string>
<string name="authorApiUrl">https://%1$s/api/v3/comics?limit=21&amp;offset=%2$d&amp;ordering=%3$s&amp;author=%4$s&amp;platform=3</string>
<string name="captionApiUrl">https://%1$s/api/v3/comics?limit=21&amp;offset=%2$d&amp;ordering=%3$s&amp;theme=%4$s&amp;platform=3</string>
<string name="loginApiUrl">https://%1$s/api/v3/login?platform=3</string>
<string name="memberInfoApiUrl">https://%1$s/api/v3/member/info?platform=3</string>
<string name="historyApiUrl">https://%1$s/api/v3/member/browse/comics?limit=21&amp;offset=%2$d&amp;platform=3</string>
<string name="shelfApiUrl">https://%1$s/api/v3/member/collect/comics?limit=21&amp;offset=%2$d&amp;free_type=1&amp;ordering=%3$s&amp;platform=3</string>
<string name="rankApiUrl">https://%1$s/api/v3/ranks?limit=21&amp;offset=%2$d&amp;date_type=%3$s&amp;audience_type=%4$s&amp;platform=%5$s</string>
<string name="searchApiUrl">https://%1$s/api/v3/search/comic?limit=21&amp;offset=%2$d&amp;q=%3$s&amp;q_type=%4$s&amp;platform=%5$s</string>
<string name="filterApiUrl">https://%1$s/api/v3/h5/filter/comic/tags?platform=%2$s</string>
<string name="sortApiUrl">https://%1$s/api/v3/comics?limit=21&amp;offset=%2$d&amp;ordering=%3$s&amp;theme=%4$s&amp;top=%5$s&amp;platform=%6$s</string>
<string name="bookInfoApiUrl">https://%1$s/api/v3/comic2/%2$s?platform=%3$s</string>
<string name="bookUserQueryApiUrl">https://%1$s/api/v3/comic2/%2$s/query?platform=%3$s</string>
<string name="groupInfoApiUrl">https://%1$s/api/v3/comic/%2$s/group/%3$s/chapters?limit=100&amp;offset=%4$d&amp;platform=%5$s</string>
<string name="chapterInfoApiUrl">https://%1$s/api/v3/comic/%2$s/chapter%3$s/%4$s?platform=%5$s</string>
<string name="topicApiUrl">https://%1$s/api/v3/topic/%2$s?platform=%3$s</string>
<string name="topicContentApiUrl">https://%1$s/api/v3/topic/%2$s/contents?type=%3$d&amp;limit=21&amp;offset=%4$d&amp;platform=%5$s</string>
<string name="recommendApiUrl">https://%1$s/api/v3/recs?pos=3200102&amp;limit=21&amp;offset=%2$d&amp;platform=%3$s</string>
<string name="newestApiUrl">https://%1$s/api/v3/update/newest?limit=21&amp;offset=%2$d&amp;platform=%3$s</string>
<string name="finishApiUrl">https://%1$s/api/v3/comics?limit=21&amp;offset=%2$d&amp;ordering=%3$s&amp;top=finish&amp;platform=%4$s</string>
<string name="authorApiUrl">https://%1$s/api/v3/comics?limit=21&amp;offset=%2$d&amp;ordering=%3$s&amp;author=%4$s&amp;platform=%5$s</string>
<string name="captionApiUrl">https://%1$s/api/v3/comics?limit=21&amp;offset=%2$d&amp;ordering=%3$s&amp;theme=%4$s&amp;platform=%5$s</string>
<string name="loginApiUrl">https://%1$s/api/v3/login?platform=%2$s</string>
<string name="memberInfoApiUrl">https://%1$s/api/v3/member/info?platform=%2$s</string>
<string name="historyApiUrl">https://%1$s/api/v3/member/browse/comics?limit=21&amp;offset=%2$d&amp;platform=%3$s</string>
<string name="shelfApiUrl">https://%1$s/api/v3/member/collect/comics?limit=21&amp;offset=%2$d&amp;free_type=1&amp;ordering=%3$s&amp;platform=%4$s</string>
<string name="shelfOperateApiUrl">https://%1$s/api/v3/member/collect/comic</string>
<string name="imgProxyApiUrl">https://&proxyurl;/api/img?code=%1$s&amp;url=%2$s</string>
@@ -115,6 +116,7 @@
<string name="pc_ua">COPY/%1$s</string>
<string name="app_ver">&appver;</string>
<string name="referer">com.copymanga.app-%1$s</string>
<string name="platform">&platform;</string>
<string name="menu_update_time">更新时间</string>
<string name="menu_hot">热度</string>
@@ -154,6 +156,8 @@
<string name="settings_cat_general_sb_summary_startup_menu">默认主页</string>
<string name="settings_cat_general_et_title_app_version">拷贝版本号</string>
<string name="settings_cat_general_et_summary_app_version">默认&appver;</string>
<string name="settings_cat_general_et_title_platform">平台版本号</string>
<string name="settings_cat_general_et_summary_platform">默认&platform;</string>
<string name="settings_cat_general_sb_card_per_row">每行加载卡片数偏移</string>
<string name="settings_cat_general_sm_card_per_row">默认为0表示无偏移, 在此基础上加减</string>
<string name="settings_cat_general_sw_disable_kanban_animation">不显示看板娘动画</string>

View File

@@ -47,6 +47,17 @@
app:enableCopying="true"
app:iconSpaceReserved="false"
app:key="settings_cat_general_et_app_version" />
<EditTextPreference
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:defaultValue="@string/platform"
android:selectAllOnFocus="false"
android:singleLine="true"
android:title="@string/settings_cat_general_et_title_platform"
android:summary="@string/settings_cat_general_et_summary_platform"
app:enableCopying="true"
app:iconSpaceReserved="false"
app:key="settings_cat_general_et_platform" />
<SeekBarPreference
android:defaultValue="0"
android:max="8"