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 단계 영화 티켓 예매 제출합니다. #47

Merged
merged 47 commits into from
Apr 24, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
afc8cca
test: PriceCalculatorTest 생성
hyemdooly Apr 18, 2023
4ca2988
test: TicketTest 수정
hyemdooly Apr 18, 2023
aaace58
refactor: fold를 사용하여 코드 단축
hyemdooly Apr 18, 2023
067af6b
refactor: PlayingDateTimes로 클래스명과 코드 수정
hyemdooly Apr 18, 2023
f5c4730
refactor: package 이동으로 인한 수정
hyemdooly Apr 18, 2023
eeaeb22
refactor: 필요없는 주석 삭제
hyemdooly Apr 18, 2023
d8f91d8
refactor: TicketResultActivity View 세팅 코드 분리
hyemdooly Apr 18, 2023
417aca7
feat: SeatSelectActivity xml 작성
hyemdooly Apr 20, 2023
d9672f2
refactor: DateSpinnerListener 삭제, findViewById 한번만 하도록 수정
hyemdooly Apr 20, 2023
e174e3d
refactor: MovieListItemListener 분리
hyemdooly Apr 20, 2023
debeaca
fix: onItemClickListener -> SelectedListener 수정
hyemdooly Apr 20, 2023
76c0a90
feat: SeatView 구현
hyemdooly Apr 20, 2023
3738630
refactor: Ticket Model 구조 변경
hyemdooly Apr 20, 2023
e892f4b
feat: 좌석 선택 페이지로 넘어가도록 수정
hyemdooly Apr 20, 2023
2c8cc14
feat: 좌석 Grade 클래스 추가
hyemdooly Apr 20, 2023
21c892b
feat: TheaterInfo 생성
hyemdooly Apr 21, 2023
61f7022
feat: SeatSelectSystem 생성
hyemdooly Apr 21, 2023
09e0766
feat: SelectResult Success sead class 생성
hyemdooly Apr 21, 2023
cf52062
refactor: PriceCalculator 리팩토링
hyemdooly Apr 21, 2023
8291de2
feat: PriceSystem 생성
hyemdooly Apr 21, 2023
f4d6e7c
refactor: JUnit4 버전 수정
hyemdooly Apr 21, 2023
cd9c49e
feat: Seat 클래스 생성, seats custom getter 생성
hyemdooly Apr 21, 2023
e351227
refactor: 패키지명 수정
hyemdooly Apr 21, 2023
7ff59f2
feat: 좌석 선택 액티비티 구현
hyemdooly Apr 21, 2023
55df55c
feat: Listener 수정, 자리 선택 액티비티 구현 완료
hyemdooly Apr 21, 2023
025733a
refactor: Ticket 액티비티에서 자리 순서대로 출력하도록 수정
hyemdooly Apr 21, 2023
61c6a5f
refactor: count max값 추가
hyemdooly Apr 21, 2023
29d7245
refactor: PriceModel 구현 및 수정
hyemdooly Apr 22, 2023
a410609
feat: Dialog 구현
hyemdooly Apr 22, 2023
1e294bc
feat: Dialog NegativeButton Listener 추가
hyemdooly Apr 22, 2023
371ec72
refactor: UI 변경 사항 수정
hyemdooly Apr 22, 2023
9c41ac5
test: MovieDetailActivity, SeatSelectActivity UI Test 추가
hyemdooly Apr 22, 2023
21c60b1
test: TicketResultActivity UI Test 추가
hyemdooly Apr 22, 2023
04b076e
feat: ListView -> RecyclerView로 변경
hyemdooly Apr 22, 2023
74fbd10
feat: RecyclerView Ad View 추가
hyemdooly Apr 22, 2023
cc1abcc
refactor: ViewHolder property private 수정
hyemdooly Apr 22, 2023
3b89b78
test: MovieListActivityTest 추가
hyemdooly Apr 22, 2023
ea36840
docs: Update README.md
hyemdooly Apr 22, 2023
aa5050c
refactor: MovieDetailActivityTest 수정
hyemdooly Apr 24, 2023
8a3b1df
refactor: MovieDetailActivityTest 수정
hyemdooly Apr 24, 2023
55c309b
refactor: Listener interface 삭제
hyemdooly Apr 24, 2023
27c24b4
refactor: layoutManager xml에서 지정, View에서 Bundle이 아닌 Data 주입
hyemdooly Apr 24, 2023
03d294e
refactor: ReserveInfoModel 추가 및 수정
hyemdooly Apr 24, 2023
bb03b6a
refactor: sealed class view holder, view type enum class 생성, item들 xm…
hyemdooly Apr 24, 2023
0522cc9
Merge remote-tracking branch 'origin/step4' into step4
hyemdooly Apr 24, 2023
8f35ee7
refactor: 코드 변경에 따른 테스트 수정, 패키지 변경
hyemdooly Apr 24, 2023
9f09fcd
refactor: Log 삭제
hyemdooly Apr 24, 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
refactor: sealed class view holder, view type enum class 생성, item들 xm…
…l 수정
  • Loading branch information
