Dantotsu/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt
2025-01-06 08:22:44 -06:00

220 lines
8.3 KiB
Kotlin

package ani.dantotsu.settings
import android.content.Intent
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.view.View
import android.view.ViewGroup
import android.widget.AutoCompleteTextView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.updateLayoutParams
import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import ani.dantotsu.R
import ani.dantotsu.databinding.ActivityExtensionsBinding
import ani.dantotsu.initActivity
import ani.dantotsu.media.MediaType
import ani.dantotsu.navBarHeight
import ani.dantotsu.others.AndroidBug5497Workaround
import ani.dantotsu.others.LanguageMapper
import ani.dantotsu.parsers.ParserTestActivity
import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.statusBarHeight
import ani.dantotsu.themes.ThemeManager
import ani.dantotsu.util.customAlertDialog
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import java.util.Locale
class ExtensionsActivity : AppCompatActivity() {
lateinit var binding: ActivityExtensionsBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ThemeManager(this).applyTheme()
binding = ActivityExtensionsBinding.inflate(layoutInflater)
setContentView(binding.root)
initActivity(this)
AndroidBug5497Workaround.assistActivity(this) {
if (it) {
binding.searchView.updateLayoutParams<ViewGroup.MarginLayoutParams> {
bottomMargin = statusBarHeight
}
} else {
binding.searchView.updateLayoutParams<ViewGroup.MarginLayoutParams> {
bottomMargin = statusBarHeight + navBarHeight
}
}
}
binding.searchView.updateLayoutParams<ViewGroup.MarginLayoutParams> {
bottomMargin = statusBarHeight + navBarHeight
}
binding.testButton.setOnClickListener {
ContextCompat.startActivity(
this,
Intent(this, ParserTestActivity::class.java),
null
)
}
val tabLayout = findViewById<TabLayout>(R.id.tabLayout)
val viewPager = findViewById<ViewPager2>(R.id.viewPager)
viewPager.offscreenPageLimit = 1
viewPager.adapter = object : FragmentStateAdapter(this) {
override fun getItemCount(): Int = 6
override fun createFragment(position: Int): Fragment {
return when (position) {
0 -> InstalledAnimeExtensionsFragment()
1 -> AnimeExtensionsFragment()
2 -> InstalledMangaExtensionsFragment()
3 -> MangaExtensionsFragment()
4 -> InstalledNovelExtensionsFragment()
5 -> NovelExtensionsFragment()
else -> AnimeExtensionsFragment()
}
}
}
val searchView: AutoCompleteTextView = findViewById(R.id.searchViewText)
tabLayout.addOnTabSelectedListener(
object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
searchView.setText("")
searchView.clearFocus()
tabLayout.clearFocus()
if (tab.text?.contains("Installed") == true) binding.languageselect.visibility =
View.GONE
else binding.languageselect.visibility = View.VISIBLE
viewPager.updateLayoutParams<ViewGroup.LayoutParams> {
height = ViewGroup.LayoutParams.MATCH_PARENT
}
if (tab.text?.contains("Anime") == true) {
generateRepositoryButton(MediaType.ANIME)
}
if (tab.text?.contains("Manga") == true) {
generateRepositoryButton(MediaType.MANGA)
}
if (tab.text?.contains("Novels") == true) {
generateRepositoryButton(MediaType.NOVEL)
}
}
override fun onTabUnselected(tab: TabLayout.Tab) {
viewPager.updateLayoutParams<ViewGroup.LayoutParams> {
height = ViewGroup.LayoutParams.MATCH_PARENT
}
tabLayout.clearFocus()
}
override fun onTabReselected(tab: TabLayout.Tab) {
viewPager.updateLayoutParams<ViewGroup.LayoutParams> {
height = ViewGroup.LayoutParams.MATCH_PARENT
}
// Do nothing
}
}
)
TabLayoutMediator(tabLayout, viewPager) { tab, position ->
tab.text = when (position) {
0 -> "Installed Anime"
1 -> "Available Anime"
2 -> "Installed Manga"
3 -> "Available Manga"
4 -> "Installed Novels"
5 -> "Available Novels"
else -> null
}
}.attach()
searchView.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
val currentFragment =
supportFragmentManager.findFragmentByTag("f${viewPager.currentItem}")
if (currentFragment is SearchQueryHandler) {
currentFragment.updateContentBasedOnQuery(s?.toString()?.trim())
}
}
})
initActivity(this)
binding.languageselect.setOnClickListener {
val languageOptions =
LanguageMapper.Companion.Language.entries.map { entry ->
entry.name.lowercase().replace("_", " ")
.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.ROOT) else it.toString() }
}.toTypedArray()
val listOrder: String = PrefManager.getVal(PrefName.LangSort)
val index = LanguageMapper.Companion.Language.entries.toTypedArray()
.indexOfFirst { it.code == listOrder }
customAlertDialog().apply {
setTitle("Language")
singleChoiceItems(languageOptions, index) { selected ->
PrefManager.setVal(
PrefName.LangSort,
LanguageMapper.Companion.Language.entries[selected].code
)
val currentFragment =
supportFragmentManager.findFragmentByTag("f${viewPager.currentItem}")
if (currentFragment is SearchQueryHandler) {
currentFragment.notifyDataChanged()
}
}
show()
}
}
binding.settingsContainer.updateLayoutParams<ViewGroup.MarginLayoutParams> {
topMargin = statusBarHeight
bottomMargin = navBarHeight
}
}
private fun generateRepositoryButton(type: MediaType) {
binding.openSettingsButton.setOnClickListener {
val repos: Set<String> = when (type) {
MediaType.ANIME -> {
PrefManager.getVal(PrefName.AnimeExtensionRepos)
}
MediaType.MANGA -> {
PrefManager.getVal(PrefName.MangaExtensionRepos)
}
MediaType.NOVEL -> {
PrefManager.getVal(PrefName.NovelExtensionRepos)
}
}
AddRepositoryBottomSheet.newInstance(
type,
repos.toList(),
AddRepositoryBottomSheet::addRepo,
AddRepositoryBottomSheet::removeRepo
).show(supportFragmentManager, "add_repo")
}
}
}
interface SearchQueryHandler {
fun updateContentBasedOnQuery(query: String?)
fun notifyDataChanged()
}