diff --git a/core/src/main/kotlin/dev/hotwire/core/turbo/util/CoreExtensions.kt b/core/src/main/kotlin/dev/hotwire/core/turbo/util/CoreExtensions.kt index d7f4a24..65c08bf 100644 --- a/core/src/main/kotlin/dev/hotwire/core/turbo/util/CoreExtensions.kt +++ b/core/src/main/kotlin/dev/hotwire/core/turbo/util/CoreExtensions.kt @@ -1,6 +1,7 @@ package dev.hotwire.core.turbo.util import android.content.Context +import android.content.res.Configuration import android.os.Handler import android.webkit.WebResourceRequest import com.google.gson.Gson @@ -10,6 +11,11 @@ import dev.hotwire.core.turbo.visit.VisitAction import dev.hotwire.core.turbo.visit.VisitActionAdapter import java.io.File +val Context.isNightModeEnabled: Boolean get() { + val currentNightMode = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK + return currentNightMode == Configuration.UI_MODE_NIGHT_YES +} + internal fun WebResourceRequest.isHttpGetRequest(): Boolean { return method.equals("GET", ignoreCase = true) && url.scheme?.startsWith("HTTP", ignoreCase = true) == true diff --git a/core/src/main/kotlin/dev/hotwire/core/turbo/webview/HotwireWebView.kt b/core/src/main/kotlin/dev/hotwire/core/turbo/webview/HotwireWebView.kt index a0734c2..2b274f7 100644 --- a/core/src/main/kotlin/dev/hotwire/core/turbo/webview/HotwireWebView.kt +++ b/core/src/main/kotlin/dev/hotwire/core/turbo/webview/HotwireWebView.kt @@ -14,6 +14,7 @@ import androidx.webkit.WebViewFeature import com.google.gson.GsonBuilder import dev.hotwire.core.config.Hotwire import dev.hotwire.core.turbo.util.contentFromAsset +import dev.hotwire.core.turbo.util.isNightModeEnabled import dev.hotwire.core.turbo.util.runOnUiThread import dev.hotwire.core.turbo.util.toJson import dev.hotwire.core.turbo.visit.VisitOptions @@ -107,16 +108,11 @@ open class HotwireWebView @JvmOverloads constructor( } if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { - when (isNightModeEnabled(context)) { + when (context.isNightModeEnabled) { true -> WebSettingsCompat.setForceDark(settings, WebSettingsCompat.FORCE_DARK_ON) else -> WebSettingsCompat.setForceDark(settings, WebSettingsCompat.FORCE_DARK_AUTO) } } } } - - private fun isNightModeEnabled(context: Context): Boolean { - val currentNightMode = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK - return currentNightMode == Configuration.UI_MODE_NIGHT_YES - } } diff --git a/demo/src/main/kotlin/dev/hotwire/demo/features/imageviewer/ImageViewerFragment.kt b/demo/src/main/kotlin/dev/hotwire/demo/features/imageviewer/ImageViewerFragment.kt index 686a120..b06f424 100644 --- a/demo/src/main/kotlin/dev/hotwire/demo/features/imageviewer/ImageViewerFragment.kt +++ b/demo/src/main/kotlin/dev/hotwire/demo/features/imageviewer/ImageViewerFragment.kt @@ -6,8 +6,8 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import androidx.core.view.WindowCompat -import androidx.core.view.WindowInsetsCompat import coil.load +import dev.hotwire.core.turbo.util.isNightModeEnabled import dev.hotwire.demo.R import dev.hotwire.navigation.destinations.HotwireDestinationDeepLink import dev.hotwire.navigation.fragments.HotwireFragment @@ -39,19 +39,17 @@ class ImageViewerFragment : HotwireFragment() { override fun onStart() { super.onStart() - val windowInsetsController = WindowCompat.getInsetsController( - requireActivity().window, - requireActivity().window.decorView - ) - windowInsetsController.hide(WindowInsetsCompat.Type.systemBars()) + + val window = requireActivity().window + WindowCompat.getInsetsController(window, window.decorView) + .isAppearanceLightStatusBars = false } override fun onStop() { super.onStop() - val windowInsetsController = WindowCompat.getInsetsController( - requireActivity().window, - requireActivity().window.decorView - ) - windowInsetsController.show(WindowInsetsCompat.Type.systemBars()) + + val window = requireActivity().window + WindowCompat.getInsetsController(window, window.decorView) + .isAppearanceLightStatusBars = !requireContext().isNightModeEnabled } } diff --git a/demo/src/main/kotlin/dev/hotwire/demo/main/MainActivity.kt b/demo/src/main/kotlin/dev/hotwire/demo/main/MainActivity.kt index 4bde463..6002722 100644 --- a/demo/src/main/kotlin/dev/hotwire/demo/main/MainActivity.kt +++ b/demo/src/main/kotlin/dev/hotwire/demo/main/MainActivity.kt @@ -7,14 +7,14 @@ import dev.hotwire.demo.R import dev.hotwire.demo.Urls import dev.hotwire.navigation.activities.HotwireActivity import dev.hotwire.navigation.navigator.NavigatorConfiguration -import dev.hotwire.navigation.util.applyDefaultWindowInsets +import dev.hotwire.navigation.util.applyDefaultImeWindowInsets class MainActivity : HotwireActivity() { override fun onCreate(savedInstanceState: Bundle?) { enableEdgeToEdge() super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - findViewById(R.id.root_view).applyDefaultWindowInsets() + findViewById(R.id.root_view).applyDefaultImeWindowInsets() } override fun navigatorConfigurations() = listOf( diff --git a/demo/src/main/res/layout/fragment_web_home.xml b/demo/src/main/res/layout/fragment_web_home.xml index 1631f7f..4e0bea2 100644 --- a/demo/src/main/res/layout/fragment_web_home.xml +++ b/demo/src/main/res/layout/fragment_web_home.xml @@ -8,14 +8,15 @@ + android:layout_height="56dp"> - - + + diff --git a/demo/src/main/res/values/themes.xml b/demo/src/main/res/values/themes.xml index 7422780..d3a0554 100644 --- a/demo/src/main/res/values/themes.xml +++ b/demo/src/main/res/values/themes.xml @@ -56,6 +56,7 @@ @style/ThemeOverlay.MyTheme.AlertDialog @style/ThemeOverlay.MyTheme.BottomSheetDialog @style/Widget.MyTheme.Toolbar + @style/Widget.MyTheme.AppBarLayout @style/Widget.MyTheme.Button @style/Widget.MyTheme.OutlinedButton @style/Widget.MyTheme.TextButton @@ -67,9 +68,9 @@ @dimen/alpha_emphasis_medium @dimen/alpha_emphasis_disabled - ?colorSurface + @color/transparent true - ?colorSurface + @color/transparent true @color/transparent diff --git a/navigation-fragments/src/main/java/dev/hotwire/navigation/util/NavigationExtensions.kt b/navigation-fragments/src/main/java/dev/hotwire/navigation/util/NavigationExtensions.kt index 98daf54..499a3fa 100644 --- a/navigation-fragments/src/main/java/dev/hotwire/navigation/util/NavigationExtensions.kt +++ b/navigation-fragments/src/main/java/dev/hotwire/navigation/util/NavigationExtensions.kt @@ -20,6 +20,15 @@ fun Toolbar.displayBackButtonAsCloseIcon() { navigationIcon = ContextCompat.getDrawable(context, R.drawable.ic_close) } +fun View.applyDefaultImeWindowInsets() { + ViewCompat.setOnApplyWindowInsetsListener(this) { v, insets -> + insets.getInsets(WindowInsetsCompat.Type.ime()).apply { + v.setPadding(left, top, right, bottom) + } + insets + } +} + internal val NavBackStackEntry?.location: String? get() = this?.arguments?.location @@ -35,11 +44,3 @@ internal fun Context.colorFromThemeAttr( return attrValue } - -fun View.applyDefaultWindowInsets() { - ViewCompat.setOnApplyWindowInsetsListener(this) { v, insets -> - val insetTypes = WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime() - insets.getInsets(insetTypes).apply { v.setPadding(left, top, right, bottom) } - insets - } -} \ No newline at end of file diff --git a/navigation-fragments/src/main/res/layout/hotwire_fragment_web.xml b/navigation-fragments/src/main/res/layout/hotwire_fragment_web.xml index f3b0b91..74ce7f8 100644 --- a/navigation-fragments/src/main/res/layout/hotwire_fragment_web.xml +++ b/navigation-fragments/src/main/res/layout/hotwire_fragment_web.xml @@ -9,6 +9,7 @@ android:id="@+id/app_bar" android:layout_width="match_parent" android:layout_height="wrap_content" + android:fitsSystemWindows="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent">