Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 2 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,8 @@ dependencies {
implementation(libs.androidx.lifecycle.livedata.ktx)

implementation(libs.play.services.base)
implementation(libs.app.update)
implementation(libs.app.update.ktx)

// Firebase
implementation(platform(libs.firebase.bom))
Expand Down
61 changes: 33 additions & 28 deletions app/src/main/java/com/eatssu/android/presentation/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.eatssu.android.presentation


import android.Manifest
import android.annotation.SuppressLint
import android.content.pm.PackageManager
Expand Down Expand Up @@ -47,47 +48,21 @@ class MainActivity : BaseActivity<ActivityMainBinding>(
private val mainViewModel: MainViewModel by viewModels()
private val myPageViewModel: MyPageViewModel by viewModels()


@SuppressLint("SuspiciousIndentation")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

setupNoToolbar()
setNavigation()


checkAlarmPermission()
collectState()
collectUiEvents()
}

private fun setNavigation() {
val navHostFragment = supportFragmentManager
.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
binding.bottomNaviBar.itemIconTintList = null

binding.bottomNaviBar.setOnSingleItemSelectedListener { item ->
when (item.itemId) {
R.id.cafeteria_menu -> {
navController.navigate(R.id.cafeteria_menu)
true
}

R.id.map_menu -> {
navController.navigate(R.id.mapFragment)
true
}

R.id.mypage_menu -> {
navController.navigate(R.id.myPageFragment)
true
}

else -> {
false
}
}
}
}

// set UI --
private fun setupNoToolbar() {
Expand Down Expand Up @@ -198,5 +173,35 @@ class MainActivity : BaseActivity<ActivityMainBinding>(
}


private fun setNavigation() {
val navHostFragment = supportFragmentManager
.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
binding.bottomNaviBar.itemIconTintList = null

binding.bottomNaviBar.setOnSingleItemSelectedListener { item ->
when (item.itemId) {
R.id.cafeteria_menu -> {
navController.navigate(R.id.cafeteria_menu)
true
}

R.id.map_menu -> {
navController.navigate(R.id.mapFragment)
true
}

R.id.mypage_menu -> {
navController.navigate(R.id.myPageFragment)
true
}

else -> {
false
}
}
}
}

override fun shouldLogScreenId() = false
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.eatssu.android.R
import com.eatssu.android.databinding.ActivityIntroBinding
import com.eatssu.android.presentation.MainActivity
import com.eatssu.android.presentation.common.ForceUpdateDialogActivity
Expand All @@ -16,8 +17,15 @@ import com.eatssu.android.presentation.util.startActivity
import com.eatssu.common.EventLogger
import com.eatssu.common.UiEvent
import com.eatssu.common.UiState
import com.eatssu.common.UiText

import com.eatssu.common.enums.LaunchPath
import com.eatssu.common.enums.ScreenId
import com.eatssu.common.enums.ToastType
import com.google.android.play.core.appupdate.AppUpdateManager
import com.google.android.play.core.appupdate.AppUpdateManagerFactory
import com.google.android.play.core.install.model.AppUpdateType
import com.google.android.play.core.install.model.UpdateAvailability
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
Expand All @@ -27,6 +35,8 @@ class IntroActivity : AppCompatActivity() {

private val introViewModel: IntroViewModel by viewModels()
private lateinit var binding: ActivityIntroBinding
private lateinit var appUpdateManager: AppUpdateManager


override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -35,6 +45,8 @@ class IntroActivity : AppCompatActivity() {
setContentView(binding.root)
log()

checkAppUpdate()

observeState()
observeEvents()
observeNetworkError()
Expand Down Expand Up @@ -105,10 +117,68 @@ class IntroActivity : AppCompatActivity() {
override fun onResume() {
super.onResume()
EventLogger.screenView(ScreenId.LOGIN_SPLASH)

if (::appUpdateManager.isInitialized) {
appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo ->
if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
// If an in-app update is already in progress, resume the update.
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
AppUpdateType.IMMEDIATE,
this,
UPDATE_REQUEST_CODE
)
}
}
}
}

private fun showForceUpdateDialog() {
val intent = Intent(this, ForceUpdateDialogActivity::class.java)
startActivity(intent)
}

private fun checkAppUpdate() {
appUpdateManager = AppUpdateManagerFactory.create(this)

val appUpdateInfoTask = appUpdateManager.appUpdateInfo

appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&
appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)
) {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
AppUpdateType.IMMEDIATE,
this,
UPDATE_REQUEST_CODE
)
} else {
introViewModel.startAppChecks()
}
}.addOnFailureListener {
introViewModel.startAppChecks()
}
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)

