2023-07-15 20:58:57 -06:00
|
|
|
package com.isolaatti.home
|
2023-02-06 13:44:27 -06:00
|
|
|
|
2023-07-27 22:49:55 -06:00
|
|
|
import android.app.Activity
|
2023-02-11 23:41:23 -06:00
|
|
|
import android.content.Intent
|
2023-02-06 13:44:27 -06:00
|
|
|
import android.os.Bundle
|
|
|
|
|
import androidx.fragment.app.Fragment
|
|
|
|
|
import android.view.LayoutInflater
|
|
|
|
|
import android.view.View
|
|
|
|
|
import android.view.ViewGroup
|
2023-07-27 22:49:55 -06:00
|
|
|
import android.widget.ImageView
|
|
|
|
|
import android.widget.TextView
|
|
|
|
|
import android.widget.Toast
|
|
|
|
|
import androidx.activity.result.contract.ActivityResultContracts
|
|
|
|
|
import androidx.constraintlayout.widget.ConstraintLayout
|
2023-02-11 23:41:23 -06:00
|
|
|
import androidx.fragment.app.activityViewModels
|
2023-07-29 00:55:07 -06:00
|
|
|
import androidx.lifecycle.Observer
|
2023-02-11 23:41:23 -06:00
|
|
|
import androidx.recyclerview.widget.LinearLayoutManager
|
2023-08-15 00:02:29 -06:00
|
|
|
import androidx.recyclerview.widget.RecyclerView
|
2023-07-17 00:08:36 -06:00
|
|
|
import com.isolaatti.BuildConfig
|
2023-02-06 13:44:27 -06:00
|
|
|
import com.isolaatti.R
|
2023-07-15 20:58:57 -06:00
|
|
|
import com.isolaatti.common.ErrorMessageViewModel
|
2023-02-06 13:44:27 -06:00
|
|
|
import com.isolaatti.databinding.FragmentFeedBinding
|
2023-07-31 00:25:25 -06:00
|
|
|
import com.isolaatti.drafts.ui.DraftsActivity
|
2023-07-27 22:49:55 -06:00
|
|
|
import com.isolaatti.home.presentation.FeedViewModel
|
2023-07-28 21:36:38 -06:00
|
|
|
import com.isolaatti.posting.PostViewerActivity
|
2023-07-08 02:17:19 -06:00
|
|
|
import com.isolaatti.posting.comments.presentation.BottomSheetPostComments
|
|
|
|
|
import com.isolaatti.posting.common.domain.OnUserInteractedWithPostCallback
|
2023-07-29 00:55:07 -06:00
|
|
|
import com.isolaatti.posting.common.options_bottom_sheet.domain.OptionClicked
|
|
|
|
|
import com.isolaatti.posting.common.options_bottom_sheet.domain.Options
|
|
|
|
|
import com.isolaatti.posting.common.options_bottom_sheet.presentation.BottomSheetPostOptionsViewModel
|
2023-07-08 02:17:19 -06:00
|
|
|
import com.isolaatti.posting.common.options_bottom_sheet.ui.BottomSheetPostOptionsFragment
|
|
|
|
|
import com.isolaatti.posting.posts.presentation.PostsRecyclerViewAdapter
|
2023-07-27 22:49:55 -06:00
|
|
|
import com.isolaatti.posting.posts.ui.CreatePostActivity
|
2023-02-11 23:41:23 -06:00
|
|
|
import com.isolaatti.profile.ui.ProfileActivity
|
|
|
|
|
import com.isolaatti.settings.ui.SettingsActivity
|
|
|
|
|
import com.isolaatti.utils.PicassoImagesPluginDef
|
2023-07-27 22:49:55 -06:00
|
|
|
import com.isolaatti.utils.UrlGen
|
|
|
|
|
import com.squareup.picasso.Picasso
|
2023-02-11 23:41:23 -06:00
|
|
|
import dagger.hilt.android.AndroidEntryPoint
|
|
|
|
|
import io.noties.markwon.AbstractMarkwonPlugin
|
|
|
|
|
import io.noties.markwon.Markwon
|
|
|
|
|
import io.noties.markwon.MarkwonConfiguration
|
|
|
|
|
import io.noties.markwon.image.destination.ImageDestinationProcessorRelativeToAbsolute
|
|
|
|
|
import io.noties.markwon.linkify.LinkifyPlugin
|
2023-02-06 13:44:27 -06:00
|
|
|
|
2023-02-11 23:41:23 -06:00
|
|
|
@AndroidEntryPoint
|
2023-07-08 02:17:19 -06:00
|
|
|
class FeedFragment : Fragment(), OnUserInteractedWithPostCallback {
|
2023-02-06 13:44:27 -06:00
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
|
fun newInstance() = FeedFragment()
|
2023-07-29 00:55:07 -06:00
|
|
|
const val CALLER_ID = 20
|
2023-02-06 13:44:27 -06:00
|
|
|
}
|
|
|
|
|
|
2023-07-15 20:58:57 -06:00
|
|
|
private val errorViewModel: ErrorMessageViewModel by activityViewModels()
|
2023-08-06 22:11:28 -06:00
|
|
|
private val viewModel: FeedViewModel by activityViewModels()
|
2023-07-29 00:55:07 -06:00
|
|
|
val optionsViewModel: BottomSheetPostOptionsViewModel by activityViewModels()
|
|
|
|
|
|
2023-08-06 23:22:53 -06:00
|
|
|
private var currentUserId = 0
|
|
|
|
|
|
2023-02-06 13:44:27 -06:00
|
|
|
private lateinit var viewBinding: FragmentFeedBinding
|
2023-07-08 02:17:19 -06:00
|
|
|
private lateinit var adapter: PostsRecyclerViewAdapter
|
2023-02-06 13:44:27 -06:00
|
|
|
|
2023-07-27 22:49:55 -06:00
|
|
|
private val createDiscussion = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
|
|
|
|
|
if(it.resultCode == Activity.RESULT_OK) {
|
|
|
|
|
Toast.makeText(requireContext(), R.string.posted_successfully, Toast.LENGTH_SHORT).show()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-29 00:55:07 -06:00
|
|
|
val optionsObserver: Observer<OptionClicked> = Observer {
|
|
|
|
|
if(it.callerId == CALLER_ID) {
|
|
|
|
|
when(it.optionId) {
|
|
|
|
|
Options.Option.OPTION_DELETE -> {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
Options.Option.OPTION_EDIT -> {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
Options.Option.OPTION_REPORT -> {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-06 13:44:27 -06:00
|
|
|
override fun onCreateView(
|
|
|
|
|
inflater: LayoutInflater, container: ViewGroup?,
|
|
|
|
|
savedInstanceState: Bundle?
|
|
|
|
|
): View? {
|
|
|
|
|
viewBinding = FragmentFeedBinding.inflate(inflater)
|
|
|
|
|
|
|
|
|
|
return viewBinding.root
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-11 23:41:23 -06:00
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
|
|
|
super.onViewCreated(view, savedInstanceState)
|
|
|
|
|
viewBinding.topAppBar.setNavigationOnClickListener {
|
2023-07-08 02:17:19 -06:00
|
|
|
viewBinding.drawerLayout?.openDrawer(viewBinding.homeDrawer)
|
2023-02-11 23:41:23 -06:00
|
|
|
}
|
|
|
|
|
|
2023-07-08 02:17:19 -06:00
|
|
|
|
2023-02-11 23:41:23 -06:00
|
|
|
viewBinding.homeDrawer.setNavigationItemSelectedListener {
|
|
|
|
|
when(it.itemId) {
|
|
|
|
|
R.id.my_profile_menu_item -> {
|
2023-08-06 23:22:53 -06:00
|
|
|
ProfileActivity.startActivity(requireContext(), currentUserId)
|
2023-02-11 23:41:23 -06:00
|
|
|
true
|
|
|
|
|
}
|
2023-07-31 00:25:25 -06:00
|
|
|
R.id.drafts_menu_item -> {
|
|
|
|
|
startActivity(Intent(requireActivity(), DraftsActivity::class.java))
|
|
|
|
|
true
|
|
|
|
|
}
|
2023-02-11 23:41:23 -06:00
|
|
|
R.id.settings_menu_item -> {
|
|
|
|
|
startActivity(Intent(requireActivity(), SettingsActivity::class.java))
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
else -> {true}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-15 20:58:57 -06:00
|
|
|
|
2023-02-11 23:41:23 -06:00
|
|
|
val markwon = Markwon.builder(requireContext())
|
|
|
|
|
.usePlugin(object: AbstractMarkwonPlugin() {
|
|
|
|
|
override fun configureConfiguration(builder: MarkwonConfiguration.Builder) {
|
|
|
|
|
builder
|
|
|
|
|
.imageDestinationProcessor(ImageDestinationProcessorRelativeToAbsolute
|
2023-07-17 00:08:36 -06:00
|
|
|
.create(BuildConfig.backend))
|
2023-02-11 23:41:23 -06:00
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.usePlugin(PicassoImagesPluginDef.picassoImagePlugin)
|
|
|
|
|
.usePlugin(LinkifyPlugin.create())
|
|
|
|
|
.build()
|
2023-07-15 20:58:57 -06:00
|
|
|
adapter = PostsRecyclerViewAdapter(markwon, this, null)
|
2023-02-11 23:41:23 -06:00
|
|
|
viewBinding.feedRecyclerView.adapter = adapter
|
|
|
|
|
viewBinding.feedRecyclerView.layoutManager = LinearLayoutManager(requireContext())
|
2023-07-08 02:17:19 -06:00
|
|
|
|
2023-07-17 00:08:36 -06:00
|
|
|
|
|
|
|
|
viewBinding.swipeToRefresh.setOnRefreshListener {
|
|
|
|
|
viewModel.getFeed(refresh = true)
|
|
|
|
|
viewBinding.swipeToRefresh.isRefreshing = false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2023-07-27 22:49:55 -06:00
|
|
|
viewBinding.topAppBar.setOnMenuItemClickListener {
|
|
|
|
|
when(it.itemId) {
|
|
|
|
|
R.id.menu_item_new_discussion -> {
|
|
|
|
|
createDiscussion.launch(Intent(requireContext(),CreatePostActivity::class.java))
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
else -> {
|
|
|
|
|
false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-06 22:11:28 -06:00
|
|
|
viewModel.userProfile.observe(viewLifecycleOwner) {
|
2023-07-27 22:49:55 -06:00
|
|
|
val header = viewBinding.homeDrawer.getHeaderView(0) as? ConstraintLayout
|
|
|
|
|
|
|
|
|
|
val image: ImageView? = header?.findViewById(R.id.profileImageView)
|
|
|
|
|
val textViewName: TextView? = header?.findViewById(R.id.textViewName)
|
|
|
|
|
val textViewEmail: TextView? = header?.findViewById(R.id.textViewEmail)
|
|
|
|
|
|
|
|
|
|
Picasso.get().load(UrlGen.userProfileImage(it.id)).into(image)
|
|
|
|
|
|
|
|
|
|
textViewName?.text = it.name
|
|
|
|
|
textViewEmail?.text = it.email
|
2023-08-06 23:22:53 -06:00
|
|
|
currentUserId = it.id
|
2023-07-27 22:49:55 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2023-07-08 02:17:19 -06:00
|
|
|
viewModel.posts.observe(viewLifecycleOwner){
|
2023-08-06 23:22:53 -06:00
|
|
|
if (it?.first != null) {
|
2023-08-06 22:11:28 -06:00
|
|
|
adapter.updateList(it.first!!, it.second)
|
2023-08-15 00:02:29 -06:00
|
|
|
adapter.newContentRequestFinished()
|
2023-07-17 00:08:36 -06:00
|
|
|
}
|
2023-07-15 20:58:57 -06:00
|
|
|
}
|
2023-07-17 00:08:36 -06:00
|
|
|
|
2023-08-06 22:11:28 -06:00
|
|
|
viewModel.loadingPosts.observe(viewLifecycleOwner) {
|
2023-08-15 00:02:29 -06:00
|
|
|
viewBinding.loadingIndicator.visibility = if(it) View.VISIBLE else View.GONE
|
2023-08-06 22:11:28 -06:00
|
|
|
}
|
|
|
|
|
|
2023-07-17 00:08:36 -06:00
|
|
|
|
2023-07-15 20:58:57 -06:00
|
|
|
viewModel.errorLoading.observe(viewLifecycleOwner) {
|
|
|
|
|
errorViewModel.error.postValue(it)
|
2023-02-11 23:41:23 -06:00
|
|
|
}
|
2023-08-06 22:11:28 -06:00
|
|
|
viewModel.getProfile()
|
2023-07-29 00:55:07 -06:00
|
|
|
|
|
|
|
|
optionsViewModel.optionClicked.observe(viewLifecycleOwner, optionsObserver)
|
2023-07-08 02:17:19 -06:00
|
|
|
}
|
|
|
|
|
|
2023-07-15 20:58:57 -06:00
|
|
|
fun onNewMenuItemClicked(v: View) {
|
|
|
|
|
|
|
|
|
|
}
|
2023-07-08 02:17:19 -06:00
|
|
|
override fun onLiked(postId: Long) = viewModel.likePost(postId)
|
2023-02-11 23:41:23 -06:00
|
|
|
|
2023-07-08 02:17:19 -06:00
|
|
|
override fun onUnLiked(postId: Long) = viewModel.unLikePost(postId)
|
|
|
|
|
|
|
|
|
|
override fun onOptions(postId: Long) {
|
2023-08-12 00:59:02 -06:00
|
|
|
optionsViewModel.setOptions(Options.myPostOptions, CALLER_ID)
|
2023-07-08 02:17:19 -06:00
|
|
|
val modalBottomSheet = BottomSheetPostOptionsFragment()
|
|
|
|
|
modalBottomSheet.show(requireActivity().supportFragmentManager, BottomSheetPostOptionsFragment.TAG)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onComment(postId: Long) {
|
|
|
|
|
val modalBottomSheet = BottomSheetPostComments.getInstance(postId)
|
|
|
|
|
modalBottomSheet.show(requireActivity().supportFragmentManager, BottomSheetPostComments.TAG)
|
2023-02-06 13:44:27 -06:00
|
|
|
}
|
2023-07-08 02:17:19 -06:00
|
|
|
|
2023-07-28 21:36:38 -06:00
|
|
|
override fun onOpenPost(postId: Long) {
|
|
|
|
|
PostViewerActivity.startActivity(requireContext(), postId)
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-08 02:17:19 -06:00
|
|
|
override fun onProfileClick(userId: Int) {
|
2023-07-28 21:36:38 -06:00
|
|
|
ProfileActivity.startActivity(requireContext(), userId)
|
2023-07-08 02:17:19 -06:00
|
|
|
}
|
2023-08-15 00:02:29 -06:00
|
|
|
|
|
|
|
|
override fun onLoadMore() {
|
|
|
|
|
viewModel.getFeed(false)
|
|
|
|
|
}
|
2023-02-06 13:44:27 -06:00
|
|
|
}
|