diff --git a/app/build.gradle b/app/build.gradle index ddf68d2..723229d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -159,4 +159,7 @@ dependencies { def stetho_version = "1.6.0" implementation "com.facebook.stetho:stetho:$stetho_version" implementation "com.facebook.stetho:stetho-okhttp3:$stetho_version" + + // https://github.com/androidbroadcast/ViewBindingPropertyDelegate/releases + implementation "com.github.kirich1409:viewbindingpropertydelegate-noreflection:1.5.3" } \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationFragment.kt index 7605e59..3215279 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationFragment.kt @@ -1,9 +1,7 @@ package gq.kirmanak.mealient.ui.auth import android.os.Bundle -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import android.widget.EditText import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment @@ -11,6 +9,7 @@ import androidx.fragment.app.viewModels import androidx.lifecycle.Observer import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController +import by.kirich1409.viewbindingdelegate.viewBinding import com.google.android.material.textfield.TextInputLayout import dagger.hilt.android.AndroidEntryPoint import gq.kirmanak.mealient.R @@ -24,10 +23,8 @@ import timber.log.Timber @ExperimentalCoroutinesApi @AndroidEntryPoint -class AuthenticationFragment : Fragment() { - private var _binding: FragmentAuthenticationBinding? = null - private val binding: FragmentAuthenticationBinding - get() = checkNotNull(_binding) { "Binding requested when fragment is off screen" } +class AuthenticationFragment : Fragment(R.layout.fragment_authentication) { + private val binding by viewBinding(FragmentAuthenticationBinding::bind) private val viewModel by viewModels() private val authStatuses by lazy { viewModel.authenticationStatuses() } @@ -46,16 +43,6 @@ class AuthenticationFragment : Fragment() { authStatuses.observe(this, authStatusObserver) } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - Timber.v("onCreateView() called with: inflater = $inflater, container = $container, savedInstanceState = $savedInstanceState") - _binding = FragmentAuthenticationBinding.inflate(inflater, container, false) - return binding.root - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) Timber.v("onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState") @@ -129,10 +116,4 @@ class AuthenticationFragment : Fragment() { input.textChangesFlow().filterNotNull().first { it.isNotEmpty() } Timber.v("waitUntilNotEmpty() returned") } - - override fun onDestroyView() { - super.onDestroyView() - Timber.v("onDestroyView() called") - _binding = null - } } \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/disclaimer/DisclaimerFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/disclaimer/DisclaimerFragment.kt index d256b15..585e9f8 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/disclaimer/DisclaimerFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/disclaimer/DisclaimerFragment.kt @@ -1,23 +1,20 @@ package gq.kirmanak.mealient.ui.disclaimer import android.os.Bundle -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController +import by.kirich1409.viewbindingdelegate.viewBinding import dagger.hilt.android.AndroidEntryPoint import gq.kirmanak.mealient.R import gq.kirmanak.mealient.databinding.FragmentDisclaimerBinding import timber.log.Timber @AndroidEntryPoint -class DisclaimerFragment : Fragment() { - private var _binding: FragmentDisclaimerBinding? = null - private val binding: FragmentDisclaimerBinding - get() = checkNotNull(_binding) { "Binding requested when fragment is off screen" } +class DisclaimerFragment : Fragment(R.layout.fragment_disclaimer) { + private val binding by viewBinding(FragmentDisclaimerBinding::bind) private val viewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { @@ -40,16 +37,6 @@ class DisclaimerFragment : Fragment() { findNavController().navigate(DisclaimerFragmentDirections.actionDisclaimerFragmentToAuthenticationFragment()) } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - Timber.v("onCreateView() called with: inflater = $inflater, container = $container, savedInstanceState = $savedInstanceState") - _binding = FragmentDisclaimerBinding.inflate(inflater, container, false) - return binding.root - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) Timber.v("onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState") @@ -68,10 +55,4 @@ class DisclaimerFragment : Fragment() { (requireActivity() as? AppCompatActivity)?.supportActionBar?.title = getString(R.string.app_name) } - - override fun onDestroyView() { - super.onDestroyView() - Timber.v("onDestroyView() called") - _binding = null - } } \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesFragment.kt index 6b9b638..6f58570 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesFragment.kt @@ -1,16 +1,16 @@ package gq.kirmanak.mealient.ui.recipes import android.os.Bundle -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.Observer import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController +import by.kirich1409.viewbindingdelegate.viewBinding import dagger.hilt.android.AndroidEntryPoint +import gq.kirmanak.mealient.R import gq.kirmanak.mealient.data.recipes.db.entity.RecipeSummaryEntity import gq.kirmanak.mealient.databinding.FragmentRecipesBinding import gq.kirmanak.mealient.ui.auth.AuthenticationViewModel @@ -21,10 +21,8 @@ import timber.log.Timber @ExperimentalCoroutinesApi @AndroidEntryPoint -class RecipesFragment : Fragment() { - private var _binding: FragmentRecipesBinding? = null - private val binding: FragmentRecipesBinding - get() = checkNotNull(_binding) { "Binding requested when fragment is off screen" } +class RecipesFragment : Fragment(R.layout.fragment_recipes) { + private val binding by viewBinding(FragmentRecipesBinding::bind) private val viewModel by viewModels() private val authViewModel by viewModels() @@ -38,16 +36,6 @@ class RecipesFragment : Fragment() { } } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - Timber.v("onCreateView() called with: inflater = $inflater, container = $container, savedInstanceState = $savedInstanceState") - _binding = FragmentRecipesBinding.inflate(inflater, container, false) - return binding.root - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) Timber.v("onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState") @@ -89,10 +77,4 @@ class RecipesFragment : Fragment() { } } } - - override fun onDestroyView() { - super.onDestroyView() - Timber.v("onDestroyView() called") - _binding = null - } } \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoFragment.kt index bc9260b..36e6f88 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/info/RecipeInfoFragment.kt @@ -8,6 +8,7 @@ import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.viewModels import androidx.navigation.fragment.navArgs +import by.kirich1409.viewbindingdelegate.viewBinding import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment import dagger.hilt.android.AndroidEntryPoint @@ -17,9 +18,7 @@ import timber.log.Timber @AndroidEntryPoint class RecipeInfoFragment : BottomSheetDialogFragment() { - private var _binding: FragmentRecipeInfoBinding? = null - private val binding: FragmentRecipeInfoBinding - get() = checkNotNull(_binding) { "Binding requested when fragment is off screen" } + private val binding by viewBinding(FragmentRecipeInfoBinding::bind) private val arguments by navArgs() private val viewModel by viewModels() @@ -29,8 +28,7 @@ class RecipeInfoFragment : BottomSheetDialogFragment() { savedInstanceState: Bundle? ): View { Timber.v("onCreateView() called with: inflater = $inflater, container = $container, savedInstanceState = $savedInstanceState") - _binding = FragmentRecipeInfoBinding.inflate(inflater, container, false) - return binding.root + return FragmentRecipeInfoBinding.inflate(inflater, container, false).root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -53,10 +51,4 @@ class RecipeInfoFragment : BottomSheetDialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = BottomSheetDialog(requireContext(), R.style.NoShapeBottomSheetDialog) - - override fun onDestroyView() { - super.onDestroyView() - Timber.v("onDestroyView() called") - _binding = null - } } \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/splash/SplashFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/splash/SplashFragment.kt index eb79a25..b5439ca 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/splash/SplashFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/splash/SplashFragment.kt @@ -1,21 +1,19 @@ package gq.kirmanak.mealient.ui.splash import android.os.Bundle -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import dagger.hilt.android.AndroidEntryPoint -import gq.kirmanak.mealient.databinding.FragmentSplashBinding +import gq.kirmanak.mealient.R import gq.kirmanak.mealient.ui.setActionBarVisibility import gq.kirmanak.mealient.ui.setSystemUiVisibility import timber.log.Timber @AndroidEntryPoint -class SplashFragment : Fragment() { +class SplashFragment : Fragment(R.layout.fragment_splash) { private val viewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { @@ -27,15 +25,10 @@ class SplashFragment : Fragment() { } } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - Timber.v("onCreateView() called with: inflater = $inflater, container = $container, savedInstanceState = $savedInstanceState") - val binding = FragmentSplashBinding.inflate(inflater, container, false) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + Timber.v("onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState") changeFullscreenState(true) - return binding.root } override fun onDestroyView() {