Skip to content
Open
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
20 changes: 9 additions & 11 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,7 @@
<activity
android:name=".presentation.splash.SplashActivity"
android:exported="true"
android:theme="@style/Theme.Festabook.Splash">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
android:theme="@style/Theme.Festabook.Splash" />

<activity
android:name=".presentation.explore.ExploreActivity"
Expand All @@ -43,19 +38,22 @@
android:name=".presentation.main.MainActivity"
android:exported="true"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi, LockedOrientationActivity" />
tools:ignore="DiscouragedApi, LockedOrientationActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".presentation.placeDetail.PlaceDetailActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi, LockedOrientationActivity">
</activity>
tools:ignore="DiscouragedApi, LockedOrientationActivity" />
<activity
android:name=".presentation.error.ErrorActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi, LockedOrientationActivity">
</activity>
tools:ignore="DiscouragedApi, LockedOrientationActivity" />

<service
android:name=".service.MyFirebaseMessagingService"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.daedan.festabook.presentation

import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.compose.NavHost
import com.daedan.festabook.logging.DefaultFirebaseLogger
import com.daedan.festabook.presentation.explore.ExploreViewModel
import com.daedan.festabook.presentation.explore.navigation.exploreNavGraph
import com.daedan.festabook.presentation.main.FestabookRoute
import com.daedan.festabook.presentation.main.MainViewModel
import com.daedan.festabook.presentation.main.navigation.mainNavGraph
import com.daedan.festabook.presentation.main.rememberFestabookNavigator
import com.daedan.festabook.presentation.news.NewsViewModel
import com.daedan.festabook.presentation.placeDetail.PlaceDetailViewModel
import com.daedan.festabook.presentation.setting.SettingViewModel
import com.daedan.festabook.presentation.splash.AppVersionManager
import com.daedan.festabook.presentation.splash.SplashViewModel
import com.daedan.festabook.presentation.splash.navigation.splashNavGraph
import com.naver.maps.map.util.FusedLocationSource