hyemdooly committed Apr 24, 2023
commit bb03b6a3a08078a2fa418a3686bcfd53fb711be9
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ class MovieListActivityTest {
DummyData.movies.forEachIndexed { index, _ ->
if (index != 0 && index % 3 == 0) {
onView(withId(R.id.recycler_view))
.perform(scrollToPosition<MovieListAdapter.ViewHolder>(index))
.perform(scrollToPosition<MovieListAdapter.MovieItemViewHolder>(index))
onView(withId(R.id.img_ad)).check(matches(isDisplayed()))
}
}
Expand All @@ -58,7 +58,7 @@ class MovieListActivityTest {
fun 모든_아이템은_제목을_띄운다() {
dummyDataToPresentation.forEachIndexed { index, movie ->
onView(withId(R.id.recycler_view))
.perform(scrollToPosition<MovieListAdapter.ViewHolder>(index))
.perform(scrollToPosition<MovieListAdapter.MovieItemViewHolder>(index))
.check(matches(hasDescendant(withText(movie.title))))
}
}
Expand All @@ -70,7 +70,7 @@ class MovieListActivityTest {
val text =
"상영일: ${formatter.format(movie.startDate)} ~ ${formatter.format(movie.endDate)}"
onView(withId(R.id.recycler_view))
.perform(scrollToPosition<MovieListAdapter.ViewHolder>(index))
.perform(scrollToPosition<MovieListAdapter.MovieItemViewHolder>(index))
.check(matches(hasDescendant(withText(text))))
}
}
Expand All @@ -80,7 +80,7 @@ class MovieListActivityTest {
dummyDataToPresentation.forEachIndexed { index, movie ->
val text = "러닝타임: ${movie.runningTime}분"
onView(withId(R.id.recycler_view))
.perform(scrollToPosition<MovieListAdapter.ViewHolder>(index))
.perform(scrollToPosition<MovieListAdapter.MovieItemViewHolder>(index))
.check(matches(hasDescendant(withText(text))))
}
}
Expand All @@ -89,7 +89,7 @@ class MovieListActivityTest {
fun 예매_버튼을_누르면_상세_액티비티를_띄운다() {
onView(withId(R.id.recycler_view))
.perform(
actionOnItemAtPosition<MovieListAdapter.ViewHolder>(
actionOnItemAtPosition<MovieListAdapter.MovieItemViewHolder>(
0,
clickChildViewWithId(R.id.btn_reserve),
),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package woowacourse.movie.activity.movielist

import android.view.View
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.DrawableRes
import androidx.recyclerview.widget.RecyclerView
import woowacourse.movie.R
import woowacourse.movie.model.MovieModel
import java.time.format.DateTimeFormatter

sealed class CustomViewHolder(view: View) : RecyclerView.ViewHolder(view) {
Comment on lines +12 to +13

Choose a reason for hiding this comment

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

ViewHolder에 sealed class를 활용하셨네요 👍
CustomViewHolder란 이름은 좀 더 고민해보면 좋겠네요 :)

class MovieItemViewHolder(view: View) : CustomViewHolder(view) {
private val image: ImageView = view.findViewById(R.id.img_movie)
private val title: TextView = view.findViewById(R.id.text_title)
private val playingDate: TextView = view.findViewById(R.id.text_playing_date)
private val runningTime: TextView = view.findViewById(R.id.text_running_time)
private val reserveButton: Button = view.findViewById(R.id.btn_reserve)

fun set(movie: MovieModel, clickListener: View.OnClickListener) {
val context = title.context
image.setImageResource(movie.image)
title.text = movie.title
playingDate.text = context.getString(
R.string.playing_date_range,
DateTimeFormatter.ofPattern(context.getString(R.string.date_format))
.format(movie.startDate),
DateTimeFormatter.ofPattern(context.getString(R.string.date_format))
.format(movie.endDate),
)
runningTime.text = context.getString(R.string.running_time, movie.runningTime)
reserveButton.setOnClickListener(clickListener)
}
}

class AdItemViewHolder(view: View) : CustomViewHolder(view) {
private val image: ImageView = view.findViewById(R.id.img_ad)
fun set(@DrawableRes resId: Int) {
image.setImageResource(resId)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class MovieListActivity : AppCompatActivity() {

val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
val adapter = MovieListAdapter(
3,
DummyData.movies.map { it.toPresentation(R.drawable.img) },
::onClick,
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,81 +1,53 @@
package woowacourse.movie.activity.movielist

import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.View.OnClickListener
import android.view.ViewGroup
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import woowacourse.movie.R
import woowacourse.movie.model.ListViewType
import woowacourse.movie.model.MovieModel
import java.time.format.DateTimeFormatter

class MovieListAdapter(
private val adInterval: Int,
private val movies: List<MovieModel>,
private val onClick: (MovieModel) -> Unit,
) :
RecyclerView.Adapter<MovieListAdapter.ViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return when (viewType) {
AD_VIEWTYPE -> {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.ad_item, parent, false)
ViewHolder(view)
RecyclerView.Adapter<CustomViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {
return when (ListViewType.values()[viewType]) {
ListViewType.AD_VIEWTYPE -> {
Log.d("Type", "AD")
val view = LayoutInflater.from(parent.context).inflate(R.layout.ad_item, parent, false)
CustomViewHolder.AdItemViewHolder(view)
}
else -> {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.movie_item, parent, false)
ViewHolder(view)
Log.d("Type", "MOVIE")
val view = LayoutInflater.from(parent.context).inflate(R.layout.movie_item, parent, false)
CustomViewHolder.MovieItemViewHolder(view)
}
}
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.set(movies[position]) {
onClick(movies[position])
override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
when (holder) {
is CustomViewHolder.AdItemViewHolder -> { // ad item
holder.set(R.drawable.ad)
}
is CustomViewHolder.MovieItemViewHolder -> { // movie item
holder.set(movies[position - ((position + 1) / (adInterval + 1))]) {
onClick(movies[position - ((position + 1) / (adInterval + 1))])
}
}
}
}

override fun getItemViewType(position: Int): Int {
if (position != 0 && position % 3 == 0) {
return AD_VIEWTYPE
}
return NORMAL_VIEWTYPE
return ListViewType.getViewType(adInterval, position).ordinal
}

override fun getItemId(position: Int): Long = position.toLong()

override fun getItemCount(): Int = movies.size

class ViewHolder(view: View) :
RecyclerView.ViewHolder(view) {
private val image: ImageView = view.findViewById(R.id.img_movie)
private val title: TextView = view.findViewById(R.id.text_title)
private val playingDate: TextView = view.findViewById(R.id.text_playing_date)
private val runningTime: TextView = view.findViewById(R.id.text_running_time)
private val reserveButton: Button = view.findViewById(R.id.btn_reserve)

fun set(movie: MovieModel, clickListener: OnClickListener) {
val context = title.context
image.setImageResource(movie.image)
title.text = movie.title
playingDate.text = context.getString(
R.string.playing_date_range,
DateTimeFormatter.ofPattern(context.getString(R.string.date_format))
.format(movie.startDate),
DateTimeFormatter.ofPattern(context.getString(R.string.date_format))
.format(movie.endDate),
)
runningTime.text = context.getString(R.string.running_time, movie.runningTime)
reserveButton.setOnClickListener(clickListener)
}
}

companion object {
private const val AD_VIEWTYPE = 1
private const val NORMAL_VIEWTYPE = 0
}
}
12 changes: 12 additions & 0 deletions app/src/main/java/woowacourse/movie/model/ListViewType.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package woowacourse.movie.model

enum class ListViewType {
AD_VIEWTYPE, NORMAL_VIEWTYPE;

companion object {
fun getViewType(adInterval: Int, position: Int): ListViewType {
if ((position + 1) % (adInterval + 1) == 0) return AD_VIEWTYPE
return NORMAL_VIEWTYPE
}
}
}
1 change: 0 additions & 1 deletion app/src/main/res/layout/ad_item.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,4 @@
android:adjustViewBounds="true"
android:src="@drawable/ad"
/>
<include layout="@layout/movie_item" />
</LinearLayout>
6 changes: 3 additions & 3 deletions app/src/main/res/layout/movie_item.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,15 @@
<TextView
android:id="@+id/text_playing_date"
android:layout_marginTop="10dp"
android:text="상영일: 2024.3.1 ~ 2024.3.31 "
tools:text="상영일: 2024.3.1 ~ 2024.3.31 "
android:textSize="12sp"
android:textColor="@color/black"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<TextView
android:id="@+id/text_running_time"
android:text="러닝타임: 152분"
tools:text="러닝타임: 152분"
android:textSize="12sp"
android:textColor="@color/black"
android:layout_width="wrap_content"
Expand All @@ -54,4 +54,4 @@
android:layout_height="match_parent"
android:text="@string/ticketing_now" />
</LinearLayout>
</LinearLayout>
</LinearLayout>