From 95e82ab97cf36c41fbada7ef43311e66ba085f85 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?=
<41315874+fumiama@users.noreply.github.com>
Date: Mon, 23 Oct 2023 00:58:46 +0900
Subject: [PATCH] =?UTF-8?q?v2.0.beta21=20=E6=96=B0=E5=A2=9E=201.=20?=
=?UTF-8?q?=E9=80=80=E5=87=BA=E7=99=BB=E5=BD=95(=E5=8E=86=E5=8F=B2?=
=?UTF-8?q?=E8=AE=B0=E5=BD=95=E4=B8=8D=E6=98=BE=E7=A4=BA=E5=B0=B1=E6=98=AF?=
=?UTF-8?q?=E5=9B=A0=E4=B8=BA=E5=9C=A8=E5=AE=98=E6=96=B9APP=E6=88=96?=
=?UTF-8?q?=E5=85=B6=E5=AE=83=E7=AC=AC=E4=B8=89=E6=96=B9APP=E7=99=BB?=
=?UTF-8?q?=E5=BD=95=E4=BB=8E=E8=80=8C=E4=BD=BF=E6=9C=ACAPP=E7=9A=84token?=
=?UTF-8?q?=E6=97=A0=E6=95=88,=20=E8=BF=99=E6=97=B6=E9=80=80=E5=87=BA?=
=?UTF-8?q?=E7=99=BB=E5=BD=95=E5=90=8E=E9=87=8D=E7=99=BB=E5=8F=AF=E8=A7=A3?=
=?UTF-8?q?)=202.=20=E6=88=91=E7=9A=84=E8=AE=A2=E9=98=85=20(fix=20#28)=20(?=
=?UTF-8?q?fix=20#31)=20=E4=BF=AE=E5=A4=8D=201.=20=E4=B8=93=E9=A2=98?=
=?UTF-8?q?=E7=B3=BB=E5=88=97=E7=9A=84=E6=A0=87=E9=A2=98=E6=9C=89=E6=97=B6?=
=?UTF-8?q?=E6=97=A0=E6=B3=95=E6=98=BE=E7=A4=BA=202.=20=E7=99=BB=E5=BD=95?=
=?UTF-8?q?=E5=90=8E=E6=97=A0=E6=B3=95=E7=AB=8B=E5=8D=B3=E6=98=BE=E7=A4=BA?=
=?UTF-8?q?=E5=A4=B4=E5=83=8F=203.=20=E8=BF=9B=E5=85=A5=E5=88=86=E7=B1=BB?=
=?UTF-8?q?=E9=A1=B5=E5=90=8E=E7=AB=8B=E5=8D=B3=E8=BF=94=E5=9B=9E=E5=88=99?=
=?UTF-8?q?=E9=97=AA=E9=80=80=204.=20=E5=88=86=E7=B1=BB=E9=A1=B5=E6=8E=92?=
=?UTF-8?q?=E5=BA=8F=E6=8C=89=E6=9B=B4=E6=96=B0=E6=97=B6=E9=97=B4=E5=92=8C?=
=?UTF-8?q?=E6=8C=89=E7=83=AD=E5=BA=A6=E7=9B=B8=E5=90=8C=20=E4=BC=98?=
=?UTF-8?q?=E5=8C=96=201.=20=E7=94=A8=E6=88=B7=E5=A4=B4=E5=83=8F=E6=98=BE?=
=?UTF-8?q?=E7=A4=BA=E4=B8=BA=E5=9C=86=E5=BD=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/dictionaries/fumiama.xml | 7 ++
app/build.gradle | 4 +-
.../top/fumiama/copymanga/LoginActivity.kt | 93 ++++++++++++-------
.../top/fumiama/copymanga/MainActivity.kt | 41 +++++---
.../copymanga/json/LastBrowseStructure.java | 6 ++
.../copymanga/json/ShelfStructure.java | 14 +++
.../general/MangaPagesFragmentTemplate.kt | 4 +-
.../template/http/AutoDownloadThread.kt | 5 +-
.../copymanga/template/ui/InfoCardLoader.kt | 38 ++++++--
.../ui/cardflow/rank/RankFragment.kt | 5 +-
.../ui/cardflow/shelf/ShelfFragment.kt | 90 ++++++++++++++++++
.../ui/cardflow/sort/SortFragment.kt | 12 +--
.../ui/cardflow/topic/TopicFragment.kt | 8 +-
.../ui/download/NewDownloadFragment.kt | 12 +--
app/src/main/res/layout/activity_login.xml | 4 +-
app/src/main/res/layout/fragment_shelf.xml | 26 ++++++
app/src/main/res/layout/line_shelf.xml | 45 +++++++++
.../main/res/navigation/mobile_navigation.xml | 14 +++
app/src/main/res/values/strings.xml | 9 +-
19 files changed, 354 insertions(+), 83 deletions(-)
create mode 100644 .idea/dictionaries/fumiama.xml
create mode 100644 app/src/main/java/top/fumiama/copymanga/json/LastBrowseStructure.java
create mode 100644 app/src/main/java/top/fumiama/copymanga/json/ShelfStructure.java
create mode 100644 app/src/main/java/top/fumiama/copymanga/ui/cardflow/shelf/ShelfFragment.kt
create mode 100644 app/src/main/res/layout/fragment_shelf.xml
create mode 100644 app/src/main/res/layout/line_shelf.xml
diff --git a/.idea/dictionaries/fumiama.xml b/.idea/dictionaries/fumiama.xml
new file mode 100644
index 0000000..e4278ec
--- /dev/null
+++ b/.idea/dictionaries/fumiama.xml
@@ -0,0 +1,7 @@
+
+
+
+ lowpan
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index bd976a0..06b561d 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -8,8 +8,8 @@ android {
applicationId 'top.fumiama.copymanga'
minSdkVersion 23
targetSdkVersion 33
- versionCode 32
- versionName '2.0.beta20'
+ versionCode 33
+ versionName '2.0.beta21'
resConfigs 'zh', 'zh-rCN'
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
diff --git a/app/src/main/java/top/fumiama/copymanga/LoginActivity.kt b/app/src/main/java/top/fumiama/copymanga/LoginActivity.kt
index b3234f6..743e413 100644
--- a/app/src/main/java/top/fumiama/copymanga/LoginActivity.kt
+++ b/app/src/main/java/top/fumiama/copymanga/LoginActivity.kt
@@ -2,56 +2,81 @@ 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)
+ val pref = MainActivity.mainWeakReference?.get()?.getPreferences(MODE_PRIVATE) ?: return
+ val isLogout = pref.getString("token", null) != null
+ if (isLogout) {
+ alblogin.setText(R.string.logout)
+ }
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).format(CMApi.myHostApiUrl))?.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() }
+ val username = altusrnm.text?.toString() ?: run {
+ Toast.makeText(this, R.string.login_null_username, Toast.LENGTH_SHORT).show()
+ return@setOnClickListener
+ }
+ val pwd = altpwd.text?.toString() ?: run {
+ Toast.makeText(this, R.string.login_null_pwd, Toast.LENGTH_SHORT).show()
+ return@setOnClickListener
+ }
+ Thread{
+ if (isLogout) {
+ pref.edit()?.apply {
+ remove("token")
+ remove("user_id")
+ remove("username")
+ remove("nickname")
+ remove("avatar")
+ apply()
+ runOnUiThread {
+ MainActivity.mainWeakReference?.get()?.refreshUserInfo()
+ Toast.makeText(this@LoginActivity, R.string.login_restart_to_apply, Toast.LENGTH_SHORT).show()
+ finish()
}
- }.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()
+ }
+ return@Thread
+ }
+ try {
+ CMApi.getLoginConnection(username, pwd, salt)?.apply {
+ Gson().fromJson(inputStream.reader(), LoginInfoStructure::class.java)?.let { data ->
+ 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() }
+ }
+ }.start()
}
}
}
diff --git a/app/src/main/java/top/fumiama/copymanga/MainActivity.kt b/app/src/main/java/top/fumiama/copymanga/MainActivity.kt
index da9dfad..2b8884e 100644
--- a/app/src/main/java/top/fumiama/copymanga/MainActivity.kt
+++ b/app/src/main/java/top/fumiama/copymanga/MainActivity.kt
@@ -1,6 +1,7 @@
package top.fumiama.copymanga
import android.Manifest
+import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
@@ -33,6 +34,8 @@ import androidx.navigation.ui.setupWithNavController
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.input.input
import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CircleCrop
+import com.bumptech.glide.request.RequestOptions
import com.yalantis.ucrop.UCrop
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.app_bar_main.*
@@ -92,13 +95,7 @@ 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)
- }
+ refreshUserInfo()
}
override fun onDrawerSlide(drawerView: View, slideOffset: Float) {}
@@ -197,7 +194,7 @@ class MainActivity : AppCompatActivity() {
navhbg.setImageBitmap(BitmapFactory.decodeStream(fi))
fi.close()
}
- 1 -> {
+ MSG_CROP_IMAGE -> {
data?.data?.let {
saveFile(it)
cropImageUri()
@@ -213,13 +210,26 @@ class MainActivity : AppCompatActivity() {
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
- 1 -> {
+ MSG_CROP_IMAGE -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) pickPicture()
else Toast.makeText(this, R.string.permissionDenied, Toast.LENGTH_SHORT).show()
}
}
}
+ fun refreshUserInfo() {
+ 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)
+ .apply(RequestOptions.bitmapTransform(CircleCrop()))
+ .into(navhicon)
+ }
+ }
+
private fun checkReadPermission(): Boolean {
return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N && ContextCompat.checkSelfPermission(
this,
@@ -228,16 +238,17 @@ class MainActivity : AppCompatActivity() {
) {
ActivityCompat.requestPermissions(
this,
- arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 1
+ arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), MSG_CROP_IMAGE
)
false
} else true
}
+ @SuppressLint("IntentReset")
private fun pickPicture() {
val i = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
i.type = "image/*"
- startActivityForResult(i, 1)
+ startActivityForResult(i, MSG_CROP_IMAGE)
}
private fun saveFile(uri: Uri) {
@@ -263,7 +274,11 @@ class MainActivity : AppCompatActivity() {
val r = navhbg.width.toFloat() / navhbg.height.toFloat()
Log.d("MyMain", "Img info: (${navhbg.width}, ${navhbg.height})")
Log.d("MyMain", "Result code: ${UCrop.REQUEST_CROP}")
- op.setCompressionFormat(Bitmap.CompressFormat.WEBP)
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+ op.setCompressionFormat(Bitmap.CompressFormat.WEBP_LOSSY)
+ } else {
+ op.setCompressionFormat(Bitmap.CompressFormat.WEBP)
+ }
op.setStatusBarColor(resources.getColor(R.color.colorPrimaryDark, theme))
op.setToolbarColor(resources.getColor(R.color.colorPrimary, theme))
op.setActiveControlsWidgetColor(resources.getColor(R.color.colorAccent, theme))
@@ -319,6 +334,7 @@ class MainActivity : AppCompatActivity() {
dl.show()
}
+ @SuppressLint("CheckResult")
fun onNavTInfoClicked(it: View) {
MaterialDialog(this).show {
input(prefill = (it as TextView).text) { _, charSequence ->
@@ -344,5 +360,6 @@ class MainActivity : AppCompatActivity() {
companion object{
var mainWeakReference: WeakReference? = null
var ime: InputMethodManager? = null
+ const val MSG_CROP_IMAGE = 1
}
}
\ No newline at end of file
diff --git a/app/src/main/java/top/fumiama/copymanga/json/LastBrowseStructure.java b/app/src/main/java/top/fumiama/copymanga/json/LastBrowseStructure.java
new file mode 100644
index 0000000..cb49e59
--- /dev/null
+++ b/app/src/main/java/top/fumiama/copymanga/json/LastBrowseStructure.java
@@ -0,0 +1,6 @@
+package top.fumiama.copymanga.json;
+
+public class LastBrowseStructure {
+ public String last_browse_id;
+ public String last_browse_name;
+}
diff --git a/app/src/main/java/top/fumiama/copymanga/json/ShelfStructure.java b/app/src/main/java/top/fumiama/copymanga/json/ShelfStructure.java
new file mode 100644
index 0000000..64f6740
--- /dev/null
+++ b/app/src/main/java/top/fumiama/copymanga/json/ShelfStructure.java
@@ -0,0 +1,14 @@
+package top.fumiama.copymanga.json;
+
+public class ShelfStructure extends ReturnBase {
+ public Results results;
+ public static class Results extends InfoBase {
+ public List[] list;
+ public static class List {
+ public int uuid;
+ public boolean b_folder;
+ public LastBrowseStructure last_browse;
+ public HistoryComicStructure comic;
+ }
+ }
+}
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 70a499d..ad9fcf0 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
@@ -18,7 +18,7 @@ open class MangaPagesFragmentTemplate(inflateRes:Int, val isLazy: Boolean = true
var cardPerRow = 3
var cardWidth = 0
var cardHeight = 0
- lateinit var cardList: CardList
+ var cardList: CardList? = null
var mh: MPATHandler? = null
var row: View? = null
var isEnd = false
@@ -42,7 +42,7 @@ open class MangaPagesFragmentTemplate(inflateRes:Int, val isLazy: Boolean = true
override fun onDestroy() {
super.onDestroy()
- cardList.exitCardList = true
+ cardList?.exitCardList = true
mh = null
row = null
jsonReaderNow = null
diff --git a/app/src/main/java/top/fumiama/copymanga/template/http/AutoDownloadThread.kt b/app/src/main/java/top/fumiama/copymanga/template/http/AutoDownloadThread.kt
index 997df23..27f21b6 100644
--- a/app/src/main/java/top/fumiama/copymanga/template/http/AutoDownloadThread.kt
+++ b/app/src/main/java/top/fumiama/copymanga/template/http/AutoDownloadThread.kt
@@ -1,9 +1,9 @@
package top.fumiama.copymanga.template.http
-import top.fumiama.dmzj.copymanga.R
+import android.util.Log
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
-import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.copymanga.tools.http.DownloadTools
+import top.fumiama.dmzj.copymanga.R
class AutoDownloadThread(private val url: String, private val whenFinish: (result: ByteArray?)->Unit): Thread() {
var exit = false
@@ -18,5 +18,6 @@ class AutoDownloadThread(private val url: String, private val whenFinish: (resul
)
}
if(!exit) whenFinish(re)
+ Log.d("MyADT", "found exit = $exit")
}
}
\ No newline at end of file
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 831c739..7d4ad8d 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
@@ -10,13 +10,14 @@ import kotlinx.android.synthetic.main.line_lazybooklines.*
import top.fumiama.copymanga.MainActivity
import top.fumiama.copymanga.json.BookListStructure
import top.fumiama.copymanga.json.HistoryBookListStructure
+import top.fumiama.copymanga.json.ShelfStructure
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,private val isHistoryBook: Boolean = false): MangaPagesFragmentTemplate(inflateRes) {
+open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isTypeBook: Boolean = false, private val isHistoryBook: Boolean = false, private val isShelfBook: Boolean = false): MangaPagesFragmentTemplate(inflateRes) {
var offset = 0
private val subUrl get() = getApiUrl()
var ad: AutoDownloadThread? = null
@@ -36,7 +37,7 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT
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)
+ cardList?.addCard(book.comic.name, null, book.comic.cover, book.comic.path_word, null, null, false)
}
offset += results.list.size
}
@@ -51,7 +52,22 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT
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)
+ 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
}
@@ -66,7 +82,7 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT
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)
+ cardList?.addCard(book.name, null, book.cover, book.path_word, null, null, false)
}
offset += results.list.size
}
@@ -80,7 +96,7 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT
}
override fun initCardList(weakReference: WeakReference) {
cardList = CardList(weakReference, cardWidth, cardHeight, cardPerRow)
- cardList.initClickListeners = object : CardList.InitClickListeners {
+ cardList?.initClickListeners = object : CardList.InitClickListeners {
override fun prepareListeners(v: View, name: String, path: String?, chapterUUID: String?, pn: Int?) {
v.setOnClickListener {
val bundle = Bundle()
@@ -102,10 +118,20 @@ open class InfoCardLoader(inflateRes:Int, private val navId:Int, private val isT
open fun onLoadFinish(){
MainActivity.mainWeakReference?.get()?.runOnUiThread {
- if(ad?.exit == false) mypl.visibility = View.GONE
+ if(ad?.exit != true) mypl.visibility = View.GONE
}
}
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ ad?.exit = false
+ }
+
+ override fun onResume() {
+ super.onResume()
+ ad?.exit = false
+ }
+
override fun onDestroy() {
super.onDestroy()
ad?.exit = true
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 0753487..7c408ef 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,11 +1,8 @@
package top.fumiama.copymanga.ui.cardflow.rank
-import android.view.View
import com.google.android.material.tabs.TabLayout
import kotlinx.android.synthetic.main.fragment_rank.*
-import kotlinx.android.synthetic.main.line_lazybooklines.*
import kotlinx.android.synthetic.main.line_rank.view.*
-import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.copymanga.tools.api.CMApi
import top.fumiama.dmzj.copymanga.R
@@ -40,7 +37,7 @@ class RankFragment : InfoCardLoader(R.layout.fragment_rank, R.id.action_nav_rank
sortValue = value
Thread{
sleep(400)
- if(ad?.exit == false) mh?.sendEmptyMessage(4)
+ if(ad?.exit != true) mh?.sendEmptyMessage(4)
}.start()
}
}
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
new file mode 100644
index 0000000..55fe22e
--- /dev/null
+++ b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/shelf/ShelfFragment.kt
@@ -0,0 +1,90 @@
+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.template.ui.InfoCardLoader
+import top.fumiama.copymanga.tools.api.CMApi
+import top.fumiama.dmzj.copymanga.R
+import java.lang.Thread.sleep
+
+@ExperimentalStdlibApi
+class ShelfFragment : InfoCardLoader(R.layout.fragment_shelf, R.id.action_nav_sub_to_nav_book, isShelfBook = true) {
+ private val sortWay = listOf(
+ "-datetime_updated",
+ "datetime_updated",
+ "-datetime_modifier",
+ "datetime_modifier",
+ "-datetime_browse",
+ "datetime_browse"
+ )
+ private var sortValue = 0
+
+ override fun getApiUrl() =
+ getString(R.string.shelfApiUrl).format(
+ CMApi.myHostApiUrl,
+ page * 21,
+ sortWay[sortValue]
+ )
+
+ override fun setListeners() {
+ super.setListeners()
+ setUpdate()
+ setModify()
+ setBrowse()
+ }
+
+ private fun setUpdate() {
+ if (ad?.exit == true) return
+ line_shelf_updated.apt.setText(R.string.menu_update_time)
+ line_shelf_updated.setOnClickListener {
+ sortValue = if (it.apim.rotation == 0f) {
+ ObjectAnimator.ofFloat(it.apim, "rotation", 0f, 180f).setDuration(233).start()
+ 1
+ } else {
+ ObjectAnimator.ofFloat(it.apim, "rotation", 180f, 0f).setDuration(233).start()
+ 0
+ }
+ Thread {
+ sleep(400)
+ mh?.sendEmptyMessage(4)
+ }.start()
+ }
+ }
+
+ private fun setModify() {
+ if (ad?.exit == true) return
+ line_shelf_modifier.apt.setText(R.string.menu_add_time)
+ line_shelf_modifier.setOnClickListener {
+ sortValue = if (it.apim.rotation == 0f) {
+ ObjectAnimator.ofFloat(it.apim, "rotation", 0f, 180f).setDuration(233).start()
+ 3
+ } else {
+ ObjectAnimator.ofFloat(it.apim, "rotation", 180f, 0f).setDuration(233).start()
+ 2
+ }
+ Thread {
+ sleep(400)
+ mh?.sendEmptyMessage(4)
+ }.start()
+ }
+ }
+
+ private fun setBrowse() {
+ if (ad?.exit == true) return
+ line_shelf_browse.apt.setText(R.string.menu_read_time)
+ line_shelf_browse.setOnClickListener {
+ sortValue = if (it.apim.rotation == 0f) {
+ ObjectAnimator.ofFloat(it.apim, "rotation", 0f, 180f).setDuration(233).start()
+ 5
+ } else {
+ ObjectAnimator.ofFloat(it.apim, "rotation", 180f, 0f).setDuration(233).start()
+ 4
+ }
+ Thread {
+ sleep(400)
+ mh?.sendEmptyMessage(4)
+ }.start()
+ }
+ }
+}
\ No newline at end of file
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 9aaa411..b0fc7c0 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
@@ -1,23 +1,21 @@
package top.fumiama.copymanga.ui.cardflow.sort
import android.animation.ObjectAnimator
-import android.view.View
import com.github.zawadz88.materialpopupmenu.popupMenu
import com.google.gson.Gson
import kotlinx.android.synthetic.main.anchor_popular.view.*
-import kotlinx.android.synthetic.main.line_lazybooklines.*
import kotlinx.android.synthetic.main.line_sort.*
-import top.fumiama.dmzj.copymanga.R
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.json.FilterStructure
import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.template.ui.InfoCardLoader
import top.fumiama.copymanga.tools.api.CMApi
+import top.fumiama.dmzj.copymanga.R
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 sortValue = 0
private var filter: FilterStructure? = null
@@ -40,7 +38,7 @@ class SortFragment : InfoCardLoader(R.layout.fragment_sort, R.id.action_nav_sort
filter = Gson().fromJson(it.inputStream().reader(), FilterStructure::class.java)
if(ad?.exit == true) return@AutoDownloadThread
mainWeakReference?.get()?.runOnUiThread{
- if(ad?.exit == false) setClasses()
+ if(ad?.exit != true) setClasses()
}
}
}.start()
@@ -109,10 +107,10 @@ class SortFragment : InfoCardLoader(R.layout.fragment_sort, R.id.action_nav_sort
line_sort_hot.setOnClickListener {
sortValue = if (it.apim.rotation == 0f) {
ObjectAnimator.ofFloat(it.apim, "rotation", 0f, 180f).setDuration(233).start()
- 1
+ 3
} else {
ObjectAnimator.ofFloat(it.apim, "rotation", 180f, 0f).setDuration(233).start()
- 0
+ 2
}
Thread {
sleep(400)
diff --git a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/topic/TopicFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/topic/TopicFragment.kt
index 7a0c68c..0ff4423 100644
--- a/app/src/main/java/top/fumiama/copymanga/ui/cardflow/topic/TopicFragment.kt
+++ b/app/src/main/java/top/fumiama/copymanga/ui/cardflow/topic/TopicFragment.kt
@@ -1,10 +1,8 @@
package top.fumiama.copymanga.ui.cardflow.topic
import android.os.Bundle
-import android.view.View
import com.google.gson.Gson
import kotlinx.android.synthetic.main.app_bar_main.*
-import kotlinx.android.synthetic.main.line_lazybooklines.*
import kotlinx.android.synthetic.main.fragment_topic.*
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
import top.fumiama.copymanga.json.TopicStructure
@@ -21,15 +19,15 @@ class TopicFragment : InfoCardLoader(R.layout.fragment_topic, R.id.action_nav_to
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- AutoDownloadThread(getString(R.string.topicApiUrl).format(CMApi.myHostApiUrl, arguments?.getString("path"))) {
+ AutoDownloadThread(getString(R.string.topicApiUrl).format(CMApi.myHostApiUrl, arguments?.getString("path"))) { data ->
if(ad?.exit == true) return@AutoDownloadThread
- it?.apply {
+ data?.apply {
val r = inputStream().reader()
val topic = Gson().fromJson(r, TopicStructure::class.java)
topic?.apply {
if(ad?.exit == true) return@AutoDownloadThread
mainWeakReference?.get()?.let {
- if(ad?.exit == false) it.runOnUiThread {
+ if(ad?.exit != true) it.runOnUiThread {
it.toolbar.title = results.title
ftttime.text = results.datetime_created
fttintro.text = results.intro
diff --git a/app/src/main/java/top/fumiama/copymanga/ui/download/NewDownloadFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/download/NewDownloadFragment.kt
index cea3846..464c2ff 100644
--- a/app/src/main/java/top/fumiama/copymanga/ui/download/NewDownloadFragment.kt
+++ b/app/src/main/java/top/fumiama/copymanga/ui/download/NewDownloadFragment.kt
@@ -28,10 +28,10 @@ class NewDownloadFragment: MangaPagesFragmentTemplate(R.layout.fragment_newdownl
sortedBookList = extDir?.listFiles()?.sorted()
}
Log.d("MyNDF", "Start drawing cards")
- cardList.addCard(oldDlCardName, path = oldDlCardName)
+ cardList?.addCard(oldDlCardName, path = oldDlCardName)
sortedBookList?.let {
for(i in it.listIterator(page)) {
- if(cardList.exitCardList) return
+ if(cardList?.exitCardList != false) return
page++ // page is actually count
val chosenJson = File(i, "info.bin")
val newJson = File(i, "info.json")
@@ -39,8 +39,8 @@ class NewDownloadFragment: MangaPagesFragmentTemplate(R.layout.fragment_newdownl
when{
chosenJson.exists() -> continue // unsupported old folder
newJson.exists() -> {
- if(cardList.exitCardList) return
- cardList.addCard(i.name, " ${bookSize}MB")
+ if(cardList?.exitCardList != false) return
+ cardList?.addCard(i.name, " ${bookSize}MB")
}
}
}
@@ -54,7 +54,7 @@ class NewDownloadFragment: MangaPagesFragmentTemplate(R.layout.fragment_newdownl
override fun initCardList(weakReference: WeakReference) {
cardList = CardList(weakReference, cardWidth, cardHeight, cardPerRow)
- cardList.initClickListeners = object : CardList.InitClickListeners {
+ 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) {
@@ -84,7 +84,7 @@ class NewDownloadFragment: MangaPagesFragmentTemplate(R.layout.fragment_newdownl
private fun onLoadFinish() {
MainActivity.mainWeakReference?.get()?.runOnUiThread {
- if(!cardList.exitCardList) mypl.visibility = View.GONE
+ if(cardList?.exitCardList == false) mypl.visibility = View.GONE
}
}
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
index 6eaa6d1..c9ea472 100644
--- a/app/src/main/res/layout/activity_login.xml
+++ b/app/src/main/res/layout/activity_login.xml
@@ -137,13 +137,13 @@
android:orientation="horizontal">
+
+
+
+
请设定提示文字内容
清除设定的图片?
+ 登录
+ 注销
+
权限被拒绝
未登录
- "加载主页控件出错"
+ 加载主页控件出错
N/A
获取图书信息失败
网络错误
@@ -56,6 +59,7 @@
https://%1$s/api/v3/login?platform=3
https://%1$s/api/v3/member/info?platform=3
https://%1$s/api/v3/member/browse/comics?limit=21&offset=%2$d&platform=3
+ https://%1$s/api/v3/member/collect/comics?limit=21&offset=%2$d&free_type=1&ordering=%3$s&platform=3
https://copymanga.azurewebsites.net/api/img?code=%1$s&url=%2$s
https://hi77-overseas.mangafuna.xyz/
@@ -80,6 +84,8 @@
更新时间
热度
+ 加入时间
+ 阅读时间
加入书架
开始阅读
@@ -125,6 +131,7 @@
用户名为空
密码为空
连接失败
+ 重启应用以彻底退出登录
前往旧版下载