generated from cgpathos/template-android
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
13 changed files
with
198 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<resources> | ||
|
||
<style name="Theme.Portfolio" parent="android:Theme.Material.Light.NoActionBar"> | ||
|
||
<item name="android:windowSplashScreenAnimatedIcon">@android:color/transparent</item> | ||
<item name="android:windowSplashScreenIconBackgroundColor">@color/white</item> | ||
<item name="android:windowSplashScreenAnimationDuration">0</item> | ||
</style> | ||
</resources> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
17 changes: 17 additions & 0 deletions
17
...c/main/java/today/pathos/android/portfolio/data/repository/OfflineFirstCacheRepository.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package today.pathos.android.portfolio.data.repository | ||
|
||
import kotlinx.coroutines.CoroutineDispatcher | ||
import kotlinx.coroutines.withContext | ||
import today.pathos.android.portfolio.common.di.IoDispatcher | ||
import today.pathos.android.portfolio.data.datasource.local.LocalDataSource | ||
import today.pathos.android.portfolio.domain.repository.CacheRepository | ||
import javax.inject.Inject | ||
|
||
class OfflineFirstCacheRepository @Inject constructor( | ||
private val localDataSource: LocalDataSource, | ||
@IoDispatcher private val dispatcher: CoroutineDispatcher, | ||
) : CacheRepository { | ||
override suspend fun cleanCache() = withContext(dispatcher) { | ||
localDataSource.cleanCache() | ||
} | ||
} |
5 changes: 5 additions & 0 deletions
5
domain/src/main/java/today/pathos/android/portfolio/domain/repository/CacheRepository.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
package today.pathos.android.portfolio.domain.repository | ||
|
||
interface CacheRepository { | ||
suspend fun cleanCache() | ||
} |
14 changes: 14 additions & 0 deletions
14
domain/src/main/java/today/pathos/android/portfolio/domain/usecase/CleanupCacheUseCase.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package today.pathos.android.portfolio.domain.usecase | ||
|
||
import today.pathos.android.portfolio.domain.repository.CacheRepository | ||
import today.pathos.android.portfolio.domain.repository.FameRepository | ||
import javax.inject.Inject | ||
|
||
class CleanupCacheUseCase @Inject constructor( | ||
private val cacheRepository: CacheRepository, | ||
) { | ||
|
||
suspend operator fun invoke() { | ||
cacheRepository.cleanCache() | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
79 changes: 71 additions & 8 deletions
79
...ion/src/main/java/today/pathos/android/portfolio/presentation/view/screen/SplashScreen.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,42 +1,105 @@ | ||
package today.pathos.android.portfolio.presentation.view.screen | ||
|
||
import androidx.compose.foundation.layout.Arrangement | ||
import androidx.compose.foundation.layout.Column | ||
import androidx.compose.foundation.Image | ||
import androidx.compose.foundation.layout.Box | ||
import androidx.compose.foundation.layout.aspectRatio | ||
import androidx.compose.foundation.layout.fillMaxSize | ||
import androidx.compose.foundation.layout.padding | ||
import androidx.compose.foundation.layout.width | ||
import androidx.compose.material3.Text | ||
import androidx.compose.runtime.Composable | ||
import androidx.compose.runtime.LaunchedEffect | ||
import androidx.compose.runtime.collectAsState | ||
import androidx.compose.runtime.getValue | ||
import androidx.compose.runtime.snapshotFlow | ||
import androidx.compose.ui.Alignment | ||
import androidx.compose.ui.Modifier | ||
import androidx.compose.ui.layout.ContentScale | ||
import androidx.compose.ui.platform.LocalLifecycleOwner | ||
import androidx.compose.ui.res.painterResource | ||
import androidx.compose.ui.tooling.preview.Preview | ||
import androidx.compose.ui.unit.dp | ||
import androidx.hilt.navigation.compose.hiltViewModel | ||
import androidx.lifecycle.flowWithLifecycle | ||
import kotlinx.coroutines.flow.distinctUntilChanged | ||
import today.pathos.android.portfolio.presentation.R | ||
import today.pathos.android.portfolio.presentation.view.dialog.ErrorDialog | ||
import today.pathos.android.portfolio.presentation.view.theme.Typography | ||
import today.pathos.android.portfolio.presentation.viewmodel.SplashUiState | ||
import today.pathos.android.portfolio.presentation.viewmodel.SplashViewModel | ||
|
||
@Composable | ||
fun SplashRoute( | ||
navigateToMain: () -> Unit, | ||
closeApp: () -> Unit, | ||
modifier: Modifier = Modifier, | ||
viewModel: SplashViewModel = hiltViewModel(), | ||
) { | ||
val state by viewModel.state.collectAsState() | ||
|
||
SplashScreen( | ||
state = state, | ||
navigateToMain = navigateToMain, | ||
closeApp = closeApp, | ||
modifier = modifier | ||
) | ||
} | ||
|
||
@Composable | ||
fun SplashScreen( | ||
state: SplashUiState, | ||
navigateToMain: () -> Unit, | ||
closeApp: () -> Unit, | ||
modifier: Modifier = Modifier, | ||
) { | ||
Column( | ||
verticalArrangement = Arrangement.Center, | ||
horizontalAlignment = Alignment.CenterHorizontally, | ||
modifier = modifier.fillMaxSize() | ||
val lifecycle = LocalLifecycleOwner.current.lifecycle | ||
LaunchedEffect(state) { | ||
snapshotFlow { state } | ||
.distinctUntilChanged() | ||
.flowWithLifecycle(lifecycle) | ||
.collect { | ||
when (state) { | ||
SplashUiState.Init -> {} | ||
is SplashUiState.Error -> { | ||
closeApp() | ||
} | ||
|
||
SplashUiState.NavigateToMain -> { | ||
navigateToMain() | ||
} | ||
} | ||
} | ||
} | ||
|
||
Box( | ||
modifier = modifier | ||
.fillMaxSize() | ||
.padding(32.dp) | ||
) { | ||
Text( | ||
text = "Splash Screen", | ||
style = Typography.displayLarge | ||
style = Typography.displayMedium, | ||
modifier = Modifier.align(Alignment.Center) | ||
) | ||
|
||
Image( | ||
painter = painterResource(id = R.drawable.neople_open_api_logo), | ||
contentDescription = "Neople Open API Logo", | ||
contentScale = ContentScale.Fit, | ||
modifier = Modifier | ||
.width(100.dp) | ||
.aspectRatio(1.5f) | ||
.align(Alignment.BottomEnd) | ||
) | ||
} | ||
} | ||
|
||
@Preview(showBackground = true) | ||
@Composable | ||
fun SplashScreenPreview() { | ||
SplashScreen() | ||
SplashScreen( | ||
state = SplashUiState.Init, | ||
navigateToMain = {}, | ||
closeApp = {} | ||
) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
51 changes: 51 additions & 0 deletions
51
...on/src/main/java/today/pathos/android/portfolio/presentation/viewmodel/SplashViewModel.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
package today.pathos.android.portfolio.presentation.viewmodel | ||
|
||
import androidx.lifecycle.ViewModel | ||
import androidx.lifecycle.viewModelScope | ||
import dagger.hilt.android.lifecycle.HiltViewModel | ||
import kotlinx.coroutines.delay | ||
import kotlinx.coroutines.flow.MutableStateFlow | ||
import kotlinx.coroutines.flow.SharingStarted | ||
import kotlinx.coroutines.flow.StateFlow | ||
import kotlinx.coroutines.flow.catch | ||
import kotlinx.coroutines.flow.onStart | ||
import kotlinx.coroutines.flow.stateIn | ||
import kotlinx.coroutines.flow.update | ||
import kotlinx.coroutines.launch | ||
import today.pathos.android.portfolio.domain.usecase.CleanupCacheUseCase | ||
import javax.inject.Inject | ||
|
||
@HiltViewModel | ||
class SplashViewModel @Inject constructor( | ||
val cleanupCacheUseCase: CleanupCacheUseCase, | ||
) : ViewModel() { | ||
private val _state = MutableStateFlow<SplashUiState>(SplashUiState.Init) | ||
val state: StateFlow<SplashUiState> = _state | ||
.onStart { | ||
initApp() | ||
} | ||
.catch { e -> | ||
_state.update { SplashUiState.Error(e.message.toString()) } | ||
} | ||
.stateIn( | ||
scope = viewModelScope, | ||
started = SharingStarted.WhileSubscribed(5000), | ||
initialValue = SplashUiState.Init | ||
) | ||
|
||
private fun initApp() { | ||
viewModelScope.launch { | ||
cleanupCacheUseCase() | ||
delay(2000) // 스플래시 화면을 잠시 보여주기 위한 딜레이 | ||
|
||
_state.update { SplashUiState.NavigateToMain } | ||
} | ||
} | ||
} | ||
|
||
|
||
sealed class SplashUiState { | ||
data object Init : SplashUiState() | ||
data class Error(val msg: String) : SplashUiState() | ||
data object NavigateToMain : SplashUiState() | ||
} |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.