Skip to content

Instantly share code, notes, and snippets.

@ntngel1
Last active November 21, 2019 12:09
Show Gist options
  • Save ntngel1/919ee2b4c7684283d5fb69a4009d6516 to your computer and use it in GitHub Desktop.
Save ntngel1/919ee2b4c7684283d5fb69a4009d6516 to your computer and use it in GitHub Desktop.
/************ 1 ******************/
class LaunchesSceneController @Inject constructor(
private val dateTimeFormatter: DateTimeFormatter
) : SceneController() {
var launches = emptyList<LaunchEntity>()
var isProgressBarVisible = false
var onLaunchClicked: ((launch: LaunchEntity) -> Unit)? = null
override fun buildViewModels(): List<ViewModel> {
val viewModels = ArrayList<ViewModel>(launches.size)
// Теперь норм разбивка по годам?
launches.groupBy { it.launchDate.year }
.toList()
.forEach { (year, launches) ->
year.toYearViewModel()
.let(viewModels::add)
launches.map { it.toLaunchViewModel() }
.let(viewModels::addAll)
}
if (isProgressBarVisible) {
ProgressBarViewModel().let(viewModels::add)
}
return viewModels
}
// И вот эти экстеншены тоже норм?
private fun Int.toYearViewModel() = YearViewModel(id = "year$this", year = this)
private fun LaunchEntity.toLaunchViewModel() = LaunchViewModel(
id = "launch${flightNumber}",
title = missionName,
launchDate = launchDate.format(dateTimeFormatter),
imageUrl = links.missionPatchSmall,
onClicked = { onLaunchClicked?.invoke(this) }
)
}
/************ 2 ******************/
override fun openLaunchDetailsScene(flightNumber: Int) {
// Ты говорил что в этом куске можно за if вынести '.let(findNavController()::navigate)'
if (flightNumber % 2 == 0) {
LaunchesFragmentDirections.openLaunchDetailsV1Screen(flightNumber)
.let(findNavController()::navigate)
} else {
LaunchesFragmentDirections.openLaunchDetailsV2Screen(flightNumber)
.let(findNavController()::navigate)
}
// У меня это с красивым форматированием не особо получилось. игрался с переносами
// и все равно не очень получается
(if (flightNumber % 2 == 0)
LaunchesFragmentDirections.openLaunchDetailsV1Screen(flightNumber)
else
LaunchesFragmentDirections.openLaunchDetailsV2Screen(flightNumber))
.let(findNavController()::navigate)
}
/************ 3 ******************/
// Два метода конфликтуют) оба принимают сначала url, а потом первый принимает дополнительно placeholder,
// значение которого проставлено по умолчанию)
// Пришлось переименовать первый метод в loadImageWithPlaceholder.
fun ImageView.loadImage(url: String?, @DrawableRes placeholder: Int? = R.color.colorGray) {
Glide.with(this)
.load(url)
.also {
placeholder?.let(it::placeholder)
}
.error(R.drawable.placeholder_no_image_available)
.into(this)
}
fun ImageView.loadImage(url: String?) {
loadImageWithPlaceholder(url, null)
}
/************ 4 ******************/
// Ты сказал избавиться здесь от '?'.
fun Fragment.setTranslucentStatusBar(isTranslucent: Boolean) {
if (isTranslucent) {
activity?.window?.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
} else {
activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
}
}
// В принципе, легко
fun Fragment.setTranslucentStatusBar(isTranslucent: Boolean) = activity?.let { activity ->
if (isTranslucent) {
activity.window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
} else {
activity.window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
}
}
// Но тут у меня уже свои загоны начинаются, мб это дело привычки, но мне не то чтобы мешали эти '?'.
// В общем думаю со временем я привыкну и начну понимать зачем избавляться от вопросиков.
/************ 5 ******************/
fun onLoadMoreLaunches() {
if (!isLoading && !didLoadAllData) {
loadLaunches()
}
}
// Ты говорил что здесь можно кидать исключения если мы уже грузим данные или они загружены.
// Норм сделал? А еще нужно ли было создавать свои кастомные Exception'ы или можно было ограничиться каким-нибудь
// IllegalStateException?
private fun loadLaunches() {
if (isLoading) {
throw AlreadyLoadingException()
} else if (didLoadAllData) {
throw AlreadyLoadedException()
}
launchGateway.getLaunchesWithDescendingLaunchDate(offset, LAUNCHES_LIMIT)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe {
isLoading = true
if (isLoadingFirstPage()) {
viewState.setIsRefreshing(true)
} else {
viewState.setIsProgressBarVisible(true)
}
}
.doOnSuccess { fetchedLaunches ->
launches = launches + fetchedLaunches
viewState.setLaunches(launches)
}
.doFinally {
isLoading = false
viewState.setIsProgressBarVisible(false)
viewState.setIsRefreshing(false)
}
.subscribe({ fetchedLaunches ->
offset += fetchedLaunches.size
if (fetchedLaunches.isEmpty()) {
didLoadAllData = true
}
}, {
viewState.showLoadingError()
it.printStackTrace()
})
.disposeOnDestroy()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment