diff --git a/app/src/main/java/foundation/e/advancedprivacy/common/InsetsHelpers.kt b/app/src/main/java/foundation/e/advancedprivacy/common/InsetsHelpers.kt
new file mode 100644
index 0000000000000000000000000000000000000000..3fea931d08f10e5aff66c0b6ee590452532cfcf4
--- /dev/null
+++ b/app/src/main/java/foundation/e/advancedprivacy/common/InsetsHelpers.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2025 E FOUNDATION
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package foundation.e.advancedprivacy.common
+
+import android.view.View
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.updatePadding
+
+fun setInsetAsBottomPadding(view: View) {
+ ViewCompat.setOnApplyWindowInsetsListener(view) { v, windowInsets ->
+ val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout())
+ v.updatePadding(bottom = insets.bottom)
+ WindowInsetsCompat.CONSUMED
+ }
+}
diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardFragment.kt
index dec1510452e4544c9dff04a2c3ad84cc99174677..52cc6a40c0558e9c16599b89bff1a6e7f39450ca 100644
--- a/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardFragment.kt
+++ b/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardFragment.kt
@@ -1,6 +1,6 @@
/*
+ * Copyright (C) 2021 - 2025 E FOUNDATION
* Copyright (C) 2023-2024 MURENA SAS
- * Copyright (C) 2021 E FOUNDATION
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -33,6 +33,7 @@ import foundation.e.advancedprivacy.R
import foundation.e.advancedprivacy.common.BigNumberFormatter
import foundation.e.advancedprivacy.common.NavToolbarFragment
import foundation.e.advancedprivacy.common.extensions.safeNavigate
+import foundation.e.advancedprivacy.common.setInsetAsBottomPadding
import foundation.e.advancedprivacy.databinding.FragmentDashboardBinding
import foundation.e.advancedprivacy.domain.entities.FeatureMode
import foundation.e.advancedprivacy.domain.entities.FeatureState
@@ -53,6 +54,8 @@ class DashboardFragment : NavToolbarFragment(R.layout.fragment_dashboard) {
super.onViewCreated(view, savedInstanceState)
binding = FragmentDashboardBinding.bind(view)
+ setInsetAsBottomPadding(binding.container)
+
with(binding.dataBlockedTrackers) {
primaryMessage.apply {
setText(R.string.dashboard_data_blocked_trackers_primary)
diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/debug/DebugActivity.kt b/app/src/main/java/foundation/e/advancedprivacy/features/debug/DebugActivity.kt
index 911436e0e30ed15efd6d7873fd34c253ec0b9a03..388fa2cd0753e695eebd0d3f622e762bbd9672a0 100644
--- a/app/src/main/java/foundation/e/advancedprivacy/features/debug/DebugActivity.kt
+++ b/app/src/main/java/foundation/e/advancedprivacy/features/debug/DebugActivity.kt
@@ -18,7 +18,14 @@
package foundation.e.advancedprivacy.features.debug
import android.os.Bundle
+import android.view.View
+import android.view.ViewGroup.MarginLayoutParams
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.updateLayoutParams
import androidx.fragment.app.FragmentActivity
+import foundation.e.advancedprivacy.R
import foundation.e.advancedprivacy.databinding.DebugActivityBinding
// Hidden debug tools activity for AdvancedPrivacy
@@ -28,6 +35,18 @@ class DebugActivity : FragmentActivity() {
private lateinit var binding: DebugActivityBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
+ WindowCompat.setDecorFitsSystemWindows(window, false)
+
+ ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.nav_host_fragment)) { v, windowInsets ->
+ val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout())
+ v.updateLayoutParams {
+ topMargin = insets.top
+ leftMargin = insets.left
+ bottomMargin = insets.bottom
+ rightMargin = insets.right
+ }
+ WindowInsetsCompat.CONSUMED
+ }
binding = DebugActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyFragment.kt
index f9f57006552e58a6a156a06ab7515ea22de00212..f23bfb2873ef87e62fc12cc50209d65d63da8494 100644
--- a/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyFragment.kt
+++ b/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyFragment.kt
@@ -1,6 +1,6 @@
/*
+ * Copyright (C) 2021 - 2025 E FOUNDATION
* Copyright (C) 2023 MURENA SAS
- * Copyright (C) 2021 - 2024 E FOUNDATION
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -29,6 +29,7 @@ import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.LinearLayoutManager
import foundation.e.advancedprivacy.R
import foundation.e.advancedprivacy.common.NavToolbarFragment
+import foundation.e.advancedprivacy.common.setInsetAsBottomPadding
import foundation.e.advancedprivacy.common.setToolTipForAsterisk
import foundation.e.advancedprivacy.databinding.FragmentInternetActivityPolicyBinding
import foundation.e.advancedprivacy.domain.entities.FeatureState
@@ -52,6 +53,8 @@ class InternetPrivacyFragment : NavToolbarFragment(R.layout.fragment_internet_ac
super.onViewCreated(view, savedInstanceState)
_binding = FragmentInternetActivityPolicyBinding.bind(view)
+ setInsetAsBottomPadding(binding.container)
+
binding.apps.apply {
layoutManager = LinearLayoutManager(requireContext())
setHasFixedSize(true)
diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationFragment.kt
index e16f5d28223efe1b460c058cab569349a7606933..187c8128dffa10c2788d2c652de061cf5795ff3b 100644
--- a/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationFragment.kt
+++ b/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationFragment.kt
@@ -1,6 +1,6 @@
/*
+ * Copyright (C) 2021 - 2025 E FOUNDATION
* Copyright (C) 2023 MURENA SAS
- * Copyright (C) 2021 - 2024 E FOUNDATION
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -40,6 +40,7 @@ import com.google.android.material.textfield.TextInputLayout.END_ICON_CUSTOM
import com.google.android.material.textfield.TextInputLayout.END_ICON_NONE
import foundation.e.advancedprivacy.R
import foundation.e.advancedprivacy.common.NavToolbarFragment
+import foundation.e.advancedprivacy.common.setInsetAsBottomPadding
import foundation.e.advancedprivacy.common.setToolTipForAsterisk
import foundation.e.advancedprivacy.databinding.FragmentFakeLocationBinding
import foundation.e.advancedprivacy.domain.entities.LocationMode
@@ -107,6 +108,8 @@ class FakeLocationFragment : NavToolbarFragment(R.layout.fragment_fake_location)
super.onViewCreated(view, savedInstanceState)
_binding = FragmentFakeLocationBinding.bind(view)
+ setInsetAsBottomPadding(binding.container)
+
binding.mapView.setup(savedInstanceState) { mapLibreMap ->
this.mapLibreMap = mapLibreMap
mapLibreMap.uiSettings.isRotateGesturesEnabled = false
diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/ListsTabPagerAdapter.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/ListsTabPagerAdapter.kt
index 3897c63779255e7b19f5ca280ea41ebf7f29e7a6..6e8b5cf0018b4669db7256138d20bd0a4f880aff 100644
--- a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/ListsTabPagerAdapter.kt
+++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/ListsTabPagerAdapter.kt
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2025 E FOUNDATION
* Copyright (C) 2023 - 2024 MURENA SAS
*
* This program is free software: you can redistribute it and/or modify
@@ -28,6 +29,7 @@ import foundation.e.advancedprivacy.R
import foundation.e.advancedprivacy.common.BindingListAdapter
import foundation.e.advancedprivacy.common.BindingViewHolder
import foundation.e.advancedprivacy.common.extensions.dpToPx
+import foundation.e.advancedprivacy.common.setInsetAsBottomPadding
import foundation.e.advancedprivacy.databinding.TrackersAppsListBinding
import foundation.e.advancedprivacy.databinding.TrackersItemAppBinding
import foundation.e.advancedprivacy.databinding.TrackersListBinding
@@ -86,6 +88,7 @@ class ListsTabPagerAdapter(
sealed class ListsTabViewHolder(view: View) : RecyclerView.ViewHolder(view) {
protected fun setupRecyclerView(recyclerView: RecyclerView) {
+ setInsetAsBottomPadding(recyclerView)
recyclerView.apply {
layoutManager = LinearLayoutManager(context)
setHasFixedSize(true)
diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/AppTrackersFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/AppTrackersFragment.kt
index 99280ddd873d4b8882aeb751740ace68c7c196ff..988987c070285b7edfcb53741fef3978d04b3c45 100644
--- a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/AppTrackersFragment.kt
+++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/apptrackers/AppTrackersFragment.kt
@@ -1,6 +1,6 @@
/*
+ * Copyright (C) 2021 - 2025 E FOUNDATION
* Copyright (C) 2023-2024 MURENA SAS
- * Copyright (C) 2021 E FOUNDATION
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -35,6 +35,7 @@ import com.google.android.material.snackbar.Snackbar
import foundation.e.advancedprivacy.R
import foundation.e.advancedprivacy.common.BigNumberFormatter
import foundation.e.advancedprivacy.common.NavToolbarFragment
+import foundation.e.advancedprivacy.common.setInsetAsBottomPadding
import foundation.e.advancedprivacy.databinding.ApptrackersFragmentBinding
import foundation.e.advancedprivacy.features.trackers.setupDisclaimerBlock
import kotlinx.coroutines.launch
@@ -63,6 +64,8 @@ class AppTrackersFragment : NavToolbarFragment(R.layout.apptrackers_fragment) {
super.onViewCreated(view, savedInstanceState)
binding = ApptrackersFragmentBinding.bind(view)
+ setInsetAsBottomPadding(binding.container)
+
binding.blockAllToggle.setOnClickListener {
viewModel.onToggleBlockAll(binding.blockAllToggle.isChecked)
}
diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerDetailsFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerDetailsFragment.kt
index 863f93fb8413118bc4299b8b213c27332dd310b7..1ec49194397970d563fca7cc6e6c3aec543dc3d5 100644
--- a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerDetailsFragment.kt
+++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/trackerdetails/TrackerDetailsFragment.kt
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2025 E FOUNDATION
* Copyright (C) 2023-2024 MURENA SAS
*
* This program is free software: you can redistribute it and/or modify
@@ -33,6 +34,7 @@ import com.google.android.material.snackbar.Snackbar
import foundation.e.advancedprivacy.R
import foundation.e.advancedprivacy.common.BigNumberFormatter
import foundation.e.advancedprivacy.common.NavToolbarFragment
+import foundation.e.advancedprivacy.common.setInsetAsBottomPadding
import foundation.e.advancedprivacy.databinding.TrackerdetailsFragmentBinding
import foundation.e.advancedprivacy.features.trackers.setupDisclaimerBlock
import kotlinx.coroutines.launch
@@ -60,6 +62,8 @@ class TrackerDetailsFragment : NavToolbarFragment(R.layout.trackerdetails_fragme
super.onViewCreated(view, savedInstanceState)
binding = TrackerdetailsFragmentBinding.bind(view)
+ setInsetAsBottomPadding(binding.container)
+
binding.blockAllToggle.setOnClickListener {
viewModel.onToggleBlockAll(binding.blockAllToggle.isChecked)
}
diff --git a/app/src/main/java/foundation/e/advancedprivacy/main/MainActivity.kt b/app/src/main/java/foundation/e/advancedprivacy/main/MainActivity.kt
index fbe5cf8b35e652bef229e3573f70ace943069f31..b8641f85655f4eb0b6e2ec61a6578aa4584da59d 100644
--- a/app/src/main/java/foundation/e/advancedprivacy/main/MainActivity.kt
+++ b/app/src/main/java/foundation/e/advancedprivacy/main/MainActivity.kt
@@ -1,6 +1,6 @@
/*
+ * Copyright (C) 2021 - 2025 E FOUNDATION
* Copyright (C) 2023 MURENA SAS
- * Copyright (C) 2021 E FOUNDATION
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -20,12 +20,36 @@ package foundation.e.advancedprivacy.main
import android.content.Context
import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import android.view.ViewGroup.MarginLayoutParams
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.updateLayoutParams
import androidx.fragment.app.FragmentActivity
import androidx.navigation.NavDeepLinkBuilder
import androidx.navigation.findNavController
import foundation.e.advancedprivacy.R
class MainActivity : FragmentActivity(R.layout.activity_main) {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ WindowCompat.setDecorFitsSystemWindows(window, false)
+
+ ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.nav_host_fragment)) { v, windowInsets ->
+ val insets = windowInsets.getInsets(
+ WindowInsetsCompat.Type.systemBars()
+ or WindowInsetsCompat.Type.displayCutout()
+ )
+ v.updateLayoutParams {
+ leftMargin = insets.left
+ rightMargin = insets.right
+ }
+ windowInsets
+ }
+ }
+
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
findNavController(R.id.nav_host_fragment).handleDeepLink(intent)
diff --git a/app/src/main/res/layout/apptrackers_fragment.xml b/app/src/main/res/layout/apptrackers_fragment.xml
index 06b8d3fb5bf6545c472d54c6c6ef50fdd975c121..f5ca7bc3c2529fd5af36b419c107f457f58b0bd6 100644
--- a/app/src/main/res/layout/apptrackers_fragment.xml
+++ b/app/src/main/res/layout/apptrackers_fragment.xml
@@ -1,6 +1,6 @@
-