217 lines
8.8 KiB
Kotlin
217 lines
8.8 KiB
Kotlin
package com.webtoonviewer.ui
|
|
|
|
import android.app.Activity
|
|
import android.content.Intent
|
|
import android.os.Bundle
|
|
import android.util.Log
|
|
import android.view.View
|
|
import android.widget.ImageButton
|
|
import android.widget.ImageView
|
|
import android.widget.TextView
|
|
import android.widget.Toast
|
|
import androidx.activity.OnBackPressedCallback
|
|
import androidx.activity.viewModels
|
|
import androidx.appcompat.app.AppCompatActivity
|
|
import androidx.lifecycle.Observer
|
|
import androidx.lifecycle.lifecycleScope
|
|
import androidx.recyclerview.widget.GridLayoutManager
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
import com.webtoonviewer.R
|
|
import com.webtoonviewer.db.Book
|
|
import com.webtoonviewer.network.SmbClientHelper
|
|
import com.webtoonviewer.repository.BookRepository
|
|
import com.webtoonviewer.ui.adapter.EpisodeAdapter
|
|
import com.webtoonviewer.ui.component.DownloadViewModel
|
|
import com.webtoonviewer.utils.CommonUtils.getEpisodeNameFromEpisode
|
|
import com.webtoonviewer.utils.CommonUtils.getEllipsizedText
|
|
import com.webtoonviewer.utils.SharedPreferencesHelper
|
|
import com.webtoonviewer.utils.Webtoon18Plus.WEBTOON18PLUS
|
|
import com.webtoonviewer.utils.loadImgFromAssets
|
|
import kotlinx.coroutines.Dispatchers
|
|
import kotlinx.coroutines.GlobalScope
|
|
import kotlinx.coroutines.launch
|
|
import kotlinx.coroutines.withContext
|
|
|
|
class EpisodesActivity : AppCompatActivity() {
|
|
private val bookRepository: BookRepository = BookRepository(this)
|
|
private val bookIdPreferences: SharedPreferencesHelper = SharedPreferencesHelper(this, "book_id")
|
|
private val downloadingPreference: SharedPreferencesHelper = SharedPreferencesHelper(this, "downloading")
|
|
|
|
private lateinit var recyclerView: RecyclerView
|
|
private lateinit var episodeAdapter: EpisodeAdapter
|
|
private lateinit var book: Book
|
|
private lateinit var title: String
|
|
private lateinit var currentEpisode: String
|
|
private lateinit var currentEpisodeTextView: TextView
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
setContentView(R.layout.activity_episodes)
|
|
|
|
recyclerView = findViewById(R.id.recyclerViewEpisodesPageEpisodeList)
|
|
recyclerView.layoutManager = GridLayoutManager(this, 4)
|
|
|
|
title = intent.getStringExtra("selectedTitle") ?: ""
|
|
val thumbnail = intent.getStringExtra("thumbnail") ?: ""
|
|
if (title != "") {
|
|
val titleTextView: TextView = findViewById(R.id.textViewEpisodesPageTitle)
|
|
titleTextView.text = title
|
|
|
|
val titleImageView: ImageView = findViewById(R.id.imageViewEpisodesPageImg)
|
|
val bitmap = loadImgFromAssets(this, thumbnail)
|
|
if (bitmap != null) {
|
|
titleImageView.setImageBitmap(bitmap)
|
|
} else {
|
|
titleImageView.setImageResource(R.drawable.ic_launcher_background)
|
|
}
|
|
|
|
val btnDownload: ImageButton = findViewById(R.id.btnEpisodesPageDownload)
|
|
|
|
lifecycleScope.launch {
|
|
withContext(Dispatchers.IO) {
|
|
val id = bookIdPreferences.readData(title, "0").toInt()
|
|
book = bookRepository.getBookById(id)!!
|
|
|
|
val authorTextView: TextView = findViewById(R.id.textViewEpisodesPageAuthor)
|
|
authorTextView.text = book.author
|
|
|
|
currentEpisodeTextView = findViewById(R.id.textViewEpisodesPageCurrentEpisode)
|
|
currentEpisode = book.bookmarkChapter
|
|
setCurrentEpisodeTextView()
|
|
|
|
currentEpisodeTextView.setOnClickListener {
|
|
val intent = Intent(this@EpisodesActivity, ImagesActivity::class.java)
|
|
intent.putExtra("selectedTitle", book.title)
|
|
intent.putExtra("selectedChapter", currentEpisode)
|
|
intent.putExtra("thumbnail", book.img)
|
|
intent.putExtra("position", book.bookmarkPosition)
|
|
intent.putExtra("offset", book.bookmarkTopOffset)
|
|
startActivity(intent)
|
|
}
|
|
|
|
val btnDescription: ImageButton = findViewById(R.id.btnEpisodesPageDescription)
|
|
btnDescription.setOnClickListener {
|
|
val intent = Intent(this@EpisodesActivity, DescriptionActivity::class.java)
|
|
intent.putExtra("id", book.id)
|
|
intent.putExtra("description", book.description)
|
|
startActivity(intent)
|
|
}
|
|
|
|
val isDownloading = downloadingPreference.readData("key", "n")
|
|
if (book.isLocal == 0 && isDownloading == "n") {
|
|
btnDownload.visibility = View.VISIBLE
|
|
}
|
|
}
|
|
// 数据加载完毕,更新 UI
|
|
withContext(Dispatchers.Main) {
|
|
episodeAdapter = EpisodeAdapter(book.chapters) { selectedChapter ->
|
|
val intent = Intent(this@EpisodesActivity, ImagesActivity::class.java)
|
|
|
|
intent.putExtra("selectedTitle", title)
|
|
intent.putExtra("selectedChapter", selectedChapter)
|
|
intent.putExtra("thumbnail", thumbnail)
|
|
startActivity(intent)
|
|
}
|
|
recyclerView.adapter = episodeAdapter
|
|
}
|
|
}
|
|
|
|
btnDownload.setOnClickListener{
|
|
btnDownload.visibility = View.GONE
|
|
downloadingPreference.saveData("key", "y")
|
|
val smbClientHelper = SmbClientHelper(this)
|
|
GlobalScope.launch(Dispatchers.IO) {
|
|
var isConnect = false
|
|
try {
|
|
isConnect = smbClientHelper.connect()
|
|
if (isConnect) {
|
|
withContext(Dispatchers.Main) {
|
|
Toast.makeText(this@EpisodesActivity, "开始下载", Toast.LENGTH_SHORT).show()
|
|
}
|
|
smbClientHelper.downloadWebtoon(title)
|
|
}
|
|
} catch (e: Exception) {
|
|
Log.e("SMB", "Error accessing SMB share", e)
|
|
} finally {
|
|
if (isConnect) {
|
|
smbClientHelper.disconnect()
|
|
withContext(Dispatchers.Main) {
|
|
Toast.makeText(this@EpisodesActivity, "下载完毕", Toast.LENGTH_SHORT).show()
|
|
}
|
|
}
|
|
bookRepository.updateIsLocal(book.id, 1)
|
|
downloadingPreference.saveData("key", "n")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
val btn18: ImageButton = findViewById(R.id.btnEpisodesPage18)
|
|
if (WEBTOON18PLUS.contains("$title[18+]")) {
|
|
btn18.visibility = View.VISIBLE
|
|
btn18.setOnClickListener {
|
|
val intent = Intent(this, EpisodesActivity::class.java)
|
|
intent.putExtra("selectedTitle", "$title[18+]")
|
|
intent.putExtra("thumbnail", thumbnail)
|
|
startActivity(intent)
|
|
}
|
|
}
|
|
|
|
val btnBack: ImageButton = findViewById(R.id.btnEpisodesPageHome)
|
|
btnBack.setOnClickListener {
|
|
returnToLastActivity()
|
|
}
|
|
|
|
onBackPressedDispatcher.addCallback(this, object: OnBackPressedCallback(true) {
|
|
override fun handleOnBackPressed() {
|
|
returnToLastActivity()
|
|
}
|
|
})
|
|
}
|
|
|
|
override fun onResume() {
|
|
super.onResume()
|
|
lifecycleScope.launch {
|
|
refreshData()
|
|
}
|
|
}
|
|
|
|
private suspend fun refreshData() {
|
|
val id = bookIdPreferences.readData(title, "0").toInt()
|
|
book = bookRepository.getBookById(id)!!
|
|
currentEpisode = book.bookmarkChapter
|
|
setCurrentEpisodeTextView()
|
|
|
|
}
|
|
|
|
private fun setCurrentEpisodeTextView() {
|
|
if (currentEpisode != "") {
|
|
currentEpisodeTextView.post {
|
|
currentEpisodeTextView.text = getEllipsizedText(
|
|
currentEpisodeTextView, "${"继续阅读: " + getEpisodeNameFromEpisode(currentEpisode)} >>"
|
|
)
|
|
}
|
|
} else {
|
|
currentEpisode = book.chapters[0]
|
|
currentEpisodeTextView.post {
|
|
currentEpisodeTextView.text = getEllipsizedText(
|
|
currentEpisodeTextView,
|
|
"开始阅读: ${getEpisodeNameFromEpisode(currentEpisode)} >>"
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun returnToLastActivity() {
|
|
val resultIntent = Intent().apply {
|
|
putExtra("bookmarkUpdated", book.title)
|
|
}
|
|
setResult(Activity.RESULT_OK, resultIntent)
|
|
finish()
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|