Skip to content

Commit

Permalink
Fix : TokenExpiredReceiver 를 NavHost 단이 아닌 Activity 단에서 관리
Browse files Browse the repository at this point in the history
  • Loading branch information
DongChyeon committed Sep 9, 2024
1 parent 14f54ff commit bae05f3
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 56 deletions.
61 changes: 54 additions & 7 deletions app/src/main/java/com/teamwiney/winey/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.teamwiney.winey

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
Expand All @@ -9,7 +12,11 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Surface
import androidx.compose.ui.Modifier
import androidx.core.view.WindowCompat
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.navigation.navOptions
import com.teamwiney.core.common.NetworkMonitor
import com.teamwiney.core.common.WineyAppState
import com.teamwiney.core.common.navigation.AuthDestinations
import com.teamwiney.core.common.rememberWineyAppState
import com.teamwiney.core.common.rememberWineyBottomSheetState
import com.teamwiney.ui.theme.WineyTheme
Expand All @@ -19,33 +26,73 @@ import javax.inject.Inject
@AndroidEntryPoint
class MainActivity : ComponentActivity() {

private var tokenExpiredReceiver: BroadcastReceiver? = null
private var isReceiverRegistered = false

private lateinit var appState: WineyAppState

@Inject
lateinit var networkMonitor: NetworkMonitor

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

val intent = intent
Log.d("DeepLink", "${intent.data}")

// WindowInset 직접 조절하기 위해서
WindowCompat.setDecorFitsSystemWindows(window, false)

// 리시버 등록
registerTokenExpiredReceiver()

setContent {
WineyTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = WineyTheme.colors.background_1
) {
appState = rememberWineyAppState(
networkMonitor = networkMonitor
)
WineyNavHost(
appState = rememberWineyAppState(
networkMonitor = networkMonitor
),
appState = appState,
bottomSheetState = rememberWineyBottomSheetState()
)
}
}
}
}

private fun registerTokenExpiredReceiver() {
if (!isReceiverRegistered) {
val intentFilter = IntentFilter("com.teamwiney.winey.TOKEN_EXPIRED")
tokenExpiredReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
// Handle token expired
appState.showSnackbar("로그인 후 이용해주세요.")
appState.navController.navigate(
AuthDestinations.Login.LOGIN,
navOptions {
popUpTo(AuthDestinations.Login.LOGIN) {
inclusive = true
}
}
)
}
}
LocalBroadcastManager.getInstance(this).registerReceiver(tokenExpiredReceiver!!, intentFilter)
isReceiverRegistered = true
}
}

}
private fun unregisterTokenExpiredReceiver() {
if (isReceiverRegistered && tokenExpiredReceiver != null) {
LocalBroadcastManager.getInstance(this).unregisterReceiver(tokenExpiredReceiver!!)
isReceiverRegistered = false
}
}

override fun onDestroy() {
super.onDestroy()
// 리시버 해제
unregisterTokenExpiredReceiver()
}
}
50 changes: 1 addition & 49 deletions app/src/main/java/com/teamwiney/winey/WineyNavHost.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,13 @@ import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.core.util.Consumer
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.navigation.NavDestination
Expand All @@ -56,39 +55,6 @@ import com.teamwiney.ui.components.BottomNavigationBar
import com.teamwiney.ui.components.BottomNavigationItem
import com.teamwiney.ui.theme.WineyTheme

private var isReceiverRegistered = false

@Composable
fun TokenExpiredBroadcastReceiver(
onExpired: (intent: Intent?) -> Unit
) {
val context = LocalContext.current
val currentOnExpired by rememberUpdatedState(onExpired)

DisposableEffect(context) {
val intentFilter = IntentFilter("com.teamwiney.winey.TOKEN_EXPIRED")
val broadcast = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
currentOnExpired(intent)
}
}

if (!isReceiverRegistered) {
LocalBroadcastManager.getInstance(context).registerReceiver(broadcast, intentFilter)
isReceiverRegistered = true
Log.d("debugging", "리시버 부착")
}

onDispose {
if (isReceiverRegistered) {
LocalBroadcastManager.getInstance(context).unregisterReceiver(broadcast)
isReceiverRegistered = false
Log.d("debugging", "리시버 부착 해제")
}
}
}
}

@OptIn(ExperimentalMaterialApi::class)
@Composable
fun WineyNavHost(
Expand All @@ -108,20 +74,6 @@ fun WineyNavHost(
}
}

TokenExpiredBroadcastReceiver { intent ->
if (intent?.action == "com.teamwiney.winey.TOKEN_EXPIRED") {
appState.showSnackbar("토큰이 만료되었습니다. 다시 로그인해주세요.")
appState.navController.navigate(
AuthDestinations.Login.LOGIN,
navOptions {
popUpTo(AuthDestinations.Login.LOGIN) {
inclusive = true
}
}
)
}
}

ModalBottomSheetLayout(
sheetContent = {
bottomSheetState.bottomSheetContent.value?.invoke(this)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import kotlinx.coroutines.launch
fun rememberWineyAppState(
networkMonitor: NetworkMonitor,
isMapDetail: MutableState<Boolean> = mutableStateOf(false),
isLoggedIn: MutableState<Boolean> = mutableStateOf(false),
navController: NavHostController = rememberNavController(),
scaffoldState: ScaffoldState = rememberScaffoldState(),
scope: CoroutineScope = rememberCoroutineScope(),
Expand All @@ -39,6 +40,7 @@ fun rememberWineyAppState(
WineyAppState(
networkMonitor,
isMapDetail,
isLoggedIn,
navController,
scaffoldState,
scope,
Expand All @@ -51,6 +53,7 @@ fun rememberWineyAppState(
class WineyAppState(
networkMonitor: NetworkMonitor,
val isMapDetail: MutableState<Boolean>,
val isLoggedIn: MutableState<Boolean>,
val navController: NavHostController,
val scaffoldState: ScaffoldState,
val scope: CoroutineScope,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.util.Log
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
Expand Down Expand Up @@ -63,6 +64,8 @@ fun ColumnScope.WineShopDetail(
)
}&appname=com.teamwiney.winey"

Log.d("WineShopDetail", "url: $url");

val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
intent.addCategory(Intent.CATEGORY_BROWSABLE)

Expand Down

0 comments on commit bae05f3

Please sign in to comment.