From c4cf0d9babc292273eba1e49519fb45464c97026 Mon Sep 17 00:00:00 2001 From: lakor Date: Sat, 24 Dec 2022 22:23:52 +0800 Subject: [PATCH] Separate loading view from homepage --- .../cloudstream3/ui/home/HomeFragment.kt | 76 +++------ .../ui/home/HomeLoadFailedFragment.kt | 57 +++++++ .../ui/home/HomeLoadingFragment.kt | 44 +++++ .../cloudstream3/ui/home/HomeViewModel.kt | 2 + app/src/main/res/layout/fragment_home.xml | 151 +----------------- .../res/layout/fragment_home_load_failed.xml | 38 +++++ .../main/res/layout/fragment_home_loading.xml | 93 +++++++++++ app/src/main/res/layout/fragment_home_tv.xml | 151 +----------------- app/src/main/res/layout/loading_list.xml | 14 +- 9 files changed, 276 insertions(+), 350 deletions(-) create mode 100644 app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeLoadFailedFragment.kt create mode 100644 app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeLoadingFragment.kt create mode 100644 app/src/main/res/layout/fragment_home_load_failed.xml create mode 100644 app/src/main/res/layout/fragment_home_loading.xml diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt index 8e2ca6af..64920ccb 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt @@ -4,9 +4,7 @@ import android.annotation.SuppressLint import android.app.Activity import android.content.Context import android.content.DialogInterface -import android.content.Intent import android.content.res.Configuration -import android.net.Uri import android.os.Build import android.os.Bundle import android.view.LayoutInflater @@ -33,7 +31,6 @@ import com.google.android.material.button.MaterialButton import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipGroup import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.APIHolder.apis import com.lagradost.cloudstream3.APIHolder.filterProviderByPreferredMedia import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings @@ -79,7 +76,6 @@ import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbarView import com.lagradost.cloudstream3.utils.UIHelper.getResourceColor import com.lagradost.cloudstream3.utils.UIHelper.getSpanCount -import com.lagradost.cloudstream3.utils.UIHelper.popupMenuNoIconsAndNoStringRes import com.lagradost.cloudstream3.utils.UIHelper.setImage import com.lagradost.cloudstream3.utils.UIHelper.setImageBlur import com.lagradost.cloudstream3.utils.USER_SELECTED_HOMEPAGE_API @@ -88,18 +84,11 @@ import kotlinx.android.synthetic.main.fragment_home.* import kotlinx.android.synthetic.main.fragment_home.home_api_fab import kotlinx.android.synthetic.main.fragment_home.home_bookmarked_child_recyclerview import kotlinx.android.synthetic.main.fragment_home.home_bookmarked_holder -import kotlinx.android.synthetic.main.fragment_home.home_change_api_loading import kotlinx.android.synthetic.main.fragment_home.home_loaded -import kotlinx.android.synthetic.main.fragment_home.home_loading -import kotlinx.android.synthetic.main.fragment_home.home_loading_error -import kotlinx.android.synthetic.main.fragment_home.home_loading_shimmer -import kotlinx.android.synthetic.main.fragment_home.home_loading_statusbar import kotlinx.android.synthetic.main.fragment_home.home_master_recycler import kotlinx.android.synthetic.main.fragment_home.home_plan_to_watch_btt import kotlinx.android.synthetic.main.fragment_home.home_provider_meta_info import kotlinx.android.synthetic.main.fragment_home.home_provider_name -import kotlinx.android.synthetic.main.fragment_home.home_reload_connection_open_in_browser -import kotlinx.android.synthetic.main.fragment_home.home_reload_connectionerror import kotlinx.android.synthetic.main.fragment_home.home_type_completed_btt import kotlinx.android.synthetic.main.fragment_home.home_type_dropped_btt import kotlinx.android.synthetic.main.fragment_home.home_type_on_hold_btt @@ -107,7 +96,6 @@ import kotlinx.android.synthetic.main.fragment_home.home_type_watching_btt import kotlinx.android.synthetic.main.fragment_home.home_watch_child_recyclerview import kotlinx.android.synthetic.main.fragment_home.home_watch_holder import kotlinx.android.synthetic.main.fragment_home.home_watch_parent_item_title -import kotlinx.android.synthetic.main.fragment_home.result_error_text import kotlinx.android.synthetic.main.fragment_home_tv.* import kotlinx.android.synthetic.main.fragment_search.* import kotlinx.android.synthetic.main.home_episodes_expanded.* @@ -538,7 +526,6 @@ class HomeFragment : Fragment() { fixGrid() home_change_api?.setOnClickListener(apiChangeClickListener) - home_change_api_loading?.setOnClickListener(apiChangeClickListener) home_api_fab?.setOnClickListener(apiChangeClickListener) home_random?.setOnClickListener { if (listHomepageItems.isNotEmpty()) { @@ -763,7 +750,7 @@ class HomeFragment : Fragment() { observe(homeViewModel.page) { data -> when (data) { is Resource.Success -> { - home_loading_shimmer?.stopShimmer() + removeLoadingStatusFragment() val d = data.value val mutableListOfResponse = mutableListOf() @@ -775,8 +762,6 @@ class HomeFragment : Fragment() { home_master_recycler ) - home_loading?.isVisible = false - home_loading_error?.isVisible = false home_loaded?.isVisible = true if (toggleRandomButton) { //Flatten list @@ -790,40 +775,12 @@ class HomeFragment : Fragment() { } } is Resource.Failure -> { - home_loading_shimmer?.stopShimmer() - - result_error_text.text = data.errorString - - home_reload_connectionerror.setOnClickListener(apiChangeClickListener) - - home_reload_connection_open_in_browser.setOnClickListener { view -> - val validAPIs = apis//.filter { api -> api.hasMainPage } - - view.popupMenuNoIconsAndNoStringRes(validAPIs.mapIndexed { index, api -> - Pair( - index, - api.name - ) - }) { - try { - val i = Intent(Intent.ACTION_VIEW) - i.data = Uri.parse(validAPIs[itemId].mainUrl) - startActivity(i) - } catch (e: Exception) { - logError(e) - } - } - } - - home_loading?.isVisible = false - home_loading_error?.isVisible = true + showLoadFailedFragment() home_loaded?.isVisible = false } is Resource.Loading -> { + showLoadingFragment() (home_master_recycler?.adapter as? ParentItemAdapter?)?.updateList(listOf()) - home_loading_shimmer?.startShimmer() - home_loading?.isVisible = true - home_loading_error?.isVisible = false home_loaded?.isVisible = false } } @@ -1101,7 +1058,6 @@ class HomeFragment : Fragment() { //context?.fixPaddingStatusbarView(home_statusbar) context?.fixPaddingStatusbar(home_padding) - context?.fixPaddingStatusbar(home_loading_statusbar) home_master_recycler.adapter = ParentItemAdapter(mutableListOf(), { callback -> @@ -1144,9 +1100,6 @@ class HomeFragment : Fragment() { home_api_fab?.isVisible = false home_change_api?.isVisible = true if (isTrueTvSettings()) { - home_change_api_loading?.isVisible = true - home_change_api_loading?.isFocusable = true - home_change_api_loading?.isFocusableInTouchMode = true home_change_api?.isFocusable = true home_change_api?.isFocusableInTouchMode = true } @@ -1155,7 +1108,6 @@ class HomeFragment : Fragment() { } else { home_api_fab?.isVisible = true home_change_api?.isVisible = false - home_change_api_loading?.isVisible = false } for (syncApi in OAuth2Apis) { @@ -1171,4 +1123,26 @@ class HomeFragment : Fragment() { } } } + + private fun showLoadingFragment() { + showFragment(HomeLoadingFragment::class.java) + } + + private fun showLoadFailedFragment() { + showFragment(HomeLoadFailedFragment::class.java) + } + + private fun removeLoadingStatusFragment() { + childFragmentManager.findFragmentById(R.id.home_load_status_holder)?.let { + childFragmentManager.beginTransaction() + .remove(it) + .commitNow() + } + } + + private fun showFragment(fragmentClass: Class) { + childFragmentManager.beginTransaction() + .replace(R.id.home_load_status_holder, fragmentClass, null, null) + .commit() + } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeLoadFailedFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeLoadFailedFragment.kt new file mode 100644 index 00000000..9c257456 --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeLoadFailedFragment.kt @@ -0,0 +1,57 @@ +package com.lagradost.cloudstream3.ui.home + +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import com.lagradost.cloudstream3.APIHolder +import com.lagradost.cloudstream3.R +import com.lagradost.cloudstream3.mvvm.Resource +import com.lagradost.cloudstream3.mvvm.logError +import com.lagradost.cloudstream3.ui.home.HomeFragment.Companion.selectHomepage +import com.lagradost.cloudstream3.utils.UIHelper.popupMenuNoIconsAndNoStringRes +import kotlinx.android.synthetic.main.fragment_home_load_failed.* + +class HomeLoadFailedFragment : Fragment() { + private val homeViewModel: HomeViewModel by activityViewModels() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.fragment_home_load_failed, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + home_reload_connectionerror.setOnClickListener { + requireContext().selectHomepage(homeViewModel.apiNameString) { api -> + homeViewModel.loadAndCancel(api) + } + } + home_reload_connection_open_in_browser.setOnClickListener { button -> + val validAPIs = APIHolder.apis//.filter { api -> api.hasMainPage } + + button.popupMenuNoIconsAndNoStringRes(validAPIs.mapIndexed { index, api -> + Pair( + index, + api.name + ) + }) { + try { + val i = Intent(Intent.ACTION_VIEW) + i.data = Uri.parse(validAPIs[itemId].mainUrl) + startActivity(i) + } catch (e: Exception) { + logError(e) + } + } + } + result_error_text.text = (homeViewModel.page.value as? Resource.Failure)?.errorString + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeLoadingFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeLoadingFragment.kt new file mode 100644 index 00000000..c61168a5 --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeLoadingFragment.kt @@ -0,0 +1,44 @@ +package com.lagradost.cloudstream3.ui.home + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.view.isVisible +import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import com.lagradost.cloudstream3.R +import com.lagradost.cloudstream3.ui.home.HomeFragment.Companion.selectHomepage +import com.lagradost.cloudstream3.ui.settings.SettingsFragment +import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar +import kotlinx.android.synthetic.main.fragment_home_loading.* + +class HomeLoadingFragment : Fragment() { + private val homeViewModel: HomeViewModel by activityViewModels() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.fragment_home_loading, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + home_loading_shimmer?.startShimmer() + requireContext().fixPaddingStatusbar(home_loading_statusbar) + home_change_api_loading.setOnClickListener { + requireContext().selectHomepage(homeViewModel.apiNameString) { api -> + homeViewModel.loadAndCancel(api) + } + } + if (SettingsFragment.isTrueTvSettings()) { + home_change_api_loading?.isVisible = true + home_change_api_loading?.isFocusable = true + home_change_api_loading?.isFocusableInTouchMode = true + } else { + home_change_api_loading?.isVisible = false + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeViewModel.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeViewModel.kt index 3bb196e2..21809c46 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeViewModel.kt @@ -76,6 +76,8 @@ class HomeViewModel : ViewModel() { private val _apiName = MutableLiveData() val apiName: LiveData = _apiName + + val apiNameString: String? get() = apiName.value private val _randomItems = MutableLiveData?>(null) val randomItems: LiveData?> = _randomItems diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 7f8e2c01..4f3cc7bf 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -4,155 +4,9 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/home_root" android:layout_width="match_parent" - android:layout_height="match_parent" tools:context=".ui.home.HomeFragment"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_home_loading.xml b/app/src/main/res/layout/fragment_home_loading.xml new file mode 100644 index 00000000..782faf4a --- /dev/null +++ b/app/src/main/res/layout/fragment_home_loading.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_home_tv.xml b/app/src/main/res/layout/fragment_home_tv.xml index 5b092927..8526a069 100644 --- a/app/src/main/res/layout/fragment_home_tv.xml +++ b/app/src/main/res/layout/fragment_home_tv.xml @@ -4,155 +4,9 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:id="@+id/home_root" tools:context=".ui.home.HomeFragment"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - -