diff --git a/README.md b/README.md index a7dd3e3eb..0b93c0cb7 100644 --- a/README.md +++ b/README.md @@ -2,23 +2,33 @@ ## 액티비티 - MovieListActivity -- TicketingActivity -- MovieTicketActivity +- MovieDetailActivity +- SeatSelectActivity +- TicketResultActivity ## 어댑터 -- MoviesAdapter +- MovieListAdapter -## 데이터 +## 모델 - Movie - 이미지, 제목, 상영일(PlayingTimes), 러닝타임, 소개 -- TicketingInfo - - 영화 이름, 상영일, 몇명, 가격, 무슨 결제 +- PlayingDateTimes +- Ticket + - 영화 이름, 상영일, 몇명, 가격 +- DiscountPolicy (다형성을 위한 추상 클래스) + - MorningPolicy (조조) + - MovieDayPolicy (무비데이) + - NightPolicy (야간) - Price - - 음수 체크 - - 티켓 한 장의 가격은 13000원 - - 영화 가격에 할인을 적용한다. - - Discount 구현 클래스를 리스트로 받는다. -- PlayingTimes - - 날짜-상영시간 map 타입으로 가지고 있다. -- Discount (인터페이스) - - calculate 메소드 +- Grade (enum class) + - price (등급별 가격) +- Seat + - row, col (범위 0 이상) +- TheaterInfo + - 등급별 가격, 좌석 정보 + +## 서비스 +- PriceSystem (SelectResult에 따른 가격 변화 계산기) +- PriceCalculator (정책에 따른 가격 계산기) +- SeatSelectSystem +- SelectResult (결과를 나타내는 sealed class) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6ec5d7122..63a60a8ae 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -43,5 +43,7 @@ dependencies { testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + androidTestImplementation("androidx.test.espresso:espresso-contrib:3.3.0") + androidTestImplementation("androidx.test.espresso:espresso-intents:3.5.1") implementation(project(":domain")) } diff --git a/app/src/androidTest/java/woowacourse/movie/MovieDetailActivityTest.kt b/app/src/androidTest/java/woowacourse/movie/MovieDetailActivityTest.kt new file mode 100644 index 000000000..f31c22afd --- /dev/null +++ b/app/src/androidTest/java/woowacourse/movie/MovieDetailActivityTest.kt @@ -0,0 +1,59 @@ +package woowacourse.movie + +import android.content.Intent +import androidx.test.core.app.ActivityScenario +import androidx.test.core.app.ApplicationProvider +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withText +import org.junit.Test +import woowacourse.movie.activity.moviedetail.MovieDetailActivity +import woowacourse.movie.domain.movie.Movie +import woowacourse.movie.model.MovieModel +import woowacourse.movie.model.toPresentation +import java.time.LocalDate + +class MovieDetailActivityTest { + + private val movieModel = Movie.of( + "해리포터와 마법사의 돌 1", + LocalDate.of(2023, 3, 1), + LocalDate.of(2023, 3, 31), + 152, + "해리포터 첫 번째 시리즈" + ).toPresentation(R.drawable.img) + + lateinit var activityScenario: ActivityScenario + + @Test + fun 영화_정보를_띄운다() { + startActivity(movieModel) + onView(withId(R.id.text_title)).check(matches(withText("해리포터와 마법사의 돌 1"))) + onView(withId(R.id.text_playing_date)).check(matches(withText("상영일: 2023.3.1 ~ 2023.3.31"))) + onView(withId(R.id.text_description)).check(matches(withText("해리포터 첫 번째 시리즈"))) + } + + @Test + fun 플러스_버튼을_클릭하면_매수가_올라간다() { + startActivity(movieModel) + onView(withId(R.id.btn_plus)).perform(click()) + onView(withId(R.id.text_count)).check(matches(withText("2"))) + } + + @Test + fun 마이너스_버튼을_클릭하면_매수가_내려간다() { + startActivity(movieModel) + onView(withId(R.id.btn_plus)).perform(click()) + onView(withId(R.id.btn_plus)).perform(click()) + onView(withId(R.id.btn_minus)).perform(click()) + onView(withId(R.id.text_count)).check(matches(withText("2"))) + } + + private fun startActivity(movie: MovieModel) { + val intent = Intent(ApplicationProvider.getApplicationContext(), MovieDetailActivity::class.java) + intent.putExtra(MovieDetailActivity.MOVIE_KEY, movieModel) + activityScenario = ActivityScenario.launch(intent) + } +} diff --git a/app/src/androidTest/java/woowacourse/movie/MovieListActivityTest.kt b/app/src/androidTest/java/woowacourse/movie/MovieListActivityTest.kt new file mode 100644 index 000000000..6d88a2b21 --- /dev/null +++ b/app/src/androidTest/java/woowacourse/movie/MovieListActivityTest.kt @@ -0,0 +1,123 @@ +package woowacourse.movie + +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.UiController +import androidx.test.espresso.ViewAction +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition +import androidx.test.espresso.contrib.RecyclerViewActions.scrollToPosition +import androidx.test.espresso.intent.Intents +import androidx.test.espresso.intent.Intents.intended +import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent +import androidx.test.espresso.matcher.ViewMatchers.hasDescendant +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.ext.junit.rules.ActivityScenarioRule +import org.hamcrest.Matcher +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import woowacourse.movie.activity.moviedetail.MovieDetailActivity +import woowacourse.movie.activity.movielist.CustomViewHolder +import woowacourse.movie.activity.movielist.ListViewType +import woowacourse.movie.activity.movielist.MovieListActivity +import woowacourse.movie.model.toPresentation +import woowacourse.movie.util.DummyData +import java.time.format.DateTimeFormatter + +class MovieListActivityTest { + @get:Rule + val activityRule = ActivityScenarioRule(MovieListActivity::class.java) + + val dummyDataToPresentation = DummyData.movies.map { it.toPresentation(R.drawable.img) } + + @Before + fun setup() { + Intents.init() + } + + @After + fun tearDown() { + Intents.release() + } + + @Test + fun 아이템_3개마다_광고뷰를_띄운다() { + activityRule.scenario.onActivity { activity -> + val recyclerView = activity.findViewById(R.id.recycler_view) + + val expected = recyclerView.adapter?.getItemViewType(3) + val actual = ListViewType.AD_VIEWTYPE.ordinal + + assertEquals(expected, actual) + } + } + + @Test + fun 광고를_제외한_모든_아이템은_영화_정보_뷰를_띄운다() { + activityRule.scenario.onActivity { activity -> + val recyclerView = activity.findViewById(R.id.recycler_view) + + for (position in 0 until 3) { + val expected = recyclerView.adapter?.getItemViewType(position) + val actual = ListViewType.NORMAL_VIEWTYPE.ordinal + + assertEquals(expected, actual) + } + } + } + + @Test + fun 광고는_이미지를_띄운다() { + onView(withId(R.id.recycler_view)) + .perform(scrollToPosition(3)) + .check(matches(hasDescendant(withId(R.id.img_ad)))) + } + + @Test + fun 광고_이외_아이템은_영화_정보를_띄운다() { + val movie = dummyDataToPresentation[0] + val formatter = DateTimeFormatter.ofPattern("YYYY.M.d") + val dateTime = + "상영일: ${formatter.format(movie.startDate)} ~ ${formatter.format(movie.endDate)}" + val runningTime = "러닝타임: ${movie.runningTime}분" + onView(withId(R.id.recycler_view)) + .perform(scrollToPosition(0)) + .check(matches(hasDescendant(withText(movie.title)))) + onView(withId(R.id.recycler_view)).check(matches(hasDescendant(withText(dateTime)))) + onView(withId(R.id.recycler_view)).check(matches(hasDescendant(withText(runningTime)))) + } + + @Test + fun 예매_버튼을_누르면_상세_액티비티를_띄운다() { + onView(withId(R.id.recycler_view)) + .perform( + actionOnItemAtPosition( + 0, + clickChildViewWithId(R.id.btn_reserve), + ), + ) + intended(hasComponent(MovieDetailActivity::class.java.name)) + } + + fun clickChildViewWithId(id: Int): ViewAction? { + return object : ViewAction { + override fun getConstraints(): Matcher? { + return null + } + + override fun getDescription(): String { + return "Click on a child view with specified id." + } + + override fun perform(uiController: UiController?, view: View) { + val v: View = view.findViewById(id) + v.performClick() + } + } + } +} diff --git a/app/src/androidTest/java/woowacourse/movie/SeatSelectActivityTest.kt b/app/src/androidTest/java/woowacourse/movie/SeatSelectActivityTest.kt new file mode 100644 index 000000000..8f17ec5b9 --- /dev/null +++ b/app/src/androidTest/java/woowacourse/movie/SeatSelectActivityTest.kt @@ -0,0 +1,122 @@ +package woowacourse.movie + +import android.content.Intent +import android.graphics.drawable.ColorDrawable +import android.view.View +import android.widget.TextView +import androidx.annotation.ColorInt +import androidx.core.content.ContextCompat +import androidx.test.core.app.ApplicationProvider +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.action.ViewActions +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.BoundedMatcher +import androidx.test.espresso.matcher.ViewMatchers.isEnabled +import androidx.test.espresso.matcher.ViewMatchers.isNotEnabled +import androidx.test.espresso.matcher.ViewMatchers.isSelected +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.ext.junit.rules.ActivityScenarioRule +import androidx.test.internal.util.Checks +import org.hamcrest.CoreMatchers.not +import org.hamcrest.Description +import org.hamcrest.Matcher +import org.junit.Rule +import org.junit.Test +import woowacourse.movie.activity.seatselect.SeatSelectActivity +import woowacourse.movie.model.ReserveInfoModel +import java.time.LocalDateTime + +class SeatSelectActivityTest { + private val intent = + Intent(ApplicationProvider.getApplicationContext(), SeatSelectActivity::class.java).apply { + putExtra( + SeatSelectActivity.INFO_KEY, + ReserveInfoModel("해리포터와 마법사의 돌 1", LocalDateTime.of(2023, 3, 12, 12, 0, 0), 20), + ) + } + + @get:Rule + val activityRule = ActivityScenarioRule(intent) + + private val ids = listOf( + R.id.seat_a1, R.id.seat_a2, R.id.seat_a3, R.id.seat_a4, + R.id.seat_b1, R.id.seat_b2, R.id.seat_b3, R.id.seat_b4, + R.id.seat_c1, R.id.seat_c2, R.id.seat_c3, R.id.seat_c4, + R.id.seat_d1, R.id.seat_d2, R.id.seat_d3, R.id.seat_d4, + R.id.seat_e1, R.id.seat_e2, R.id.seat_e3, R.id.seat_e4, + ) + + @Test + fun 영화_제목을_띄운다() { + onView(withId(R.id.text_title)) + .check(matches(withText("해리포터와 마법사의 돌 1"))) + } + + @Test + fun 아직_선택하지_않은_좌석을_클릭하면_색깔이_바뀐다() { + ids.forEach { + onView(withId(it)).perform(ViewActions.click()) + onView(withId(it)).check(matches(isSelected())) + onView(withId(it)).check(matches(withBackgroundColor(R.color.select_seat))) + } + } + + @Test + fun 이미_선택한_좌석을_클릭하면_원래_색깔로_바뀐다() { + ids.forEach { + onView(withId(it)).perform(ViewActions.click()) + } + ids.forEach { + onView(withId(it)).perform(ViewActions.click()) + onView(withId(it)).check(matches(not(isSelected()))) + onView(withId(it)).check(matches(withBackgroundColor(R.color.white))) + } + } + + @Test + fun 예매할_모든_좌석을_선택한_경우_버튼이_활성화된다() { + ids.forEach { + onView(withId(it)).perform(ViewActions.click()) + } + onView(withId(R.id.btn_next)).check(matches(isEnabled())) + } + + @Test + fun 예매할_모든_좌석을_선택하기_전까지_버튼이_활성화되지_않는다() { + ids.drop(1).forEach { + onView(withId(it)).perform(ViewActions.click()) + } + onView(withId(R.id.btn_next)).check(matches(isNotEnabled())) + } + + @Test + fun 좌석을_클릭하면_가격이_올라간다() { + ids.forEach { + onView(withId(it)).perform(ViewActions.click()) + } + onView(withId(R.id.text_price)).check(matches(withText("248,000원"))) + } + + @Test + fun 좌석_선택을_해제하면_가격이_내려간다() { + onView(withId(R.id.seat_a1)).perform(ViewActions.click()) + onView(withId(R.id.seat_a1)).perform(ViewActions.click()) + onView(withId(R.id.text_price)).check(matches(withText("0원"))) + } + + private fun withBackgroundColor(@ColorInt color: Int): Matcher { + Checks.checkNotNull(color) + return object : BoundedMatcher(TextView::class.java) { + override fun describeTo(description: Description?) { + description?.appendText("TextView background color : $color") + } + + override fun matchesSafely(item: TextView?): Boolean { + val backgroundColor = item?.background as ColorDrawable + val colorDrawable = ColorDrawable(ContextCompat.getColor(item.context, color)) + return colorDrawable.color == backgroundColor.color + } + } + } +} diff --git a/app/src/androidTest/java/woowacourse/movie/TicketResultActivityTest.kt b/app/src/androidTest/java/woowacourse/movie/TicketResultActivityTest.kt new file mode 100644 index 000000000..17ae0b0d7 --- /dev/null +++ b/app/src/androidTest/java/woowacourse/movie/TicketResultActivityTest.kt @@ -0,0 +1,55 @@ +package woowacourse.movie + +import android.content.Intent +import androidx.test.core.app.ApplicationProvider +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.ext.junit.rules.ActivityScenarioRule +import org.junit.Rule +import org.junit.Test +import woowacourse.movie.activity.seatselect.SeatSelectActivity +import woowacourse.movie.activity.ticketresult.TicketResultActivity +import woowacourse.movie.model.PriceModel +import woowacourse.movie.model.SeatModel +import woowacourse.movie.model.TicketModel +import java.time.LocalDateTime + +class TicketResultActivityTest { + private val ticket = TicketModel( + "해리포터와 마법사의 돌 1", + LocalDateTime.of(2023, 3, 8, 12, 0), + 2, + listOf(SeatModel(0, 0), SeatModel(3, 2)), + PriceModel("25,000") + ) + + private val intent = + Intent(ApplicationProvider.getApplicationContext(), TicketResultActivity::class.java).apply { + putExtra(TicketResultActivity.INFO_KEY, ticket) + } + + @get:Rule + val activityRule = ActivityScenarioRule(intent) + + @Test + fun 영화_제목을_띄운다() { + onView(withId(R.id.text_title)).check(matches(withText("해리포터와 마법사의 돌 1"))) + } + + @Test + fun 상영_시간을_띄운다() { + onView(withId(R.id.text_playing_date)).check(matches(withText("2023.3.8 12:00"))) + } + + @Test + fun 인원_수와_좌석_위치를_띄운다() { + onView(withId(R.id.text_person_count_seats)).check(matches(withText("일반 2명 | A1, D3"))) + } + + @Test + fun 가격을_띄운다() { + onView(withId(R.id.text_price_payment)).check(matches(withText("25,000원 (현장 결제)"))) + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f3fdad144..bcdfc5085 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,6 +11,9 @@ android:supportsRtl="true" android:theme="@style/Theme.Movie" tools:targetApi="31"> + diff --git a/app/src/main/java/woowacourse/movie/activity/moviedetail/DateSpinnerListener.kt b/app/src/main/java/woowacourse/movie/activity/moviedetail/DateSpinnerListener.kt deleted file mode 100644 index 92335007d..000000000 --- a/app/src/main/java/woowacourse/movie/activity/moviedetail/DateSpinnerListener.kt +++ /dev/null @@ -1,21 +0,0 @@ -package woowacourse.movie.activity.moviedetail - -import android.R -import android.view.View -import android.widget.AdapterView -import android.widget.ArrayAdapter -import android.widget.Spinner -import woowacourse.movie.util.getKeyFromIndex -import woowacourse.movie.util.getOrEmptyList -import java.time.LocalDate -import java.time.LocalTime - -class DateSpinnerListener(private val playingTimes: Map>, private val spinnerTime: Spinner) : AdapterView.OnItemSelectedListener { - override fun onItemSelected(adapterView: AdapterView<*>?, view: View?, index: Int, p3: Long) { - val times = playingTimes.getOrEmptyList(playingTimes.getKeyFromIndex(index)) - spinnerTime.adapter = ArrayAdapter(spinnerTime.context, R.layout.simple_spinner_item, times) - } - - override fun onNothingSelected(p0: AdapterView<*>?) { - } -} diff --git a/app/src/main/java/woowacourse/movie/activity/moviedetail/MovieDetailActivity.kt b/app/src/main/java/woowacourse/movie/activity/moviedetail/MovieDetailActivity.kt index 4d88d804e..76c983bca 100644 --- a/app/src/main/java/woowacourse/movie/activity/moviedetail/MovieDetailActivity.kt +++ b/app/src/main/java/woowacourse/movie/activity/moviedetail/MovieDetailActivity.kt @@ -1,5 +1,6 @@ package woowacourse.movie.activity.moviedetail +import android.content.Intent import android.os.Bundle import android.view.MenuItem import android.widget.Spinner @@ -7,24 +8,43 @@ import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import woowacourse.movie.R +import woowacourse.movie.activity.seatselect.SeatSelectActivity import woowacourse.movie.model.MovieModel +import woowacourse.movie.model.ReserveInfoModel import woowacourse.movie.util.getSerializableExtraCompat +import java.time.LocalDateTime class MovieDetailActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_movie_detail) val movie: MovieModel? = intent.getSerializableExtraCompat(MOVIE_KEY) + + val savedCount = savedInstanceState?.getInt(COUNT_KEY) ?: DEFAULT_COUNT + val savedDate = savedInstanceState?.getInt(SPINNER_DATE_KEY) ?: DEFAULT_POSITION + val savedTime = savedInstanceState?.getInt(SPINNER_TIME_KEY) ?: DEFAULT_POSITION + if (movie == null) { Toast.makeText(this, DATA_LOADING_ERROR_MESSAGE, Toast.LENGTH_LONG).show() finish() return } MovieDetailView(findViewById(R.id.layout_detail_info)).set(movie) - ReservationInfoView(findViewById(R.id.layout_reservation_info)).set(savedInstanceState, movie) + ReservationInfoView(findViewById(R.id.layout_reservation_info), ::onClick).set( + savedDate, + savedTime, + savedCount, + movie, + ) supportActionBar?.setDisplayHomeAsUpEnabled(true) } + private fun onClick(title: String, dateTime: LocalDateTime, count: Int) { + val intent = Intent(this, SeatSelectActivity::class.java) + intent.putExtra(SeatSelectActivity.INFO_KEY, ReserveInfoModel(title, dateTime, count)) + startActivity(intent) + } + override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { android.R.id.home -> { @@ -53,5 +73,8 @@ class MovieDetailActivity : AppCompatActivity() { const val COUNT_KEY = "COUNT" const val SPINNER_DATE_KEY = "SPINNER_DATE" const val SPINNER_TIME_KEY = "SPINNER_TIME" + + private const val DEFAULT_COUNT = 1 + private const val DEFAULT_POSITION = 0 } } diff --git a/app/src/main/java/woowacourse/movie/activity/moviedetail/MovieDetailView.kt b/app/src/main/java/woowacourse/movie/activity/moviedetail/MovieDetailView.kt index 0323842b5..c03e730b3 100644 --- a/app/src/main/java/woowacourse/movie/activity/moviedetail/MovieDetailView.kt +++ b/app/src/main/java/woowacourse/movie/activity/moviedetail/MovieDetailView.kt @@ -9,6 +9,12 @@ import java.time.LocalDate import java.time.format.DateTimeFormatter class MovieDetailView(private val viewGroup: ViewGroup) { + private val descriptionView = viewGroup.findViewById(R.id.text_description) + private val runningTimeView = viewGroup.findViewById(R.id.text_running_time) + private val playingDateView = viewGroup.findViewById(R.id.text_playing_date) + private val titleView = viewGroup.findViewById(R.id.text_title) + private val imageView = viewGroup.findViewById(R.id.img_movie) + fun set(movie: MovieModel) { setImageView(movie.image) setTitle(movie.title) @@ -18,26 +24,28 @@ class MovieDetailView(private val viewGroup: ViewGroup) { } private fun setDescription(description: String) { - viewGroup.findViewById(R.id.text_description).text = description + descriptionView.text = description } private fun setRunningTime(runningTime: Int) { - viewGroup.findViewById(R.id.text_running_time).text = viewGroup.context.getString(R.string.running_time, runningTime) + runningTimeView.text = viewGroup.context.getString(R.string.running_time, runningTime) } private fun setPlayingDate(startDate: LocalDate, endDate: LocalDate) { - viewGroup.findViewById(R.id.text_playing_date).text = viewGroup.context.getString( + playingDateView.text = viewGroup.context.getString( R.string.playing_date_range, - DateTimeFormatter.ofPattern(viewGroup.context.getString(R.string.date_format)).format(startDate), - DateTimeFormatter.ofPattern(viewGroup.context.getString(R.string.date_format)).format(endDate) + DateTimeFormatter.ofPattern(viewGroup.context.getString(R.string.date_format)) + .format(startDate), + DateTimeFormatter.ofPattern(viewGroup.context.getString(R.string.date_format)) + .format(endDate), ) } private fun setTitle(title: String) { - viewGroup.findViewById(R.id.text_title).text = title + titleView.text = title } private fun setImageView(image: Int) { - viewGroup.findViewById(R.id.img_movie).setImageResource(image) + imageView.setImageResource(image) } } diff --git a/app/src/main/java/woowacourse/movie/activity/moviedetail/ReservationInfoView.kt b/app/src/main/java/woowacourse/movie/activity/moviedetail/ReservationInfoView.kt index 580a24eef..51896be81 100644 --- a/app/src/main/java/woowacourse/movie/activity/moviedetail/ReservationInfoView.kt +++ b/app/src/main/java/woowacourse/movie/activity/moviedetail/ReservationInfoView.kt @@ -1,33 +1,33 @@ package woowacourse.movie.activity.moviedetail -import android.content.Intent -import android.os.Bundle +import android.view.View import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.AdapterView.OnItemSelectedListener import android.widget.ArrayAdapter import android.widget.Button import android.widget.Spinner import android.widget.TextView import woowacourse.movie.R -import woowacourse.movie.activity.ticketresult.TicketResultActivity -import woowacourse.movie.domain.policy.DiscountPolicies -import woowacourse.movie.domain.ticket.Price -import woowacourse.movie.domain.ticket.Ticket import woowacourse.movie.model.MovieModel -import woowacourse.movie.model.toPresentation import woowacourse.movie.util.getKeyFromIndex import woowacourse.movie.util.getOrEmptyList import java.time.LocalDate +import java.time.LocalDateTime import java.time.LocalTime -class ReservationInfoView(private val viewGroup: ViewGroup) { - - fun set(savedInstanceState: Bundle?, movie: MovieModel) { - val savedCount = savedInstanceState?.getInt(MovieDetailActivity.COUNT_KEY) ?: DEFAULT_COUNT - val savedDate = - savedInstanceState?.getInt(MovieDetailActivity.SPINNER_DATE_KEY) ?: DEFAULT_POSITION - val savedTime = - savedInstanceState?.getInt(MovieDetailActivity.SPINNER_TIME_KEY) ?: DEFAULT_POSITION +class ReservationInfoView( + private val viewGroup: ViewGroup, + private val onClick: (String, LocalDateTime, Int) -> Unit, +) { + private val reserveButton = viewGroup.findViewById