Skip to content

Commit

Permalink
Merge branch 'develop' of https://github.com/team-winey/Winey-AOS int…
Browse files Browse the repository at this point in the history
…o feature/ui-noti-permission-denied-snackbar

# Conflicts:
#	app/src/main/res/values/strings.xml
  • Loading branch information
leeeha committed Feb 4, 2024
2 parents 198a14f + 66ff899 commit ca71962
Show file tree
Hide file tree
Showing 12 changed files with 449 additions and 34 deletions.
10 changes: 7 additions & 3 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -121,13 +121,18 @@ dependencies {
androidTestImplementation(espresso)
}

implementation(MaterialDesignDependencies.materialDesign)

KaptDependencies.run {
kapt(hiltAndroidCompiler)
kapt(hiltWorkManagerCompiler)
}

GoogleDependencies.run {
implementation(materialDesign)
implementation(ossLicense)
implementation(inAppUpdate)
implementation(inAppUpdateKtx)
}

ThirdPartyDependencies.run {
implementation(coil)
implementation(platform(okHttpBom))
Expand All @@ -136,7 +141,6 @@ dependencies {
implementation(retrofit)
implementation(retrofitJsonConverter)
implementation(timber)
implementation(ossLicense)
implementation(progressView)
implementation(balloon)
implementation(lottie)
Expand Down
4 changes: 2 additions & 2 deletions app/release/output-metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 17,
"versionName": "1.0.1",
"versionCode": 23,
"versionName": "1.1.0",
"outputFile": "app-release.apk"
}
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ import android.app.Activity
import android.app.Application
import android.os.Bundle

class ActivityLifecycleHandler(private val application: Application) :
Application.ActivityLifecycleCallbacks {
class ActivityLifecycleHandler : Application.ActivityLifecycleCallbacks {
override fun onActivityCreated(p0: Activity, p1: Bundle?) {
}

Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/org/go/sopt/winey/WineyApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class WineyApplication : Application() {
setupTimber()
setupKakaoSdk()
preventDarkMode()
registerActivityLifecycleCallbacks(ActivityLifecycleHandler(this))
registerActivityLifecycleCallbacks(ActivityLifecycleHandler())
}

private fun setupTimber() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.go.sopt.winey.presentation.splash

import android.os.Bundle
import android.view.View
import org.go.sopt.winey.R
import org.go.sopt.winey.databinding.FragmentAppUpdateDialogBinding
import org.go.sopt.winey.util.binding.BindingDialogFragment

class AppUpdateDialogFragment :
BindingDialogFragment<FragmentAppUpdateDialogBinding>(R.layout.fragment_app_update_dialog) {
private var onUpdateButtonClicked: () -> Unit = {}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
dialog?.setCanceledOnTouchOutside(false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initAppUpdateButtonClickListener()
}

private fun initAppUpdateButtonClickListener() {
binding.btnUpdate.setOnClickListener {
onUpdateButtonClicked.invoke()
dismiss()
}
}

companion object {
fun newInstance(onUpdateButtonClicked: () -> Unit) =
AppUpdateDialogFragment().apply {
this.onUpdateButtonClicked = onUpdateButtonClicked
}
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
package org.go.sopt.winey.presentation.splash

import android.app.Activity
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.view.WindowInsetsController
import androidx.activity.OnBackPressedCallback
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.ViewCompat
import androidx.lifecycle.lifecycleScope
import com.google.android.play.core.appupdate.AppUpdateInfo
import com.google.android.play.core.appupdate.AppUpdateManagerFactory
import com.google.android.play.core.appupdate.AppUpdateOptions
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.delay
import kotlinx.coroutines.flow.firstOrNull
Expand All @@ -19,24 +25,62 @@ import org.go.sopt.winey.presentation.main.MainActivity
import org.go.sopt.winey.presentation.onboarding.guide.GuideActivity
import org.go.sopt.winey.util.binding.BindingActivity
import org.go.sopt.winey.util.context.colorOf
import timber.log.Timber
import javax.inject.Inject

@AndroidEntryPoint
class SplashActivity : BindingActivity<ActivitySplashBinding>(R.layout.activity_splash) {
@Inject
lateinit var dataStoreRepository: DataStoreRepository

private val appUpdateManager by lazy { AppUpdateManagerFactory.create(this) }
private val appUpdateResultLauncher =
registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result ->
if (result.resultCode == RESULT_OK) {
checkAutoLogin()
} else {
// 뒤로가기 또는 X 버튼을 눌러 업데이트가 취소된 경우
Timber.e("Update flow failed! Result code: " + result.resultCode)

// 다시 한번 요청 다이얼로그 띄우기
AppUpdateDialogFragment.newInstance {
checkAppUpdateInfo()
}.show(supportFragmentManager, TAG_APP_UPDATE_DIALOG)
}
}

override fun onCreate(savedInstanceState: Bundle?) {
installSplashScreen()
super.onCreate(savedInstanceState)

registerBackPressedCallback()
setUpStatusBar()
lifecycleScope.launch {
delay(DELAY_TIME)
checkAutoLogin()
showLottieAnimation()
}

override fun onResume() {
super.onResume()

// 백그라운드에서 포그라운드로 돌아왔는데 아직 설치하고 있는 경우
appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo ->
if (appUpdateInfo.updateAvailability()
== UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS
) {
// 즉시 업데이트 다시 요청하기
requestImmediateUpdate(appUpdateInfo)
}
}
}

private fun registerBackPressedCallback() {
val callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
finish()
}
}
onBackPressedDispatcher.addCallback(this, callback)
}

private fun setUpStatusBar() {
// 상태바 색상 변경
window.statusBarColor = colorOf(R.color.black)
Expand All @@ -53,17 +97,47 @@ class SplashActivity : BindingActivity<ActivitySplashBinding>(R.layout.activity_
}
}

private suspend fun checkAutoLogin() {
val accessToken = dataStoreRepository.getAccessToken().firstOrNull()
if (accessToken.isNullOrBlank()) {
navigateTo<GuideActivity>()
} else {
navigateToMainScreen()
private fun showLottieAnimation() {
lifecycleScope.launch {
delay(DELAY_TIME)
checkAppUpdateInfo()
}
}

private fun checkAppUpdateInfo() {
appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo ->
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&
appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)
) {
// 설치 가능한 업데이트 버전이 있고, 즉시 업데이트가 허용된 경우
requestImmediateUpdate(appUpdateInfo)
} else {
checkAutoLogin()
}
}
}

private inline fun <reified T : Activity> navigateTo() {
Intent(this, T::class.java).apply {
private fun requestImmediateUpdate(appUpdateInfo: AppUpdateInfo) {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
appUpdateResultLauncher,
AppUpdateOptions.newBuilder(AppUpdateType.IMMEDIATE).build()
)
}

private fun checkAutoLogin() {
lifecycleScope.launch {
val accessToken = dataStoreRepository.getAccessToken().firstOrNull()
if (accessToken.isNullOrBlank()) {
navigateToGuideScreen()
} else {
navigateToMainScreen()
}
}
}

private fun navigateToGuideScreen() {
Intent(this, GuideActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(this)
}
Expand All @@ -81,8 +155,9 @@ class SplashActivity : BindingActivity<ActivitySplashBinding>(R.layout.activity_
}

companion object {
private const val KEY_FEED_ID = "feedId"
private const val KEY_NOTI_TYPE = "notiType"
private const val KEY_FEED_ID = "feedId"
private const val DELAY_TIME = 1500L
private const val TAG_APP_UPDATE_DIALOG = "APP_UPDATE_DIALOG"
}
}
Loading

0 comments on commit ca71962

Please sign in to comment.