194 lines
7.1 KiB
Kotlin
Raw Normal View History

2023-02-11 23:41:23 -06:00
package com.isolaatti.profile.ui
2023-08-06 22:11:28 -06:00
import android.content.Context
2023-02-11 23:41:23 -06:00
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
2023-08-06 22:11:28 -06:00
import androidx.fragment.app.activityViewModels
2023-07-31 00:25:25 -06:00
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import com.isolaatti.BuildConfig
import com.isolaatti.R
2023-02-11 23:41:23 -06:00
import com.isolaatti.databinding.FragmentDiscussionsBinding
2023-08-06 22:11:28 -06:00
import com.isolaatti.home.FeedFragment
import com.isolaatti.posting.PostViewerActivity
import com.isolaatti.posting.comments.presentation.BottomSheetPostComments
2023-07-31 00:25:25 -06:00
import com.isolaatti.posting.common.domain.OnUserInteractedWithPostCallback
2023-08-06 22:11:28 -06:00
import com.isolaatti.posting.common.options_bottom_sheet.domain.Options
import com.isolaatti.posting.common.options_bottom_sheet.presentation.BottomSheetPostOptionsViewModel
import com.isolaatti.posting.common.options_bottom_sheet.ui.BottomSheetPostOptionsFragment
2023-07-31 00:25:25 -06:00
import com.isolaatti.posting.posts.data.remote.FeedDto
2023-08-06 22:11:28 -06:00
import com.isolaatti.posting.posts.presentation.PostListingRecyclerViewAdapterWiring
2023-07-31 00:25:25 -06:00
import com.isolaatti.posting.posts.presentation.PostsRecyclerViewAdapter
2023-08-06 22:11:28 -06:00
import com.isolaatti.posting.posts.presentation.UpdateEvent
2023-07-31 00:25:25 -06:00
import com.isolaatti.profile.data.remote.UserProfileDto
import com.isolaatti.profile.presentation.ProfileViewModel
import com.isolaatti.utils.PicassoImagesPluginDef
import com.isolaatti.utils.UrlGen
import com.squareup.picasso.Picasso
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-11 23:41:23 -06:00
2023-07-31 00:25:25 -06:00
@AndroidEntryPoint
2023-08-06 22:11:28 -06:00
class DiscussionsFragment : Fragment() {
2023-02-11 23:41:23 -06:00
lateinit var viewBinding: FragmentDiscussionsBinding
2023-07-31 00:25:25 -06:00
private val viewModel: ProfileViewModel by viewModels()
2023-08-06 22:11:28 -06:00
val optionsViewModel: BottomSheetPostOptionsViewModel by activityViewModels()
2023-07-31 00:25:25 -06:00
private var userId: Int? = null
2023-08-06 22:11:28 -06:00
lateinit var postsAdapter: PostsRecyclerViewAdapter
// collapsing bar
2023-07-31 00:25:25 -06:00
private var title = ""
2023-08-06 22:11:28 -06:00
private var scrollRange = -1
private var isShow = false
2023-07-31 00:25:25 -06:00
private val profileObserver = Observer<UserProfileDto> { profile ->
Picasso.get()
.load(UrlGen.userProfileImage(profile.id))
.into(viewBinding.profileImageView)
title = profile.name
viewBinding.textViewUsername.text = profile.name
viewBinding.textViewDescription.text = profile.descriptionText
}
2023-08-06 22:11:28 -06:00
private val postsObserver: Observer<Pair<FeedDto?, UpdateEvent>> = Observer {
if(it.first != null) {
postsAdapter.updateList(it.first!!, it.second)
}
2023-07-31 00:25:25 -06:00
}
2023-08-06 22:11:28 -06:00
private lateinit var postListingRecyclerViewAdapterWiring: PostListingRecyclerViewAdapterWiring
2023-02-11 23:41:23 -06:00
2023-07-31 00:25:25 -06:00
2023-08-06 22:11:28 -06:00
private fun setupCollapsingBar() {
2023-07-31 00:25:25 -06:00
viewBinding.topAppBarLayout.addOnOffsetChangedListener { appBarLayout, verticalOffset ->
if (scrollRange == -1) scrollRange = appBarLayout.totalScrollRange
if (scrollRange + verticalOffset == 0) {
viewBinding.collapsingToolbarLayout.title = title
isShow = true
} else if (isShow) {
viewBinding.collapsingToolbarLayout.title = " "
}
}
2023-08-06 22:11:28 -06:00
}
private fun bind() {
2023-07-31 00:25:25 -06:00
viewBinding.topAppBar.setNavigationOnClickListener {
findNavController().popBackStack()
}
2023-08-06 22:11:28 -06:00
viewBinding.bottomAppBar.setOnMenuItemClickListener {
when(it.itemId) {
R.id.audios_menu_item -> {
findNavController().navigate(DiscussionsFragmentDirections.actionDiscussionsFragmentToAudiosFragment())
true
}
R.id.images_menu_item -> {
findNavController().navigate(DiscussionsFragmentDirections.actionDiscussionsFragmentToImagesFragment())
true
}
else -> { false }
}
}
viewBinding.feedRecyclerView.adapter = postsAdapter
viewBinding.feedRecyclerView.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
}
private fun setObservers() {
2023-07-31 00:25:25 -06:00
viewModel.profile.observe(viewLifecycleOwner, profileObserver)
viewModel.posts.observe(viewLifecycleOwner, postsObserver)
2023-08-06 22:11:28 -06:00
}
private fun getData() {
2023-07-31 00:25:25 -06:00
2023-08-06 22:11:28 -06:00
userId?.let { profileId ->
viewModel.profileId = profileId
viewModel.getProfile()
viewModel.getFeed(true)
2023-07-31 00:25:25 -06:00
}
2023-08-06 22:11:28 -06:00
}
2023-07-31 00:25:25 -06:00
2023-08-06 22:11:28 -06:00
private fun setupPostsAdapter() {
2023-07-31 00:25:25 -06:00
val markwon = Markwon.builder(requireContext())
.usePlugin(object: AbstractMarkwonPlugin() {
override fun configureConfiguration(builder: MarkwonConfiguration.Builder) {
builder
.imageDestinationProcessor(
ImageDestinationProcessorRelativeToAbsolute
2023-08-06 22:11:28 -06:00
.create(BuildConfig.backend))
2023-07-31 00:25:25 -06:00
}
})
.usePlugin(PicassoImagesPluginDef.picassoImagePlugin)
.usePlugin(LinkifyPlugin.create())
.build()
2023-08-06 22:11:28 -06:00
postsAdapter = PostsRecyclerViewAdapter(markwon,postListingRecyclerViewAdapterWiring, null )
2023-07-31 00:25:25 -06:00
2023-08-06 22:11:28 -06:00
}
2023-07-31 00:25:25 -06:00
2023-08-06 22:11:28 -06:00
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
2023-07-31 00:25:25 -06:00
2023-08-06 22:11:28 -06:00
userId = (requireActivity()).intent.extras?.getInt(ProfileActivity.EXTRA_USER_ID)
2023-07-31 00:25:25 -06:00
}
2023-08-06 22:11:28 -06:00
override fun onAttach(context: Context) {
super.onAttach(context)
postListingRecyclerViewAdapterWiring = object: PostListingRecyclerViewAdapterWiring(viewModel) {
override fun onComment(postId: Long) {
val modalBottomSheet = BottomSheetPostComments.getInstance(postId)
modalBottomSheet.show(requireActivity().supportFragmentManager, BottomSheetPostComments.TAG)
}
2023-07-31 00:25:25 -06:00
2023-08-06 22:11:28 -06:00
override fun onOpenPost(postId: Long) {
PostViewerActivity.startActivity(requireContext(), postId)
}
2023-07-31 00:25:25 -06:00
2023-08-06 22:11:28 -06:00
override fun onOptions(postId: Long) {
optionsViewModel.setOptions(Options.postOptions, FeedFragment.CALLER_ID)
val modalBottomSheet = BottomSheetPostOptionsFragment()
modalBottomSheet.show(requireActivity().supportFragmentManager, BottomSheetPostOptionsFragment.TAG)
}
2023-07-31 00:25:25 -06:00
2023-08-06 22:11:28 -06:00
override fun onProfileClick(userId: Int) {
//ProfileActivity.startActivity(requireContext(), userId)
}
}
2023-07-31 00:25:25 -06:00
}
2023-08-06 22:11:28 -06:00
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
viewBinding = FragmentDiscussionsBinding.inflate(inflater)
return viewBinding.root
2023-07-31 00:25:25 -06:00
}
2023-08-06 22:11:28 -06:00
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupCollapsingBar()
setupPostsAdapter()
bind()
setObservers()
getData()
2023-07-31 00:25:25 -06:00
}
2023-02-11 23:41:23 -06:00
}