mirror of
https://github.com/rebelonion/Dantotsu.git
synced 2026-01-27 18:51:01 +00:00
Addons (#368)
* feat: (wip) torrent credit to kuukiyomi * fix: extensions -> addons * fix: unified loader * feat: (wip) modularity * fix: addon ui * feat: addon install/uninstall --------- Co-authored-by: aayush262 <aayushthakur262006@gmail.com>
This commit is contained in:
259
app/src/main/java/ani/dantotsu/settings/SettingsAddonActivity.kt
Normal file
259
app/src/main/java/ani/dantotsu/settings/SettingsAddonActivity.kt
Normal file
@@ -0,0 +1,259 @@
|
||||
package ani.dantotsu.settings
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.animation.LinearInterpolator
|
||||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.view.updateLayoutParams
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import ani.dantotsu.R
|
||||
import ani.dantotsu.addons.AddonDownloader
|
||||
import ani.dantotsu.addons.AddonListener
|
||||
import ani.dantotsu.addons.download.DownloadAddonManager
|
||||
import ani.dantotsu.addons.torrent.ServerService
|
||||
import ani.dantotsu.addons.torrent.TorrentAddonManager
|
||||
import ani.dantotsu.databinding.ActivitySettingsAddonsBinding
|
||||
import ani.dantotsu.databinding.ItemSettingsBinding
|
||||
import ani.dantotsu.initActivity
|
||||
import ani.dantotsu.navBarHeight
|
||||
import ani.dantotsu.settings.saving.PrefManager
|
||||
import ani.dantotsu.settings.saving.PrefName
|
||||
import ani.dantotsu.snackString
|
||||
import ani.dantotsu.statusBarHeight
|
||||
import ani.dantotsu.themes.ThemeManager
|
||||
import ani.dantotsu.toast
|
||||
import ani.dantotsu.util.Logger
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.isActive
|
||||
import kotlinx.coroutines.job
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import tachiyomi.core.util.lang.launchIO
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
|
||||
class SettingsAddonActivity : AppCompatActivity() {
|
||||
private lateinit var binding: ActivitySettingsAddonsBinding
|
||||
private val downloadAddonManager: DownloadAddonManager = Injekt.get()
|
||||
private val torrentAddonManager: TorrentAddonManager = Injekt.get()
|
||||
|
||||
@OptIn(DelicateCoroutinesApi::class)
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
ThemeManager(this).applyTheme()
|
||||
initActivity(this)
|
||||
val context = this
|
||||
binding = ActivitySettingsAddonsBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
|
||||
binding.apply {
|
||||
settingsAddonsLayout.updateLayoutParams<ViewGroup.MarginLayoutParams> {
|
||||
topMargin = statusBarHeight
|
||||
bottomMargin = navBarHeight
|
||||
}
|
||||
|
||||
binding.addonSettingsBack.setOnClickListener { onBackPressedDispatcher.onBackPressed() }
|
||||
|
||||
binding.settingsRecyclerView.adapter = SettingsAdapter(
|
||||
arrayListOf(
|
||||
Settings(
|
||||
type = 1,
|
||||
name = getString(R.string.anime_downloader_addon),
|
||||
desc = getString(R.string.not_installed),
|
||||
icon = R.drawable.anim_play_to_pause,
|
||||
isActivity = true,
|
||||
attach = {
|
||||
setStatus(
|
||||
view = it,
|
||||
context = context,
|
||||
status = downloadAddonManager.hadError(context),
|
||||
hasUpdate = downloadAddonManager.hasUpdate
|
||||
)
|
||||
var job = Job()
|
||||
downloadAddonManager.addListenerAction { _ ->
|
||||
job.cancel()
|
||||
it.settingsIconRight.animate().cancel()
|
||||
it.settingsIconRight.rotation = 0f
|
||||
setStatus(
|
||||
view = it,
|
||||
context = context,
|
||||
status = downloadAddonManager.hadError(context),
|
||||
hasUpdate = false
|
||||
)
|
||||
}
|
||||
it.settingsIconRight.setOnClickListener { _ ->
|
||||
if (it.settingsDesc.text == getString(R.string.installed)) {
|
||||
downloadAddonManager.uninstall()
|
||||
return@setOnClickListener //uninstall logic here
|
||||
} else {
|
||||
job = Job()
|
||||
val scope = CoroutineScope(Dispatchers.Main + job)
|
||||
it.settingsIconRight.setImageResource(R.drawable.ic_sync)
|
||||
scope.launch {
|
||||
while (isActive) {
|
||||
withContext(Dispatchers.Main) {
|
||||
it.settingsIconRight.animate()
|
||||
.rotationBy(360f)
|
||||
.setDuration(1000)
|
||||
.setInterpolator(LinearInterpolator())
|
||||
.start()
|
||||
}
|
||||
delay(1000)
|
||||
}
|
||||
}
|
||||
snackString(getString(R.string.downloading))
|
||||
lifecycleScope.launchIO {
|
||||
AddonDownloader.update(
|
||||
activity = context,
|
||||
downloadAddonManager,
|
||||
repo = DownloadAddonManager.REPO,
|
||||
currentVersion = downloadAddonManager.getVersion() ?: ""
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
), Settings(
|
||||
type = 1,
|
||||
name = getString(R.string.torrent_addon),
|
||||
desc = getString(R.string.not_installed),
|
||||
icon = R.drawable.anim_play_to_pause,
|
||||
isActivity = true,
|
||||
attach = {
|
||||
setStatus(
|
||||
view = it,
|
||||
context = context,
|
||||
status = torrentAddonManager.hadError(context),
|
||||
hasUpdate = torrentAddonManager.hasUpdate
|
||||
)
|
||||
var job = Job()
|
||||
torrentAddonManager.addListenerAction { _ ->
|
||||
job.cancel()
|
||||
it.settingsIconRight.animate().cancel()
|
||||
it.settingsIconRight.rotation = 0f
|
||||
setStatus(
|
||||
view = it,
|
||||
context = context,
|
||||
status = torrentAddonManager.hadError(context),
|
||||
hasUpdate = false
|
||||
)
|
||||
}
|
||||
it.settingsIconRight.setOnClickListener { _ ->
|
||||
if (it.settingsDesc.text == getString(R.string.installed)) {
|
||||
ServerService.stop()
|
||||
torrentAddonManager.uninstall()
|
||||
return@setOnClickListener
|
||||
} else {
|
||||
job = Job()
|
||||
val scope = CoroutineScope(Dispatchers.Main + job)
|
||||
it.settingsIconRight.setImageResource(R.drawable.ic_sync)
|
||||
scope.launch {
|
||||
while (isActive) {
|
||||
withContext(Dispatchers.Main) {
|
||||
it.settingsIconRight.animate()
|
||||
.rotationBy(360f)
|
||||
.setDuration(1000)
|
||||
.setInterpolator(LinearInterpolator())
|
||||
.start()
|
||||
}
|
||||
delay(1000)
|
||||
}
|
||||
}
|
||||
snackString(getString(R.string.downloading))
|
||||
lifecycleScope.launchIO {
|
||||
AddonDownloader.update(
|
||||
activity = context,
|
||||
torrentAddonManager,
|
||||
repo = TorrentAddonManager.REPO,
|
||||
currentVersion = torrentAddonManager.getVersion() ?: "",
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
),
|
||||
Settings(
|
||||
type = 2,
|
||||
name = getString(R.string.enable_torrent),
|
||||
desc = getString(R.string.enable_torrent),
|
||||
icon = R.drawable.ic_round_dns_24,
|
||||
isChecked = PrefManager.getVal(PrefName.TorrentEnabled),
|
||||
switch = { isChecked, _ ->
|
||||
PrefManager.setVal(PrefName.TorrentEnabled, isChecked)
|
||||
Injekt.get<TorrentAddonManager>().extension?.let {
|
||||
if (isChecked) {
|
||||
lifecycleScope.launchIO {
|
||||
if (!ServerService.isRunning()) {
|
||||
ServerService.start()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
lifecycleScope.launchIO {
|
||||
if (ServerService.isRunning()) {
|
||||
ServerService.stop()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
)
|
||||
)
|
||||
binding.settingsRecyclerView.layoutManager =
|
||||
LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
torrentAddonManager.removeListenerAction()
|
||||
downloadAddonManager.removeListenerAction()
|
||||
}
|
||||
|
||||
private fun setStatus(
|
||||
view: ItemSettingsBinding,
|
||||
context: Context,
|
||||
status: String?,
|
||||
hasUpdate: Boolean
|
||||
) {
|
||||
try {
|
||||
when (status) {
|
||||
context.getString(R.string.loaded_successfully) -> {
|
||||
view.settingsIconRight.setImageResource(R.drawable.ic_round_delete_24)
|
||||
view.settingsIconRight.rotation = 0f
|
||||
view.settingsDesc.text = context.getString(R.string.installed)
|
||||
}
|
||||
|
||||
null -> {
|
||||
view.settingsIconRight.setImageResource(R.drawable.ic_download_24)
|
||||
view.settingsIconRight.rotation = 0f
|
||||
view.settingsDesc.text = context.getString(R.string.not_installed)
|
||||
}
|
||||
|
||||
else -> {
|
||||
view.settingsIconRight.setImageResource(R.drawable.ic_round_new_releases_24)
|
||||
view.settingsIconRight.rotation = 0f
|
||||
view.settingsDesc.text = context.getString(R.string.error_msg, status)
|
||||
}
|
||||
}
|
||||
if (hasUpdate) {
|
||||
view.settingsIconRight.setImageResource(R.drawable.ic_round_sync_24)
|
||||
view.settingsDesc.text = context.getString(R.string.update_addon)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Logger.log(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user