@Composable
fun FestabookScreen(
appVersionManager: AppVersionManager,
notificationPermissionManager: NotificationPermissionManager,
placeDetailViewModelFactory: PlaceDetailViewModel.Factory,
defaultViewModelFactory: ViewModelProvider.Factory,
locationSource: FusedLocationSource,
logger: DefaultFirebaseLogger,
modifier: Modifier = Modifier,
newsViewModel: NewsViewModel = viewModel(),
mainViewModel: MainViewModel = viewModel(),
settingViewModel: SettingViewModel = viewModel(),
splashViewModel: SplashViewModel = viewModel(),
exploreViewModel: ExploreViewModel = viewModel(),
) {
val festabookNavigator = rememberFestabookNavigator()

NavHost(
modifier = modifier,
startDestination = festabookNavigator.startRoute,
navController = festabookNavigator.navController,
) {
splashNavGraph(
viewModel = splashViewModel,
appVersionManager = appVersionManager,
onNavigateToExplore = { festabookNavigator.navigate(FestabookRoute.Explore) },
onNavigateToMain = { festabookNavigator.navigate(FestabookRoute.Main) },
onFinishApp = { festabookNavigator.popBackStack() },
)
exploreNavGraph(
viewModel = exploreViewModel,
onBackClick = { festabookNavigator.popBackStack() },
onNavigateToMain = { festabookNavigator.navigate(FestabookRoute.Main) },
)
mainNavGraph(
placeDetailViewModelFactory = placeDetailViewModelFactory,
defaultViewModelFactory = defaultViewModelFactory,
notificationPermissionManager = notificationPermissionManager,
locationSource = locationSource,
logger = logger,
onSubscriptionConfirm = { festabookNavigator.navigate(FestabookRoute.Main) },
festabookNavigator = festabookNavigator,
settingViewModel = settingViewModel,
mainViewModel = mainViewModel,
newsViewModel = newsViewModel,
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.daedan.festabook.presentation.explore.navigation

import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import com.daedan.festabook.presentation.explore.ExploreViewModel
import com.daedan.festabook.presentation.explore.component.ExploreScreen
import com.daedan.festabook.presentation.main.FestabookRoute

fun NavGraphBuilder.exploreNavGraph(
viewModel: ExploreViewModel,
Copy link
Contributor

Choose a reason for hiding this comment

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

홈에서 탐색화면으로 이동할 때, 검색창에 첫 진입 시 입력한 내용이 남아있습니다.

  • 기존에 어디서 탐색화면으로 접근하는 지에 따라, 초기진입 용 탐색화면후 진입용 탐색화면으로 나누었었는데요. 지금은 초기 진입용 탐색화면만 뜨는 것 같습니다.

혹시 이 부분은 어떻게 처리하는 게 좋을까요?

onBackClick: () -> Unit,
onNavigateToMain: () -> Unit,
) {
composable<FestabookRoute.Explore> {
ExploreScreen(
viewModel = viewModel,
onBackClick = onBackClick,
onNavigateToMain = { onNavigateToMain() },
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import androidx.navigation.navOptions

class FestabookNavigator(
val navController: NavHostController,
val startRoute: FestabookRoute = FestabookRoute.Splash,
) {
private val currentDestination
@Composable
Expand All @@ -36,8 +37,6 @@ class FestabookNavigator(
currentDestination?.hasRoute(it::class) ?: false
} != null

val startRoute = MainTabRoute.Home // TODO: Splash와 Explore 연동 시 변경

fun navigateToMainTab(tab: FestabookMainTab) {
navController.navigate(
tab.route,
Expand Down Expand Up @@ -74,9 +73,9 @@ class FestabookNavigator(
}

@Composable
fun rememberFestabookNavigator(): FestabookNavigator {
fun rememberFestabookNavigator(startRoute: FestabookRoute = FestabookRoute.Splash): FestabookNavigator {
val navController = rememberNavController()
return remember {
FestabookNavigator(navController = navController)
FestabookNavigator(navController = navController, startRoute = startRoute)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ sealed interface FestabookRoute {

@Serializable
data object Explore : FestabookRoute

@Serializable
data object Main : FestabookRoute
}

@Serializable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,16 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.lifecycle.ViewModelProvider
import com.daedan.festabook.R
import com.daedan.festabook.di.appGraph
import com.daedan.festabook.presentation.FestabookScreen
import com.daedan.festabook.presentation.NotificationPermissionManager
import com.daedan.festabook.presentation.NotificationPermissionRequester
import com.daedan.festabook.presentation.common.isGranted
import com.daedan.festabook.presentation.common.showNotificationDeniedSnackbar
import com.daedan.festabook.presentation.explore.ExploreActivity
import com.daedan.festabook.presentation.main.component.MainScreen
import com.daedan.festabook.presentation.news.NewsViewModel
import com.daedan.festabook.presentation.placeDetail.PlaceDetailViewModel
import com.daedan.festabook.presentation.setting.SettingViewModel
import com.daedan.festabook.presentation.splash.AppVersionManager
import com.daedan.festabook.presentation.splash.SplashViewModel
import com.daedan.festabook.presentation.theme.FestabookTheme
import com.naver.maps.map.util.FusedLocationSource
import dev.zacsweers.metro.Inject
Expand All @@ -40,10 +41,15 @@ class MainActivity :
@Inject
private lateinit var notificationPermissionManagerFactory: NotificationPermissionManager.Factory

@Inject
private lateinit var appVersionManagerFactory: AppVersionManager.Factory

private val mainViewModel: MainViewModel by viewModels()
private val newsViewModel: NewsViewModel by viewModels()
private val settingViewModel: SettingViewModel by viewModels()

private val splashViewModel: SplashViewModel by viewModels()

private val notificationPermissionManager by lazy {
notificationPermissionManagerFactory.create(
requester = this,
Expand All @@ -52,10 +58,23 @@ class MainActivity :
)
}

private val updateResultLauncher =
registerForActivityResult(
ActivityResultContracts.StartIntentSenderForResult(),
) { result ->
if (result.resultCode == RESULT_OK) {
splashViewModel.handleVersionCheckResult(Result.success(false))
} else {
splashViewModel.handleVersionCheckResult(Result.failure(Exception("Update failed")))
}
}

private val locationSource by lazy {
FusedLocationSource(this, LOCATION_PERMISSION_REQUEST_CODE)
}

private val appVersionManager by lazy { appVersionManagerFactory.create(updateResultLauncher) }

override val permissionLauncher: ActivityResultLauncher<String> =
registerForActivityResult(
ActivityResultContracts.RequestPermission(),
Expand Down Expand Up @@ -86,25 +105,19 @@ class MainActivity :
}

FestabookTheme {
MainScreen(
FestabookScreen(
notificationPermissionManager = notificationPermissionManager,
logger = appGraph.defaultFirebaseLogger,
locationSource = locationSource,
placeDetailViewModelFactory = viewModelFactory,
onAppFinish = { finish() },
onSubscriptionConfirm = {
notificationPermissionManager.requestNotificationPermission(this)
},
onNavigateToExplore = {
startActivity(ExploreActivity.newIntent(this))
},
appVersionManager = appVersionManager,
defaultViewModelFactory = defaultViewModelProviderFactory,
)
}
}
mainViewModel.registerDeviceAndFcmToken()
}

// TODO SnackBarHost로 변경
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
Expand Down
Copy link
Contributor

Choose a reason for hiding this comment

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

홈화면에서 탐색화면에서 새로운 축제로 접근했을 때, 첫 방문 알림 설정 다이얼로그가 뜨지 않습니다.

Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.input.pointer.PointerEventPass
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.compose.NavHost
import com.daedan.festabook.R
import com.daedan.festabook.logging.DefaultFirebaseLogger
Expand All @@ -26,6 +25,7 @@ import com.daedan.festabook.presentation.home.navigation.homeNavGraph
import com.daedan.festabook.presentation.main.FestabookMainTab
import com.daedan.festabook.presentation.main.FestabookNavigator
import com.daedan.festabook.presentation.main.FestabookRoute
import com.daedan.festabook.presentation.main.MainTabRoute
import com.daedan.festabook.presentation.main.MainViewModel
import com.daedan.festabook.presentation.main.rememberFestabookNavigator
import com.daedan.festabook.presentation.news.NewsViewModel
Expand All @@ -50,23 +50,22 @@ fun MainScreen(
placeDetailViewModelFactory: PlaceDetailViewModel.Factory,
onAppFinish: () -> Unit,
onSubscriptionConfirm: () -> Unit,
onNavigateToExplore: () -> Unit, // TODO 검색화면 마이그레이션 시 제거
festabookNavigator: FestabookNavigator,
mainViewModel: MainViewModel,
homeViewModel: HomeViewModel,
scheduleViewModel: ScheduleViewModel,
placeMapViewModel: PlaceMapViewModel,
newsViewModel: NewsViewModel,
settingViewModel: SettingViewModel,
modifier: Modifier = Modifier,
mainViewModel: MainViewModel = viewModel(),
homeViewModel: HomeViewModel = viewModel(),
scheduleViewModel: ScheduleViewModel = viewModel(),
placeMapViewModel: PlaceMapViewModel = viewModel(),
newsViewModel: NewsViewModel = viewModel(),
settingViewModel: SettingViewModel = viewModel(),
) {
val navigator = rememberFestabookNavigator()
val mainNavigator = rememberFestabookNavigator(MainTabRoute.Home)
val snackbarHostState = remember { SnackbarHostState() }
val snackbarManager = rememberAppSnackbarManager(snackbarHostState)
val backPressExitMessage = stringResource(R.string.back_press_exit_message)
val noticeEnabledMessage = stringResource(R.string.setting_notice_enabled)

ObserveAsEvents(flow = mainViewModel.navigateNewsEvent) {
navigator.navigateToMainTab(FestabookMainTab.NEWS)
mainNavigator.navigateToMainTab(FestabookMainTab.NEWS)
}
ObserveAsEvents(flow = mainViewModel.backPressEvent) { isDoublePress ->
if (isDoublePress) {
Expand All @@ -76,7 +75,7 @@ fun MainScreen(
}
}
ObserveAsEvents(flow = homeViewModel.navigateToScheduleEvent) {
navigator.navigateToMainTab(FestabookMainTab.SCHEDULE)
mainNavigator.navigateToMainTab(FestabookMainTab.SCHEDULE)
}

BackHandler {
Expand All @@ -89,10 +88,10 @@ fun MainScreen(
}
},
bottomBar = {
if (navigator.shouldShowBottomBar) {
if (mainNavigator.shouldShowBottomBar) {
FestabookBottomNavigationBar(
currentTab = navigator.currentTab,
onTabSelect = { navigator.navigateToMainTab(it) },
currentTab = mainNavigator.currentTab,
onTabSelect = { mainNavigator.navigateToMainTab(it) },
onTabReSelect = { tab ->
when (tab) {
FestabookMainTab.SCHEDULE -> {
Expand All @@ -114,7 +113,7 @@ fun MainScreen(
},
modifier = modifier,
) { innerPadding ->
val isVisible = navigator.currentTab == FestabookMainTab.PLACE_MAP
val isVisible = mainNavigator.currentTab == FestabookMainTab.PLACE_MAP
PlaceMapRoute(
modifier =
Modifier
Expand All @@ -137,7 +136,7 @@ fun MainScreen(
logger = logger,
onShowErrorSnackBar = snackbarManager::showError,
onStartPlaceDetail = {
navigator.navigate(
mainNavigator.navigate(
FestabookRoute.PlaceDetail(
placeDetailUiModel = it.placeDetail.value,
),
Expand All @@ -146,15 +145,15 @@ fun MainScreen(
)
FestabookNavHost(
modifier = Modifier.padding(innerPadding),
navigator = navigator,
festabookNavigator = festabookNavigator,
navigator = mainNavigator,
mainViewModel = mainViewModel,
homeViewModel = homeViewModel,
scheduleViewModel = scheduleViewModel,
settingViewModel = settingViewModel,
placeDetailViewModelFactory = placeDetailViewModelFactory,
newsViewModel = newsViewModel,
settingViewModel = settingViewModel,
notificationPermissionManager = notificationPermissionManager,
onNavigateToExplore = onNavigateToExplore,
onSubscriptionConfirm = onSubscriptionConfirm,
snackbarManager = snackbarManager,
)
Expand All @@ -164,14 +163,14 @@ fun MainScreen(
@Composable
private fun FestabookNavHost(
navigator: FestabookNavigator,
festabookNavigator: FestabookNavigator,
mainViewModel: MainViewModel,
homeViewModel: HomeViewModel,
scheduleViewModel: ScheduleViewModel,
placeDetailViewModelFactory: PlaceDetailViewModel.Factory,
newsViewModel: NewsViewModel,
settingViewModel: SettingViewModel,
notificationPermissionManager: NotificationPermissionManager,
onNavigateToExplore: () -> Unit,
onSubscriptionConfirm: () -> Unit,
snackbarManager: SnackbarManager,
modifier: Modifier = Modifier,
Expand All @@ -184,7 +183,7 @@ private fun FestabookNavHost(
homeNavGraph(
viewModel = homeViewModel,
mainViewModel = mainViewModel,
onNavigateToExplore = onNavigateToExplore,
onNavigateToExplore = { festabookNavigator.navigate(FestabookRoute.Explore) },
onSubscriptionConfirm = onSubscriptionConfirm,
onShowErrorSnackbar = snackbarManager::showError,
)
Expand Down
Loading