AquaStream/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt

555 lines
22 KiB
Kotlin
Raw Normal View History

2021-05-12 21:51:02 +00:00
package com.lagradost.cloudstream3.ui.search
2022-11-05 00:27:35 +00:00
import android.content.DialogInterface
2021-05-15 23:37:42 +00:00
import android.content.res.Configuration
2021-05-12 21:51:02 +00:00
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.AbsListView
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.ListView
2022-11-05 00:27:35 +00:00
import androidx.appcompat.app.AlertDialog
2021-05-15 23:37:42 +00:00
import androidx.appcompat.widget.SearchView
2021-12-13 18:41:33 +00:00
import androidx.core.view.isVisible
2021-05-12 21:51:02 +00:00
import androidx.fragment.app.Fragment
2021-11-20 00:41:37 +00:00
import androidx.fragment.app.activityViewModels
2021-05-15 23:37:42 +00:00
import androidx.preference.PreferenceManager
2021-08-12 00:04:58 +00:00
import androidx.recyclerview.widget.GridLayoutManager
2021-05-15 23:37:42 +00:00
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.button.MaterialButton
2021-09-12 14:10:22 +00:00
import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.APIHolder.filterProviderByPreferredMedia
import com.lagradost.cloudstream3.APIHolder.filterSearchResultByFilmQuality
2022-08-15 14:44:46 +00:00
import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
2022-04-06 15:16:08 +00:00
import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings
2022-01-30 01:50:49 +00:00
import com.lagradost.cloudstream3.APIHolder.getApiSettings
2022-10-28 01:51:27 +00:00
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey
2022-11-05 00:27:35 +00:00
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKeys
2022-10-28 01:51:27 +00:00
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
import com.lagradost.cloudstream3.MainActivity.Companion.afterPluginsLoadedEvent
import com.lagradost.cloudstream3.databinding.FragmentSearchBinding
import com.lagradost.cloudstream3.databinding.HomeSelectMainpageBinding
2021-05-16 18:28:00 +00:00
import com.lagradost.cloudstream3.mvvm.Resource
import com.lagradost.cloudstream3.mvvm.logError
2021-05-16 18:28:00 +00:00
import com.lagradost.cloudstream3.mvvm.observe
2021-09-12 14:10:22 +00:00
import com.lagradost.cloudstream3.ui.APIRepository
2021-08-12 00:04:58 +00:00
import com.lagradost.cloudstream3.ui.home.HomeFragment
2022-10-28 01:51:27 +00:00
import com.lagradost.cloudstream3.ui.home.HomeFragment.Companion.bindChips
2021-12-13 18:41:33 +00:00
import com.lagradost.cloudstream3.ui.home.HomeFragment.Companion.currentSpan
2021-08-12 00:04:58 +00:00
import com.lagradost.cloudstream3.ui.home.HomeFragment.Companion.loadHomepageList
2022-10-28 01:51:27 +00:00
import com.lagradost.cloudstream3.ui.home.HomeFragment.Companion.updateChips
2021-08-12 00:04:58 +00:00
import com.lagradost.cloudstream3.ui.home.ParentItemAdapter
import com.lagradost.cloudstream3.ui.result.FOCUS_SELF
import com.lagradost.cloudstream3.ui.result.setLinearListLayout
2022-02-18 19:29:48 +00:00
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings
2022-12-28 11:51:55 +00:00
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
2023-01-21 22:22:48 +00:00
import com.lagradost.cloudstream3.utils.AppUtils.ownHide
2023-01-06 16:51:34 +00:00
import com.lagradost.cloudstream3.utils.AppUtils.ownShow
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
import com.lagradost.cloudstream3.utils.Coroutines.main
2021-08-14 19:35:26 +00:00
import com.lagradost.cloudstream3.utils.DataStore.getKey
import com.lagradost.cloudstream3.utils.DataStore.setKey
2022-04-06 15:16:08 +00:00
import com.lagradost.cloudstream3.utils.SubtitleHelper
2021-12-12 02:33:17 +00:00
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
2021-08-12 00:04:58 +00:00
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
2021-12-13 18:41:33 +00:00
import com.lagradost.cloudstream3.utils.UIHelper.getSpanCount
2021-08-04 13:30:34 +00:00
import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard
import java.util.concurrent.locks.ReentrantLock
2021-05-12 21:51:02 +00:00
const val SEARCH_PREF_TAGS = "search_pref_tags"
const val SEARCH_PREF_PROVIDERS = "search_pref_providers"
2021-10-30 18:14:12 +00:00
2021-05-12 21:51:02 +00:00
class SearchFragment : Fragment() {
2021-09-12 14:10:22 +00:00
companion object {
fun List<SearchResponse>.filterSearchResponse(): List<SearchResponse> {
return this.filter { response ->
if (response is AnimeSearchResponse) {
2022-04-13 17:29:30 +00:00
val status = response.dubStatus
(status.isNullOrEmpty()) || (status.any {
APIRepository.dubStatusActive.contains(it)
})
2021-09-12 14:10:22 +00:00
} else {
true
}
}
}
2022-11-13 00:40:49 +00:00
const val SEARCH_QUERY = "search_query"
fun newInstance(query: String): Bundle {
return Bundle().apply {
putString(SEARCH_QUERY, query)
}
}
2021-09-12 14:10:22 +00:00
}
2021-11-20 00:41:37 +00:00
private val searchViewModel: SearchViewModel by activityViewModels()
2023-01-06 16:51:34 +00:00
private var bottomSheetDialog: BottomSheetDialog? = null
var binding: FragmentSearchBinding? = null
2021-05-12 21:51:02 +00:00
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
2021-05-15 23:37:42 +00:00
savedInstanceState: Bundle?,
2021-05-12 21:51:02 +00:00
): View? {
activity?.window?.setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE
)
2023-01-06 16:51:34 +00:00
bottomSheetDialog?.ownShow()
val layout = if (isTvSettings()) R.layout.fragment_search_tv else R.layout.fragment_search
val root = inflater.inflate(layout, container, false)
2023-07-14 00:28:49 +00:00
// TODO TRYCATCH
binding = FragmentSearchBinding.bind(root)
return root
2021-05-12 21:51:02 +00:00
}
2021-06-06 18:06:01 +00:00
private fun fixGrid() {
2021-12-13 18:41:33 +00:00
activity?.getSpanCount()?.let {
currentSpan = it
2021-05-15 23:37:42 +00:00
}
binding?.searchAutofitResults?.spanCount = currentSpan
2021-12-13 18:41:33 +00:00
currentSpan = currentSpan
2021-08-12 00:04:58 +00:00
HomeFragment.configEvent.invoke(currentSpan)
2021-06-06 18:06:01 +00:00
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
fixGrid()
}
2021-07-30 21:03:46 +00:00
override fun onDestroyView() {
2021-08-04 13:30:34 +00:00
hideKeyboard()
2023-01-21 22:22:48 +00:00
bottomSheetDialog?.ownHide()
binding = null
2021-07-30 21:03:46 +00:00
super.onDestroyView()
}
override fun onResume() {
super.onResume()
afterPluginsLoadedEvent += ::reloadRepos
}
override fun onStop() {
super.onStop()
afterPluginsLoadedEvent -= ::reloadRepos
}
var selectedSearchTypes = mutableListOf<TvType>()
var selectedApis = mutableSetOf<String>()
/**
* Will filter all providers by preferred media and selectedSearchTypes.
* If that results in no available providers then only filter
* providers by preferred media
**/
2022-01-30 01:50:49 +00:00
fun search(query: String?) {
if (query == null) return
context?.let { ctx ->
val default = enumValues<TvType>().sorted().filter { it != TvType.NSFW }
.map { it.ordinal.toString() }.toSet()
2022-11-05 18:54:04 +00:00
val preferredTypes = (PreferenceManager.getDefaultSharedPreferences(ctx)
2022-11-13 00:40:49 +00:00
.getStringSet(this.getString(R.string.prefer_media_type_key), default)
?.ifEmpty { default } ?: default)
2022-11-05 18:54:04 +00:00
.mapNotNull { it.toIntOrNull() ?: return@mapNotNull null }
val settings = ctx.getApiSettings()
val notFilteredBySelectedTypes = selectedApis.filter { name ->
settings.contains(name)
}.map { name ->
name to getApiFromNameNull(name)?.supportedTypes
}.filter { (_, types) ->
types?.any { preferredTypes.contains(it.ordinal) } == true
}
2022-01-30 01:50:49 +00:00
searchViewModel.searchAndCancel(
query = query,
providersActive = notFilteredBySelectedTypes.filter { (_, types) ->
types?.any { selectedSearchTypes.contains(it) } == true
}.ifEmpty { notFilteredBySelectedTypes }.map { it.first }.toSet()
2022-01-30 01:50:49 +00:00
)
}
}
// Null if defined as a variable
// This needs to be run after view created
private fun reloadRepos(success: Boolean = false) = main {
searchViewModel.reloadRepos()
context?.filterProviderByPreferredMedia()?.let { validAPIs ->
2022-10-28 01:51:27 +00:00
bindChips(
binding?.tvtypesChipsScroll?.tvtypesChips,
2022-10-28 01:51:27 +00:00
selectedSearchTypes,
validAPIs.flatMap { api -> api.supportedTypes }.distinct()
) { list ->
if (selectedSearchTypes.toSet() != list.toSet()) {
setKey(SEARCH_PREF_TAGS, selectedSearchTypes)
selectedSearchTypes.clear()
selectedSearchTypes.addAll(list)
search(binding?.mainSearch?.query?.toString())
}
}
}
}
2022-10-28 01:51:27 +00:00
2021-06-06 18:06:01 +00:00
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
fixPaddingStatusbar(binding?.searchRoot)
2021-06-06 18:06:01 +00:00
fixGrid()
reloadRepos()
2021-05-15 23:37:42 +00:00
binding?.apply {
val adapter: RecyclerView.Adapter<RecyclerView.ViewHolder>? =
SearchAdapter(
ArrayList(),
searchAutofitResults,
) { callback ->
SearchHelper.handleSearchClickCallback(callback)
}
searchAutofitResults.adapter = adapter
searchLoadingBar.alpha = 0f
2021-05-15 23:37:42 +00:00
}
val searchExitIcon =
binding?.mainSearch?.findViewById<ImageView>(androidx.appcompat.R.id.search_close_btn)
2022-04-25 18:00:25 +00:00
// val searchMagIcon =
// main_search.findViewById<ImageView>(androidx.appcompat.R.id.search_mag_icon)
//searchMagIcon.scaleX = 0.65f
//searchMagIcon.scaleY = 0.65f
2021-08-14 19:35:26 +00:00
context?.let { ctx ->
val validAPIs = ctx.filterProviderByPreferredMedia()
selectedApis = ctx.getKey(
SEARCH_PREF_PROVIDERS,
defVal = validAPIs.map { it.name }
)!!.toMutableSet()
}
2021-08-14 19:35:26 +00:00
binding?.searchFilter?.setOnClickListener { searchView ->
searchView?.context?.let { ctx ->
2022-01-30 22:02:57 +00:00
val validAPIs = ctx.filterProviderByPreferredMedia(hasHomePageIsRequired = false)
var currentValidApis = listOf<MainAPI>()
val currentSelectedApis = if (selectedApis.isEmpty()) validAPIs.map { it.name }
.toMutableSet() else selectedApis
val builder =
BottomSheetDialog(ctx)
builder.behavior.state = BottomSheetBehavior.STATE_EXPANDED
val binding: HomeSelectMainpageBinding = HomeSelectMainpageBinding.inflate(
builder.layoutInflater,
null,
false
)
builder.setContentView(binding.root)
builder.show()
builder.let { dialog ->
val isMultiLang = ctx.getApiProviderLangSettings().let { set ->
set.size > 1 || set.contains(AllLanguagesName)
}
2022-04-06 15:16:08 +00:00
val cancelBtt = dialog.findViewById<MaterialButton>(R.id.cancel_btt)
val applyBtt = dialog.findViewById<MaterialButton>(R.id.apply_btt)
val listView = dialog.findViewById<ListView>(R.id.listview1)
val arrayAdapter = ArrayAdapter<String>(ctx, R.layout.sort_bottom_single_choice)
listView?.adapter = arrayAdapter
listView?.choiceMode = AbsListView.CHOICE_MODE_MULTIPLE
listView?.setOnItemClickListener { _, _, i, _ ->
if (currentValidApis.isNotEmpty()) {
val api = currentValidApis[i].name
if (currentSelectedApis.contains(api)) {
listView.setItemChecked(i, false)
currentSelectedApis -= api
} else {
listView.setItemChecked(i, true)
currentSelectedApis += api
}
}
2021-08-14 19:35:26 +00:00
}
2022-10-28 01:51:27 +00:00
fun updateList(types: List<TvType>) {
setKey(SEARCH_PREF_TAGS, types.map { it.name })
2022-10-28 01:51:27 +00:00
arrayAdapter.clear()
currentValidApis = validAPIs.filter { api ->
2022-01-30 22:02:57 +00:00
api.supportedTypes.any {
2022-10-28 01:51:27 +00:00
types.contains(it)
}
2022-04-06 15:16:08 +00:00
}.sortedBy { it.name.lowercase() }
2021-08-14 19:35:26 +00:00
2022-04-13 17:29:30 +00:00
val names = currentValidApis.map {
if (isMultiLang) "${
SubtitleHelper.getFlagFromIso(
it.lang
)?.plus(" ") ?: ""
}${it.name}" else it.name
}
2022-04-08 22:13:09 +00:00
for ((index, api) in currentValidApis.map { it.name }.withIndex()) {
listView?.setItemChecked(index, currentSelectedApis.contains(api))
2021-08-14 19:35:26 +00:00
}
2022-01-30 22:02:57 +00:00
//arrayAdapter.notifyDataSetChanged()
arrayAdapter.addAll(names)
arrayAdapter.notifyDataSetChanged()
2021-08-14 19:35:26 +00:00
}
2022-10-28 01:51:27 +00:00
val selectedSearchTypes = getKey<List<String>>(SEARCH_PREF_TAGS)
?.mapNotNull { listName ->
TvType.values().firstOrNull { it.name == listName }
}
?.toMutableList()
?: mutableListOf(TvType.Movie, TvType.TvSeries)
2021-08-14 19:35:26 +00:00
2022-10-28 01:51:27 +00:00
bindChips(
binding.tvtypesChipsScroll.tvtypesChips,
2022-10-28 01:51:27 +00:00
selectedSearchTypes,
TvType.values().toList()
) { list ->
updateList(list)
}
2021-08-14 19:35:26 +00:00
2022-10-28 01:51:27 +00:00
cancelBtt?.setOnClickListener {
dialog.dismissSafe()
2021-08-14 19:35:26 +00:00
}
2022-10-28 01:51:27 +00:00
cancelBtt?.setOnClickListener {
dialog.dismissSafe()
}
applyBtt?.setOnClickListener {
//if (currentApiName != selectedApiName) {
// currentApiName?.let(callback)
//}
dialog.dismissSafe()
}
dialog.setOnDismissListener {
context?.setKey(SEARCH_PREF_PROVIDERS, currentSelectedApis.toList())
selectedApis = currentSelectedApis
}
updateList(selectedSearchTypes.toList())
2021-08-14 19:35:26 +00:00
}
}
}
2021-08-14 19:35:26 +00:00
val settingsManager = context?.let { PreferenceManager.getDefaultSharedPreferences(it) }
val isAdvancedSearch = settingsManager?.getBoolean("advanced_search", true) ?: true
selectedSearchTypes = context?.getKey<List<String>>(SEARCH_PREF_TAGS)
?.mapNotNull { listName -> TvType.values().firstOrNull { it.name == listName } }
?.toMutableList()
?: mutableListOf(TvType.Movie, TvType.TvSeries)
2022-08-28 23:52:15 +00:00
if (isTrueTvSettings()) {
binding?.searchFilter?.isFocusable = true
binding?.searchFilter?.isFocusableInTouchMode = true
2021-11-25 17:26:14 +00:00
}
binding?.mainSearch?.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
2021-05-15 23:37:42 +00:00
override fun onQueryTextSubmit(query: String): Boolean {
2022-01-30 01:50:49 +00:00
search(query)
2021-11-20 00:41:37 +00:00
binding?.mainSearch?.let {
hideKeyboard(it)
}
2021-05-15 23:37:42 +00:00
return true
}
override fun onQueryTextChange(newText: String): Boolean {
2021-10-19 20:17:06 +00:00
//searchViewModel.quickSearch(newText)
val showHistory = newText.isBlank()
2022-03-29 20:17:42 +00:00
if (showHistory) {
searchViewModel.clearSearch()
searchViewModel.updateHistory()
}
binding?.apply {
searchHistoryHolder.isVisible = showHistory
searchMasterRecycler.isVisible = !showHistory && isAdvancedSearch
searchAutofitResults.isVisible = !showHistory && !isAdvancedSearch
}
2021-05-15 23:37:42 +00:00
return true
}
})
binding?.searchClearCallHistory?.setOnClickListener {
2022-11-05 00:27:35 +00:00
activity?.let { ctx ->
val builder: AlertDialog.Builder = AlertDialog.Builder(ctx)
val dialogClickListener =
DialogInterface.OnClickListener { _, which ->
when (which) {
DialogInterface.BUTTON_POSITIVE -> {
removeKeys(SEARCH_HISTORY_KEY)
searchViewModel.updateHistory()
}
DialogInterface.BUTTON_NEGATIVE -> {
}
}
}
try {
builder.setTitle(R.string.clear_history).setMessage(
ctx.getString(R.string.delete_message).format(
ctx.getString(R.string.history)
)
)
.setPositiveButton(R.string.sort_clear, dialogClickListener)
.setNegativeButton(R.string.cancel, dialogClickListener)
.show().setDefaultFocus()
2022-11-05 00:27:35 +00:00
} catch (e: Exception) {
logError(e)
// ye you somehow fucked up formatting did you?
}
}
}
observe(searchViewModel.currentHistory) { list ->
binding?.searchClearCallHistory?.isVisible = list.isNotEmpty()
(binding?.searchHistoryRecycler?.adapter as? SearchHistoryAdaptor?)?.updateList(list)
}
searchViewModel.updateHistory()
2021-05-16 18:28:00 +00:00
observe(searchViewModel.searchResponse) {
when (it) {
is Resource.Success -> {
it.value.let { data ->
2021-08-12 00:04:58 +00:00
if (data.isNotEmpty()) {
(binding?.searchAutofitResults?.adapter as? SearchAdapter)?.updateList(data)
2021-07-28 19:14:45 +00:00
}
2021-06-16 16:54:07 +00:00
}
searchExitIcon?.alpha = 1f
binding?.searchLoadingBar?.alpha = 0f
2021-05-16 18:28:00 +00:00
}
is Resource.Failure -> {
2021-07-30 21:03:46 +00:00
// Toast.makeText(activity, "Server error", Toast.LENGTH_LONG).show()
searchExitIcon?.alpha = 1f
binding?.searchLoadingBar?.alpha = 0f
2021-06-16 16:54:07 +00:00
}
is Resource.Loading -> {
searchExitIcon?.alpha = 0f
binding?.searchLoadingBar?.alpha = 1f
2021-05-16 18:28:00 +00:00
}
}
}
2021-08-12 00:04:58 +00:00
val listLock = ReentrantLock()
2021-08-12 00:04:58 +00:00
observe(searchViewModel.currentSearch) { list ->
try {
// https://stackoverflow.com/questions/6866238/concurrent-modification-exception-adding-to-an-arraylist
listLock.lock()
(binding?.searchMasterRecycler?.adapter as ParentItemAdapter?)?.apply {
2022-01-30 22:02:57 +00:00
val newItems = list.map { ongoing ->
val dataList =
if (ongoing.data is Resource.Success) ongoing.data.value else ArrayList()
val dataListFiltered =
context?.filterSearchResultByFilmQuality(dataList) ?: dataList
val ongoingList = HomePageList(
ongoing.apiName,
dataListFiltered
)
ongoingList
}
2022-01-30 22:02:57 +00:00
updateList(newItems)
//notifyDataSetChanged()
2021-08-12 00:04:58 +00:00
}
} catch (e: Exception) {
logError(e)
} finally {
listLock.unlock()
2021-08-12 00:04:58 +00:00
}
}
/*main_search.setOnQueryTextFocusChangeListener { _, b ->
if (b) {
// https://stackoverflow.com/questions/12022715/unable-to-show-keyboard-automatically-in-the-searchview
2021-10-30 18:14:12 +00:00
showInputMethod(view.findFocus())
}
}*/
2021-10-30 18:14:12 +00:00
//main_search.onActionViewExpanded()*/
2021-08-12 00:04:58 +00:00
val masterAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder> =
2022-01-30 22:02:57 +00:00
ParentItemAdapter(mutableListOf(), { callback ->
SearchHelper.handleSearchClickCallback(callback)
}, { item ->
2023-01-06 16:51:34 +00:00
bottomSheetDialog = activity?.loadHomepageList(item, dismissCallback = {
bottomSheetDialog = null
})
})
2021-08-12 00:04:58 +00:00
val historyAdapter = SearchHistoryAdaptor(mutableListOf()) { click ->
val searchItem = click.item
when (click.clickAction) {
SEARCH_HISTORY_OPEN -> {
searchViewModel.clearSearch()
if (searchItem.type.isNotEmpty())
updateChips(binding?.tvtypesChipsScroll?.tvtypesChips, searchItem.type.toMutableList())
binding?.mainSearch?.setQuery(searchItem.searchText, true)
}
SEARCH_HISTORY_REMOVE -> {
removeKey(SEARCH_HISTORY_KEY, searchItem.key)
searchViewModel.updateHistory()
}
else -> {
// wth are you doing???
}
}
}
2021-08-12 00:04:58 +00:00
binding?.apply {
searchHistoryRecycler.adapter = historyAdapter
searchHistoryRecycler.setLinearListLayout(isHorizontal = false, nextRight = FOCUS_SELF)
//searchHistoryRecycler.layoutManager = GridLayoutManager(context, 1)
2021-08-12 00:04:58 +00:00
searchMasterRecycler.adapter = masterAdapter
//searchMasterRecycler.setLinearListLayout(isHorizontal = false, nextRight = FOCUS_SELF)
searchMasterRecycler.layoutManager = GridLayoutManager(context, 1)
2021-08-12 00:04:58 +00:00
// Automatically search the specified query, this allows the app search to launch from intent
arguments?.getString(SEARCH_QUERY)?.let { query ->
if (query.isBlank()) return@let
mainSearch.setQuery(query, true)
// Clear the query as to not make it request the same query every time the page is opened
arguments?.putString(SEARCH_QUERY, null)
}
2022-11-13 00:40:49 +00:00
}
2021-08-07 02:57:46 +00:00
// SubtitlesFragment.push(activity)
2021-06-17 15:39:01 +00:00
//searchViewModel.search("iron man")
2021-07-18 13:02:30 +00:00
//(activity as AppCompatActivity).loadResult("https://shiro.is/overlord-dubbed", "overlord-dubbed", "Shiro")
2021-05-28 13:38:06 +00:00
/*
2021-07-30 21:03:46 +00:00
(activity as AppCompatActivity?)?.supportFragmentManager.beginTransaction()
2021-05-23 17:07:43 +00:00
.setCustomAnimations(R.anim.enter_anim,
R.anim.exit_anim,
R.anim.pop_enter,
R.anim.pop_exit)
2021-05-28 13:38:06 +00:00
.add(R.id.homeRoot, PlayerFragment.newInstance(PlayerData(0, null,0)))
.commit()*/
2021-05-12 21:51:02 +00:00
}
2021-08-06 20:55:11 +00:00
2021-05-12 21:51:02 +00:00
}