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">