From 8d3fd8eeff9a5b976b843c140f2cf6b0e808e301 Mon Sep 17 00:00:00 2001 From: Conny Duck Date: Mon, 29 Jun 2020 22:25:09 +0200 Subject: [PATCH] add like/boost functionality --- .../components/timeline/TimelineFragment.kt | 17 +++--- .../timeline/TimelineListAdapter.kt | 4 +- .../components/timeline/TimelineUseCases.kt | 61 +++++++++++++++++++ .../components/timeline/TimelineViewModel.kt | 40 ++---------- .../timeline/detail/DetailActivity.kt | 10 +-- .../timeline/detail/DetailViewModel.kt | 27 ++++++-- .../pixelcat/components/util/BindingHolder.kt | 4 +- 7 files changed, 107 insertions(+), 56 deletions(-) create mode 100644 app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineUseCases.kt diff --git a/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineFragment.kt b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineFragment.kt index d2e64f9..b53917c 100644 --- a/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineFragment.kt +++ b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineFragment.kt @@ -80,19 +80,14 @@ class TimelineFragment : DaggerFragment(R.layout.fragment_timeline), TimeLineAct binding.timelineSwipeRefresh.isRefreshing = false } - // viewModel.posts.observe(viewLifecycleOwner, Observer { t -> adapter.submitList(t) }) } - companion object { - fun newInstance() = TimelineFragment() + override fun onFavorite(status: StatusEntity) { + viewModel.onFavorite(status) } - override fun onFavorite(post: StatusEntity) { - viewModel.onFavorite(post) - } - - override fun onBoost(post: StatusEntity) { - viewModel.onBoost(post) + override fun onBoost(status: StatusEntity) { + viewModel.onBoost(status) } override fun onReply(status: StatusEntity) { @@ -106,4 +101,8 @@ class TimelineFragment : DaggerFragment(R.layout.fragment_timeline), TimeLineAct override fun onDetailsOpened(status: StatusEntity) { startActivity(DetailActivity.newIntent(requireContext(), status.actionableId)) } + + companion object { + fun newInstance() = TimelineFragment() + } } diff --git a/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineListAdapter.kt b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineListAdapter.kt index 8242435..3cf33bf 100644 --- a/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineListAdapter.kt +++ b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineListAdapter.kt @@ -35,8 +35,8 @@ import java.text.DateFormat import java.text.SimpleDateFormat interface TimeLineActionListener { - fun onFavorite(post: StatusEntity) - fun onBoost(post: StatusEntity) + fun onFavorite(status: StatusEntity) + fun onBoost(status: StatusEntity) fun onReply(status: StatusEntity) fun onMediaVisibilityChanged(status: StatusEntity) fun onDetailsOpened(status: StatusEntity) diff --git a/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineUseCases.kt b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineUseCases.kt new file mode 100644 index 0000000..4c32449 --- /dev/null +++ b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineUseCases.kt @@ -0,0 +1,61 @@ +package at.connyduck.pixelcat.components.timeline + +import at.connyduck.pixelcat.db.AccountManager +import at.connyduck.pixelcat.db.AppDatabase +import at.connyduck.pixelcat.db.entitity.StatusEntity +import at.connyduck.pixelcat.db.entitity.toEntity +import at.connyduck.pixelcat.model.Status +import at.connyduck.pixelcat.network.FediverseApi +import at.connyduck.pixelcat.network.calladapter.NetworkResponse +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class TimelineUseCases @Inject constructor( + val api: FediverseApi, + val db: AppDatabase, + val accountManager: AccountManager +) { + + suspend fun onFavorite(status: StatusEntity) { + val alreadyFavourited = status.favourited + if (alreadyFavourited) { + api.unfavouriteStatus(status.actionableId) + } else { + api.favouriteStatus(status.actionableId) + }.updateStatusInDb() + } + + suspend fun onBoost(status: StatusEntity) { + val alreadyBoosted = status.reblogged + if (alreadyBoosted) { + api.unreblogStatus(status.actionableId) + } else { + api.reblogStatus(status.actionableId) + }.updateStatusInDb() + + } + + suspend fun onMediaVisibilityChanged(status: StatusEntity) { + db.statusDao().changeMediaVisibility( + !status.mediaVisible, + status.id, + accountManager.activeAccount()?.id!! + ) + + } + + private suspend fun NetworkResponse.updateStatusInDb() { + fold( + { updatedStatus -> + val accountId = accountManager.activeAccount()?.id!! + val updatedStatusEntity = updatedStatus.toEntity(accountId) + db.statusDao().insertOrReplace(updatedStatusEntity) + }, + { + // Todo + } + ) + } + +} \ No newline at end of file diff --git a/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineViewModel.kt b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineViewModel.kt index 9449a85..87b8644 100644 --- a/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineViewModel.kt +++ b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineViewModel.kt @@ -28,10 +28,7 @@ import androidx.paging.cachedIn import at.connyduck.pixelcat.db.AccountManager import at.connyduck.pixelcat.db.AppDatabase import at.connyduck.pixelcat.db.entitity.StatusEntity -import at.connyduck.pixelcat.db.entitity.toEntity -import at.connyduck.pixelcat.model.Status import at.connyduck.pixelcat.network.FediverseApi -import at.connyduck.pixelcat.network.calladapter.NetworkResponse import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.flatMapConcat @@ -39,9 +36,10 @@ import kotlinx.coroutines.launch import javax.inject.Inject class TimelineViewModel @Inject constructor( - private val accountManager: AccountManager, + accountManager: AccountManager, private val db: AppDatabase, - private val fediverseApi: FediverseApi + private val fediverseApi: FediverseApi, + private val useCases: TimelineUseCases ) : ViewModel() { @OptIn(FlowPreview::class) @@ -58,46 +56,20 @@ class TimelineViewModel @Inject constructor( fun onFavorite(status: StatusEntity) { viewModelScope.launch { - val alreadyFavourited = status.favourited - if (alreadyFavourited) { - fediverseApi.unfavouriteStatus(status.actionableId) - } else { - fediverseApi.favouriteStatus(status.actionableId) - }.updateStatusInDb() + useCases.onFavorite(status) } } fun onBoost(status: StatusEntity) { viewModelScope.launch { - val alreadyBoosted = status.reblogged - if (alreadyBoosted) { - fediverseApi.unreblogStatus(status.actionableId) - } else { - fediverseApi.reblogStatus(status.actionableId) - }.updateStatusInDb() + useCases.onBoost(status) } } fun onMediaVisibilityChanged(status: StatusEntity) { viewModelScope.launch { - db.statusDao().changeMediaVisibility( - !status.mediaVisible, - status.id, - accountManager.activeAccount()?.id!! - ) + useCases.onMediaVisibilityChanged(status) } } - private suspend fun NetworkResponse.updateStatusInDb() { - fold( - { updatedStatus -> - val accountId = accountManager.activeAccount()?.id!! - val updatedStatusEntity = updatedStatus.toEntity(accountId) - db.statusDao().insertOrReplace(updatedStatusEntity) - }, - { - // Todo - } - ) - } } diff --git a/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/detail/DetailActivity.kt b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/detail/DetailActivity.kt index 3c18087..46ca725 100644 --- a/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/detail/DetailActivity.kt +++ b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/detail/DetailActivity.kt @@ -80,12 +80,12 @@ class DetailActivity: BaseActivity(), TimeLineActionListener { } - override fun onFavorite(post: StatusEntity) { - TODO("Not yet implemented") + override fun onFavorite(status: StatusEntity) { + viewModel.onFavorite(status) } - override fun onBoost(post: StatusEntity) { - TODO("Not yet implemented") + override fun onBoost(status: StatusEntity) { + viewModel.onBoost(status) } override fun onReply(status: StatusEntity) { @@ -93,7 +93,7 @@ class DetailActivity: BaseActivity(), TimeLineActionListener { } override fun onMediaVisibilityChanged(status: StatusEntity) { - TODO("Not yet implemented") + viewModel.onMediaVisibilityChanged(status) } override fun onDetailsOpened(status: StatusEntity) { diff --git a/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/detail/DetailViewModel.kt b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/detail/DetailViewModel.kt index 9c8d9c2..89468bb 100644 --- a/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/detail/DetailViewModel.kt +++ b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/detail/DetailViewModel.kt @@ -22,6 +22,7 @@ package at.connyduck.pixelcat.components.timeline.detail import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import at.connyduck.pixelcat.components.timeline.TimelineUseCases import at.connyduck.pixelcat.components.util.Loading import at.connyduck.pixelcat.components.util.Success import at.connyduck.pixelcat.components.util.UiState @@ -35,9 +36,10 @@ import kotlinx.coroutines.launch import javax.inject.Inject class DetailViewModel @Inject constructor( - val api: FediverseApi, - val db: AppDatabase, - val accountManager: AccountManager + private val api: FediverseApi, + private val db: AppDatabase, + private val accountManager: AccountManager, + private val useCases: TimelineUseCases ) : ViewModel() { val currentStatus = MutableLiveData>() @@ -75,7 +77,6 @@ class DetailViewModel @Inject constructor( } } - private suspend fun loadStatus() { api.status(statusId).fold({ val statusEntity = it.toEntity(accountManager.activeAccount()?.id!!) @@ -96,4 +97,22 @@ class DetailViewModel @Inject constructor( }) } + fun onFavorite(status: StatusEntity) { + viewModelScope.launch { + useCases.onFavorite(status) + } + } + + fun onBoost(status: StatusEntity) { + viewModelScope.launch { + useCases.onBoost(status) + } + } + + fun onMediaVisibilityChanged(status: StatusEntity) { + viewModelScope.launch { + useCases.onMediaVisibilityChanged(status) + } + } + } diff --git a/app/src/main/kotlin/at/connyduck/pixelcat/components/util/BindingHolder.kt b/app/src/main/kotlin/at/connyduck/pixelcat/components/util/BindingHolder.kt index 1234244..2767283 100644 --- a/app/src/main/kotlin/at/connyduck/pixelcat/components/util/BindingHolder.kt +++ b/app/src/main/kotlin/at/connyduck/pixelcat/components/util/BindingHolder.kt @@ -3,6 +3,6 @@ package at.connyduck.pixelcat.components.util import androidx.recyclerview.widget.RecyclerView import androidx.viewbinding.ViewBinding -class BindingHolder( +class BindingHolder( val binding: T -): RecyclerView.ViewHolder(binding.root) \ No newline at end of file +) : RecyclerView.ViewHolder(binding.root)