From f78786656371eda75a0f950b2149ebf36ed00400 Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 18 Aug 2026 13:11:20 -0400 Subject: [PATCH] fix: pad activities for system bar insets Android 15 lays out apps targeting SDK 35 or later edge to edge, so the window extends behind the status and navigation bars. All three activities use a plain LinearLayout with the toolbar as the first child and none of them consume window insets, so the toolbar is drawn beneath the status bar. The result is that the title overlaps the clock and status icons, and the overflow menu sits inside the status bar strip, where taps open the notification shade instead of the menu. That makes Settings unreachable on Android 15 and later. Add a small applySystemBarInsets() helper and apply it to the root view of MainActivity, WorkoutHistoryActivity and WorkoutDetailActivity. --- .../net/duhowpi/ftmsbridge/MainActivity.kt | 2 ++ .../ftmsbridge/WorkoutDetailActivity.kt | 2 ++ .../ftmsbridge/WorkoutHistoryActivity.kt | 2 ++ .../java/net/duhowpi/ftmsbridge/ui/Insets.kt | 29 +++++++++++++++++++ 4 files changed, 35 insertions(+) create mode 100644 app/src/main/java/net/duhowpi/ftmsbridge/ui/Insets.kt diff --git a/app/src/main/java/net/duhowpi/ftmsbridge/MainActivity.kt b/app/src/main/java/net/duhowpi/ftmsbridge/MainActivity.kt index b4a8399..2ed2f20 100644 --- a/app/src/main/java/net/duhowpi/ftmsbridge/MainActivity.kt +++ b/app/src/main/java/net/duhowpi/ftmsbridge/MainActivity.kt @@ -55,6 +55,7 @@ import net.duhowpi.ftmsbridge.ftms.FtmsConstants import net.duhowpi.ftmsbridge.ftms.FtmsDataParser import net.duhowpi.ftmsbridge.model.FitnessSample import net.duhowpi.ftmsbridge.model.ScannedDeviceInfo +import net.duhowpi.ftmsbridge.ui.applySystemBarInsets import java.nio.ByteBuffer import java.nio.ByteOrder import java.util.UUID @@ -226,6 +227,7 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) + binding.root.applySystemBarInsets() binding.toolbar.title = getString(R.string.app_name) setSupportActionBar(binding.toolbar) diff --git a/app/src/main/java/net/duhowpi/ftmsbridge/WorkoutDetailActivity.kt b/app/src/main/java/net/duhowpi/ftmsbridge/WorkoutDetailActivity.kt index 3690b45..6a92ae9 100644 --- a/app/src/main/java/net/duhowpi/ftmsbridge/WorkoutDetailActivity.kt +++ b/app/src/main/java/net/duhowpi/ftmsbridge/WorkoutDetailActivity.kt @@ -19,6 +19,7 @@ import net.duhowpi.ftmsbridge.data.AppDatabase import net.duhowpi.ftmsbridge.data.WorkoutSample import net.duhowpi.ftmsbridge.data.WorkoutSession import net.duhowpi.ftmsbridge.databinding.ActivityWorkoutDetailBinding +import net.duhowpi.ftmsbridge.ui.applySystemBarInsets import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -34,6 +35,7 @@ class WorkoutDetailActivity : AppCompatActivity() { super.onCreate(savedInstanceState) binding = ActivityWorkoutDetailBinding.inflate(layoutInflater) setContentView(binding.root) + binding.root.applySystemBarInsets() setSupportActionBar(binding.toolbar) supportActionBar?.setDisplayHomeAsUpEnabled(true) diff --git a/app/src/main/java/net/duhowpi/ftmsbridge/WorkoutHistoryActivity.kt b/app/src/main/java/net/duhowpi/ftmsbridge/WorkoutHistoryActivity.kt index c9bf868..47b301c 100644 --- a/app/src/main/java/net/duhowpi/ftmsbridge/WorkoutHistoryActivity.kt +++ b/app/src/main/java/net/duhowpi/ftmsbridge/WorkoutHistoryActivity.kt @@ -24,6 +24,7 @@ import kotlinx.coroutines.withContext import net.duhowpi.ftmsbridge.data.AppDatabase import net.duhowpi.ftmsbridge.data.WorkoutSession import net.duhowpi.ftmsbridge.databinding.ActivityWorkoutHistoryBinding +import net.duhowpi.ftmsbridge.ui.applySystemBarInsets import java.io.File import java.text.SimpleDateFormat import java.util.Date @@ -48,6 +49,7 @@ class WorkoutHistoryActivity : AppCompatActivity() { super.onCreate(savedInstanceState) binding = ActivityWorkoutHistoryBinding.inflate(layoutInflater) setContentView(binding.root) + binding.root.applySystemBarInsets() binding.toolbar.title = getString(R.string.workout_history) setSupportActionBar(binding.toolbar) diff --git a/app/src/main/java/net/duhowpi/ftmsbridge/ui/Insets.kt b/app/src/main/java/net/duhowpi/ftmsbridge/ui/Insets.kt new file mode 100644 index 0000000..14a1453 --- /dev/null +++ b/app/src/main/java/net/duhowpi/ftmsbridge/ui/Insets.kt @@ -0,0 +1,29 @@ +package net.duhowpi.ftmsbridge.ui + +import android.view.View +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding + +/** + * Pads this view by the system bar and display cutout insets. + * + * Android 15 lays apps targeting SDK 35 or later out edge to edge, so the window extends + * behind the status and navigation bars. Each activity here uses a plain LinearLayout with + * the toolbar as its first child, which would otherwise be drawn underneath the status bar, + * leaving the overflow menu overlapping the status icons and swallowing taps on it. + */ +fun View.applySystemBarInsets() { + ViewCompat.setOnApplyWindowInsetsListener(this) { view, windowInsets -> + val insets = windowInsets.getInsets( + WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout() + ) + view.updatePadding( + left = insets.left, + top = insets.top, + right = insets.right, + bottom = insets.bottom + ) + windowInsets + } +}