diff --git a/README.md b/README.md index 1f2bf94..ad55478 100755 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ allprojects { project build.gradle ```groovy dependencies { - commonMainApi("dev.icerock.moko:errors:0.5.0") + commonMainApi("dev.icerock.moko:errors:0.5.1") } ``` diff --git a/errors-build-logic/build.gradle.kts b/errors-build-logic/build.gradle.kts index 84cbae3..09ba70e 100644 --- a/errors-build-logic/build.gradle.kts +++ b/errors-build-logic/build.gradle.kts @@ -11,7 +11,7 @@ repositories { dependencies { api("dev.icerock:mobile-multiplatform:0.12.0") - api("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20") + api("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31") api("com.android.tools.build:gradle:4.2.1") api("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.15.0") } diff --git a/errors/src/androidMain/kotlin/dev/icerock/moko/errors/presenters/SnackBarErrorPresenter.kt b/errors/src/androidMain/kotlin/dev/icerock/moko/errors/presenters/SnackBarErrorPresenter.kt index c8b8e8f..e983e1a 100644 --- a/errors/src/androidMain/kotlin/dev/icerock/moko/errors/presenters/SnackBarErrorPresenter.kt +++ b/errors/src/androidMain/kotlin/dev/icerock/moko/errors/presenters/SnackBarErrorPresenter.kt @@ -5,7 +5,9 @@ package dev.icerock.moko.errors.presenters import android.view.View +import androidx.fragment.app.DialogFragment import androidx.fragment.app.FragmentActivity +import androidx.fragment.app.FragmentManager import com.google.android.material.snackbar.Snackbar import dev.icerock.moko.resources.desc.StringDesc @@ -14,14 +16,30 @@ actual class SnackBarErrorPresenter actual constructor( ) : ErrorPresenter { override fun show(throwable: Throwable, activity: FragmentActivity, data: StringDesc) { - val rootView = activity.findViewById(android.R.id.content)?.rootView - ?: activity.window?.decorView?.findViewById(android.R.id.content) - if (rootView != null) { - Snackbar.make( - rootView, - data.toString(activity), - duration.toAndroidCode() - ).show() - } + val decorView: View = if (activity.hasWindowFocus()) { + activity.window?.decorView + } else { + val dialogFragment = activity.supportFragmentManager.findActiveDialogFragment() + dialogFragment?.dialog?.window?.decorView + } ?: return + val contentView: View = decorView.findViewById(android.R.id.content) ?: return + val snackbar = Snackbar.make( + contentView, + data.toString(activity), + duration.toAndroidCode() + ) + snackbar.show() + } + + private fun FragmentManager.findActiveDialogFragment(): DialogFragment? { + val dialogFragment: DialogFragment? = fragments.filterIsInstance() + .filter { it.showsDialog } + .filter { it.isResumed } + .filter { it.dialog?.window?.decorView?.hasWindowFocus() == true } + .firstOrNull() + + if (dialogFragment != null) return dialogFragment + + return fragments.firstNotNullOfOrNull { it.childFragmentManager.findActiveDialogFragment() } } } diff --git a/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt b/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt index 08e1354..0af0a6a 100644 --- a/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt +++ b/errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt @@ -165,13 +165,13 @@ object ExceptionMappersStorage { * class [T]. */ inline fun throwableMapper(): (e: E) -> T { - return throwableMapper(T::class) + return ExceptionMappersStorage.throwableMapper(T::class) } +} - /** - * Factory method that allows getting exception description - */ - inline fun E.mapThrowable(): T { - return ExceptionMappersStorage.throwableMapper(T::class)(this) - } +/** + * Factory method that allows getting exception description + */ +inline fun E.mapThrowable(): T { + return ExceptionMappersStorage.throwableMapper(T::class)(this) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ab4f46f..6bb02c2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,13 +1,13 @@ [versions] kotlinVersion = "1.5.20" androidAppCompatVersion = "1.2.0" -materialDesignVersion = "1.0.0" +materialDesignVersion = "1.4.0" androidLifecycleVersion = "2.1.0" androidCoreTestingVersion = "2.1.0" coroutinesVersion = "1.5.0-native-mt" mokoMvvmVersion = "0.11.0" mokoResourcesVersion = "0.16.0" -mokoErrorsVersion = "0.5.0" +mokoErrorsVersion = "0.5.1" [libraries] appCompat = { module = "androidx.appcompat:appcompat", version.ref = "androidAppCompatVersion" } diff --git a/sample/android-app/src/main/java/com/icerockdev/MainActivity.kt b/sample/android-app/src/main/java/com/icerockdev/MainActivity.kt index c69dcf0..dd05d60 100755 --- a/sample/android-app/src/main/java/com/icerockdev/MainActivity.kt +++ b/sample/android-app/src/main/java/com/icerockdev/MainActivity.kt @@ -5,7 +5,12 @@ package com.icerockdev import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button import androidx.lifecycle.ViewModelProvider +import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.icerockdev.databinding.ActivityMainBinding import com.icerockdev.library.SimpleViewModel import com.icerockdev.library.createSimpleViewModel @@ -37,5 +42,31 @@ class MainActivity : MvvmActivity() { binding.alertButton.setOnClickListener { viewModel.onAlertButtonClick() } + binding.bottomSheetButton.setOnClickListener { + showBottomSheet() + } + } + + private fun showBottomSheet() { + BottomSheet().show(supportFragmentManager, "TAG") + } + + class BottomSheet : BottomSheetDialogFragment() { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.fragment_bottom_sheet, container) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + view.findViewById