-
-
Save ntngel1/919ee2b4c7684283d5fb69a4009d6516 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/************ 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