if (requestCode == UPDATE_REQUEST_CODE) {
if (resultCode != RESULT_OK) {
showToast(
UiEvent.ShowToast(
UiText.StringResource(R.string.toast_app_update_canceled), ToastType.INFO
)
)
// If the update is cancelled or fails,
// you can request to start the update again.
introViewModel.startAppChecks()
Comment on lines +169 to +176
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

high

IMMEDIATE 타입의 인앱 업데이트가 취소되거나 실패했을 때, introViewModel.startAppChecks()를 호출하여 앱의 다음 단계로 진행하는 것은 업데이트의 강제성을 약화시킬 수 있습니다. IMMEDIATE 업데이트는 사용자가 반드시 설치해야 하는 중요한 업데이트에 사용되므로, 사용자가 업데이트를 거부할 경우 앱 사용을 제한하는 것이 일반적입니다.

업데이트를 다시 시도하도록 유도하거나, 앱을 종료하는 것을 고려해 보세요. 예를 들어, finish()를 호출하여 앱을 종료시킬 수 있습니다.

Suggested change
showToast(
UiEvent.ShowToast(
UiText.StringResource(R.string.toast_app_update_canceled), ToastType.INFO
)
)
// If the update is cancelled or fails,
// you can request to start the update again.
introViewModel.startAppChecks()
showToast(
UiEvent.ShowToast(
UiText.StringResource(R.string.toast_app_update_canceled), ToastType.INFO
)
)
// IMMEDIATE 업데이트는 필수적이므로, 사용자가 취소하면 앱을 종료하여 업데이트를 강제하는 것이 좋습니다.
finish()

}
}
}

companion object {
const val UPDATE_REQUEST_CODE = 500
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@ class IntroViewModel @Inject constructor(
private val _versionCheckResult = MutableStateFlow<VersionCheckResult?>(null)
val versionCheckResult: StateFlow<VersionCheckResult?> = _versionCheckResult.asStateFlow()

init {
initializeApp()
}
// init {
// initializeApp()
// }

private fun initializeApp() {
fun startAppChecks() {
viewModelScope.launch {
_uiState.value = UiState.Loading

Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@
<!-- ========================== -->
<string name="toast_app_init_error">앱 초기화 중 오류가 발생했습니다</string>
<string name="toast_app_update_required">앱을 업데이트해주세요</string>
<string name="toast_app_update_canceled">업데이트가 취소되었어요</string>
<string name="toast_partnership_info_not_found">제휴 정보가 없습니다.</string>
<string name="toast_login_failed">로그인에 실패했어요.</string>
<string name="toast_logout_success">로그아웃했어요.</string>
Expand Down
3 changes: 3 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ glanceAppwidgetPreview = "1.1.1"
glancePreview = "1.1.1"
posthog = "3.+"
paging = "3.3.6"
app-update = "2.1.0"

[libraries]

Expand Down Expand Up @@ -141,6 +142,8 @@ firebase-config = { group = "com.google.firebase", name = "firebase-config" }
firebase-crashlytics = { group = "com.google.firebase", name = "firebase-crashlytics" }
firebase-messaging = { group = "com.google.firebase", name = "firebase-messaging" }
play-services-base = { group = "com.google.android.gms", name = "play-services-base", version.ref = "play-services-base" }
app-update = { group = "com.google.android.play", name = "app-update", version.ref = "app-update" }
app-update-ktx = { group = "com.google.android.play", name = "app-update-ktx", version.ref = "app-update" }

# etc
accompanist-appcompat-theme = { group = "com.google.accompanist", name = "accompanist-appcompat-theme", version.ref = "accompanistAppcompatTheme" }
Expand Down