From 5f9e381754647f375b08b43ba233e356ce567c60 Mon Sep 17 00:00:00 2001 From: Rahul Patel Date: Tue, 13 Aug 2024 01:02:59 +0530 Subject: [PATCH] Address as Epoxy related memory leaks - Thanks to @theimpulson for adding stupid but useful LeakyCanary <3 --- .../store/view/ui/commons/BaseFragment.kt | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/BaseFragment.kt b/app/src/main/java/com/aurora/store/view/ui/commons/BaseFragment.kt index f9242e4c6..7280a6063 100644 --- a/app/src/main/java/com/aurora/store/view/ui/commons/BaseFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/commons/BaseFragment.kt @@ -26,11 +26,13 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import androidx.viewbinding.ViewBinding +import com.airbnb.epoxy.EpoxyRecyclerView import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.Category import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.store.MobileNavigationDirections import com.aurora.store.data.model.MinimalApp +import com.aurora.store.util.Log import com.google.gson.Gson import java.lang.reflect.ParameterizedType import javax.inject.Inject @@ -61,6 +63,7 @@ abstract class BaseFragment : Fragment() { } override fun onDestroyView() { + cleanupRecyclerViews(findAllRecyclerViews(requireView())) _binding = null super.onDestroyView() } @@ -116,4 +119,30 @@ abstract class BaseFragment : Fragment() { fun openAppMenuSheet(app: MinimalApp) { findNavController().navigate(MobileNavigationDirections.actionGlobalAppMenuSheet(app)) } + + private fun cleanupRecyclerViews(recyclerViews: List) { + recyclerViews.forEach { recyclerView -> + runCatching { + recyclerView.adapter?.let { + recyclerView.swapAdapter(it, true) + } + }.onFailure { + Log.e("Failed to cleanup RecyclerView", it.message) + } + } + } + + private fun findAllRecyclerViews(view: View): List { + val recyclerViews = mutableListOf() + + if (view is EpoxyRecyclerView) { + recyclerViews.add(view) + } else if (view is ViewGroup) { + for (i in 0 until view.childCount) { + recyclerViews.addAll(findAllRecyclerViews(view.getChildAt(i))) + } + } + + return recyclerViews + } }