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

add CountDownTimer in CameraViewmodel #9 #56

Merged
merged 3 commits into from
Oct 6, 2024

Conversation

ing03201
Copy link
Member

@ing03201 ing03201 commented Oct 5, 2024

[Issue] #9

[Descriptions]

  • 5초 타이머 4번 반복
  • 타이머 progressBar 주의 문구 위에 지정
  • capture Count 하단 변경

image

@ing03201 ing03201 requested review from DokySp and fetiu October 5, 2024 08:08
Copy link
Member

@DokySp DokySp left a comment

Choose a reason for hiding this comment

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

고생 많았습니다~

import javax.inject.Inject

@HiltViewModel
class CameraViewModel @Inject constructor(
): ViewModel() {
// TODO: add viewmodel code here
private val _progressState = mutableFloatStateOf(1f)
val progressState: Float by _progressState
Copy link
Member

Choose a reason for hiding this comment

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

Float by _progressState 이 부분이 이해가 잘 안되는데요,
혹시 코드 설명 부탁드려도 될까요?

Copy link
Member Author

Choose a reason for hiding this comment

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

촬영할때 LinearProgressbar를 두어 촬영 타이머가 얼만큼 됐는지 확인하는 작업을했습니다
해당부분은 그 progressbar의 state를 조정하기위함입니다

Copy link
Member

Choose a reason for hiding this comment

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

재질문: progressbar의 state를 조정하기 위해 사용된 것은 알겠습니다. 질문의 요지는 by 키워드를 사용해서 progressState를 초기화했는데 그 부분의 의도가 궁금해서 물어봤습니다.

Copy link
Member Author

Choose a reason for hiding this comment

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

by 키워드를 사용하지 않을경우 MutableFloatState에 대한 내용으로 정의되기때문에

@Suppress(names = {"NOTHING_TO_INLINE"})
public inline operator fun FloatState.getValue(
    thisObj: Any?,
    property: KProperty<*>
): Float

로 정의되어있는 내용을 불러오기 위해 by 키워드를 사용했습니다

Copy link
Member

Choose a reason for hiding this comment

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

이해했습니다. 설명 감사합니다 ㅎㅎ

@@ -49,7 +61,15 @@ fun CameraScreen(
// tint = MaterialTheme.colorScheme.primary
// )
// }

LinearProgressIndicator(
progress = { viewModel.progressState },
Copy link
Member

Choose a reason for hiding this comment

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

질문: viewModel.progressState가 Flow가 아니라 Float로 보입니다.
Flow를 구독하는 것이 아니라 직접 값을 변경하여 구현한 이유가 궁금합니다 😄

Copy link
Member Author

Choose a reason for hiding this comment

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

Flow를 구독하여 사용하기엔 Timer의 onTick에 따라 동기적으로 동작해야할거같아 State를 사용했습니다

Copy link
Member

Choose a reason for hiding this comment

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

flow를 구독하여 구현해도 충분히 동기적으로 구현될 것 같습니다. timer에서 원하는 시점에 flow 변수를 emit해주면 ui가 상태변화에 맞춰 반응할 것 같은데요, 동기/비동기가 사유라면 flow로 구현하는게 맞을 것 같습니다.

만약 지금 구현하는것이 시간적으로 애매하다면 // TODO 주석 부탁합니다~

Copy link
Member Author

Choose a reason for hiding this comment

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

넵 확인하였고 TODO 주석 처리하였습니다

viewModel.startCaptureTimer()
mjpegView?.startStream()
}
LifecycleEventEffect(Lifecycle.Event.ON_STOP) {
Copy link
Member

Choose a reason for hiding this comment

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

LifecycleStartEffect, LifecycleResumeEffect, DisposableEffect 도 있는 것 같네요
나중에 참고해보면 좋을 것 같아요 ㅎㅎ
https://wannabe-master.tistory.com/6

Copy link
Member Author

Choose a reason for hiding this comment

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

넵 참고하겠습니다

fontWeight = FontWeight.Bold,
fontSize = 24.sp,
)
}
LifecycleEventEffect(Lifecycle.Event.ON_START) {
Copy link
Member

Choose a reason for hiding this comment

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

질문: 해당 Lifecycle이 activity의 생명주기에 트리거되는 것인지, CameraScreen에 트리거되는 것인지 궁금합니다. 만약 activity의 생명주기를 따라간다면 의도대로 동작하지 않을 것으로 보입니다 ㅎㅎ

Copy link
Member

Choose a reason for hiding this comment

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

참고. ChatGPT

LifecycleEventEffect(Lifecycle.Event.ON_RESUME)가 CameraScreen() 안에 있을 때, 이 코드가 따르는 생명주기는 CameraScreen의 생명주기입니다. 이 생명주기는 CameraScreen이 포함된 컴포저블의 생명주기를 따르며, 컴포저블이 재구성(recomposition)되거나 화면에서 제거되었을 때 해당 이벤트도 영향을 받습니다.

하지만, CameraScreen이 액티비티 전체의 일부로 존재하므로, LifecycleEventEffect가 감지하는 실제 생명주기 이벤트는 CameraScreen이 포함된 컴포저블의 LifecycleOwner를 기반으로 동작하게 됩니다. 대부분의 경우, 이는 액티비티나 프래그먼트의 생명주기를 반영하게 됩니다.

즉, 만약 CameraScreen이 특정 화면이나 탭과 연결되어 있다면 해당 화면이나 탭의 생명주기를 따를 수 있으며, LifecycleOwner에 따라 다소 달라질 수 있습니다.

따라서 정확하게는, CameraScreen을 포함한 컴포저블이 언제 렌더링되고 언제 사라지느냐에 따라 생명주기가 결정되며, 액티비티의 생명주기를 따르는 것은 아닙니다.

Copy link
Member Author

Choose a reason for hiding this comment

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

Screen이 onStart일때, Screen의 구성요소를 구성하는 부분이기 때문에 Timer를 먼저 정의하는 작업부터 해야했습니다.

Copy link
Member Author

Choose a reason for hiding this comment

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

onResume의 경우 start 이후, 혹은 activity가 꺼지지않고 다른activity로 옮겨갔다가 다시 왔을경우 create를 실행하지않고 resume을 실행됩니다.
현재 해당 설명의 경우 화면이 재구성되는 가짓수를 이야기되어야하는데 pause와 stop의 경우가 해당되는 경우입니다

Copy link
Member

Choose a reason for hiding this comment

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

재질문: 음... 답변이 이해가 잘 되지 않는데요, 질문의 요지는 LifecycleEventEffect() 함수의 생명주기가 Activity를 기준으로 하는지 Screen을 기준으로 하는지 알고싶었다는 것입니다.

Copy link
Member Author

Choose a reason for hiding this comment

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

LifecycleEventEffect()는 Screen 기준으로 진행됩니다

@@ -49,7 +61,15 @@ fun CameraScreen(
// tint = MaterialTheme.colorScheme.primary
Copy link
Member

Choose a reason for hiding this comment

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

#29 이슈를 분리하여 PR 올릴 계획인가요?
만약 그렇다면 다음 PR에서 위에 주석 부분은 ui 가이드 확인 후 삭제하면 좋을 것 같습니다.

Copy link
Member Author

Choose a reason for hiding this comment

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

넵 이슈 분리하여 작업하려합니다
해당 주석부분 삭제하겠습니다

@@ -49,7 +61,15 @@ fun CameraScreen(
// tint = MaterialTheme.colorScheme.primary
// )
// }

LinearProgressIndicator(
progress = { viewModel.progressState },
Copy link
Member

Choose a reason for hiding this comment

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

flow를 구독하여 구현해도 충분히 동기적으로 구현될 것 같습니다. timer에서 원하는 시점에 flow 변수를 emit해주면 ui가 상태변화에 맞춰 반응할 것 같은데요, 동기/비동기가 사유라면 flow로 구현하는게 맞을 것 같습니다.

만약 지금 구현하는것이 시간적으로 애매하다면 // TODO 주석 부탁합니다~

fontWeight = FontWeight.Bold,
fontSize = 24.sp,
)
}
LifecycleEventEffect(Lifecycle.Event.ON_START) {
Copy link
Member

Choose a reason for hiding this comment

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

재질문: 음... 답변이 이해가 잘 되지 않는데요, 질문의 요지는 LifecycleEventEffect() 함수의 생명주기가 Activity를 기준으로 하는지 Screen을 기준으로 하는지 알고싶었다는 것입니다.

import javax.inject.Inject

@HiltViewModel
class CameraViewModel @Inject constructor(
): ViewModel() {
// TODO: add viewmodel code here
private val _progressState = mutableFloatStateOf(1f)
val progressState: Float by _progressState
Copy link
Member

Choose a reason for hiding this comment

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

재질문: progressbar의 state를 조정하기 위해 사용된 것은 알겠습니다. 질문의 요지는 by 키워드를 사용해서 progressState를 초기화했는데 그 부분의 의도가 궁금해서 물어봤습니다.

@ing03201 ing03201 requested a review from DokySp October 6, 2024 10:45
Copy link
Member

@DokySp DokySp left a comment

Choose a reason for hiding this comment

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

고생 많았습니다! 👍👍

import javax.inject.Inject

@HiltViewModel
class CameraViewModel @Inject constructor(
): ViewModel() {
// TODO: add viewmodel code here
private val _progressState = mutableFloatStateOf(1f)
val progressState: Float by _progressState
Copy link
Member

Choose a reason for hiding this comment

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

이해했습니다. 설명 감사합니다 ㅎㅎ

@ing03201 ing03201 merged commit 3cb9667 into FoKE-Developers:main Oct 6, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature/UI feature-ui New Implementation New feature
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants