From 5cf9fcb426c57683d9783be4f5d9d39cd6b4bc3e Mon Sep 17 00:00:00 2001 From: Erik Cavazos Date: Sun, 10 Sep 2023 16:37:21 -0600 Subject: [PATCH] WIP visor de discusiones --- app/src/main/AndroidManifest.xml | 2 +- .../java/com/isolaatti/home/FeedFragment.kt | 2 +- .../isolaatti/posting/PostViewerActivity.kt | 32 ----- .../posting/likes/data/LikesRepositoryImpl.kt | 32 +++-- .../domain/repository/LikesRepository.kt | 5 +- .../data/repository/PostsRepositoryImpl.kt | 9 +- .../posting/posts/domain/PostsRepository.kt | 2 +- .../posting/posts/domain/entity/Post.kt | 17 +++ .../posts/domain/use_case/LoadSinglePost.kt | 4 +- .../posts/presentation/CreatePostViewModel.kt | 2 +- .../presentation/PostListingViewModelBase.kt | 60 +++++--- .../presentation/PostViewerViewModel.kt | 97 +++++++++++++ .../posts/viewer/ui/PostViewerActivity.kt | 133 ++++++++++++++++++ .../profile/ui/ProfileMainFragment.kt | 2 +- app/src/main/res/drawable/comments_solid.xml | 2 +- .../res/drawable/hands_clapping_solid.xml | 2 +- .../main/res/layout/activity_post_viewer.xml | 56 +++++++- app/src/main/res/menu/post_viewer_menu.xml | 20 +++ app/src/main/res/values/strings.xml | 4 + 19 files changed, 403 insertions(+), 80 deletions(-) delete mode 100644 app/src/main/java/com/isolaatti/posting/PostViewerActivity.kt create mode 100644 app/src/main/java/com/isolaatti/posting/posts/viewer/presentation/PostViewerViewModel.kt create mode 100644 app/src/main/java/com/isolaatti/posting/posts/viewer/ui/PostViewerActivity.kt create mode 100644 app/src/main/res/menu/post_viewer_menu.xml 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