Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa
?: return false
ioSafe {
val resumeWatchingCard =
HomeViewModel.getResumeWatching()?.firstOrNull { it.id == id }
HomeViewModel.getResumeWatching().firstOrNull { it.id == id }
?: return@ioSafe
activity.loadSearchResult(
resumeWatchingCard,
Expand Down Expand Up @@ -509,6 +509,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa
R.id.navigation_settings_player,
R.id.navigation_settings_updates,
R.id.navigation_settings_ui,
R.id.navigation_settings_tv_mode,
R.id.navigation_settings_account,
R.id.navigation_settings_providers,
R.id.navigation_settings_general,
Expand Down Expand Up @@ -579,6 +580,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa
R.id.navigation_settings_player,
R.id.navigation_settings_updates,
R.id.navigation_settings_ui,
R.id.navigation_settings_tv_mode,
R.id.navigation_settings_account,
R.id.navigation_settings_providers,
R.id.navigation_settings_general,
Expand Down Expand Up @@ -2061,4 +2063,4 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa
false
}
}
}
}
114 changes: 89 additions & 25 deletions app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
import com.lagradost.cloudstream3.utils.DataStoreHelper
import com.lagradost.cloudstream3.utils.EmptyEvent
import com.lagradost.cloudstream3.utils.SubtitleHelper.getFlagFromIso
import com.lagradost.cloudstream3.utils.TvModeHelper
import com.lagradost.cloudstream3.utils.TvChannelUtils
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
import com.lagradost.cloudstream3.utils.UIHelper.fixSystemBarsPadding
Expand Down Expand Up @@ -576,6 +577,12 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(
super.onDestroyView()
}

override fun onResume() {
super.onResume()
homeViewModel.reloadStored()
binding?.let { updateQuickActionButtons(it) }
}

