From dbd3aabe857d437d7025bbaf416dab3e5d44fbd0 Mon Sep 17 00:00:00 2001 From: jacquarg Date: Fri, 20 Jun 2025 11:18:40 +0200 Subject: [PATCH] fix:sentry-OOM: Fix leaks on binding object. --- .../features/dashboard/DashboardFragment.kt | 10 ++++++++-- .../features/debug/DebugWeeklyReportFragment.kt | 10 ++++++++-- .../features/trackers/TrackersFragment.kt | 11 +++++++++-- .../features/trackers/TrackersPeriodFragment.kt | 10 ++++++++-- .../trackers/apptrackers/AppTrackersFragment.kt | 10 ++++++++-- .../trackers/trackerdetails/TrackerDetailsFragment.kt | 10 ++++++++-- 6 files changed, 49 insertions(+), 12 deletions(-) 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 52cc6a40..5bb2bdd4 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 @@ -46,13 +46,14 @@ class DashboardFragment : NavToolbarFragment(R.layout.fragment_dashboard) { private val viewModel: DashboardViewModel by viewModel() private val numberFormatter: BigNumberFormatter by lazy { BigNumberFormatter(requireContext()) } - private lateinit var binding: FragmentDashboardBinding + private var _binding: FragmentDashboardBinding? = null + private val binding get() = _binding!! private lateinit var tabAdapter: ShameListsTabPagerAdapter override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding = FragmentDashboardBinding.bind(view) + _binding = FragmentDashboardBinding.bind(view) setInsetAsBottomPadding(binding.container) @@ -243,6 +244,11 @@ class DashboardFragment : NavToolbarFragment(R.layout.fragment_dashboard) { tabAdapter.updateDataSet(state) } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + private fun getStateColor(isActive: Boolean): Int { return getColor( requireContext(), diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/debug/DebugWeeklyReportFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/features/debug/DebugWeeklyReportFragment.kt index c1105a27..b38b1669 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/features/debug/DebugWeeklyReportFragment.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/features/debug/DebugWeeklyReportFragment.kt @@ -58,7 +58,8 @@ class DebugWeeklyReportFragment : Fragment(R.layout.debug_weekly_report_fragment private val reportsFactory: WeeklyReportViewFactory by inject() private val weeklyReportRepository: WeeklyReportLocalRepository by inject() - private lateinit var binding: DebugWeeklyReportFragmentBinding + private var _binding: DebugWeeklyReportFragmentBinding? = null + private val binding get() = _binding!! private val weeklyReportsAdapter = object : BindingListAdapter< DebugWeeklyReportItemBinding, @@ -135,7 +136,7 @@ class DebugWeeklyReportFragment : Fragment(R.layout.debug_weekly_report_fragment override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding = DebugWeeklyReportFragmentBinding.bind(view) + _binding = DebugWeeklyReportFragmentBinding.bind(view) setupRecyclerView(binding.reports) @@ -170,6 +171,11 @@ class DebugWeeklyReportFragment : Fragment(R.layout.debug_weekly_report_fragment } } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + private fun setupRecyclerView(recyclerView: RecyclerView) { recyclerView.apply { layoutManager = LinearLayoutManager(context) diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersFragment.kt index 43cf4c91..9cf3b406 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersFragment.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersFragment.kt @@ -55,14 +55,16 @@ import org.koin.androidx.viewmodel.ext.android.viewModel class TrackersFragment : NavToolbarFragment(R.layout.fragment_trackers) { private val viewModel: TrackersViewModel by viewModel() private val weeklyReportViewFactory: WeeklyReportViewFactory by inject() - private lateinit var binding: FragmentTrackersBinding + + private var _binding: FragmentTrackersBinding? = null + private val binding get() = _binding!! private lateinit var pagerAdapter: TrackersPeriodAdapter override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding = FragmentTrackersBinding.bind(view) + _binding = FragmentTrackersBinding.bind(view) val trackersTabs = binding.trackersPeriodsTabs val trackersPager = binding.trackersPeriodsPager @@ -111,6 +113,11 @@ class TrackersFragment : NavToolbarFragment(R.layout.fragment_trackers) { return viewModel.refreshUiHeight } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + private fun listenViewModel() { with(viewLifecycleOwner) { lifecycleScope.launch { diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersPeriodFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersPeriodFragment.kt index 2a3aafed..543f92b8 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersPeriodFragment.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/features/trackers/TrackersPeriodFragment.kt @@ -68,7 +68,8 @@ class TrackersPeriodFragment : Fragment(R.layout.trackers_period_fragment) { private val trackersFragment: TrackersFragment? get() = parentFragment as? TrackersFragment? - private lateinit var binding: TrackersPeriodFragmentBinding + private var _binding: TrackersPeriodFragmentBinding? = null + private val binding get() = _binding!! private lateinit var tabAdapter: ListsTabPagerAdapter private lateinit var graphHolder: GraphHolder @@ -76,7 +77,7 @@ class TrackersPeriodFragment : Fragment(R.layout.trackers_period_fragment) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding = TrackersPeriodFragmentBinding.bind(view) + _binding = TrackersPeriodFragmentBinding.bind(view) graphHolder = GraphHolder(binding.graphContainer) @@ -117,6 +118,11 @@ class TrackersPeriodFragment : Fragment(R.layout.trackers_period_fragment) { } } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + @OptIn(FlowPreview::class) private fun listenViewModel() { with(viewLifecycleOwner) { 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 988987c0..1d1c3ab9 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 @@ -49,7 +49,8 @@ class AppTrackersFragment : NavToolbarFragment(R.layout.apptrackers_fragment) { private val numberFormatter: BigNumberFormatter by lazy { BigNumberFormatter(requireContext()) } - private lateinit var binding: ApptrackersFragmentBinding + private var _binding: ApptrackersFragmentBinding? = null + private val binding get() = _binding!! override fun getTitle(): CharSequence { return "" @@ -62,7 +63,7 @@ class AppTrackersFragment : NavToolbarFragment(R.layout.apptrackers_fragment) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding = ApptrackersFragmentBinding.bind(view) + _binding = ApptrackersFragmentBinding.bind(view) setInsetAsBottomPadding(binding.container) @@ -87,6 +88,11 @@ class AppTrackersFragment : NavToolbarFragment(R.layout.apptrackers_fragment) { setupDisclaimerBlock(binding.disclaimerBlockTrackers.root, viewModel::onClickLearnMore) } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + private fun listenViewModel() { with(viewLifecycleOwner) { lifecycleScope.launch { 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 1ec49194..daa9a610 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 @@ -47,7 +47,8 @@ class TrackerDetailsFragment : NavToolbarFragment(R.layout.trackerdetails_fragme private val viewModel: TrackerDetailsViewModel by viewModel { parametersOf(args.trackerId) } private val numberFormatter: BigNumberFormatter by lazy { BigNumberFormatter(requireContext()) } - private lateinit var binding: TrackerdetailsFragmentBinding + private var _binding: TrackerdetailsFragmentBinding? = null + private val binding get() = _binding!! override fun getTitle(): CharSequence { return "" @@ -60,7 +61,7 @@ class TrackerDetailsFragment : NavToolbarFragment(R.layout.trackerdetails_fragme override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding = TrackerdetailsFragmentBinding.bind(view) + _binding = TrackerdetailsFragmentBinding.bind(view) setInsetAsBottomPadding(binding.container) @@ -84,6 +85,11 @@ class TrackerDetailsFragment : NavToolbarFragment(R.layout.trackerdetails_fragme listenViewModel() } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + private fun listenViewModel() { with(viewLifecycleOwner) { lifecycleScope.launch { -- GitLab