Skip to content

Commit abec109

Browse files
committed
Make bottom sheet more robust
1 parent 715c953 commit abec109

2 files changed

Lines changed: 53 additions & 10 deletions

File tree

ad-blocking/ad-blocking-impl/src/main/java/com/duckduckgo/adblocking/impl/ContingencyMessageBottomSheet.kt renamed to ad-blocking/ad-blocking-impl/src/main/java/com/duckduckgo/adblocking/impl/ContingencyMessageBottomSheetFragment.kt

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,29 @@
1616

1717
package com.duckduckgo.adblocking.impl
1818

19-
import android.annotation.SuppressLint
20-
import android.content.Context
19+
import android.os.Bundle
2120
import android.view.LayoutInflater
21+
import android.view.View
22+
import android.view.ViewGroup
2223
import com.duckduckgo.adblocking.impl.databinding.BottomSheetContingencyMessageBinding
23-
import com.google.android.material.bottomsheet.BottomSheetDialog
24+
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
2425

25-
@SuppressLint("NoBottomSheetDialog")
26-
class ContingencyMessageBottomSheet(context: Context) : BottomSheetDialog(context) {
26+
class ContingencyMessageBottomSheetFragment : BottomSheetDialogFragment() {
2727

28-
private val binding = BottomSheetContingencyMessageBinding.inflate(LayoutInflater.from(context))
29-
30-
init {
31-
setContentView(binding.root)
28+
override fun onCreateView(
29+
inflater: LayoutInflater,
30+
container: ViewGroup?,
31+
savedInstanceState: Bundle?,
32+
): View {
33+
val binding = BottomSheetContingencyMessageBinding.inflate(inflater, container, false)
3234
binding.contingencyMessageCloseButton.setOnClickListener { dismiss() }
3335
binding.contingencyMessagePrimaryButton.setOnClickListener { dismiss() }
36+
return binding.root
37+
}
38+
39+
companion object {
40+
const val TAG = "ContingencyMessageBottomSheet"
41+
42+
fun newInstance() = ContingencyMessageBottomSheetFragment()
3443
}
3544
}

ad-blocking/ad-blocking-impl/src/main/java/com/duckduckgo/adblocking/impl/ContingencyMessageView.kt

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,19 @@
1616

1717
package com.duckduckgo.adblocking.impl
1818

19+
import android.view.ViewTreeObserver
1920
import android.webkit.WebView
2021
import androidx.annotation.UiThread
22+
import androidx.fragment.app.Fragment
23+
import androidx.fragment.app.FragmentManager
24+
import androidx.lifecycle.findViewTreeLifecycleOwner
25+
import androidx.lifecycle.lifecycleScope
2126
import com.duckduckgo.di.scopes.AppScope
2227
import com.squareup.anvil.annotations.ContributesBinding
28+
import kotlinx.coroutines.launch
29+
import kotlinx.coroutines.suspendCancellableCoroutine
2330
import javax.inject.Inject
31+
import kotlin.coroutines.resume
2432

2533
interface ContingencyMessageView {
2634
@UiThread
@@ -31,6 +39,32 @@ interface ContingencyMessageView {
3139
class RealContingencyMessageView @Inject constructor() : ContingencyMessageView {
3240

3341
override fun show(webView: WebView) {
34-
ContingencyMessageBottomSheet(webView.context).show()
42+
val lifecycleOwner = webView.findViewTreeLifecycleOwner() ?: return
43+
lifecycleOwner.lifecycleScope.launch {
44+
webView.awaitWindowFocus()
45+
val fragment: Fragment = FragmentManager.findFragment(webView)
46+
val fragmentManager = fragment.childFragmentManager
47+
if (fragmentManager.findFragmentByTag(ContingencyMessageBottomSheetFragment.TAG) == null) {
48+
ContingencyMessageBottomSheetFragment.newInstance()
49+
.show(fragmentManager, ContingencyMessageBottomSheetFragment.TAG)
50+
}
51+
}
52+
}
53+
}
54+
55+
private suspend fun WebView.awaitWindowFocus() {
56+
if (hasWindowFocus()) return
57+
suspendCancellableCoroutine { continuation ->
58+
val observer = viewTreeObserver
59+
val listener = object : ViewTreeObserver.OnWindowFocusChangeListener {
60+
override fun onWindowFocusChanged(hasFocus: Boolean) {
61+
if (hasFocus) {
62+
observer.removeOnWindowFocusChangeListener(this)
63+
continuation.resume(Unit)
64+
}
65+
}
66+
}
67+
observer.addOnWindowFocusChangeListener(listener)
68+
continuation.invokeOnCancellation { observer.removeOnWindowFocusChangeListener(listener) }
3569
}
3670
}

0 commit comments

Comments
 (0)