diff --git a/changelog/unreleased/4813 b/changelog/unreleased/4813 new file mode 100644 index 00000000000..ccba11b3f3a --- /dev/null +++ b/changelog/unreleased/4813 @@ -0,0 +1,5 @@ +Bugfix: Resource leaks in fragment view bindings + +View binding references have been cleared in onDestroyView() across 10 fragments to prevent memory leaks when fragment instances outlive their views. + +https://github.com/owncloud/android/issues/4813 diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/createshortcut/CreateShortcutDialogFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/createshortcut/CreateShortcutDialogFragment.kt index bec7c13cb62..6e0ba8d55c5 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/createshortcut/CreateShortcutDialogFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/createshortcut/CreateShortcutDialogFragment.kt @@ -45,6 +45,11 @@ class CreateShortcutDialogFragment : DialogFragment() { return binding.root } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.apply { diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt index 5dd4839aa65..91dd7f17e21 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/details/FileDetailsFragment.kt @@ -121,6 +121,11 @@ class FileDetailsFragment : FileFragment() { } } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) isMultiPersonal = requireArguments().getBoolean(ARG_IS_MULTIPERSONAL) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainEmptyListFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainEmptyListFragment.kt index 237c363fa4f..41ee60813bc 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainEmptyListFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainEmptyListFragment.kt @@ -42,6 +42,11 @@ class MainEmptyListFragment : Fragment() { return binding.root } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { binding.emptyDataParent.apply { listEmptyDatasetIcon.setImageResource(R.drawable.ic_folder) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/removefile/RemoveFilesDialogFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/removefile/RemoveFilesDialogFragment.kt index 8dac1d858cc..9ae8cfb29ed 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/files/removefile/RemoveFilesDialogFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/files/removefile/RemoveFilesDialogFragment.kt @@ -55,6 +55,11 @@ class RemoveFilesDialogFragment : DialogFragment() { return binding.root } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/shares/SharesFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/shares/SharesFragment.kt index c4b54bd2882..bd174621d4f 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/shares/SharesFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/shares/SharesFragment.kt @@ -40,6 +40,11 @@ class SharesFragment : Fragment() { return binding.root } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { initViews() } diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/SpacesListFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/SpacesListFragment.kt index 529a101112c..370ed0f46f6 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/SpacesListFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/SpacesListFragment.kt @@ -138,6 +138,11 @@ class SpacesListFragment : return binding.root } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { isMultiPersonal = capabilityViewModel.checkMultiPersonal() initViews() diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/createspace/CreateSpaceDialogFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/createspace/CreateSpaceDialogFragment.kt index 8b39551412e..5df02535e09 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/createspace/CreateSpaceDialogFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/createspace/CreateSpaceDialogFragment.kt @@ -45,6 +45,11 @@ class CreateSpaceDialogFragment : DialogFragment() { return binding.root } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val currentSpace = requireArguments().getParcelable(ARG_CURRENT_SPACE) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt index 86282cea29b..4f4a69c55d8 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/AddMemberFragment.kt @@ -72,6 +72,11 @@ class AddMemberFragment: Fragment(), SearchMembersAdapter.SearchMembersAdapterLi return binding.root } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) searchMembersAdapter = SearchMembersAdapter(this) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersFragment.kt index 4ea5d250ba7..b624cc6626f 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/members/SpaceMembersFragment.kt @@ -79,6 +79,11 @@ class SpaceMembersFragment : Fragment(), SpaceMembersAdapter.SpaceMembersAdapter return binding.root } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val accountId = requireArguments().getString(ARG_ACCOUNT_ID) diff --git a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/setspaceicon/SetSpaceIconDialogFragment.kt b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/setspaceicon/SetSpaceIconDialogFragment.kt index 47321970bb7..077813efcbe 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/setspaceicon/SetSpaceIconDialogFragment.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/setspaceicon/SetSpaceIconDialogFragment.kt @@ -43,6 +43,11 @@ class SetSpaceIconDialogFragment : DialogFragment() { return binding.root } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.apply {