Skip to content

Commit 29ce6a3

Browse files
authored
Merge pull request #41 from icerockdev/develop
Release 0.5.1
2 parents f9b2d23 + 84b4c55 commit 29ce6a3

File tree

9 files changed

+96
-29
lines changed

9 files changed

+96
-29
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ allprojects {
4444
project build.gradle
4545
```groovy
4646
dependencies {
47-
commonMainApi("dev.icerock.moko:errors:0.5.0")
47+
commonMainApi("dev.icerock.moko:errors:0.5.1")
4848
}
4949
```
5050

errors-build-logic/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ repositories {
1111

1212
dependencies {
1313
api("dev.icerock:mobile-multiplatform:0.12.0")
14-
api("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20")
14+
api("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31")
1515
api("com.android.tools.build:gradle:4.2.1")
1616
api("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.15.0")
1717
}

errors/src/androidMain/kotlin/dev/icerock/moko/errors/presenters/SnackBarErrorPresenter.kt

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
package dev.icerock.moko.errors.presenters
66

77
import android.view.View
8+
import androidx.fragment.app.DialogFragment
89
import androidx.fragment.app.FragmentActivity
10+
import androidx.fragment.app.FragmentManager
911
import com.google.android.material.snackbar.Snackbar
1012
import dev.icerock.moko.resources.desc.StringDesc
1113

@@ -14,14 +16,30 @@ actual class SnackBarErrorPresenter actual constructor(
1416
) : ErrorPresenter<StringDesc> {
1517

1618
override fun show(throwable: Throwable, activity: FragmentActivity, data: StringDesc) {
17-
val rootView = activity.findViewById<View>(android.R.id.content)?.rootView
18-
?: activity.window?.decorView?.findViewById<View>(android.R.id.content)
19-
if (rootView != null) {
20-
Snackbar.make(
21-
rootView,
22-
data.toString(activity),
23-
duration.toAndroidCode()
24-
).show()
25-
}
19+
val decorView: View = if (activity.hasWindowFocus()) {
20+
activity.window?.decorView
21+
} else {
22+
val dialogFragment = activity.supportFragmentManager.findActiveDialogFragment()
23+
dialogFragment?.dialog?.window?.decorView
24+
} ?: return
25+
val contentView: View = decorView.findViewById(android.R.id.content) ?: return
26+
val snackbar = Snackbar.make(
27+
contentView,
28+
data.toString(activity),
29+
duration.toAndroidCode()
30+
)
31+
snackbar.show()
32+
}
33+
34+
private fun FragmentManager.findActiveDialogFragment(): DialogFragment? {
35+
val dialogFragment: DialogFragment? = fragments.filterIsInstance<DialogFragment>()
36+
.filter { it.showsDialog }
37+
.filter { it.isResumed }
38+
.filter { it.dialog?.window?.decorView?.hasWindowFocus() == true }
39+
.firstOrNull()
40+
41+
if (dialogFragment != null) return dialogFragment
42+
43+
return fragments.firstNotNullOfOrNull { it.childFragmentManager.findActiveDialogFragment() }
2644
}
2745
}

errors/src/commonMain/kotlin/dev/icerock/moko/errors/mappers/ExceptionMappersStorage.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -165,13 +165,13 @@ object ExceptionMappersStorage {
165165
* class [T].
166166
*/
167167
inline fun <E : Throwable, reified T : Any> throwableMapper(): (e: E) -> T {
168-
return throwableMapper(T::class)
168+
return ExceptionMappersStorage.throwableMapper(T::class)
169169
}
170+
}
170171

171-
/**
172-
* Factory method that allows getting exception description
173-
*/
174-
inline fun <reified E : Throwable, reified T : Any> E.mapThrowable(): T {
175-
return ExceptionMappersStorage.throwableMapper<E, T>(T::class)(this)
176-
}
172+
/**
173+
* Factory method that allows getting exception description
174+
*/
175+
inline fun <reified E : Throwable, reified T : Any> E.mapThrowable(): T {
176+
return ExceptionMappersStorage.throwableMapper<E, T>(T::class)(this)
177177
}

gradle/libs.versions.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
[versions]
22
kotlinVersion = "1.5.20"
33
androidAppCompatVersion = "1.2.0"
4-
materialDesignVersion = "1.0.0"
4+
materialDesignVersion = "1.4.0"
55
androidLifecycleVersion = "2.1.0"
66
androidCoreTestingVersion = "2.1.0"
77
coroutinesVersion = "1.5.0-native-mt"
88
mokoMvvmVersion = "0.11.0"
99
mokoResourcesVersion = "0.16.0"
10-
mokoErrorsVersion = "0.5.0"
10+
mokoErrorsVersion = "0.5.1"
1111

1212
[libraries]
1313
appCompat = { module = "androidx.appcompat:appcompat", version.ref = "androidAppCompatVersion" }

sample/android-app/src/main/java/com/icerockdev/MainActivity.kt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@
55
package com.icerockdev
66

77
import android.os.Bundle
8+
import android.view.LayoutInflater
9+
import android.view.View
10+
import android.view.ViewGroup
11+
import android.widget.Button
812
import androidx.lifecycle.ViewModelProvider
13+
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
914
import com.icerockdev.databinding.ActivityMainBinding
1015
import com.icerockdev.library.SimpleViewModel
1116
import com.icerockdev.library.createSimpleViewModel
@@ -37,5 +42,31 @@ class MainActivity : MvvmActivity<ActivityMainBinding, SimpleViewModel>() {
3742
binding.alertButton.setOnClickListener {
3843
viewModel.onAlertButtonClick()
3944
}
45+
binding.bottomSheetButton.setOnClickListener {
46+
showBottomSheet()
47+
}
48+
}
49+
50+
private fun showBottomSheet() {
51+
BottomSheet().show(supportFragmentManager, "TAG")
52+
}
53+
54+
class BottomSheet : BottomSheetDialogFragment() {
55+
override fun onCreateView(
56+
inflater: LayoutInflater,
57+
container: ViewGroup?,
58+
savedInstanceState: Bundle?
59+
): View? {
60+
return inflater.inflate(R.layout.fragment_bottom_sheet, container)
61+
}
62+
63+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
64+
super.onViewCreated(view, savedInstanceState)
65+
66+
view.findViewById<Button>(R.id.show_alert).setOnClickListener {
67+
val viewModel: SimpleViewModel = (activity as MainActivity).viewModel
68+
viewModel.onAlertButtonClick()
69+
}
70+
}
4071
}
4172
}

