Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[둘리] 3, 4단계 영화 극장 선택 제출합니다. #31

Merged
merged 90 commits into from
May 9, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
c75c7cc
refactor(AlarmController, AlarmReceiver): 중복 코드 제거, scope function 사용 수정
hyemdooly Apr 29, 2023
af1eb2c
refactor(MovieListFragment): Mock이 아닌 인터페이스로 타입 수정
hyemdooly Apr 29, 2023
03aed6f
feat(SettingDataManager): Setting값을 관리하는 인터페이스, 프리퍼런스를 관리하는 클래스 구현
hyemdooly Apr 29, 2023
35e4978
feat(AlarmController): 채널 관리, 알람 설정 AlarmController로 함수 이동
hyemdooly Apr 29, 2023
af6ad6c
refactor(MovieMainActivity): TAG 상수 위치 이동
hyemdooly Apr 30, 2023
29edef5
refactor(MovieMainActivityTest): 프래그먼트 자체를 확인하는 직관적인 테스트 코드로 변경
hyemdooly Apr 30, 2023
bb6cca9
feat(SettingFragmentTest): UI 중심으로 프래그먼트 테스트 재작성 (토글값 유지)
hyemdooly Apr 30, 2023
b95885c
refactor(SettingFragment): MVP 리팩터링
hyemdooly May 2, 2023
a3fb3df
feat(AlarmManageable): AlarmController의 인터페이스 생성
hyemdooly May 2, 2023
163fb80
refactor(SettingPresenter, SettingContract): MVP 리팩터링, 추상화
hyemdooly May 2, 2023
77d3cc2
refactor(ReservationListFragment): MVP 리팩터링
hyemdooly May 2, 2023
42ef79c
refactor(MovieListFragment): MVP 리팩터링
hyemdooly May 3, 2023
de04d9b
refactor(ReservationActivity): 패키지명 변경
hyemdooly May 3, 2023
fc72a83
refactor(Movie): 로직 도메인 로직으로 이동
hyemdooly May 3, 2023
f36a118
refactor(Ktlint): KtlintFormat
hyemdooly May 3, 2023
11e4cc5
refactor(ReservationActivity): MVP 리팩터링
hyemdooly May 3, 2023
ceb7db9
refactor(package): 패키지명 변경
hyemdooly May 3, 2023
65b95f1
refactor(domain, SeatSelectionAcitivty): 도메인, 좌석 지정 코드 전체 리팩터링
hyemdooly May 3, 2023
7ef5f63
refactor(domain, SeatSelectionAcitivty): 도메인, 좌석 지정 코드 전체 리팩터링
hyemdooly May 4, 2023
cddae6d
refactor(SeatSelectionActivity): MVP 리팩터링
hyemdooly May 4, 2023
a77b368
feat(Theater): 극장 정보 클래스 생성
hyemdooly May 4, 2023
72f31b4
refactor(Movie, ScreeningDateTimes): Movie 프로퍼티 변경, ScreeningDateTime…
hyemdooly May 4, 2023
877910d
refactor(MovieListFragment): MovieListFragment 리팩터링
hyemdooly May 4, 2023
08e3b4d
refactor(ReservationActivityTest, SeatSelectionActivityTest): 리팩터링에 따…
hyemdooly May 4, 2023
7d5e406
refactor(ReservationCompletedActivity): 예약 확정 액티비티 MVP 리팩터링
hyemdooly May 4, 2023
7e57cc1
refactor(SettingFragment): 세팅 화면 리팩터링
hyemdooly May 4, 2023
20cf636
refactor(domain): 영화관 상영 정보 추가에 따른 도메인 구조 변경
hyemdooly May 4, 2023
8ddcb4b
refactor(Movie, Schedule): Schedule 클래스 생성, Movie 프로퍼티 변경
hyemdooly May 5, 2023
ba9cd66
refactor(MovieUiModel, MoviePosterRepository): MovieUiModel, MoviePos…
hyemdooly May 5, 2023
ef15f75
refactor(Movie, Schedule): 도메인 모델 구조 변경
hyemdooly May 5, 2023
7fb897e
feat(TheaterBottomSheetFragment): 극장 선택 구현
hyemdooly May 5, 2023
a4225fd
feat(ReservationActivity): 도메인 모델 수정에 따른 수정
hyemdooly May 5, 2023
0f0ace2
refactor(ReservationActivity): 확장함수 정의로 인한 리팩터링
hyemdooly May 5, 2023
c2f8181
fix(ReservationPresenter): 카운터 초기값 0 -> 1 수정
hyemdooly May 5, 2023
4addfaf
refactor(SeatSelectionActivity): 극장 정보 추가에 따른 리팩터링 및 추가 구현
hyemdooly May 5, 2023
417b7f9
feat(ReservationCompleted): 예매 완료 화면 극장 정보 추가 구현
hyemdooly May 5, 2023
8a17d92
refactor(TheaterMockRepository, MovieMockRepository): 아주 긴 극장 이름 확인용 …
hyemdooly May 5, 2023
b90ce79
feat(ReservationDbRepository): 데이터베이스 구현
hyemdooly May 6, 2023
20eb29d
test(ReservationActivityTest, SeatSelectionActivityTest): 도메인 모델 수정에 …
hyemdooly May 6, 2023
3278e8f
refactor(MovieListPresenter): Repository 추상화 의존성 주입, 패키지명 변경
hyemdooly May 6, 2023
5ee3bdc
test(MovieListPresenterTest): MovieListPresenterTest 구현
hyemdooly May 6, 2023
09c3ba2
test(ReservationListPresenterTest): ReservationListPresenterTest 구현
hyemdooly May 6, 2023
3a43ad8
test(ReservationPresenterTest): ReservationPresenterTest 구현
hyemdooly May 6, 2023
009cb87
test(SettingPresenterTest): SettingPresenterTest 구
hyemdooly May 6, 2023
11b2fc7
test(ReservationCompletedPresenterTest): ReservationCompletedPresente…
hyemdooly May 6, 2023
81644ee
test(SeatSelectionPresenterTest): SeatSelectionPresenterTest 구현
hyemdooly May 6, 2023
a64f78e
refactor(SeatSelectionActivity): 필요없는 전역 변수 삭제
hyemdooly May 6, 2023
4815484
refactor(MovieListAdapter): 로그 삭제
hyemdooly May 6, 2023
2611794
refactor(ReservationActivity): 데이터 바인딩 적용
hyemdooly May 6, 2023
3872943
refactor(SeatSelectionActivity): 데이터 바인딩 적용
hyemdooly May 6, 2023
7a0d10e
refactor(ReservationCompletedActivity): 데이터 바인딩 수정
hyemdooly May 6, 2023
7acb0dd
refactor(ReservationActivity): 데이터 바인딩 수정
hyemdooly May 6, 2023
c029161
fix(ReservationDbHelper): split 후 공백 제거
hyemdooly May 6, 2023
86d71bc
refactor(SettingFragment): 데이터 바인딩 적용
hyemdooly May 6, 2023
b6898a7
refactor(MovieListFragment): 데이터 바인딩 적용
hyemdooly May 6, 2023
aff53ce
refactor(TheaterItemViewHolder): 데이터 바인딩 적용
hyemdooly May 6, 2023
a093d1f
refactor(ReservationItemViewHolder): 데이터 바인딩 적용
hyemdooly May 6, 2023
ca87506
refactor(package): test 코드 패키지 이동
hyemdooly May 6, 2023
89b67a2
refactor(PriceSystem): 변수명 통일
hyemdooly May 6, 2023
809e9ae
refactor(package): 패키지 이동, 클래스명 일관성 통일
hyemdooly May 7, 2023
c032ff1
refactor(TheaterMockRepository): requireNotNull 예외처리 적용, 변수 private 변경
hyemdooly May 7, 2023
85205af
refactor(AlarmController): createChannel 함수 private으로 변경
hyemdooly May 7, 2023
131943e
refactor(MovieUiModel): typealias 적용
hyemdooly May 7, 2023
24ece77
refactor(SeatInfoUiModel): 변수명 변경
hyemdooly May 7, 2023
eedd691
refactor(MovieListFragment): MVP 리팩터링
hyemdooly May 7, 2023
14b5219
refactor(ReservationListFragment): MVP 리팩터링
hyemdooly May 7, 2023
3e8df05
refactor(SettingFragment): 필요없는 전역변수 삭제
hyemdooly May 7, 2023
a800192
refactor(SettingFragment): 프로퍼티 최상단으로 이동
hyemdooly May 7, 2023
8add901
refactor(ReservationCompletedActivity): 프로퍼티 최상단으로 이동
hyemdooly May 7, 2023
7ac96e4
refactor(SettingFragment): 인터페이스에서 필요 없는 프로퍼티 삭제
hyemdooly May 7, 2023
6cf0f67
refactor(SettingFragment): 네이밍 변경
hyemdooly May 7, 2023
8582463
refactor(Price): DecimalFormatter 추가 및 수정
hyemdooly May 8, 2023
28b61b8
refactor(ReservationActivity): MVP 리팩터링
hyemdooly May 8, 2023
97afbfe
refactor(SettingFragment): 네이밍 수정
hyemdooly May 8, 2023
3daba24
refactor(SeatSelectinActivity): MVP 리팩터링
hyemdooly May 8, 2023
7bb5bbf
refactor(MovieListAdapter): Inflate 코드 ItemViewHolder 내부로 이동
hyemdooly May 8, 2023
cc79d53
refactor(MapExtension): getKeyFromIndex 함수 제거
hyemdooly May 8, 2023
9a66f21
refactor(Fragments): Fragment가 직접 Fragment를 던지도록 수정
hyemdooly May 8, 2023
b8d4cf1
test(all): 테스트 코드 리팩터링 및 수정으로 인한 코드 변경
hyemdooly May 8, 2023
75e71b5
refactor(MoviePosterRepository): 변경이 적은 코드로 수정
hyemdooly May 8, 2023
a91744a
refactor(SeatSelectionActivity): 프레젠터에서 색상 정보를 제공하도록 변경
hyemdooly May 8, 2023
be39dac
refactor(SeatSelectionActivity): println 삭제, deprecated된 코드 수정
hyemdooly May 8, 2023
b00fa38
fix(SeatSelectionPresenterTest): 테스트 실패 수정
hyemdooly May 8, 2023
ea76ff9
refactor(TheaterMockRepository): requireNotNull 코드 수정
hyemdooly May 8, 2023
c3762e0
refactor(PriceMapper): PriceMapper 삭제
hyemdooly May 8, 2023
ca2af29
refactor(Contract.View): 인터페이스에서 presenter 변수 삭제
hyemdooly May 8, 2023
f39ff1f
refactor(MovieListFragment): presenter 초기화 코드 위치 변경
hyemdooly May 8, 2023
7fb4fbc
refactor(ReservationActivity): 함수 네이밍 변경
hyemdooly May 9, 2023
ed2b736
refactor(TheaterBottomSheetFragment): Bundle로 값을 넘겨주는 방식으로 수정
hyemdooly May 9, 2023
631ecbf
refactor(SeatSelectActivity): SeatInfo 삭제, Theater로 프로퍼티 이동, Presente…
hyemdooly May 9, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat(TheaterBottomSheetFragment): 극장 선택 구현
  • Loading branch information
