Skip to content
This repository was archived by the owner on Feb 12, 2025. It is now read-only.

Commit

Permalink
Merge tag '3.28.0'
Browse files Browse the repository at this point in the history
# Conflicts:
#	app/build.gradle
#	gradle/libs.versions.toml
  • Loading branch information
1RandomDev committed Jan 12, 2024
2 parents e964843 + d727327 commit 0b5db22
Show file tree
Hide file tree
Showing 20 changed files with 186 additions and 56 deletions.
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ android {
compileSdkVersion versions.compileSdk
versionCode versions.versionCode
versionName versions.versionName
resConfigs "en", "ar", "de", "es", "fi", "fr", "it", "pl", "pt", "ru", "tr", "zh", "uk", "vi"
resourceConfigurations += ['en', 'ar', 'de', 'es', 'fi', 'fr', 'it', 'pl', 'pt', 'ru', 'tr', 'zh', 'uk', 'vi']

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
Expand Down
6 changes: 3 additions & 3 deletions app/src/main/assets/release_notes.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
* UI/UX upgrades for tablets and foldable devices (can be changed via Settings)
* Fix issue where actors list of shows and movies would not return to its scrolled position
* Other bugfixes

Do you enjoy Showly and want to support the developer?
Become a premium subscriber and gain access to cool bonus features! Check Settings to learn more!
Do you enjoy Showly and want to support the one and only developer?
Become a Premium user and gain access to cool bonus features! Check Settings to learn more!
2 changes: 1 addition & 1 deletion app/src/main/play/release-notes/en-GB/default.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
* UI/UX upgrades for tablets and foldable devices (can be changed via Settings)
* Fix issue where actors list of shows and movies would not return to its scrolled position
* Other bugfixes
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ hiltWork = "1.0.0"

[libraries]

gradle = { group = "com.android.tools.build", name = "gradle", version = "8.1.1" }
gradle = { group = "com.android.tools.build", name = "gradle", version = "8.2.0" }
gradle-kotlin-plugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version = "1.9.0" }
gradle-ktlint = { group = "org.jlleitschuh.gradle", name = "ktlint-gradle", version = "10.2.1" }

Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Tue Apr 11 21:13:54 CEST 2023
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,22 @@ abstract class BaseBottomSheetFragment(@LayoutRes val layoutResId: Int) : Bottom

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val behavior: BottomSheetBehavior<*> = (dialog as BottomSheetDialog).behavior
behavior.state = BottomSheetBehavior.STATE_EXPANDED
behavior.skipCollapsed = true
expandSheet()
}

protected fun navigateTo(@IdRes destination: Int, bundle: Bundle? = null) =
(requireActivity() as NavigationHost).findNavControl()?.navigate(destination, bundle)

protected fun isSheetExpanded(): Boolean {
val behavior: BottomSheetBehavior<*> = (dialog as BottomSheetDialog).behavior
return behavior.state == BottomSheetBehavior.STATE_EXPANDED
}

protected fun expandSheet() {
val behavior: BottomSheetBehavior<*> = (dialog as BottomSheetDialog).behavior
behavior.state = BottomSheetBehavior.STATE_EXPANDED
behavior.skipCollapsed = true
}

protected fun closeSheet() = (requireActivity() as NavigationHost).findNavControl()?.navigateUp()
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@ import com.michaldrabik.ui_base.utilities.events.Event
import com.michaldrabik.ui_model.Movie
import com.michaldrabik.ui_model.MovieCollection
import com.michaldrabik.ui_model.Person
import com.michaldrabik.ui_people.details.PersonDetailsArgs

