diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6daf571..41fab28 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -44,6 +44,7 @@
+
- @GET("Fetch/Post/{postId}")
- fun getPost(@Path("postId") postId: Long): Call
@GET("Fetch/Post/{postId}/LikedBy")
- fun getLikedBy(@Path("postId") postId: Long): Call>
+ fun getLikedBy(@Path("postId") postId: Long): Call>>
@GET("Feed")
fun getChronology(@Query("lastId") lastId: Long, @Query("length") length: Int): Call
diff --git a/app/src/main/java/com/isolaatti/posting/posts/data/remote/PostApi.kt b/app/src/main/java/com/isolaatti/posting/posts/data/remote/PostApi.kt
index e3672f6..7676500 100644
--- a/app/src/main/java/com/isolaatti/posting/posts/data/remote/PostApi.kt
+++ b/app/src/main/java/com/isolaatti/posting/posts/data/remote/PostApi.kt
@@ -1,10 +1,12 @@
package com.isolaatti.posting.posts.data.remote
+import com.isolaatti.common.ResultDto
import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Path
+import retrofit2.http.Query
interface PostApi {
@POST("Posting/Make")
@@ -19,4 +21,7 @@ interface PostApi {
@GET("Fetch/Post/{postId}")
fun getPost(@Path("postId") postId: Long): Call
+ @GET("Posting/Post/{postId}/Versions")
+ fun getVersions(@Path("postId") postId: Long): Call>>
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/posts/data/remote/VersionDto.kt b/app/src/main/java/com/isolaatti/posting/posts/data/remote/VersionDto.kt
new file mode 100644
index 0000000..99cb068
--- /dev/null
+++ b/app/src/main/java/com/isolaatti/posting/posts/data/remote/VersionDto.kt
@@ -0,0 +1,11 @@
+package com.isolaatti.posting.posts.data.remote
+
+import java.time.ZonedDateTime
+
+data class VersionDto(
+ val id: Long,
+ val postId: Long,
+ val textContent: String,
+ val dateTime: ZonedDateTime,
+ val audioId: String
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/posts/data/repository/PostsRepositoryImpl.kt b/app/src/main/java/com/isolaatti/posting/posts/data/repository/PostsRepositoryImpl.kt
index 5867bb9..4e8bd30 100644
--- a/app/src/main/java/com/isolaatti/posting/posts/data/repository/PostsRepositoryImpl.kt
+++ b/app/src/main/java/com/isolaatti/posting/posts/data/repository/PostsRepositoryImpl.kt
@@ -10,8 +10,10 @@ import com.isolaatti.posting.posts.data.remote.FeedFilterDto
import com.isolaatti.posting.posts.data.remote.FeedsApi
import com.isolaatti.posting.posts.data.remote.PostApi
import com.isolaatti.posting.posts.data.remote.PostDeletedDto
+import com.isolaatti.posting.posts.data.remote.VersionDto
import com.isolaatti.posting.posts.domain.PostsRepository
import com.isolaatti.posting.posts.domain.entity.Post
+import com.isolaatti.profile.domain.entity.ProfileListItem
import com.isolaatti.utils.Resource
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
@@ -120,4 +122,40 @@ class PostsRepositoryImpl @Inject constructor(private val feedsApi: FeedsApi, pr
emit(Resource.Error(Resource.Error.ErrorType.NetworkError))
}
}
+
+ override fun getUsersLikedPost(postId: Long): Flow>> = flow {
+ emit(Resource.Loading())
+ try {
+ val response = feedsApi.getLikedBy(postId).awaitResponse()
+ if(response.isSuccessful) {
+ val dto = response.body()
+ if(dto != null) {
+ emit(Resource.Success(dto.result.map { ProfileListItem.fromDto(it) }))
+ return@flow
+ }
+ }
+ emit(Resource.Error(Resource.Error.mapErrorCode(response.code())))
+ } catch(_: Exception) {
+ emit(Resource.Error(Resource.Error.ErrorType.OtherError))
+ }
+ }
+
+ override fun getPostVersions(postId: Long): Flow>> = flow {
+ emit(Resource.Loading())
+ try {
+ val response = postApi.getVersions(postId).awaitResponse()
+ if(response.isSuccessful) {
+ val dto = response.body()
+ if(dto != null) {
+ emit(Resource.Success(dto.result))
+ }
+ return@flow
+ }
+
+ emit(Resource.Error(Resource.Error.mapErrorCode(response.code())))
+ } catch(e: Exception) {
+ Log.e(LOG_TAG, "Error getting post versions. postId: $postId. \n ${e.message}")
+ emit(Resource.Error(Resource.Error.ErrorType.OtherError))
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/posts/domain/PostsRepository.kt b/app/src/main/java/com/isolaatti/posting/posts/domain/PostsRepository.kt
index a5900ab..988a30c 100644
--- a/app/src/main/java/com/isolaatti/posting/posts/domain/PostsRepository.kt
+++ b/app/src/main/java/com/isolaatti/posting/posts/domain/PostsRepository.kt
@@ -5,7 +5,9 @@ import com.isolaatti.posting.posts.data.remote.EditPostDto
import com.isolaatti.posting.posts.data.remote.FeedDto
import com.isolaatti.posting.posts.data.remote.FeedFilterDto
import com.isolaatti.posting.posts.data.remote.PostDeletedDto
+import com.isolaatti.posting.posts.data.remote.VersionDto
import com.isolaatti.posting.posts.domain.entity.Post
+import com.isolaatti.profile.domain.entity.ProfileListItem
import com.isolaatti.utils.Resource
import kotlinx.coroutines.flow.Flow
@@ -19,4 +21,7 @@ interface PostsRepository {
fun editPost(editPostDto: EditPostDto): Flow>
fun deletePost(postId: Long): Flow>
fun loadPost(postId: Long): Flow>
+
+ fun getUsersLikedPost(postId: Long): Flow>>
+ fun getPostVersions(postId: Long): Flow>>
}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/posts/domain/use_case/GetPostLikedBy.kt b/app/src/main/java/com/isolaatti/posting/posts/domain/use_case/GetPostLikedBy.kt
new file mode 100644
index 0000000..823b639
--- /dev/null
+++ b/app/src/main/java/com/isolaatti/posting/posts/domain/use_case/GetPostLikedBy.kt
@@ -0,0 +1,8 @@
+package com.isolaatti.posting.posts.domain.use_case
+
+import com.isolaatti.posting.posts.domain.PostsRepository
+import javax.inject.Inject
+
+class GetPostLikedBy @Inject constructor(private val postsRepository: PostsRepository) {
+ operator fun invoke(postId: Long) = postsRepository.getUsersLikedPost(postId)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/posts/presentation/PostInfoViewPagerAdapter.kt b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostInfoViewPagerAdapter.kt
new file mode 100644
index 0000000..fbd285b
--- /dev/null
+++ b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostInfoViewPagerAdapter.kt
@@ -0,0 +1,17 @@
+package com.isolaatti.posting.posts.presentation
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentActivity
+import androidx.viewpager2.adapter.FragmentStateAdapter
+import com.isolaatti.posting.posts.ui.PostLikesFragment
+import com.isolaatti.posting.posts.ui.PostVersionsFragment
+
+class PostInfoViewPagerAdapter(fragmentActivity: FragmentActivity, private val postId: Long) : FragmentStateAdapter(fragmentActivity) {
+ override fun getItemCount(): Int = 2
+
+ override fun createFragment(position: Int): Fragment = if(position == 0) {
+ PostLikesFragment.getInstance(postId)
+ } else{
+ PostVersionsFragment.getInstance(postId)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/posts/presentation/PostLikesViewModel.kt b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostLikesViewModel.kt
new file mode 100644
index 0000000..036eff0
--- /dev/null
+++ b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostLikesViewModel.kt
@@ -0,0 +1,36 @@
+package com.isolaatti.posting.posts.presentation
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.isolaatti.posting.posts.domain.use_case.GetPostLikedBy
+import com.isolaatti.profile.domain.entity.ProfileListItem
+import com.isolaatti.utils.Resource
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.flowOn
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.launch
+import javax.inject.Inject
+
+@HiltViewModel
+class PostLikesViewModel @Inject constructor(private val getPostLikedBy: GetPostLikedBy) : ViewModel() {
+ var postId: Long = 0
+ val users: MutableLiveData> = MutableLiveData()
+ val loading: MutableLiveData = MutableLiveData()
+ fun getUsers() {
+ viewModelScope.launch {
+ getPostLikedBy(postId).onEach { resource ->
+ when(resource) {
+ is Resource.Error -> {}
+ is Resource.Loading -> loading.postValue(true)
+ is Resource.Success -> {
+ loading.postValue(false)
+ users.postValue(resource.data!!)
+ }
+ }
+ }.flowOn(Dispatchers.IO).launchIn(this)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/posts/presentation/PostVersionsAdapter.kt b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostVersionsAdapter.kt
new file mode 100644
index 0000000..c622e0b
--- /dev/null
+++ b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostVersionsAdapter.kt
@@ -0,0 +1,39 @@
+package com.isolaatti.posting.posts.presentation
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.ListAdapter
+import androidx.recyclerview.widget.RecyclerView.ViewHolder
+import com.isolaatti.R
+import com.isolaatti.databinding.ItemPostVersionBinding
+import com.isolaatti.posting.posts.data.remote.VersionDto
+import io.noties.markwon.Markwon
+
+class PostVersionsAdapter(private val markwon: Markwon) : ListAdapter(itemCallback) {
+
+ inner class PostVersionViewHolder(val binding: ItemPostVersionBinding) : ViewHolder(binding.root)
+ companion object {
+ val itemCallback = object: DiffUtil.ItemCallback() {
+ override fun areItemsTheSame(oldItem: VersionDto, newItem: VersionDto): Boolean {
+ return oldItem.id == newItem.id
+ }
+
+ override fun areContentsTheSame(oldItem: VersionDto, newItem: VersionDto): Boolean {
+ return oldItem == newItem
+ }
+
+
+ }
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostVersionViewHolder {
+ return PostVersionViewHolder(ItemPostVersionBinding.inflate(LayoutInflater.from(parent.context), parent, false))
+ }
+
+ override fun onBindViewHolder(holder: PostVersionViewHolder, position: Int) {
+ val item = getItem(position)
+ markwon.setMarkdown(holder.binding.postVersionContent, item.textContent)
+ holder.binding.postVersionDate.text = holder.itemView.context?.getString(R.string.edited_at, item.dateTime.toString())
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/posts/presentation/PostVersionsViewModel.kt b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostVersionsViewModel.kt
new file mode 100644
index 0000000..a3f1c00
--- /dev/null
+++ b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostVersionsViewModel.kt
@@ -0,0 +1,36 @@
+package com.isolaatti.posting.posts.presentation
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.isolaatti.posting.posts.data.remote.VersionDto
+import com.isolaatti.posting.posts.domain.PostsRepository
+import com.isolaatti.utils.Resource
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.flowOn
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.launch
+import javax.inject.Inject
+
+@HiltViewModel
+class PostVersionsViewModel @Inject constructor(private val postsRepository: PostsRepository) : ViewModel() {
+ val versions: MutableLiveData> = MutableLiveData()
+ val loading: MutableLiveData = MutableLiveData()
+ var postId = 0L
+ fun getPostVersions() {
+ viewModelScope.launch {
+ postsRepository.getPostVersions(postId).onEach { resource ->
+ when(resource) {
+ is Resource.Error -> {}
+ is Resource.Loading -> loading.postValue(true)
+ is Resource.Success -> {
+ loading.postValue(false)
+ versions.postValue(resource.data!!)
+ }
+ }
+ }.flowOn(Dispatchers.IO).launchIn(this)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/posts/presentation/PostsRecyclerViewAdapter.kt b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostsRecyclerViewAdapter.kt
index 1f82a6e..35451e5 100644
--- a/app/src/main/java/com/isolaatti/posting/posts/presentation/PostsRecyclerViewAdapter.kt
+++ b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostsRecyclerViewAdapter.kt
@@ -150,6 +150,12 @@ class PostsRecyclerViewAdapter (
itemBinding.audio.root.visibility = View.GONE
itemBinding.audio.playButton.setOnClickListener(null)
}
+ itemBinding.shareButton.setOnClickListener {
+ callback.onShare(post.id)
+ }
+ itemBinding.infoButton.setOnClickListener {
+ callback.onMoreInfo(post.id)
+ }
}
}
}
diff --git a/app/src/main/java/com/isolaatti/posting/posts/ui/PostInfoActivity.kt b/app/src/main/java/com/isolaatti/posting/posts/ui/PostInfoActivity.kt
new file mode 100644
index 0000000..59a593e
--- /dev/null
+++ b/app/src/main/java/com/isolaatti/posting/posts/ui/PostInfoActivity.kt
@@ -0,0 +1,46 @@
+package com.isolaatti.posting.posts.ui
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import com.google.android.material.tabs.TabLayoutMediator
+import com.isolaatti.R
+import com.isolaatti.common.IsolaattiBaseActivity
+import com.isolaatti.databinding.ActivityPostInfoBinding
+import com.isolaatti.posting.posts.presentation.PostInfoViewPagerAdapter
+
+class PostInfoActivity : IsolaattiBaseActivity() {
+ private lateinit var binding: ActivityPostInfoBinding
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ binding = ActivityPostInfoBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+ val postId = intent.extras?.getLong(EXTRA_POST_ID) ?: 0
+ if(postId != 0L) {
+ binding.viewPagerPostInfo.adapter = PostInfoViewPagerAdapter(this, postId)
+
+ TabLayoutMediator(binding.tabsPostInfo, binding.viewPagerPostInfo) { tab, position ->
+ if(position == 0) {
+ tab.text = getString(R.string.people_who_clapped)
+ } else {
+ tab.text = getString(R.string.post_history)
+ }
+ }.attach()
+ } else {
+ finish()
+ }
+
+ }
+
+ companion object {
+ const val EXTRA_POST_ID = "postId"
+ fun startActivity(context: Context, postId: Long) {
+ val intent = Intent(context, PostInfoActivity::class.java).apply {
+ putExtra(EXTRA_POST_ID, postId)
+ }
+ context.startActivity(intent)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/posts/ui/PostLikesFragment.kt b/app/src/main/java/com/isolaatti/posting/posts/ui/PostLikesFragment.kt
new file mode 100644
index 0000000..5590a06
--- /dev/null
+++ b/app/src/main/java/com/isolaatti/posting/posts/ui/PostLikesFragment.kt
@@ -0,0 +1,82 @@
+package com.isolaatti.posting.posts.ui
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.isolaatti.common.ListUpdateEvent
+import com.isolaatti.common.UpdateEvent
+import com.isolaatti.common.UserItemCallback
+import com.isolaatti.common.UserListRecyclerViewAdapter
+import com.isolaatti.databinding.FragmentUserListBinding
+import com.isolaatti.posting.posts.presentation.PostLikesViewModel
+import com.isolaatti.profile.domain.entity.ProfileListItem
+import com.isolaatti.profile.ui.ProfileActivity
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class PostLikesFragment : Fragment() {
+ private lateinit var binding: FragmentUserListBinding
+ private val viewModel: PostLikesViewModel by viewModels()
+ private var adapter: UserListRecyclerViewAdapter? = null
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ binding = FragmentUserListBinding.inflate(inflater, container, false)
+ return binding.root
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ viewModel.postId = arguments?.getLong(ARG_POST_ID) ?: 0
+
+ if(viewModel.postId != 0L)
+ viewModel.getUsers()
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ adapter = UserListRecyclerViewAdapter(object: UserItemCallback {
+ override fun itemClick(userId: Int) {
+ ProfileActivity.startActivity(requireContext(), userId)
+ }
+
+ override fun followButtonClick(
+ user: ProfileListItem,
+ action: UserItemCallback.FollowButtonAction
+ ) {
+
+ }
+
+ })
+ binding.recyclerUsers.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
+ binding.recyclerUsers.adapter = adapter
+
+ binding.swipeToRefresh.setOnRefreshListener {
+ viewModel.getUsers()
+ }
+
+ viewModel.users.observe(viewLifecycleOwner) {
+ adapter?.updateData(it, UpdateEvent(ListUpdateEvent.Refresh, arrayOf()))
+ }
+
+ viewModel.loading.observe(viewLifecycleOwner) {
+ binding.swipeToRefresh.isRefreshing = it
+ }
+ }
+ companion object {
+ const val ARG_POST_ID = "postId"
+ fun getInstance(postId: Long): PostLikesFragment {
+ return PostLikesFragment().apply {
+ arguments = Bundle().apply {
+ putLong(ARG_POST_ID, postId)
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/posts/ui/PostListingFragment.kt b/app/src/main/java/com/isolaatti/posting/posts/ui/PostListingFragment.kt
index 0175706..39e248e 100644
--- a/app/src/main/java/com/isolaatti/posting/posts/ui/PostListingFragment.kt
+++ b/app/src/main/java/com/isolaatti/posting/posts/ui/PostListingFragment.kt
@@ -1,5 +1,7 @@
package com.isolaatti.posting.posts.ui
+import android.content.Intent
+import android.os.Build
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
@@ -11,6 +13,7 @@ import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import com.isolaatti.BuildConfig
+import com.isolaatti.R
import com.isolaatti.audio.common.domain.Audio
import com.isolaatti.audio.common.domain.Playable
import com.isolaatti.audio.player.AudioPlayerConnector
@@ -24,7 +27,6 @@ import com.isolaatti.common.options_bottom_sheet.domain.Options
import com.isolaatti.common.options_bottom_sheet.presentation.BottomSheetPostOptionsViewModel
import com.isolaatti.common.options_bottom_sheet.ui.BottomSheetPostOptionsFragment
import com.isolaatti.databinding.FragmentPostListingBinding
-import com.isolaatti.home.presentation.FeedViewModel
import com.isolaatti.home.ui.FeedFragment
import com.isolaatti.posting.comments.ui.BottomSheetPostComments
import com.isolaatti.posting.posts.domain.entity.Post
@@ -177,6 +179,19 @@ class PostListingFragment : Fragment(), OnUserInteractedWithPostCallback {
audioPlayerConnector.playPauseAudio(audio)
}
+ override fun onMoreInfo(postId: Long) {
+ PostInfoActivity.startActivity(requireContext(), postId)
+ }
+
+ override fun onShare(postId: Long) {
+ val intent = Intent.createChooser(Intent().apply {
+ action = Intent.ACTION_SEND
+ putExtra(Intent.EXTRA_TEXT, "${BuildConfig.backend}/pub/${postId}")
+ type = "text/plain"
+ }, getString(R.string.share_post))
+ startActivity(intent)
+ }
+
override fun onProfileClick(userId: Int) {
ProfileActivity.startActivity(requireContext(), userId)
}
diff --git a/app/src/main/java/com/isolaatti/posting/posts/ui/PostVersionsFragment.kt b/app/src/main/java/com/isolaatti/posting/posts/ui/PostVersionsFragment.kt
new file mode 100644
index 0000000..2477ed1
--- /dev/null
+++ b/app/src/main/java/com/isolaatti/posting/posts/ui/PostVersionsFragment.kt
@@ -0,0 +1,77 @@
+package com.isolaatti.posting.posts.ui
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.isolaatti.databinding.FragmentPostVersionsBinding
+import com.isolaatti.posting.posts.presentation.PostVersionsAdapter
+import com.isolaatti.posting.posts.presentation.PostVersionsViewModel
+import dagger.hilt.android.AndroidEntryPoint
+import io.noties.markwon.Markwon
+import javax.inject.Inject
+
+@AndroidEntryPoint
+class PostVersionsFragment : Fragment() {
+ private lateinit var binding: FragmentPostVersionsBinding
+ private val viewModel: PostVersionsViewModel by viewModels()
+ private var adapter: PostVersionsAdapter? = null
+
+ @Inject lateinit var markwon: Markwon
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ binding = FragmentPostVersionsBinding.inflate(inflater, container, false)
+ return binding.root
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ viewModel.postId = arguments?.getLong(ARG_POST_ID) ?: 0
+
+ if(viewModel.postId != 0L) {
+ viewModel.getPostVersions()
+ }
+
+
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ adapter = PostVersionsAdapter(markwon)
+
+ binding.recyclerView.adapter = adapter
+ binding.recyclerView.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
+
+ binding.swipeToRefresh.setOnRefreshListener {
+ viewModel.getPostVersions()
+ }
+
+ viewModel.versions.observe(viewLifecycleOwner) {
+ adapter?.submitList(it)
+ }
+
+ viewModel.loading.observe(viewLifecycleOwner) {
+ binding.swipeToRefresh.isRefreshing = it
+ }
+ }
+
+ companion object {
+ const val LOG_TAG = "PostVersionsFragment"
+ const val ARG_POST_ID = "postId"
+ fun getInstance(postId: Long): PostVersionsFragment {
+ return PostVersionsFragment().apply {
+ arguments = Bundle().apply {
+ putLong(ARG_POST_ID, postId)
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/posts/viewer/ui/PostViewerActivity.kt b/app/src/main/java/com/isolaatti/posting/posts/viewer/ui/PostViewerActivity.kt
index 88d54f9..8973156 100644
--- a/app/src/main/java/com/isolaatti/posting/posts/viewer/ui/PostViewerActivity.kt
+++ b/app/src/main/java/com/isolaatti/posting/posts/viewer/ui/PostViewerActivity.kt
@@ -15,6 +15,7 @@ import com.isolaatti.R
import com.isolaatti.common.IsolaattiBaseActivity
import com.isolaatti.databinding.ActivityPostViewerBinding
import com.isolaatti.posting.comments.ui.BottomSheetPostComments
+import com.isolaatti.posting.posts.ui.PostInfoActivity
import com.isolaatti.posting.posts.viewer.presentation.PostViewerViewModel
import com.isolaatti.profile.ui.ProfileActivity
import com.isolaatti.utils.UrlGen
@@ -121,6 +122,10 @@ class PostViewerActivity : IsolaattiBaseActivity() {
finish()
}
+ binding.likesInfo.setOnClickListener {
+ PostInfoActivity.startActivity(this, postId)
+ }
+
}
override fun onNewIntent(intent: Intent?) {
diff --git a/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt b/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt
index de92ce3..3a29058 100644
--- a/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt
+++ b/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt
@@ -1,6 +1,7 @@
package com.isolaatti.profile.ui
import android.content.Context
+import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
@@ -37,7 +38,6 @@ import com.isolaatti.databinding.FragmentDiscussionsBinding
import com.isolaatti.followers.domain.FollowingState
import com.isolaatti.images.image_chooser.ui.ImageChooserContract
import com.isolaatti.images.image_list.ui.ImagesFragment
-import com.isolaatti.images.picture_viewer.ui.PictureViewerActivity
import com.isolaatti.posting.comments.ui.BottomSheetPostComments
import com.isolaatti.posting.posts.domain.entity.Post
import com.isolaatti.posting.posts.presentation.CreatePostContract
@@ -45,6 +45,7 @@ import com.isolaatti.posting.posts.presentation.EditPostContract
import com.isolaatti.posting.posts.presentation.PostListingRecyclerViewAdapterWiring
import com.isolaatti.posting.posts.presentation.PostsRecyclerViewAdapter
import com.isolaatti.posting.posts.presentation.UpdateEvent
+import com.isolaatti.posting.posts.ui.PostInfoActivity
import com.isolaatti.posting.posts.viewer.ui.PostViewerActivity
import com.isolaatti.profile.domain.entity.UserProfile
import com.isolaatti.profile.presentation.EditProfileContract
@@ -472,6 +473,19 @@ class ProfileMainFragment : Fragment() {
override fun onLoadMore() {
viewModel.getFeed(false, null)
}
+
+ override fun onMoreInfo(postId: Long) {
+ PostInfoActivity.startActivity(requireContext(), postId)
+ }
+
+ override fun onShare(postId: Long) {
+ val intent = Intent.createChooser(Intent().apply {
+ action = Intent.ACTION_SEND
+ putExtra(Intent.EXTRA_TEXT, "${BuildConfig.backend}/pub/${postId}")
+ type = "text/plain"
+ }, getString(R.string.share_post))
+ startActivity(intent)
+ }
}
}
diff --git a/app/src/main/res/layout/activity_post_info.xml b/app/src/main/res/layout/activity_post_info.xml
new file mode 100644
index 0000000..809c74d
--- /dev/null
+++ b/app/src/main/res/layout/activity_post_info.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_followings.xml b/app/src/main/res/layout/fragment_followings.xml
deleted file mode 100644
index 77d9ef6..0000000
--- a/app/src/main/res/layout/fragment_followings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_followers.xml b/app/src/main/res/layout/fragment_post_versions.xml
similarity index 71%
rename from app/src/main/res/layout/fragment_followers.xml
rename to app/src/main/res/layout/fragment_post_versions.xml
index c74058a..060c82c 100644
--- a/app/src/main/res/layout/fragment_followers.xml
+++ b/app/src/main/res/layout/fragment_post_versions.xml
@@ -1,16 +1,14 @@
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_user_list.xml b/app/src/main/res/layout/fragment_user_list.xml
new file mode 100644
index 0000000..e8fa0b1
--- /dev/null
+++ b/app/src/main/res/layout/fragment_user_list.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_post_version.xml b/app/src/main/res/layout/item_post_version.xml
new file mode 100644
index 0000000..96d2d0a
--- /dev/null
+++ b/app/src/main/res/layout/item_post_version.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/post_layout.xml b/app/src/main/res/layout/post_layout.xml
index 2e0dd02..1eb2652 100644
--- a/app/src/main/res/layout/post_layout.xml
+++ b/app/src/main/res/layout/post_layout.xml
@@ -87,6 +87,19 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:icon="@drawable/comments_solid" />
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 337b3ce..7b808f0 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -206,6 +206,10 @@
v%s
New report
Report submitted successfully
+ Share post
+ People who clapped
+ History
+ Edited at %s
- Spam
- Explicit content