Fixed memory leak in search fragment

This commit is contained in:
MohitMali 2022-12-08 18:35:27 +05:30 committed by Kelson
parent ad78332565
commit 101c0f1efd

View File

@ -71,18 +71,11 @@ class SearchFragment : BaseFragment() {
@Inject lateinit var viewModelFactory: ViewModelProvider.Factory @Inject lateinit var viewModelFactory: ViewModelProvider.Factory
private lateinit var searchView: SearchView private var searchView: SearchView? = null
private lateinit var searchInTextMenuItem: MenuItem private var searchInTextMenuItem: MenuItem? = null
private val searchViewModel by lazy { viewModel<SearchViewModel>(viewModelFactory) } private val searchViewModel by lazy { viewModel<SearchViewModel>(viewModelFactory) }
private val searchAdapter: SearchAdapter by lazy { private var searchAdapter: SearchAdapter? = null
SearchAdapter(
RecentSearchDelegate(::onItemClick, ::onItemClickNewTab) {
searchViewModel.actions.offer(OnItemLongClick(it))
},
ZimSearchResultDelegate(::onItemClick, ::onItemClickNewTab)
)
}
override fun inject(baseActivity: BaseActivity) { override fun inject(baseActivity: BaseActivity) {
baseActivity.cachedComponent.inject(this) baseActivity.cachedComponent.inject(this)
@ -100,6 +93,12 @@ class SearchFragment : BaseFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
searchAdapter = SearchAdapter(
RecentSearchDelegate(::onItemClick, ::onItemClickNewTab) {
searchViewModel.actions.offer(OnItemLongClick(it))
},
ZimSearchResultDelegate(::onItemClick, ::onItemClickNewTab)
)
setupToolbar(view) setupToolbar(view)
search_list.run { search_list.run {
adapter = searchAdapter adapter = searchAdapter
@ -137,6 +136,9 @@ class SearchFragment : BaseFragment() {
super.onDestroyView() super.onDestroyView()
closeKeyboard() closeKeyboard()
activity?.intent?.action = null activity?.intent?.action = null
searchView = null
searchInTextMenuItem = null
searchAdapter = null
} }
private fun goBack() { private fun goBack() {
@ -150,7 +152,7 @@ class SearchFragment : BaseFragment() {
val searchMenuItem = menu.findItem(R.id.menu_search) val searchMenuItem = menu.findItem(R.id.menu_search)
searchMenuItem.expandActionView() searchMenuItem.expandActionView()
searchView = searchMenuItem.actionView as SearchView searchView = searchMenuItem.actionView as SearchView
searchView.setOnQueryTextListener( searchView?.setOnQueryTextListener(
SimpleTextListener { SimpleTextListener {
if (it.isNotEmpty()) { if (it.isNotEmpty()) {
searchViewModel.actions.offer(Filter(it)) searchViewModel.actions.offer(Filter(it))
@ -166,7 +168,7 @@ class SearchFragment : BaseFragment() {
} }
}) })
searchInTextMenuItem = menu.findItem(R.id.menu_searchintext) searchInTextMenuItem = menu.findItem(R.id.menu_searchintext)
searchInTextMenuItem.setOnMenuItemClickListener { searchInTextMenuItem?.setOnMenuItemClickListener {
searchViewModel.actions.offer(ClickedSearchInText) searchViewModel.actions.offer(ClickedSearchInText)
true true
} }
@ -175,17 +177,17 @@ class SearchFragment : BaseFragment() {
} }
val searchStringFromArguments = arguments?.getString(NAV_ARG_SEARCH_STRING) val searchStringFromArguments = arguments?.getString(NAV_ARG_SEARCH_STRING)
if (searchStringFromArguments != null) { if (searchStringFromArguments != null) {
searchView.setQuery(searchStringFromArguments, false) searchView?.setQuery(searchStringFromArguments, false)
} }
searchViewModel.actions.offer(Action.CreatedWithArguments(arguments)) searchViewModel.actions.offer(Action.CreatedWithArguments(arguments))
} }
private fun render(state: SearchState) { private fun render(state: SearchState) {
searchInTextMenuItem.isVisible = state.searchOrigin == FromWebView searchInTextMenuItem?.isVisible = state.searchOrigin == FromWebView
searchInTextMenuItem.isEnabled = state.searchTerm.isNotBlank() searchInTextMenuItem?.isEnabled = state.searchTerm.isNotBlank()
searchLoadingIndicator?.isShowing(state.isLoading) searchLoadingIndicator?.isShowing(state.isLoading)
searchNoResults?.isVisible = state.visibleResults.isEmpty() searchNoResults?.isVisible = state.visibleResults.isEmpty()
searchAdapter.items = state.visibleResults searchAdapter?.items = state.visibleResults
} }
private fun onItemClick(it: SearchListItem) { private fun onItemClick(it: SearchListItem) {