Skip to content

Commit

Permalink
Merge pull request #101 from hotwired/full-edge-to-edge
Browse files Browse the repository at this point in the history
Edge full edge-to-edge Activity view without system bar insets
  • Loading branch information
jayohms authored Feb 20, 2025
2 parents 7e3dddf + 613a05b commit d08e180
Show file tree
Hide file tree
Showing 10 changed files with 39 additions and 39 deletions.
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
}
}
4 changes: 2 additions & 2 deletions demo/src/main/kotlin/dev/hotwire/demo/main/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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<View>(R.id.root_view).applyDefaultWindowInsets()
findViewById<View>(R.id.root_view).applyDefaultImeWindowInsets()
}

override fun navigatorConfigurations() = listOf(
Expand Down
5 changes: 3 additions & 2 deletions demo/src/main/res/layout/fragment_web_home.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,15 @@
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">

<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="56dp">

<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
Expand Down
5 changes: 0 additions & 5 deletions demo/src/main/res/values/motion.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,6 @@

<!--Motion-->

<style name="Animation.MyTheme.BottomSheet.Modal" parent="Animation.AppCompat.Dialog">
<item name="android:windowEnterAnimation">@anim/dialog_sheet_slide_in</item>
<item name="android:windowExitAnimation">@anim/dialog_sheet_slide_out</item>
</style>

<style name="Animation.MyTheme.AlertDialog" parent="Animation.AppCompat.Dialog">
<item name="android:windowEnterAnimation">@anim/dialog_sheet_slide_in</item>
<item name="android:windowExitAnimation">@anim/dialog_sheet_slide_out</item>
Expand Down
7 changes: 4 additions & 3 deletions demo/src/main/res/values/styles.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,8 @@
<style name="ThemeOverlay.MyTheme.BottomSheetDialog" parent="ThemeOverlay.MaterialComponents.BottomSheetDialog">
<item name="android:windowIsFloating">false</item>
<item name="android:windowBackground">@color/transparent</item>
<item name="android:windowAnimationStyle">@style/Animation.MyTheme.BottomSheet.Modal</item>
<item name="android:statusBarColor">@color/transparent</item>
<item name="bottomSheetStyle">@style/Widget.MyTheme.BottomSheet.Modal</item>
<item name="android:navigationBarColor">?colorSurface</item>
<item name="android:navigationBarDividerColor" tools:ignore="NewApi">@color/transparent</item>
</style>

<style name="Widget.MyTheme.BottomSheet.Modal" parent="Widget.MaterialComponents.BottomSheet.Modal">
Expand All @@ -37,6 +34,10 @@
<item name="elevation">@dimen/toolbar_elevation</item>
</style>

<style name="Widget.MyTheme.AppBarLayout" parent="Widget.MaterialComponents.AppBarLayout.Surface">
<item name="android:background">?colorSurface</item>
</style>

<style name="Widget.MyTheme.Toolbar.Navigation.Tinted" parent="Widget.AppCompat.Toolbar.Button.Navigation">
<item name="tint">?colorOnSurface</item>
</style>
Expand Down
5 changes: 3 additions & 2 deletions demo/src/main/res/values/themes.xml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
<item name="materialAlertDialogTheme">@style/ThemeOverlay.MyTheme.AlertDialog</item>
<item name="bottomSheetDialogTheme">@style/ThemeOverlay.MyTheme.BottomSheetDialog</item>
<item name="toolbarStyle">@style/Widget.MyTheme.Toolbar</item>
<item name="appBarLayoutStyle">@style/Widget.MyTheme.AppBarLayout</item>
<item name="materialButtonStyle">@style/Widget.MyTheme.Button</item>
<item name="buttonOutlineStyle">@style/Widget.MyTheme.OutlinedButton</item>
<item name="buttonTextStyle">@style/Widget.MyTheme.TextButton</item>
Expand All @@ -67,9 +68,9 @@
<item name="alphaEmphasisMedium">@dimen/alpha_emphasis_medium</item>
<item name="alphaEmphasisDisabled">@dimen/alpha_emphasis_disabled</item>

<item name="android:statusBarColor">?colorSurface</item>
<item name="android:statusBarColor">@color/transparent</item>
<item name="android:windowLightStatusBar">true</item>
<item name="android:navigationBarColor">?colorSurface</item>
<item name="android:navigationBarColor">@color/transparent</item>
<item name="android:windowLightNavigationBar">true</item>
<item name="android:navigationBarDividerColor">@color/transparent</item>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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">
Expand Down

0 comments on commit d08e180

Please sign in to comment.