private val apiChangeClickListener = View.OnClickListener { view ->
view.context.selectHomepage(currentApiName) { api ->
homeViewModel.loadAndCancel(api, forceReload = true, fromUI = true)
Expand All @@ -590,13 +597,85 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(
}

private var currentApiName: String? = null
private var toggleRandomButton = false
private var homeQuickActionMode = TvModeHelper.HomeQuickActionMode.NONE
private var latestHomepageCards: List<SearchResponse> = emptyList()

private var bottomSheetDialog: BottomSheetDialog? = null
private var homeMasterAdapter: HomeParentItemAdapterPreview? = null

var lastSavedHomepage: String? = null

private fun updateShortcutSettings(context: Context) {
homeQuickActionMode = TvModeHelper.getHomeQuickActionMode(context)
}

private fun updateQuickActionButtons(
binding: FragmentHomeBinding,
homepageCards: List<SearchResponse> = latestHomepageCards
) {
val context = context ?: return
updateShortcutSettings(context)
latestHomepageCards = homepageCards.distinctBy { it.url }
TvModeHelper.rememberHomepageCandidates(latestHomepageCards)

val hasRandomItems = latestHomepageCards.isNotEmpty()
val hasTvModeItems = latestHomepageCards.isNotEmpty()
val isPhoneLayout = isLayout(PHONE)
val showRandomButton = homeQuickActionMode == TvModeHelper.HomeQuickActionMode.RANDOM
val showTvModeButton =
homeQuickActionMode == TvModeHelper.HomeQuickActionMode.TV_MODE && TvModeHelper.isEnabled(context)

val randomClickListener = View.OnClickListener {
TvModeHelper.stopSession()
latestHomepageCards.randomOrNull()?.let { card ->
activity?.loadSearchResult(card)
}
}
val tvModeClickListener = View.OnClickListener {
TvModeHelper.startFromHome(activity, latestHomepageCards)
}

binding.homeRandom.isVisible = showRandomButton && isPhoneLayout && hasRandomItems
binding.homeRandomButtonTv.isVisible = showRandomButton && !isPhoneLayout && hasRandomItems
binding.homeTvMode.isVisible = showTvModeButton && isPhoneLayout && hasTvModeItems
binding.homeTvModeButtonTv.isVisible =
showTvModeButton && !isPhoneLayout && hasTvModeItems

binding.homeRandom.setOnClickListener(randomClickListener)
binding.homeRandomButtonTv.setOnClickListener(randomClickListener)
binding.homeTvMode.setOnClickListener(tvModeClickListener)
binding.homeTvModeButtonTv.setOnClickListener(tvModeClickListener)

if (!isPhoneLayout) {
val previewRightFocus = when {
binding.homeRandomButtonTv.isVisible -> R.id.home_random_button_tv
binding.homeTvModeButtonTv.isVisible -> R.id.home_tv_mode_button_tv
else -> R.id.home_switch_account
}
val accountLeftFocus = when {
binding.homeTvModeButtonTv.isVisible -> R.id.home_tv_mode_button_tv
binding.homeRandomButtonTv.isVisible -> R.id.home_random_button_tv
else -> R.id.home_preview_search_button
}
val tvModeLeftFocus = if (binding.homeRandomButtonTv.isVisible) {
R.id.home_random_button_tv
} else {
R.id.home_preview_search_button
}
val randomRightFocus = if (binding.homeTvModeButtonTv.isVisible) {
R.id.home_tv_mode_button_tv
} else {
R.id.home_switch_account
}

binding.homePreviewSearchButton.nextFocusRightId = previewRightFocus
binding.homeRandomButtonTv.nextFocusRightId = randomRightFocus
binding.homeTvModeButtonTv.nextFocusLeftId = tvModeLeftFocus
binding.homeTvModeButtonTv.nextFocusRightId = R.id.home_switch_account
binding.homeSwitchAccount.nextFocusLeftId = accountLeftFocus
}
}

fun saveHomepageToTV(page: Map<String, HomeViewModel.ExpandableHomepageList>) {
// No need to update for phone
if (isLayout(PHONE)) {
Expand Down Expand Up @@ -681,10 +760,12 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(
if (dy > 0) { //check for scroll down
homeApiFab.shrink() // hide
homeRandom.shrink()
homeTvMode.shrink()
} else if (dy < -5) {
if (isLayout(PHONE)) {
homeApiFab.extend() // show
homeRandom.extend()
homeTvMode.extend()
}
}
} else {
Expand Down Expand Up @@ -723,14 +804,11 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(

//Load value for toggling Random button. Hide at startup
context?.let {
val settingsManager = PreferenceManager.getDefaultSharedPreferences(it)
toggleRandomButton =
settingsManager.getBoolean(
getString(R.string.random_button_key),
false
)
updateShortcutSettings(it)
binding.homeRandom.visibility = View.GONE
binding.homeRandomButtonTv.visibility = View.GONE
binding.homeTvMode.visibility = View.GONE
binding.homeTvModeButtonTv.visibility = View.GONE
}

observe(homeViewModel.apiName) { apiName ->
Expand Down Expand Up @@ -761,24 +839,10 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(
homeMasterRecycler.isVisible = true
homeLoadingShimmer.stopShimmer()
//home_loaded?.isVisible = true
if (toggleRandomButton) {
val distinct = d.values
.flatMap { it.list.list }
.distinctBy { it.url }
val hasItems = distinct.isNotEmpty()
val isPhone = isLayout(PHONE)
val randomClickListener = View.OnClickListener {
distinct.randomOrNull()?.let { activity.loadSearchResult(it) }
}

homeRandom.isVisible = isPhone && hasItems
homeRandom.setOnClickListener(randomClickListener)
homeRandomButtonTv.isVisible = !isPhone && hasItems
homeRandomButtonTv.setOnClickListener(randomClickListener)
} else {
homeRandom.isGone = true
homeRandomButtonTv.isGone = true
}
val distinct = d.values
.flatMap { it.list.list }
.distinctBy { it.url }
updateQuickActionButtons(this, distinct)
}

is Resource.Failure -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,14 @@ import java.util.concurrent.CopyOnWriteArrayList

class HomeViewModel : ViewModel() {
companion object {
suspend fun getResumeWatching(): List<DataStoreHelper.ResumeWatchingResult>? {
suspend fun getResumeWatching(): List<DataStoreHelper.ResumeWatchingResult> {
val resumeWatching = withContext(Dispatchers.IO) {
getAllResumeStateIds()?.mapNotNull { id ->
getLastWatched(id)
}?.sortedBy { -it.updateTime }
}?.sortedBy { -it.updateTime } ?: emptyList()
}
val resumeWatchingResult = withContext(Dispatchers.IO) {
resumeWatching?.mapNotNull { resume ->
resumeWatching.mapNotNull { resume ->
val headerCache = getKey<DownloadObjects.DownloadHeaderCached>(
DOWNLOAD_HEADER_CACHE,
resume.parentId.toString()
Expand Down Expand Up @@ -153,15 +153,13 @@ class HomeViewModel : ViewModel() {

private fun loadResumeWatching() = viewModelScope.launchSafe {
val resumeWatchingResult = getResumeWatching()
if (isLayout(TV) && resumeWatchingResult != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (isLayout(TV) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
ioSafe {
// this WILL crash on non tvs, so keep this inside a try catch
activity?.addProgramsToContinueWatching(resumeWatchingResult)
}
}
resumeWatchingResult?.let {
_resumeWatching.postValue(it)
}
_resumeWatching.postValue(resumeWatchingResult)
}

fun loadStoredData(preferredWatchStatus: Set<WatchType>?) = viewModelScope.launchSafe {
Expand Down Expand Up @@ -549,4 +547,4 @@ class HomeViewModel : ViewModel() {
}
reloadAccount()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import com.lagradost.cloudstream3.utils.AppContextUtils.loadSearchResult
import com.lagradost.cloudstream3.utils.AppContextUtils.reduceDragSensitivity
import com.lagradost.cloudstream3.utils.DataStoreHelper.currentAccount
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
import com.lagradost.cloudstream3.utils.TvModeHelper
import com.lagradost.cloudstream3.utils.UIHelper.fixSystemBarsPadding
import com.lagradost.cloudstream3.utils.UIHelper.getSpanCount
import java.util.concurrent.CopyOnWriteArrayList
Expand Down Expand Up @@ -95,6 +96,15 @@ class LibraryFragment : BaseFragment<FragmentLibraryBinding>(
override fun pickLayout(): Int? =
if (isLayout(PHONE)) R.layout.fragment_library else R.layout.fragment_library_tv

override fun onResume() {
super.onResume()
context?.let {
toggleRandomButton =
TvModeHelper.getHomeQuickActionMode(it) == TvModeHelper.HomeQuickActionMode.RANDOM
}
binding?.let { updateRandomVisibility(it) }
}

override fun onSaveInstanceState(outState: Bundle) {
binding?.viewpager?.currentItem?.let { currentItem ->
outState.putInt(VIEWPAGER_ITEM_KEY, currentItem)
Expand Down Expand Up @@ -192,12 +202,8 @@ class LibraryFragment : BaseFragment<FragmentLibraryBinding>(

//Load value for toggling Random button. Hide at startup
context?.let {
val settingsManager = PreferenceManager.getDefaultSharedPreferences(it)
toggleRandomButton =
settingsManager.getBoolean(
getString(R.string.random_button_key),
false
)
TvModeHelper.getHomeQuickActionMode(it) == TvModeHelper.HomeQuickActionMode.RANDOM
binding.libraryRandom.visibility = View.GONE
binding.libraryRandomButtonTv.visibility = View.GONE
}
Expand Down Expand Up @@ -382,18 +388,15 @@ class LibraryFragment : BaseFragment<FragmentLibraryBinding>(
binding.searchBar.setExpanded(true)
}

// Set up random button click listener
if (toggleRandomButton) {
val randomClickListener = View.OnClickListener {
val position = libraryViewModel.currentPage.value ?: 0
val syncIdName = libraryViewModel.currentSyncApi?.syncIdName ?: return@OnClickListener
pages[position].items.randomOrNull()?.let { item ->
loadLibraryItem(syncIdName, item.syncId, item)
}
val randomClickListener = View.OnClickListener {
val position = libraryViewModel.currentPage.value ?: 0
val syncIdName = libraryViewModel.currentSyncApi?.syncIdName ?: return@OnClickListener
pages[position].items.randomOrNull()?.let { item ->
loadLibraryItem(syncIdName, item.syncId, item)
}
libraryRandom.setOnClickListener(randomClickListener)
libraryRandomButtonTv.setOnClickListener(randomClickListener)
}
libraryRandom.setOnClickListener(randomClickListener)
libraryRandomButtonTv.setOnClickListener(randomClickListener)
updateRandomVisibility(binding)

// Only stop loading after 300ms to hide the fade effect the viewpager produces when updating
Expand Down Expand Up @@ -569,4 +572,4 @@ class LibraryFragment : BaseFragment<FragmentLibraryBinding>(
}
}

class MenuSearchView(context: Context) : SearchView(context)
class MenuSearchView(context: Context) : SearchView(context)
Loading