hyemdooly committed May 5, 2023
commit 7fb897eb6af3a350b0f94f06e8a6ea27f62caba5
10 changes: 9 additions & 1 deletion app/src/main/java/woowacourse/movie/data/MovieMockRepository.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,13 @@ object MovieMockRepository : MovieRepository {
"그의 뒤를 쫓아 산속 폐허에서 발견한 낡은 문. ‘스즈메’가 무언가에 이끌리듯 문을 열자 마을에 재난의 위기가 닥쳐오고 가문 대대로 문 너머의 재난을 봉인하는 ‘소타’를 도와 간신히 문을 닫는다. " +
"“닫아야만 하잖아요, 여기를!” 재난을 막았다는 안도감도 잠시, 수수께끼의 고양이 ‘다이진’이 나타나 ‘소타’를 의자로 바꿔 버리고 일본 각지의 폐허에 재난을 부르는 문이 열리기 시작하자 ‘스즈메’는 의자가 된 ‘소타’와 함께 재난을 막기 위한 여정에 나선다." +
"“꿈이 아니었어” 규슈, 시코쿠, 고베, 도쿄 재난을 막기 위해 일본 전역을 돌며 필사적으로 문을 닫아가던 중 어릴 적 고향에 닿은 ‘스즈메’는 잊고 있던 진실과 마주하게 되는데…",
Schedule(mapOf("잠실 극장" to listOf(LocalTime.of(9, 0)))),
Schedule(
mapOf(
"선릉 극장" to listOf(LocalTime.of(13, 0), LocalTime.of(15, 0), LocalTime.of(17, 0), LocalTime.of(19, 0)),
"잠실 극장" to listOf(LocalTime.of(9, 0)),
"강남 극장" to listOf(LocalTime.of(12, 0), LocalTime.of(14, 0), LocalTime.of(16, 0))
)
),
),
Movie(
"해리 포터와 마법사의 돌",
Expand All @@ -42,6 +48,7 @@ object MovieMockRepository : MovieRepository {
Schedule(
mapOf(
"선릉 극장" to listOf(LocalTime.of(9, 0), LocalTime.of(11, 0), LocalTime.of(15, 0)),
"강남 극장" to listOf(LocalTime.of(12, 0), LocalTime.of(14, 0), LocalTime.of(16, 0))
),
),
),
Expand All @@ -53,6 +60,7 @@ object MovieMockRepository : MovieRepository {
"어벤져스 실사영화 시리즈의 4번째 작품이자, 마블 시네마틱 유니버스의 스물두번째 작품이며, 페이즈 3의 10번째 작품이자 지난 2008년, 아이언맨을 시작으로 장장 11년 동안 이어져 왔던 인피니티 사가의 최종편.",
Schedule(
mapOf(
"선릉 극장" to listOf(LocalTime.of(9, 0), LocalTime.of(11, 0), LocalTime.of(15, 0)),
"잠실 극장" to listOf(LocalTime.of(11, 0), LocalTime.of(14, 0)),
),
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package woowacourse.movie.data

import woowacourse.movie.R

class MoviePosterMockRepository : MoviePosterRepository {
val posters = mapOf(
object MoviePosterMockRepository : MoviePosterRepository {
private val posters = mapOf(
"스즈메의 문단속" to R.drawable.suzume_poster,
"해리 포터와 마법사의 돌" to R.drawable.harry_potter1_poster,
"스타워즈" to R.drawable.starwars_poster,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package woowacourse.movie.data

interface MoviePosterRepository {
fun findPoster(title: String): Int
}
9 changes: 9 additions & 0 deletions app/src/main/java/woowacourse/movie/util/MapExtension.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package woowacourse.movie.util

fun <T, K> Map<T, List<K>>.getOrEmptyList(key: T): List<K> {
return this[key] ?: emptyList<K>()
}

fun <T, K> Map<T, K>.getKeyFromIndex(index: Int): T {
return keys.toList()[index]
}
laco-dev marked this conversation as resolved.
Show resolved Hide resolved
33 changes: 9 additions & 24 deletions app/src/main/java/woowacourse/movie/view/mapper/MovieMapper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,12 @@ import androidx.annotation.DrawableRes
import woowacourse.movie.domain.movie.Movie
import woowacourse.movie.view.model.MovieUiModel

fun Movie.toUiModel(@DrawableRes posterResourceId: Int): MovieUiModel {
val convertSchedule = buildMap {
schedule.schedule.forEach { (name, screeningDateTimes) ->
put(name, screeningDateTimes.dateTimes)
}
}

return MovieUiModel(
title,
startDate,
endDate,
runningTime.value,
posterResourceId,
summary,
convertSchedule,
)
}

// fun MovieUiModel.toDomainModel(): Movie = Movie(
// title,
// ScreeningDateTimes(screeningDateTimes),
// Minute(runningTime),
// summary
// )
fun Movie.toUiModel(@DrawableRes posterResourceId: Int): MovieUiModel = MovieUiModel(
laco-dev marked this conversation as resolved.
Show resolved Hide resolved
title,
startDate,
endDate,
runningTime.value,
posterResourceId,
summary,
schedule.schedule,
)
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@ data class MovieUiModel(
val runningTime: Int,
val posterResourceId: Int,
val summary: String,
val schedule: Map<String, Map<LocalDate, List<LocalTime>>>,
val schedule: Map<String, List<LocalTime>>,
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Schedule이 가지고 있는 key값과 value가 어떤 것을 의미하는지는 PR 본문에만 남아있지 않을까요?
그러면 리뷰어랑 구현한 사람 외에 이 값이 무엇을 의미하는지 어떻게 알 수 있을까요?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typealias를 사용하여 수정했습니다!

) : Parcelable
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package woowacourse.movie.view.moviemain.movielist

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentFactory
import woowacourse.movie.view.model.MovieUiModel

class BottomSheetFragmentFactoryImpl(private val movie: MovieUiModel) : FragmentFactory() {
laco-dev marked this conversation as resolved.
Show resolved Hide resolved
override fun instantiate(classLoader: ClassLoader, className: String): Fragment {
return when (className) {
TheaterBottomSheetFragment::class.java.name -> TheaterBottomSheetFragment(movie)
else -> super.instantiate(classLoader, className)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ sealed class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
binding.movieTitle.text = movie.title
binding.movieScreeningDate.text =
context.getString(R.string.screening_date_format).format(
movie.screeningDateTimes.keys.min().format(DATE_FORMATTER),
movie.screeningDateTimes.keys.max().format(DATE_FORMATTER),
movie.startDate.format(DATE_FORMATTER),
movie.endDate.format(DATE_FORMATTER),
)

binding.movieRunningTime.text =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package woowacourse.movie.view.moviemain.movielist

import android.util.Log
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
Expand Down Expand Up @@ -31,10 +32,11 @@ class MovieListAdapter(
}
}

override fun getItemCount(): Int = movies.size
override fun getItemCount(): Int = movies.size + movies.size / adInterval

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val item = movies[position - ((position + 1) / (adInterval + 1))]
Log.d("index", (position - ((position + 1) / (adInterval + 1))).toString())
when (holder) {
is ItemViewHolder.MovieItemViewHolder -> {
holder.set(item) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.RecyclerView
import woowacourse.movie.R
import woowacourse.movie.view.model.MovieUiModel
import woowacourse.movie.view.reservation.ReservationActivity

class MovieListFragment : Fragment(R.layout.fragment_movie_list) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
Expand All @@ -20,8 +19,9 @@ class MovieListFragment : Fragment(R.layout.fragment_movie_list) {
}

private fun onClick(item: MovieUiModel) {
val intent = ReservationActivity.newIntent(requireContext(), item)
startActivity(intent)
val bottomSheet = TheaterBottomSheetFragment(item)
childFragmentManager.fragmentFactory = BottomSheetFragmentFactoryImpl(item)
bottomSheet.show(childFragmentManager, TheaterBottomSheetFragment.TAG_THEATER)
}

companion object {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
package woowacourse.movie.view.moviemain.movielist

import woowacourse.movie.R
import woowacourse.movie.data.MovieMockRepository
import woowacourse.movie.data.MoviePosterMockRepository
import woowacourse.movie.data.MoviePosterRepository
import woowacourse.movie.domain.repository.MovieRepository
import woowacourse.movie.view.mapper.toUiModel
import woowacourse.movie.view.model.MovieUiModel

class MovieListPresenter : MovieListContract.Presenter {
override fun getMovieListData(): List<MovieUiModel> {
val movieRepository: MovieRepository = MovieMockRepository
val movies = movieRepository.findAll().map { it.toUiModel(R.drawable.harry_potter1_poster) }
return movies
}

companion object {
private const val AD_POST_INTERVAL = 3
val moviePosterRepository: MoviePosterRepository = MoviePosterMockRepository
return movieRepository.findAll()
.map { it.toUiModel(moviePosterRepository.findPoster(it.title)) }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package woowacourse.movie.view.moviemain.movielist

import android.os.Bundle
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import woowacourse.movie.R
import woowacourse.movie.view.model.MovieUiModel
import woowacourse.movie.view.reservation.ReservationActivity

class TheaterBottomSheetFragment(private val movie: MovieUiModel) : BottomSheetDialogFragment(R.layout.theater_select_bottom_sheet) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val theatersView = view.findViewById<RecyclerView>(R.id.recycler_theaters)
theatersView.adapter = TheaterListAdapter(movie.schedule) {
val intent = ReservationActivity.newIntent(requireContext(), movie, it)
startActivity(intent)
}
}
companion object {
const val TAG_THEATER = "THEATER"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package woowacourse.movie.view.moviemain.movielist

import androidx.recyclerview.widget.RecyclerView
import woowacourse.movie.R
import woowacourse.movie.databinding.TheaterItemBinding
import java.time.LocalTime

class TheaterItemViewHolder(
private val binding: TheaterItemBinding,
private val onItemClick: TheaterListAdapter.OnItemClick,
) : RecyclerView.ViewHolder(binding.root) {

fun bind(name: String, times: List<LocalTime>) {
val context = binding.root.context
with(binding) {
textTheaterName.text = name
textScreeningTimeCount.text = context.getString(R.string.screening_times_count, times.size)
layoutTheaterItem.setOnClickListener { onItemClick.onClick(name) }
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package woowacourse.movie.view.moviemain.movielist

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import woowacourse.movie.R
import woowacourse.movie.databinding.TheaterItemBinding
import woowacourse.movie.util.getKeyFromIndex
import woowacourse.movie.util.getOrEmptyList
import java.time.LocalTime

class TheaterListAdapter(
private val schedule: Map<String, List<LocalTime>>,
private val onItemClick: OnItemClick,
) : RecyclerView.Adapter<TheaterItemViewHolder>() {
fun interface OnItemClick {
fun onClick(name: String)
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TheaterItemViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.theater_item, parent, false)
return TheaterItemViewHolder(TheaterItemBinding.bind(view), onItemClick)
}

override fun getItemCount(): Int {
return schedule.size
}

override fun onBindViewHolder(holder: TheaterItemViewHolder, position: Int) {
val key = schedule.getKeyFromIndex(position)
holder.bind(key, schedule.getOrEmptyList(key))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import woowacourse.movie.R
import woowacourse.movie.databinding.ActivityReservationBinding
import woowacourse.movie.util.DATE_FORMATTER
import woowacourse.movie.util.getParcelableCompat
import woowacourse.movie.view.model.MovieUiModel
import woowacourse.movie.view.model.ReservationOptions
Expand All @@ -38,7 +37,7 @@ class ReservationActivity : AppCompatActivity(), ReservationContract.View {
presenter = ReservationPresenter(this)

setViewData(movie)
setDateSpinner(movie.screeningDateTimes)
// setDateSpinner(movie.screeningDateTimes)
setPeopleCountAdjustButtonClickListener()
setReserveButtonClickListener(movie)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
Expand All @@ -52,10 +51,10 @@ class ReservationActivity : AppCompatActivity(), ReservationContract.View {
binding.apply {
moviePoster.setImageResource(movie.posterResourceId)
movieTitle.text = movie.title
movieScreeningDate.text = getString(R.string.screening_date_format).format(
movie.screeningDateTimes.keys.min().format(DATE_FORMATTER),
movie.screeningDateTimes.keys.max().format(DATE_FORMATTER),
)
// movieScreeningDate.text = getString(R.string.screening_date_format).format(
// movie.screeningDateTimes.keys.min().format(DATE_FORMATTER),
// movie.screeningDateTimes.keys.max().format(DATE_FORMATTER),
// )
movieRunningTime.text =
getString(R.string.running_time_format).format(movie.runningTime)
movieSummary.text = movie.summary
Expand Down Expand Up @@ -152,10 +151,12 @@ class ReservationActivity : AppCompatActivity(), ReservationContract.View {
private const val SELECTED_DATE_POSITION = "SELECTED_DATE_POSITION"
private const val SELECTED_TIME_POSITION = "SELECTED_TIME_POSITION"
private const val MOVIE = "MOVIE"
private const val THEATER = "THEATER"

fun newIntent(context: Context, movie: MovieUiModel): Intent {
fun newIntent(context: Context, movie: MovieUiModel, theaterName: String): Intent {
val intent = Intent(context, ReservationActivity::class.java)
intent.putExtra(MOVIE, movie)
intent.putExtra(THEATER, theaterName)
return intent
}
}
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/res/drawable/ic_right_arrow.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="#000000" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="https://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M6.23,20.23l1.77,1.77l10,-10l-10,-10l-1.77,1.77l8.23,8.23z"/>
</vector>
39 changes: 39 additions & 0 deletions app/src/main/res/layout/theater_item.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:id="@+id/layout_theater_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:background="?attr/selectableItemBackground"
android:padding="24dp">

<TextView
android:id="@+id/text_theater_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:text="선릉 극장"
android:textColor="@color/black"
android:textSize="16sp" />
<TextView
android:id="@+id/text_screening_time_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="3개의 상영 시간"
android:textSize="12sp"
android:layout_marginTop="2dp"
app:layout_constraintTop_toBottomOf="@id/text_theater_name"
app:layout_constraintStart_toStartOf="parent" />
<ImageView
android:layout_width="18dp"
android:layout_height="18dp"
android:background="@drawable/ic_right_arrow"
android:backgroundTint="@color/theater_arrow"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout>
16 changes: 16 additions & 0 deletions app/src/main/res/layout/theater_select_bottom_sheet.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:tools="https://schemas.android.com/tools"
xmlns:app="https://schemas.android.com/apk/res-auto">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_theaters"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:listitem="@layout/theater_item"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>
1 change: 1 addition & 0 deletions app/src/main/res/values/colors.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
<color name="seat_rank_a">#1B48E9</color>
<color name="price">#727272</color>
<color name="disabled_click">#B7B7B7</color>
<color name="theater_arrow">#5F5F5F</color>
<drawable name="select_seat">#FAFF00</drawable>
<drawable name="deselect_seat">#FFFFFF</drawable>
</resources>
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,5 @@
<string name="push_notification_title">푸시 알림 수신</string>
<string name="notification_description">해제하면 푸시 알림을 수신할 수 없습니다.</string>
<string name="submit">확인</string>
<string name="screening_times_count">%d개의 상영 시간</string>
</resources>