From c0c4d505ac6d74b7d23871777a5d80dddd83a497 Mon Sep 17 00:00:00 2001 From: Ifeoluwa Andrew Omole Date: Tue, 28 Jan 2025 13:19:26 +0100 Subject: [PATCH] MainActivity: Fix memory leaks when navigating between bottom nav destinations --- .../commons/contributions/MainActivity.java | 17 +++++++ .../nrw/commons/explore/ExploreFragment.java | 49 ++++++++++--------- .../explore/map/ExploreMapFragment.java | 12 +++-- .../fragments/NearbyParentFragment.java | 2 +- 4 files changed, 54 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java b/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java index fa2f5a515..d9a3c26de 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java @@ -208,6 +208,8 @@ public class MainActivity extends BaseActivity //showBottom so that we do not show the bottom tray again when constructing //from the saved instance state. + freeUpFragments(); + if (fragment != null && args != null) { fragment.setArguments(args); } @@ -261,6 +263,19 @@ public class MainActivity extends BaseActivity return false; } + /** + * Old implementation of loadFragment() was causing memory leaks, due to MainActivity holding + * references to cleared fragments. This function frees up all fragment references. + *

+ * Called in loadFragment() before doing the actual loading. + **/ + public void freeUpFragments() { + contributionsFragment = null; + nearbyParentFragment = null; + exploreFragment = null; + bookmarkFragment = null; + } + public void hideTabs() { binding.fragmentMainNavTabLayout.setVisibility(View.GONE); } @@ -452,6 +467,7 @@ public class MainActivity extends BaseActivity bundle.putDouble("prev_longitude", longitude); loadFragment(ExploreFragment.newInstance(), false, bundle); + setSelectedItemId(NavTab.EXPLORE.code()); } /** @@ -469,6 +485,7 @@ public class MainActivity extends BaseActivity bundle.putDouble("prev_longitude", longitude); loadFragment(NearbyParentFragment.newInstance(), false, bundle); + setSelectedItemId(NavTab.NEARBY.code()); } @Override diff --git a/app/src/main/java/fr/free/nrw/commons/explore/ExploreFragment.java b/app/src/main/java/fr/free/nrw/commons/explore/ExploreFragment.java index cccb456f3..223d028dc 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/ExploreFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/explore/ExploreFragment.java @@ -196,33 +196,38 @@ public class ExploreFragment extends CommonsDaggerSupportFragment { */ @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - inflater.inflate(R.menu.explore_fragment_menu, menu); + // if logged in 'Show in Nearby' menu item is visible + if (applicationKvStore.getBoolean("login_skipped") == false) { + inflater.inflate(R.menu.explore_fragment_menu, menu); - MenuItem others = menu.findItem(R.id.list_item_show_in_nearby); + MenuItem others = menu.findItem(R.id.list_item_show_in_nearby); - if (binding.viewPager.getCurrentItem() == 2) { - others.setVisible(true); - } - - // if on Map tab, show all menu options, else only show search - binding.viewPager.addOnPageChangeListener(new OnPageChangeListener() { - @Override - public void onPageScrolled(int position, float positionOffset, - int positionOffsetPixels) { + if (binding.viewPager.getCurrentItem() == 2) { + others.setVisible(true); } - @Override - public void onPageSelected(int position) { - others.setVisible((position == 2)); - } - - @Override - public void onPageScrollStateChanged(int state) { - if (state == SCROLL_STATE_IDLE && binding.viewPager.getCurrentItem() == 2) { - onPageSelected(2); + // if on Map tab, show all menu options, else only show search + binding.viewPager.addOnPageChangeListener(new OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, + int positionOffsetPixels) { } - } - }); + + @Override + public void onPageSelected(int position) { + others.setVisible((position == 2)); + } + + @Override + public void onPageScrollStateChanged(int state) { + if (state == SCROLL_STATE_IDLE && binding.viewPager.getCurrentItem() == 2) { + onPageSelected(2); + } + } + }); + } else { + inflater.inflate(R.menu.menu_search, menu); + } super.onCreateOptionsMenu(menu, inflater); } diff --git a/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapFragment.java b/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapFragment.java index 49a461aad..639f11add 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapFragment.java @@ -216,7 +216,11 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment binding.mapView.getZoomController() .setVisibility(CustomZoomButtonsController.Visibility.NEVER); binding.mapView.setMultiTouchControls(true); - binding.mapView.getController().setZoom(ZOOM_LEVEL); + + if (!isCameFromNearbyMap()) { + binding.mapView.getController().setZoom(ZOOM_LEVEL); + } + performMapReadyActions(); binding.mapView.getOverlays().add(new MapEventsOverlay(new MapEventsReceiver() { @@ -344,7 +348,7 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment moveCameraToPosition( new GeoPoint(prevLatitude, prevLongitude), prevZoom, - 2L + 1L ); } else { moveCameraToPosition( @@ -919,7 +923,9 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment -0.07483536015053005, 1f); } } - moveCameraToPosition(new GeoPoint(latLnge.getLatitude(), latLnge.getLongitude())); + if (!isCameFromNearbyMap()) { + moveCameraToPosition(new GeoPoint(latLnge.getLatitude(), latLnge.getLongitude())); + } return latLnge; } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java index 7b6f1d94b..241b17902 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java @@ -493,7 +493,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment moveCameraToPosition( new GeoPoint(prevLatitude, prevLongitude), prevZoom, - 2L + 1L ); } binding.map.getOverlays().add(mapEventsOverlay);