sample/android-app/src/main/res/layout/activity_main.xml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
type="com.icerockdev.library.SimpleViewModel" />
1010
</data>
1111

12-
<FrameLayout
12+
<LinearLayout
1313
android:layout_width="match_parent"
1414
android:layout_height="match_parent"
1515
android:orientation="vertical"
@@ -21,5 +21,12 @@
2121
android:layout_height="wrap_content"
2222
android:layout_margin="16dp"
2323
android:text="Run alert error handler" />
24-
</FrameLayout>
24+
25+
<Button
26+
android:id="@+id/bottom_sheet_button"
27+
android:layout_width="match_parent"
28+
android:layout_height="wrap_content"
29+
android:layout_margin="16dp"
30+
android:text="Bottom sheet" />
31+
</LinearLayout>
2532
</layout>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:layout_width="match_parent"
4+
android:layout_height="wrap_content"
5+
android:orientation="vertical"
6+
android:padding="16dp">
7+
8+
<Button
9+
android:id="@+id/show_alert"
10+
android:layout_width="match_parent"
11+
android:layout_height="wrap_content"
12+
android:text="show error" />
13+
</LinearLayout>

sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/SimpleViewModel.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,23 @@
44

55
package com.icerockdev.library
66

7-
import dev.icerock.moko.errors.MR
87
import dev.icerock.moko.errors.handler.ExceptionHandler
98
import dev.icerock.moko.errors.mappers.ExceptionMappersStorage
10-
import dev.icerock.moko.errors.presenters.AlertErrorPresenter
119
import dev.icerock.moko.errors.presenters.SelectorErrorPresenter
10+
import dev.icerock.moko.errors.presenters.SnackBarDuration
11+
import dev.icerock.moko.errors.presenters.SnackBarErrorPresenter
1212
import dev.icerock.moko.errors.presenters.ToastDuration
1313
import dev.icerock.moko.errors.presenters.ToastErrorPresenter
1414
import dev.icerock.moko.mvvm.livedata.LiveData
1515
import dev.icerock.moko.mvvm.livedata.MutableLiveData
1616
import dev.icerock.moko.mvvm.livedata.readOnly
1717
import dev.icerock.moko.mvvm.viewmodel.ViewModel
18-
import dev.icerock.moko.resources.desc.desc
1918
import kotlinx.coroutines.launch
2019
import kotlin.random.Random
2120

2221
fun createSimpleViewModel(): SimpleViewModel {
23-
val alertErrorPresenter = AlertErrorPresenter(
24-
alertTitle = MR.strings.moko_errors_presenters_alertDialogTitle.desc(),
25-
positiveButtonText = MR.strings.moko_errors_presenters_alertPositiveButton.desc()
22+
val snackBarErrorPresenter = SnackBarErrorPresenter(
23+
duration = SnackBarDuration.SHORT
2624
)
2725
val toastErrorPresenter = ToastErrorPresenter(
2826
duration = ToastDuration.LONG
@@ -31,7 +29,7 @@ fun createSimpleViewModel(): SimpleViewModel {
3129
exceptionHandler = ExceptionHandler(
3230
errorPresenter = SelectorErrorPresenter { throwable ->
3331
when (throwable) {
34-
is CustomException -> alertErrorPresenter
32+
is CustomException -> snackBarErrorPresenter
3533
else -> toastErrorPresenter
3634
}
3735
},

0 commit comments

Comments
 (0)