diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7bfcf7c7..ce7649b7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -56,6 +56,10 @@ android:name=".presentation.main.feed.upload.loading.LoadingActivity" android:exported="false" android:screenOrientation="portrait" /> + +) { + @Serializable + data class GetFeedResponseDto( + @SerialName("createdAt") + val createdAt: String, + @SerialName("feedId") + val feedId: Int, + @SerialName("feedImage") + val feedImage: String, + @SerialName("feedMoney") + val feedMoney: Long, + @SerialName("feedTitle") + val feedTitle: String, + @SerialName("isLiked") + val isLiked: Boolean, + @SerialName("likes") + val likes: Long, + @SerialName("nickName") + val nickName: String, + @SerialName("userId") + val userId: Int, + @SerialName("writerLevel") + val writerLevel: Int, + @SerialName("comments") + val comments: Long, + @SerialName("timeAgo") + val timeAgo: String + ) + + @Serializable + data class GetCommentResponseList( + @SerialName("commentId") + val commentId: Long, + @SerialName("author") + val author: String, + @SerialName("content") + val content: String, + @SerialName("createdAt") + val createdAt: String, + @SerialName("authorLevel") + val authorLevel: Int, + @SerialName("authorId") + val authorId: Int + ) + + fun toDetailFeed(): DetailFeed = DetailFeed( + feedId = getFeedResponseDto.feedId, + feedImage = getFeedResponseDto.feedImage, + feedMoney = getFeedResponseDto.feedMoney, + feedTitle = getFeedResponseDto.feedTitle, + isLiked = getFeedResponseDto.isLiked, + likes = getFeedResponseDto.likes, + nickName = getFeedResponseDto.nickName, + userId = getFeedResponseDto.userId, + writerLevel = getFeedResponseDto.writerLevel, + comments = getFeedResponseDto.comments, + timeAgo = getFeedResponseDto.timeAgo, + commentList = getCommentResponseList.map { list -> + CommentList( + commentId = list.commentId, + author = list.author, + content = list.content, + authorId = list.authorId, + authorLevel = list.authorLevel + ) + } + ) +} diff --git a/app/src/main/java/com/android/go/sopt/winey/data/repository/FeedRepositoryImpl.kt b/app/src/main/java/com/android/go/sopt/winey/data/repository/FeedRepositoryImpl.kt index 59ebd625..1105170e 100644 --- a/app/src/main/java/com/android/go/sopt/winey/data/repository/FeedRepositoryImpl.kt +++ b/app/src/main/java/com/android/go/sopt/winey/data/repository/FeedRepositoryImpl.kt @@ -9,6 +9,7 @@ import com.android.go.sopt.winey.data.service.FeedService import com.android.go.sopt.winey.data.source.FeedDataSource import com.android.go.sopt.winey.data.source.paging.MyFeedPagingSource import com.android.go.sopt.winey.data.source.paging.WineyFeedPagingSource +import com.android.go.sopt.winey.domain.entity.DetailFeed import com.android.go.sopt.winey.domain.entity.Like import com.android.go.sopt.winey.domain.entity.WineyFeed import com.android.go.sopt.winey.domain.repository.FeedRepository @@ -52,6 +53,11 @@ class FeedRepositoryImpl @Inject constructor( feedDataSource.postFeedLike(feedId, requestPostLikeDto).toLike() } + override suspend fun getFeedDetail(feedId: Int): Result = + runCatching { + feedDataSource.getFeedDetail(feedId).data?.toDetailFeed() + } + companion object { const val WINEYFEED_PAGE_SIZE = 20 const val MYFEED_PAGE_SIZE = 10 diff --git a/app/src/main/java/com/android/go/sopt/winey/data/service/FeedService.kt b/app/src/main/java/com/android/go/sopt/winey/data/service/FeedService.kt index 82b4c251..93d6ff64 100644 --- a/app/src/main/java/com/android/go/sopt/winey/data/service/FeedService.kt +++ b/app/src/main/java/com/android/go/sopt/winey/data/service/FeedService.kt @@ -1,6 +1,7 @@ package com.android.go.sopt.winey.data.service import com.android.go.sopt.winey.data.model.remote.request.RequestPostLikeDto +import com.android.go.sopt.winey.data.model.remote.response.ResponseGetFeedDetailDto import com.android.go.sopt.winey.data.model.remote.response.ResponseGetWineyFeedListDto import com.android.go.sopt.winey.data.model.remote.response.ResponsePostLikeDto import com.android.go.sopt.winey.data.model.remote.response.ResponsePostWineyFeedDto @@ -45,4 +46,9 @@ interface FeedService { @Part file: MultipartBody.Part?, @PartMap requestMap: HashMap ): BaseResponse + + @GET("feed/{feedId}") + suspend fun getFeedDetail( + @Path("feedId") feedId: Int + ): BaseResponse } diff --git a/app/src/main/java/com/android/go/sopt/winey/data/source/FeedDataSource.kt b/app/src/main/java/com/android/go/sopt/winey/data/source/FeedDataSource.kt index 5d9dd3e6..a67e3778 100644 --- a/app/src/main/java/com/android/go/sopt/winey/data/source/FeedDataSource.kt +++ b/app/src/main/java/com/android/go/sopt/winey/data/source/FeedDataSource.kt @@ -1,6 +1,7 @@ package com.android.go.sopt.winey.data.source import com.android.go.sopt.winey.data.model.remote.request.RequestPostLikeDto +import com.android.go.sopt.winey.data.model.remote.response.ResponseGetFeedDetailDto import com.android.go.sopt.winey.data.model.remote.response.ResponsePostLikeDto import com.android.go.sopt.winey.data.model.remote.response.ResponsePostWineyFeedDto import com.android.go.sopt.winey.data.model.remote.response.base.BaseResponse @@ -26,4 +27,9 @@ class FeedDataSource @Inject constructor( requestMap: HashMap ): BaseResponse = feedService.postWineyFeed(file, requestMap) + + suspend fun getFeedDetail( + feedId: Int + ): BaseResponse = + feedService.getFeedDetail(feedId) } diff --git a/app/src/main/java/com/android/go/sopt/winey/domain/entity/DetailFeed.kt b/app/src/main/java/com/android/go/sopt/winey/domain/entity/DetailFeed.kt new file mode 100644 index 00000000..993d0e27 --- /dev/null +++ b/app/src/main/java/com/android/go/sopt/winey/domain/entity/DetailFeed.kt @@ -0,0 +1,24 @@ +package com.android.go.sopt.winey.domain.entity + +data class DetailFeed( + val feedId: Int, + val feedImage: String, + val feedMoney: Long, + val feedTitle: String, + var isLiked: Boolean, + var likes: Long, + val nickName: String, + val userId: Int, + val writerLevel: Int, + val comments: Long, + val timeAgo: String, + val commentList: List +) + +data class CommentList( + val commentId: Long, + val author: String, + val content: String, + val authorLevel: Int, + val authorId: Int +) diff --git a/app/src/main/java/com/android/go/sopt/winey/domain/repository/FeedRepository.kt b/app/src/main/java/com/android/go/sopt/winey/domain/repository/FeedRepository.kt index ee9600ae..890a1d18 100644 --- a/app/src/main/java/com/android/go/sopt/winey/domain/repository/FeedRepository.kt +++ b/app/src/main/java/com/android/go/sopt/winey/domain/repository/FeedRepository.kt @@ -3,6 +3,7 @@ package com.android.go.sopt.winey.domain.repository import androidx.paging.PagingData import com.android.go.sopt.winey.data.model.remote.request.RequestPostLikeDto import com.android.go.sopt.winey.data.model.remote.response.ResponsePostWineyFeedDto +import com.android.go.sopt.winey.domain.entity.DetailFeed import com.android.go.sopt.winey.domain.entity.Like import com.android.go.sopt.winey.domain.entity.WineyFeed import kotlinx.coroutines.flow.Flow @@ -22,4 +23,6 @@ interface FeedRepository { file: MultipartBody.Part?, requestMap: HashMap ): Result + + suspend fun getFeedDetail(feedId: Int): Result } diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedAdapter.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedAdapter.kt index d593604f..78e7b47e 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedAdapter.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedAdapter.kt @@ -14,7 +14,8 @@ import com.android.go.sopt.winey.util.view.setOnSingleClickListener class WineyFeedAdapter( private val likeButtonClick: (feedId: Int, isLiked: Boolean) -> Unit, - private val showPopupMenu: (View, WineyFeed) -> Unit + private val showPopupMenu: (View, WineyFeed) -> Unit, + private val toFeedDetail: (feedId: Int, writerLevel: Int) -> Unit ) : PagingDataAdapter(diffUtil) { private val currentData: ItemSnapshotList @@ -23,7 +24,8 @@ class WineyFeedAdapter( class WineyFeedViewHolder( private val binding: ItemWineyfeedPostBinding, private val onLikeButtonClick: (feedId: Int, isLiked: Boolean) -> Unit, - private val showPopupMenu: (View, WineyFeed) -> Unit + private val showPopupMenu: (View, WineyFeed) -> Unit, + private val toFeedDetail: (feedId: Int, writerLevel: Int) -> Unit ) : RecyclerView.ViewHolder(binding.root) { fun onBind(data: WineyFeed?) { @@ -37,9 +39,13 @@ class WineyFeedAdapter( onLikeButtonClick(data.feedId, !data.isLiked) } - btnWineyfeedMore.setOnClickListener { view -> + btnWineyfeedMore.setOnSingleClickListener { view -> showPopupMenu(view, data) } + + lWineyfeedPost.setOnSingleClickListener { + toFeedDetail(data.feedId, data.writerLevel) + } } } @@ -60,7 +66,7 @@ class WineyFeedAdapter( ): WineyFeedViewHolder { val binding = ItemWineyfeedPostBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return WineyFeedViewHolder(binding, likeButtonClick, showPopupMenu) + return WineyFeedViewHolder(binding, likeButtonClick, showPopupMenu, toFeedDetail) } override fun onBindViewHolder(holder: WineyFeedViewHolder, position: Int) { diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedFragment.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedFragment.kt index 727e9276..936374b1 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedFragment.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/WineyFeedFragment.kt @@ -24,6 +24,7 @@ import com.android.go.sopt.winey.domain.entity.User import com.android.go.sopt.winey.domain.entity.WineyFeed import com.android.go.sopt.winey.domain.repository.DataStoreRepository import com.android.go.sopt.winey.presentation.main.MainViewModel +import com.android.go.sopt.winey.presentation.main.feed.detail.DetailActivity import com.android.go.sopt.winey.presentation.main.feed.upload.UploadActivity import com.android.go.sopt.winey.presentation.main.mypage.MyPageFragment import com.android.go.sopt.winey.util.binding.BindingFragment @@ -75,7 +76,8 @@ class WineyFeedFragment : BindingFragment(R.layout.fra }, showPopupMenu = { view, wineyFeed -> showPopupMenu(view, wineyFeed) - } + }, + toFeedDetail = { feedId, writerLevel -> navigateToDetail(feedId, writerLevel) } ) binding.rvWineyfeedPost.adapter = ConcatAdapter( wineyFeedHeaderAdapter, @@ -252,10 +254,15 @@ class WineyFeedFragment : BindingFragment(R.layout.fra startActivity(intent) } + private fun navigateToDetail(feedId: Int, writerLevel: Int) { + val intent = Intent(requireContext(), DetailActivity::class.java) + intent.putExtra("feedId", feedId) + intent.putExtra("writerLevel", writerLevel) + startActivity(intent) + } + companion object { - private const val LV_KNIGHT = 2 private const val MSG_WINEYFEED_ERROR = "ERROR" - private const val TAG_GOAL_DIALOG = "NO_GOAL_DIALOG" private const val TAG_DELETE_DIALOG = "DELETE_DIALOG" } diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/CommentAdapter.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/CommentAdapter.kt new file mode 100644 index 00000000..978ec736 --- /dev/null +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/CommentAdapter.kt @@ -0,0 +1,40 @@ +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.android.go.sopt.winey.databinding.ItemDetailCommentBinding +import com.android.go.sopt.winey.domain.entity.CommentList +import com.android.go.sopt.winey.util.view.ItemDiffCallback + +class CommentAdapter() : ListAdapter(diffUtil) { + class CommentViewHolder( + private val binding: ItemDetailCommentBinding + ) : RecyclerView.ViewHolder(binding.root) { + fun onBind(data: CommentList) { + binding.apply { + this.data = data + executePendingBindings() + } + } + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): CommentViewHolder { + val binding = + ItemDetailCommentBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return CommentViewHolder(binding) + } + + override fun onBindViewHolder(holder: CommentViewHolder, position: Int) { + holder.onBind(getItem(position)) + } + + companion object { + private val diffUtil = ItemDiffCallback( + onItemsTheSame = { old, new -> old.commentId == new.commentId }, + onContentsTheSame = { old, new -> old == new } + ) + } +} diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/DetailActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/DetailActivity.kt new file mode 100644 index 00000000..cf960d0e --- /dev/null +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/DetailActivity.kt @@ -0,0 +1,37 @@ +package com.android.go.sopt.winey.presentation.main.feed.detail + +import android.os.Bundle +import androidx.fragment.app.commit +import com.android.go.sopt.winey.R +import com.android.go.sopt.winey.databinding.ActivityDetailBinding +import com.android.go.sopt.winey.util.binding.BindingActivity +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class DetailActivity : BindingActivity(R.layout.activity_detail) { + private lateinit var detailFragment: DetailFragment + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val feedId = intent.getIntExtra("feedId", 0) + val writerLevel = intent.getIntExtra("writerLevel", 0) + putArgsToDetail(feedId, writerLevel) + setDefaultFragment(savedInstanceState) + } + + private fun putArgsToDetail(feedId: Int, writerLevel: Int) { + detailFragment = DetailFragment() + detailFragment.arguments = Bundle().apply { + putInt("feedId", feedId) + putInt("writerLevel", writerLevel) + } + } + + private fun setDefaultFragment(savedInstanceState: Bundle?) { + if (savedInstanceState == null) { + supportFragmentManager.commit { + replace(R.id.fcv_detail, detailFragment) + } + } + } +} diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/DetailFragment.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/DetailFragment.kt new file mode 100644 index 00000000..98ce3b1b --- /dev/null +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/DetailFragment.kt @@ -0,0 +1,99 @@ +package com.android.go.sopt.winey.presentation.main.feed.detail + +import CommentAdapter +import android.content.Intent +import android.os.Bundle +import android.view.View +import androidx.core.view.isVisible +import androidx.fragment.app.viewModels +import androidx.lifecycle.flowWithLifecycle +import com.android.go.sopt.winey.R +import com.android.go.sopt.winey.databinding.FragmentDetailBinding +import com.android.go.sopt.winey.presentation.main.MainActivity +import com.android.go.sopt.winey.util.binding.BindingFragment +import com.android.go.sopt.winey.util.fragment.snackBar +import com.android.go.sopt.winey.util.fragment.viewLifeCycle +import com.android.go.sopt.winey.util.fragment.viewLifeCycleScope +import com.android.go.sopt.winey.util.view.UiState +import com.android.go.sopt.winey.util.view.setOnSingleClickListener +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import timber.log.Timber + +@AndroidEntryPoint +class DetailFragment() : + BindingFragment(R.layout.fragment_detail) { + private var writerLevel: Int = 0 + private var feedId: Int = 0 + private lateinit var commentAdapter: CommentAdapter + private val viewModel by viewModels() + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + arguments?.let { + feedId = it.getInt("feedId", 0) + writerLevel = it.getInt("writerLevel", 0) + } + viewModel.getFeedDetail(feedId) + initAdapter() + initGetFeedDetailObserver() + binding.ivDetailBack.setOnSingleClickListener { + navigateToWineyFeed() + } + } + + private fun initAdapter() { + commentAdapter = CommentAdapter() + binding.rvDetailComment.adapter = commentAdapter + binding.ivDetailProfilephoto.setImageResource(setUserProfile(writerLevel)) + } + + private fun initGetFeedDetailObserver() { + viewModel.getFeedDetailState.flowWithLifecycle(viewLifeCycle).onEach { state -> + when (state) { + is UiState.Success -> { + if (state.data?.commentList?.isEmpty() == true) { + binding.rvDetailComment.isVisible = false + binding.lCommentEmpty.isVisible = true + } else { + binding.rvDetailComment.isVisible = true + } + binding.data = state.data + commentAdapter.submitList(state.data?.commentList) + } + + is UiState.Loading -> { + binding.rvDetailComment.isVisible = false + binding.lCommentEmpty.isVisible = false + } + + is UiState.Failure -> { + snackBar(binding.root) { state.msg } + } + + else -> Timber.tag("failure").e(MSG_DETAIL_ERROR) + } + }.launchIn(viewLifeCycleScope) + } + + private fun setUserProfile(userLevel: Int): Int { + return when (userLevel) { + 1 -> R.drawable.img_wineyfeed_profile_1 + 2 -> R.drawable.img_wineyfeed_profile_2 + 3 -> R.drawable.img_wineyfeed_profile_3 + 4 -> R.drawable.img_wineyfeed_profile_4 + else -> R.drawable.img_wineyfeed_profile + } + } + + private fun navigateToWineyFeed() { + val intent = Intent(requireContext(), MainActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP + startActivity(intent) + requireActivity().finish() + } + + companion object { + private const val MSG_DETAIL_ERROR = "ERROR" + } +} diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/DetailViewModel.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/DetailViewModel.kt new file mode 100644 index 00000000..ef1318d3 --- /dev/null +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/feed/detail/DetailViewModel.kt @@ -0,0 +1,53 @@ +package com.android.go.sopt.winey.presentation.main.feed.detail + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.android.go.sopt.winey.domain.entity.DetailFeed +import com.android.go.sopt.winey.domain.repository.FeedRepository +import com.android.go.sopt.winey.util.view.UiState +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import retrofit2.HttpException +import timber.log.Timber +import javax.inject.Inject + +@HiltViewModel +class DetailViewModel @Inject constructor( + private val feedRepository: FeedRepository +) : ViewModel() { + private val _getFeedDetailState = + MutableStateFlow>(UiState.Loading) + val getFeedDetailState: StateFlow> = + _getFeedDetailState.asStateFlow() + + fun getFeedDetail(feedId: Int) { + viewModelScope.launch { + feedRepository.getFeedDetail(feedId) + .onSuccess { response -> + _getFeedDetailState.emit(UiState.Success(response)) + } + .onFailure { t -> handleFailureState(_getFeedDetailState, t) } + } + } + + private fun handleFailureState(loadingState: MutableStateFlow>, t: Throwable) { + if (t is HttpException) { + val errorMessage = when (t.code()) { + CODE_DETAIL_INVALID_USER_OR_FEED -> t.message() + CODE_DETAIL_INVALID_REQUEST -> t.message() + else -> t.message() + } + loadingState.value = UiState.Failure(errorMessage) + Timber.e("$MSG_DETAIL_FAIL : ${t.code()} : ${t.message()}") + } + } + + companion object { + private const val CODE_DETAIL_INVALID_USER_OR_FEED = 404 + private const val CODE_DETAIL_INVALID_REQUEST = 400 + private const val MSG_DETAIL_FAIL = "FAIL" + } +} diff --git a/app/src/main/java/com/android/go/sopt/winey/util/binding/BindingAdapter.kt b/app/src/main/java/com/android/go/sopt/winey/util/binding/BindingAdapter.kt index 31f85667..16eda1aa 100644 --- a/app/src/main/java/com/android/go/sopt/winey/util/binding/BindingAdapter.kt +++ b/app/src/main/java/com/android/go/sopt/winey/util/binding/BindingAdapter.kt @@ -42,10 +42,13 @@ fun TextView.setFormattedNumber(amount: Long, prefix: String?, suffix: String?) } @BindingAdapter("imageUrl") -fun loadImager(view: ImageView, imageurl: String) { - view.load(imageurl) { - placeholder(R.drawable.img_wineyfeed_default) - transformations(RoundedCornersTransformation(10F)) +fun loadImager(view: ImageView, imageurl: String?) { + if (imageurl != null) { + val uri = Uri.parse(imageurl) + view.load(uri) { + placeholder(R.drawable.img_wineyfeed_default) + transformations(RoundedCornersTransformation(10F)) + } } } @@ -151,3 +154,15 @@ fun ImageView.setNotiType(notiType: String) { } else { } } + +@BindingAdapter("setLevelText") +fun TextView.setLevelText(level: Int?) { + level?.let { + when (it) { + 1 -> text = resources.getString(R.string.comment_level_1) + 2 -> text = resources.getString(R.string.comment_level_2) + 3 -> text = resources.getString(R.string.comment_level_3) + 4 -> text = resources.getString(R.string.comment_level_4) + } + } +} diff --git a/app/src/main/res/drawable/img_comment_empty.xml b/app/src/main/res/drawable/img_comment_empty.xml index 54b23a92..2ce14cfa 100644 --- a/app/src/main/res/drawable/img_comment_empty.xml +++ b/app/src/main/res/drawable/img_comment_empty.xml @@ -1,177 +1,174 @@ + android:width="38dp" + android:height="37dp" + android:viewportWidth="38" + android:viewportHeight="37"> - diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml new file mode 100644 index 00000000..1b4b12c5 --- /dev/null +++ b/app/src/main/res/layout/activity_detail.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_detail.xml b/app/src/main/res/layout/fragment_detail.xml new file mode 100644 index 00000000..17599495 --- /dev/null +++ b/app/src/main/res/layout/fragment_detail.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_feed_delete_dialog.xml b/app/src/main/res/layout/fragment_feed_delete_dialog.xml deleted file mode 100644 index 8c4ffa76..00000000 --- a/app/src/main/res/layout/fragment_feed_delete_dialog.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_detail_comment.xml b/app/src/main/res/layout/item_detail_comment.xml new file mode 100644 index 00000000..b1e3a518 --- /dev/null +++ b/app/src/main/res/layout/item_detail_comment.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_wineyfeed_post.xml b/app/src/main/res/layout/item_wineyfeed_post.xml index d57e657a..ddd2b3bf 100644 --- a/app/src/main/res/layout/item_wineyfeed_post.xml +++ b/app/src/main/res/layout/item_wineyfeed_post.xml @@ -11,6 +11,7 @@ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 915689bb..3a2663d6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -187,4 +187,11 @@ 업로드가 완료되었습니다 :) 죄송합니다. 업로드에 실패했습니다 :( + + + LV.평민 ㆍ + LV.기사 ㆍ + LV.귀족 ㆍ + LV.황제 ㆍ + 아직 댓글이 없어요