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

feat: 약속 상세 화면 기능 개발 #961

Open
wants to merge 20 commits into
base: develop
Choose a base branch
from
Open

Conversation

kimhm0728
Copy link
Contributor

🚩 연관 이슈

close #958


📝 작업 내용

  • 리스트 adapter 구현 (item_mate / item_invite_code_copy)
  • i 버튼 누르면 팝업
  • API 연결 -> 변경된 API 반영
  • 초대 코드 아이템 클릭 시 복사
  • 약속 참여 시, 약속 아이템 클릭 시 약속 상세 화면으로 이동
  • 약속 나가기 기능 연결
  • 하단 오디/약속 로그 버튼 visible/gone

🏞️ 스크린샷 (선택)

Screen_Recording_20250120_154215.mp4

아직 v2 api merge가 안되어서 임시 데이터 넣어두었어요


🗣️ 리뷰 요구사항 (선택)

변경사항 너무 많을 것 같아서 ui/기능 이슈 쪼갠 건데도 여전히 많네요...
이해 안 되는 부분들 코멘트 주세요~!!

Comment on lines +35 to +49
return ApiResult.Success(
Meeting(
id = 1,
name = "약속 이름",
date = LocalDate.of(2025, 2, 1),
time = LocalTime.of(11, 30),
destinationAddress = "서울특별시 강남구 테헤란로 411 (성담빌딩)",
departureAddress = "서울특별시 송파구 올림픽로 35다길 (한국루터회관)",
departureTime = LocalTime.of(10, 0),
routeTime = 70,
mates = listOf(Mate("올리브1", ""), Mate("올리브2", "")),
inviteCode = "12345",
),
)
// return service.fetchMeeting(meetingId).map { it.toMeeting() }
Copy link
Contributor Author

Choose a reason for hiding this comment

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

DefaultMeetingRepository에서 임시 데이터 넣어두었어요 api merge되면 위 코드 삭제하고 아래 주석 추가할게요!

Comment on lines +71 to +115
override fun toggleDepartureTimeGuide(point: Point) {
val inflater = parentActivity.getSystemService(LAYOUT_INFLATER_SERVICE) as LayoutInflater
val parentViewGroup = parentActivity.findViewById<ViewGroup>(android.R.id.content)
val binding = LayoutDepartureTimeTooltipBinding.inflate(inflater, parentViewGroup, false)
val popupView = binding.root

popupView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)

val adjustedPoint = calculateDepartureTimeGuidePoint(popupView, point)
showPopup(adjustedPoint, popupView, parentActivity.window.decorView)
}

private fun calculateDepartureTimeGuidePoint(
popupView: View,
guideButtonPoint: Point,
): Point {
val popupHeight = popupView.measuredHeight

val guideButtonWidthPixel = GUIDE_BUTTON_WIDTH.toPixel(binding.root.context)
val guideButtonPaddingPixel = GUIDE_BUTTON_PADDING.toPixel(binding.root.context)
val adjustedX = guideButtonPoint.x + guideButtonWidthPixel + guideButtonPaddingPixel
val adjustedY = guideButtonPoint.y - popupHeight + guideButtonPaddingPixel

return Point(adjustedX, adjustedY)
}

private fun showPopup(
point: Point,
popupView: View,
decorView: View,
) {
val popupWindow =
PopupWindow(
popupView,
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
true,
)
popupWindow.showAtLocation(
decorView,
Gravity.NO_GRAVITY,
point.x,
point.y,
)
}
Copy link
Contributor Author

Choose a reason for hiding this comment

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

이 부분이 i 버튼 누르면 tooltip 띄우는 코드입니다
eta 화면에서 ? 버튼 누르면 tooltip 띄우는 코드랑 겹치는 부분이 있어서, 추후 이슈 파서 리팩터링 해볼게요
+ tooltip, guide, popup 네이밍이 혼용되고 있는데 이것도 동일한 이슈에서 해결할게요

Comment on lines +17 to +21
fun isEtaAccessible(): Boolean {
val formatter = DateTimeFormatter.ofPattern(DATE_TIME_PATTERN)
val localDateTime = LocalDateTime.parse(dateTime, formatter)
return localDateTime.minusMinutes(ETA_ACCESSIBLE_MINUTE) <= LocalDateTime.now()
}
Copy link
Contributor Author

Choose a reason for hiding this comment

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

30분 전인 경우에만 eta 화면에 들어갈 수 있도록 "eta 화면에 들어갈 수 있는지 여부"를 나타내는 코드입니다
원래는 isEtaAccessible이 프로퍼티로 선언되었는데, 사용자가 버튼을 누를 시점에 동적으로 판단해야 할 것 같아서 함수로 분리했습니다

Copy link
Contributor

@haeum808 haeum808 left a comment

Choose a reason for hiding this comment

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

늦어서 죄송합니다! 궁금한 점만 있어서 approve 하겠습니다!


fun Int.toPixel(context: Context): Int {
val density = context.resources.displayMetrics.density
return (this * density).toInt()
}

fun View.getPointOnScreen(): Point {
Copy link
Contributor

Choose a reason for hiding this comment

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

apply 쓴 이유가 궁금해요! Point(location[0], location[1]) 이렇게 사용하면 안되나요?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

참고한 코드에서 저렇게 작성했길래 당연히 Point의 생성자로 x, y를 받을 수 없다고 생각했어요 (ㅜㅜ)
그런데 해음이 말한 방법으로도 가능하네요!
수정했습니다 감사해요! e7d3b50

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

feat: 약속 상세 화면 기능 개발
2 participants