diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/util/InsetsUtil.kt b/app/src/main/kotlin/io/homeassistant/companion/android/util/InsetsUtil.kt index 94882fcb9fc..e21a53c09a8 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/util/InsetsUtil.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/util/InsetsUtil.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.safeDrawing import androidx.compose.runtime.Composable import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat @@ -20,6 +21,26 @@ fun WindowInsets.bottomPaddingValues(): PaddingValues { return only(WindowInsetsSides.Bottom).asPaddingValues() } +@Composable +fun safeBottomWindowInsets(): WindowInsets { + return WindowInsets.safeDrawing.only(WindowInsetsSides.Bottom + WindowInsetsSides.Horizontal) +} + +@Composable +fun safeBottomPaddingValues(): PaddingValues { + return safeBottomWindowInsets().asPaddingValues() +} + +@Composable +fun safeTopWindowInsets(): WindowInsets { + return WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal) +} + +@Composable +fun safeTopPaddingValues(): PaddingValues { + return safeTopWindowInsets().asPaddingValues() +} + fun PreferenceFragmentCompat.applyBottomSafeDrawingInsets(consumeInsets: Boolean = true) { listView.applySafeDrawingInsets( applyLeft = false, diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/BaseWidgetConfigureActivity.kt b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/BaseWidgetConfigureActivity.kt index e232ffd653f..e45e99f01a0 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/BaseWidgetConfigureActivity.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/BaseWidgetConfigureActivity.kt @@ -1,12 +1,14 @@ package io.homeassistant.companion.android.widgets import android.appwidget.AppWidgetManager +import android.os.Bundle import android.view.View import android.widget.AdapterView import android.widget.AdapterView.OnItemSelectedListener import android.widget.ArrayAdapter import android.widget.Spinner import android.widget.Toast +import androidx.activity.enableEdgeToEdge import io.homeassistant.companion.android.BaseActivity import io.homeassistant.companion.android.common.R import io.homeassistant.companion.android.common.data.servers.ServerManager @@ -27,6 +29,11 @@ abstract class BaseWidgetConfigureActivity : BaseActivity() { var selectedServerId: Int? = null + override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() + super.onCreate(savedInstanceState) + } + protected fun setupServerSelect(widgetServerId: Int?) { val servers = serverManager.defaultServers val activeServerId = serverManager.getServer()?.id diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/button/ButtonWidgetConfigureActivity.kt b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/button/ButtonWidgetConfigureActivity.kt index 1347e457746..cec68f47c8b 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/button/ButtonWidgetConfigureActivity.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/button/ButtonWidgetConfigureActivity.kt @@ -39,6 +39,7 @@ import io.homeassistant.companion.android.database.widget.ButtonWidgetDao import io.homeassistant.companion.android.database.widget.WidgetBackgroundType import io.homeassistant.companion.android.databinding.WidgetButtonConfigureBinding import io.homeassistant.companion.android.settings.widgets.ManageWidgetsViewModel +import io.homeassistant.companion.android.util.applySafeDrawingInsets import io.homeassistant.companion.android.util.getHexForColor import io.homeassistant.companion.android.util.icondialog.IconDialogFragment import io.homeassistant.companion.android.util.icondialog.getIconByMdiName @@ -202,6 +203,7 @@ class ButtonWidgetConfigureActivity : BaseWidgetConfigureActivity() { binding = WidgetButtonConfigureBinding.inflate(layoutInflater) setContentView(binding.root) + binding.root.applySafeDrawingInsets() // Find the widget id from the intent. val intent = intent diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/camera/CameraWidgetConfigureActivity.kt b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/camera/CameraWidgetConfigureActivity.kt index 71600736dda..796f1a72e82 100755 --- a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/camera/CameraWidgetConfigureActivity.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/camera/CameraWidgetConfigureActivity.kt @@ -23,6 +23,7 @@ import io.homeassistant.companion.android.database.widget.CameraWidgetDao import io.homeassistant.companion.android.database.widget.WidgetTapAction import io.homeassistant.companion.android.databinding.WidgetCameraConfigureBinding import io.homeassistant.companion.android.settings.widgets.ManageWidgetsViewModel +import io.homeassistant.companion.android.util.applySafeDrawingInsets import io.homeassistant.companion.android.widgets.BaseWidgetConfigureActivity import io.homeassistant.companion.android.widgets.common.SingleItemArrayAdapter import javax.inject.Inject @@ -65,6 +66,7 @@ class CameraWidgetConfigureActivity : BaseWidgetConfigureActivity() { binding = WidgetCameraConfigureBinding.inflate(layoutInflater) setContentView(binding.root) + binding.root.applySafeDrawingInsets() binding.addButton.setOnClickListener { if (requestLauncherSetup) { diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/entity/EntityWidgetConfigureActivity.kt b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/entity/EntityWidgetConfigureActivity.kt index c393e675a37..c336ae615b2 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/entity/EntityWidgetConfigureActivity.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/entity/EntityWidgetConfigureActivity.kt @@ -32,6 +32,7 @@ import io.homeassistant.companion.android.database.widget.WidgetBackgroundType import io.homeassistant.companion.android.database.widget.WidgetTapAction import io.homeassistant.companion.android.databinding.WidgetStaticConfigureBinding import io.homeassistant.companion.android.settings.widgets.ManageWidgetsViewModel +import io.homeassistant.companion.android.util.applySafeDrawingInsets import io.homeassistant.companion.android.util.getHexForColor import io.homeassistant.companion.android.widgets.BaseWidgetConfigureActivity import io.homeassistant.companion.android.widgets.BaseWidgetProvider @@ -81,6 +82,7 @@ class EntityWidgetConfigureActivity : BaseWidgetConfigureActivity() { binding = WidgetStaticConfigureBinding.inflate(layoutInflater) setContentView(binding.root) + binding.root.applySafeDrawingInsets() binding.addButton.setOnClickListener { if (requestLauncherSetup) { diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/mediaplayer/MediaPlayerControlsWidgetConfigureActivity.kt b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/mediaplayer/MediaPlayerControlsWidgetConfigureActivity.kt index 13807b51329..65d92f48c51 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/mediaplayer/MediaPlayerControlsWidgetConfigureActivity.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/mediaplayer/MediaPlayerControlsWidgetConfigureActivity.kt @@ -22,6 +22,7 @@ import io.homeassistant.companion.android.database.widget.MediaPlayerControlsWid import io.homeassistant.companion.android.database.widget.WidgetBackgroundType import io.homeassistant.companion.android.databinding.WidgetMediaControlsConfigureBinding import io.homeassistant.companion.android.settings.widgets.ManageWidgetsViewModel +import io.homeassistant.companion.android.util.applySafeDrawingInsets import io.homeassistant.companion.android.widgets.BaseWidgetConfigureActivity import io.homeassistant.companion.android.widgets.common.SingleItemArrayAdapter import io.homeassistant.companion.android.widgets.common.WidgetUtils @@ -66,6 +67,7 @@ class MediaPlayerControlsWidgetConfigureActivity : BaseWidgetConfigureActivity() binding = WidgetMediaControlsConfigureBinding.inflate(layoutInflater) setContentView(binding.root) + binding.root.applySafeDrawingInsets() binding.addButton.setOnClickListener { if (requestLauncherSetup) { diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/template/TemplateWidgetConfigureActivity.kt b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/template/TemplateWidgetConfigureActivity.kt index bdbdf5d7419..83fe2ac4ec9 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/template/TemplateWidgetConfigureActivity.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/template/TemplateWidgetConfigureActivity.kt @@ -24,6 +24,7 @@ import io.homeassistant.companion.android.database.widget.TemplateWidgetDao import io.homeassistant.companion.android.database.widget.WidgetBackgroundType import io.homeassistant.companion.android.databinding.WidgetTemplateConfigureBinding import io.homeassistant.companion.android.settings.widgets.ManageWidgetsViewModel +import io.homeassistant.companion.android.util.applySafeDrawingInsets import io.homeassistant.companion.android.util.getHexForColor import io.homeassistant.companion.android.widgets.BaseWidgetConfigureActivity import io.homeassistant.companion.android.widgets.common.WidgetUtils @@ -62,6 +63,7 @@ class TemplateWidgetConfigureActivity : BaseWidgetConfigureActivity() { binding = WidgetTemplateConfigureBinding.inflate(layoutInflater) setContentView(binding.root) + binding.root.applySafeDrawingInsets() // Find the widget id from the intent. val intent = intent diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt index ee459cdba3c..c89eeded3a4 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/widgets/todo/TodoWidgetConfigureActivity.kt @@ -8,6 +8,7 @@ import android.os.Build import android.os.Bundle import android.widget.Toast import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.annotation.RequiresApi import androidx.compose.foundation.clickable @@ -16,6 +17,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.Button @@ -52,6 +54,8 @@ import io.homeassistant.companion.android.util.previewEntity1 import io.homeassistant.companion.android.util.previewEntity2 import io.homeassistant.companion.android.util.previewServer1 import io.homeassistant.companion.android.util.previewServer2 +import io.homeassistant.companion.android.util.safeBottomWindowInsets +import io.homeassistant.companion.android.util.safeTopWindowInsets import kotlinx.coroutines.launch import timber.log.Timber @@ -69,6 +73,7 @@ class TodoWidgetConfigureActivity : BaseActivity() { ) override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() super.onCreate(savedInstanceState) // Set the result to CANCELED. This will cause the widget host to cancel @@ -207,6 +212,7 @@ private fun TodoWidgetConfigureView( topBar = { TopAppBar( title = { Text(stringResource(R.string.widget_todo_label)) }, + windowInsets = safeTopWindowInsets(), backgroundColor = colorResource(R.color.colorBackground), contentColor = colorResource(R.color.colorOnBackground), ) @@ -214,6 +220,7 @@ private fun TodoWidgetConfigureView( ) { padding -> Column( modifier = Modifier + .windowInsetsPadding(safeBottomWindowInsets()) .padding(padding) .verticalScroll(rememberScrollState()) .padding(all = 16.dp), diff --git a/app/src/main/res/layout/widget_button_configure.xml b/app/src/main/res/layout/widget_button_configure.xml index 8c374e59976..5b332b8de9c 100644 --- a/app/src/main/res/layout/widget_button_configure.xml +++ b/app/src/main/res/layout/widget_button_configure.xml @@ -3,7 +3,8 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - xmlns:app="http://schemas.android.com/apk/res-auto"> + xmlns:app="http://schemas.android.com/apk/res-auto" + android:clipToPadding="false"> + android:layout_height="match_parent" + android:clipToPadding="false"> + android:layout_height="match_parent" + android:clipToPadding="false"> + android:layout_height="match_parent" + android:clipToPadding="false"> + xmlns:tools="http://schemas.android.com/tools" + android:clipToPadding="false">