diff --git a/presentation/src/main/java/org/gdsc/presentation/view/mypage/adapter/ImageSlider.kt b/presentation/src/main/java/org/gdsc/presentation/view/mypage/adapter/ImageSlider.kt index 57cdd826..8180b45c 100644 --- a/presentation/src/main/java/org/gdsc/presentation/view/mypage/adapter/ImageSlider.kt +++ b/presentation/src/main/java/org/gdsc/presentation/view/mypage/adapter/ImageSlider.kt @@ -6,14 +6,17 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide +import org.gdsc.domain.model.Review import org.gdsc.presentation.databinding.ItemImageSlideBinding data class ImageSliderItem( - val imageUrl: String + val imageUrl: String, + val review: Review ) class ImageSlider( - private val onItemSelected: () -> Unit = {} + private val onItemSelected: () -> Unit = {}, + private val onReviewRefreshed: (Review) -> Unit = {} ) : ListAdapter( diffUtil @@ -27,6 +30,7 @@ class ImageSlider( .load(item.imageUrl) .into(imageView) } + onReviewRefreshed(item.review) } } diff --git a/presentation/src/main/java/org/gdsc/presentation/view/mypage/adapter/RestaurantPhotoAdapter.kt b/presentation/src/main/java/org/gdsc/presentation/view/mypage/adapter/RestaurantPhotoAdapter.kt index 94301d9e..00f2e8b6 100644 --- a/presentation/src/main/java/org/gdsc/presentation/view/mypage/adapter/RestaurantPhotoAdapter.kt +++ b/presentation/src/main/java/org/gdsc/presentation/view/mypage/adapter/RestaurantPhotoAdapter.kt @@ -16,16 +16,25 @@ class RestaurantPhotoAdapter( diffUtil ) { - private var width = 0 - private var height = 0 + private var width = 0 + private var height = 0 inner class RestaurantPhotoViewHolder(private val binding: ItemPhotoRestaurantBinding) : RecyclerView.ViewHolder(binding.root) { fun bind(item: RestaurantPhotoItem) { with(binding) { - Glide.with(root) - .load(item.photoUrl) - .into(ivPhoto) + + if (item.photoUrl != "BUTTON") { + Glide.with(root) + .load(item.photoUrl) + .into(ivPhoto) + } else { + morePhotoButton.visibility = ViewGroup.VISIBLE + morePhotoButton.setOnClickListener { + onItemSelected() + } + } + } } } diff --git a/presentation/src/main/java/org/gdsc/presentation/view/mypage/restaurantdetail/RestaurantDetailFragment.kt b/presentation/src/main/java/org/gdsc/presentation/view/mypage/restaurantdetail/RestaurantDetailFragment.kt index a9750e84..ee66e82e 100644 --- a/presentation/src/main/java/org/gdsc/presentation/view/mypage/restaurantdetail/RestaurantDetailFragment.kt +++ b/presentation/src/main/java/org/gdsc/presentation/view/mypage/restaurantdetail/RestaurantDetailFragment.kt @@ -10,6 +10,7 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.core.net.toUri +import androidx.core.widget.NestedScrollView import androidx.fragment.app.activityViewModels import androidx.fragment.app.setFragmentResultListener import androidx.lifecycle.lifecycleScope @@ -21,12 +22,14 @@ import kotlinx.coroutines.launch import okhttp3.MediaType import okhttp3.MultipartBody import okhttp3.RequestBody +import org.gdsc.domain.Empty import org.gdsc.presentation.R import org.gdsc.presentation.databinding.FragmentRestaurantDetailBinding import org.gdsc.presentation.utils.BitmapUtils.getCompressedBitmapFromUri import org.gdsc.presentation.utils.BitmapUtils.saveBitmapToFile import org.gdsc.presentation.utils.CalculatorUtils import org.gdsc.presentation.utils.repeatWhenUiStarted +import org.gdsc.presentation.view.MainActivity import org.gdsc.presentation.view.mypage.adapter.PhotoWillBeUploadedAdapter import org.gdsc.presentation.view.mypage.adapter.RestaurantDetailPagerAdapter import org.gdsc.presentation.view.mypage.viewmodel.RestaurantDetailViewModel @@ -39,6 +42,8 @@ class RestaurantDetailFragment : Fragment() { private val viewModel: RestaurantDetailViewModel by activityViewModels() + private val parentActivity by lazy { activity as MainActivity } + private val adapter = PhotoWillBeUploadedAdapter { viewModel.deletePhotoForReviewState(it) } @@ -63,6 +68,15 @@ class RestaurantDetailFragment : Fragment() { } } + binding.topScrollView.setOnScrollChangeListener( + NestedScrollView.OnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY -> + if (scrollY > binding.tvRestaurantName.height) { + parentActivity.changeToolbarTitle(binding.tvRestaurantName.text.toString()) + } else { + parentActivity.changeToolbarTitle(String.Empty) + } + }) + binding.rvImageListWillBeUploaded.adapter = adapter binding.addImageIcon.setOnClickListener { @@ -167,6 +181,7 @@ class RestaurantDetailFragment : Fragment() { binding.restaurantDetailPager.adapter = RestaurantDetailPagerAdapter(this) binding.restaurantDetailPager.isUserInputEnabled = false + binding.restaurantDetailPager.offscreenPageLimit = 1 TabLayoutMediator(binding.tabLayout, binding.restaurantDetailPager) { tab, position -> when (position) { diff --git a/presentation/src/main/java/org/gdsc/presentation/view/mypage/restaurantdetail/RestaurantInfoFragment.kt b/presentation/src/main/java/org/gdsc/presentation/view/mypage/restaurantdetail/RestaurantInfoFragment.kt index 8a987e8e..70e5e369 100644 --- a/presentation/src/main/java/org/gdsc/presentation/view/mypage/restaurantdetail/RestaurantInfoFragment.kt +++ b/presentation/src/main/java/org/gdsc/presentation/view/mypage/restaurantdetail/RestaurantInfoFragment.kt @@ -44,7 +44,7 @@ class RestaurantInfoFragment : Fragment() { } private val restaurantPhotoAdapter = RestaurantPhotoAdapter { - + (parentFragment as RestaurantDetailFragment).changeCategory(RestaurantDetailPagerAdapter.PHOTO) } override fun onCreateView( @@ -86,6 +86,10 @@ class RestaurantInfoFragment : Fragment() { binding.cgRecommendDrink.addView(newChip(it)) } } + + photoAdapter.submitList(pictures.map { + ImagePagerItem(it) + }) } } } @@ -98,13 +102,12 @@ class RestaurantInfoFragment : Fragment() { } viewLifecycleOwner.lifecycleScope.launch { - viewModel.restaurantInfo.collect { - it?.let { notNullRestaurantInfo -> - restaurantPhotoAdapter.submitList( - notNullRestaurantInfo.pictures.map { imageUrl -> - (RestaurantPhotoItem(imageUrl)) - }) - } + + viewModel.reviews.collect { reviews -> + restaurantPhotoAdapter.submitList( + reviews.map { it.reviewImages }.flatten().take(8).map { imageUrl -> + (RestaurantPhotoItem(imageUrl)) + } + RestaurantPhotoItem("BUTTON")) } } } @@ -113,17 +116,6 @@ class RestaurantInfoFragment : Fragment() { binding.pagerPhotos.adapter = photoAdapter - photoAdapter.submitList( - listOf( - ImagePagerItem("https://picsum.photos/200/200"), - ImagePagerItem("https://picsum.photos/200/200"), - ImagePagerItem("https://picsum.photos/200/200"), - ImagePagerItem("https://picsum.photos/200/200"), - ImagePagerItem("https://picsum.photos/200/200"), - ImagePagerItem("https://picsum.photos/200/200"), - ) - ) - binding.rvReviews.adapter = restaurantReviewAdapter binding.rvReviews.layoutManager = LinearLayoutManager(context) diff --git a/presentation/src/main/java/org/gdsc/presentation/view/mypage/restaurantdetail/RestaurantPhotoDetailFragment.kt b/presentation/src/main/java/org/gdsc/presentation/view/mypage/restaurantdetail/RestaurantPhotoDetailFragment.kt index db5054ce..de0738f5 100644 --- a/presentation/src/main/java/org/gdsc/presentation/view/mypage/restaurantdetail/RestaurantPhotoDetailFragment.kt +++ b/presentation/src/main/java/org/gdsc/presentation/view/mypage/restaurantdetail/RestaurantPhotoDetailFragment.kt @@ -28,7 +28,16 @@ class RestaurantPhotoDetailFragment : Fragment() { private val imageSlider = ImageSlider( - ) + ) { + with(binding.reviewItem) { + Glide.with(root) + .load(it.reviewerImageUrl) + .into(ivProfile) + + tvNickname.text = it.userName + tvContent.text = it.reviewContent + } + } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -40,48 +49,30 @@ class RestaurantPhotoDetailFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - setAdapter() - observeData() - - } - private fun observeData() { - viewLifecycleOwner.lifecycleScope.launch { - viewModel.reviews.collect { reviewList -> - if (reviewList.isNotEmpty()) { - - // TODO: to be dynamic - val firstReview = reviewList.first() - with(binding.reviewItem) { - Glide.with(root) - .load(firstReview.reviewerImageUrl) - .into(ivProfile) - - tvNickname.text = firstReview.userName - tvContent.text = firstReview.reviewContent - } - } - } - } } private fun setAdapter() { binding.imageSlider.adapter = imageSlider - viewModel.restaurantInfo.value?.let { restaurantInfo -> + viewModel.reviews.value.let { reviews -> + + val imageSliderItems = reviews.map { review -> + review.reviewImages.map { imageUrl -> + ImageSliderItem(imageUrl, review) + } + }.flatten() binding.imageSlider.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { super.onPageSelected(position) - parentActivity.changeToolbarTitle("${position + 1} / ${restaurantInfo.pictures.size}") + parentActivity.changeToolbarTitle("${position + 1} / ${imageSliderItems.size}") } }) - imageSlider.submitList(restaurantInfo.pictures.map { - ImageSliderItem(it) - }) + imageSlider.submitList(imageSliderItems) } } diff --git a/presentation/src/main/java/org/gdsc/presentation/view/mypage/restaurantdetail/RestaurantPhotoFragment.kt b/presentation/src/main/java/org/gdsc/presentation/view/mypage/restaurantdetail/RestaurantPhotoFragment.kt index 37a09bc1..d0bf5187 100644 --- a/presentation/src/main/java/org/gdsc/presentation/view/mypage/restaurantdetail/RestaurantPhotoFragment.kt +++ b/presentation/src/main/java/org/gdsc/presentation/view/mypage/restaurantdetail/RestaurantPhotoFragment.kt @@ -6,12 +6,16 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.ViewTreeObserver +import androidx.fragment.app.activityViewModels +import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.GridLayoutManager import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch import org.gdsc.presentation.databinding.FragmentRestaurantPhotoBinding import org.gdsc.presentation.model.RestaurantPhotoItem import org.gdsc.presentation.view.mypage.adapter.RestaurantPhotoAdapter +import org.gdsc.presentation.view.mypage.viewmodel.RestaurantDetailViewModel @AndroidEntryPoint class RestaurantPhotoFragment : Fragment() { @@ -19,6 +23,12 @@ class RestaurantPhotoFragment : Fragment() { private var _binding: FragmentRestaurantPhotoBinding? = null private val binding get() = _binding!! + private val viewModel by activityViewModels() + + private val restaurantPhotoAdapter = RestaurantPhotoAdapter { + findNavController().navigate(RestaurantDetailFragmentDirections.actionRestaurantDetailFragmentToRestaurantPhotoDetailFragment()) + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -33,9 +43,6 @@ class RestaurantPhotoFragment : Fragment() { } private fun setAdapter() { - val restaurantPhotoAdapter = RestaurantPhotoAdapter { - findNavController().navigate(RestaurantDetailFragmentDirections.actionRestaurantDetailFragmentToRestaurantPhotoDetailFragment()) - } val spanCount = 3 @@ -51,28 +58,15 @@ class RestaurantPhotoFragment : Fragment() { } }) + viewLifecycleOwner.lifecycleScope.launch { + viewModel.reviews.collect { reviews -> + restaurantPhotoAdapter.submitList( + reviews.map { it.reviewImages }.flatten().map { imageUrl -> + (RestaurantPhotoItem(imageUrl)) + }) + } + } - // TODO: supposed to be real data - restaurantPhotoAdapter.submitList( - listOf( - RestaurantPhotoItem("https://gdsc-jmt.s3.ap-northeast-2.amazonaws.com/profileImg/defaultImg/Default+image.png"), - RestaurantPhotoItem("https://gdsc-jmt.s3.ap-northeast-2.amazonaws.com/profileImg/defaultImg/Default+image.png"), - RestaurantPhotoItem("https://gdsc-jmt.s3.ap-northeast-2.amazonaws.com/profileImg/defaultImg/Default+image.png"), - RestaurantPhotoItem("https://gdsc-jmt.s3.ap-northeast-2.amazonaws.com/profileImg/defaultImg/Default+image.png"), - RestaurantPhotoItem("https://gdsc-jmt.s3.ap-northeast-2.amazonaws.com/profileImg/defaultImg/Default+image.png"), - RestaurantPhotoItem("https://gdsc-jmt.s3.ap-northeast-2.amazonaws.com/profileImg/defaultImg/Default+image.png"), - RestaurantPhotoItem("https://gdsc-jmt.s3.ap-northeast-2.amazonaws.com/profileImg/defaultImg/Default+image.png"), - RestaurantPhotoItem("https://gdsc-jmt.s3.ap-northeast-2.amazonaws.com/profileImg/defaultImg/Default+image.png"), - RestaurantPhotoItem("https://gdsc-jmt.s3.ap-northeast-2.amazonaws.com/profileImg/defaultImg/Default+image.png"), - RestaurantPhotoItem("https://gdsc-jmt.s3.ap-northeast-2.amazonaws.com/profileImg/defaultImg/Default+image.png"), - RestaurantPhotoItem("https://gdsc-jmt.s3.ap-northeast-2.amazonaws.com/profileImg/defaultImg/Default+image.png"), - RestaurantPhotoItem("https://gdsc-jmt.s3.ap-northeast-2.amazonaws.com/profileImg/defaultImg/Default+image.png"), - RestaurantPhotoItem("https://gdsc-jmt.s3.ap-northeast-2.amazonaws.com/profileImg/defaultImg/Default+image.png"), - RestaurantPhotoItem("https://gdsc-jmt.s3.ap-northeast-2.amazonaws.com/profileImg/defaultImg/Default+image.png"), - RestaurantPhotoItem("https://gdsc-jmt.s3.ap-northeast-2.amazonaws.com/profileImg/defaultImg/Default+image.png"), - RestaurantPhotoItem("https://gdsc-jmt.s3.ap-northeast-2.amazonaws.com/profileImg/defaultImg/Default+image.png"), - ) - ) } } \ No newline at end of file diff --git a/presentation/src/main/res/drawable/ic_plus.png b/presentation/src/main/res/drawable/ic_plus.png new file mode 100644 index 00000000..7297719c Binary files /dev/null and b/presentation/src/main/res/drawable/ic_plus.png differ diff --git a/presentation/src/main/res/layout/fragment_restaurant_detail.xml b/presentation/src/main/res/layout/fragment_restaurant_detail.xml index edac825c..48afbcd4 100644 --- a/presentation/src/main/res/layout/fragment_restaurant_detail.xml +++ b/presentation/src/main/res/layout/fragment_restaurant_detail.xml @@ -1,59 +1,56 @@ + android:layout_height="match_parent"> + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + tools:text="용용선생 노원점" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tv_restaurant_name"> @@ -61,17 +58,16 @@ android:layout_width="1dp" android:layout_height="12dp" android:layout_gravity="center_vertical" - android:background="@color/grey200" android:layout_marginHorizontal="12dp" - /> + android:background="@color/grey200" /> + tools:text="중식" /> @@ -79,82 +75,80 @@ android:id="@+id/ct_address" android:layout_width="0dp" android:layout_height="wrap_content" - app:layout_constraintStart_toStartOf="parent" + android:layout_marginTop="4dp" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@id/ct_distance_and_category" - android:layout_marginTop="4dp"> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/ct_distance_and_category"> + android:text="주소복사" + android:textColor="@color/main300" /> + android:contentDescription="profile" + android:src="@drawable/mock_profile" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/ct_address" /> + app:layout_constraintBottom_toBottomOf="@id/iv_profile" + app:layout_constraintStart_toEndOf="@id/iv_profile" + app:layout_constraintTop_toTopOf="@id/iv_profile" + tools:text="Blaire" /> + app:tabTextColor="@color/grey400"> + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tab_layout" /> @@ -165,70 +159,69 @@ android:layout_width="0dp" android:layout_height="1dp" android:background="@color/grey100" - app:layout_constraintStart_toStartOf="parent" + app:layout_constraintBottom_toTopOf="@id/ct_review_foam" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintBottom_toTopOf="@id/ct_review_foam"/> + app:layout_constraintStart_toStartOf="parent" /> + app:layout_constraintStart_toStartOf="parent"> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toBottomOf="@id/et_review" /> + app:layout_constraintEnd_toEndOf="parent" /> + app:layout_constraintEnd_toStartOf="@id/btn_register" + app:layout_constraintStart_toEndOf="@id/add_image_icon" /> diff --git a/presentation/src/main/res/layout/fragment_restaurant_info.xml b/presentation/src/main/res/layout/fragment_restaurant_info.xml index 4c23d6c8..2a55b23a 100644 --- a/presentation/src/main/res/layout/fragment_restaurant_info.xml +++ b/presentation/src/main/res/layout/fragment_restaurant_info.xml @@ -1,143 +1,128 @@ + android:layout_height="wrap_content"> + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/presentation/src/main/res/layout/fragment_restaurant_photo.xml b/presentation/src/main/res/layout/fragment_restaurant_photo.xml index ba010b73..d5825b69 100644 --- a/presentation/src/main/res/layout/fragment_restaurant_photo.xml +++ b/presentation/src/main/res/layout/fragment_restaurant_photo.xml @@ -2,8 +2,9 @@ + app:layout_constraintTop_toTopOf="parent" + /> + app:layout_constraintTop_toBottomOf="@id/tv_photos"/> \ No newline at end of file diff --git a/presentation/src/main/res/layout/fragment_restaurant_review.xml b/presentation/src/main/res/layout/fragment_restaurant_review.xml index 1a655fdd..5064164b 100644 --- a/presentation/src/main/res/layout/fragment_restaurant_review.xml +++ b/presentation/src/main/res/layout/fragment_restaurant_review.xml @@ -2,7 +2,7 @@ @@ -14,16 +14,14 @@ style="@style/text_medium_medium" android:textColor="@color/grey700" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintTop_toBottomOf="@id/tv_reviews" /> \ No newline at end of file diff --git a/presentation/src/main/res/layout/item_image_slide.xml b/presentation/src/main/res/layout/item_image_slide.xml index 5784aa5e..b7642049 100644 --- a/presentation/src/main/res/layout/item_image_slide.xml +++ b/presentation/src/main/res/layout/item_image_slide.xml @@ -1,12 +1,13 @@ - + app:all_corner_radius="5dp"> - \ No newline at end of file + \ No newline at end of file diff --git a/presentation/src/main/res/layout/item_photo_restaurant.xml b/presentation/src/main/res/layout/item_photo_restaurant.xml index 6e12f745..47a5f179 100644 --- a/presentation/src/main/res/layout/item_photo_restaurant.xml +++ b/presentation/src/main/res/layout/item_photo_restaurant.xml @@ -17,4 +17,31 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" /> + + + + + + + + \ No newline at end of file