mirror of
https://github.com/fumiama/copymanga.git
synced 2026-06-05 07:20:23 +08:00
v2.0.beta21
新增 1. 退出登录(历史记录不显示就是因为在官方APP或其它第三方APP登录从而使本APP的token无效, 这时退出登录后重登可解) 2. 我的订阅 (fix #28) (fix #31) 修复 1. 专题系列的标题有时无法显示 2. 登录后无法立即显示头像 3. 进入分类页后立即返回则闪退 4. 分类页排序按更新时间和按热度相同 优化 1. 用户头像显示为圆形
This commit is contained in:
7
.idea/dictionaries/fumiama.xml
generated
Normal file
7
.idea/dictionaries/fumiama.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
<component name="ProjectDictionaryState">
|
||||
<dictionary name="fumiama">
|
||||
<words>
|
||||
<w>lowpan</w>
|
||||
</words>
|
||||
</dictionary>
|
||||
</component>
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<MainActivity>? = null
|
||||
var ime: InputMethodManager? = null
|
||||
const val MSG_CROP_IMAGE = 1
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package top.fumiama.copymanga.json;
|
||||
|
||||
public class LastBrowseStructure {
|
||||
public String last_browse_id;
|
||||
public String last_browse_name;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
@@ -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<Fragment>) {
|
||||
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
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<Fragment>) {
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -137,13 +137,13 @@
|
||||
android:orientation="horizontal">
|
||||
|
||||
<Button
|
||||
android:id="@+id/alblogin"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/alblogin"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:background="@drawable/buttonshapewhitebg"
|
||||
android:fontFamily="@font/calibri"
|
||||
android:text="Sign in"
|
||||
android:text="@string/login"
|
||||
android:textAllCaps="false"
|
||||
android:textColor="@android:color/white"
|
||||
android:textSize="16dp"
|
||||
|
||||
26
app/src/main/res/layout/fragment_shelf.xml
Normal file
26
app/src/main/res/layout/fragment_shelf.xml
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context="top.fumiama.copymanga.ui.cardflow.shelf.ShelfFragment">
|
||||
|
||||
<include
|
||||
android:id="@+id/fslsi"
|
||||
layout="@layout/line_shelf"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<include
|
||||
layout="@layout/line_lazybooklines"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/fslsi" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
45
app/src/main/res/layout/line_shelf.xml
Normal file
45
app/src/main/res/layout/line_shelf.xml
Normal file
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<include
|
||||
layout="@layout/div_h"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="1dp"
|
||||
android:layout_marginTop="@dimen/nav_header_vertical_spacing"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/line_shelf_updated" />
|
||||
|
||||
<include
|
||||
android:id="@+id/line_shelf_updated"
|
||||
layout="@layout/anchor_popular"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/line_shelf_modifier"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<include
|
||||
android:id="@+id/line_shelf_modifier"
|
||||
layout="@layout/anchor_popular"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/line_shelf_updated"
|
||||
app:layout_constraintStart_toEndOf="@+id/line_shelf_browse"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<include
|
||||
android:id="@+id/line_shelf_browse"
|
||||
layout="@layout/anchor_popular"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@+id/line_shelf_modifier"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -75,6 +75,20 @@
|
||||
app:popExitAnim="@anim/slide_in_right_exit"/>
|
||||
</fragment>
|
||||
|
||||
<fragment
|
||||
android:id="@+id/nav_sub"
|
||||
android:name="top.fumiama.copymanga.ui.cardflow.shelf.ShelfFragment"
|
||||
android:label="@string/menu_sub"
|
||||
tools:layout="@layout/fragment_shelf" >
|
||||
<action
|
||||
android:id="@+id/action_nav_sub_to_nav_book"
|
||||
app:destination="@id/nav_book"
|
||||
app:enterAnim="@anim/slide_in_right"
|
||||
app:exitAnim="@anim/slide_out_left"
|
||||
app:popEnterAnim="@anim/slide_out_left_exit"
|
||||
app:popExitAnim="@anim/slide_in_right_exit"/>
|
||||
</fragment>
|
||||
|
||||
<fragment
|
||||
android:id="@+id/nav_history"
|
||||
android:name="top.fumiama.copymanga.ui.cardflow.history.HistoryFragment"
|
||||
|
||||
@@ -28,9 +28,12 @@
|
||||
<string name="navTextInfoInputHint">请设定提示文字内容</string>
|
||||
<string name="clearHeadImgMsg">清除设定的图片?</string>
|
||||
|
||||
<string name="login">登录</string>
|
||||
<string name="logout">注销</string>
|
||||
|
||||
<string name="permissionDenied">权限被拒绝</string>
|
||||
<string name="noLogin">未登录</string>
|
||||
<string name="load_home_error">"加载主页控件出错"</string>
|
||||
<string name="load_home_error">加载主页控件出错</string>
|
||||
<string name="text_null">N/A</string>
|
||||
<string name="null_book">获取图书信息失败</string>
|
||||
<string name="web_error">网络错误</string>
|
||||
@@ -56,6 +59,7 @@
|
||||
<string name="loginApiUrl">https://%1$s/api/v3/login?platform=3</string>
|
||||
<string name="memberInfoApiUrl">https://%1$s/api/v3/member/info?platform=3</string>
|
||||
<string name="historyApiUrl">https://%1$s/api/v3/member/browse/comics?limit=21&offset=%2$d&platform=3</string>
|
||||
<string name="shelfApiUrl">https://%1$s/api/v3/member/collect/comics?limit=21&offset=%2$d&free_type=1&ordering=%3$s&platform=3</string>
|
||||
|
||||
<string name="imgProxyApiUrl">https://copymanga.azurewebsites.net/api/img?code=%1$s&url=%2$s</string>
|
||||
<string name="imgProxyApiPrefix">https://hi77-overseas.mangafuna.xyz/</string>
|
||||
@@ -80,6 +84,8 @@
|
||||
|
||||
<string name="menu_update_time">更新时间</string>
|
||||
<string name="menu_hot">热度</string>
|
||||
<string name="menu_add_time">加入时间</string>
|
||||
<string name="menu_read_time">阅读时间</string>
|
||||
|
||||
<string name="button_sub">加入书架</string>
|
||||
<string name="button_start">开始阅读</string>
|
||||
@@ -125,6 +131,7 @@
|
||||
<string name="login_null_username">用户名为空</string>
|
||||
<string name="login_null_pwd">密码为空</string>
|
||||
<string name="login_get_conn_failed">连接失败</string>
|
||||
<string name="login_restart_to_apply">重启应用以彻底退出登录</string>
|
||||
|
||||
<string name="old_download_card_name">前往旧版下载</string>
|
||||
</resources>
|
||||
|
||||
Reference in New Issue
Block a user