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 { bottomMargin = statusBarHeight } } else { binding.searchView.updateLayoutParams { bottomMargin = statusBarHeight + navBarHeight } } } binding.searchView.updateLayoutParams { bottomMargin = statusBarHeight + navBarHeight } binding.testButton.setOnClickListener { ContextCompat.startActivity( this, Intent(this, ParserTestActivity::class.java), null ) } val tabLayout = findViewById(R.id.tabLayout) val viewPager = findViewById(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 { 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 { height = ViewGroup.LayoutParams.MATCH_PARENT } tabLayout.clearFocus() } override fun onTabReselected(tab: TabLayout.Tab) { viewPager.updateLayoutParams { 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 { topMargin = statusBarHeight bottomMargin = navBarHeight } } private fun generateRepositoryButton(type: MediaType) { binding.openSettingsButton.setOnClickListener { val repos: Set = 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() }