From e4348a2144da9cf470d3e1b4bdee75456c1a39ca Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Tue, 8 Jul 2025 20:51:21 -0500 Subject: [PATCH] Prevent some views from being obscured by system UI Fixes #2171 --- .../habits/list/views/HabitCardListView.kt | 24 +++++++++++++++++++ .../activities/habits/show/ShowHabitView.kt | 2 ++ .../isoron/uhabits/utils/ViewExtensions.kt | 8 +++++++ .../src/main/res/layout/show_habit.xml | 22 ++++++++--------- 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt index fd6df425f..b2ef1a92f 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt @@ -20,11 +20,14 @@ package org.isoron.uhabits.activities.habits.list.views import android.content.Context +import android.graphics.Rect import android.os.Bundle import android.os.Parcelable import android.view.GestureDetector import android.view.MotionEvent import android.view.View +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper.DOWN import androidx.recyclerview.widget.ItemTouchHelper.END @@ -75,9 +78,30 @@ class HabitCardListView( setHasFixedSize(true) isLongClickable = true layoutManager = LinearLayoutManager(context) + applyBottomInset() super.setAdapter(adapter) } + private fun applyBottomInset() { + ViewCompat.setOnApplyWindowInsetsListener(this) { _, insets -> + val systemBarsInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + addItemDecoration(object : ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: State + ) { + val itemCount = parent.adapter?.itemCount + if (parent.getChildAdapterPosition(view) == itemCount?.minus(1)) { + outRect.bottom = systemBarsInsets.bottom + } + } + }) + insets + } + } + fun createHabitCardView(): HabitCardView { return cardViewFactory.create() } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitView.kt index fb484745d..c707f2d6d 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitView.kt @@ -25,6 +25,7 @@ import android.widget.FrameLayout import org.isoron.uhabits.core.ui.screens.habits.show.ShowHabitPresenter import org.isoron.uhabits.core.ui.screens.habits.show.ShowHabitState import org.isoron.uhabits.databinding.ShowHabitBinding +import org.isoron.uhabits.utils.applyBottomInset import org.isoron.uhabits.utils.applyToolbarInsets import org.isoron.uhabits.utils.setupToolbar @@ -57,6 +58,7 @@ class ShowHabitView(context: Context) : FrameLayout(context) { } else { binding.targetCard.visibility = GONE } + binding.linearLayout.applyBottomInset() } fun setListener(presenter: ShowHabitPresenter) { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt index 8086ddb93..5663ae8a2 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt @@ -260,6 +260,14 @@ fun View.applyRootViewInsets() { } } +fun View.applyBottomInset() { + ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets -> + val systemBarsInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + view.setPadding(0, 0, 0, systemBarsInsets.bottom) + insets + } +} + fun View.applyToolbarInsets() { ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets -> val systemBarsInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars()) diff --git a/uhabits-android/src/main/res/layout/show_habit.xml b/uhabits-android/src/main/res/layout/show_habit.xml index 72f1b7ca9..7631d8c9e 100644 --- a/uhabits-android/src/main/res/layout/show_habit.xml +++ b/uhabits-android/src/main/res/layout/show_habit.xml @@ -17,8 +17,7 @@ ~ with this program. If not, see . --> - + android:layout_alignParentTop="true" /> + style="@style/ShowHabit.Subtitle" /> + android:paddingTop="12dp" /> + android:paddingTop="12dp" /> + android:gravity="center" /> + android:gravity="center" /> + android:paddingBottom="0dp" /> + style="@style/Card" /> + style="@style/Card" />