From 77965f9634aa2ebf610d71159f1ba9e836689120 Mon Sep 17 00:00:00 2001 From: Ammar Githam Date: Tue, 25 May 2021 07:36:47 +0900 Subject: [PATCH] Convert FavoritesViewModel to kotlin and optimise code --- app/build.gradle | 2 + .../fragments/FavoritesFragment.kt | 38 +------------ .../viewmodels/FavoritesViewModel.kt | 57 ++++++++++++++----- 3 files changed, 48 insertions(+), 49 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1cd7be8c..0841a8e0 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -182,6 +182,8 @@ dependencies { def core_version = "1.6.0-beta01" implementation "androidx.core:core:$core_version" + implementation "androidx.fragment:fragment-ktx:1.3.4" + // Room def room_version = "2.3.0" implementation "androidx.room:room-runtime:$room_version" diff --git a/app/src/main/java/awais/instagrabber/fragments/FavoritesFragment.kt b/app/src/main/java/awais/instagrabber/fragments/FavoritesFragment.kt index 3f7c5271..04e97e26 100644 --- a/app/src/main/java/awais/instagrabber/fragments/FavoritesFragment.kt +++ b/app/src/main/java/awais/instagrabber/fragments/FavoritesFragment.kt @@ -7,17 +7,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider +import androidx.fragment.app.viewModels import androidx.navigation.fragment.NavHostFragment import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import awais.instagrabber.R import awais.instagrabber.adapters.FavoritesAdapter import awais.instagrabber.databinding.FragmentFavoritesBinding -import awais.instagrabber.db.datasources.FavoriteDataSource import awais.instagrabber.db.entities.Favorite -import awais.instagrabber.db.repositories.FavoriteRepository -import awais.instagrabber.db.repositories.RepositoryCallback import awais.instagrabber.models.enums.FavoriteType import awais.instagrabber.utils.extensions.TAG import awais.instagrabber.viewmodels.FavoritesViewModel @@ -28,16 +25,9 @@ class FavoritesFragment : Fragment() { private lateinit var binding: FragmentFavoritesBinding private lateinit var root: RecyclerView - private lateinit var favoritesViewModel: FavoritesViewModel - private lateinit var favoriteRepository: FavoriteRepository private lateinit var adapter: FavoritesAdapter - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val context = context ?: return - favoriteRepository = FavoriteRepository.getInstance(FavoriteDataSource.getInstance(context)) - favoritesViewModel = ViewModelProvider(this).get(FavoritesViewModel::class.java) - } + private val favoritesViewModel: FavoritesViewModel by viewModels() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { if (this::root.isInitialized) { @@ -61,13 +51,6 @@ class FavoritesFragment : Fragment() { if (!this::adapter.isInitialized) return // refresh list every time in onViewStateRestored since it is cheaper than implementing pull down to refresh favoritesViewModel.list.observe(viewLifecycleOwner, { list: List? -> adapter.submitList(list) }) - favoriteRepository.getAllFavorites(object : RepositoryCallback> { - override fun onSuccess(favorites: List) { - favoritesViewModel.list.postValue(favorites) - } - - override fun onDataNotAvailable() {} - }) } private fun init() { @@ -109,22 +92,7 @@ class FavoritesFragment : Fragment() { val context = context ?: return@FavoritesAdapter false MaterialAlertDialogBuilder(context) .setMessage(getString(R.string.quick_access_confirm_delete, model.query)) - .setPositiveButton(R.string.yes) { d: DialogInterface, _: Int -> - favoriteRepository.deleteFavorite(model.query, model.type, object : RepositoryCallback { - override fun onSuccess(result: Void) { - d.dismiss() - favoriteRepository.getAllFavorites(object : RepositoryCallback> { - override fun onSuccess(result: List) { - favoritesViewModel.list.postValue(result) - } - - override fun onDataNotAvailable() {} - }) - } - - override fun onDataNotAvailable() {} - }) - } + .setPositiveButton(R.string.yes) { d: DialogInterface, _: Int -> favoritesViewModel.delete(model) { d.dismiss() } } .setNegativeButton(R.string.no, null) .show() true diff --git a/app/src/main/java/awais/instagrabber/viewmodels/FavoritesViewModel.kt b/app/src/main/java/awais/instagrabber/viewmodels/FavoritesViewModel.kt index bb865b88..8a2feb3a 100644 --- a/app/src/main/java/awais/instagrabber/viewmodels/FavoritesViewModel.kt +++ b/app/src/main/java/awais/instagrabber/viewmodels/FavoritesViewModel.kt @@ -1,19 +1,48 @@ -package awais.instagrabber.viewmodels; +package awais.instagrabber.viewmodels -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import awais.instagrabber.db.datasources.FavoriteDataSource +import awais.instagrabber.db.entities.Favorite +import awais.instagrabber.db.repositories.FavoriteRepository +import awais.instagrabber.db.repositories.RepositoryCallback -import java.util.List; +class FavoritesViewModel(application: Application) : AndroidViewModel(application) { + private val _list = MutableLiveData>() + val list: LiveData> = _list -import awais.instagrabber.db.entities.Favorite; + private val favoriteRepository: FavoriteRepository = FavoriteRepository.getInstance(FavoriteDataSource.getInstance(application)) -public class FavoritesViewModel extends ViewModel { - private MutableLiveData> list; - - public MutableLiveData> getList() { - if (list == null) { - list = new MutableLiveData<>(); - } - return list; + init { + fetch() } -} + + fun fetch() { + favoriteRepository.getAllFavorites(object : RepositoryCallback> { + override fun onSuccess(favorites: List?) { + _list.postValue(favorites ?: emptyList()) + } + + override fun onDataNotAvailable() {} + }) + } + + fun delete(favorite: Favorite, onSuccess: () -> Unit) { + favoriteRepository.deleteFavorite(favorite.query, favorite.type, object : RepositoryCallback { + override fun onSuccess(result: Void?) { + onSuccess() + favoriteRepository.getAllFavorites(object : RepositoryCallback> { + override fun onSuccess(result: List?) { + _list.postValue(result ?: emptyList()) + } + + override fun onDataNotAvailable() {} + }) + } + + override fun onDataNotAvailable() {} + }) + } +} \ No newline at end of file