sealed class MovieDetailsEvent<T>(action: T) : Event<T>(action) {

data class OpenPersonSheet(
val movie: Movie,
val person: Person,
val personArgs: PersonDetailsArgs?,
) : MovieDetailsEvent<Movie>(movie)

data class OpenPeopleSheet(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ import com.michaldrabik.ui_movie.R
import com.michaldrabik.ui_movie.databinding.FragmentMovieDetailsPeopleBinding
import com.michaldrabik.ui_movie.sections.people.recycler.ActorsAdapter
import com.michaldrabik.ui_navigation.java.NavigationArgs.ARG_PERSON
import com.michaldrabik.ui_navigation.java.NavigationArgs.ARG_PERSON_ARGS
import com.michaldrabik.ui_navigation.java.NavigationArgs.REQUEST_DETAILS
import com.michaldrabik.ui_people.details.PersonDetailsArgs
import com.michaldrabik.ui_people.details.PersonDetailsBottomSheet
import com.michaldrabik.ui_people.list.PeopleListBottomSheet
import dagger.hilt.android.AndroidEntryPoint
Expand Down Expand Up @@ -67,9 +69,9 @@ class MovieDetailsPeopleFragment : BaseFragment<MovieDetailsPeopleViewModel>(R.l
}
}

private fun openPersonSheet(movie: Movie, person: Person) {
private fun openPersonSheet(movie: Movie, person: Person, personArgs: PersonDetailsArgs?) {
handleSheetResult()
val bundle = PersonDetailsBottomSheet.createBundle(person, movie.ids.trakt)
val bundle = PersonDetailsBottomSheet.createBundle(person, movie.ids.trakt, personArgs)
(requireParentFragment() as BaseFragment<*>)
.navigateToSafe(R.id.actionMovieDetailsFragmentToPerson, bundle)
}
Expand Down Expand Up @@ -141,7 +143,7 @@ class MovieDetailsPeopleFragment : BaseFragment<MovieDetailsPeopleViewModel>(R.l

private fun handleEvent(event: Event<*>) {
when (event) {
is OpenPersonSheet -> openPersonSheet(event.movie, event.person)
is OpenPersonSheet -> openPersonSheet(event.movie, event.person, event.personArgs)
is OpenPeopleSheet -> openPeopleSheet(event)
}
}
Expand All @@ -150,8 +152,10 @@ class MovieDetailsPeopleFragment : BaseFragment<MovieDetailsPeopleViewModel>(R.l
private fun handleSheetResult() {
requireParentFragment()
.setFragmentResultListener(REQUEST_DETAILS) { _, bundle ->
bundle.getParcelable<Person>(ARG_PERSON)?.let {
viewModel.saveLastPerson(it)
val person = bundle.getParcelable<Person>(ARG_PERSON)
val personArgs = bundle.getParcelable<PersonDetailsArgs>(ARG_PERSON_ARGS)
person?.let {
viewModel.saveLastPerson(it, personArgs)
bundle.clear()
}
requireParentFragment().clearFragmentResultListener(REQUEST_DETAILS)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import com.michaldrabik.ui_model.Person.Department
import com.michaldrabik.ui_movie.MovieDetailsEvent.OpenPeopleSheet
import com.michaldrabik.ui_movie.MovieDetailsEvent.OpenPersonSheet
import com.michaldrabik.ui_movie.sections.people.cases.MovieDetailsPeopleCase
import com.michaldrabik.ui_people.details.PersonDetailsArgs
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
Expand All @@ -27,7 +28,9 @@ class MovieDetailsPeopleViewModel @Inject constructor(
) : ViewModel(), ChannelsDelegate by DefaultChannelsDelegate() {

private lateinit var movie: Movie

private var lastOpenedPerson: Person? = null
private var lastOpenedPersonArgs: PersonDetailsArgs? = null

private val loadingState = MutableStateFlow(true)
private val actorsState = MutableStateFlow<List<Person>?>(null)
Expand Down Expand Up @@ -59,9 +62,12 @@ class MovieDetailsPeopleViewModel @Inject constructor(
Timber.d("Loading people...")
}

fun loadPersonDetails(person: Person) {
fun loadPersonDetails(
person: Person,
personArgs: PersonDetailsArgs? = null,
) {
viewModelScope.launch {
eventChannel.send(OpenPersonSheet(movie, person))
eventChannel.send(OpenPersonSheet(movie, person, personArgs))
}
}

Expand All @@ -73,13 +79,18 @@ class MovieDetailsPeopleViewModel @Inject constructor(

fun loadLastPerson() {
lastOpenedPerson?.let {
loadPersonDetails(it)
loadPersonDetails(it, lastOpenedPersonArgs)
lastOpenedPerson = null
lastOpenedPersonArgs = null
}
}

fun saveLastPerson(person: Person) {
fun saveLastPerson(
person: Person,
personArgs: PersonDetailsArgs?,
) {
lastOpenedPerson = person
lastOpenedPersonArgs = personArgs
}

val uiState = combine(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ object NavigationArgs {
const val ARG_COMMENT_ID = "ARG_COMMENT_ID"
const val ARG_COLLECTION_ID = "ARG_COLLECTION_ID"
const val ARG_PERSON = "ARG_PERSON"
const val ARG_PERSON_ARGS = "ARG_PERSON_ARGS"
const val ARG_OPTIONS = "ARG_OPTIONS"
const val ARG_TITLE = "ARG_TITLE"
const val ARG_ITEM = "ARG_ITEM"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.michaldrabik.ui_people.details

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class PersonDetailsArgs(
val isExpanded: Boolean = false,
val firstVisibleItemPosition: Int = 0,
val isUpButtonVisible: Boolean = false
) : Parcelable
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.os.Bundle
import android.view.View
import androidx.core.os.bundleOf
import androidx.core.view.isVisible
import androidx.fragment.app.setFragmentResult
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
Expand All @@ -16,6 +17,7 @@ import com.google.android.material.snackbar.Snackbar
import com.michaldrabik.ui_base.BaseBottomSheetFragment
import com.michaldrabik.ui_base.common.FastLinearLayoutManager
import com.michaldrabik.ui_base.utilities.TipsHost
import com.michaldrabik.ui_base.utilities.events.Event
import com.michaldrabik.ui_base.utilities.events.MessageEvent
import com.michaldrabik.ui_base.utilities.extensions.fadeIn
import com.michaldrabik.ui_base.utilities.extensions.fadeOut
Expand All @@ -32,9 +34,11 @@ import com.michaldrabik.ui_model.Tip
import com.michaldrabik.ui_navigation.java.NavigationArgs
import com.michaldrabik.ui_navigation.java.NavigationArgs.ARG_ID
import com.michaldrabik.ui_navigation.java.NavigationArgs.ARG_PERSON
import com.michaldrabik.ui_navigation.java.NavigationArgs.ARG_PERSON_ARGS
import com.michaldrabik.ui_navigation.java.NavigationArgs.REQUEST_DETAILS
import com.michaldrabik.ui_people.R
import com.michaldrabik.ui_people.databinding.ViewPersonDetailsBinding
import com.michaldrabik.ui_people.details.PersonDetailsUiEvent.ScrollToPosition
import com.michaldrabik.ui_people.details.links.PersonLinksBottomSheet
import com.michaldrabik.ui_people.details.recycler.PersonDetailsAdapter
import com.michaldrabik.ui_people.details.recycler.PersonDetailsItem
Expand All @@ -47,16 +51,23 @@ class PersonDetailsBottomSheet : BaseBottomSheetFragment(R.layout.view_person_de
companion object {
const val SHOW_BACK_UP_BUTTON_THRESHOLD = 25

fun createBundle(person: Person, sourceId: IdTrakt) =
bundleOf(
fun createBundle(
person: Person,
sourceId: IdTrakt,
personArgs: PersonDetailsArgs?,
): Bundle {
return bundleOf(
ARG_PERSON to person,
ARG_PERSON_ARGS to (personArgs ?: PersonDetailsArgs()),
ARG_ID to sourceId
)
}
}

private val viewModel by viewModels<PersonDetailsViewModel>()
private val binding by viewBinding(ViewPersonDetailsBinding::bind)

private val personArgs by lazy { requireParcelable<PersonDetailsArgs>(ARG_PERSON_ARGS) }
private val person by lazy { requireParcelable<Person>(ARG_PERSON) }
private val sourceId by lazy { requireParcelable<IdTrakt>(ARG_ID) }

Expand All @@ -72,8 +83,9 @@ class PersonDetailsBottomSheet : BaseBottomSheetFragment(R.layout.view_person_de

launchAndRepeatStarted(
{ viewModel.uiState.collect { render(it) } },
{ viewModel.eventFlow.collect { handleEvent(it) } },
{ viewModel.messageFlow.collect { renderSnackbar(it) } },
doAfterLaunch = { viewModel.loadDetails(person) }
doAfterLaunch = { viewModel.loadDetails(person, personArgs) }
)
}

Expand Down Expand Up @@ -110,7 +122,7 @@ class PersonDetailsBottomSheet : BaseBottomSheetFragment(R.layout.view_person_de
onImageClickListener = { openGallery() },
onImageMissingListener = { item, force -> viewModel.loadMissingImage(item, force) },
onTranslationMissingListener = { item -> viewModel.loadMissingTranslation(item) },
onFiltersChangeListener = { filters -> viewModel.loadCredits(person, filters) }
onFiltersChangeListener = { filters -> viewModel.loadCredits(person, null, filters) }
)
with(binding.personDetailsRecycler) {
adapter = this@PersonDetailsBottomSheet.adapter
Expand All @@ -122,7 +134,14 @@ class PersonDetailsBottomSheet : BaseBottomSheetFragment(R.layout.view_person_de
}

private fun openDetails(item: PersonDetailsItem) {
val personBundle = bundleOf(ARG_PERSON to person)
val personBundle = bundleOf(
ARG_PERSON to person,
ARG_PERSON_ARGS to PersonDetailsArgs(
isExpanded = isSheetExpanded(),
isUpButtonVisible = binding.personDetailsRecyclerFab.isVisible,
firstVisibleItemPosition = (layoutManager?.findLastVisibleItemPosition() ?: 0)
),
)
if (item is PersonDetailsItem.CreditsShowItem && item.show.traktId != sourceId.id) {
setFragmentResult(REQUEST_DETAILS, personBundle)
val bundle = bundleOf(NavigationArgs.ARG_SHOW_ID to item.show.traktId)
Expand Down Expand Up @@ -167,6 +186,20 @@ class PersonDetailsBottomSheet : BaseBottomSheetFragment(R.layout.view_person_de
}
}

private fun handleEvent(event: Event<*>) {
when (event) {
is ScrollToPosition -> {
if (event.isSheetExpanded) expandSheet()
with(binding) {
if (event.isUpButtonVisible) personDetailsRecyclerFab.fadeIn(150)
personDetailsRecycler.postDelayed({
personDetailsRecycler.scrollToPosition(event.position)
}, 100)
}
}
}
}

override fun onDestroyView() {
adapter = null
layoutManager = null
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// ktlint-disable filename
package com.michaldrabik.ui_people.details

import com.michaldrabik.ui_base.utilities.events.Event

internal sealed class PersonDetailsUiEvent<T>(action: T) : Event<T>(action) {
data class ScrollToPosition(
val position: Int,
val isSheetExpanded: Boolean,
val isUpButtonVisible: Boolean
) : PersonDetailsUiEvent<Int>(position)
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ class PersonDetailsViewModel @Inject constructor(
private var imagesJobs = mutableMapOf<String, Boolean>()
private var translationsJobs = mutableMapOf<String, Boolean>()

fun loadDetails(person: Person) {
fun loadDetails(person: Person, personArgs: PersonDetailsArgs) {
viewModelScope.launch {
mainProgressJob = launchDelayed(750) { setMainLoading(true) }
try {
Expand All @@ -67,7 +67,7 @@ class PersonDetailsViewModel @Inject constructor(
}
mainProgressJob?.cancelAndJoin()

loadCredits(details)
loadCredits(details, personArgs)
} catch (error: Throwable) {
messageChannel.send(MessageEvent.Error(R.string.errorGeneral))
Timber.e(error)
Expand All @@ -78,7 +78,11 @@ class PersonDetailsViewModel @Inject constructor(
}
}

fun loadCredits(person: Person, filters: List<Mode> = emptyList()) {
fun loadCredits(
person: Person,
personArgs: PersonDetailsArgs?,
filters: List<Mode> = emptyList(),
) {
creditsJob?.cancel()
creditsJob = viewModelScope.launch {
creditsProgressJob = launchDelayed(500) { setCreditsLoading(true) }
Expand All @@ -100,7 +104,18 @@ class PersonDetailsViewModel @Inject constructor(
currentValue.add(PersonDetailsItem.CreditsHeader(year))
currentValue.addAll(credit)
}

personDetailsItemsState.value = currentValue

personArgs?.let {
eventChannel.send(
PersonDetailsUiEvent.ScrollToPosition(
position = it.firstVisibleItemPosition,
isSheetExpanded = it.isExpanded,
isUpButtonVisible = it.isUpButtonVisible
)
)
}
}
} catch (error: Throwable) {
messageChannel.send(MessageEvent.Error(R.string.errorGeneral))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class PeopleListBottomSheet : BaseBottomSheetFragment(R.layout.view_people_list)
mediaIdTrakt: IdTrakt,
mediaTitle: String,
mode: Mode,
department: Person.Department
department: Person.Department,
) = bundleOf(
ARG_ID to mediaIdTrakt.id,
ARG_TITLE to mediaTitle,
Expand Down Expand Up @@ -103,7 +103,7 @@ class PeopleListBottomSheet : BaseBottomSheetFragment(R.layout.view_people_list)

private fun openDetails(item: Person) {
setFragmentResult(REQUEST_DETAILS, bundleOf(ARG_PERSON to item))
val bundle = PersonDetailsBottomSheet.createBundle(item, mediaIdTrakt)
val bundle = PersonDetailsBottomSheet.createBundle(item, mediaIdTrakt, null)
findNavController().navigate(R.id.actionPeopleListDialogToDetails, bundle)
}

Expand Down
Loading

0 comments on commit 0b5db22

Please sign in to comment.