diff --git a/app/build.gradle b/app/build.gradle index a4c8384c67..5b56d505eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -122,6 +122,9 @@ dependencies { /* Room */ kapt libs.room.compiler implementation libs.room + + /* View binding */ + implementation libs.viewBindingPropertyDelegate } static def getUnixTime() { diff --git a/app/src/main/java/com/github/libretube/ui/fragments/SearchFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/SearchFragment.kt index ee3fd47f0f..0197e7e7ce 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/SearchFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/SearchFragment.kt @@ -2,12 +2,13 @@ package com.github.libretube.ui.fragments import android.os.Bundle import android.util.Log -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup +import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager +import by.kirich1409.viewbindingdelegate.viewBinding +import com.github.libretube.R import com.github.libretube.api.RetrofitInstance import com.github.libretube.databinding.FragmentSearchBinding import com.github.libretube.db.DatabaseHolder.Database @@ -16,12 +17,10 @@ import com.github.libretube.extensions.awaitQuery import com.github.libretube.ui.activities.MainActivity import com.github.libretube.ui.adapters.SearchHistoryAdapter import com.github.libretube.ui.adapters.SearchSuggestionsAdapter -import com.github.libretube.ui.base.BaseFragment import com.github.libretube.ui.models.SearchViewModel -class SearchFragment : BaseFragment() { - private var _binding: FragmentSearchBinding? = null - private val binding get() = _binding!! +class SearchFragment : Fragment(R.layout.fragment_search) { + private val binding by viewBinding(FragmentSearchBinding::bind) private val viewModel: SearchViewModel by activityViewModels() @@ -32,15 +31,6 @@ class SearchFragment : BaseFragment() { query = arguments?.getString("query") } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - _binding = FragmentSearchBinding.inflate(layoutInflater, container, false) - return binding.root - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -75,15 +65,12 @@ class SearchFragment : BaseFragment() { return@launchWhenCreated } // only load the suggestions if the input field didn't get cleared yet - val suggestionsAdapter = - SearchSuggestionsAdapter( - response.reversed(), - (activity as MainActivity).searchView - ) - runOnUiThread { - if (viewModel.searchQuery.value != "") { - binding.suggestionsRecycler.adapter = suggestionsAdapter - } + val suggestionsAdapter = SearchSuggestionsAdapter( + response.reversed(), + (activity as MainActivity).searchView + ) + if (isAdded && viewModel.searchQuery.value != "") { + binding.suggestionsRecycler.adapter = suggestionsAdapter } } } diff --git a/app/src/main/java/com/github/libretube/ui/fragments/SearchResultFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/SearchResultFragment.kt index 77341c1cde..b4b9265ce7 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/SearchResultFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/SearchResultFragment.kt @@ -2,12 +2,12 @@ package com.github.libretube.ui.fragments import android.os.Bundle import android.util.Log -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import androidx.core.view.isVisible +import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager +import by.kirich1409.viewbindingdelegate.viewBinding import com.github.libretube.R import com.github.libretube.api.RetrofitInstance import com.github.libretube.constants.PreferenceKeys @@ -18,15 +18,13 @@ import com.github.libretube.extensions.TAG import com.github.libretube.extensions.hideKeyboard import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.ui.adapters.SearchAdapter -import com.github.libretube.ui.base.BaseFragment import java.io.IOException import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import retrofit2.HttpException -class SearchResultFragment : BaseFragment() { - private var _binding: FragmentSearchResultBinding? = null - private val binding get() = _binding!! +class SearchResultFragment : Fragment(R.layout.fragment_search_result) { + private val binding by viewBinding(FragmentSearchResultBinding::bind) private var nextPage: String? = null private var query: String = "" @@ -39,15 +37,6 @@ class SearchResultFragment : BaseFragment() { query = arguments?.getString("query").toString() } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - _binding = FragmentSearchResultBinding.inflate(layoutInflater, container, false) - return binding.root - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -77,7 +66,7 @@ class SearchResultFragment : BaseFragment() { fetchSearch() binding.searchRecycler.viewTreeObserver.addOnScrollChangedListener { - if (_binding?.searchRecycler?.canScrollVertically(1) == false && + if (isAdded && !binding.searchRecycler.canScrollVertically(1) && nextPage != null ) { fetchNextSearchItems() @@ -85,11 +74,6 @@ class SearchResultFragment : BaseFragment() { } } - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } - private fun fetchSearch() { lifecycleScope.launchWhenCreated { view?.let { context?.hideKeyboard(it) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8e81df7f1a..d38440ec57 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -20,6 +20,7 @@ room = "2.5.0" kotlinxSerialization = "1.4.1" kotlinxDatetime = "0.4.0" kotlinxRetrofit = "0.8.0" +viewBindingDelegate = "1.5.8" [libraries] androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } @@ -50,4 +51,5 @@ room = { group = "androidx.room", name="room-ktx", version.ref = "room" } room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" } kotlinx-serialization = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerialization" } kotlinx-datetime = { group = "org.jetbrains.kotlinx", name = "kotlinx-datetime", version.ref = "kotlinxDatetime" } -kotlinx-serialization-retrofit = { group = "com.jakewharton.retrofit", name = "retrofit2-kotlinx-serialization-converter", version.ref = "kotlinxRetrofit" } \ No newline at end of file +kotlinx-serialization-retrofit = { group = "com.jakewharton.retrofit", name = "retrofit2-kotlinx-serialization-converter", version.ref = "kotlinxRetrofit" } +viewBindingPropertyDelegate = { group = "com.github.kirich1409", name = "viewbindingpropertydelegate-noreflection", version.ref = "viewBindingDelegate" } \ No newline at end of file