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

부산대 Android_이지은 6주차 2단계 #59

Open
wants to merge 15 commits into
base: jieunyume
Choose a base branch
from

Conversation

JieunYume
Copy link

@JieunYume JieunYume commented Aug 1, 2024

실행 화면

백그라운드 알림

6.-.mp4

포그라운드 알림

6.-.mp4

어려웠던 점

  • 강의 자료와 공식 문서에 잘 정리된 코드가 있어서 어려움은 없었다.
  • 구현 후 알림이 딱 왔을 때 기분이 좋았다ㅎㅎ

중점적으로 봐주셨으면 하는 부분

SERVICE_STATE = "serviceState"
SERVICE_MESSAGE = "serviceMessage"

저는 이 상수들을 혹시나 보안과 조금이라도 관련있을까봐 local.properties에 저장해두고 BuildConfig 로 가져와서 사용했는데, 로컬 말고 strings.xml 파일에 넣어서 사용해도 되는 친구들일까요?

Copy link

@bigstark bigstark left a comment

Choose a reason for hiding this comment

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

지난 6주동안 수고 많으셨어요 지은님! 1주차부터 지금까지 주차를 거듭하면서 안드로이드에 더욱 많은 관심이 생겼다고 하니 제가 뭔가 모를 뿌듯함을 느끼게 됩니다. ㅎㅎ

멘토링 때 말씀드렸던 것처럼 사이드 프로젝트와 best practices, 공식문서 등을 통해서 학습하신다면 더욱 더 성장하실 수 있을 것 같습니다 :)


파이어베이스 Remote Config를 설정하는 부분에서 MVVM을 잘 지켰는지 확인 부탁드립니다.

remote config 를 직접적으로 넘기기 보다는 isOnService 자체를 구독하는 편이 좋을 것 같아요. Observer pattern 을 사용하시는 것에 조금 더 익숙해지시면 와닿을 것 같네요!

Splash Screen 라이브러리를 사용하려다가 서버 에러메세지 TextView를 띄우기가 복잡하여서 SplashActivity 를 새로 만들었습니다. Splash Screen 라이브러리를 사용하면서 Splash 화면을 Custom할 수 있는 방법이 혹시 있는지 궁금합니다.

이 문서를 확인해보시면 좋을 것 같네요 👍

저는 이 상수들을 혹시나 보안과 조금이라도 관련있을까봐 local.properties에 저장해두고 BuildConfig 로 가져와서 사용했는데, 로컬 말고 strings.xml 파일에 넣어서 사용해도 되는 친구들일까요?

local properties 에서 관리해도 좋고, strings.xml 에서 관리되어도 좋아요. 해당 key value 는 flavor 에 따라 변경될 일도 없기 때문에 어디에서 관리되든 괜찮습니다 :)

Comment on lines +19 to +42
@Singleton
@Provides
fun provideFirebaseRemoteConfig(): FirebaseRemoteConfig {
val remoteConfig = Firebase.remoteConfig
return initRemoteConfig(remoteConfig)
}

fun initRemoteConfig(remoteConfig: FirebaseRemoteConfig): FirebaseRemoteConfig {
val configSettings = remoteConfigSettings {
minimumFetchIntervalInSeconds = 0 // 바로바로 가져옴
}
remoteConfig.setConfigSettingsAsync(configSettings)
remoteConfig.fetchAndActivate()
.addOnCompleteListener {
if (it.isSuccessful) {
Log.d("jieun", "Successful ${it.result}")
} else {
Log.d("jieun", "Failed ${it.result}")
}
}.addOnFailureListener {
Log.d("jieun", "Exception ${it.message}")
}
return remoteConfig
}
Copy link

Choose a reason for hiding this comment

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

apply 나 also 를 적절하게 사용하면 좋습니다!

Suggested change
@Singleton
@Provides
fun provideFirebaseRemoteConfig(): FirebaseRemoteConfig {
val remoteConfig = Firebase.remoteConfig
return initRemoteConfig(remoteConfig)
}
fun initRemoteConfig(remoteConfig: FirebaseRemoteConfig): FirebaseRemoteConfig {
val configSettings = remoteConfigSettings {
minimumFetchIntervalInSeconds = 0 // 바로바로 가져옴
}
remoteConfig.setConfigSettingsAsync(configSettings)
remoteConfig.fetchAndActivate()
.addOnCompleteListener {
if (it.isSuccessful) {
Log.d("jieun", "Successful ${it.result}")
} else {
Log.d("jieun", "Failed ${it.result}")
}
}.addOnFailureListener {
Log.d("jieun", "Exception ${it.message}")
}
return remoteConfig
}
@Singleton
@Provides
fun provideFirebaseRemoteConfig(): FirebaseRemoteConfig {
return Firebase.remoteConfig.apply {
initRemoteConfig(this)
}
}
fun initRemoteConfig(remoteConfig: FirebaseRemoteConfig) {
val configSettings = remoteConfigSettings {
minimumFetchIntervalInSeconds = 0 // 바로바로 가져옴
}
remoteConfig.setConfigSettingsAsync(configSettings)
remoteConfig.fetchAndActivate()
.addOnCompleteListener {
if (it.isSuccessful) {
Log.d("jieun", "Successful ${it.result}")
} else {
Log.d("jieun", "Failed ${it.result}")
}
}.addOnFailureListener {
Log.d("jieun", "Exception ${it.message}")
}
}

Comment on lines +43 to +49
Handler(Looper.getMainLooper()).postDelayed({
// 일정 시간이 지나면 MapActivity로 이동
val intent = Intent(this, MapActivity::class.java)
startActivity(intent)
finish()

}, 1000)
Copy link

Choose a reason for hiding this comment

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

coroutine 도 사용할 수 있으니, coroutine 을 통해서 delay 하는 것이 어떨까요?!

Comment on lines +11 to +16
fun getRemoteConfig(): RemoteConfig {
return RemoteConfig(
serviceState = firebaseRemoteConfig.getString(BuildConfig.SERVICE_STATE),
serviceMessage = firebaseRemoteConfig.getString(BuildConfig.SERVICE_MESSAGE)
)
}
Copy link

Choose a reason for hiding this comment

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

첫 실행시 firebase remote config 가 default 값으로 처리되거나 빈값으로 내려올 것 같아요. remote config fetch 를 해오는 메소드를 추가해보면 어떨까요?

val remoteConfigLiveData: LiveData<RemoteConfig> get() = _remoteConfigLiveData

init {
_remoteConfigLiveData.value = remoteConfigRepository.getRemoteConfig()
Copy link

Choose a reason for hiding this comment

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

이 때 FirebaseRemoteConfig 가 초기화 되어있지 않다면 무조건 빈 값으로 내려올 거에요. 그렇게 되면 isOnService 가 false 를 내려보내줄 수 있어요.

Comment on lines +17 to +18
private val _remoteConfigLiveData = MutableLiveData<RemoteConfig>()
val remoteConfigLiveData: LiveData<RemoteConfig> get() = _remoteConfigLiveData
Copy link

Choose a reason for hiding this comment

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

coroutine 도 사용하시니, LiveData 대신 StateFlow 를 사용해보시는 것은 어떨까요?

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

Successfully merging this pull request may close these issues.

2 participants