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