From 6f89ac3b93ce237bd6d0a220b757131dad518bd1 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 2 Aug 2025 10:55:26 -0500 Subject: [PATCH] Fix some window inset issues --- .../astrid/activity/BeastModePreferences.java | 18 ++++++++++++++++- .../BaseCaldavAccountSettingsActivity.kt | 16 +++++++++++++++ .../compose/settings/ListSettingsScaffold.kt | 5 +++++ .../tasks/location/LocationPickerActivity.kt | 20 +++++++++++++++++++ .../org/tasks/preferences/BasePreferences.kt | 18 +++++++++++++++++ .../java/org/tasks/tags/TagPickerActivity.kt | 13 ++++++++++-- .../tasks/widget/ShortcutConfigActivity.kt | 18 +++++++++++++++++ 7 files changed, 105 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/todoroo/astrid/activity/BeastModePreferences.java b/app/src/main/java/com/todoroo/astrid/activity/BeastModePreferences.java index 203945561..209053877 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/BeastModePreferences.java +++ b/app/src/main/java/com/todoroo/astrid/activity/BeastModePreferences.java @@ -12,8 +12,12 @@ import static java.util.Arrays.asList; import android.content.Context; import android.os.Bundle; import android.view.MenuItem; - +import android.view.ViewGroup; +import androidx.activity.EdgeToEdge; import androidx.appcompat.widget.Toolbar; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -84,12 +88,24 @@ public class BeastModePreferences extends ThemedInjectingAppCompatActivity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); BeastModePrefActivityBinding binding = BeastModePrefActivityBinding.inflate(getLayoutInflater()); Toolbar toolbar = binding.toolbar.toolbar; RecyclerView recyclerView = binding.recyclerView; setContentView(binding.getRoot()); + ViewCompat.setOnApplyWindowInsetsListener( + binding.getRoot(), + (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + ViewGroup.MarginLayoutParams toolbarParams = + (ViewGroup.MarginLayoutParams) toolbar.getLayoutParams(); + toolbarParams.topMargin = systemBars.top; + recyclerView.setPadding(0, 0, 0, systemBars.bottom); + return insets; + }); + toolbar.setNavigationIcon( getDrawable(R.drawable.ic_outline_arrow_back_24px)); toolbar.setNavigationOnClickListener(v -> finish()); diff --git a/app/src/main/java/org/tasks/caldav/BaseCaldavAccountSettingsActivity.kt b/app/src/main/java/org/tasks/caldav/BaseCaldavAccountSettingsActivity.kt index a6062f790..cb3baeda4 100644 --- a/app/src/main/java/org/tasks/caldav/BaseCaldavAccountSettingsActivity.kt +++ b/app/src/main/java/org/tasks/caldav/BaseCaldavAccountSettingsActivity.kt @@ -8,10 +8,16 @@ import android.os.Bundle import android.text.TextUtils import android.view.MenuItem import android.view.View +import android.view.ViewGroup import android.view.inputmethod.InputMethodManager +import androidx.activity.enableEdgeToEdge import androidx.annotation.StringRes import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.widget.Toolbar +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updateLayoutParams +import androidx.core.view.updatePadding import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -70,8 +76,18 @@ abstract class BaseCaldavAccountSettingsActivity : ThemedInjectingAppCompatActiv override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + enableEdgeToEdge() binding = ActivityCaldavAccountSettingsBinding.inflate(layoutInflater) setContentView(binding.root) + + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + binding.toolbar.toolbar.updateLayoutParams { + topMargin = systemBars.top + } + binding.rootLayout.updatePadding(bottom = systemBars.bottom) + insets + } caldavAccount = if (savedInstanceState == null) intent.getParcelableExtra(EXTRA_CALDAV_DATA) else savedInstanceState.getParcelable(EXTRA_CALDAV_DATA) serverType = mutableStateOf( savedInstanceState?.getInt(EXTRA_SERVER_TYPE, SERVER_UNKNOWN) diff --git a/app/src/main/java/org/tasks/compose/settings/ListSettingsScaffold.kt b/app/src/main/java/org/tasks/compose/settings/ListSettingsScaffold.kt index 5f2e4cc46..bf35d4365 100644 --- a/app/src/main/java/org/tasks/compose/settings/ListSettingsScaffold.kt +++ b/app/src/main/java/org/tasks/compose/settings/ListSettingsScaffold.kt @@ -5,7 +5,9 @@ import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -60,6 +62,9 @@ fun ListSettingsScaffold( ) } TopAppBar( + windowInsets = TopAppBarDefaults.windowInsets.only( + WindowInsetsSides.Top + WindowInsetsSides.Horizontal + ), colors = TopAppBarDefaults.topAppBarColors( containerColor = color, navigationIconContentColor = contentColor, diff --git a/app/src/main/java/org/tasks/location/LocationPickerActivity.kt b/app/src/main/java/org/tasks/location/LocationPickerActivity.kt index 5a75b76b2..59cfd9930 100644 --- a/app/src/main/java/org/tasks/location/LocationPickerActivity.kt +++ b/app/src/main/java/org/tasks/location/LocationPickerActivity.kt @@ -8,6 +8,7 @@ import android.os.Bundle import android.os.Parcelable import android.view.MenuItem import android.view.View +import android.view.ViewGroup import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity @@ -15,6 +16,9 @@ import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.Toolbar import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.content.ContextCompat +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updateLayoutParams import androidx.core.widget.ContentLoadingProgressBar import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager @@ -66,6 +70,7 @@ class LocationPickerActivity : AppCompatActivity(), Toolbar.OnMenuItemClickListe private lateinit var loadingIndicator: ContentLoadingProgressBar private lateinit var chooseRecentLocation: View private lateinit var recyclerView: RecyclerView + private lateinit var selectThisLocation: View @Inject lateinit var theme: Theme @Inject lateinit var locationDao: LocationDao @@ -88,6 +93,7 @@ class LocationPickerActivity : AppCompatActivity(), Toolbar.OnMenuItemClickListe private lateinit var search: MenuItem private var searchJob: Job? = null private val viewModel: PlaceSearchViewModel by viewModels() + private var systemBarsBottom = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -95,6 +101,13 @@ class LocationPickerActivity : AppCompatActivity(), Toolbar.OnMenuItemClickListe window.statusBarColor = ContextCompat.getColor(this, android.R.color.transparent) val binding = ActivityLocationPickerBinding.inflate(layoutInflater) setContentView(binding.root) + + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + systemBarsBottom = systemBars.bottom + insets + } + toolbar = binding.toolbar appBarLayout = binding.appBarLayout toolbarLayout = binding.collapsingToolbarLayout @@ -105,6 +118,7 @@ class LocationPickerActivity : AppCompatActivity(), Toolbar.OnMenuItemClickListe loadingIndicator = binding.loadingIndicator chooseRecentLocation = binding.chooseRecentLocation recyclerView = binding.recentLocations + selectThisLocation = binding.selectThisLocation val configuration = resources.configuration if (configuration.orientation == Configuration.ORIENTATION_LANDSCAPE && configuration.smallestScreenWidthDp < 480) { @@ -318,9 +332,15 @@ class LocationPickerActivity : AppCompatActivity(), Toolbar.OnMenuItemClickListe params.height = height chooseRecentLocation.visibility = View.GONE collapseToolbar() + selectThisLocation.updateLayoutParams { + bottomMargin = systemBarsBottom + } } else { params.height = height * 75 / 100 chooseRecentLocation.visibility = View.VISIBLE + selectThisLocation.updateLayoutParams { + bottomMargin = 0 + } } } diff --git a/app/src/main/java/org/tasks/preferences/BasePreferences.kt b/app/src/main/java/org/tasks/preferences/BasePreferences.kt index d5610350b..12c2d4330 100644 --- a/app/src/main/java/org/tasks/preferences/BasePreferences.kt +++ b/app/src/main/java/org/tasks/preferences/BasePreferences.kt @@ -3,7 +3,12 @@ package org.tasks.preferences import android.content.Intent import android.os.Bundle import android.view.MenuItem +import android.view.ViewGroup import androidx.appcompat.widget.Toolbar +import androidx.core.view.ViewCompat +import androidx.core.view.WindowCompat +import androidx.core.view.updateLayoutParams +import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat @@ -22,8 +27,21 @@ abstract class BasePreferences : ThemedInjectingAppCompatActivity(), override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + + WindowCompat.setDecorFitsSystemWindows(window, false) + val binding = ActivityPreferencesBinding.inflate(layoutInflater) setContentView(binding.root) + + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets -> + val systemBars = insets.getSystemWindowInsets() + toolbar.updateLayoutParams { + topMargin = systemBars.top + } + binding.settings.updatePadding(bottom = systemBars.bottom) + insets + } + toolbar = binding.toolbar.toolbar if (savedInstanceState == null) { val rootPreference = getRootPreference() diff --git a/app/src/main/java/org/tasks/tags/TagPickerActivity.kt b/app/src/main/java/org/tasks/tags/TagPickerActivity.kt index 7ca278958..9ef2e4c8f 100644 --- a/app/src/main/java/org/tasks/tags/TagPickerActivity.kt +++ b/app/src/main/java/org/tasks/tags/TagPickerActivity.kt @@ -4,15 +4,19 @@ import android.app.Activity import android.content.Intent import android.os.Bundle import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.systemBars +import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.text.KeyboardOptions @@ -69,6 +73,8 @@ class TagPickerActivity : ThemedInjectingAppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + enableEdgeToEdge() + val intent = intent taskIds = intent.getSerializableExtra(EXTRA_TASKS) as ArrayList? if (savedInstanceState == null) { @@ -140,8 +146,11 @@ internal fun TagPicker( getTagIcon: (TagData) -> String, getTagColor: (TagData) -> Color ) { - Box ( modifier = Modifier.fillMaxSize() ) - { + Box( + modifier = Modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.systemBars) + ) { Column (modifier = Modifier.padding(horizontal = 12.dp)) { Box( modifier = Modifier.fillMaxWidth() ) { SearchBar(viewModel, onBackClicked) diff --git a/app/src/main/java/org/tasks/widget/ShortcutConfigActivity.kt b/app/src/main/java/org/tasks/widget/ShortcutConfigActivity.kt index 6ac3d0e67..4c0d512c7 100644 --- a/app/src/main/java/org/tasks/widget/ShortcutConfigActivity.kt +++ b/app/src/main/java/org/tasks/widget/ShortcutConfigActivity.kt @@ -2,8 +2,15 @@ package org.tasks.widget import android.os.Bundle import android.view.View +import android.view.ViewGroup import android.widget.TextView +import androidx.activity.enableEdgeToEdge import androidx.appcompat.widget.Toolbar +import androidx.core.content.ContextCompat +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updateLayoutParams +import androidx.core.view.updatePadding import androidx.core.content.pm.ShortcutInfoCompat import androidx.core.content.pm.ShortcutManagerCompat import androidx.core.graphics.drawable.IconCompat @@ -48,6 +55,8 @@ class ShortcutConfigActivity : ThemedInjectingAppCompatActivity(), ColorPaletteP public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + enableEdgeToEdge() + window.statusBarColor = ContextCompat.getColor(this, android.R.color.transparent) val binding = ActivityWidgetShortcutLayoutBinding.inflate(layoutInflater) binding.let { toolbar = it.toolbar.toolbar @@ -62,6 +71,15 @@ class ShortcutConfigActivity : ThemedInjectingAppCompatActivity(), ColorPaletteP } setContentView(binding.root) + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + toolbar.updateLayoutParams { + topMargin = systemBars.top + } + binding.body.root.updatePadding(bottom = systemBars.bottom) + insets + } + toolbar.setTitle(R.string.FSA_label) toolbar.navigationIcon = getDrawable(R.drawable.ic_outline_save_24px) toolbar.setNavigationOnClickListener { save() }