diff --git a/.idea/misc.xml b/.idea/misc.xml index 90b07e1..b85b19c 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -18,19 +18,26 @@ + + + + + + + diff --git a/README.md b/README.md index 38fb46b..457f560 100644 --- a/README.md +++ b/README.md @@ -34,11 +34,12 @@ 3. 本应用默认使用大陆线路。 ### 功能 -1. 浏览主页、分类、排行、我的下载、标签、作者。 -2. 查看、搜索漫画并直接阅读;记录漫画与章节的阅读进度。 +1. 浏览主页、分类、排行、我的下载、浏览历史、标签、作者。 +2. 查看、搜索漫画并直接阅读;**在本地**记录漫画与章节的阅读进度。 3. 下载漫画。但是由于不可抗力,下载速度较慢且容易出错,这绝对不是优化的原因,绝对不是。 4. 阅读下载的漫画。 5. 检查更新。 +6. 登录。 ### 未实现功能 未在上表列出的官方`APP`的其他功能。 diff --git a/app/build.gradle b/app/build.gradle index e79e187..d1999c8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId 'top.fumiama.copymanga' minSdkVersion 23 targetSdkVersion 33 - versionCode 25 - versionName '2.0.beta13' + versionCode 26 + versionName '2.0.beta14' resConfigs 'zh', 'zh-rCN' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -66,9 +66,9 @@ dependencies { implementation 'com.afollestad.material-dialogs:input:3.3.0' implementation 'com.github.yalantis:ucrop:2.2.6' implementation 'com.to.aboomy:pager2banner:1.0.1' - implementation 'com.github.bumptech.glide:glide:4.12.0' - annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' - implementation 'com.google.code.gson:gson:2.8.9' + implementation 'com.github.bumptech.glide:glide:4.14.2' + annotationProcessor 'com.github.bumptech.glide:compiler:4.14.2' + implementation 'com.google.code.gson:gson:2.9.1' implementation 'com.github.vovaksenov99:OverscrollableScrollView:1.0' implementation 'com.liaoinstan.springview:library:1.7.0' implementation 'com.github.zawadz88.materialpopupmenu:material-popup-menu:4.0.1' diff --git a/app/src/main/java/top/fumiama/copymanga/LoginActivity.kt b/app/src/main/java/top/fumiama/copymanga/LoginActivity.kt index e5acaf6..45805a4 100644 --- a/app/src/main/java/top/fumiama/copymanga/LoginActivity.kt +++ b/app/src/main/java/top/fumiama/copymanga/LoginActivity.kt @@ -2,11 +2,56 @@ package top.fumiama.copymanga import android.app.Activity import android.os.Bundle +import android.util.Log +import android.widget.Toast +import com.google.gson.Gson +import kotlinx.android.synthetic.main.activity_login.* +import top.fumiama.copymanga.json.BookListStructure +import top.fumiama.copymanga.json.LoginInfoStructure +import top.fumiama.copymanga.tools.api.CMApi +import top.fumiama.copymanga.tools.http.DownloadTools import top.fumiama.dmzj.copymanga.R +import kotlin.random.Random +import kotlin.random.nextUInt class LoginActivity:Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) + alblogin.setOnClickListener { + val salt = Random.nextInt(10000) + altusrnm.text?.toString()?.let { username -> + altpwd.text?.toString()?.let { pwd -> + Thread{ + try { + CMApi.getLoginConnection(username, pwd, salt)?.apply { + Gson().fromJson(inputStream.reader(), LoginInfoStructure::class.java)?.let { + if(it.code == 200) { + MainActivity.mainWeakReference?.get()?.getPreferences(MODE_PRIVATE)?.edit()?.apply { + putString("token", it.results?.token) + putString("user_id", it.results?.user_id) + putString("username", it.results?.username) + putString("nickname", it.results?.nickname) + apply() + DownloadTools.getHttpContent(getString(R.string.memberInfoApiUrl))?.decodeToString()?.let { + val l = Gson().fromJson(it, LoginInfoStructure::class.java) + if(l.code == 200) { + putString("avatar", l.results.avatar) + apply() + } else runOnUiThread { Toast.makeText(this@LoginActivity, l.message, Toast.LENGTH_SHORT).show() } + } + runOnUiThread { finish() } + }?:runOnUiThread { Toast.makeText(this@LoginActivity, R.string.login_get_conn_failed, Toast.LENGTH_SHORT).show() } + } else runOnUiThread { Toast.makeText(this@LoginActivity, it.message, Toast.LENGTH_SHORT).show() } + } + disconnect() + }?:runOnUiThread { Toast.makeText(this, R.string.login_get_conn_failed, Toast.LENGTH_SHORT).show() } + }catch (e: Exception) { + runOnUiThread { Toast.makeText(this, e.localizedMessage, Toast.LENGTH_SHORT).show() } + } + }.start() + }?:Toast.makeText(this, R.string.login_null_pwd, Toast.LENGTH_SHORT).show() + }?:Toast.makeText(this, R.string.login_null_username, Toast.LENGTH_SHORT).show() + } } -} \ No newline at end of file +} diff --git a/app/src/main/java/top/fumiama/copymanga/MainActivity.kt b/app/src/main/java/top/fumiama/copymanga/MainActivity.kt index 7599749..17859fe 100644 --- a/app/src/main/java/top/fumiama/copymanga/MainActivity.kt +++ b/app/src/main/java/top/fumiama/copymanga/MainActivity.kt @@ -32,6 +32,7 @@ import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupWithNavController import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.input.input +import com.bumptech.glide.Glide import com.yalantis.ucrop.UCrop import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.app_bar_main.* @@ -86,6 +87,13 @@ class MainActivity : AppCompatActivity() { Log.d("MyMain", "onDrawerOpened") isDrawerClosed = false DownloadFragment.currentDir = getExternalFilesDir("") + getPreferences(MODE_PRIVATE)?.apply { + val name = getString("nickname", getString("username", "")) + val avatar = getString("avatar", "") + if(name != "") navttitle.text = name + else navttitle.setText(R.string.noLogin) + if(avatar != "") Glide.with(this@MainActivity).load(avatar).into(navhicon) + } } override fun onDrawerSlide(drawerView: View, slideOffset: Float) {} diff --git a/app/src/main/java/top/fumiama/copymanga/json/HistoryBookListStructure.java b/app/src/main/java/top/fumiama/copymanga/json/HistoryBookListStructure.java new file mode 100644 index 0000000..4859d48 --- /dev/null +++ b/app/src/main/java/top/fumiama/copymanga/json/HistoryBookListStructure.java @@ -0,0 +1,16 @@ +package top.fumiama.copymanga.json; + +public class HistoryBookListStructure extends ReturnBase { + public Results results; + public static class Results { + public ListItem[] list; + public int total; + public int limit; + public int offset; + } + public static class ListItem { + public String last_chapter_id; + public String last_chapter_name; + public HistoryComicStructure comic; + } +} diff --git a/app/src/main/java/top/fumiama/copymanga/json/HistoryComicStructure.java b/app/src/main/java/top/fumiama/copymanga/json/HistoryComicStructure.java new file mode 100644 index 0000000..e905960 --- /dev/null +++ b/app/src/main/java/top/fumiama/copymanga/json/HistoryComicStructure.java @@ -0,0 +1,16 @@ +package top.fumiama.copymanga.json; + +public class HistoryComicStructure { + public String uuid; + public boolean b_display; + public String name; + public String path_word; + public ThemeStructure[] author; + public ThemeStructure[] theme; + public String cover; + public int status; + public int popular; + public String datetime_updated; + public String last_chapter_id; + public String last_chapter_name; +} diff --git a/app/src/main/java/top/fumiama/copymanga/json/LoginInfoStructure.java b/app/src/main/java/top/fumiama/copymanga/json/LoginInfoStructure.java new file mode 100644 index 0000000..4bf4fb6 --- /dev/null +++ b/app/src/main/java/top/fumiama/copymanga/json/LoginInfoStructure.java @@ -0,0 +1,12 @@ +package top.fumiama.copymanga.json; + +public class LoginInfoStructure extends ReturnBase{ + public Results results; + public static class Results { + public String token; + public String user_id; + public String username; + public String nickname; + public String avatar; + } +} diff --git a/app/src/main/java/top/fumiama/copymanga/manga/Reader.kt b/app/src/main/java/top/fumiama/copymanga/manga/Reader.kt index 2b1dd71..5e49d4d 100644 --- a/app/src/main/java/top/fumiama/copymanga/manga/Reader.kt +++ b/app/src/main/java/top/fumiama/copymanga/manga/Reader.kt @@ -2,6 +2,7 @@ package top.fumiama.copymanga.manga import android.content.Context import android.content.Intent +import android.util.Log import androidx.core.content.edit import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.ui.vm.ViewMangaActivity @@ -12,7 +13,8 @@ object Reader { getPreferences(Context.MODE_PRIVATE)?.edit { putInt(name, pos) apply() - } + Log.d("MyR", "记录 $name 阅读到第 ${pos+1} 话") + }?: Log.d("MyR", "无法获得main pref") ViewMangaActivity.dlhandler = null ViewMangaActivity.position = pos ViewMangaActivity.comicName = name diff --git a/app/src/main/java/top/fumiama/copymanga/template/ui/InfoCardLoader.kt b/app/src/main/java/top/fumiama/copymanga/template/ui/InfoCardLoader.kt index 71b4e51..1a0fc80 100644 --- a/app/src/main/java/top/fumiama/copymanga/template/ui/InfoCardLoader.kt +++ b/app/src/main/java/top/fumiama/copymanga/template/ui/InfoCardLoader.kt @@ -7,13 +7,14 @@ import androidx.fragment.app.Fragment import androidx.navigation.Navigation import com.google.gson.Gson import top.fumiama.copymanga.json.BookListStructure +import top.fumiama.copymanga.json.HistoryBookListStructure import top.fumiama.copymanga.json.TypeBookListStructure import top.fumiama.copymanga.template.general.MangaPagesFragmentTemplate import top.fumiama.copymanga.template.http.AutoDownloadThread import java.lang.ref.WeakReference @ExperimentalStdlibApi -open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isTypeBook: Boolean = false): MangaPagesFragmentTemplate(inflateRes) { +open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isTypeBook: Boolean = false,private val isHistoryBook: Boolean = false): MangaPagesFragmentTemplate(inflateRes) { var offset = 0 private val subUrl get() = getApiUrl() var ad: AutoDownloadThread? = null @@ -40,6 +41,21 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT } page++ } + } else if(isHistoryBook) { + val bookList = Gson().fromJson(it?.decodeToString(), HistoryBookListStructure::class.java) + bookList?.apply { + Log.d("MyICL", "offset:${results.offset}, total:${results.total}") + if(results.offset < results.total) { + if(code == 200) { + results.list.forEach{ book -> + if(ad?.exit == true) return@AutoDownloadThread + cardList.addCard(book.comic.name, null, book.comic.cover, book.comic.path_word, null, null, false) + } + offset += results.list.size + } + } + page++ + } } else { val bookList = Gson().fromJson(it?.decodeToString(), BookListStructure::class.java) bookList?.apply { diff --git a/app/src/main/java/top/fumiama/copymanga/tools/api/CMApi.kt b/app/src/main/java/top/fumiama/copymanga/tools/api/CMApi.kt index 338d266..5058fbf 100644 --- a/app/src/main/java/top/fumiama/copymanga/tools/api/CMApi.kt +++ b/app/src/main/java/top/fumiama/copymanga/tools/api/CMApi.kt @@ -1,10 +1,13 @@ package top.fumiama.copymanga.tools.api +import android.util.Base64 import com.bumptech.glide.load.model.LazyHeaders import top.fumiama.dmzj.copymanga.R import top.fumiama.copymanga.MainActivity +import top.fumiama.copymanga.tools.http.DownloadTools import top.fumiama.copymanga.ui.settings.SettingsFragment.Companion.settingsPref import java.io.File +import java.net.URLEncoder object CMApi { var myGlideHeaders: LazyHeaders? = null @@ -23,4 +26,15 @@ object CMApi { 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 getApiUrl(id: Int, arg1: String?, arg2: String?, arg3: Int? = 0) = MainActivity.mainWeakReference?.get()?.getString(id)?.let { String.format(it, arg1, arg2, arg3) } -} \ No newline at end of file + fun getLoginConnection(username: String, pwd: String, salt: Int) = MainActivity.mainWeakReference?.get()?.getString(R.string.loginApiUrl)?.let { + DownloadTools.getConnection(it, "POST")?.apply { + doOutput = true + setRequestProperty("content-type", "application/x-www-form-urlencoded;charset=utf-8") + setRequestProperty("platform", "3") + setRequestProperty("accept", "application/json") + val r = if(settingsPref?.getBoolean("", false) == false) "1" else "0" + val pwdb64 = Base64.encode("$pwd-$salt".toByteArray(), Base64.DEFAULT).decodeToString() + outputStream.write("username=${URLEncoder.encode(username)}&password=$pwdb64&salt=$salt&platform=3&authorization=Token+&version=1.4.4&source=copyApp®ion=$r&webp=1".toByteArray()) + } + } + } diff --git a/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt b/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt index 74cae1d..0e687e8 100644 --- a/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt +++ b/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt @@ -1,10 +1,12 @@ package top.fumiama.copymanga.tools.http +import android.content.Context import android.util.Log +import top.fumiama.copymanga.MainActivity import top.fumiama.copymanga.tools.ssl.AllTrustManager import top.fumiama.copymanga.tools.ssl.IgnoreHostNameVerifier import top.fumiama.copymanga.ui.settings.SettingsFragment.Companion.settingsPref -import java.io.File +import top.fumiama.dmzj.copymanga.R import java.net.HttpURLConnection import java.net.URL import java.net.URLEncoder @@ -27,13 +29,25 @@ object DownloadTools { HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.socketFactory) } - private fun getConnection(url: String?, method: String = "GET") = + fun getConnection(url: String?, method: String = "GET", refer: String? = null, ua: String? = null) = url?.let { val connection = URL(url).openConnection() as HttpURLConnection connection.requestMethod = method connection.connectTimeout = 20000 connection.readTimeout = 20000 - connection + connection.apply { + ua?.let { setRequestProperty("user-agent", it) } + refer?.let { setRequestProperty("referer", it) } + setRequestProperty("source", "copyApp") + setRequestProperty("webp", "1") + setRequestProperty("region", if(settingsPref?.getBoolean("", false) == false) "1" else "0") + MainActivity.mainWeakReference?.get()?.getPreferences(Context.MODE_PRIVATE)?.getString("token", "")?.let { + if(it != "") setRequestProperty("authorization", "Token $it") + else setRequestProperty("authorization", "Token") + } + setRequestProperty("host", url.substringAfter("://").substringBefore("/")) + setRequestProperty("platform", "3") + } } fun getHttpContent(Url: String, refer: String? = null, ua: String? = null): ByteArray? { @@ -41,15 +55,7 @@ object DownloadTools { var ret: ByteArray? = null val task = FutureTask(Callable { try { - getConnection(Url)?.apply { - refer?.let { setRequestProperty("referer", it) } - setRequestProperty("source", "copyApp") - setRequestProperty("webp", "1") - setRequestProperty("region", if(settingsPref?.getBoolean("", false) == false) "1" else "0") - setRequestProperty("authorization", "Token") - setRequestProperty("platform", "3") - ua?.let { setRequestProperty("User-agent", it) } - + getConnection(Url, "GET", refer, ua)?.apply { ret = inputStream.readBytes() disconnect() } @@ -67,37 +73,15 @@ object DownloadTools { } } - fun getHttpContent(Url: String, refer: String? = null): ByteArray? { - Log.d("Mydl", "getHttp: $Url") - var ret: ByteArray? = null - val task = FutureTask(Callable { - try { - val connection = getConnection(Url) - refer?.let { connection?.setRequestProperty("referer", it) } - - ret = connection?.inputStream?.readBytes() - connection?.disconnect() - } catch (ex: Exception) { - ex.printStackTrace() - } - return@Callable ret - }) - Thread(task).start() - return try { - task.get() - } catch (ex: Exception) { - ex.printStackTrace() - null - } - } - fun getHttpContent(Url: String, readSize: Int, refer: String? = "https://api.copymanga.com"): ByteArray? { Log.d("Mydl", "getHttp: $Url") var ret: ByteArray? = null val task = FutureTask(Callable { try { - val connection = getConnection(Url) - refer?.let { connection?.setRequestProperty("referer", it) } + val connection = getConnection(Url, "GET", refer)?.apply { + ret = inputStream.readBytes() + disconnect() + } val ci = connection?.inputStream if(readSize > 0) { @@ -126,8 +110,10 @@ object DownloadTools { var ret: ByteArray? = null val task = FutureTask(Callable { try { - val connection = getConnection(it) - refer?.let { connection?.setRequestProperty("referer", it) } + val connection = getConnection(it, "GET", refer)?.apply { + ret = inputStream.readBytes() + disconnect() + } val ci = connection?.inputStream ret = ci?.readBytes() @@ -148,33 +134,4 @@ object DownloadTools { return@replace URLEncoder.encode(match.value, "UTF-8") } } - - fun downloadUsingUrlRet(url: String?, f: File, refer: String?): Boolean { - Log.d("Mydl", "Ret Get url: $url, File: $f") - val task = FutureTask(Callable { - val connection = getConnection(replaceChineseCharacters(url)) - if(refer != null) connection?.setRequestProperty("referer", refer) - - if (f.exists()) f.delete() - else f.parentFile?.mkdirs() - f.parentFile?.let { - if (!it.canRead()) it.setReadable(true) - if (!it.canWrite()) it.setWritable(true) - } - val ci = connection?.inputStream - val fo = f.outputStream() - ci?.buffered()?.copyTo(fo) - fo.close() - ci?.close() - connection?.disconnect() - return@Callable true - }) - Thread(task).start() - return try { - task.get() - } catch (ex: Exception) { - ex.printStackTrace() - false - } - } } \ No newline at end of file diff --git a/app/src/main/java/top/fumiama/copymanga/ui/book/BookFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/book/BookFragment.kt index a08123e..5ef9c40 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/book/BookFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/book/BookFragment.kt @@ -54,7 +54,7 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) { } fun setStartRead() { - mainWeakReference?.get()?.apply { + if(bookHandler.chapterNames.isNotEmpty()) mainWeakReference?.get()?.apply { bookHandler.book?.results?.comic?.name?.let { name -> getPreferences(MODE_PRIVATE).getInt(name, -1).let { p -> this@BookFragment.lbbstart.apply { diff --git a/app/src/main/java/top/fumiama/copymanga/ui/book/BookHandler.kt b/app/src/main/java/top/fumiama/copymanga/ui/book/BookHandler.kt index f731815..801308b 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/book/BookHandler.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/book/BookHandler.kt @@ -253,19 +253,19 @@ class BookHandler(that: WeakReference, private val path: String) line = layoutInflater.inflate(R.layout.line_chapter, that.fbl, false) line?.lcc?.apply { lct.text = it.name - setOnClickListener { _ -> Reader.viewMangaAt(it.name, i) } + setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, i) } } fbl?.addView(line) } else { line = layoutInflater.inflate(R.layout.line_2chapters, that.fbl, false) line?.l2cl?.apply { lct.text = it.name - setOnClickListener { _ -> Reader.viewMangaAt(it.name, i) } + setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, i) } } } } else line?.l2cr?.apply { lct.text = it.name - setOnClickListener { _ -> Reader.viewMangaAt(it.name, i) } + setOnClickListener { Reader.viewMangaAt(book!!.results.comic.name, i) } fbl?.addView(line) line = null } diff --git a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/history/HistoryFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/history/HistoryFragment.kt new file mode 100644 index 0000000..c5c1211 --- /dev/null +++ b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/history/HistoryFragment.kt @@ -0,0 +1,22 @@ +package top.fumiama.copymanga.ui.cardflow.history + +import android.view.View +import kotlinx.android.synthetic.main.line_lazybooklines.* +import top.fumiama.copymanga.MainActivity +import top.fumiama.copymanga.template.ui.InfoCardLoader +import top.fumiama.dmzj.copymanga.R + +@OptIn(ExperimentalStdlibApi::class) +class HistoryFragment : InfoCardLoader(R.layout.fragment_history, R.id.action_nav_history_to_nav_book, isHistoryBook = true) { + override fun getApiUrl() = + getString(R.string.historyApiUrl).let { + String.format(it, page * 21) + } + + override fun onLoadFinish() { + super.onLoadFinish() + MainActivity.mainWeakReference?.get()?.runOnUiThread { + mypl.visibility = View.GONE + } + } +} diff --git a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/newest/NewestFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/newest/NewestFragment.kt index 2e61074..bbc0a0d 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/newest/NewestFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/newest/NewestFragment.kt @@ -19,4 +19,4 @@ class NewestFragment : InfoCardLoader(R.layout.fragment_newest, R.id.action_nav_ mypl.visibility = View.GONE } } -} \ No newline at end of file +} diff --git a/app/src/main/java/top/fumiama/copymanga/ui/history/HistoryFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/history/HistoryFragment.kt deleted file mode 100644 index 4cf5317..0000000 --- a/app/src/main/java/top/fumiama/copymanga/ui/history/HistoryFragment.kt +++ /dev/null @@ -1,19 +0,0 @@ -package top.fumiama.copymanga.ui.history - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import kotlinx.android.synthetic.main.fragment_history.* -import top.fumiama.dmzj.copymanga.R - -class HistoryFragment : Fragment() { - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - return inflater.inflate(R.layout.fragment_history, container, false) - } -} \ No newline at end of file diff --git a/app/src/main/java/top/fumiama/copymanga/ui/settings/SettingsFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/settings/SettingsFragment.kt index 9c3de13..b73cce1 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/settings/SettingsFragment.kt @@ -2,19 +2,17 @@ package top.fumiama.copymanga.ui.settings import android.content.SharedPreferences import android.os.Bundle -import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceManager -import androidx.preference.SeekBarPreference import top.fumiama.dmzj.copymanga.R class SettingsFragment: PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.pref_setting, rootKey) - settingsPref = context?.let { PreferenceManager.getDefaultSharedPreferences(it) } + if(settingsPref == null) settingsPref = context?.let { PreferenceManager.getDefaultSharedPreferences(it) } } companion object { - var settingsPref: SharedPreferences? = null + var settingsPref: SharedPreferences? = SettingsFragment().context?.let {PreferenceManager.getDefaultSharedPreferences(it)} } } diff --git a/app/src/main/java/top/fumiama/copymanga/ui/vm/ViewMangaActivity.kt b/app/src/main/java/top/fumiama/copymanga/ui/vm/ViewMangaActivity.kt index 29856a6..a889838 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/vm/ViewMangaActivity.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/vm/ViewMangaActivity.kt @@ -25,9 +25,7 @@ import kotlinx.android.synthetic.main.line_header.view.* import kotlinx.android.synthetic.main.page_imgview.* import kotlinx.android.synthetic.main.page_imgview.view.* import kotlinx.android.synthetic.main.page_scrollimgview.* -import kotlinx.android.synthetic.main.page_scrollimgview.view.* import kotlinx.android.synthetic.main.widget_infodrawer.* -import kotlinx.android.synthetic.main.widget_infodrawer.view.* import kotlinx.android.synthetic.main.widget_titlebar.* import kotlinx.android.synthetic.main.widget_titlebar.view.* import kotlinx.android.synthetic.main.widget_viewmangainfo.* @@ -43,7 +41,7 @@ import java.io.ByteArrayOutputStream import java.io.File import java.io.InputStream import java.lang.ref.WeakReference -import java.util.* +import top.fumiama.copymanga.ui.settings.SettingsFragment.Companion.settingsPref import java.util.concurrent.FutureTask import java.util.zip.ZipFile @@ -96,16 +94,16 @@ class ViewMangaActivity : TitleActivityTemplate() { //zipFirst = intent.getStringExtra("callFrom") == "zipFirst" cut = pb["useCut"] r2l = pb["r2l"] - verticalLoadMaxCount = p["verticalMax"].let { if(it > 0) it else 20 } + verticalLoadMaxCount = settingsPref?.getInt("settings_cat_vm_sb_vertical_max", 20)?.let { if(it > 0) it else 20 }?:20 isVertical = pb["vertical"] notUseVP = pb["noVP"] || isVertical //url = intent.getStringExtra("url") handler = VMHandler(this, if(urlArray.isNotEmpty()) urlArray[position] else "") - p["quality"].let { q = if (it > 0) it else 100 } + settingsPref?.getInt("settings_cat_vm_sb_quality", 100)?.let { q = if (it > 0) it else 100 } tt = TimeThread(handler, 22) tt.canDo = true tt.start() - volTurnPage = pb["volturn"] + volTurnPage = settingsPref?.getBoolean("settings_cat_vm_sw_vol_turn", false)?:false am = getSystemService(Service.AUDIO_SERVICE) as AudioManager Log.d("MyVM", "Now ZipFile is $zipFile") diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 38fef41..6eaa6d1 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -79,7 +79,7 @@ android:layout_marginTop="4dp" android:fontFamily="@font/calibri" android:gravity="center" - android:text="This is the third-party app for manga reading" + android:text="A third-party app for manga reading" android:textColor="#9affffff" android:textSize="10sp" /> @@ -102,9 +102,10 @@ @@ -117,6 +118,7 @@ + android:layout_height="match_parent"> - + android:layout_height="match_parent" /> \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 1c36912..2f62c08 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -83,9 +83,17 @@ + tools:layout="@layout/fragment_history" > + + 获取图书信息失败 网络错误 - https://api.copymanga.info/api/v3/h5/homeIndex?platform=3&format=json + https://api.copymanga.info/api/v3/h5/homeIndex?platform=3 "https://api.copymanga.info" - https://api.copymanga.info/api/v3/ranks?limit=21&offset=%1$d&date_type=%2$s&platform=3&format=json - https://api.copymanga.info/api/v3/search/comic?limit=21&offset=%1$d&q=%2$s&q_type=%3$s&platform=3&format=json - https://api.copymanga.info/api/v3/h5/filterIndex/comic/tags?platform=3&format=json - https://api.copymanga.info/api/v3/comics?limit=21&offset=%1$d&ordering=%2$s&theme=%3$s&platform=3&format=json - https://api.copymanga.info/api/v3/comic2/%1$s?platform=3&format=json - https://api.copymanga.info/api/v3/comic/%1$s/group/%2$s/chapters?limit=100&offset=%3$d&platform=3&format=json - https://api.copymanga.info/api/v3/comic/%1$s/chapter2/%2$s?platform=3&format=json - https://api.copymanga.info/api/v3/topic/%1$s?platform=3&format=json - https://api.copymanga.info/api/v3/topic/%1$s/contents?type=%2$d&limit=21&offset=%3$d&platform=3&format=json - https://api.copymanga.info/api/v3/recs?pos=3200102&limit=21&offset=%1$d&platform=3&format=json - https://api.copymanga.info/api/v3/update/newest?limit=21&offset=%1$d&platform=3&format=json - https://api.copymanga.info/api/v3/comics?limit=21&offset=%1$d&ordering=%2$s&top=finish&platform=3&format=json - https://api.copymanga.info/api/v3/comics?limit=21&offset=%1$d&ordering=%2$s&author=%3$s&platform=3&format=json - https://api.copymanga.info/api/v3/comics?limit=21&offset=%1$d&ordering=%2$s&theme=%3$s&platform=3&format=json + "api.copymanga.info" + https://api.copymanga.info/api/v3/ranks?limit=21&offset=%1$d&date_type=%2$s&platform=3 + https://api.copymanga.info/api/v3/search/comic?limit=21&offset=%1$d&q=%2$s&q_type=%3$s&platform=3 + https://api.copymanga.info/api/v3/h5/filterIndex/comic/tags?platform=3 + https://api.copymanga.info/api/v3/comics?limit=21&offset=%1$d&ordering=%2$s&theme=%3$s&platform=3 + https://api.copymanga.info/api/v3/comic2/%1$s?platform=3 + https://api.copymanga.info/api/v3/comic/%1$s/group/%2$s/chapters?limit=100&offset=%3$d&platform=3 + https://api.copymanga.info/api/v3/comic/%1$s/chapter2/%2$s?platform=3 + https://api.copymanga.info/api/v3/topic/%1$s?platform=3 + https://api.copymanga.info/api/v3/topic/%1$s/contents?type=%2$d&limit=21&offset=%3$d&platform=3 + https://api.copymanga.info/api/v3/recs?pos=3200102&limit=21&offset=%1$d&platform=3 + https://api.copymanga.info/api/v3/update/newest?limit=21&offset=%1$d&platform=3 + https://api.copymanga.info/api/v3/comics?limit=21&offset=%1$d&ordering=%2$s&top=finish&platform=3 + https://api.copymanga.info/api/v3/comics?limit=21&offset=%1$d&ordering=%2$s&author=%3$s&platform=3 + https://api.copymanga.info/api/v3/comics?limit=21&offset=%1$d&ordering=%2$s&theme=%3$s&platform=3 + https://api.copymanga.info/api/v3/login?platform=3 + https://api.copymanga.info/api/v3/member/info?platform=3 + https://api.copymanga.info/api/v3/member/browse/comics?limit=21&offset=%1$d&platform=3 已完结 @@ -56,7 +60,7 @@ LOWPAN 无网络 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36 Edg/86.0.622.38 + Dart/2.16 (dart:io) 更新时间 热度 @@ -92,4 +96,9 @@ 默认为20 图片质量 默认为100 - \ No newline at end of file + + + 用户名为空 + 密码为空 + 连接失败 + diff --git a/app/src/main/res/xml/pref_setting.xml b/app/src/main/res/xml/pref_setting.xml index ffda7ad..a065df5 100644 --- a/app/src/main/res/xml/pref_setting.xml +++ b/app/src/main/res/xml/pref_setting.xml @@ -22,7 +22,6 @@ app:title="@string/settings_cat_vm_sw_vol_turn" />