diff --git a/app/build.gradle b/app/build.gradle index 4393e75..55af945 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId 'top.fumiama.copymanga' minSdkVersion 23 targetSdkVersion 33 - versionCode 35 - versionName '2.0.beta23' + versionCode 36 + versionName '2.0.0' resConfigs 'zh', 'zh-rCN' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 34f7941..440a277 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,7 +2,6 @@ - - if(data.code == 200) { - pref.edit()?.apply { - putString("token", data.results?.token) - putString("user_id", data.results?.user_id) - putString("username", data.results?.username) - putString("nickname", data.results?.nickname) - apply() - DownloadTools.getHttpContent(getString(R.string.memberInfoApiUrl).format(CMApi.myHostApiUrl))?.decodeToString()?.let { - val l = Gson().fromJson(it, LoginInfoStructure::class.java) - if(l.code == 200) { - putString("avatar", l.results.avatar) - apply() - runOnUiThread { - MainActivity.mainWeakReference?.get()?.refreshUserInfo() - } - } 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, data.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() } + val l = MainActivity.member?.login(username, pwd, salt) + Log.d("MyLA", "login return code: ${l?.code}") + if (l?.code == 200) { + runOnUiThread { + MainActivity.mainWeakReference?.get()?.refreshUserInfo() + finish() + } + return@Thread } + runOnUiThread { Toast.makeText(this@LoginActivity, l?.message, Toast.LENGTH_SHORT).show() } }.start() } } diff --git a/app/src/main/java/top/fumiama/copymanga/MainActivity.kt b/app/src/main/java/top/fumiama/copymanga/MainActivity.kt index 49ece94..7ce7c32 100644 --- a/app/src/main/java/top/fumiama/copymanga/MainActivity.kt +++ b/app/src/main/java/top/fumiama/copymanga/MainActivity.kt @@ -45,9 +45,13 @@ import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.dmzj.copymanga.R import top.fumiama.copymanga.tools.api.UITools import top.fumiama.copymanga.ui.book.BookFragment.Companion.bookHandler +import top.fumiama.copymanga.ui.cardflow.rank.RankFragment import top.fumiama.copymanga.ui.comicdl.ComicDlFragment import top.fumiama.copymanga.ui.download.DownloadFragment +import top.fumiama.copymanga.ui.download.NewDownloadFragment import top.fumiama.copymanga.update.Update +import top.fumiama.copymanga.user.Member +import top.fumiama.dmzj.copymanga.BuildConfig import java.io.File import java.io.FileInputStream import java.lang.Thread.sleep @@ -60,11 +64,16 @@ class MainActivity : AppCompatActivity() { private lateinit var appBarConfiguration: AppBarConfiguration private lateinit var headPic: File + private lateinit var toolsBox: UITools + + private var latestDestination = 0 + private var isMenuWaiting = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mainWeakReference = WeakReference(this) + toolsBox = UITools(this) setContentView(R.layout.activity_main) setSupportActionBar(toolbar) @@ -108,10 +117,19 @@ class MainActivity : AppCompatActivity() { ime = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager navController!!.addOnDestinationChangedListener { _, destination, _ -> + latestDestination = destination.id + Log.d("MyMA", "latestDestination: $latestDestination") + if (isMenuWaiting) { + return@addOnDestinationChangedListener + } + isMenuWaiting = true + Log.d("MyMA", "start menu waiting") Thread { sleep(1000) + isMenuWaiting = false + Log.d("MyMA", "finish menu waiting") runOnUiThread { - when (destination.id) { + when (latestDestination) { R.id.nav_home -> { Log.d("MyMA", "enter home") menuMain?.findItem(R.id.action_info)?.isVisible = true @@ -130,6 +148,18 @@ class MainActivity : AppCompatActivity() { menuMain?.findItem(R.id.action_download)?.isVisible = false menuMain?.findItem(R.id.action_sort)?.isVisible = true } + R.id.nav_new_download -> { + Log.d("MyMA", "enter new_download") + menuMain?.findItem(R.id.action_info)?.isVisible = false + menuMain?.findItem(R.id.action_download)?.isVisible = false + menuMain?.findItem(R.id.action_sort)?.isVisible = true + } + R.id.nav_rank -> { + Log.d("MyMA", "enter rank") + menuMain?.findItem(R.id.action_info)?.isVisible = false + menuMain?.findItem(R.id.action_download)?.isVisible = false + menuMain?.findItem(R.id.action_sort)?.isVisible = true + } else -> { Log.d("MyMA", "enter others") menuMain?.findItem(R.id.action_info)?.isVisible = false @@ -149,6 +179,7 @@ class MainActivity : AppCompatActivity() { return true } + @OptIn(ExperimentalStdlibApi::class) override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.action_info -> { @@ -161,6 +192,8 @@ class MainActivity : AppCompatActivity() { } R.id.action_sort -> { ComicDlFragment.handler?.sendEmptyMessage(13) + NewDownloadFragment.wn?.get()?.showReverseInfo(toolsBox) + RankFragment.wr?.get()?.showSexInfo(toolsBox) true } else -> super.onOptionsItemSelected(item) @@ -320,14 +353,14 @@ class MainActivity : AppCompatActivity() { private fun checkUpdate(ignoreSkip: Boolean) { Thread{ - Update.checkUpdate(this, UITools(this), ignoreSkip) + Update.checkUpdate(this, toolsBox, ignoreSkip) }.start() } private fun showAbout() { val dl = android.app.AlertDialog.Builder(this) dl.setMessage(R.string.app_description) - dl.setTitle(R.string.action_info) + dl.setTitle("${getString(R.string.action_info)} ${BuildConfig.VERSION_NAME}") dl.setIcon(R.mipmap.ic_launcher) dl.setPositiveButton(android.R.string.ok) { _, _ -> } dl.setNeutralButton(R.string.check_update) {_, _ -> @@ -368,9 +401,22 @@ class MainActivity : AppCompatActivity() { if (field != null) return field return mainWeakReference?.get()?.let { field = Shelf( - it.getPreferences(Context.MODE_PRIVATE).getString("token", "")?:return@let null, - it.getString(R.string.shelfOperateApiUrl).format(CMApi.myHostApiUrl), it.getString(R.string.referer), it.getString(R.string.pc_ua) - ) + it.getPreferences(Context.MODE_PRIVATE) + .getString("token", "")?:return@let null) { id -> + return@Shelf it.getString(id) + } + field + } + } + var member: Member? = null + get() { + if (field != null) return field + return mainWeakReference?.get()?.let { + it.getPreferences(MODE_PRIVATE)?.let { pref -> + field = Member(pref) { id -> + return@Member it.getString(id) + } + } field } } diff --git a/app/src/main/java/top/fumiama/copymanga/json/BookQueryStructure.java b/app/src/main/java/top/fumiama/copymanga/json/BookQueryStructure.java new file mode 100644 index 0000000..8975d1a --- /dev/null +++ b/app/src/main/java/top/fumiama/copymanga/json/BookQueryStructure.java @@ -0,0 +1,21 @@ +package top.fumiama.copymanga.json; + +public class BookQueryStructure extends ReturnBase { + public Results results; + public static class Results{ + public Browse browse; + public int collect; + public boolean is_lock; + public boolean is_login; + public boolean is_mobile_bind; + public boolean is_vip; + public static class Browse { + public String comic_uuid; + public String comic_id; + public String path_word; + public String chapter_uuid; + public String chapter_id; + public String chapter_name; + } + } +} diff --git a/app/src/main/java/top/fumiama/copymanga/json/FilterStructure.java b/app/src/main/java/top/fumiama/copymanga/json/FilterStructure.java index a08fe10..8ddb6b3 100644 --- a/app/src/main/java/top/fumiama/copymanga/json/FilterStructure.java +++ b/app/src/main/java/top/fumiama/copymanga/json/FilterStructure.java @@ -4,5 +4,6 @@ public class FilterStructure extends ReturnBase { public Results results; public static class Results{ public ThemeStructure[] theme; + public ThemeStructure[] top; } } diff --git a/app/src/main/java/top/fumiama/copymanga/json/HistoryComicStructure.java b/app/src/main/java/top/fumiama/copymanga/json/HistoryComicStructure.java index e905960..179504f 100644 --- a/app/src/main/java/top/fumiama/copymanga/json/HistoryComicStructure.java +++ b/app/src/main/java/top/fumiama/copymanga/json/HistoryComicStructure.java @@ -13,4 +13,13 @@ public class HistoryComicStructure { public String datetime_updated; public String last_chapter_id; public String last_chapter_name; + public Browse browse; + + public static class Browse { + public String comic_uuid; + public String path_word; + public String chapter_uuid; + public String chapter_name; + + } } 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 a2f5e93..8fe0ecd 100644 --- a/app/src/main/java/top/fumiama/copymanga/manga/Reader.kt +++ b/app/src/main/java/top/fumiama/copymanga/manga/Reader.kt @@ -4,8 +4,11 @@ import android.content.Context import android.content.Intent import android.util.Log import androidx.core.content.edit +import com.google.gson.Gson import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference +import top.fumiama.copymanga.json.VolumeStructure import top.fumiama.copymanga.ui.vm.ViewMangaActivity +import java.io.File object Reader { fun viewMangaAt(name: String, pos: Int, fromFirstPage: Boolean = false) { @@ -35,4 +38,23 @@ object Reader { } } } -} \ No newline at end of file + fun getComicPathWordInFile(file: File): String { + if(!file.exists()) { + return "N/A:!file.exists()" + } + val jsonFile = File(file, "info.json") + if(!jsonFile.exists()) { + return "N/A:!jsonFile.exists()" + } + Gson().fromJson(jsonFile.readText(), Array::class.java)?.let { volumes -> + if(volumes.isEmpty()) { + return "N/A:volumes.isEmpty()" + } + if(volumes[0].results.list.isEmpty()) { + return "N/A:volumes[0].results.list.isEmpty()" + } + return volumes[0].results.list[0].comic_path_word + } + return "N/A:null_gson" + } +} diff --git a/app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt b/app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt index f74e91a..818278e 100644 --- a/app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt +++ b/app/src/main/java/top/fumiama/copymanga/manga/Shelf.kt @@ -1,11 +1,17 @@ package top.fumiama.copymanga.manga -import android.content.SharedPreferences import com.google.gson.Gson +import top.fumiama.copymanga.json.BookQueryStructure import top.fumiama.copymanga.json.ReturnBase import top.fumiama.copymanga.tools.http.DownloadTools +import top.fumiama.dmzj.copymanga.R -class Shelf(private val token: String, private val apiUrl: String, private val referer: String, private val ua: String) { +class Shelf(private val token: String, getString: (Int) -> String) { + private val hostUrl: String = getString(R.string.hostUrl) + private val apiUrl: String = getString(R.string.shelfOperateApiUrl).format(hostUrl) + private val queryApiUrl = getString(R.string.bookUserQueryApiUrl) + private val referer: String = getString(R.string.referer) + private val ua: String = getString(R.string.pc_ua) fun add(comicId: String): String { if (comicId.isEmpty()) { return "空漫画ID" @@ -41,4 +47,13 @@ class Shelf(private val token: String, private val apiUrl: String, private val r )?.decodeToString() ?: return "空回应" return Gson().fromJson(re, ReturnBase::class.java).message } + + fun query(pathWord: String): BookQueryStructure { + DownloadTools.getHttpContent(queryApiUrl.format(hostUrl, pathWord), referer, ua)?.let { + return Gson().fromJson(it.decodeToString(), BookQueryStructure::class.java) + } + val b = BookQueryStructure() + b.code = 400 + return b + } } diff --git a/app/src/main/java/top/fumiama/copymanga/template/general/MangaPagesFragmentTemplate.kt b/app/src/main/java/top/fumiama/copymanga/template/general/MangaPagesFragmentTemplate.kt index ad9fcf0..fe36167 100644 --- a/app/src/main/java/top/fumiama/copymanga/template/general/MangaPagesFragmentTemplate.kt +++ b/app/src/main/java/top/fumiama/copymanga/template/general/MangaPagesFragmentTemplate.kt @@ -1,16 +1,22 @@ package top.fumiama.copymanga.template.general import android.annotation.SuppressLint +import android.content.Context +import android.net.ConnectivityManager +import android.net.NetworkCapabilities import android.os.Bundle import android.util.JsonReader import android.util.Log import android.view.View import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import com.liaoinstan.springview.widget.SpringView import kotlinx.android.synthetic.main.line_header.view.* import kotlinx.android.synthetic.main.line_lazybooklines.* +import top.fumiama.copymanga.MainActivity import top.fumiama.copymanga.template.ui.CardList -import top.fumiama.copymanga.template.handler.MPATHandler import top.fumiama.copymanga.tools.api.UITools +import top.fumiama.dmzj.copymanga.R import java.lang.Thread.sleep import java.lang.ref.WeakReference @@ -19,23 +25,51 @@ open class MangaPagesFragmentTemplate(inflateRes:Int, val isLazy: Boolean = true var cardWidth = 0 var cardHeight = 0 var cardList: CardList? = null - var mh: MPATHandler? = null - var row: View? = null + //var row: View? = null var isEnd = false - var jsonReaderNow: JsonReader? = null + //var jsonReaderNow: JsonReader? = null var page = 0 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") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if(isFirstInflate) { - mh = MPATHandler(WeakReference(this)) + if (!forceLoad && (netInfo == transportStringNull || netInfo == transportStringError)) { + findNavController().popBackStack() + return + } Thread { sleep(600) - mh?.sendEmptyMessage(0) + MainActivity.mainWeakReference?.get()?.runOnUiThread { + setLayouts() + } }.start() } } @@ -43,12 +77,11 @@ open class MangaPagesFragmentTemplate(inflateRes:Int, val isLazy: Boolean = true override fun onDestroy() { super.onDestroy() cardList?.exitCardList = true - mh = null - row = null - jsonReaderNow = null + //row = null + //jsonReaderNow = null } - fun setLayouts() { + open fun setLayouts() { val toolsBox = this.context?.let { UITools(it) } val widthData = toolsBox?.calcWidthFromDp(8, 135) cardPerRow = widthData?.get(0) ?: 3 @@ -59,17 +92,47 @@ open class MangaPagesFragmentTemplate(inflateRes:Int, val isLazy: Boolean = true Log.d("MyMPAT", "Card per row: $cardPerRow") Log.d("MyMPAT", "Card width: $cardWidth") - pageHandler?.initCardList(WeakReference(this)) - Thread { mh?.sendEmptyMessage(1) }.start() - pageHandler?.setListeners() + initCardList(WeakReference(this)) + managePage() + setListeners() //mypl.visibility = View.GONE } - var pageHandler: PageHandler? = null - - interface PageHandler { - fun addPage() - fun initCardList(weakReference: WeakReference) - fun setListeners() + private fun managePage() { + addPage() + if (isLazy) mysp.setListener(object : SpringView.OnFreshListener { + override fun onLoadmore() { + addPage() + } + override fun onRefresh() { + reset() + Thread { + sleep(600) + MainActivity.mainWeakReference?.get()?.runOnUiThread { + addPage() + } + }.start() + } + }) } + + open fun addPage() {} + + open fun onLoadFinish() { + //myp?.visibility = View.GONE + mysp?.onFinishFreshAndLoad() + //mys?.fullScroll(ScrollView.FOCUS_UP) + } + + open fun reset() { + mydll.removeAllViews() + isEnd = false + page = 0 + cardList?.reset() + mypl?.visibility = View.VISIBLE + } + + open fun initCardList(weakReference: WeakReference) {} + + open fun setListeners() {} } \ No newline at end of file diff --git a/app/src/main/java/top/fumiama/copymanga/template/handler/MPATHandler.kt b/app/src/main/java/top/fumiama/copymanga/template/handler/MPATHandler.kt deleted file mode 100644 index 1cf52fb..0000000 --- a/app/src/main/java/top/fumiama/copymanga/template/handler/MPATHandler.kt +++ /dev/null @@ -1,83 +0,0 @@ -package top.fumiama.copymanga.template.handler - -import android.content.Context -import android.net.ConnectivityManager -import android.net.NetworkCapabilities -import android.os.Handler -import android.os.Message -import android.view.View -import android.widget.Toast -import com.liaoinstan.springview.widget.SpringView -import top.fumiama.dmzj.copymanga.R -import kotlinx.android.synthetic.main.line_lazybooklines.* -import top.fumiama.copymanga.template.general.MangaPagesFragmentTemplate -import java.lang.ref.WeakReference - - -class MPATHandler(private val w: WeakReference) : Handler() { - private val wa get() = w.get() - private val netinfo: String - get() { - val cm: ConnectivityManager = - wa?.context?.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - return cm.getNetworkCapabilities(cm.activeNetwork)?.let { - when { - it.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> return@let wa?.context?.getString( - R.string.TRANSPORT_WIFI) - it.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> return@let wa?.context?.getString( - R.string.TRANSPORT_CELLULAR) - it.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) -> return@let wa?.context?.getString( - R.string.TRANSPORT_BLUETOOTH) - it.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> return@let wa?.context?.getString( - R.string.TRANSPORT_ETHERNET) - it.hasTransport(NetworkCapabilities.TRANSPORT_LOWPAN) -> return@let wa?.context?.getString( - R.string.TRANSPORT_LOWPAN) - it.hasTransport(NetworkCapabilities.TRANSPORT_VPN) -> return@let "VPN" - else -> return@let wa?.context?.getString(R.string.TRANSPORT_NULL) - } - } ?: "错误" - } - override fun handleMessage(msg: Message) { - super.handleMessage(msg) - if (wa?.forceLoad == true || netinfo != "无网络" && netinfo != "错误") { - when (msg.what) { - 0 -> wa?.setLayouts() - 1 -> managePage() - 2 -> addPageHandler() - 3 -> { - wa?.pageHandler?.addPage() - //wa?.myp?.visibility = View.GONE - wa?.mysp?.onFinishFreshAndLoad() - //wa?.mys?.fullScroll(ScrollView.FOCUS_UP) - } - 4 ->{ - wa?.mydll?.removeAllViews() - wa?.isEnd = false - wa?.jsonReaderNow = null - wa?.page = 0 - wa?.cardList?.reset() - addPageHandler() - wa?.mysp?.onFinishFreshAndLoad() - wa?.mypl?.visibility = View.VISIBLE - } - } - } else Toast.makeText(wa?.context, "${netinfo}链接!", Toast.LENGTH_SHORT).show() - } - - private fun managePage() { - addPageHandler() - if (wa?.isLazy == true) wa?.mysp?.setListener(object :SpringView.OnFreshListener{ - override fun onLoadmore() { - Thread { this@MPATHandler.sendEmptyMessage(2) }.start() - } - override fun onRefresh() { - Thread { this@MPATHandler.sendEmptyMessage(4) }.start() - } - }) - } - - private fun addPageHandler() { - //wa?.myp?.visibility = View.VISIBLE - Thread { this.sendEmptyMessage(3) }.start() - } -} \ No newline at end of file diff --git a/app/src/main/java/top/fumiama/copymanga/template/http/AutoDownloadHandler.kt b/app/src/main/java/top/fumiama/copymanga/template/http/AutoDownloadHandler.kt index 60d55eb..3170dba 100644 --- a/app/src/main/java/top/fumiama/copymanga/template/http/AutoDownloadHandler.kt +++ b/app/src/main/java/top/fumiama/copymanga/template/http/AutoDownloadHandler.kt @@ -11,12 +11,14 @@ import top.fumiama.copymanga.json.ReturnBase import top.fumiama.copymanga.tools.http.DownloadTools import top.fumiama.copymanga.tools.thread.TimeThread import java.io.File +import java.lang.Thread.sleep import java.security.MessageDigest open class AutoDownloadHandler(private val url: String, private val jsonClass: Class<*>, looper: Looper, private val callCheckMsg: Int = -1, private val loadFromCache: Boolean = false, private val customCacheFile: File? = null): Handler(looper) { var exit = false private var timeThread: TimeThread? = null private var checkTimes = 0 + private var cnt = 0 override fun handleMessage(msg: Message) { super.handleMessage(msg) when(msg.what){ @@ -72,6 +74,8 @@ open class AutoDownloadHandler(private val url: String, private val jsonClass: C DownloadTools.getHttpContent(url, null, mainWeakReference?.get()?.getString(R.string.pc_ua)!!).let { if(exit) return if(it == null) { + if (cnt++>3) return + sleep(1000) dlThread() return } diff --git a/app/src/main/java/top/fumiama/copymanga/template/ui/CardList.kt b/app/src/main/java/top/fumiama/copymanga/template/ui/CardList.kt index ec128f1..3489fc9 100644 --- a/app/src/main/java/top/fumiama/copymanga/template/ui/CardList.kt +++ b/app/src/main/java/top/fumiama/copymanga/template/ui/CardList.kt @@ -70,7 +70,7 @@ class CardList( } @ExperimentalStdlibApi - fun addCard(name: String, append: String? = null, head: String? = null, path: String? = null, chapterUUID: String? = null, pn: Int? = null, isFinish: Boolean = false){ + fun addCard(name: String, append: String? = null, head: String? = null, path: String? = null, chapterUUID: String? = null, pn: Int? = null, isFinish: Boolean = false, isNew: Boolean = false){ if(exitCardList) return manageRow() that?.layoutInflater?.inflate(R.layout.card_book, that.mydll.ltbtn, false)?.let { @@ -83,6 +83,7 @@ class CardList( card.chapterUUID = chapterUUID card.pageNumber = pn card.isFinish = isFinish + card.isNew = isNew mainWeakReference?.get()?.runOnUiThread{ if(exitCardList) return@runOnUiThread addCard(it) @@ -115,6 +116,7 @@ class CardList( if(img.exists()) it.imic.setImageURI(Uri.fromFile(img)) } if(card.isFinish) it.sgnic.visibility = View.VISIBLE + if(card.isNew) it.sgnnew.visibility = View.VISIBLE initClickListeners?.prepareListeners(card, card.name, card.path, card.chapterUUID, card.pageNumber) rows[card.index % 20]?.ltbtn?.addView(it) it.layoutParams?.height = cardHeight 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 57e2f9b..429316d 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 @@ -22,92 +22,103 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT var offset = 0 private val subUrl get() = getApiUrl() var ad: AutoDownloadThread? = null - init { - pageHandler = object : PageHandler { - override fun addPage(){ - ad = AutoDownloadThread(subUrl){ - if(isRefresh){ - page = 0 - isRefresh = false - } - if(isTypeBook) { - val bookList = Gson().fromJson(it?.decodeToString(), TypeBookListStructure::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 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 if (isShelfBook) { - val bookList = Gson().fromJson(it?.decodeToString(), ShelfStructure::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 { - 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.name, null, book.cover, book.path_word, null, null, false) - } - offset += results.list.size - } - } - page++ - } - } - onLoadFinish() - } - ad?.start() + + override fun addPage(){ + super.addPage() + ad = AutoDownloadThread(subUrl) { + if(isRefresh){ + page = 0 + isRefresh = false } - override fun initCardList(weakReference: WeakReference) { - cardList = CardList(weakReference, cardWidth, cardHeight, cardPerRow) - cardList?.initClickListeners = object : CardList.InitClickListeners { - override fun prepareListeners(v: View, name: String, path: String?, chapterUUID: String?, pn: Int?) { - v.setOnClickListener { - val bundle = Bundle() - bundle.putString("path", path) - Navigate.safeNavigateTo(findNavController(), navId, bundle) + if(isTypeBook) { + val bookList = Gson().fromJson(it?.decodeToString(), TypeBookListStructure::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", null, book?.comic?.cover, + book?.comic?.path_word, null, null, + isFinish = false, isNew = false + ) + } + offset += results.list.size } } + 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", "\n最新${book?.last_chapter_name}", book?.comic?.cover, + book?.comic?.path_word, null, null, + book?.comic?.status==1 + ) + } + offset += results.list.size + } + } + page++ + } + } else if (isShelfBook) { + val bookList = Gson().fromJson(it?.decodeToString(), ShelfStructure::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", "\n读到${book?.last_browse?.last_browse_name}", book?.comic?.cover, + book?.comic?.path_word, null, null, + book?.comic?.status==1, + book.comic?.browse?.chapter_uuid != book.comic?.last_chapter_id + ) + } + offset += results.list.size + } + } + page++ + } + } else { + val bookList = Gson().fromJson(it?.decodeToString(), BookListStructure::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?.name?:"null", null, book?.cover, book?.path_word, null, null, false) + } + offset += results.list.size + } + } + page++ + } + } + onLoadFinish() + } + ad?.start() + } + override fun initCardList(weakReference: WeakReference) { + super.initCardList(weakReference) + cardList = CardList(weakReference, cardWidth, cardHeight, cardPerRow) + cardList?.initClickListeners = object : CardList.InitClickListeners { + override fun prepareListeners(v: View, name: String, path: String?, chapterUUID: String?, pn: Int?) { + v.setOnClickListener { + val bundle = Bundle() + bundle.putString("path", path) + Navigate.safeNavigateTo(findNavController(), navId, bundle) } } - override fun setListeners() { this@InfoCardLoader.setListeners() } } } @@ -115,14 +126,18 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT return "" } - open fun setListeners(){} - - open fun onLoadFinish(){ + override fun onLoadFinish() { + super.onLoadFinish() MainActivity.mainWeakReference?.get()?.runOnUiThread { if(ad?.exit != true) mypl.visibility = View.GONE } } + override fun reset() { + super.reset() + offset = 0 + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ad?.exit = false diff --git a/app/src/main/java/top/fumiama/copymanga/template/ui/StatusCardFlow.kt b/app/src/main/java/top/fumiama/copymanga/template/ui/StatusCardFlow.kt index 64a506b..42ed44f 100644 --- a/app/src/main/java/top/fumiama/copymanga/template/ui/StatusCardFlow.kt +++ b/app/src/main/java/top/fumiama/copymanga/template/ui/StatusCardFlow.kt @@ -4,7 +4,6 @@ import android.animation.ObjectAnimator import android.view.View import kotlinx.android.synthetic.main.anchor_popular.view.* import kotlinx.android.synthetic.main.line_finish.* -import kotlinx.android.synthetic.main.line_lazybooklines.* import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.dmzj.copymanga.R @@ -40,7 +39,10 @@ open class StatusCardFlow(private val api: Int, nav: Int) : InfoCardLoader(R.lay } Thread{ Thread.sleep(400) - mh?.sendEmptyMessage(4) + mainWeakReference?.get()?.runOnUiThread { + reset() + addPage() + } }.start() } } @@ -59,7 +61,10 @@ open class StatusCardFlow(private val api: Int, nav: Int) : InfoCardLoader(R.lay } Thread { Thread.sleep(400) - mh?.sendEmptyMessage(4) + mainWeakReference?.get()?.runOnUiThread { + reset() + addPage() + } }.start() } } diff --git a/app/src/main/java/top/fumiama/copymanga/tools/file/FileUtils.kt b/app/src/main/java/top/fumiama/copymanga/tools/file/FileUtils.kt index a5f3984..b783fa7 100644 --- a/app/src/main/java/top/fumiama/copymanga/tools/file/FileUtils.kt +++ b/app/src/main/java/top/fumiama/copymanga/tools/file/FileUtils.kt @@ -11,4 +11,12 @@ object FileUtils { } f.delete() } + fun sizeOf(f: File): Long{ + var size = 0L + if (f.isDirectory) f.listFiles()?.apply { + for (i in this) + size += if (i.isDirectory) sizeOf(i) else i.length() + } + return size + } } \ 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 6809ecc..a9e8664 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 @@ -1,5 +1,6 @@ package top.fumiama.copymanga.ui.book +import android.annotation.SuppressLint import android.content.Context.MODE_PRIVATE import android.os.Bundle import android.util.Log @@ -7,6 +8,7 @@ import android.view.View import android.widget.Toast import androidx.navigation.fragment.findNavController import com.google.gson.Gson +import kotlinx.android.synthetic.main.line_bookinfo_text.* import kotlinx.android.synthetic.main.line_booktandb.* import top.fumiama.copymanga.MainActivity import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference @@ -100,18 +102,49 @@ class BookFragment: NoBackRefreshFragment(R.layout.fragment_book) { } } + @SuppressLint("SetTextI18n") fun setAddToShelf() { - if(bookHandler?.chapterNames?.isNotEmpty() == true) + if(bookHandler?.chapterNames?.isNotEmpty() == true) { + val b = MainActivity.shelf?.query(bookHandler?.path!!) + bookHandler?.collect = b?.results?.collect?:-2 + Log.d("MyBF", "get collect of ${bookHandler?.path} = ${bookHandler?.collect}") + b?.results?.browse?.chapter_name?.let { name -> + btsub.text = "${btsub.text} ${getString(R.string.text_format_cloud_read_to).format(name)}" + } + bookHandler?.collect?.let { collect -> + if (collect > 0) { + this@BookFragment.lbbsub.setText(R.string.button_sub_subscribed) + } + } bookHandler?.book?.results?.comic?.let { comic -> this@BookFragment.lbbsub.setOnClickListener { + if (this@BookFragment.lbbsub.text != getString(R.string.button_sub)) { + bookHandler?.collect?.let { collect -> + if (collect < 0) return@setOnClickListener + Thread{ + val re = MainActivity.shelf?.del(collect) + mainWeakReference?.get()?.runOnUiThread { + Toast.makeText(context, re, Toast.LENGTH_SHORT).show() + if (re == "请求成功") { + this@BookFragment.lbbsub.setText(R.string.button_sub) + } + } + }.start() + } + return@setOnClickListener + } Thread{ val re = MainActivity.shelf?.add(comic.uuid) mainWeakReference?.get()?.runOnUiThread { Toast.makeText(context, re, Toast.LENGTH_SHORT).show() + if (re == "修改成功") { + this@BookFragment.lbbsub.setText(R.string.button_sub_subscribed) + } } }.start() } } + } } fun navigate2dl(){ 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 5a40d5c..10e4d2b 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 @@ -43,7 +43,7 @@ import java.io.File import java.lang.Thread.sleep import java.lang.ref.WeakReference -class BookHandler(private val th: WeakReference, private val path: String) +class BookHandler(private val th: WeakReference, val path: String) : AutoDownloadHandler(th.get()?.getString(R.string.bookInfoApiUrl)?.format(CMApi.myHostApiUrl, path)?: "", BookInfoStructure::class.java, Looper.myLooper()!!){ @@ -62,6 +62,7 @@ class BookHandler(private val th: WeakReference, private val path: var cnts = intArrayOf() var vols: Array? = null var chapterNames = arrayOf() + var collect: Int = -1 private val divider get() = that?.layoutInflater?.inflate(R.layout.div_h, that?.fbl, false) override fun handleMessage(msg: Message) { @@ -133,8 +134,8 @@ class BookHandler(private val th: WeakReference, private val path: fbl.addView(fbibinfo) } catch (e: Exception) { e.printStackTrace() - (fbibinfo!!.parent as LinearLayout).removeAllViews() - fbl.addView(fbibinfo) + (fbibinfo?.parent as LinearLayout?)?.removeAllViews() + fbl?.addView(fbibinfo) } book?.results?.comic?.cover?.let { cover -> val load = Glide.with(this).load( @@ -145,8 +146,8 @@ class BookHandler(private val th: WeakReference, private val path: ?.let { it2 -> RequestOptions.bitmapTransform(it2) } ?.let { it3 -> load.apply(it3).into(lbibg) } } - imf.visibility = View.GONE - fbl.addView(divider) + imf?.visibility = View.GONE + fbl?.addView(divider) } } diff --git a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/rank/RankFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/rank/RankFragment.kt index 7c408ef..b816af5 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/rank/RankFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/rank/RankFragment.kt @@ -1,23 +1,52 @@ package top.fumiama.copymanga.ui.cardflow.rank +import android.os.Bundle import com.google.android.material.tabs.TabLayout import kotlinx.android.synthetic.main.fragment_rank.* import kotlinx.android.synthetic.main.line_rank.view.* +import top.fumiama.copymanga.MainActivity import top.fumiama.copymanga.template.ui.InfoCardLoader import top.fumiama.copymanga.tools.api.CMApi +import top.fumiama.copymanga.tools.api.UITools +import top.fumiama.copymanga.ui.download.NewDownloadFragment import top.fumiama.dmzj.copymanga.R import java.lang.Thread.sleep +import java.lang.ref.WeakReference @ExperimentalStdlibApi class RankFragment : InfoCardLoader(R.layout.fragment_rank, R.id.action_nav_rank_to_nav_book, true) { private val sortWay = listOf("day", "week", "month", "total") private var sortValue = 0 + private val audienceWay = listOf("", "male", "female") + private var audience = 0 // 0 all 1 male 2 female + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + wr = WeakReference(this) + } + + override fun onPause() { + super.onPause() + ad?.exit = true + } + + override fun onResume() { + super.onResume() + ad?.exit = true + } + + override fun onDestroy() { + super.onDestroy() + wr = null + ad?.exit = true + } override fun getApiUrl() = getString(R.string.rankApiUrl).format( CMApi.myHostApiUrl, page * 21, - sortWay[sortValue] + sortWay[sortValue], + audienceWay[audience] ) override fun setListeners() { @@ -37,7 +66,41 @@ class RankFragment : InfoCardLoader(R.layout.fragment_rank, R.id.action_nav_rank sortValue = value Thread{ sleep(400) - if(ad?.exit != true) mh?.sendEmptyMessage(4) + if(ad?.exit != true) MainActivity.mainWeakReference?.get()?.runOnUiThread { + reset() + addPage() + } }.start() } + + fun showSexInfo(toolsBox: UITools) { + if (ad?.exit != false) return + toolsBox.buildInfo("切换类型", "选择一种想筛选的漫画类型", + "男频", "全部", "女频", { + audience = 1 + reset() + Thread { + sleep(600) + addPage() + }.start() + }, { + audience = 0 + reset() + Thread { + sleep(600) + addPage() + }.start() + }, { + audience = 2 + reset() + Thread { + sleep(600) + addPage() + }.start() + }) + } + + companion object { + var wr: WeakReference? = null + } } diff --git a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/shelf/ShelfFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/shelf/ShelfFragment.kt index 55fe22e..3eb0812 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/shelf/ShelfFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/shelf/ShelfFragment.kt @@ -3,6 +3,7 @@ package top.fumiama.copymanga.ui.cardflow.shelf import android.animation.ObjectAnimator import kotlinx.android.synthetic.main.anchor_popular.view.* import kotlinx.android.synthetic.main.line_shelf.* +import top.fumiama.copymanga.MainActivity import top.fumiama.copymanga.template.ui.InfoCardLoader import top.fumiama.copymanga.tools.api.CMApi import top.fumiama.dmzj.copymanga.R @@ -47,7 +48,10 @@ class ShelfFragment : InfoCardLoader(R.layout.fragment_shelf, R.id.action_nav_su } Thread { sleep(400) - mh?.sendEmptyMessage(4) + MainActivity.mainWeakReference?.get()?.runOnUiThread { + reset() + addPage() + } }.start() } } @@ -65,7 +69,10 @@ class ShelfFragment : InfoCardLoader(R.layout.fragment_shelf, R.id.action_nav_su } Thread { sleep(400) - mh?.sendEmptyMessage(4) + MainActivity.mainWeakReference?.get()?.runOnUiThread { + reset() + addPage() + } }.start() } } @@ -83,7 +90,10 @@ class ShelfFragment : InfoCardLoader(R.layout.fragment_shelf, R.id.action_nav_su } Thread { sleep(400) - mh?.sendEmptyMessage(4) + MainActivity.mainWeakReference?.get()?.runOnUiThread { + reset() + addPage() + } }.start() } } diff --git a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/sort/SortFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/sort/SortFragment.kt index b0fc7c0..d149277 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/sort/SortFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/sort/SortFragment.kt @@ -15,8 +15,9 @@ import java.lang.Thread.sleep @ExperimentalStdlibApi class SortFragment : InfoCardLoader(R.layout.fragment_sort, R.id.action_nav_sort_to_nav_book) { - private val sortWay = listOf("-datetime_updated", "datetime_updated", "-popular", "popular") + private val sortWay = listOf("datetime_updated", "-datetime_updated", "-popular", "popular") private var theme = -1 + private var region = -1 private var sortValue = 0 private var filter: FilterStructure? = null @@ -25,7 +26,8 @@ class SortFragment : InfoCardLoader(R.layout.fragment_sort, R.id.action_nav_sort CMApi.myHostApiUrl, page * 21, sortWay[sortValue], - if(theme >= 0) (filter?.results?.theme?.get(theme)?.path_word ?: "") else "" + if(theme >= 0) (filter?.results?.theme?.get(theme)?.path_word ?: "") else "", + if(region >= 0) (filter?.results?.top?.get(region)?.path_word ?: "") else "", ) override fun setListeners() { @@ -57,12 +59,57 @@ class SortFragment : InfoCardLoader(R.layout.fragment_sort, R.id.action_nav_sort } Thread{ sleep(400) - mh?.sendEmptyMessage(4) + mainWeakReference?.get()?.runOnUiThread { + reset() + addPage() + } }.start() } } private fun setClasses(){ + filter?.results?.top?.let { items -> + if(ad?.exit == true) return@let + line_sort_region.apt.text = "全部" + line_sort_region.setOnClickListener { + val popupMenu = popupMenu { + style = R.style.Widget_MPM_Menu_Dark_CustomBackground + section { + item { + label = "全部" + labelColor = it.apt.currentTextColor + callback = { + region = -1 + it.apt.text = "全部" + Thread{ + sleep(400) + mainWeakReference?.get()?.runOnUiThread { + reset() + addPage() + } + }.start() + } + } + for(i in items.indices) item { + label = items[i].name + labelColor = it.apt.currentTextColor + callback = { //optional + it.apt.text = label + region = i + Thread{ + sleep(400) + mainWeakReference?.get()?.runOnUiThread { + reset() + addPage() + } + }.start() + } + } + } + } + this.context?.let { it1 -> popupMenu.show(it1, it) } + } + } filter?.results?.theme?.let { items -> if(ad?.exit == true) return@let line_sort_class.apt.text = "全部" @@ -78,7 +125,10 @@ class SortFragment : InfoCardLoader(R.layout.fragment_sort, R.id.action_nav_sort it.apt.text = "全部" Thread{ sleep(400) - mh?.sendEmptyMessage(4) + mainWeakReference?.get()?.runOnUiThread { + reset() + addPage() + } }.start() } } @@ -90,7 +140,10 @@ class SortFragment : InfoCardLoader(R.layout.fragment_sort, R.id.action_nav_sort theme = i Thread{ sleep(400) - mh?.sendEmptyMessage(4) + mainWeakReference?.get()?.runOnUiThread { + reset() + addPage() + } }.start() } } @@ -114,7 +167,10 @@ class SortFragment : InfoCardLoader(R.layout.fragment_sort, R.id.action_nav_sort } Thread { sleep(400) - mh?.sendEmptyMessage(4) + mainWeakReference?.get()?.runOnUiThread { + reset() + addPage() + } }.start() } } diff --git a/app/src/main/java/top/fumiama/copymanga/ui/comicdl/ComicDlHandler.kt b/app/src/main/java/top/fumiama/copymanga/ui/comicdl/ComicDlHandler.kt index c8f5ead..caa6513 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/comicdl/ComicDlHandler.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/comicdl/ComicDlHandler.kt @@ -210,14 +210,12 @@ class ComicDlHandler(looper: Looper, private val th: WeakReference? = null private val oldDlCardName = MainActivity.mainWeakReference?.get()?.getString(R.string.old_download_card_name)!! private val extDir = MainActivity.mainWeakReference?.get()?.getExternalFilesDir("") - init { - pageHandler = object : PageHandler { - override fun addPage() { - if(!isEnd) { - if(sortedBookList == null) { - Log.d("MyNDF", "Sorting books...") - sortedBookList = extDir?.listFiles()?.sorted() - } - Log.d("MyNDF", "Start drawing cards") - cardList?.addCard(oldDlCardName, path = oldDlCardName) - sortedBookList?.let { - for(i in it.listIterator(page)) { + private var isReverse = false + private var isContentChanged = false + private var exit = false + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + wn = WeakReference(this) + } + + override fun onPause() { + super.onPause() + exit = true + } + + override fun onResume() { + super.onResume() + exit = false + } + + override fun onDestroy() { + super.onDestroy() + wn = null + exit = true + } + + override fun addPage() { + super.addPage() + if(!isEnd) { + if(sortedBookList == null || isContentChanged) { + Log.d("MyNDF", "Sorting books...") + sortedBookList = extDir?.listFiles()?.sortedBy { + return@sortedBy Reader.getComicPathWordInFile(it) + } + if (isReverse) { + Log.d("MyNDF", "reversed...") + sortedBookList = sortedBookList?.asReversed() + } + isContentChanged = false + } + Log.d("MyNDF", "Start drawing cards") + cardList?.addCard(oldDlCardName, path = oldDlCardName) + sortedBookList?.let { + for(i in it.listIterator(page)) { + if(cardList?.exitCardList != false) return + page++ // page is actually count + val chosenJson = File(i, "info.bin") + val newJson = File(i, "info.json") + val bookSize = (FileUtils.sizeOf(i)/1048576).toInt() + when { + chosenJson.exists() -> continue // unsupported old folder + newJson.exists() -> { if(cardList?.exitCardList != false) return - page++ // page is actually count - val chosenJson = File(i, "info.bin") - val newJson = File(i, "info.json") - val bookSize = (sizeOf(i)/1048576).toInt() - when{ - chosenJson.exists() -> continue // unsupported old folder - newJson.exists() -> { - if(cardList?.exitCardList != false) return - cardList?.addCard(i.name, " ${bookSize}MB") - } - } - } - if(page >= it.size) { - isEnd = true + cardList?.addCard(i.name, "\n${bookSize}MB") } } } - onLoadFinish() - } - - override fun initCardList(weakReference: WeakReference) { - cardList = CardList(weakReference, cardWidth, cardHeight, cardPerRow) - cardList?.initClickListeners = object : CardList.InitClickListeners { - override fun prepareListeners(v: View, name: String, path: String?, chapterUUID: String?, pn: Int?) { - v.setOnClickListener { - if(name==oldDlCardName && path == oldDlCardName) { - Navigate.safeNavigateTo(findNavController(), R.id.action_nav_new_download_to_nav_download) - return@setOnClickListener - } - callDownloadFragment(name) - } - v.setOnLongClickListener { - if (name == oldDlCardName && path == oldDlCardName) { - return@setOnLongClickListener false - } - val chosenFile = File(extDir, name) - AlertDialog.Builder(context) - .setIcon(R.drawable.ic_launcher_foreground) - .setTitle(R.string.new_download_card_option_hint) - .setItems(arrayOf("删除", "前往")) { d, p -> - d.cancel() - when (p) { - 0 -> { - AlertDialog.Builder(context) - .setIcon(R.drawable.ic_launcher_foreground).setMessage("删除下载的此漫画吗?") - .setTitle("提示").setPositiveButton(android.R.string.ok) { _, _ -> - if (chosenFile.exists()) Thread { - FileUtils.recursiveRemove(chosenFile) - MainActivity.mainWeakReference?.get()?.runOnUiThread { - it.visibility = View.INVISIBLE - } - }.start() - }.setNegativeButton(android.R.string.cancel) { _, _ -> } - .show() - } - 1 -> { - val bundle = Bundle() - bundle.putBoolean("loadJson", true) - bundle.putString("name", name) - Navigate.safeNavigateTo(findNavController(), R.id.action_nav_new_download_to_nav_book, bundle) - } - } - } - .show() - - true - } - } + if(page >= it.size) { + isEnd = true } } + } + onLoadFinish() + } - override fun setListeners() {} + override fun initCardList(weakReference: WeakReference) { + super.initCardList(weakReference) + cardList = CardList(weakReference, cardWidth, cardHeight, cardPerRow) + cardList?.initClickListeners = object : CardList.InitClickListeners { + override fun prepareListeners(v: View, name: String, path: String?, chapterUUID: String?, pn: Int?) { + v.setOnClickListener { + if(name==oldDlCardName && path == oldDlCardName) { + Navigate.safeNavigateTo(findNavController(), R.id.action_nav_new_download_to_nav_download) + return@setOnClickListener + } + callDownloadFragment(name) + } + v.setOnLongClickListener { + if (name == oldDlCardName && path == oldDlCardName) { + return@setOnLongClickListener false + } + val chosenFile = File(extDir, name) + AlertDialog.Builder(context) + .setIcon(R.drawable.ic_launcher_foreground) + .setTitle(R.string.new_download_card_option_hint) + .setItems(arrayOf("删除", "前往")) { d, p -> + d.cancel() + when (p) { + 0 -> { + AlertDialog.Builder(context) + .setIcon(R.drawable.ic_launcher_foreground).setMessage("删除下载的此漫画吗?") + .setTitle("提示").setPositiveButton(android.R.string.ok) { _, _ -> + if (chosenFile.exists()) Thread { + FileUtils.recursiveRemove(chosenFile) + MainActivity.mainWeakReference?.get()?.runOnUiThread { + it.visibility = View.INVISIBLE + } + }.start() + }.setNegativeButton(android.R.string.cancel) { _, _ -> } + .show() + } + 1 -> { + val bundle = Bundle() + bundle.putBoolean("loadJson", true) + bundle.putString("name", name) + Navigate.safeNavigateTo(findNavController(), R.id.action_nav_new_download_to_nav_book, bundle) + } + } + } + .show() + + true + } + } } } @@ -122,21 +153,29 @@ class NewDownloadFragment: MangaPagesFragmentTemplate(R.layout.fragment_newdownl Navigate.safeNavigateTo(findNavController(), R.id.action_nav_new_download_to_nav_group, bundle) } - private fun onLoadFinish() { + fun showReverseInfo(toolsBox: UITools) { + if (exit) return + toolsBox.buildInfo("反转排序", "将按当前顺序的倒序显示下载的漫画", + "确定", null, "取消", { + isReverse = !isReverse + isContentChanged = true + reset() + Thread { + sleep(600) + addPage() + }.start() + } + ) + } + + override fun onLoadFinish() { + super.onLoadFinish() MainActivity.mainWeakReference?.get()?.runOnUiThread { - if(cardList?.exitCardList != false) return@runOnUiThread mypl.visibility = View.GONE } } companion object { - fun sizeOf(f: File):Long{ - var size = 0L - if (f.isDirectory) f.listFiles()?.apply { - for (i in this) - size += if (i.isDirectory) sizeOf(i) else i.length() - } - return size - } + var wn: WeakReference? = null } } diff --git a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt index f356567..fa80cba 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt @@ -22,6 +22,7 @@ import kotlinx.android.synthetic.main.card_book_plain.view.* import kotlinx.android.synthetic.main.fragment_home.* import kotlinx.android.synthetic.main.line_word.view.* import kotlinx.android.synthetic.main.viewpage_horizonal.view.* +import top.fumiama.copymanga.MainActivity import top.fumiama.copymanga.MainActivity.Companion.ime import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference import top.fumiama.copymanga.json.BookListStructure @@ -40,10 +41,11 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) { super.onViewCreated(view, savedInstanceState) if(isFirstInflate) { val theme = resources.newTheme() - swiperefresh.setColorSchemeColors( + swiperefresh?.setColorSchemeColors( resources.getColor(R.color.colorAccent, theme), resources.getColor(R.color.colorBlue2, theme), resources.getColor(R.color.colorGreen, theme)) + swiperefresh?.isEnabled = true fhs.apply { val recyclerView = findViewById(R.id.search_recycler_view) @@ -133,6 +135,10 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + val l = MainActivity.member?.refreshAvatar() + if (l?.code != 200) { + MainActivity.member?.logout() + } homeHandler = HomeHandler(WeakReference(this)) } diff --git a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt index a1fe939..6438706 100644 --- a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt +++ b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt @@ -50,15 +50,12 @@ class HomeHandler(private val that: WeakReference) : AutoDownloadH } return field } - var indexLines = arrayOf() + private var indexLines = arrayOf() override fun handleMessage(msg: Message) { super.handleMessage(msg) when (msg.what) { - -1 -> { - homeF?.swiperefresh?.isEnabled = msg.obj as Boolean - homeF?.swiperefresh?.isRefreshing = msg.obj as Boolean - } + -1 -> homeF?.swiperefresh?.isRefreshing = msg.obj as Boolean //0 -> setLayouts() 1 -> inflateCardLines() 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 e30ba2e..84f4a7c 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 @@ -439,18 +439,18 @@ class ViewMangaActivity : TitleActivityTemplate() { else { val zip = ZipFile(zipFile) try { - if (q == 100) BitmapFactory.decodeStream(zip.getInputStream(zip.getEntry("${position}.jpg"))) + if (q == 100) BitmapFactory.decodeStream(zip.getInputStream(zip.getEntry("${position}.webp"))) else { val out = ByteArrayOutputStream() - BitmapFactory.decodeStream(zip.getInputStream(zip.getEntry("${position}.jpg")))?.compress(Bitmap.CompressFormat.JPEG, q, out) + BitmapFactory.decodeStream(zip.getInputStream(zip.getEntry("${position}.webp")))?.compress(Bitmap.CompressFormat.JPEG, q, out) BitmapFactory.decodeStream(ByteArrayInputStream(out.toByteArray())) } } catch (e: Exception) { try { - if (q == 100) BitmapFactory.decodeStream(zip.getInputStream(zip.getEntry("${position}.webp"))) + if (q == 100) BitmapFactory.decodeStream(zip.getInputStream(zip.getEntry("${position}.jpg"))) else { val out = ByteArrayOutputStream() - BitmapFactory.decodeStream(zip.getInputStream(zip.getEntry("${position}.webp")))?.compress(Bitmap.CompressFormat.JPEG, q, out) + BitmapFactory.decodeStream(zip.getInputStream(zip.getEntry("${position}.jpg")))?.compress(Bitmap.CompressFormat.JPEG, q, out) BitmapFactory.decodeStream(ByteArrayInputStream(out.toByteArray())) } } catch (e: Exception) { diff --git a/app/src/main/java/top/fumiama/copymanga/update/Update.kt b/app/src/main/java/top/fumiama/copymanga/update/Update.kt index 0b8072b..547640c 100644 --- a/app/src/main/java/top/fumiama/copymanga/update/Update.kt +++ b/app/src/main/java/top/fumiama/copymanga/update/Update.kt @@ -10,8 +10,8 @@ import android.widget.Toast import androidx.core.content.FileProvider import androidx.core.content.edit import kotlinx.android.synthetic.main.dialog_progress.view.* -import top.fumiama.copymanga.tools.file.PropertiesTools import top.fumiama.copymanga.tools.api.UITools +import top.fumiama.dmzj.copymanga.BuildConfig import top.fumiama.dmzj.copymanga.R import java.io.File import java.security.MessageDigest @@ -27,7 +27,7 @@ object Update { } } val kanban = SimpleKanban(client, "fumiama") - val msg = kanban[packageManager.getPackageInfo(packageName, 0).versionCode] + val msg = kanban[BuildConfig.VERSION_CODE] if(msg != "null") { val verNum = msg.substringBefore('\n').toIntOrNull() val skipNum = activity.getPreferences(MODE_PRIVATE).getInt("skipVersion", 0) diff --git a/app/src/main/java/top/fumiama/copymanga/user/Member.kt b/app/src/main/java/top/fumiama/copymanga/user/Member.kt new file mode 100644 index 0000000..0046645 --- /dev/null +++ b/app/src/main/java/top/fumiama/copymanga/user/Member.kt @@ -0,0 +1,69 @@ +package top.fumiama.copymanga.user + +import android.content.SharedPreferences +import android.widget.Toast +import com.google.gson.Gson +import top.fumiama.copymanga.MainActivity +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 + +class Member(private val pref: SharedPreferences, private val getString: (Int) -> String) { + fun login(username: String, pwd: String, salt: Int): LoginInfoStructure { + try { + CMApi.getLoginConnection(username, pwd, salt)?.apply { + Gson().fromJson(inputStream.reader(), LoginInfoStructure::class.java)?.let { data -> + disconnect() + if(data.code == 200) { + pref.edit()?.apply { + putString("token", data.results?.token) + putString("user_id", data.results?.user_id) + putString("username", data.results?.username) + putString("nickname", data.results?.nickname) + apply() + return refreshAvatar() + } + } + return data + } + } + val l = LoginInfoStructure() + l.code = 400 + l.message = getString(R.string.login_get_conn_failed) + return l + } catch (e: Exception) { + val l = LoginInfoStructure() + l.code = 400 + l.message = e.localizedMessage + return l + } + } + + fun refreshAvatar() : LoginInfoStructure { + DownloadTools.getHttpContent(getString(R.string.memberInfoApiUrl).format( + CMApi.myHostApiUrl))?.decodeToString()?.let { + val l = Gson().fromJson(it, LoginInfoStructure::class.java) + if(l.code == 200) pref.edit()?.apply { + putString("avatar", l.results.avatar) + apply() + } + return l + } + val l = LoginInfoStructure() + l.code = 400 + l.message = getString(R.string.login_get_avatar_failed) + return l + } + + fun logout() { + pref.edit()?.apply { + remove("token") + remove("user_id") + remove("username") + remove("nickname") + remove("avatar") + apply() + } + } +} diff --git a/app/src/main/java/top/fumiama/copymanga/views/MangaCardView.kt b/app/src/main/java/top/fumiama/copymanga/views/MangaCardView.kt index dbb19d5..104c592 100644 --- a/app/src/main/java/top/fumiama/copymanga/views/MangaCardView.kt +++ b/app/src/main/java/top/fumiama/copymanga/views/MangaCardView.kt @@ -16,6 +16,7 @@ class MangaCardView:CardView { //var uuid: String? = null var path: String? = null var isFinish = false + var isNew = false var index = 0 var chapterUUID: String? = null var pageNumber: Int? = null diff --git a/app/src/main/res/layout/card_book.xml b/app/src/main/res/layout/card_book.xml index e594d15..9639348 100644 --- a/app/src/main/res/layout/card_book.xml +++ b/app/src/main/res/layout/card_book.xml @@ -1,6 +1,7 @@ @@ -86,7 +87,21 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintStart_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + tools:visibility="visible" /> + + diff --git a/app/src/main/res/layout/line_sort.xml b/app/src/main/res/layout/line_sort.xml index 8680dff..3373e46 100644 --- a/app/src/main/res/layout/line_sort.xml +++ b/app/src/main/res/layout/line_sort.xml @@ -19,10 +19,20 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@+id/line_sort_time" + app:layout_constraintEnd_toStartOf="@+id/line_sort_region" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c556386..46db98e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,11 +42,12 @@ https://%1$s/api/v3/h5/homeIndex?platform=3 https://%1$s &hosturl; - https://%1$s/api/v3/ranks?limit=21&offset=%2$d&date_type=%3$s&platform=3 + https://%1$s/api/v3/ranks?limit=21&offset=%2$d&date_type=%3$s&audience_type=%4$s&platform=3 https://%1$s/api/v3/search/comic?limit=21&offset=%2$d&q=%3$s&q_type=%4$s&platform=3 - https://%1$s/api/v3/h5/filterIndex/comic/tags?platform=3 - https://%1$s/api/v3/comics?limit=21&offset=%2$d&ordering=%3$s&theme=%4$s&platform=3 + https://%1$s/api/v3/h5/filter/comic/tags?platform=3 + https://%1$s/api/v3/comics?limit=21&offset=%2$d&ordering=%3$s&theme=%4$s&top=%5$s&platform=3 https://%1$s/api/v3/comic2/%2$s?platform=3 + https://%1$s/api/v3/comic2/%2$s/query?platform=3 https://%1$s/api/v3/comic/%2$s/group/%3$s/chapters?limit=100&offset=%4$d&platform=3 https://%1$s/api/v3/comic/%2$s/chapter2/%3$s?platform=3 https://%1$s/api/v3/topic/%2$s?platform=3 @@ -78,6 +79,7 @@ 以太网 LOWPAN 无网络 + 网络错误 COPY/2.0.7 2.0.7 @@ -89,10 +91,12 @@ 阅读时间 加入书架 + 已加书架 开始阅读 热度 %1$d 状态 %1$s + 云端读到 %1$s 专题系列 漫画推荐 @@ -135,7 +139,8 @@ 用户名为空 密码为空 - 连接失败 + 登录失败 + 刷新头像失败 重启应用以彻底退出登录 前往旧版下载