You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
276 lines
9.8 KiB
276 lines
9.8 KiB
package com.novel.read.fragment
|
|
|
|
import android.app.AlertDialog
|
|
import android.os.Bundle
|
|
import android.util.Log
|
|
import android.view.View
|
|
import androidx.appcompat.app.AppCompatDelegate
|
|
import androidx.recyclerview.widget.GridLayoutManager
|
|
import com.mango.mangolib.event.EventManager
|
|
import com.novel.read.R
|
|
import com.novel.read.activity.NovelMainActivity
|
|
import com.novel.read.activity.NovelSearchActivity
|
|
import com.novel.read.adapter.BookAdapter
|
|
import com.novel.read.base.NovelBaseFragment
|
|
import com.novel.read.constants.Constant
|
|
import com.novel.read.event.HideBottomBarEvent
|
|
import com.novel.read.event.SwitchFragmentEvent
|
|
import com.novel.read.event.UpdateBookEvent
|
|
import com.novel.read.http.AccountManager
|
|
import com.novel.read.model.db.BookRecordBean
|
|
import com.novel.read.model.db.CollBookBean
|
|
import com.novel.read.model.db.dbManage.BookRepository
|
|
import com.novel.read.model.protocol.BookDetailResp
|
|
import com.novel.read.showToast
|
|
import com.novel.read.utlis.LocalManageUtil
|
|
import com.novel.read.utlis.RxUtils
|
|
import com.novel.read.utlis.SpUtil
|
|
import com.squareup.otto.Subscribe
|
|
import io.reactivex.Single
|
|
import io.reactivex.SingleObserver
|
|
import io.reactivex.disposables.Disposable
|
|
import kotlinx.android.synthetic.main.fragment_book.*
|
|
import org.litepal.LitePal
|
|
import java.util.*
|
|
|
|
/**
|
|
* create by 赵利君 on 2019/10/14
|
|
* describe:
|
|
*/
|
|
class BookFragment : NovelBaseFragment() {
|
|
|
|
private lateinit var mAdapter: BookAdapter
|
|
private val mList = ArrayList<CollBookBean>()
|
|
private var isInit = true
|
|
|
|
override fun getLayoutId(): Int {
|
|
return R.layout.fragment_book
|
|
}
|
|
|
|
override fun initView() {
|
|
EventManager.instance.registerSubscriber(this)
|
|
|
|
mList.addAll(BookRepository.getInstance().collBooks)
|
|
val gridLayoutManager = GridLayoutManager(activity, 3)
|
|
gridLayoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
|
|
override fun getSpanSize(i: Int): Int {
|
|
return if (mList.size == 0) {
|
|
3
|
|
} else {
|
|
1
|
|
}
|
|
}
|
|
}
|
|
|
|
rlv_book.layoutManager = gridLayoutManager
|
|
mAdapter = BookAdapter(mList)
|
|
rlv_book.adapter = mAdapter
|
|
if (isInit) {
|
|
isInit = false
|
|
update(mList)
|
|
}
|
|
}
|
|
|
|
override fun initData() {
|
|
title.inflateMenu(R.menu.title_book)
|
|
title_edit.inflateMenu(R.menu.title_edit)
|
|
setOnClick()
|
|
}
|
|
|
|
private fun setOnClick() {
|
|
title.setOnMenuItemClickListener { menuItem ->
|
|
when (menuItem.itemId) {
|
|
R.id.action_search -> {
|
|
toActivity(NovelSearchActivity::class.java)
|
|
activity!!.overridePendingTransition(
|
|
R.anim.message_fade_in,
|
|
R.anim.message_fade_out
|
|
)
|
|
}
|
|
R.id.edit_book -> if (mList.size == 0) { //没书的时候提醒用户不能编辑
|
|
activity!!.showToast(getString(R.string.please_add_book))
|
|
} else {
|
|
mAdapter.setEdit(true)
|
|
tv_cancel.visibility = View.VISIBLE
|
|
tv_delete.visibility = View.VISIBLE
|
|
title_edit.visibility = View.VISIBLE
|
|
title.visibility = View.GONE
|
|
EventManager.instance.postEvent(HideBottomBarEvent(true))
|
|
}
|
|
R.id.book_sort -> showBookSortDialog()
|
|
R.id.menu2 -> showLanguageDialog()
|
|
R.id.menu3 -> {
|
|
if (SpUtil.getBooleanValue(Constant.NIGHT)) {
|
|
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
|
|
SpUtil.setBooleanValue(Constant.NIGHT, false)
|
|
} else {
|
|
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
|
|
SpUtil.setBooleanValue(Constant.NIGHT, true)
|
|
}
|
|
activity!!.recreate()
|
|
}
|
|
}
|
|
true
|
|
}
|
|
title_edit.setOnMenuItemClickListener { menuItem ->
|
|
if (menuItem.itemId == R.id.action_edit) {
|
|
for (i in mList.indices) {
|
|
mList[i].isSelect = true
|
|
}
|
|
mAdapter.notifyDataSetChanged()
|
|
}
|
|
true
|
|
}
|
|
tv_cancel.setOnClickListener {
|
|
EventManager.instance.postEvent(HideBottomBarEvent(false))
|
|
updateBook(UpdateBookEvent())
|
|
}
|
|
|
|
tv_delete.setOnClickListener {
|
|
val deleteList = mAdapter.selectList
|
|
for (i in deleteList.indices) {
|
|
if (deleteList[i].isSaved) {
|
|
val count = deleteList[i].delete()
|
|
LitePal.deleteAll(BookRecordBean::class.java, "bookId=?", mList[i].id)
|
|
Log.e("count", "setOnClick: $count")
|
|
}
|
|
}
|
|
activity!!.showToast(getString(R.string.delete_success))
|
|
EventManager.instance.postEvent(HideBottomBarEvent(false))
|
|
updateBook(UpdateBookEvent())
|
|
}
|
|
|
|
mAdapter.setOnItemClickListener(object : BookAdapter.OnItemClickListener {
|
|
override fun onItemClick(view: View, pos: Int) {
|
|
EventManager.instance.postEvent(SwitchFragmentEvent())
|
|
}
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
private fun showLanguageDialog() {
|
|
AlertDialog.Builder(activity)
|
|
.setTitle(getString(R.string.choose_language))
|
|
.setSingleChoiceItems(
|
|
resources.getStringArray(R.array.setting_dialog_language_choice),
|
|
SpUtil.getIntValue(Constant.Language, 1)
|
|
) { dialog, which ->
|
|
resources.getStringArray(R.array.setting_dialog_language_choice)[which]
|
|
SpUtil.setIntValue(Constant.Language, which)
|
|
dialog.dismiss()
|
|
if (which == 0) {
|
|
selectLanguage(0)
|
|
} else {
|
|
selectLanguage(1)
|
|
}
|
|
}.create().show()
|
|
}
|
|
|
|
private fun selectLanguage(select: Int) {
|
|
LocalManageUtil.saveSelectLanguage(activity, select)
|
|
NovelMainActivity.reStart(activity!!)
|
|
}
|
|
|
|
private fun showBookSortDialog() {
|
|
AlertDialog.Builder(activity)
|
|
.setTitle(getString(R.string.choose_language))
|
|
.setSingleChoiceItems(
|
|
resources.getStringArray(R.array.setting_dialog_sort_choice),
|
|
if (SpUtil.getBooleanValue(Constant.BookSort, false)) 0 else 1
|
|
) { dialog, which ->
|
|
if (which == 0) {
|
|
SpUtil.setBooleanValue(Constant.BookSort, true)
|
|
} else {
|
|
SpUtil.setBooleanValue(Constant.BookSort, false)
|
|
}
|
|
updateBook(UpdateBookEvent())
|
|
dialog.dismiss()
|
|
}
|
|
.create().show()
|
|
}
|
|
|
|
override fun onResume() {
|
|
super.onResume()
|
|
updateBook(UpdateBookEvent())
|
|
}
|
|
|
|
@Subscribe
|
|
fun updateBook(event: UpdateBookEvent) {
|
|
tv_cancel.visibility = View.GONE
|
|
tv_delete.visibility = View.GONE
|
|
title.visibility = View.VISIBLE
|
|
title_edit.visibility = View.GONE
|
|
mList.clear()
|
|
mList.addAll(BookRepository.getInstance().collBooks)
|
|
mAdapter.setEdit(false)
|
|
}
|
|
|
|
private fun update(collBookBeans: List<CollBookBean>?) { //检测书籍更新
|
|
if (collBookBeans == null || collBookBeans.isEmpty()) return
|
|
val collBooks = ArrayList(collBookBeans)
|
|
val observables = ArrayList<Single<BookDetailResp>>(collBooks.size)
|
|
val it = collBooks.iterator()
|
|
while (it.hasNext()) {
|
|
val collBook = it.next()
|
|
//删除本地文件
|
|
if (collBook.isLocal) {
|
|
it.remove()
|
|
} else {
|
|
observables.add(AccountManager.getInstance().getBookDetails(collBook.id))
|
|
}
|
|
}
|
|
//zip可能不是一个好方法。
|
|
Single.zip<BookDetailResp, List<CollBookBean>>(observables) { objects ->
|
|
val newCollBooks = ArrayList<CollBookBean>(objects.size)
|
|
for (i in collBooks.indices) {
|
|
val oldCollBook = collBooks[i]
|
|
val newCollBook = (objects[i] as BookDetailResp).collBookBean
|
|
//如果是oldBook是update状态,或者newCollBook与oldBook章节数不同
|
|
if (oldCollBook.isUpdate || oldCollBook.lastChapter != newCollBook.lastChapter) {
|
|
newCollBook.setIsUpdate(true)
|
|
} else {
|
|
newCollBook.setIsUpdate(false)
|
|
}
|
|
newCollBook.lastRead = oldCollBook.lastRead
|
|
newCollBooks.add(newCollBook)
|
|
//存储到数据库中
|
|
BookRepository.getInstance().saveCollBooks(newCollBooks)
|
|
}
|
|
newCollBooks
|
|
}.compose<List<CollBookBean>> {
|
|
RxUtils.toSimpleSingle(
|
|
it
|
|
)
|
|
}.subscribe(object : SingleObserver<List<CollBookBean>> {
|
|
override fun onSubscribe(d: Disposable) {
|
|
}
|
|
|
|
override fun onSuccess(value: List<CollBookBean>) {
|
|
//跟原先比较
|
|
mList.clear()
|
|
mList.addAll(BookRepository.getInstance().collBooks)
|
|
mAdapter.notifyDataSetChanged()
|
|
}
|
|
|
|
override fun onError(e: Throwable) {}
|
|
}
|
|
)
|
|
}
|
|
|
|
override fun onDestroy() {
|
|
super.onDestroy()
|
|
EventManager.instance.unregisterSubscriber(this)
|
|
}
|
|
|
|
companion object {
|
|
|
|
fun newInstance(): BookFragment {
|
|
val args = Bundle()
|
|
val fragment = BookFragment()
|
|
fragment.arguments = args
|
|
return fragment
|
|
}
|
|
}
|
|
} |