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 @@ -