diff --git a/app/src/main/kotlin/com/adesso/movee/base/BaseAndroidViewModel.kt b/app/src/main/kotlin/com/adesso/movee/base/BaseAndroidViewModel.kt index 0f22f94..b2270a4 100644 --- a/app/src/main/kotlin/com/adesso/movee/base/BaseAndroidViewModel.kt +++ b/app/src/main/kotlin/com/adesso/movee/base/BaseAndroidViewModel.kt @@ -13,6 +13,7 @@ import com.adesso.movee.internal.popup.PopupCallback import com.adesso.movee.internal.popup.PopupUiModel import com.adesso.movee.internal.util.Event import com.adesso.movee.internal.util.Failure +import com.adesso.movee.internal.util.event import com.adesso.movee.navigation.NavigationCommand import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -67,25 +68,24 @@ abstract class BaseAndroidViewModel(application: Application) : AndroidViewModel else -> Pair("", failure.message ?: failure.toString()) } - _failurePopup.value = Event( + _failurePopup.value = PopupUiModel( title = title, message = message, popUpType = PopUpType.ERROR - ) - ) + ).event() } protected fun showSnackBar(message: String) { - _success.value = Event(message) + _success.value = message.event() } fun navigate(directions: NavDirections) { - _navigation.value = Event(NavigationCommand.ToDirection(directions)) + _navigation.value = NavigationCommand.ToDirection(directions).event() } fun navigate(deepLink: String) { - _navigation.value = Event(NavigationCommand.ToDeepLink(deepLink)) + _navigation.value = NavigationCommand.ToDeepLink(deepLink).event() } fun navigate(@StringRes deepLinkRes: Int) { @@ -93,11 +93,11 @@ abstract class BaseAndroidViewModel(application: Application) : AndroidViewModel } fun navigate(model: PopupUiModel, callback: PopupCallback?) { - _navigation.value = Event(NavigationCommand.Popup(model, callback)) + _navigation.value = NavigationCommand.Popup(model, callback).event() } fun navigateBack() { - _navigation.value = Event(NavigationCommand.Back) + _navigation.value = NavigationCommand.Back.event() } protected suspend fun onUIThread(block: suspend CoroutineScope.() -> Unit) { diff --git a/app/src/main/kotlin/com/adesso/movee/base/BaseBottomSheetDialogFragment.kt b/app/src/main/kotlin/com/adesso/movee/base/BaseBottomSheetDialogFragment.kt index cab9879..5deeddd 100644 --- a/app/src/main/kotlin/com/adesso/movee/base/BaseBottomSheetDialogFragment.kt +++ b/app/src/main/kotlin/com/adesso/movee/base/BaseBottomSheetDialogFragment.kt @@ -19,8 +19,9 @@ import androidx.navigation.fragment.FragmentNavigatorExtras import androidx.navigation.fragment.findNavController import androidx.navigation.navGraphViewModels import com.adesso.movee.BR -import com.adesso.movee.internal.extension.observeNonNull import com.adesso.movee.internal.extension.showPopup +import com.adesso.movee.internal.popup.PopupUiModel +import com.adesso.movee.internal.util.EventObserver import com.adesso.movee.internal.util.functional.lazyThreadSafetyNone import com.adesso.movee.navigation.NavigationCommand import com.adesso.movee.scene.main.MainActivity @@ -103,11 +104,10 @@ abstract class BaseBottomSheetDialogFragment - handleNavigation(command) - } - } + viewModel.navigation.observe(viewLifecycleOwner, navigation) + } + private val navigation = EventObserver { + handleNavigation(it) } protected open fun handleNavigation(command: NavigationCommand) { @@ -130,19 +130,17 @@ abstract class BaseBottomSheetDialogFragment - context?.showPopup(popupUiModel) - } - } + viewModel.failurePopup.observe(viewLifecycleOwner, failurePopup) + } + private val failurePopup = EventObserver { + context?.showPopup(it) } private fun observeSuccess() { - viewModel.success.observeNonNull(viewLifecycleOwner) { - it.getContentIfNotHandled()?.let { message -> - showSnackBarMessage(message) - } - } + viewModel.success.observe(viewLifecycleOwner, success) + } + private val success = EventObserver { + showSnackBarMessage(it) } private fun showSnackBarMessage(message: String) { diff --git a/app/src/main/kotlin/com/adesso/movee/base/BaseFragment.kt b/app/src/main/kotlin/com/adesso/movee/base/BaseFragment.kt index cb210d1..fa003b9 100644 --- a/app/src/main/kotlin/com/adesso/movee/base/BaseFragment.kt +++ b/app/src/main/kotlin/com/adesso/movee/base/BaseFragment.kt @@ -18,8 +18,9 @@ import androidx.navigation.fragment.FragmentNavigatorExtras import androidx.navigation.fragment.findNavController import androidx.navigation.navGraphViewModels import com.adesso.movee.BR -import com.adesso.movee.internal.extension.observeNonNull import com.adesso.movee.internal.extension.showPopup +import com.adesso.movee.internal.popup.PopupUiModel +import com.adesso.movee.internal.util.EventObserver import com.adesso.movee.internal.util.functional.lazyThreadSafetyNone import com.adesso.movee.navigation.NavigationCommand import com.adesso.movee.scene.main.MainActivity @@ -88,11 +89,10 @@ abstract class BaseFragment : } private fun observeNavigation() { - viewModel.navigation.observeNonNull(viewLifecycleOwner) { - it.getContentIfNotHandled()?.let { command -> - handleNavigation(command) - } - } + viewModel.navigation.observe(viewLifecycleOwner, navigation) + } + private val navigation = EventObserver { + handleNavigation(it) } protected open fun handleNavigation(command: NavigationCommand) { @@ -115,19 +115,17 @@ abstract class BaseFragment : } private fun observeFailure() { - viewModel.failurePopup.observeNonNull(viewLifecycleOwner) { - it.getContentIfNotHandled()?.let { popupUiModel -> - context?.showPopup(popupUiModel) - } - } + viewModel.failurePopup.observe(viewLifecycleOwner, failurePopup) + } + private val failurePopup = EventObserver { + context?.showPopup(it) } private fun observeSuccess() { - viewModel.success.observeNonNull(viewLifecycleOwner) { - it.getContentIfNotHandled()?.let { message -> - showSnackBarMessage(message) - } - } + viewModel.success.observe(viewLifecycleOwner, success) + } + private val success = EventObserver { + showSnackBarMessage(it) } private fun showSnackBarMessage(message: String) { diff --git a/app/src/main/kotlin/com/adesso/movee/internal/util/Event.kt b/app/src/main/kotlin/com/adesso/movee/internal/util/Event.kt index c4e03e6..f3b0044 100644 --- a/app/src/main/kotlin/com/adesso/movee/internal/util/Event.kt +++ b/app/src/main/kotlin/com/adesso/movee/internal/util/Event.kt @@ -25,3 +25,7 @@ open class Event(private val content: T) { */ fun peekContent(): T = content } + +inline fun Any.event(): Event { + return Event(this as T) +} diff --git a/app/src/main/kotlin/com/adesso/movee/internal/util/EventObserver.kt b/app/src/main/kotlin/com/adesso/movee/internal/util/EventObserver.kt new file mode 100644 index 0000000..8652ad4 --- /dev/null +++ b/app/src/main/kotlin/com/adesso/movee/internal/util/EventObserver.kt @@ -0,0 +1,11 @@ +package com.adesso.movee.internal.util + +import androidx.lifecycle.Observer + +class EventObserver(private val eventUnHandledContent: (T) -> Unit) : Observer> { + override fun onChanged(t: Event?) { + t?.getContentIfNotHandled()?.let { + eventUnHandledContent(it) + } + } +} diff --git a/app/src/main/kotlin/com/adesso/movee/scene/login/LoginFragment.kt b/app/src/main/kotlin/com/adesso/movee/scene/login/LoginFragment.kt index 56bf540..2075908 100644 --- a/app/src/main/kotlin/com/adesso/movee/scene/login/LoginFragment.kt +++ b/app/src/main/kotlin/com/adesso/movee/scene/login/LoginFragment.kt @@ -5,8 +5,7 @@ import android.net.Uri import com.adesso.movee.R import com.adesso.movee.base.BaseTransparentStatusBarFragment import com.adesso.movee.databinding.FragmentLoginBinding -import com.adesso.movee.internal.extension.observeNonNull -import com.adesso.movee.internal.util.Event +import com.adesso.movee.internal.util.EventObserver class LoginFragment : BaseTransparentStatusBarFragment() { @@ -15,13 +14,11 @@ class LoginFragment : BaseTransparentStatusBarFragment) { - event.getContentIfNotHandled()?.let { uri -> - val intent = Intent(Intent.ACTION_VIEW, uri) - startActivity(intent) - } + private val handleNavigateUriEvent = EventObserver { + val intent = Intent(Intent.ACTION_VIEW, it) + startActivity(intent) } } diff --git a/app/src/main/kotlin/com/adesso/movee/scene/login/LoginViewModel.kt b/app/src/main/kotlin/com/adesso/movee/scene/login/LoginViewModel.kt index a5d0cfe..dcddcf3 100644 --- a/app/src/main/kotlin/com/adesso/movee/scene/login/LoginViewModel.kt +++ b/app/src/main/kotlin/com/adesso/movee/scene/login/LoginViewModel.kt @@ -7,6 +7,7 @@ import androidx.lifecycle.MutableLiveData import com.adesso.movee.base.BaseAndroidViewModel import com.adesso.movee.domain.LoginUseCase import com.adesso.movee.internal.util.Event +import com.adesso.movee.internal.util.event import javax.inject.Inject import kotlinx.coroutines.launch @@ -53,7 +54,8 @@ class LoginViewModel @Inject constructor( } private fun postNavigateUri(url: String) { - _navigateUri.value = Event(Uri.parse(url)) + _navigateUri.value = url.event() + // _navigateUri.value = Event(Uri.parse(url)) } companion object { diff --git a/app/src/main/kotlin/com/adesso/movee/scene/main/MainActivity.kt b/app/src/main/kotlin/com/adesso/movee/scene/main/MainActivity.kt index 6ff1bad..1164e47 100644 --- a/app/src/main/kotlin/com/adesso/movee/scene/main/MainActivity.kt +++ b/app/src/main/kotlin/com/adesso/movee/scene/main/MainActivity.kt @@ -11,8 +11,8 @@ import androidx.navigation.ui.setupWithNavController import com.adesso.movee.R import com.adesso.movee.base.BaseBindingActivity import com.adesso.movee.databinding.ActivityMainBinding -import com.adesso.movee.internal.extension.observeNonNull import com.adesso.movee.internal.extension.showPopup +import com.adesso.movee.internal.util.EventObserver import com.adesso.movee.navigation.NavigationCommand class MainActivity : BaseBindingActivity() { @@ -37,11 +37,10 @@ class MainActivity : BaseBindingActivity() { } private fun observeNavigation() { - viewModel.navigation.observeNonNull(this) { - it.getContentIfNotHandled()?.let { command -> - handleNavigation(command) - } - } + viewModel.navigation.observe(this, navigation) + } + private val navigation = EventObserver { + handleNavigation(it) } private fun setupBottomNavigationView() {