diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index dfc602b..45de1f1 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -31,7 +31,7 @@
android:parentActivityName=".MainActivity"/>
-
+
diff --git a/app/src/main/java/com/isolaatti/home/FeedFragment.kt b/app/src/main/java/com/isolaatti/home/FeedFragment.kt
index 0386699..0abc1e3 100644
--- a/app/src/main/java/com/isolaatti/home/FeedFragment.kt
+++ b/app/src/main/java/com/isolaatti/home/FeedFragment.kt
@@ -25,7 +25,7 @@ import com.isolaatti.databinding.FragmentFeedBinding
import com.isolaatti.drafts.ui.DraftsActivity
import com.isolaatti.home.presentation.FeedViewModel
import com.isolaatti.picture_viewer.ui.PictureViewerActivity
-import com.isolaatti.posting.PostViewerActivity
+import com.isolaatti.posting.posts.viewer.ui.PostViewerActivity
import com.isolaatti.posting.comments.ui.BottomSheetPostComments
import com.isolaatti.posting.common.domain.OnUserInteractedWithPostCallback
import com.isolaatti.posting.common.domain.Ownable
diff --git a/app/src/main/java/com/isolaatti/posting/PostViewerActivity.kt b/app/src/main/java/com/isolaatti/posting/PostViewerActivity.kt
deleted file mode 100644
index 4e618c2..0000000
--- a/app/src/main/java/com/isolaatti/posting/PostViewerActivity.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.isolaatti.posting
-
-import android.content.Context
-import android.content.Intent
-import android.os.Bundle
-import com.isolaatti.common.IsolaattiBaseActivity
-import com.isolaatti.databinding.ActivityCreatePostBinding
-import com.isolaatti.databinding.ActivityPostViewerBinding
-
-class PostViewerActivity : IsolaattiBaseActivity() {
- companion object {
- const val POST_ID = "postId"
- fun startActivity(context: Context, postId: Long) {
- context.startActivity(Intent(context, PostViewerActivity::class.java).apply {
- putExtra(POST_ID, postId)
- })
- }
- }
-
-
- private lateinit var binding: ActivityPostViewerBinding
-
- private var postId: Long? = null
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
-
- binding = ActivityPostViewerBinding.inflate(layoutInflater)
-
- setContentView(binding.root)
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/likes/data/LikesRepositoryImpl.kt b/app/src/main/java/com/isolaatti/posting/likes/data/LikesRepositoryImpl.kt
index 0be0177..fbde892 100644
--- a/app/src/main/java/com/isolaatti/posting/likes/data/LikesRepositoryImpl.kt
+++ b/app/src/main/java/com/isolaatti/posting/likes/data/LikesRepositoryImpl.kt
@@ -5,24 +5,36 @@ import com.isolaatti.posting.likes.data.remote.LikeDto
import com.isolaatti.posting.likes.data.remote.LikesApi
import com.isolaatti.posting.likes.domain.repository.LikesRepository
import com.isolaatti.utils.LongIdentificationWrapper
+import com.isolaatti.utils.Resource
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
+import retrofit2.Response
import retrofit2.awaitResponse
class LikesRepositoryImpl(private val likesApi: LikesApi) : LikesRepository {
- override fun likePost(postId: Long): Flow = flow {
- val response = likesApi.likePost(LongIdentificationWrapper(postId)).awaitResponse()
- Log.d("likes_repo", response.toString())
- if(response.isSuccessful) {
- response.body()?.let { emit(it) }
+ override fun likePost(postId: Long): Flow> = flow {
+ try {
+ val response = likesApi.likePost(LongIdentificationWrapper(postId)).awaitResponse()
+ if(response.isSuccessful) {
+ response.body()?.let { emit(Resource.Success(it)) }
+ } else {
+ emit(Resource.Error(Resource.Error.mapErrorCode(response.code())))
+ }
+ } catch(_: Exception) {
+ emit(Resource.Error(Resource.Error.ErrorType.NetworkError))
}
}
- override fun unLikePost(postId: Long): Flow = flow {
- val response = likesApi.unLikePost(LongIdentificationWrapper(postId)).awaitResponse()
- Log.d("likes_repo", response.toString())
- if(response.isSuccessful) {
- response.body()?.let { emit(it) }
+ override fun unLikePost(postId: Long): Flow> = flow {
+ try {
+ val response = likesApi.unLikePost(LongIdentificationWrapper(postId)).awaitResponse()
+ if(response.isSuccessful) {
+ response.body()?.let { emit(Resource.Success(it)) }
+ } else {
+ emit(Resource.Error(Resource.Error.mapErrorCode(response.code())))
+ }
+ } catch(_: Exception) {
+ emit(Resource.Error(Resource.Error.ErrorType.NetworkError))
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/likes/domain/repository/LikesRepository.kt b/app/src/main/java/com/isolaatti/posting/likes/domain/repository/LikesRepository.kt
index 2c684ad..e1af3e2 100644
--- a/app/src/main/java/com/isolaatti/posting/likes/domain/repository/LikesRepository.kt
+++ b/app/src/main/java/com/isolaatti/posting/likes/domain/repository/LikesRepository.kt
@@ -1,9 +1,10 @@
package com.isolaatti.posting.likes.domain.repository
import com.isolaatti.posting.likes.data.remote.LikeDto
+import com.isolaatti.utils.Resource
import kotlinx.coroutines.flow.Flow
interface LikesRepository {
- fun likePost(postId: Long): Flow
- fun unLikePost(postId: Long): Flow
+ fun likePost(postId: Long): Flow>
+ fun unLikePost(postId: Long): Flow>
}
\ 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 a20d417..236f014 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
@@ -94,13 +94,16 @@ class PostsRepositoryImpl @Inject constructor(private val feedsApi: FeedsApi, pr
}
}
- override fun loadPost(postId: Long): Flow> = flow {
+ override fun loadPost(postId: Long): Flow> = flow {
emit(Resource.Loading())
try {
val result = postApi.getPost(postId).execute()
if(result.isSuccessful) {
- emit(Resource.Success(result.body()))
- return@flow
+ val dto = result.body()
+ if(dto != null) {
+ emit(Resource.Success(Post.fromPostDto(dto)))
+ return@flow
+ }
}
emit(Resource.Error(Resource.Error.mapErrorCode(result.code())))
} catch(_: Exception) {
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 966d037..8ac02c7 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
@@ -18,5 +18,5 @@ interface PostsRepository {
fun makePost(createPostDto: CreatePostDto): Flow>
fun editPost(editPostDto: EditPostDto): Flow>
fun deletePost(postId: Long): Flow>
- fun loadPost(postId: Long): Flow>
+ fun loadPost(postId: Long): Flow>
}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/posts/domain/entity/Post.kt b/app/src/main/java/com/isolaatti/posting/posts/domain/entity/Post.kt
index fda9636..5996c1b 100644
--- a/app/src/main/java/com/isolaatti/posting/posts/domain/entity/Post.kt
+++ b/app/src/main/java/com/isolaatti/posting/posts/domain/entity/Post.kt
@@ -36,5 +36,22 @@ data class Post(
)
}.toMutableList()
}
+
+ fun fromPostDto(postDto: FeedDto.PostDto): Post {
+ return Post(
+ id = postDto.post.id,
+ userId = postDto.post.userId,
+ textContent = postDto.post.textContent,
+ privacy = postDto.post.privacy,
+ date = postDto.post.date,
+ audioId = postDto.post.audioId,
+ squadId = postDto.post.squadId,
+ numberOfComments = postDto.numberOfComments,
+ numberOfLikes = postDto.numberOfLikes,
+ userName = postDto.userName,
+ squadName = postDto.squadName,
+ liked = postDto.liked
+ )
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/posts/domain/use_case/LoadSinglePost.kt b/app/src/main/java/com/isolaatti/posting/posts/domain/use_case/LoadSinglePost.kt
index 09d130e..aad6c74 100644
--- a/app/src/main/java/com/isolaatti/posting/posts/domain/use_case/LoadSinglePost.kt
+++ b/app/src/main/java/com/isolaatti/posting/posts/domain/use_case/LoadSinglePost.kt
@@ -1,13 +1,13 @@
package com.isolaatti.posting.posts.domain.use_case
-import com.isolaatti.posting.posts.data.remote.FeedDto
import com.isolaatti.posting.posts.domain.PostsRepository
+import com.isolaatti.posting.posts.domain.entity.Post
import com.isolaatti.utils.Resource
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject
class LoadSinglePost @Inject constructor(private val postsRepository: PostsRepository) {
- operator fun invoke(postId: Long): Flow> {
+ operator fun invoke(postId: Long): Flow> {
return postsRepository.loadPost(postId)
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/isolaatti/posting/posts/presentation/CreatePostViewModel.kt b/app/src/main/java/com/isolaatti/posting/posts/presentation/CreatePostViewModel.kt
index 9e49a33..653d0af 100644
--- a/app/src/main/java/com/isolaatti/posting/posts/presentation/CreatePostViewModel.kt
+++ b/app/src/main/java/com/isolaatti/posting/posts/presentation/CreatePostViewModel.kt
@@ -72,7 +72,7 @@ class CreatePostViewModel @Inject constructor(private val makePost: MakePost, pr
loadPost(postId).onEach { postRes ->
if(postRes is Resource.Success) {
postRes.data?.let {
- postToEdit.postValue(EditPostDto(PRIVACY_ISOLAATTI, content = it.post.textContent, postId = it.post.id))
+ postToEdit.postValue(EditPostDto(PRIVACY_ISOLAATTI, content = it.textContent, postId = it.id))
}
}
}.flowOn(Dispatchers.IO).launchIn(this)
diff --git a/app/src/main/java/com/isolaatti/posting/posts/presentation/PostListingViewModelBase.kt b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostListingViewModelBase.kt
index 437f0c1..9e5fa23 100644
--- a/app/src/main/java/com/isolaatti/posting/posts/presentation/PostListingViewModelBase.kt
+++ b/app/src/main/java/com/isolaatti/posting/posts/presentation/PostListingViewModelBase.kt
@@ -43,36 +43,54 @@ abstract class PostListingViewModelBase : ViewModel() {
fun likePost(postId: Long) {
viewModelScope.launch {
- likesRepository.likePost(postId).onEach {likeDto ->
- val likedPost = posts.value?.first?.find { post -> post.id == likeDto.postId }
- val index = posts.value?.first?.indexOf(likedPost)
- if(index != null){
- val temp = posts.value?.first?.toMutableList()
- Log.d("***", temp.toString())
- temp?.set(index, likedPost!!.apply {
- liked = true
- numberOfLikes = likeDto.likesCount
+ likesRepository.likePost(postId).onEach {like ->
- })
+ when(like) {
+ is Resource.Error -> {}
+ is Resource.Loading -> {}
+ is Resource.Success -> {
+ val likedPost = posts.value?.first?.find { post -> post.id == like.data?.postId }
+ val index = posts.value?.first?.indexOf(likedPost)
+ if(index != null){
+ val temp = posts.value?.first?.toMutableList()
+ Log.d("***", temp.toString())
+ temp?.set(index, likedPost!!.apply {
+ liked = true
+ numberOfLikes = like.data?.likesCount ?: 0
+
+ })
+ }
+ posts.postValue(posts.value?.copy(second = UpdateEvent(UpdateEvent.UpdateType.POST_LIKED, index)))
+ }
}
- posts.postValue(posts.value?.copy(second = UpdateEvent(UpdateEvent.UpdateType.POST_LIKED, index)))
+
+
}.flowOn(Dispatchers.IO).launchIn(this)
}
}
fun unLikePost(postId: Long) {
viewModelScope.launch {
- likesRepository.unLikePost(postId).onEach {likeDto ->
- val likedPost = posts.value?.first?.find { post -> post.id == likeDto.postId }
- val index = posts.value?.first?.indexOf(likedPost)
- if(index != null){
- val temp = posts.value?.first?.toMutableList()
- temp?.set(index, likedPost!!.apply {
- liked = false
- numberOfLikes = likeDto.likesCount
- })
+ likesRepository.unLikePost(postId).onEach {like ->
+
+ when(like) {
+ is Resource.Error -> TODO()
+ is Resource.Loading -> TODO()
+ is Resource.Success -> {
+ val likedPost = posts.value?.first?.find { post -> post.id == like.data?.postId }
+ val index = posts.value?.first?.indexOf(likedPost)
+ if(index != null){
+ val temp = posts.value?.first?.toMutableList()
+ temp?.set(index, likedPost!!.apply {
+ liked = false
+ numberOfLikes = like.data?.likesCount ?: 0
+ })
+ }
+ posts.postValue(posts.value?.copy(second = UpdateEvent(UpdateEvent.UpdateType.POST_LIKED, index)))
+ }
}
- posts.postValue(posts.value?.copy(second = UpdateEvent(UpdateEvent.UpdateType.POST_LIKED, index)))
+
+
}.flowOn(Dispatchers.IO).launchIn(this)
}
}
diff --git a/app/src/main/java/com/isolaatti/posting/posts/viewer/presentation/PostViewerViewModel.kt b/app/src/main/java/com/isolaatti/posting/posts/viewer/presentation/PostViewerViewModel.kt
new file mode 100644
index 0000000..4413d3b
--- /dev/null
+++ b/app/src/main/java/com/isolaatti/posting/posts/viewer/presentation/PostViewerViewModel.kt
@@ -0,0 +1,97 @@
+package com.isolaatti.posting.posts.viewer.presentation
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.isolaatti.posting.comments.domain.use_case.GetComments
+import com.isolaatti.posting.likes.domain.repository.LikesRepository
+import com.isolaatti.posting.posts.domain.entity.Post
+import com.isolaatti.posting.posts.domain.use_case.LoadSinglePost
+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 PostViewerViewModel @Inject constructor(private val loadSinglePost: LoadSinglePost, private val likesRepository: LikesRepository) : ViewModel() {
+ val error: MutableLiveData = MutableLiveData()
+ val post: MutableLiveData = MutableLiveData()
+ var postId: Long = 0
+
+ private val toRetry: MutableList = mutableListOf()
+
+ val postLiked: MutableLiveData = MutableLiveData()
+
+
+ // runs the lists of "Runnable" one by one and clears list. After this is executed,
+ // caller should report as handled
+ fun retry() {
+ toRetry.forEach {
+ it.run()
+ }
+
+ toRetry.clear()
+ }
+
+ fun getPost() {
+ viewModelScope.launch {
+ loadSinglePost(postId).onEach {
+ when(it) {
+ is Resource.Error -> {
+ error.postValue(it.errorType)
+ toRetry.add {
+ getPost()
+ }
+ }
+ is Resource.Loading -> {}
+ is Resource.Success -> {
+ if(it.data != null) {
+ post.postValue(it.data)
+ postLiked.postValue(it.data.liked)
+ }
+ }
+ }
+ }.flowOn(Dispatchers.IO).launchIn(this)
+ }
+ }
+
+ private fun updateLikesCount(likesCount: Int) {
+ val updatedPost = post.value?.copy(numberOfLikes = likesCount)
+ if(updatedPost != null) {
+ post.postValue(updatedPost)
+ }
+ }
+
+ fun likeDislikePost() {
+ viewModelScope.launch {
+ if(postLiked.value == true) {
+ likesRepository.unLikePost(postId).onEach {
+ when(it) {
+ is Resource.Error -> TODO()
+ is Resource.Loading -> TODO()
+ is Resource.Success -> {
+ updateLikesCount(it.data?.likesCount ?: 0)
+ postLiked.postValue(false)
+ }
+ }
+
+ }.flowOn(Dispatchers.IO).launchIn(this)
+ } else {
+ likesRepository.likePost(postId).onEach {
+ when(it) {
+ is Resource.Error -> TODO()
+ is Resource.Loading -> TODO()
+ is Resource.Success -> {
+ updateLikesCount(it.data?.likesCount ?: 0)
+ postLiked.postValue(true)
+ }
+ }
+ }.flowOn(Dispatchers.IO).launchIn(this)
+ }
+ }
+ }
+}
\ 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
new file mode 100644
index 0000000..24ff2ac
--- /dev/null
+++ b/app/src/main/java/com/isolaatti/posting/posts/viewer/ui/PostViewerActivity.kt
@@ -0,0 +1,133 @@
+package com.isolaatti.posting.posts.viewer.ui
+
+import android.content.Context
+import android.content.Intent
+import android.content.res.ColorStateList
+import android.os.Bundle
+import androidx.activity.viewModels
+import androidx.core.content.ContentProviderCompat.requireContext
+import androidx.core.content.res.ResourcesCompat
+import com.isolaatti.BuildConfig
+import com.isolaatti.R
+import com.isolaatti.common.ErrorMessageViewModel
+import com.isolaatti.common.IsolaattiBaseActivity
+import com.isolaatti.databinding.ActivityPostViewerBinding
+import com.isolaatti.posting.comments.ui.BottomSheetPostComments
+import com.isolaatti.posting.posts.viewer.presentation.PostViewerViewModel
+import com.isolaatti.profile.ui.ProfileActivity
+import com.isolaatti.utils.PicassoImagesPluginDef
+import com.isolaatti.utils.UrlGen
+import com.squareup.picasso.Picasso
+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
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+
+class PostViewerActivity : IsolaattiBaseActivity() {
+ companion object {
+ const val POST_ID = "postId"
+ fun startActivity(context: Context, postId: Long) {
+ context.startActivity(Intent(context, PostViewerActivity::class.java).apply {
+ putExtra(POST_ID, postId)
+ })
+ }
+ }
+
+
+ private lateinit var binding: ActivityPostViewerBinding
+ private val viewModel: PostViewerViewModel by viewModels()
+ private var postId: Long = 0
+ private lateinit var markwon: Markwon
+
+ private fun openComments() {
+ val modalBottomSheet = BottomSheetPostComments.getInstance(postId)
+ modalBottomSheet.show(supportFragmentManager, BottomSheetPostComments.TAG)
+ }
+
+ private fun setObservers() {
+ viewModel.error.observe(this) {
+ errorViewModel.error.postValue(it)
+ CoroutineScope(Dispatchers.Default).launch {
+ errorViewModel.retry.collect {
+ viewModel.retry()
+ errorViewModel.handleRetry()
+ }
+ }
+ }
+
+ viewModel.post.observe(this) {
+ markwon.setMarkdown(binding.markwonContainer, it.textContent)
+ binding.author.text = it.userName
+ Picasso.get().load(UrlGen.userProfileImage(it.userId)).into(binding.profileImageView)
+ binding.commentsInfo.text = getString(R.string.comments_info, it.numberOfComments)
+ binding.likesInfo.text = getString(R.string.likes_info, it.numberOfLikes)
+ binding.author.setOnClickListener {_ ->
+ ProfileActivity.startActivity(this@PostViewerActivity, it.userId)
+ }
+
+
+ }
+
+ viewModel.postLiked.observe(this) {
+ val color = if(it) R.color.purple_lighter else R.color.on_surface
+ val menuItem = binding.toolbar.menu.findItem(R.id.like)
+
+ menuItem.isEnabled = true
+ menuItem.icon?.setTint(ResourcesCompat.getColor(resources, color, null))
+
+
+ }
+
+ }
+
+ private fun setListeners() {
+ binding.toolbar.setOnMenuItemClickListener {
+ when(it.itemId) {
+ R.id.like -> {
+ viewModel.likeDislikePost()
+ true
+ }
+ R.id.comments -> {
+ openComments()
+ true
+ }
+ else -> false
+ }
+ }
+
+ binding.commentsInfo.setOnClickListener {
+ openComments()
+ }
+ }
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ postId = intent.getLongExtra(POST_ID, 0)
+
+ binding = ActivityPostViewerBinding.inflate(layoutInflater)
+ markwon = Markwon.builder(this)
+ .usePlugin(object: AbstractMarkwonPlugin() {
+ override fun configureConfiguration(builder: MarkwonConfiguration.Builder) {
+ builder
+ .imageDestinationProcessor(
+ ImageDestinationProcessorRelativeToAbsolute
+ .create(BuildConfig.backend))
+ }
+ })
+ .usePlugin(PicassoImagesPluginDef.picassoImagePlugin)
+ .usePlugin(LinkifyPlugin.create())
+ .build()
+
+ setContentView(binding.root)
+ if(postId!! > 0) {
+ viewModel.postId = postId
+ setObservers()
+ setListeners()
+ viewModel.getPost()
+ }
+
+ }
+}
\ No newline at end of file
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 094ff53..38f7352 100644
--- a/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt
+++ b/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt
@@ -22,7 +22,7 @@ import com.isolaatti.common.ErrorMessageViewModel
import com.isolaatti.databinding.FragmentDiscussionsBinding
import com.isolaatti.followers.domain.FollowingState
import com.isolaatti.home.FeedFragment
-import com.isolaatti.posting.PostViewerActivity
+import com.isolaatti.posting.posts.viewer.ui.PostViewerActivity
import com.isolaatti.posting.comments.ui.BottomSheetPostComments
import com.isolaatti.posting.common.domain.Ownable
import com.isolaatti.posting.common.options_bottom_sheet.domain.OptionClicked
diff --git a/app/src/main/res/drawable/comments_solid.xml b/app/src/main/res/drawable/comments_solid.xml
index fc6fe9b..9058231 100644
--- a/app/src/main/res/drawable/comments_solid.xml
+++ b/app/src/main/res/drawable/comments_solid.xml
@@ -4,6 +4,6 @@
android:viewportWidth="640"
android:viewportHeight="512">
diff --git a/app/src/main/res/drawable/hands_clapping_solid.xml b/app/src/main/res/drawable/hands_clapping_solid.xml
index 9676fad..a6ac803 100644
--- a/app/src/main/res/drawable/hands_clapping_solid.xml
+++ b/app/src/main/res/drawable/hands_clapping_solid.xml
@@ -4,6 +4,6 @@
android:viewportWidth="512"
android:viewportHeight="512">
diff --git a/app/src/main/res/layout/activity_post_viewer.xml b/app/src/main/res/layout/activity_post_viewer.xml
index 6e3e9a9..db15f04 100644
--- a/app/src/main/res/layout/activity_post_viewer.xml
+++ b/app/src/main/res/layout/activity_post_viewer.xml
@@ -1,21 +1,71 @@
-
+ app:title="@string/discussion"
+ app:menu="@menu/post_viewer_menu"/>
+
+
+
+
+
+
+
+
+
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/post_viewer_menu.xml b/app/src/main/res/menu/post_viewer_menu.xml
new file mode 100644
index 0000000..973639f
--- /dev/null
+++ b/app/src/main/res/menu/post_viewer_menu.xml
@@ -0,0 +1,20 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index be034ce..7db5f2b 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -80,4 +80,8 @@
Retry
The resource you are trying to load could not be found
An unkwnow error occurred
+ Clap
+ Comments
+ Claps: %d
+ Comments: %d
\ No newline at end of file