1
0
mirror of https://github.com/fumiama/copymanga.git synced 2026-06-28 14:50:29 +08:00

v2.0.beta18

新增
1. 自定义API地址
2. 图片代理
修复
1. 文本编辑框不跟随输入法上移
2. 获取图书信息失败(#26)
This commit is contained in:
源文雨
2023-09-05 00:37:53 +08:00
parent 306e69ff3a
commit 49b3f7a1c7
32 changed files with 233 additions and 116 deletions

1
.idea/gradle.xml generated
View File

@@ -14,6 +14,7 @@
<option value="$PROJECT_DIR$/app" /> <option value="$PROJECT_DIR$/app" />
</set> </set>
</option> </option>
<option name="resolveExternalAnnotations" value="false" />
</GradleProjectSettings> </GradleProjectSettings>
</option> </option>
</component> </component>

1
.idea/misc.xml generated
View File

@@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="DesignSurface"> <component name="DesignSurface">
<option name="filePathToZoomLevelMap"> <option name="filePathToZoomLevelMap">

View File

@@ -9,8 +9,8 @@ android {
applicationId 'top.fumiama.copymanga' applicationId 'top.fumiama.copymanga'
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 33 targetSdkVersion 33
versionCode 29 versionCode 30
versionName '2.0.beta17' versionName '2.0.beta18'
resConfigs 'zh', 'zh-rCN' resConfigs 'zh', 'zh-rCN'
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -25,7 +25,7 @@
<activity <activity
android:name="top.fumiama.copymanga.MainActivity" android:name="top.fumiama.copymanga.MainActivity"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar" android:theme="@style/AppTheme.Default"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@@ -43,7 +43,7 @@
android:theme="@style/Theme.AppCompat.Light.NoActionBar"/> android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>
<activity <activity
android:name="top.fumiama.copymanga.ui.vm.ViewMangaActivity" android:name="top.fumiama.copymanga.ui.vm.ViewMangaActivity"
android:theme="@style/AppTheme.NoActionBar"/> android:theme="@style/AppTheme.Default"/>
</application> </application>
</manifest> </manifest>

View File

@@ -33,7 +33,7 @@ class LoginActivity:Activity() {
putString("username", it.results?.username) putString("username", it.results?.username)
putString("nickname", it.results?.nickname) putString("nickname", it.results?.nickname)
apply() apply()
DownloadTools.getHttpContent(getString(R.string.memberInfoApiUrl))?.decodeToString()?.let { DownloadTools.getHttpContent(getString(R.string.memberInfoApiUrl).format(CMApi.myHostApiUrl))?.decodeToString()?.let {
val l = Gson().fromJson(it, LoginInfoStructure::class.java) val l = Gson().fromJson(it, LoginInfoStructure::class.java)
if(l.code == 200) { if(l.code == 200) {
putString("avatar", l.results.avatar) putString("avatar", l.results.avatar)

View File

@@ -58,10 +58,13 @@ class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
mainWeakReference = WeakReference(this)
setContentView(R.layout.activity_main) setContentView(R.layout.activity_main)
setSupportActionBar(toolbar) setSupportActionBar(toolbar)
//translucentStatusBar() //translucentStatusBar()
coordiv.layoutParams.height = getStatusBarHeight() //coordiv.layoutParams.height = getStatusBarHeight()
navController = findNavController(R.id.nav_host_fragment) navController = findNavController(R.id.nav_host_fragment)
appBarConfiguration = AppBarConfiguration( appBarConfiguration = AppBarConfiguration(
@@ -79,7 +82,6 @@ class MainActivity : AppCompatActivity() {
nav_view.setupWithNavController(navController!!) nav_view.setupWithNavController(navController!!)
headPic = File(getExternalFilesDir(""), "headPic") headPic = File(getExternalFilesDir(""), "headPic")
mainWeakReference = WeakReference(this)
drawer_layout.addDrawerListener(object : DrawerLayout.DrawerListener { drawer_layout.addDrawerListener(object : DrawerLayout.DrawerListener {
override fun onDrawerClosed(drawerView: View) { override fun onDrawerClosed(drawerView: View) {
Log.d("MyMain", "onDrawerClosed") Log.d("MyMain", "onDrawerClosed")
@@ -290,14 +292,14 @@ class MainActivity : AppCompatActivity() {
coordiv.layoutParams.height = getStatusBarHeight() coordiv.layoutParams.height = getStatusBarHeight()
}*/ }*/
private fun getStatusBarHeight() = /*private fun getStatusBarHeight() =
resources.getDimensionPixelOffset( resources.getDimensionPixelOffset(
resources.getIdentifier( resources.getIdentifier(
"status_bar_height", "status_bar_height",
"dimen", "dimen",
"android" "android"
) )
) )*/
private fun checkUpdate(ignoreSkip: Boolean) { private fun checkUpdate(ignoreSkip: Boolean) {
Thread{ Thread{

View File

@@ -2,6 +2,7 @@ package top.fumiama.copymanga.template.http
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.http.DownloadTools import top.fumiama.copymanga.tools.http.DownloadTools
class AutoDownloadThread(private val url: String, private val whenFinish: (result: ByteArray?)->Unit): Thread() { class AutoDownloadThread(private val url: String, private val whenFinish: (result: ByteArray?)->Unit): Thread() {
@@ -12,7 +13,7 @@ class AutoDownloadThread(private val url: String, private val whenFinish: (resul
var c = 0 var c = 0
while (!exit && re == null && c++ < 3){ while (!exit && re == null && c++ < 3){
re = DownloadTools.getHttpContent(url, re = DownloadTools.getHttpContent(url,
mainWeakReference?.get()?.getString(R.string.referUrl)!!, mainWeakReference?.get()?.getString(R.string.referUrl)!!.format(CMApi.myHostApiUrl),
mainWeakReference?.get()?.getString(R.string.pc_ua)!! mainWeakReference?.get()?.getString(R.string.pc_ua)!!
) )
} }

View File

@@ -94,7 +94,10 @@ class CardList(
it.tic.text = name it.tic.text = name
if(!file.exists()){ if(!file.exists()){
that?.context?.let { context -> that?.context?.let { context ->
if(!exitCardList) Glide.with(context).load(GlideUrl(head, CMApi.myGlideHeaders)).into(it.imic) if(!exitCardList && head != null)
Glide.with(context).load(
GlideUrl(CMApi.proxy?.wrap(head)?:head, CMApi.myGlideHeaders)
).into(it.imic)
} }
}else { }else {
val img = File(file, "head.jpg") val img = File(file, "head.jpg")

View File

@@ -6,6 +6,7 @@ import kotlinx.android.synthetic.main.anchor_popular.view.*
import kotlinx.android.synthetic.main.line_finish.* import kotlinx.android.synthetic.main.line_finish.*
import kotlinx.android.synthetic.main.line_lazybooklines.* import kotlinx.android.synthetic.main.line_lazybooklines.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
@ExperimentalStdlibApi @ExperimentalStdlibApi
@@ -14,13 +15,11 @@ open class StatusCardFlow(private val api: Int, nav: Int) : InfoCardLoader(R.lay
var sortValue = 0 var sortValue = 0
override fun getApiUrl() = override fun getApiUrl() =
getString(api).let { getString(api).format(
String.format( CMApi.myHostApiUrl,
it, page * 21,
page * 21, sortWay[sortValue]
sortWay[sortValue] )
)
}
override fun setListeners() { override fun setListeners() {
super.setListeners() super.setListeners()

View File

@@ -3,19 +3,18 @@ package top.fumiama.copymanga.template.ui
import android.os.Bundle import android.os.Bundle
import kotlinx.android.synthetic.main.app_bar_main.* import kotlinx.android.synthetic.main.app_bar_main.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.tools.api.CMApi
@ExperimentalStdlibApi @ExperimentalStdlibApi
open class ThemeCardFlow(private val api: Int, nav: Int) : StatusCardFlow(0, nav) { open class ThemeCardFlow(private val api: Int, nav: Int) : StatusCardFlow(0, nav) {
private var theme = "" private var theme = ""
override fun getApiUrl() = override fun getApiUrl() =
getString(api).let { getString(api).format(
String.format( CMApi.myHostApiUrl,
it, page * 21,
page * 21, sortWay[sortValue],
sortWay[sortValue], theme
theme )
)
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)

View File

@@ -1,16 +1,17 @@
package top.fumiama.copymanga.tools.api package top.fumiama.copymanga.tools.api
import android.content.Context
import android.util.Base64 import android.util.Base64
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.bumptech.glide.load.model.LazyHeaders import com.bumptech.glide.load.model.LazyHeaders
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.MainActivity import top.fumiama.copymanga.MainActivity
import top.fumiama.copymanga.tools.http.DownloadTools import top.fumiama.copymanga.tools.http.DownloadTools
import top.fumiama.copymanga.tools.http.Proxy
import java.io.File import java.io.File
import java.net.URLEncoder import java.net.URLEncoder
object CMApi { object CMApi {
var proxy = if(Proxy.useProxy) Proxy() else null
var myGlideHeaders: LazyHeaders? = null var myGlideHeaders: LazyHeaders? = null
get() { get() {
MainActivity.mainWeakReference?.get()?.let { MainActivity.mainWeakReference?.get()?.let {
@@ -28,10 +29,30 @@ object CMApi {
} }
return field return field
} }
var myHostApiUrl: String = ""
get() {
if(field != "") return field
MainActivity.mainWeakReference?.get()?.let {
PreferenceManager.getDefaultSharedPreferences(it).apply {
getString("settings_cat_net_et_api_url", "")?.let { host ->
if(host != "") {
field = host
return host
}
}
}
field = it.getString(R.string.hostUrl)
}
return field
}
fun getZipFile(exDir: File?, manga: String, caption: CharSequence, name: CharSequence) = File(exDir, "$manga/$caption/$name.zip") fun getZipFile(exDir: File?, manga: String, caption: CharSequence, name: CharSequence) = File(exDir, "$manga/$caption/$name.zip")
fun getApiUrl(id: Int, arg1: String?, arg2: String?) = MainActivity.mainWeakReference?.get()?.getString(id)?.let { String.format(it, arg1, arg2) } fun getChapterInfoApiUrl(arg1: String?, arg2: String?) =
fun getApiUrl(id: Int, arg1: String?, arg2: String?, arg3: Int? = 0) = MainActivity.mainWeakReference?.get()?.getString(id)?.let { String.format(it, arg1, arg2, arg3) } MainActivity.mainWeakReference?.get()?.getString(R.string.chapterInfoApiUrl)?.format(myHostApiUrl, arg1, arg2)
fun getLoginConnection(username: String, pwd: String, salt: Int) = MainActivity.mainWeakReference?.get()?.getString(R.string.loginApiUrl)?.let { fun getGroupInfoApiUrl(arg1: String?, arg2: String?, arg3: Int? = 0) =
MainActivity.mainWeakReference?.get()?.getString(R.string.groupInfoApiUrl)?.format(myHostApiUrl, arg1, arg2, arg3)
fun getLoginConnection(username: String, pwd: String, salt: Int) =
MainActivity.mainWeakReference?.get()?.getString(R.string.loginApiUrl)?.format(myHostApiUrl)?.let {
DownloadTools.getConnection(it, "POST")?.apply { DownloadTools.getConnection(it, "POST")?.apply {
MainActivity.mainWeakReference?.get()?.let { MainActivity.mainWeakReference?.get()?.let {
PreferenceManager.getDefaultSharedPreferences(it).apply { PreferenceManager.getDefaultSharedPreferences(it).apply {

View File

@@ -1,6 +1,7 @@
package top.fumiama.copymanga.tools.http package top.fumiama.copymanga.tools.http
import android.util.Log import android.util.Log
import top.fumiama.copymanga.tools.api.CMApi
import java.io.File import java.io.File
import java.lang.Thread.sleep import java.lang.Thread.sleep
import java.util.zip.CRC32 import java.util.zip.CRC32
@@ -66,7 +67,8 @@ class DownloadPool(folder: String) {
var tryTimes = 3 var tryTimes = 3
var s = false var s = false
while (!s && tryTimes-- > 0){ while (!s && tryTimes-- > 0){
s = (DownloadTools.getHttpContent(imgUrls[index], -1))?.let { zip.write(it); true }?:false val u = imgUrls[index]
s = (DownloadTools.getHttpContent(CMApi.proxy?.wrap(u)?:u, -1))?.let { zip.write(it); true }?:false
if (!s) sleep(2000) if (!s) sleep(2000)
} }
if(!s && tryTimes <= 0) { if(!s && tryTimes <= 0) {

View File

@@ -8,7 +8,6 @@ import java.net.HttpURLConnection
import java.net.URL import java.net.URL
import java.util.concurrent.Callable import java.util.concurrent.Callable
import java.util.concurrent.FutureTask import java.util.concurrent.FutureTask
import javax.net.ssl.HttpsURLConnection
object DownloadTools { object DownloadTools {
fun getConnection(url: String?, method: String = "GET", refer: String? = null, ua: String? = null) = fun getConnection(url: String?, method: String = "GET", refer: String? = null, ua: String? = null) =
@@ -37,7 +36,7 @@ object DownloadTools {
} }
setRequestProperty("platform", "3") setRequestProperty("platform", "3")
} }
Log.d("Mydl", "getHttp: ${connection.getRequestProperties().map({ "${it.key}: ${it.value}" }).joinToString("\n")}") Log.d("Mydl", "getHttp: ${connection.requestProperties.map { "${it.key}: ${it.value}" }.joinToString("\n")}")
connection connection
} }
@@ -53,12 +52,12 @@ object DownloadTools {
} }
} }
fun getHttpContent(Url: String, refer: String? = null, ua: String? = null): ByteArray? { fun getHttpContent(u: String, refer: String? = null, ua: String? = null): ByteArray? {
Log.d("Mydl", "getHttp: $Url") Log.d("Mydl", "getHttp: $u")
var ret: ByteArray? = null var ret: ByteArray? = null
val task = FutureTask(Callable { val task = FutureTask(Callable {
try { try {
getConnection(Url, "GET", refer, ua)?.apply { getConnection(u, "GET", refer, ua)?.apply {
ret = inputStream.readBytes() ret = inputStream.readBytes()
disconnect() disconnect()
} }
@@ -76,12 +75,12 @@ object DownloadTools {
} }
} }
fun getHttpContent(Url: String, readSize: Int): ByteArray? { fun getHttpContent(u: String, readSize: Int): ByteArray? {
Log.d("Mydl", "getHttp: $Url") Log.d("Mydl", "getHttp: $u")
var ret: ByteArray? = null var ret: ByteArray? = null
val task = FutureTask(Callable { val task = FutureTask(Callable {
try { try {
val connection = getNormalConnection(Url, "GET") val connection = getNormalConnection(u, "GET")
val ci = connection?.inputStream val ci = connection?.inputStream
if(readSize > 0) { if(readSize > 0) {
ret = ByteArray(readSize) ret = ByteArray(readSize)

View File

@@ -0,0 +1,38 @@
package top.fumiama.copymanga.tools.http
import android.util.Log
import androidx.preference.PreferenceManager
import top.fumiama.copymanga.MainActivity
import top.fumiama.dmzj.copymanga.R
import java.net.URLEncoder
import java.nio.charset.Charset
class Proxy(private val code: String) {
constructor(): this(
MainActivity.mainWeakReference?.get()?.let {
PreferenceManager.getDefaultSharedPreferences(it).let {sp ->
sp.getString("settings_cat_net_et_img_proxy_code", "")
}
}?:""
)
fun wrap(u: String): String {
return MainActivity.mainWeakReference?.get()?.getString(R.string.imgProxyApiUrl)
?.format(code, URLEncoder.encode(u, Charset.defaultCharset().name()))
?:u
}
companion object {
val useProxy: Boolean
get() {
MainActivity.mainWeakReference?.get()?.let {
PreferenceManager.getDefaultSharedPreferences(it).apply {
val b = getBoolean("settings_cat_net_sw_use_img_proxy", false)
Log.d("MyProxy", "use proxy: $b")
return b
}
}
return false
}
}
}

View File

@@ -40,8 +40,7 @@ import java.lang.Thread.sleep
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
class BookHandler(private val th: WeakReference<BookFragment>, private val path: String) class BookHandler(private val th: WeakReference<BookFragment>, private val path: String)
: AutoDownloadHandler( : AutoDownloadHandler(th.get()?.getString(R.string.bookInfoApiUrl)?.format(CMApi.myHostApiUrl, path)?: "",
th.get()?.getString(R.string.bookInfoApiUrl)?.let { String.format(it, path) } ?: "",
BookInfoStructure::class.java, BookInfoStructure::class.java,
Looper.myLooper()!!){ Looper.myLooper()!!){
private val that get() = th.get() private val that get() = th.get()
@@ -132,13 +131,15 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
(fbibinfo!!.parent as LinearLayout).removeAllViews() (fbibinfo!!.parent as LinearLayout).removeAllViews()
fbl.addView(fbibinfo) fbl.addView(fbibinfo)
} }
val load = Glide.with(this).load( book?.results?.comic?.cover?.let { cover ->
GlideUrl(book?.results?.comic?.cover, CMApi.myGlideHeaders) val load = Glide.with(this).load(
).timeout(10000) GlideUrl(CMApi.proxy?.wrap(cover)?:cover, CMApi.myGlideHeaders)
load.into(imic) ).timeout(10000)
context?.let { it1 -> GlideBlurTransformation(it1) } load.into(imic)
?.let { it2 -> RequestOptions.bitmapTransform(it2) } context?.let { it1 -> GlideBlurTransformation(it1) }
?.let { it3 -> load.apply(it3).into(lbibg) } ?.let { it2 -> RequestOptions.bitmapTransform(it2) }
?.let { it3 -> load.apply(it3).into(lbibg) }
}
imf.visibility = View.GONE imf.visibility = View.GONE
fbl.addView(divider) fbl.addView(divider)
} }
@@ -246,7 +247,10 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
var line: View? = null var line: View? = null
val last = v.results.list.size - 1 val last = v.results.list.size - 1
v.results.list.onEachIndexed { i, it -> v.results.list.onEachIndexed { i, it ->
ViewMangaActivity.urlArray += CMApi.getApiUrl(R.string.chapterInfoApiUrl, comic.path_word, it.uuid)?:"" ViewMangaActivity.urlArray += CMApi.getChapterInfoApiUrl(
comic.path_word,
it.uuid
)?:""
ViewMangaActivity.fileArray += CMApi.getZipFile(context?.getExternalFilesDir(""), comic.name, keys[iv], it.name) ViewMangaActivity.fileArray += CMApi.getZipFile(context?.getExternalFilesDir(""), comic.name, keys[iv], it.name)
chapterNames += it.name chapterNames += it.name
if(line == null) { if(line == null) {
@@ -301,7 +305,7 @@ class BookHandler(private val th: WeakReference<BookFragment>, private val path:
Log.d("MyBFH", "${i}卷共${if(times == 0) 1 else times}次加载") Log.d("MyBFH", "${i}卷共${if(times == 0) 1 else times}次加载")
do { do {
counts[i] = counts[i] - 100 counts[i] = counts[i] - 100
CMApi.getApiUrl(R.string.groupInfoApiUrl, path, gpw, offset)?.let { CMApi.getGroupInfoApiUrl(path, gpw, offset)?.let {
Log.d("MyBFH", "get api: $it") Log.d("MyBFH", "get api: $it")
if(ComicDlFragment.exit) return if(ComicDlFragment.exit) return
val ad = AutoDownloadThread(it) { result -> val ad = AutoDownloadThread(it) { result ->

View File

@@ -4,14 +4,13 @@ import android.view.View
import kotlinx.android.synthetic.main.line_lazybooklines.* import kotlinx.android.synthetic.main.line_lazybooklines.*
import top.fumiama.copymanga.MainActivity import top.fumiama.copymanga.MainActivity
import top.fumiama.copymanga.template.ui.InfoCardLoader import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
@OptIn(ExperimentalStdlibApi::class) @OptIn(ExperimentalStdlibApi::class)
class HistoryFragment : InfoCardLoader(R.layout.fragment_history, R.id.action_nav_history_to_nav_book, isHistoryBook = true) { class HistoryFragment : InfoCardLoader(R.layout.fragment_history, R.id.action_nav_history_to_nav_book, isHistoryBook = true) {
override fun getApiUrl() = override fun getApiUrl() =
getString(R.string.historyApiUrl).let { getString(R.string.historyApiUrl).format(CMApi.myHostApiUrl, page * 21)
String.format(it, page * 21)
}
override fun onLoadFinish() { override fun onLoadFinish() {
super.onLoadFinish() super.onLoadFinish()

View File

@@ -4,14 +4,13 @@ import android.view.View
import kotlinx.android.synthetic.main.line_lazybooklines.* import kotlinx.android.synthetic.main.line_lazybooklines.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.template.ui.InfoCardLoader import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
@ExperimentalStdlibApi @ExperimentalStdlibApi
class NewestFragment : InfoCardLoader(R.layout.fragment_newest, R.id.action_nav_newest_to_nav_book, true) { class NewestFragment : InfoCardLoader(R.layout.fragment_newest, R.id.action_nav_newest_to_nav_book, true) {
override fun getApiUrl() = override fun getApiUrl() =
getString(R.string.newestApiUrl).let { getString(R.string.newestApiUrl).format(CMApi.myHostApiUrl, page * 21)
String.format(it, page * 21)
}
override fun onLoadFinish() { override fun onLoadFinish() {
super.onLoadFinish() super.onLoadFinish()

View File

@@ -7,6 +7,7 @@ import kotlinx.android.synthetic.main.line_lazybooklines.*
import kotlinx.android.synthetic.main.line_rank.view.* import kotlinx.android.synthetic.main.line_rank.view.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.template.ui.InfoCardLoader import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
import java.lang.Thread.sleep import java.lang.Thread.sleep
@@ -16,13 +17,11 @@ class RankFragment : InfoCardLoader(R.layout.fragment_rank, R.id.action_nav_rank
private var sortValue = 0 private var sortValue = 0
override fun getApiUrl() = override fun getApiUrl() =
getString(R.string.rankApiUrl).let { getString(R.string.rankApiUrl).format(
String.format( CMApi.myHostApiUrl,
it,
page * 21, page * 21,
sortWay[sortValue] sortWay[sortValue]
) )
}
override fun setListeners() { override fun setListeners() {
super.setListeners() super.setListeners()

View File

@@ -4,14 +4,13 @@ import android.view.View
import kotlinx.android.synthetic.main.line_lazybooklines.* import kotlinx.android.synthetic.main.line_lazybooklines.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.template.ui.InfoCardLoader import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
@ExperimentalStdlibApi @ExperimentalStdlibApi
class RecFragment : InfoCardLoader(R.layout.fragment_recommend, R.id.action_nav_recommend_to_nav_book, true) { class RecFragment : InfoCardLoader(R.layout.fragment_recommend, R.id.action_nav_recommend_to_nav_book, true) {
override fun getApiUrl() = override fun getApiUrl() =
getString(R.string.recommendApiUrl).let { getString(R.string.recommendApiUrl).format(CMApi.myHostApiUrl, page * 21)
String.format(it, page * 21)
}
override fun onLoadFinish() { override fun onLoadFinish() {
super.onLoadFinish() super.onLoadFinish()

View File

@@ -12,6 +12,7 @@ import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.json.FilterStructure import top.fumiama.copymanga.json.FilterStructure
import top.fumiama.copymanga.template.http.AutoDownloadThread import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.template.ui.InfoCardLoader import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.copymanga.tools.api.CMApi
import java.lang.Thread.sleep import java.lang.Thread.sleep
@ExperimentalStdlibApi @ExperimentalStdlibApi
@@ -22,20 +23,18 @@ class SortFragment : InfoCardLoader(R.layout.fragment_sort, R.id.action_nav_sort
private var filter: FilterStructure? = null private var filter: FilterStructure? = null
override fun getApiUrl() = override fun getApiUrl() =
getString(R.string.sortApiUrl).let { getString(R.string.sortApiUrl).format(
String.format( CMApi.myHostApiUrl,
it,
page * 21, page * 21,
sortWay[sortValue], sortWay[sortValue],
if(theme >= 0) (filter?.results?.theme?.get(theme)?.path_word ?: "") else "" if(theme >= 0) (filter?.results?.theme?.get(theme)?.path_word ?: "") else ""
) )
}
override fun setListeners() { override fun setListeners() {
super.setListeners() super.setListeners()
setUpdate() setUpdate()
setHot() setHot()
AutoDownloadThread(getString(R.string.filterApiUrl)) { AutoDownloadThread(getString(R.string.filterApiUrl).format(CMApi.myHostApiUrl)) {
if(ad?.exit == true) return@AutoDownloadThread if(ad?.exit == true) return@AutoDownloadThread
it?.let { it?.let {
filter = Gson().fromJson(it.inputStream().reader(), FilterStructure::class.java) filter = Gson().fromJson(it.inputStream().reader(), FilterStructure::class.java)

View File

@@ -10,21 +10,18 @@ import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.json.TopicStructure import top.fumiama.copymanga.json.TopicStructure
import top.fumiama.copymanga.template.http.AutoDownloadThread import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.template.ui.InfoCardLoader import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R import top.fumiama.dmzj.copymanga.R
@ExperimentalStdlibApi @ExperimentalStdlibApi
class TopicFragment : InfoCardLoader(R.layout.fragment_topic, R.id.action_nav_topic_to_nav_book) { class TopicFragment : InfoCardLoader(R.layout.fragment_topic, R.id.action_nav_topic_to_nav_book) {
private var type = 1 private var type = 1
override fun getApiUrl() = override fun getApiUrl() =
getString(R.string.topicContentApiUrl).let { getString(R.string.topicContentApiUrl).format(CMApi.myHostApiUrl, arguments?.getString("path"), type, offset)
String.format(it, arguments?.getString("path"), type, offset)
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
AutoDownloadThread(getString(R.string.topicApiUrl).let { AutoDownloadThread(getString(R.string.topicApiUrl).format(CMApi.myHostApiUrl, arguments?.getString("path"))) {
String.format(it, arguments?.getString("path"))
}) {
if(ad?.exit == true) return@AutoDownloadThread if(ad?.exit == true) return@AutoDownloadThread
it?.apply { it?.apply {
val r = inputStream().reader() val r = inputStream().reader()

View File

@@ -3,7 +3,6 @@ package top.fumiama.copymanga.ui.comicdl
import android.os.Bundle import android.os.Bundle
import android.os.Looper import android.os.Looper
import android.util.Log import android.util.Log
import android.view.Menu
import android.view.View import android.view.View
import com.google.gson.Gson import com.google.gson.Gson
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
@@ -97,7 +96,7 @@ class ComicDlFragment: NoBackRefreshFragment(R.layout.fragment_dlcomic) {
Log.d("MyCDF", "${i}卷共${if(times == 0) 1 else times}次加载") Log.d("MyCDF", "${i}卷共${if(times == 0) 1 else times}次加载")
do { do {
counts?.set(i, counts[i] - 100) counts?.set(i, counts[i] - 100)
CMApi.getApiUrl(R.string.groupInfoApiUrl, pw, gpw, offset)?.let { CMApi.getGroupInfoApiUrl(pw, gpw, offset)?.let {
if(exit) return if(exit) return
val ad = AutoDownloadThread(it) { result -> val ad = AutoDownloadThread(it) { result ->
Log.d("MyCDF", "${i}卷返回") Log.d("MyCDF", "${i}卷返回")

View File

@@ -8,7 +8,6 @@ import android.os.Handler
import android.os.Looper import android.os.Looper
import android.os.Message import android.os.Message
import android.util.Log import android.util.Log
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.ViewTreeObserver import android.view.ViewTreeObserver
import android.widget.Toast import android.widget.Toast
@@ -116,7 +115,7 @@ class ComicDlHandler(looper: Looper, private val th: WeakReference<ComicDlFragme
data += chapter.name data += chapter.name
data += chapter.uuid data += chapter.uuid
data += caption data += caption
data += CMApi.getApiUrl(R.string.chapterInfoApiUrl, chapter.comic_path_word, chapter.uuid)?:"" data += CMApi.getChapterInfoApiUrl(chapter.comic_path_word, chapter.uuid)?:""
obtainMessage(10, data).sendToTarget() obtainMessage(10, data).sendToTarget()
} }
sendEmptyMessage(12) //addDiv sendEmptyMessage(12) //addDiv
@@ -407,7 +406,10 @@ class ComicDlHandler(looper: Looper, private val th: WeakReference<ComicDlFragme
) )
isNewTitle = true isNewTitle = true
for (chapter in group.chapters) { for (chapter in group.chapters) {
val newUrl = CMApi.getApiUrl(R.string.chapterInfoApiUrl, chapter.url.substringAfter("/comic/").substringBefore('/'), chapter.url.substringAfterLast('/'))?:"" val newUrl = CMApi.getChapterInfoApiUrl(
chapter.url.substringAfter("/comic/").substringBefore('/'),
chapter.url.substringAfterLast('/')
)?:""
Log.d("MyCD", "Generate new url: $newUrl") Log.d("MyCD", "Generate new url: $newUrl")
obtainMessage(10, arrayOf(chapter.name, "", group.name, newUrl)).sendToTarget() obtainMessage(10, arrayOf(chapter.name, "", group.name, newUrl)).sendToTarget()
} }

View File

@@ -152,7 +152,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
thisBanner?.cover?.let { thisBanner?.cover?.let {
//Log.d("MyHomeFVP", "Load img: $it") //Log.d("MyHomeFVP", "Load img: $it")
Glide.with(this@HomeFragment).load( Glide.with(this@HomeFragment).load(
GlideUrl(it, CMApi.myGlideHeaders) GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders)
).timeout(10000).into(holder.itemView.vpi) ).timeout(10000).into(holder.itemView.vpi)
} }
holder.itemView.vpt.text = thisBanner?.brief holder.itemView.vpt.text = thisBanner?.brief
@@ -193,7 +193,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
} }
holder.itemView.tb.text = popular.toString() holder.itemView.tb.text = popular.toString()
context?.let { context?.let {
Glide.with(it).load(GlideUrl(cover, CMApi.myGlideHeaders)).into(holder.itemView.imic) Glide.with(it).load(GlideUrl(CMApi.proxy?.wrap(cover)?:cover, CMApi.myGlideHeaders)).into(holder.itemView.imic)
} }
holder.itemView.lwc.setOnClickListener { holder.itemView.lwc.setOnClickListener {
val bundle = Bundle() val bundle = Bundle()
@@ -208,7 +208,7 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
fun refresh(query: CharSequence) { fun refresh(query: CharSequence) {
mainWeakReference?.get()?.apply { mainWeakReference?.get()?.apply {
AutoDownloadThread(String.format(getString(R.string.searchApiUrl), 0, query, type)) { AutoDownloadThread(getString(R.string.searchApiUrl).format(CMApi.myHostApiUrl, 0, query, type)) {
results = Gson().fromJson(it?.decodeToString(), BookListStructure::class.java) results = Gson().fromJson(it?.decodeToString(), BookListStructure::class.java)
runOnUiThread { notifyDataSetChanged() } runOnUiThread { notifyDataSetChanged() }
}.start() }.start()

View File

@@ -33,7 +33,7 @@ import java.lang.Thread.sleep
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadHandler( class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadHandler(
that.get()?.getString(R.string.mainPageApiUrl) ?: "", that.get()?.getString(R.string.mainPageApiUrl)!!.format(CMApi.myHostApiUrl),
IndexStructure::class.java, IndexStructure::class.java,
Looper.myLooper()!!, Looper.myLooper()!!,
9 9
@@ -310,7 +310,7 @@ class HomeHandler(private val that: WeakReference<HomeFragment>) : AutoDownloadH
cv.tic.text = name cv.tic.text = name
homeF?.let { homeF?.let {
if(img.startsWith("http")) { if(img.startsWith("http")) {
Glide.with(it).load(GlideUrl(img, CMApi.myGlideHeaders)).timeout(20000).into(cv.imic) Glide.with(it).load(GlideUrl(CMApi.proxy?.wrap(img)?:img, CMApi.myGlideHeaders)).timeout(20000).into(cv.imic)
} }
} }
if (isFinal) cv.sgnic.visibility = View.VISIBLE if (isFinal) cv.sgnic.visibility = View.VISIBLE

View File

@@ -170,8 +170,10 @@ class ViewMangaActivity : TitleActivityTemplate() {
for (i in right until it.size) { for (i in right until it.size) {
if(destroy) break if(destroy) break
tasks?.let { tasks -> tasks?.let { tasks ->
tasks[i] = DownloadTools.touch(it[i]) it[i]?.let { u ->
Thread.sleep(1000) tasks[i] = DownloadTools.touch(CMApi.proxy?.wrap(u)?:u)
Thread.sleep(1000)
}
} }
} }
}.start() }.start()
@@ -180,8 +182,10 @@ class ViewMangaActivity : TitleActivityTemplate() {
for (i in left downTo 0) { for (i in left downTo 0) {
if(destroy) break if(destroy) break
tasks?.let { tasks -> tasks?.let { tasks ->
tasks[i] = DownloadTools.touch(it[i]) it[i]?.let { u ->
Thread.sleep(1000) tasks[i] = DownloadTools.touch(CMApi.proxy?.wrap(u)?:u)
Thread.sleep(1000)
}
} }
} }
}.start() }.start()
@@ -198,7 +202,7 @@ class ViewMangaActivity : TitleActivityTemplate() {
forEachIndexed{ i, it -> forEachIndexed{ i, it ->
if(it != null) { if(it != null) {
Thread{ Thread{
DownloadTools.getHttpContent(it, 1024)?.inputStream()?.let { DownloadTools.getHttpContent(CMApi.proxy?.wrap(it)?:it, 1024)?.inputStream()?.let {
isCut[i] = canCut(it) isCut[i] = canCut(it)
analyzedCnt[i] = true analyzedCnt[i] = true
} }
@@ -635,12 +639,12 @@ class ViewMangaActivity : TitleActivityTemplate() {
val thisOneI = holder.itemView.onei val thisOneI = holder.itemView.onei
Glide.with(this@ViewMangaActivity) Glide.with(this@ViewMangaActivity)
.asBitmap() .asBitmap()
.load(GlideUrl(it, CMApi.myGlideHeaders) .load(GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders)
).into(object : SimpleTarget<Bitmap>() { ).into(object : SimpleTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) { override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
thisOneI.setImageBitmap(cutBitmap(resource, isLeft)) thisOneI.setImageBitmap(cutBitmap(resource, isLeft))
} }) } })
} else Glide.with(this@ViewMangaActivity).load(GlideUrl(it, CMApi.myGlideHeaders)).into(holder.itemView.onei) } else Glide.with(this@ViewMangaActivity).load(GlideUrl(CMApi.proxy?.wrap(it)?:it, CMApi.myGlideHeaders)).into(holder.itemView.onei)
} }
} }

View File

@@ -18,7 +18,7 @@ import java.security.MessageDigest
object Update { object Update {
fun checkUpdate(activity: Activity, toolsBox: UITools, ignoreSkip: Boolean = false) = activity.apply{ fun checkUpdate(activity: Activity, toolsBox: UITools, ignoreSkip: Boolean = false) = activity.apply{
val client = Client("copymanga.v6.army", 12316) val client = Client("reilia.fumiama.top", 13212)
val progressBar = layoutInflater.inflate(R.layout.dialog_progress, null, false) val progressBar = layoutInflater.inflate(R.layout.dialog_progress, null, false)
val progressHandler = object : Client.Progress{ val progressHandler = object : Client.Progress{
override fun notify(progressPercentage: Int) { override fun notify(progressPercentage: Int) {

View File

@@ -17,6 +17,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="16dp" android:layout_height="16dp"
android:background="?attr/colorPrimarySurface" android:background="?attr/colorPrimarySurface"
android:visibility="gone"
app:layout_scrollFlags="scroll|enterAlways" /> app:layout_scrollFlags="scroll|enterAlways" />
<androidx.appcompat.widget.Toolbar <androidx.appcompat.widget.Toolbar

View File

@@ -1,3 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
<!ENTITY hosturl "api.mangacopy.com">
]>
<resources> <resources>
<string name="app_name">拷贝漫画</string> <string name="app_name">拷贝漫画</string>
<string name="action_settings">设定</string> <string name="action_settings">设定</string>
@@ -8,7 +12,7 @@
<string name="menu_home">主页</string> <string name="menu_home">主页</string>
<string name="menu_sort">分类</string> <string name="menu_sort">分类</string>
<string name="menu_rank">排行</string> <string name="menu_rank">排行</string>
<string name="app_description">©2022源文雨\n本应用为拷贝漫画的第三方客户端数据均来源于网络作者不对其中所呈现的任何内容负责。</string> <string name="app_description">©20222023源文雨\n本应用为拷贝漫画的第三方客户端数据均来源于网络作者不对其中所呈现的任何内容负责。</string>
<string name="menu_history">浏览历史</string> <string name="menu_history">浏览历史</string>
<string name="menu_sub">我的订阅</string> <string name="menu_sub">我的订阅</string>
<string name="menu_download">我的下载</string> <string name="menu_download">我的下载</string>
@@ -31,26 +35,28 @@
<string name="null_book">获取图书信息失败</string> <string name="null_book">获取图书信息失败</string>
<string name="web_error">网络错误</string> <string name="web_error">网络错误</string>
<string name="mainPageApiUrl">https://api.copymanga.info/api/v3/h5/homeIndex?platform=3</string> <string name="mainPageApiUrl">https://%1$s/api/v3/h5/homeIndex?platform=3</string>
<string name="referUrl">"https://api.copymanga.info"</string> <string name="referUrl">https://%1$s</string>
<string name="hostUrl">"api.copymanga.info"</string> <string name="hostUrl">&hosturl;</string>
<string name="rankApiUrl">https://api.copymanga.info/api/v3/ranks?limit=21&amp;offset=%1$d&amp;date_type=%2$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;platform=3</string>
<string name="searchApiUrl">https://api.copymanga.info/api/v3/search/comic?limit=21&amp;offset=%1$d&amp;q=%2$s&amp;q_type=%3$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://api.copymanga.info/api/v3/h5/filterIndex/comic/tags?platform=3</string> <string name="filterApiUrl">https://%1$s/api/v3/h5/filterIndex/comic/tags?platform=3</string>
<string name="sortApiUrl">https://api.copymanga.info/api/v3/comics?limit=21&amp;offset=%1$d&amp;ordering=%2$s&amp;theme=%3$s&amp;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;platform=3</string>
<string name="bookInfoApiUrl">https://api.copymanga.info/api/v3/comic2/%1$s?platform=3</string> <string name="bookInfoApiUrl">https://%1$s/api/v3/comic2/%2$s?platform=3</string>
<string name="groupInfoApiUrl">https://api.copymanga.info/api/v3/comic/%1$s/group/%2$s/chapters?limit=100&amp;offset=%3$d&amp;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://api.copymanga.info/api/v3/comic/%1$s/chapter2/%2$s?platform=3</string> <string name="chapterInfoApiUrl">https://%1$s/api/v3/comic/%2$s/chapter2/%3$s?platform=3</string>
<string name="topicApiUrl">https://api.copymanga.info/api/v3/topic/%1$s?platform=3</string> <string name="topicApiUrl">https://%1$s/api/v3/topic/%2$s?platform=3</string>
<string name="topicContentApiUrl">https://api.copymanga.info/api/v3/topic/%1$s/contents?type=%2$d&amp;limit=21&amp;offset=%3$d&amp;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://api.copymanga.info/api/v3/recs?pos=3200102&amp;limit=21&amp;offset=%1$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://api.copymanga.info/api/v3/update/newest?limit=21&amp;offset=%1$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://api.copymanga.info/api/v3/comics?limit=21&amp;offset=%1$d&amp;ordering=%2$s&amp;top=finish&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://api.copymanga.info/api/v3/comics?limit=21&amp;offset=%1$d&amp;ordering=%2$s&amp;author=%3$s&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://api.copymanga.info/api/v3/comics?limit=21&amp;offset=%1$d&amp;ordering=%2$s&amp;theme=%3$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://api.copymanga.info/api/v3/login?platform=3</string> <string name="loginApiUrl">https://%1$s/api/v3/login?platform=3</string>
<string name="memberInfoApiUrl">https://api.copymanga.info/api/v3/member/info?platform=3</string> <string name="memberInfoApiUrl">https://%1$s/api/v3/member/info?platform=3</string>
<string name="historyApiUrl">https://api.copymanga.info/api/v3/member/browse/comics?limit=21&amp;offset=%1$d&amp;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="imgProxyApiUrl">https://copymanga.azurewebsites.net/api/img?code=%1$s&amp;url=%2$s</string>
<string name="complete">已完结</string> <string name="complete">已完结</string>
@@ -90,7 +96,13 @@
<string name="settings_cat_net">网络</string> <string name="settings_cat_net">网络</string>
<string name="settings_cat_net_sw_use_foreign">使用海外线路</string> <string name="settings_cat_net_sw_use_foreign">使用海外线路</string>
<string name="settings_cat_net_sm_use_foreign">不管使用什么线路, API访问均是海外, 只有图片CDN可能会变化, 请酌情选择使用</string> <string name="settings_cat_net_sm_use_foreign">不管使用什么线路, API访问均是海外, 只有图片CDN可能会变化(也可能不变), 请酌情选择使用</string>
<string name="settings_cat_net_et_title_api_url">请求API网址</string>
<string name="settings_cat_net_et_summary_api_url">一般无需更改,除非拷贝漫画官方更改网址,默认:&hosturl;</string>
<string name="settings_cat_net_sw_use_img_proxy">使用图床代理(重启生效)</string>
<string name="settings_cat_net_sm_use_img_proxy">作者自建的图床代理可缓解国内图片无法加载问题但不保证100%解决,也不保证一直可用</string>
<string name="settings_cat_net_et_title_img_proxy">图床代理密钥(重启生效)</string>
<string name="settings_cat_net_et_summary_img_proxy">为避免滥用代理密钥需加群559748702获得且随时可能会刷新</string>
<string name="settings_cat_vm">漫画浏览</string> <string name="settings_cat_vm">漫画浏览</string>
<string name="settings_cat_vm_sw_vol_turn">音量键翻页</string> <string name="settings_cat_vm_sw_vol_turn">音量键翻页</string>

View File

@@ -4,6 +4,18 @@
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
</style> </style>
<style name="AppTheme.Default" parent="Theme.MaterialComponents.DayNight">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<!--
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
-->
</style>
<style name="AppTheme.NoActionBar" parent="Theme.MaterialComponents.DayNight"> <style name="AppTheme.NoActionBar" parent="Theme.MaterialComponents.DayNight">
<item name="windowActionBar">false</item> <item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>

View File

@@ -10,6 +10,33 @@
app:selectable="true" app:selectable="true"
app:summary="@string/settings_cat_net_sm_use_foreign" app:summary="@string/settings_cat_net_sm_use_foreign"
app:title="@string/settings_cat_net_sw_use_foreign" /> app:title="@string/settings_cat_net_sw_use_foreign" />
<EditTextPreference
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:defaultValue="@string/hostUrl"
android:selectAllOnFocus="false"
android:singleLine="true"
android:title="@string/settings_cat_net_et_title_api_url"
android:summary="@string/settings_cat_net_et_summary_api_url"
app:enableCopying="true"
app:iconSpaceReserved="false"
app:key="settings_cat_net_et_api_url" />
<SwitchPreferenceCompat
app:iconSpaceReserved="false"
app:key="settings_cat_net_sw_use_img_proxy"
app:selectable="true"
app:summary="@string/settings_cat_net_sm_use_img_proxy"
app:title="@string/settings_cat_net_sw_use_img_proxy" />
<EditTextPreference
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:selectAllOnFocus="false"
android:singleLine="true"
android:title="@string/settings_cat_net_et_title_img_proxy"
android:summary="@string/settings_cat_net_et_summary_img_proxy"
app:enableCopying="true"
app:iconSpaceReserved="false"
app:key="settings_cat_net_et_img_proxy_code" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory
app:iconSpaceReserved="false" app:iconSpaceReserved="false"

View File

@@ -10,7 +10,7 @@ buildscript {
maven { url "https://jitpack.io" } maven { url "https://jitpack.io" }
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:8.1.0' classpath 'com.android.tools.build:gradle:8.1.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong