mirror of
https://github.com/fumiama/copymanga.git
synced 2026-06-13 04:13:14 +08:00
v2.5.9
优化 1. 文件组织 升级 1. com.google.android.material -> 1.13.0
This commit is contained in:
@@ -12,8 +12,8 @@ android {
|
|||||||
minSdkVersion 23
|
minSdkVersion 23
|
||||||
//noinspection OldTargetApi
|
//noinspection OldTargetApi
|
||||||
targetSdkVersion 34
|
targetSdkVersion 34
|
||||||
versionCode 81
|
versionCode 82
|
||||||
versionName '2.5.8'
|
versionName '2.5.9'
|
||||||
resourceConfigurations += ['zh', 'zh-rCN']
|
resourceConfigurations += ['zh', 'zh-rCN']
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
@@ -101,7 +101,7 @@ dependencies {
|
|||||||
implementation 'androidx.core:core-ktx:1.12.0'
|
implementation 'androidx.core:core-ktx:1.12.0'
|
||||||
implementation 'androidx.appcompat:appcompat:1.7.1'
|
implementation 'androidx.appcompat:appcompat:1.7.1'
|
||||||
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
|
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
|
||||||
implementation 'com.google.android.material:material:1.12.0'
|
implementation 'com.google.android.material:material:1.13.0'
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
|
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
|
||||||
//noinspection GradleDependency
|
//noinspection GradleDependency
|
||||||
implementation 'androidx.navigation:navigation-fragment-ktx:2.7.7'
|
implementation 'androidx.navigation:navigation-fragment-ktx:2.7.7'
|
||||||
@@ -124,5 +124,5 @@ dependencies {
|
|||||||
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.7.0'
|
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.7.0'
|
||||||
implementation 'com.airbnb.android:lottie:6.6.6'
|
implementation 'com.airbnb.android:lottie:6.6.6'
|
||||||
implementation 'net.java.dev.jna:jna:5.17.0@aar'
|
implementation 'net.java.dev.jna:jna:5.17.0@aar'
|
||||||
implementation 'top.fumiama:sdict:0.1.0'
|
implementation 'top.fumiama:sdict:0.1.1'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ import top.fumiama.copymanga.ui.cardflow.rank.RankFragment
|
|||||||
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
|
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
|
||||||
import top.fumiama.copymanga.ui.download.DownloadFragment
|
import top.fumiama.copymanga.ui.download.DownloadFragment
|
||||||
import top.fumiama.copymanga.ui.download.NewDownloadFragment
|
import top.fumiama.copymanga.ui.download.NewDownloadFragment
|
||||||
import top.fumiama.copymanga.api.update.Update
|
import top.fumiama.copymanga.api.update.Updater
|
||||||
import top.fumiama.copymanga.api.user.Member
|
import top.fumiama.copymanga.api.user.Member
|
||||||
import top.fumiama.copymanga.lib.Comancry
|
import top.fumiama.copymanga.lib.Comancry
|
||||||
import top.fumiama.copymanga.lib.Comandy
|
import top.fumiama.copymanga.lib.Comandy
|
||||||
@@ -140,7 +140,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
override fun onDrawerSlide(drawerView: View, slideOffset: Float) {}
|
override fun onDrawerSlide(drawerView: View, slideOffset: Float) {}
|
||||||
override fun onDrawerStateChanged(newState: Int) {}
|
override fun onDrawerStateChanged(newState: Int) {}
|
||||||
})
|
})
|
||||||
goCheckUpdate(false)
|
lifecycleScope.launch { goCheckUpdate(false) }
|
||||||
|
|
||||||
ime = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
|
ime = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
|
||||||
|
|
||||||
@@ -459,9 +459,14 @@ class MainActivity : AppCompatActivity() {
|
|||||||
.getIntent(this))
|
.getIntent(this))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun goCheckUpdate(ignoreSkip: Boolean) {
|
private suspend fun goCheckUpdate(ignoreSkip: Boolean) {
|
||||||
lifecycleScope.launch {
|
withContext(Dispatchers.IO) {
|
||||||
Update.checkUpdate(this@MainActivity, toolsBox, ignoreSkip)
|
Updater(
|
||||||
|
WeakReference(this@MainActivity),
|
||||||
|
toolsBox,
|
||||||
|
ignoreSkip,
|
||||||
|
getPreferences(MODE_PRIVATE).getInt("skipVersion", 0)
|
||||||
|
).check(BuildConfig.VERSION_CODE)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -477,7 +482,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
dl.setIcon(R.mipmap.ic_launcher)
|
dl.setIcon(R.mipmap.ic_launcher)
|
||||||
dl.setPositiveButton(android.R.string.ok) { _, _ -> }
|
dl.setPositiveButton(android.R.string.ok) { _, _ -> }
|
||||||
dl.setNeutralButton(R.string.check_update) {_, _ ->
|
dl.setNeutralButton(R.string.check_update) {_, _ ->
|
||||||
goCheckUpdate(true)
|
lifecycleScope.launch { goCheckUpdate(true) }
|
||||||
}
|
}
|
||||||
dl.show()
|
dl.show()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,24 +42,15 @@ object Config {
|
|||||||
get() {
|
get() {
|
||||||
if (field === null)
|
if (field === null)
|
||||||
field = LazyHeaders.Builder()
|
field = LazyHeaders.Builder()
|
||||||
.addHeader("referer", referer)
|
|
||||||
.addHeader("User-Agent", pc_ua)
|
.addHeader("User-Agent", pc_ua)
|
||||||
.addHeader("source", net_source.value)
|
|
||||||
.addHeader("webp", "1")
|
|
||||||
.addHeader("version", app_ver.value)
|
|
||||||
.addHeader(
|
|
||||||
"region",
|
|
||||||
if (net_use_foreign.value) "1" else "0"
|
|
||||||
)
|
|
||||||
.addHeader("platform", platform.value)
|
|
||||||
.build()
|
.build()
|
||||||
return field
|
return field
|
||||||
}
|
}
|
||||||
|
|
||||||
val proxyUrl = MainActivity.mainWeakReference?.get()?.getString(R.string.proxyUrl)!!
|
val proxyUrl = MainActivity.mainWeakReference?.get()?.getString(R.string.proxyUrl)!!
|
||||||
val pc_ua get() = MainActivity.mainWeakReference?.get()?.getString(R.string.pc_ua)?.format(app_ver.value)?:""
|
val pc_ua get() = MainActivity.mainWeakReference?.get()?.getString(R.string.pc_ua)?:""
|
||||||
val default_ua get() = MainActivity.mainWeakReference?.get()?.getString(R.string.default_ua)?:""
|
val default_ua get() = MainActivity.mainWeakReference?.get()?.getString(R.string.default_ua)?:""
|
||||||
val referer get() = MainActivity.mainWeakReference?.get()?.getString(R.string.referer)?.format(app_ver.value)?:""
|
val requested get() = MainActivity.mainWeakReference?.get()?.getString(R.string.requested)?:""
|
||||||
|
|
||||||
val navTextInfo = UserPreferenceString("navTextInfo", R.string.navTextInfo)
|
val navTextInfo = UserPreferenceString("navTextInfo", R.string.navTextInfo)
|
||||||
val token = UserPreferenceString("token", "", null)
|
val token = UserPreferenceString("token", "", null)
|
||||||
@@ -70,7 +61,7 @@ object Config {
|
|||||||
val nickname = UserPreferenceString("nickname")
|
val nickname = UserPreferenceString("nickname")
|
||||||
val avatar = UserPreferenceString("avatar")
|
val avatar = UserPreferenceString("avatar")
|
||||||
|
|
||||||
val app_ver = PreferenceString("settings_cat_general_et_app_version", R.string.app_ver)
|
val version = PreferenceString("settings_cat_general_et_app_version", R.string.version)
|
||||||
val platform = PreferenceString("settings_cat_general_et_platform", R.string.platform)
|
val platform = PreferenceString("settings_cat_general_et_platform", R.string.platform)
|
||||||
val general_enable_transparent_system_bar = PreferenceBoolean("settings_cat_general_sw_enable_transparent_systembar", false)
|
val general_enable_transparent_system_bar = PreferenceBoolean("settings_cat_general_sw_enable_transparent_systembar", false)
|
||||||
val general_disable_kanban_animation = PreferenceBoolean("settings_cat_general_sw_disable_kanban_animation", false)
|
val general_disable_kanban_animation = PreferenceBoolean("settings_cat_general_sw_disable_kanban_animation", false)
|
||||||
@@ -82,11 +73,11 @@ object Config {
|
|||||||
val reverseProxyUrl = PreferenceString(R.string.reverseProxyKeyID)
|
val reverseProxyUrl = PreferenceString(R.string.reverseProxyKeyID)
|
||||||
val networkApiUrl = PreferenceString("settings_cat_net_et_api_url", R.string.hostUrl)
|
val networkApiUrl = PreferenceString("settings_cat_net_et_api_url", R.string.hostUrl)
|
||||||
val proxy_key = PreferenceString(R.string.imgProxyCodeKeyID)
|
val proxy_key = PreferenceString(R.string.imgProxyCodeKeyID)
|
||||||
val net_use_gzip = PreferenceBoolean("settings_cat_net_sw_use_gzip", false)
|
val net_use_gzip = PreferenceBoolean("settings_cat_net_sw_use_gzip", true)
|
||||||
val net_use_json = PreferenceBoolean("settings_cat_net_sw_use_json", false)
|
val net_use_json = PreferenceBoolean("settings_cat_net_sw_use_json", true)
|
||||||
val net_platform = PreferenceBoolean("settings_cat_net_sw_platform", false)
|
val net_platform = PreferenceBoolean("settings_cat_net_sw_platform", true)
|
||||||
val net_referer = PreferenceBoolean("settings_cat_net_sw_referer", false)
|
val net_referer = PreferenceBoolean("settings_cat_net_sw_referer", false)
|
||||||
val net_version = PreferenceBoolean("settings_cat_net_sw_version", false)
|
val net_version = PreferenceBoolean("settings_cat_net_sw_version", true)
|
||||||
val net_region = PreferenceBoolean("settings_cat_net_sw_region", false)
|
val net_region = PreferenceBoolean("settings_cat_net_sw_region", false)
|
||||||
val net_no_webp = PreferenceBoolean("settings_cat_net_no_webp", false)
|
val net_no_webp = PreferenceBoolean("settings_cat_net_no_webp", false)
|
||||||
val net_use_comandy = PreferenceBoolean("settings_cat_net_sw_use_comandy", false)
|
val net_use_comandy = PreferenceBoolean("settings_cat_net_sw_use_comandy", false)
|
||||||
@@ -95,7 +86,7 @@ object Config {
|
|||||||
val net_use_api_proxy = PreferenceBoolean("settings_cat_net_sw_use_api_proxy", false)
|
val net_use_api_proxy = PreferenceBoolean("settings_cat_net_sw_use_api_proxy", false)
|
||||||
val net_img_resolution = PreferenceString(R.string.imgResolutionKeyID)
|
val net_img_resolution = PreferenceString(R.string.imgResolutionKeyID)
|
||||||
val net_umstring = PreferenceString("settings_cat_net_et_umstring")
|
val net_umstring = PreferenceString("settings_cat_net_et_umstring")
|
||||||
val net_source = PreferenceString("settings_cat_net_et_source", R.string.source)
|
val net_source = PreferenceString("settings_cat_net_et_source", R.string.requested)
|
||||||
val net_ua = PreferenceString("settings_cat_net_et_ua", R.string.default_ua)
|
val net_ua = PreferenceString("settings_cat_net_et_ua", R.string.default_ua)
|
||||||
|
|
||||||
val view_manga_inverse_chapters = PreferenceBoolean("settings_cat_vm_sw_inverse_chapters", false)
|
val view_manga_inverse_chapters = PreferenceBoolean("settings_cat_vm_sw_inverse_chapters", false)
|
||||||
|
|||||||
@@ -1,71 +0,0 @@
|
|||||||
package top.fumiama.copymanga.api.update
|
|
||||||
|
|
||||||
import android.util.Log
|
|
||||||
import top.fumiama.sdict.io.Client
|
|
||||||
|
|
||||||
class SimpleKanban(private val client: Client, private val pwd: String) { //must run in thread
|
|
||||||
private val raw: ByteArray?
|
|
||||||
get() {
|
|
||||||
var times = 3
|
|
||||||
var re: ByteArray
|
|
||||||
var firstReceived: ByteArray
|
|
||||||
do {
|
|
||||||
re = byteArrayOf()
|
|
||||||
if(client.initConnect()) {
|
|
||||||
client.sendMessage("${pwd}catquit")
|
|
||||||
client.receiveRawMessage(33) //Welcome to simple kanban server.
|
|
||||||
try {
|
|
||||||
firstReceived = client.receiveRawMessage(4) //le
|
|
||||||
val length = convert2Int(firstReceived)
|
|
||||||
Log.d("MySK", "Msg len: $length")
|
|
||||||
if(firstReceived.size > 4) re += firstReceived.copyOfRange(4, firstReceived.size)
|
|
||||||
re += client.receiveRawMessage(length - re.size, setProgress = true)
|
|
||||||
break
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
client.closeConnect()
|
|
||||||
}
|
|
||||||
} while (times-- > 0)
|
|
||||||
return if(re.isEmpty()) null else re
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun convert2Int(buffer: ByteArray) =
|
|
||||||
(buffer[3].toInt() and 0xff shl 24) or
|
|
||||||
(buffer[2].toInt() and 0xff shl 16) or
|
|
||||||
(buffer[1].toInt() and 0xff shl 8) or
|
|
||||||
(buffer[0].toInt() and 0xff)
|
|
||||||
|
|
||||||
suspend fun fetchRaw(doOnLoadFailure: suspend ()->Unit = {
|
|
||||||
Log.d("MySD", "Fetch dict failed")
|
|
||||||
}, doOnLoadSuccess: suspend (data: ByteArray)->Unit = {
|
|
||||||
Log.d("MySD", "Fetch dict success")
|
|
||||||
}) {
|
|
||||||
raw?.apply {
|
|
||||||
doOnLoadSuccess(this)
|
|
||||||
}?:doOnLoadFailure()
|
|
||||||
}
|
|
||||||
|
|
||||||
operator fun get(version: Int): String =
|
|
||||||
if(client.initConnect()) {
|
|
||||||
client.sendMessage("${pwd}get${version}quit")
|
|
||||||
client.receiveRawMessage(36) //Welcome to simple kanban server. get
|
|
||||||
val r = try {
|
|
||||||
val firstReceive = client.receiveRawMessage(4)
|
|
||||||
if(firstReceive.decodeToString() == "null") "null"
|
|
||||||
else {
|
|
||||||
val length = convert2Int(firstReceive)
|
|
||||||
Log.d("MySK", "Msg len: $length")
|
|
||||||
var re = byteArrayOf()
|
|
||||||
if(firstReceive.size > 4) re += firstReceive.copyOfRange(4, firstReceive.size)
|
|
||||||
re += client.receiveRawMessage(length - re.size)
|
|
||||||
if(re.isNotEmpty()) re.decodeToString() else "null"
|
|
||||||
}
|
|
||||||
} catch (e: Exception){
|
|
||||||
e.printStackTrace()
|
|
||||||
"null"
|
|
||||||
}
|
|
||||||
client.closeConnect()
|
|
||||||
r
|
|
||||||
} else "null"
|
|
||||||
}
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
package top.fumiama.copymanga.api.update
|
|
||||||
|
|
||||||
import android.app.Activity
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.Context.MODE_PRIVATE
|
|
||||||
import android.content.Intent
|
|
||||||
import android.net.Uri
|
|
||||||
import android.os.Build
|
|
||||||
import android.util.Log
|
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
|
||||||
import androidx.core.content.FileProvider
|
|
||||||
import androidx.core.content.edit
|
|
||||||
import androidx.lifecycle.lifecycleScope
|
|
||||||
import kotlinx.android.synthetic.main.dialog_progress.view.*
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import kotlinx.coroutines.withContext
|
|
||||||
import top.fumiama.sdict.io.Client
|
|
||||||
import top.fumiama.copymanga.view.interaction.UITools
|
|
||||||
import top.fumiama.dmzj.copymanga.BuildConfig
|
|
||||||
import top.fumiama.dmzj.copymanga.R
|
|
||||||
import top.fumiama.sdict.utils.Utils.toHexStr
|
|
||||||
import java.io.File
|
|
||||||
import java.security.MessageDigest
|
|
||||||
|
|
||||||
object Update {
|
|
||||||
suspend fun checkUpdate(activity: AppCompatActivity, toolsBox: UITools, ignoreSkip: Boolean = false) = activity.apply{
|
|
||||||
val client = Client("reilia.fumiama.top", 13212)
|
|
||||||
val kanban = SimpleKanban(client, "fumiama")
|
|
||||||
|
|
||||||
val progressBar = layoutInflater.inflate(R.layout.dialog_progress, null, false)
|
|
||||||
val progressHandler = object : Client.Progress{
|
|
||||||
override fun notify(progressPercentage: Int) {
|
|
||||||
Log.d("MyUP", "Set progress: $progressPercentage")
|
|
||||||
progressBar.dpp.progress = progressPercentage
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val msg = message(kanban)
|
|
||||||
if (msg == "null") {
|
|
||||||
if(ignoreSkip) withContext(Dispatchers.Main) {
|
|
||||||
Toast.makeText(this@apply, "无更新", Toast.LENGTH_SHORT).show()
|
|
||||||
}
|
|
||||||
return@apply
|
|
||||||
}
|
|
||||||
|
|
||||||
val verNum = msg.substringBefore('\n').toIntOrNull()
|
|
||||||
val skipNum = getPreferences(MODE_PRIVATE).getInt("skipVersion", 0)
|
|
||||||
Log.d("MyUP", "Ver:$verNum, skip: $skipNum")
|
|
||||||
if (verNum == null) return@apply
|
|
||||||
|
|
||||||
if(!msg.contains("md5:")) {
|
|
||||||
withContext(Dispatchers.Main) {
|
|
||||||
toolsBox.buildInfo("看板", msg.substringAfter('\n'), "知道了")
|
|
||||||
}
|
|
||||||
return@apply
|
|
||||||
}
|
|
||||||
if(skipNum < verNum || ignoreSkip) {
|
|
||||||
toolsBox.buildInfo("看板", msg.substringAfter('\n').substringBeforeLast('\n'), "下载新版", "跳过该版", "取消", {
|
|
||||||
val info = toolsBox.buildAlertWithView("下载进度", progressBar, "隐藏")
|
|
||||||
client.progress = progressHandler
|
|
||||||
lifecycleScope.launch {
|
|
||||||
fetch(client, kanban, this@apply) {
|
|
||||||
lifecycleScope.launch {
|
|
||||||
val md5 = msg.substringAfterLast("md5:")
|
|
||||||
if (md5 == toHexStr(
|
|
||||||
MessageDigest.getInstance("MD5").digest(it)
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
Toast.makeText(this@apply, "下载成功", Toast.LENGTH_SHORT).show()
|
|
||||||
info.dismiss()
|
|
||||||
install(it, this@apply)
|
|
||||||
} else {
|
|
||||||
Toast.makeText(this@apply, "文件损坏", Toast.LENGTH_SHORT).show()
|
|
||||||
info.dismiss()
|
|
||||||
}
|
|
||||||
client.progress = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
getPreferences(MODE_PRIVATE).edit {
|
|
||||||
putInt("skipVersion", verNum)
|
|
||||||
apply()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private suspend fun message(kanban: SimpleKanban) = withContext(Dispatchers.IO) {
|
|
||||||
return@withContext kanban[BuildConfig.VERSION_CODE]
|
|
||||||
}
|
|
||||||
|
|
||||||
private suspend fun fetch(client: Client, kanban: SimpleKanban, context: Context, doOnLoadSuccess: (data: ByteArray) -> Unit) = withContext(Dispatchers.IO) {
|
|
||||||
return@withContext kanban.fetchRaw({ downloadFail(client, context) }, doOnLoadSuccess)
|
|
||||||
}
|
|
||||||
|
|
||||||
private suspend fun downloadFail(client: Client, context: Context) = withContext(Dispatchers.Main) {
|
|
||||||
Toast.makeText(context, R.string.download_apk_fail, Toast.LENGTH_SHORT).show()
|
|
||||||
client.progress = null
|
|
||||||
}
|
|
||||||
|
|
||||||
private suspend fun install(data: ByteArray, activity: Activity) = activity.apply{
|
|
||||||
withContext(Dispatchers.IO) {
|
|
||||||
val f = File(externalCacheDir, "new.apk")
|
|
||||||
f.writeBytes(data)
|
|
||||||
val intent = Intent(Intent.ACTION_VIEW)
|
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
||||||
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
|
||||||
val contentUri: Uri = FileProvider.getUriForFile(this@apply, "$packageName.fileprovider", f)
|
|
||||||
intent.setDataAndType(contentUri, "application/vnd.android.package-archive")
|
|
||||||
} else intent.setDataAndType(Uri.fromFile(f), "application/vnd.android.package-archive")
|
|
||||||
withContext(Dispatchers.Main) {
|
|
||||||
startActivity(intent)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
121
app/src/main/java/top/fumiama/copymanga/api/update/Updater.kt
Normal file
121
app/src/main/java/top/fumiama/copymanga/api/update/Updater.kt
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
package top.fumiama.copymanga.api.update
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.app.AlertDialog
|
||||||
|
import android.content.Context.MODE_PRIVATE
|
||||||
|
import android.content.Intent
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.Build
|
||||||
|
import android.util.Log
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.core.content.FileProvider
|
||||||
|
import androidx.core.content.edit
|
||||||
|
import androidx.lifecycle.lifecycleScope
|
||||||
|
import kotlinx.android.synthetic.main.dialog_progress.view.*
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
import top.fumiama.copymanga.view.interaction.UITools
|
||||||
|
import top.fumiama.dmzj.copymanga.R
|
||||||
|
import top.fumiama.sdict.ApkUpdater
|
||||||
|
import top.fumiama.sdict.io.Client
|
||||||
|
import java.io.File
|
||||||
|
import java.lang.ref.WeakReference
|
||||||
|
|
||||||
|
class Updater(
|
||||||
|
private val a: WeakReference<AppCompatActivity>, private val toolsBox: UITools,
|
||||||
|
private val ignoreSkip: Boolean, private val skipNum: Int,
|
||||||
|
): ApkUpdater("reilia.fumiama.top", 13212, "fumiama") {
|
||||||
|
private var mInfo: AlertDialog? = null
|
||||||
|
set(value) {
|
||||||
|
field?.dismiss()
|
||||||
|
field = value
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun onCheckLatestVersion(version: Int) {
|
||||||
|
super.onCheckLatestVersion(version)
|
||||||
|
a.get()?.apply {
|
||||||
|
if (ignoreSkip) withContext(Dispatchers.Main) {
|
||||||
|
Toast.makeText(this@apply, "无更新", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun onCheckNewVersion(version: Int, message: String, md5: String?) {
|
||||||
|
super.onCheckNewVersion(version, message, md5)
|
||||||
|
if (md5 == null) {
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
toolsBox.buildInfo("看板", message, "知道了")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if(skipNum < version || ignoreSkip) {
|
||||||
|
val progressBar =
|
||||||
|
a.get()?.layoutInflater?.inflate(R.layout.dialog_progress, null, false) ?: return
|
||||||
|
val progressHandler = object : Client.Progress {
|
||||||
|
override fun notify(progressPercentage: Int) {
|
||||||
|
Log.d("MyUP", "Set progress: $progressPercentage")
|
||||||
|
progressBar.dpp.progress = progressPercentage
|
||||||
|
}
|
||||||
|
}
|
||||||
|
toolsBox.buildInfo("看板", message, "下载新版", "跳过该版", "取消", {
|
||||||
|
mInfo = toolsBox.buildAlertWithView("下载进度", progressBar, "隐藏")
|
||||||
|
a.get()?.lifecycleScope?.launch { download(md5, progressHandler) }
|
||||||
|
}, {
|
||||||
|
a.get()?.apply {
|
||||||
|
getPreferences(MODE_PRIVATE).edit {
|
||||||
|
putInt("skipVersion", version)
|
||||||
|
apply()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun onDownloadNewVersionFailed(cause: Int) {
|
||||||
|
super.onDownloadNewVersionFailed(cause)
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
mInfo?.dismiss()
|
||||||
|
mInfo = null
|
||||||
|
when (cause) {
|
||||||
|
UPDATE_FAIL_NETWORK -> a.get()?.apply {
|
||||||
|
Toast.makeText(this@apply, "网络错误", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
UPDATE_FAIL_FILE_CORRUPT -> a.get()?.apply {
|
||||||
|
Toast.makeText(this@apply, "文件损坏", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun onDownloadNewVersionSuccess(data: ByteArray) {
|
||||||
|
super.onDownloadNewVersionSuccess(data)
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
mInfo?.dismiss()
|
||||||
|
mInfo = null
|
||||||
|
a.get()?.apply {
|
||||||
|
Toast.makeText(this@apply, "下载成功", Toast.LENGTH_SHORT).show()
|
||||||
|
install(data, this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private suspend fun install(data: ByteArray, activity: Activity) = activity.apply {
|
||||||
|
withContext(Dispatchers.IO) {
|
||||||
|
val f = File(externalCacheDir, "new.apk")
|
||||||
|
f.writeBytes(data)
|
||||||
|
val intent = Intent(Intent.ACTION_VIEW)
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
|
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||||
|
val contentUri: Uri = FileProvider.getUriForFile(this@apply, "$packageName.fileprovider", f)
|
||||||
|
intent.setDataAndType(contentUri, "application/vnd.android.package-archive")
|
||||||
|
} else intent.setDataAndType(Uri.fromFile(f), "application/vnd.android.package-archive")
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
startActivity(intent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -69,7 +69,7 @@ class Member(private val getString: (Int) -> String) {
|
|||||||
username,
|
username,
|
||||||
Charset.defaultCharset().name()
|
Charset.defaultCharset().name()
|
||||||
)
|
)
|
||||||
}&password=$pwdEncoded&salt=$salt&platform=${Config.platform.value}&authorization=Token+&version=${Config.app_ver.value}&source=copyApp®ion=$r&webp=1".encodeToByteArray(),
|
}&password=$pwdEncoded&salt=$salt&platform=${Config.platform.value}&version=${Config.version.value}&source=Official".encodeToByteArray(),
|
||||||
"POST", "application/x-www-form-urlencoded;charset=utf-8")
|
"POST", "application/x-www-form-urlencoded;charset=utf-8")
|
||||||
}.encodeToByteArray()
|
}.encodeToByteArray()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,23 +37,23 @@ object DownloadTools {
|
|||||||
if (it.isEmpty()) return@let
|
if (it.isEmpty()) return@let
|
||||||
setRequestProperty("user-agent", if (it == Config.default_ua) Config.pc_ua else it)
|
setRequestProperty("user-agent", if (it == Config.default_ua) Config.pc_ua else it)
|
||||||
}
|
}
|
||||||
Config.net_source.value.let { if(it.isNotEmpty()) setRequestProperty("source", it) }
|
Config.net_source.value.let { if(it.isNotEmpty()) setRequestProperty("x-requested-with", it) }
|
||||||
// deviceinfo
|
// deviceinfo
|
||||||
if (!Config.net_no_webp.value) setRequestProperty("webp", "1")
|
if (!Config.net_no_webp.value) setRequestProperty("webp", "1")
|
||||||
setRequestProperty("dt", SimpleDateFormat("yyyy.MM.dd", Locale.getDefault()).format(Calendar.getInstance().time))
|
//setRequestProperty("dt", SimpleDateFormat("yyyy.MM.dd", Locale.getDefault()).format(Calendar.getInstance().time))
|
||||||
if (Config.net_use_gzip.value) setRequestProperty("accept-encoding", "gzip")
|
if (Config.net_use_gzip.value) setRequestProperty("accept-encoding", "gzip")
|
||||||
setRequestProperty("authorization", "Token${Config.token.value?.let { tk ->
|
setRequestProperty("authorization", "Token${Config.token.value?.let { tk ->
|
||||||
if (tk.isNotEmpty()) " $tk" else ""
|
if (tk.isNotEmpty()) " $tk" else ""
|
||||||
}?:""}")
|
}?:""}")
|
||||||
if (Config.net_platform.value) setRequestProperty("platform", Config.platform.value)
|
if (Config.net_platform.value) setRequestProperty("platform", Config.platform.value)
|
||||||
if (Config.net_referer.value) setRequestProperty("referer", Config.referer)
|
//if (Config.net_referer.value) setRequestProperty("referer", Config.referer)
|
||||||
if (Config.net_use_json.value) setRequestProperty("accept", "application/json")
|
if (Config.net_use_json.value) setRequestProperty("accept", "application/json")
|
||||||
if (Config.net_version.value) setRequestProperty("version", Config.app_ver.value)
|
if (Config.net_version.value) setRequestProperty("version", Config.version.value)
|
||||||
if (Config.net_region.value) setRequestProperty("region", if(!Config.net_use_foreign.value) "1" else "0")
|
//if (Config.net_region.value) setRequestProperty("region", if(!Config.net_use_foreign.value) "1" else "0")
|
||||||
// device
|
// device
|
||||||
// host
|
// host
|
||||||
Config.net_umstring.value.let { if (it.isNotEmpty()) setRequestProperty("umstring", it) }
|
//Config.net_umstring.value.let { if (it.isNotEmpty()) setRequestProperty("umstring", it) }
|
||||||
setRequestProperty("connection", "close")
|
//setRequestProperty("connection", "close")
|
||||||
}
|
}
|
||||||
Log.d("MyDT", "getConnection: $url\n${connection.requestProperties.map { "${it.key}: ${it.value}" }.joinToString("\n")}")
|
Log.d("MyDT", "getConnection: $url\n${connection.requestProperties.map { "${it.key}: ${it.value}" }.joinToString("\n")}")
|
||||||
return connection
|
return connection
|
||||||
@@ -69,22 +69,22 @@ object DownloadTools {
|
|||||||
if (it.isEmpty()) return@let
|
if (it.isEmpty()) return@let
|
||||||
capsule.headers["user-agent"] = if (it == Config.default_ua) Config.pc_ua else it
|
capsule.headers["user-agent"] = if (it == Config.default_ua) Config.pc_ua else it
|
||||||
}
|
}
|
||||||
Config.net_source.value.let { if(it.isNotEmpty()) capsule.headers["source"] = it }
|
Config.net_source.value.let { if(it.isNotEmpty()) capsule.headers["x-requested-with"] = it }
|
||||||
// deviceinfo
|
// deviceinfo
|
||||||
if (!Config.net_no_webp.value) capsule.headers["webp"] = "1"
|
if (!Config.net_no_webp.value) capsule.headers["webp"] = "1"
|
||||||
capsule.headers["dt"] = SimpleDateFormat("yyyy.MM.dd", Locale.getDefault()).format(Calendar.getInstance().time)
|
//capsule.headers["dt"] = SimpleDateFormat("yyyy.MM.dd", Locale.getDefault()).format(Calendar.getInstance().time)
|
||||||
if (Config.net_use_gzip.value) capsule.headers["accept-encoding"] = "gzip"
|
if (Config.net_use_gzip.value) capsule.headers["accept-encoding"] = "gzip"
|
||||||
capsule.headers["authorization"] = "Token${Config.token.value?.let { tk ->
|
capsule.headers["authorization"] = "Token${Config.token.value?.let { tk ->
|
||||||
if (tk.isNotEmpty()) " $tk" else ""
|
if (tk.isNotEmpty()) " $tk" else ""
|
||||||
}?:""}"
|
}?:""}"
|
||||||
if (Config.net_platform.value) capsule.headers["platform"] = Config.platform.value
|
if (Config.net_platform.value) capsule.headers["platform"] = Config.platform.value
|
||||||
if (Config.net_referer.value) capsule.headers["referer"] = Config.referer
|
//if (Config.net_referer.value) capsule.headers["referer"] = Config.referer
|
||||||
if (Config.net_use_json.value) capsule.headers["accept"] = "application/json"
|
if (Config.net_use_json.value) capsule.headers["accept"] = "application/json"
|
||||||
if (Config.net_version.value) capsule.headers["version"] = Config.app_ver.value
|
if (Config.net_version.value) capsule.headers["version"] = Config.version.value
|
||||||
if (Config.net_region.value) capsule.headers["region"] = if(!Config.net_use_foreign.value) "1" else "0"
|
//if (Config.net_region.value) capsule.headers["region"] = if(!Config.net_use_foreign.value) "1" else "0"
|
||||||
// device
|
// device
|
||||||
// host
|
// host
|
||||||
Config.net_umstring.value.let { if (it.isNotEmpty()) capsule.headers["umstring"] = it }
|
//Config.net_umstring.value.let { if (it.isNotEmpty()) capsule.headers["umstring"] = it }
|
||||||
capsule.headers["connection"] = "close"
|
capsule.headers["connection"] = "close"
|
||||||
|
|
||||||
Log.d("MyDT", "getComandyConnection: $url\n${capsule.headers.map { "${it.key}: ${it.value}" }.joinToString("\n")}")
|
Log.d("MyDT", "getComandyConnection: $url\n${capsule.headers.map { "${it.key}: ${it.value}" }.joinToString("\n")}")
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class ConfigLoader {
|
|||||||
var viewMangaHideInfo: Boolean,
|
var viewMangaHideInfo: Boolean,
|
||||||
) {
|
) {
|
||||||
fun export() {
|
fun export() {
|
||||||
Config.app_ver.value = appVer
|
Config.version.value = appVer
|
||||||
Config.platform.value = platform
|
Config.platform.value = platform
|
||||||
Config.general_enable_transparent_system_bar.value = generalEnableTransparentSystemBar
|
Config.general_enable_transparent_system_bar.value = generalEnableTransparentSystemBar
|
||||||
Config.general_disable_kanban_animation.value = generalDisableKanbanAnimation
|
Config.general_disable_kanban_animation.value = generalDisableKanbanAnimation
|
||||||
@@ -88,7 +88,7 @@ class ConfigLoader {
|
|||||||
val settings: Settings
|
val settings: Settings
|
||||||
|
|
||||||
constructor(): this(Settings(
|
constructor(): this(Settings(
|
||||||
appVer = Config.app_ver.value,
|
appVer = Config.version.value,
|
||||||
platform = Config.platform.value,
|
platform = Config.platform.value,
|
||||||
generalEnableTransparentSystemBar = Config.general_enable_transparent_system_bar.value,
|
generalEnableTransparentSystemBar = Config.general_enable_transparent_system_bar.value,
|
||||||
generalDisableKanbanAnimation = Config.general_disable_kanban_animation.value,
|
generalDisableKanbanAnimation = Config.general_disable_kanban_animation.value,
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import top.fumiama.copymanga.api.Config
|
|||||||
import top.fumiama.copymanga.api.manga.Book
|
import top.fumiama.copymanga.api.manga.Book
|
||||||
import top.fumiama.copymanga.api.manga.Reader
|
import top.fumiama.copymanga.api.manga.Reader
|
||||||
import top.fumiama.copymanga.strings.Chinese
|
import top.fumiama.copymanga.strings.Chinese
|
||||||
import top.fumiama.copymanga.view.template.NoBackRefreshFragment
|
import top.fumiama.copymanga.view.template.fragment.NoBackRefreshFragment
|
||||||
import top.fumiama.copymanga.view.interaction.Navigate
|
import top.fumiama.copymanga.view.interaction.Navigate
|
||||||
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
|
import top.fumiama.copymanga.ui.comicdl.ComicDlFragment
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.dmzj.copymanga.R
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package top.fumiama.copymanga.ui.cardflow.author
|
package top.fumiama.copymanga.ui.cardflow.author
|
||||||
|
|
||||||
import top.fumiama.copymanga.view.template.ThemeCardFlow
|
import top.fumiama.copymanga.view.template.cardflow.ThemeCardFlow
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.dmzj.copymanga.R
|
||||||
|
|
||||||
@ExperimentalStdlibApi
|
@ExperimentalStdlibApi
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package top.fumiama.copymanga.ui.cardflow.caption
|
package top.fumiama.copymanga.ui.cardflow.caption
|
||||||
|
|
||||||
import top.fumiama.copymanga.view.template.ThemeCardFlow
|
import top.fumiama.copymanga.view.template.cardflow.ThemeCardFlow
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.dmzj.copymanga.R
|
||||||
|
|
||||||
@ExperimentalStdlibApi
|
@ExperimentalStdlibApi
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package top.fumiama.copymanga.ui.cardflow.finish
|
|||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import top.fumiama.copymanga.view.template.StatusCardFlow
|
import top.fumiama.copymanga.view.template.cardflow.StatusCardFlow
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.dmzj.copymanga.R
|
||||||
import kotlinx.android.synthetic.main.line_finish.*
|
import kotlinx.android.synthetic.main.line_finish.*
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import android.os.Bundle
|
|||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import top.fumiama.copymanga.MainActivity
|
import top.fumiama.copymanga.MainActivity
|
||||||
import top.fumiama.copymanga.view.template.InfoCardLoader
|
import top.fumiama.copymanga.view.template.cardflow.InfoCardLoader
|
||||||
import top.fumiama.copymanga.api.Config
|
import top.fumiama.copymanga.api.Config
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.dmzj.copymanga.R
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package top.fumiama.copymanga.ui.cardflow.newest
|
package top.fumiama.copymanga.ui.cardflow.newest
|
||||||
|
|
||||||
import top.fumiama.copymanga.view.template.InfoCardLoader
|
import top.fumiama.copymanga.view.template.cardflow.InfoCardLoader
|
||||||
import top.fumiama.copymanga.api.Config
|
import top.fumiama.copymanga.api.Config
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.dmzj.copymanga.R
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import android.os.Bundle
|
|||||||
import com.google.android.material.tabs.TabLayout
|
import com.google.android.material.tabs.TabLayout
|
||||||
import kotlinx.android.synthetic.main.fragment_rank.*
|
import kotlinx.android.synthetic.main.fragment_rank.*
|
||||||
import kotlinx.android.synthetic.main.line_rank.view.*
|
import kotlinx.android.synthetic.main.line_rank.view.*
|
||||||
import top.fumiama.copymanga.view.template.InfoCardLoader
|
import top.fumiama.copymanga.view.template.cardflow.InfoCardLoader
|
||||||
import top.fumiama.copymanga.api.Config
|
import top.fumiama.copymanga.api.Config
|
||||||
import top.fumiama.copymanga.view.interaction.UITools
|
import top.fumiama.copymanga.view.interaction.UITools
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.dmzj.copymanga.R
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package top.fumiama.copymanga.ui.cardflow.recommend
|
package top.fumiama.copymanga.ui.cardflow.recommend
|
||||||
|
|
||||||
import top.fumiama.copymanga.view.template.InfoCardLoader
|
import top.fumiama.copymanga.view.template.cardflow.InfoCardLoader
|
||||||
import top.fumiama.copymanga.api.Config
|
import top.fumiama.copymanga.api.Config
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.dmzj.copymanga.R
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package top.fumiama.copymanga.ui.cardflow.search
|
|||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import top.fumiama.copymanga.view.template.InfoCardLoader
|
import top.fumiama.copymanga.view.template.cardflow.InfoCardLoader
|
||||||
import top.fumiama.copymanga.api.Config
|
import top.fumiama.copymanga.api.Config
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.dmzj.copymanga.R
|
||||||
import java.net.URLEncoder
|
import java.net.URLEncoder
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import androidx.navigation.fragment.findNavController
|
|||||||
import kotlinx.android.synthetic.main.anchor_popular.view.*
|
import kotlinx.android.synthetic.main.anchor_popular.view.*
|
||||||
import kotlinx.android.synthetic.main.line_shelf.*
|
import kotlinx.android.synthetic.main.line_shelf.*
|
||||||
import top.fumiama.copymanga.MainActivity
|
import top.fumiama.copymanga.MainActivity
|
||||||
import top.fumiama.copymanga.view.template.InfoCardLoader
|
import top.fumiama.copymanga.view.template.cardflow.InfoCardLoader
|
||||||
import top.fumiama.copymanga.api.Config
|
import top.fumiama.copymanga.api.Config
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.dmzj.copymanga.R
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import kotlinx.coroutines.withContext
|
|||||||
import top.fumiama.copymanga.json.FilterStructure
|
import top.fumiama.copymanga.json.FilterStructure
|
||||||
import top.fumiama.copymanga.json.ThemeStructure
|
import top.fumiama.copymanga.json.ThemeStructure
|
||||||
import top.fumiama.copymanga.net.template.PausableDownloader
|
import top.fumiama.copymanga.net.template.PausableDownloader
|
||||||
import top.fumiama.copymanga.view.template.StatusCardFlow
|
import top.fumiama.copymanga.view.template.cardflow.StatusCardFlow
|
||||||
import top.fumiama.copymanga.api.Config
|
import top.fumiama.copymanga.api.Config
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.dmzj.copymanga.R
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import kotlinx.coroutines.launch
|
|||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import top.fumiama.copymanga.json.TopicStructure
|
import top.fumiama.copymanga.json.TopicStructure
|
||||||
import top.fumiama.copymanga.net.template.PausableDownloader
|
import top.fumiama.copymanga.net.template.PausableDownloader
|
||||||
import top.fumiama.copymanga.view.template.InfoCardLoader
|
import top.fumiama.copymanga.view.template.cardflow.InfoCardLoader
|
||||||
import top.fumiama.copymanga.api.Config
|
import top.fumiama.copymanga.api.Config
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.dmzj.copymanga.R
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import kotlinx.coroutines.delay
|
|||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import top.fumiama.copymanga.json.VolumeStructure
|
import top.fumiama.copymanga.json.VolumeStructure
|
||||||
import top.fumiama.copymanga.view.template.NoBackRefreshFragment
|
import top.fumiama.copymanga.view.template.fragment.NoBackRefreshFragment
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.dmzj.copymanga.R
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.lang.ref.WeakReference
|
import java.lang.ref.WeakReference
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import kotlinx.coroutines.withContext
|
|||||||
import top.fumiama.copymanga.MainActivity
|
import top.fumiama.copymanga.MainActivity
|
||||||
import top.fumiama.copymanga.api.manga.Downloader
|
import top.fumiama.copymanga.api.manga.Downloader
|
||||||
import top.fumiama.copymanga.api.manga.Reader
|
import top.fumiama.copymanga.api.manga.Reader
|
||||||
import top.fumiama.copymanga.view.template.NoBackRefreshFragment
|
import top.fumiama.copymanga.view.template.fragment.NoBackRefreshFragment
|
||||||
import top.fumiama.copymanga.storage.FileUtils
|
import top.fumiama.copymanga.storage.FileUtils
|
||||||
import top.fumiama.copymanga.view.interaction.Navigate
|
import top.fumiama.copymanga.view.interaction.Navigate
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.dmzj.copymanga.R
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ import top.fumiama.copymanga.storage.FileUtils
|
|||||||
import top.fumiama.copymanga.storage.FileUtils.compressToUserFile
|
import top.fumiama.copymanga.storage.FileUtils.compressToUserFile
|
||||||
import top.fumiama.copymanga.view.interaction.Navigate
|
import top.fumiama.copymanga.view.interaction.Navigate
|
||||||
import top.fumiama.copymanga.view.interaction.UITools
|
import top.fumiama.copymanga.view.interaction.UITools
|
||||||
import top.fumiama.copymanga.view.template.CardList
|
import top.fumiama.copymanga.view.template.component.CardList
|
||||||
import top.fumiama.copymanga.view.template.MangaPagesFragmentTemplate
|
import top.fumiama.copymanga.view.template.fragment.MangaPagesFragmentTemplate
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.dmzj.copymanga.R
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.lang.ref.WeakReference
|
import java.lang.ref.WeakReference
|
||||||
|
|||||||
@@ -34,13 +34,13 @@ import top.fumiama.copymanga.json.BookListStructure
|
|||||||
import top.fumiama.copymanga.net.template.PausableDownloader
|
import top.fumiama.copymanga.net.template.PausableDownloader
|
||||||
import top.fumiama.copymanga.view.interaction.Navigate
|
import top.fumiama.copymanga.view.interaction.Navigate
|
||||||
import top.fumiama.copymanga.view.operation.GlideHideLottieViewListener
|
import top.fumiama.copymanga.view.operation.GlideHideLottieViewListener
|
||||||
import top.fumiama.copymanga.view.template.NoBackRefreshFragment
|
import top.fumiama.copymanga.view.template.fragment.NoBackRefreshFragment
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.dmzj.copymanga.R
|
||||||
import java.lang.ref.WeakReference
|
import java.lang.ref.WeakReference
|
||||||
import java.net.URLEncoder
|
import java.net.URLEncoder
|
||||||
import java.nio.charset.Charset
|
import java.nio.charset.Charset
|
||||||
|
|
||||||
class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home, true) {
|
class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
|
||||||
lateinit var homeHandler: HomeHandler
|
lateinit var homeHandler: HomeHandler
|
||||||
val vm: HomeViewModel by viewModels()
|
val vm: HomeViewModel by viewModels()
|
||||||
|
|
||||||
@@ -48,6 +48,8 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home, true) {
|
|||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
|
if (!isFirstInflate) return
|
||||||
|
|
||||||
val theme = resources.newTheme()
|
val theme = resources.newTheme()
|
||||||
swiperefresh?.setColorSchemeColors(
|
swiperefresh?.setColorSchemeColors(
|
||||||
resources.getColor(R.color.colorAccent, theme),
|
resources.getColor(R.color.colorAccent, theme),
|
||||||
@@ -233,7 +235,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home, true) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: ViewData, position: Int) {
|
override fun onBindViewHolder(holder: ViewData, position: Int) {
|
||||||
val thisBanner = homeHandler.index?.results?.banners?.get(position)
|
val thisBanner = homeHandler.homeIndex?.results?.banners?.get(position)
|
||||||
thisBanner?.cover?.let {
|
thisBanner?.cover?.let {
|
||||||
if(it.isEmpty()) return@let
|
if(it.isEmpty()) return@let
|
||||||
//Log.d("MyHomeFVP", "Load img: $it")
|
//Log.d("MyHomeFVP", "Load img: $it")
|
||||||
@@ -246,12 +248,12 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home, true) {
|
|||||||
holder.itemView.vpt.text = thisBanner?.brief
|
holder.itemView.vpt.text = thisBanner?.brief
|
||||||
holder.itemView.vpc.setOnClickListener {
|
holder.itemView.vpc.setOnClickListener {
|
||||||
val bundle = Bundle()
|
val bundle = Bundle()
|
||||||
homeHandler.index?.results?.banners?.get(position)?.comic?.path_word?.let { it1 -> bundle.putString("path", it1) }
|
homeHandler.homeIndex?.results?.banners?.get(position)?.comic?.path_word?.let { it1 -> bundle.putString("path", it1) }
|
||||||
Navigate.safeNavigateTo(findNavController(), R.id.action_nav_home_to_nav_book, bundle)
|
Navigate.safeNavigateTo(findNavController(), R.id.action_nav_home_to_nav_book, bundle)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemCount(): Int = homeHandler.index?.results?.banners?.size?:0
|
override fun getItemCount(): Int = homeHandler.homeIndex?.results?.banners?.size?:0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,14 +44,14 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
|
|||||||
IndexStructure::class.java,
|
IndexStructure::class.java,
|
||||||
that.get()
|
that.get()
|
||||||
) {
|
) {
|
||||||
private val homeF get() = that.get()
|
private val homeFragment get() = that.get()
|
||||||
var index: IndexStructure? = null
|
var homeIndex: IndexStructure? = null
|
||||||
private var fhib: Banner? = null
|
private var fhib: Banner? = null
|
||||||
get() {
|
get() {
|
||||||
Log.d("MyHH", "Get fhib.")
|
Log.d("MyHH", "Get fhib.")
|
||||||
if (field == null) {
|
if (field == null) {
|
||||||
field = homeF?.layoutInflater?.inflate(R.layout.viewpage_banner, homeF?.fhl, false) as Banner
|
field = homeFragment?.layoutInflater?.inflate(R.layout.viewpage_banner, homeFragment?.fhl, false) as Banner
|
||||||
homeF?.homeHandler?.sendEmptyMessage(3)
|
homeFragment?.homeHandler?.sendEmptyMessage(3)
|
||||||
}
|
}
|
||||||
return field
|
return field
|
||||||
}
|
}
|
||||||
@@ -60,31 +60,31 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
|
|||||||
super.handleMessage(msg)
|
super.handleMessage(msg)
|
||||||
when (msg.what) {
|
when (msg.what) {
|
||||||
-1 -> {
|
-1 -> {
|
||||||
homeF?.apply {
|
homeFragment?.apply {
|
||||||
swiperefresh?.isRefreshing = msg.obj as Boolean
|
swiperefresh?.isRefreshing = msg.obj as Boolean
|
||||||
if(msg.obj as Boolean) showKanban() else hideKanban()
|
if(msg.obj as Boolean) showKanban() else hideKanban()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//0 -> setLayouts()
|
//0 -> setLayouts()
|
||||||
1 -> inflateCardLines()
|
1 -> inflateCardLines()
|
||||||
2 -> homeF?.swiperefresh?.let { setSwipe(it) }
|
2 -> homeFragment?.swiperefresh?.let { setSwipe(it) }
|
||||||
3 -> setBanner(fhib!!)
|
3 -> setBanner(fhib!!)
|
||||||
5 -> setBannerInfo(msg.obj as Banner)
|
5 -> setBannerInfo(msg.obj as Banner)
|
||||||
7 -> inflateBanner()
|
7 -> inflateBanner()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getGsonItem() = index
|
override fun getGsonItem() = homeIndex
|
||||||
override fun setGsonItem(gsonObj: Any) :Boolean {
|
override fun setGsonItem(gsonObj: Any) :Boolean {
|
||||||
val pass = super.setGsonItem(gsonObj)
|
val pass = super.setGsonItem(gsonObj)
|
||||||
index = gsonObj as IndexStructure
|
homeIndex = gsonObj as IndexStructure
|
||||||
var banners = arrayOf<IndexStructure.Results.Banners>()
|
var banners = arrayOf<IndexStructure.Results.Banners>()
|
||||||
index?.results?.banners?.forEach {
|
homeIndex?.results?.banners?.forEach {
|
||||||
if(it.type == 1) {
|
if(it.type == 1) {
|
||||||
banners += it
|
banners += it
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
index?.results?.banners = banners
|
homeIndex?.results?.banners = banners
|
||||||
return pass
|
return pass
|
||||||
}
|
}
|
||||||
override suspend fun onError() {
|
override suspend fun onError() {
|
||||||
@@ -93,28 +93,28 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
|
|||||||
sendEmptyMessage(2) //setSwipe
|
sendEmptyMessage(2) //setSwipe
|
||||||
obtainMessage(-1, false).sendToTarget() //closeLoad
|
obtainMessage(-1, false).sendToTarget() //closeLoad
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
Toast.makeText(homeF?.context, R.string.web_error, Toast.LENGTH_SHORT).show()
|
Toast.makeText(homeFragment?.context, R.string.web_error, Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
override suspend fun doWhenFinishDownload(): Unit = withContext(Dispatchers.IO) {
|
override suspend fun doWhenFinishDownload(): Unit = withContext(Dispatchers.IO) {
|
||||||
super.doWhenFinishDownload()
|
super.doWhenFinishDownload()
|
||||||
raw?.let {
|
raw?.let {
|
||||||
Log.d("MyHFH", "save raw: $it")
|
Log.d("MyHFH", "save raw: $it")
|
||||||
homeF?.apply { activity?.runOnUiThread {
|
homeFragment?.apply { activity?.runOnUiThread {
|
||||||
vm.saveIndexStructure(it)
|
vm.saveIndexStructure(it)
|
||||||
} }
|
} }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun inflateBanner() {
|
private fun inflateBanner() {
|
||||||
homeF?.fhl?.let { it.post {
|
homeFragment?.fhl?.let { it.post {
|
||||||
fhib = null
|
fhib = null
|
||||||
it.addView(fhib)
|
it.addView(fhib)
|
||||||
} }
|
} }
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun inflateTopics() {
|
private suspend fun inflateTopics() {
|
||||||
index?.results?.topics?.list?.let {
|
homeIndex?.results?.topics?.list?.let {
|
||||||
var comics = arrayOf<ComicStructure>()
|
var comics = arrayOf<ComicStructure>()
|
||||||
for((i, topic) in it.withIndex()){
|
for((i, topic) in it.withIndex()){
|
||||||
if(i > 2) break
|
if(i > 2) break
|
||||||
@@ -124,19 +124,19 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
|
|||||||
newComic.path_word = topic.path_word
|
newComic.path_word = topic.path_word
|
||||||
comics += newComic
|
comics += newComic
|
||||||
}
|
}
|
||||||
if(comics.size == 3) allocateLine(homeF?.getString(R.string.topics_series)?:"", R.drawable.img_hot_serial, comics, isTopic = true)
|
if(comics.size == 3) allocateLine(homeFragment?.getString(R.string.topics_series)?:"", R.drawable.img_hot_serial, comics, isTopic = true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun inflateRec() {
|
private suspend fun inflateRec() {
|
||||||
index?.results?.recComics?.list?.let {
|
homeIndex?.results?.recComics?.list?.let {
|
||||||
var comics = arrayOf<ComicStructure>()
|
var comics = arrayOf<ComicStructure>()
|
||||||
for((i, rec) in it.withIndex()){
|
for((i, rec) in it.withIndex()){
|
||||||
if(i > 2) break
|
if(i > 2) break
|
||||||
comics += rec.comic
|
comics += rec.comic
|
||||||
}
|
}
|
||||||
if(comics.size == 3) allocateLine(homeF?.getString(R.string.manga_rec)?:"", R.drawable.img_master_work, comics) {
|
if(comics.size == 3) allocateLine(homeFragment?.getString(R.string.manga_rec)?:"", R.drawable.img_master_work, comics) {
|
||||||
homeF?.findNavController()?.let { nav ->
|
homeFragment?.findNavController()?.let { nav ->
|
||||||
Navigate.safeNavigateTo(nav, R.id.action_nav_home_to_nav_recommend)
|
Navigate.safeNavigateTo(nav, R.id.action_nav_home_to_nav_recommend)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -145,74 +145,74 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
|
|||||||
|
|
||||||
private suspend fun inflateRank(){
|
private suspend fun inflateRank(){
|
||||||
var comics = arrayOf<ComicStructure>()
|
var comics = arrayOf<ComicStructure>()
|
||||||
if (index?.results?.rankDayComics == null) {
|
if (homeIndex?.results?.rankDayComics == null) {
|
||||||
// is in hotmanga
|
// is in hotmanga
|
||||||
index?.results?.rankWeeklyFreeComics?.list?.let {
|
homeIndex?.results?.rankWeeklyFreeComics?.list?.let {
|
||||||
for((i, book) in it.withIndex()){
|
for((i, book) in it.withIndex()){
|
||||||
if(i > 2) break
|
if(i > 2) break
|
||||||
comics += book.comic
|
comics += book.comic
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(comics.size == 3) allocateLine(homeF?.getString(R.string.hot_rank_list)?:"", R.drawable.img_novel_bill, comics) {
|
if(comics.size == 3) allocateLine(homeFragment?.getString(R.string.hot_rank_list)?:"", R.drawable.img_novel_bill, comics) {
|
||||||
homeF?.findNavController()?.navigate(R.id.nav_rank)
|
homeFragment?.findNavController()?.navigate(R.id.nav_rank)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
index?.results?.rankDayComics?.list?.let {
|
homeIndex?.results?.rankDayComics?.list?.let {
|
||||||
for((i, book) in it.withIndex()){
|
for((i, book) in it.withIndex()){
|
||||||
if(i > 2) break
|
if(i > 2) break
|
||||||
comics += book.comic
|
comics += book.comic
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
index?.results?.rankWeekComics?.list?.let {
|
homeIndex?.results?.rankWeekComics?.list?.let {
|
||||||
for((i, book) in it.withIndex()){
|
for((i, book) in it.withIndex()){
|
||||||
if(i > 2) break
|
if(i > 2) break
|
||||||
comics += book.comic
|
comics += book.comic
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
index?.results?.rankMonthComics?.list?.let {
|
homeIndex?.results?.rankMonthComics?.list?.let {
|
||||||
for((i, book) in it.withIndex()){
|
for((i, book) in it.withIndex()){
|
||||||
if(i > 2) break
|
if(i > 2) break
|
||||||
comics += book.comic
|
comics += book.comic
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(comics.size == 9) allocateLine(homeF?.getString(R.string.rank_list)?:"", R.drawable.img_novel_bill, comics) {
|
if(comics.size == 9) allocateLine(homeFragment?.getString(R.string.rank_list)?:"", R.drawable.img_novel_bill, comics) {
|
||||||
homeF?.findNavController()?.navigate(R.id.nav_rank)
|
homeFragment?.findNavController()?.navigate(R.id.nav_rank)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun inflateHot(){
|
private suspend fun inflateHot(){
|
||||||
if (index?.results?.hotComics == null) {
|
if (homeIndex?.results?.hotComics == null) {
|
||||||
// is in hotmanga
|
// is in hotmanga
|
||||||
index?.results?.updateWeeklyFreeComics?.let {
|
homeIndex?.results?.updateWeeklyFreeComics?.let {
|
||||||
var comics = arrayOf<ComicStructure>()
|
var comics = arrayOf<ComicStructure>()
|
||||||
for((i, rec) in it.list.withIndex()){
|
for((i, rec) in it.list.withIndex()){
|
||||||
if(i > 5) break
|
if(i > 5) break
|
||||||
comics += rec.comic
|
comics += rec.comic
|
||||||
}
|
}
|
||||||
if(comics.size == 6) allocateLine(homeF?.getString(R.string.hot_list)?:"", R.drawable.img_hot, comics)
|
if(comics.size == 6) allocateLine(homeFragment?.getString(R.string.hot_list)?:"", R.drawable.img_hot, comics)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
index?.results?.hotComics?.let {
|
homeIndex?.results?.hotComics?.let {
|
||||||
var comics = arrayOf<ComicStructure>()
|
var comics = arrayOf<ComicStructure>()
|
||||||
for((i, rec) in it.withIndex()){
|
for((i, rec) in it.withIndex()){
|
||||||
if(i > 8) break
|
if(i > 8) break
|
||||||
comics += rec.comic
|
comics += rec.comic
|
||||||
}
|
}
|
||||||
if(comics.size == 9) allocateLine(homeF?.getString(R.string.hot_list)?:"", R.drawable.img_hot, comics)
|
if(comics.size == 9) allocateLine(homeFragment?.getString(R.string.hot_list)?:"", R.drawable.img_hot, comics)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun inflateNew(){
|
private suspend fun inflateNew(){
|
||||||
index?.results?.newComics?.let {
|
homeIndex?.results?.newComics?.let {
|
||||||
var comics = arrayOf<ComicStructure>()
|
var comics = arrayOf<ComicStructure>()
|
||||||
for((i, rec) in it.withIndex()){
|
for((i, rec) in it.withIndex()){
|
||||||
if(i > 8) break
|
if(i > 8) break
|
||||||
comics += rec.comic
|
comics += rec.comic
|
||||||
}
|
}
|
||||||
if(comics.size == 9) allocateLine(homeF?.getString(R.string.new_list)?:"", R.drawable.img_latest_pub, comics) {
|
if(comics.size == 9) allocateLine(homeFragment?.getString(R.string.new_list)?:"", R.drawable.img_latest_pub, comics) {
|
||||||
homeF?.findNavController()?.let { nav ->
|
homeFragment?.findNavController()?.let { nav ->
|
||||||
Navigate.safeNavigateTo(nav, R.id.action_nav_home_to_nav_newest)
|
Navigate.safeNavigateTo(nav, R.id.action_nav_home_to_nav_newest)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -220,14 +220,14 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
|
|||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun inflateFinish(){
|
private suspend fun inflateFinish(){
|
||||||
index?.results?.finishComics?.list?.let {
|
homeIndex?.results?.finishComics?.list?.let {
|
||||||
var comics = arrayOf<ComicStructure>()
|
var comics = arrayOf<ComicStructure>()
|
||||||
for((i, rec) in it.withIndex()){
|
for((i, rec) in it.withIndex()){
|
||||||
if(i > 5) break
|
if(i > 5) break
|
||||||
comics += rec
|
comics += rec
|
||||||
}
|
}
|
||||||
if(comics.size == 6) allocateLine(homeF?.getString(R.string.complete)?:"", R.drawable.img_novel_eye, comics, true) {
|
if(comics.size == 6) allocateLine(homeFragment?.getString(R.string.complete)?:"", R.drawable.img_novel_eye, comics, true) {
|
||||||
homeF?.findNavController()?.let { nav ->
|
homeFragment?.findNavController()?.let { nav ->
|
||||||
Navigate.safeNavigateTo(nav, R.id.action_nav_home_to_nav_finish)
|
Navigate.safeNavigateTo(nav, R.id.action_nav_home_to_nav_finish)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -235,7 +235,7 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun inflateCardLines() {
|
private fun inflateCardLines() {
|
||||||
homeF?.lifecycleScope?.launch {
|
homeFragment?.lifecycleScope?.launch {
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
inflateRec()
|
inflateRec()
|
||||||
inflateTopics()
|
inflateTopics()
|
||||||
@@ -263,42 +263,42 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun setBannerInfo(v: Banner){
|
private fun setBannerInfo(v: Banner){
|
||||||
homeF?.context?.let { UITools(it) }?.let {
|
homeFragment?.context?.let { UITools(it) }?.let {
|
||||||
v
|
v
|
||||||
.addPageTransformer(ScaleInTransformer())
|
.addPageTransformer(ScaleInTransformer())
|
||||||
.setPageMargin(it.dp2px(20) ?: 0, it.dp2px(10) ?: 0)
|
.setPageMargin(it.dp2px(20) ?: 0, it.dp2px(10) ?: 0)
|
||||||
.setIndicator(
|
.setIndicator(
|
||||||
IndicatorView(homeF!!.context)
|
IndicatorView(homeFragment!!.context)
|
||||||
.setIndicatorColor(Color.DKGRAY)
|
.setIndicatorColor(Color.DKGRAY)
|
||||||
.setIndicatorSelectorColor(Color.WHITE)
|
.setIndicatorSelectorColor(Color.WHITE)
|
||||||
.setIndicatorStyle(IndicatorView.IndicatorStyle.INDICATOR_BEZIER)
|
.setIndicatorStyle(IndicatorView.IndicatorStyle.INDICATOR_BEZIER)
|
||||||
).adapter = homeF?.ViewData(v)?.RecyclerViewAdapter()
|
).adapter = homeFragment?.ViewData(v)?.RecyclerViewAdapter()
|
||||||
}
|
}
|
||||||
v.invalidate()
|
v.invalidate()
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("NotifyDataSetChanged")
|
@SuppressLint("NotifyDataSetChanged")
|
||||||
private fun setSwipe(sw: SwipeRefreshLayout) {
|
private fun setSwipe(sw: SwipeRefreshLayout) {
|
||||||
homeF?.fhov?.swipeRefreshLayout = sw
|
homeFragment?.fhov?.swipeRefreshLayout = sw
|
||||||
sw.setOnRefreshListener {
|
sw.setOnRefreshListener {
|
||||||
Log.d("MyHFH", "Refresh items.")
|
Log.d("MyHFH", "Refresh items.")
|
||||||
homeF?.lifecycleScope?.launch {
|
homeFragment?.lifecycleScope?.launch {
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
homeF?.showKanban()
|
homeFragment?.showKanban()
|
||||||
fhib?.let {
|
fhib?.let {
|
||||||
it.isAutoPlay = false
|
it.isAutoPlay = false
|
||||||
index = null
|
homeIndex = null
|
||||||
it.adapter?.notifyDataSetChanged()
|
it.adapter?.notifyDataSetChanged()
|
||||||
}
|
}
|
||||||
fhib = null
|
fhib = null
|
||||||
delay(300)
|
delay(300)
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
homeF?.fhl?.let {
|
homeFragment?.fhl?.let {
|
||||||
val oa = ObjectAnimator.ofFloat(it, "alpha", 1f, 0f).setDuration(233)
|
val oa = ObjectAnimator.ofFloat(it, "alpha", 1f, 0f).setDuration(233)
|
||||||
oa.doOnEnd { _ ->
|
oa.doOnEnd { _ ->
|
||||||
it.removeAllViews()
|
it.removeAllViews()
|
||||||
it.alpha = 1f
|
it.alpha = 1f
|
||||||
homeF?.vm?.saveIndexStructure(null) // reload
|
homeFragment?.vm?.saveIndexStructure(null) // reload
|
||||||
}
|
}
|
||||||
oa.start()
|
oa.start()
|
||||||
}
|
}
|
||||||
@@ -313,7 +313,7 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
|
|||||||
finish: Boolean = false, isTopic: Boolean = false, onClick: (() -> Unit)? = null
|
finish: Boolean = false, isTopic: Boolean = false, onClick: (() -> Unit)? = null
|
||||||
): Unit = withContext(Dispatchers.IO) {
|
): Unit = withContext(Dispatchers.IO) {
|
||||||
val c = comics.size / 3
|
val c = comics.size / 3
|
||||||
homeF?.layoutInflater?.inflate(
|
homeFragment?.layoutInflater?.inflate(
|
||||||
when(c){
|
when(c){
|
||||||
1 -> R.layout.line_1bookline
|
1 -> R.layout.line_1bookline
|
||||||
2 -> R.layout.line_2bookline
|
2 -> R.layout.line_2bookline
|
||||||
@@ -329,7 +329,7 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
|
|||||||
if(onClick != null) setOnClickListener { onClick() }
|
if(onClick != null) setOnClickListener { onClick() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
homeF?.fhl?.let { it.post { it.addView(this) } }
|
homeFragment?.fhl?.let { it.post { it.addView(this) } }
|
||||||
}
|
}
|
||||||
return@withContext
|
return@withContext
|
||||||
}
|
}
|
||||||
@@ -354,7 +354,7 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
|
|||||||
|
|
||||||
private fun setCards(cv: CardView, pw: String, name: String, img: String, isFinal: Boolean, isTopic: Boolean) {
|
private fun setCards(cv: CardView, pw: String, name: String, img: String, isFinal: Boolean, isTopic: Boolean) {
|
||||||
cv.tic.apply { post { text = name } }
|
cv.tic.apply { post { text = name } }
|
||||||
homeF?.let {
|
homeFragment?.let {
|
||||||
if(img.startsWith("http")) {
|
if(img.startsWith("http")) {
|
||||||
//Log.d("MyHH", "load card image: $img")
|
//Log.d("MyHH", "load card image: $img")
|
||||||
val waitMillis = cardLoadingWaits.getAndIncrement().toLong()*200
|
val waitMillis = cardLoadingWaits.getAndIncrement().toLong()*200
|
||||||
@@ -372,7 +372,7 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
|
|||||||
cv.setOnClickListener {
|
cv.setOnClickListener {
|
||||||
val bundle = Bundle()
|
val bundle = Bundle()
|
||||||
bundle.putString("path", pw)
|
bundle.putString("path", pw)
|
||||||
homeF?.findNavController()?.let { nav ->
|
homeFragment?.findNavController()?.let { nav ->
|
||||||
Navigate.safeNavigateTo(nav, if(isTopic) R.id.action_nav_home_to_nav_topic else R.id.action_nav_home_to_nav_book, bundle)
|
Navigate.safeNavigateTo(nav, if(isTopic) R.id.action_nav_home_to_nav_topic else R.id.action_nav_home_to_nav_book, bundle)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -383,7 +383,7 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
|
|||||||
v.viewTreeObserver.addOnGlobalLayoutListener(object :
|
v.viewTreeObserver.addOnGlobalLayoutListener(object :
|
||||||
ViewTreeObserver.OnGlobalLayoutListener {
|
ViewTreeObserver.OnGlobalLayoutListener {
|
||||||
override fun onGlobalLayout() {
|
override fun onGlobalLayout() {
|
||||||
homeF?.context?.let { UITools(it) }?.let {
|
homeFragment?.context?.let { UITools(it) }?.let {
|
||||||
val spaceTitle = it.dp2px(49)!!
|
val spaceTitle = it.dp2px(49)!!
|
||||||
val cardSpace = it.dp2px(16)!!
|
val cardSpace = it.dp2px(16)!!
|
||||||
v.layoutParams.height =
|
v.layoutParams.height =
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ import kotlinx.coroutines.delay
|
|||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import top.fumiama.copymanga.api.Config
|
import top.fumiama.copymanga.api.Config
|
||||||
import top.fumiama.copymanga.view.template.TitleActivityTemplate
|
import top.fumiama.copymanga.view.template.activity.TitleActivityTemplate
|
||||||
import top.fumiama.copymanga.net.template.PausableDownloader
|
import top.fumiama.copymanga.net.template.PausableDownloader
|
||||||
import top.fumiama.copymanga.net.DownloadTools
|
import top.fumiama.copymanga.net.DownloadTools
|
||||||
import top.fumiama.copymanga.view.interaction.TimeThread
|
import top.fumiama.copymanga.view.interaction.TimeThread
|
||||||
@@ -339,14 +339,15 @@ class ViewMangaActivity : TitleActivityTemplate() {
|
|||||||
suspend fun countZipEntries(doWhenFinish : suspend (count: Int) -> Unit) = withContext(Dispatchers.IO) {
|
suspend fun countZipEntries(doWhenFinish : suspend (count: Int) -> Unit) = withContext(Dispatchers.IO) {
|
||||||
if (zipFile != null) try {
|
if (zipFile != null) try {
|
||||||
Log.d("MyVM", "zip: $zipFile")
|
Log.d("MyVM", "zip: $zipFile")
|
||||||
val zip = ZipFile(zipFile)
|
ZipFile(zipFile).use { zip ->
|
||||||
count = zip.size()
|
count = zip.size()
|
||||||
if(cut) zip.entries().toList().sortedBy{ it.name.substringBefore('.').toInt()}.forEachIndexed { i, it ->
|
if(cut) zip.entries().toList().sortedBy{ it.name.substringBefore('.').toInt()}.forEachIndexed { i, it ->
|
||||||
val useCut = canCut(zip.getInputStream(it))
|
val useCut = canCut(zip.getInputStream(it))
|
||||||
isCut += useCut
|
isCut += useCut
|
||||||
indexMap += i + 1
|
indexMap += i + 1
|
||||||
if (useCut) indexMap += -(i + 1)
|
if (useCut) indexMap += -(i + 1)
|
||||||
Log.d("MyVM", "[$i] 分析: ${it.name}, cut: $useCut")
|
Log.d("MyVM", "[$i] 分析: ${it.name}, cut: $useCut")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
toolsBox.toastErrorAndFinish(R.string.count_zip_entries_error)
|
toolsBox.toastErrorAndFinish(R.string.count_zip_entries_error)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package top.fumiama.copymanga.view.template
|
package top.fumiama.copymanga.view.template.activity
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package top.fumiama.copymanga.view.template
|
package top.fumiama.copymanga.view.template.activity
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import kotlinx.android.synthetic.main.widget_titlebar.*
|
import kotlinx.android.synthetic.main.widget_titlebar.*
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package top.fumiama.copymanga.view.template
|
package top.fumiama.copymanga.view.template.cardflow
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
@@ -22,6 +22,8 @@ import top.fumiama.copymanga.json.TypeBookListStructure
|
|||||||
import top.fumiama.copymanga.net.template.PausableDownloader
|
import top.fumiama.copymanga.net.template.PausableDownloader
|
||||||
import top.fumiama.copymanga.strings.Chinese
|
import top.fumiama.copymanga.strings.Chinese
|
||||||
import top.fumiama.copymanga.view.interaction.Navigate
|
import top.fumiama.copymanga.view.interaction.Navigate
|
||||||
|
import top.fumiama.copymanga.view.template.fragment.MangaPagesFragmentTemplate
|
||||||
|
import top.fumiama.copymanga.view.template.component.CardList
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.dmzj.copymanga.R
|
||||||
import java.lang.ref.WeakReference
|
import java.lang.ref.WeakReference
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package top.fumiama.copymanga.view.template
|
package top.fumiama.copymanga.view.template.cardflow
|
||||||
|
|
||||||
import android.animation.ObjectAnimator
|
import android.animation.ObjectAnimator
|
||||||
import android.view.View
|
import android.view.View
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package top.fumiama.copymanga.view.template
|
package top.fumiama.copymanga.view.template.cardflow
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package top.fumiama.copymanga.view.template
|
package top.fumiama.copymanga.view.template.component
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
@@ -1,10 +1,7 @@
|
|||||||
package top.fumiama.copymanga.view.template
|
package top.fumiama.copymanga.view.template.fragment
|
||||||
|
|
||||||
import android.animation.ObjectAnimator
|
import android.animation.ObjectAnimator
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Context
|
|
||||||
import android.net.ConnectivityManager
|
|
||||||
import android.net.NetworkCapabilities
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.View
|
import android.view.View
|
||||||
@@ -19,52 +16,32 @@ import kotlinx.coroutines.Dispatchers
|
|||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
import top.fumiama.copymanga.MainActivity
|
||||||
import top.fumiama.copymanga.view.interaction.UITools
|
import top.fumiama.copymanga.view.interaction.UITools
|
||||||
import top.fumiama.dmzj.copymanga.R
|
import top.fumiama.copymanga.view.template.component.CardList
|
||||||
import java.lang.ref.WeakReference
|
import java.lang.ref.WeakReference
|
||||||
|
|
||||||
open class MangaPagesFragmentTemplate(inflateRes:Int, private val isLazy: Boolean = true, val forceLoad: Boolean = false) : NoBackRefreshFragment(inflateRes) {
|
open class MangaPagesFragmentTemplate(
|
||||||
|
inflateRes:Int, private val isLazy: Boolean = true,
|
||||||
|
val forceLoad: Boolean = false
|
||||||
|
) : NoBackRefreshFragment(inflateRes) {
|
||||||
var cardPerRow = 3
|
var cardPerRow = 3
|
||||||
var cardWidth = 0
|
var cardWidth = 0
|
||||||
var cardHeight = 0
|
var cardHeight = 0
|
||||||
var cardList: CardList? = null
|
var cardList: CardList? = null
|
||||||
//var row: View? = null
|
|
||||||
var isEnd = false
|
var isEnd = false
|
||||||
//var jsonReaderNow: JsonReader? = null
|
|
||||||
var page = 0
|
var page = 0
|
||||||
|
|
||||||
var isRefresh = false
|
var isRefresh = false
|
||||||
|
|
||||||
private val transportStringNull = context?.getString(R.string.TRANSPORT_NULL) ?: "TRANSPORT_NULL"
|
|
||||||
private val transportStringError = context?.getString(R.string.TRANSPORT_ERROR) ?: "TRANSPORT_ERROR"
|
|
||||||
private val netInfo: String
|
|
||||||
get() {
|
|
||||||
val cm: ConnectivityManager =
|
|
||||||
context?.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
|
|
||||||
return cm.getNetworkCapabilities(cm.activeNetwork)?.let {
|
|
||||||
when {
|
|
||||||
it.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> return@let context?.getString(
|
|
||||||
R.string.TRANSPORT_WIFI)
|
|
||||||
it.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> return@let context?.getString(
|
|
||||||
R.string.TRANSPORT_CELLULAR)
|
|
||||||
it.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) -> return@let context?.getString(
|
|
||||||
R.string.TRANSPORT_BLUETOOTH)
|
|
||||||
it.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> return@let context?.getString(
|
|
||||||
R.string.TRANSPORT_ETHERNET)
|
|
||||||
it.hasTransport(NetworkCapabilities.TRANSPORT_LOWPAN) -> return@let context?.getString(
|
|
||||||
R.string.TRANSPORT_LOWPAN)
|
|
||||||
it.hasTransport(NetworkCapabilities.TRANSPORT_VPN) -> return@let "VPN"
|
|
||||||
else -> return@let transportStringNull
|
|
||||||
}
|
|
||||||
} ?: transportStringError
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("ClickableViewAccessibility")
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
if(isFirstInflate) {
|
if(isFirstInflate) {
|
||||||
if (!forceLoad && (netInfo == transportStringNull || netInfo == transportStringError)) {
|
val tb = (activity as MainActivity).toolsBox
|
||||||
|
val netInfo = tb.netInfo
|
||||||
|
if (!forceLoad && (netInfo == tb.transportStringNull || netInfo == tb.transportStringError)) {
|
||||||
findNavController().popBackStack()
|
findNavController().popBackStack()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -81,8 +58,6 @@ open class MangaPagesFragmentTemplate(inflateRes:Int, private val isLazy: Boolea
|
|||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
cardList?.exitCardList = true
|
cardList?.exitCardList = true
|
||||||
//row = null
|
|
||||||
//jsonReaderNow = null
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun setLayouts() = withContext(Dispatchers.IO) {
|
private suspend fun setLayouts() = withContext(Dispatchers.IO) {
|
||||||
@@ -100,39 +75,33 @@ open class MangaPagesFragmentTemplate(inflateRes:Int, private val isLazy: Boolea
|
|||||||
Log.d("MyMPAT", "Card per row: $cardPerRow")
|
Log.d("MyMPAT", "Card per row: $cardPerRow")
|
||||||
Log.d("MyMPAT", "Card width: $cardWidth")
|
Log.d("MyMPAT", "Card width: $cardWidth")
|
||||||
initCardList(WeakReference(this@MangaPagesFragmentTemplate))
|
initCardList(WeakReference(this@MangaPagesFragmentTemplate))
|
||||||
managePage()
|
|
||||||
|
addPage()
|
||||||
|
if (isLazy) { mysp.apply { post {
|
||||||
|
setListener(object : SpringView.OnFreshListener {
|
||||||
|
override fun onLoadmore() {
|
||||||
|
lifecycleScope.launch {
|
||||||
|
addPage()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
override fun onRefresh() {
|
||||||
|
lifecycleScope.launch {
|
||||||
|
withContext(Dispatchers.IO) {
|
||||||
|
showKanban()
|
||||||
|
reset()
|
||||||
|
delay(600)
|
||||||
|
addPage()
|
||||||
|
hideKanban()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} } }
|
||||||
|
|
||||||
setListeners()
|
setListeners()
|
||||||
hideKanban()
|
hideKanban()
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun managePage() {
|
|
||||||
addPage()
|
|
||||||
if (isLazy) {
|
|
||||||
mysp.apply {
|
|
||||||
post {
|
|
||||||
setListener(object : SpringView.OnFreshListener {
|
|
||||||
override fun onLoadmore() {
|
|
||||||
lifecycleScope.launch {
|
|
||||||
addPage()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
override fun onRefresh() {
|
|
||||||
lifecycleScope.launch {
|
|
||||||
withContext(Dispatchers.IO) {
|
|
||||||
showKanban()
|
|
||||||
reset()
|
|
||||||
delay(600)
|
|
||||||
addPage()
|
|
||||||
hideKanban()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
open suspend fun addPage() {}
|
open suspend fun addPage() {}
|
||||||
|
|
||||||
open suspend fun onLoadFinish() = withContext(Dispatchers.Main) {
|
open suspend fun onLoadFinish() = withContext(Dispatchers.Main) {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package top.fumiama.copymanga.view.template
|
package top.fumiama.copymanga.view.template.fragment
|
||||||
|
|
||||||
import android.animation.ObjectAnimator
|
import android.animation.ObjectAnimator
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
@@ -1,14 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!DOCTYPE resources [
|
<!DOCTYPE resources [
|
||||||
<!ENTITY hosturl "api.copy-manga.com">
|
<!ENTITY hosturl "api.2024manga.com">
|
||||||
<!ENTITY appver "2.3.0">
|
<!ENTITY appver "2024.4.28">
|
||||||
<!ENTITY proxyurl "copymanga.azurewebsites.net">
|
<!ENTITY proxyurl "copymanga.azurewebsites.net">
|
||||||
<!ENTITY platform "3">
|
<!ENTITY platform "3">
|
||||||
<!ENTITY source "copyApp">
|
<!ENTITY source "com.manga2020.app">
|
||||||
]>
|
]>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">拷贝漫画</string>
|
<string name="app_name">拷贝漫画</string>
|
||||||
<string name="source">&source;</string>
|
|
||||||
|
|
||||||
<string name="action_settings">设定</string>
|
<string name="action_settings">设定</string>
|
||||||
<string name="action_info">关于</string>
|
<string name="action_info">关于</string>
|
||||||
@@ -67,12 +66,12 @@
|
|||||||
<string name="analyze_img_size_error">读取图片大小失败</string>
|
<string name="analyze_img_size_error">读取图片大小失败</string>
|
||||||
|
|
||||||
<string name="networkApiUrl">/api/v3/system/network2?platform=%1$s</string>
|
<string name="networkApiUrl">/api/v3/system/network2?platform=%1$s</string>
|
||||||
<string name="mainPageApiUrl">/api/v3/h5/homeIndex2?platform=%1$s</string>
|
<string name="mainPageApiUrl">/api/v3/h5/homeIndex?platform=%1$s</string>
|
||||||
<string name="hostUrl">&hosturl;</string>
|
<string name="hostUrl">&hosturl;</string>
|
||||||
<string name="proxyUrl">&proxyurl;</string>
|
<string name="proxyUrl">&proxyurl;</string>
|
||||||
<string name="rankApiUrl">/api/v3/ranks?limit=21&offset=%1$d&date_type=%2$s&audience_type=%3$s&platform=%4$s</string>
|
<string name="rankApiUrl">/api/v3/ranks?limit=21&offset=%1$d&date_type=%2$s&audience_type=%3$s&platform=%4$s</string>
|
||||||
<string name="searchApiUrl">/api/v3/search/comic?limit=21&offset=%1$d&q=%2$s&q_type=%3$s&platform=%4$s</string>
|
<string name="searchApiUrl">/api/v3/search/comic?limit=21&offset=%1$d&q=%2$s&q_type=%3$s&platform=%4$s</string>
|
||||||
<string name="filterApiUrl">/api/v3/h5/filter/comic/tags?platform=%1$s</string>
|
<string name="filterApiUrl">/api/v3/h5/filterIndex/comic/tags?type=1&platform=%1$s</string>
|
||||||
<string name="sortApiUrl">/api/v3/comics?limit=21&offset=%1$d&ordering=%2$s&theme=%3$s&top=%4$s&platform=%5$s</string>
|
<string name="sortApiUrl">/api/v3/comics?limit=21&offset=%1$d&ordering=%2$s&theme=%3$s&top=%4$s&platform=%5$s</string>
|
||||||
<string name="bookInfoApiUrl">/api/v3/comic2/%1$s?platform=%2$s</string>
|
<string name="bookInfoApiUrl">/api/v3/comic2/%1$s?platform=%2$s</string>
|
||||||
<string name="bookUserQueryApiUrl">/api/v3/comic2/%1$s/query?platform=%2$s</string>
|
<string name="bookUserQueryApiUrl">/api/v3/comic2/%1$s/query?platform=%2$s</string>
|
||||||
@@ -114,10 +113,10 @@
|
|||||||
<string name="TRANSPORT_NULL">无网络</string>
|
<string name="TRANSPORT_NULL">无网络</string>
|
||||||
<string name="TRANSPORT_ERROR">网络错误</string>
|
<string name="TRANSPORT_ERROR">网络错误</string>
|
||||||
|
|
||||||
<string name="pc_ua">COPY/%1$s</string>
|
<string name="pc_ua">Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Mobile Safari/537.36 Edg/141.0.0.0</string>
|
||||||
<string name="default_ua">__default_ua__</string>
|
<string name="default_ua">__default_ua__</string>
|
||||||
<string name="app_ver">&appver;</string>
|
<string name="version">&appver;</string>
|
||||||
<string name="referer">com.copymanga.app-%1$s</string>
|
<string name="requested">&source;</string>
|
||||||
<string name="platform">&platform;</string>
|
<string name="platform">&platform;</string>
|
||||||
|
|
||||||
<string name="menu_update_time">更新时间</string>
|
<string name="menu_update_time">更新时间</string>
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
<EditTextPreference
|
<EditTextPreference
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:defaultValue="@string/app_ver"
|
android:defaultValue="@string/version"
|
||||||
android:selectAllOnFocus="false"
|
android:selectAllOnFocus="false"
|
||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
android:title="@string/settings_cat_general_et_title_app_version"
|
android:title="@string/settings_cat_general_et_title_app_version"
|
||||||
|
|||||||
Reference in New Issue
Block a user