Skip to content

Commit

Permalink
🔀 :: (#521) compose destination 적용
Browse files Browse the repository at this point in the history
🔀 :: (#521) compose destination 적용
  • Loading branch information
JunJaBoy authored Oct 12, 2023
2 parents 3c8067f + 137f2fa commit 9b288ab
Show file tree
Hide file tree
Showing 131 changed files with 864 additions and 431 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
# Gradle files
.gradle/
build/
build/*

# Local configuration file (sdk path, etc)
local.properties
Expand Down
5 changes: 4 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,14 @@ dependencies {
implementation(project(":core:datastore"))
implementation(project(":core:jwt"))
implementation(project(":core:network"))
implementation(project(":core:project"))
implementation(project(":core:school"))
implementation(project(":core:ui"))

implementation(project(":data"))
implementation(project(":domain"))
implementation(project(":database"))
implementation(project(":design-system"))
implementation(project(":domain"))
implementation(project(":feature"))
implementation(project(":network"))

Expand All @@ -82,6 +84,7 @@ dependencies {
implementation(libs.androidx.compose.material)
implementation(libs.androidx.navigation.compose)
implementation(libs.androidx.hilt.navigation.compose)
implementation(libs.androidx.lifecycle.runtime.compose)

implementation(libs.composeDestinations)
ksp(libs.composeDestinations.ksp)
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/java/team/aliens/dms_android/app/DmsNavHost.kt
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
package team.aliens.dms_android.app

import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi
import com.ramcosta.composedestinations.DestinationsNavHost
import com.ramcosta.composedestinations.animations.rememberAnimatedNavHostEngine
import team.aliens.dms_android.app.navigation.DmsNavGraph

@OptIn(ExperimentalAnimationApi::class, ExperimentalMaterialNavigationApi::class)
@Composable
fun DmsNavHost(
modifier: Modifier = Modifier,
autoSignIn: Boolean,
) {
val engine = rememberAnimatedNavHostEngine()

DestinationsNavHost(
modifier = modifier,
engine = engine,
navGraph = DmsNavGraph.root(autoSignIn = autoSignIn),
)
}
22 changes: 16 additions & 6 deletions app/src/main/java/team/aliens/dms_android/app/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,41 @@ package team.aliens.dms_android.app
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
private val viewModel: MainActivityViewModel by viewModels()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
DmsApp(modifier = Modifier.fillMaxSize())
val autoSignIn by viewModel.autoSignInAvailable.collectAsStateWithLifecycle()

if (autoSignIn != null) {
DmsApp(
modifier = Modifier.fillMaxSize(),
autoSignIn = autoSignIn!!,
)
} else {
Text(text = "LOADING, SPLASH")
}
}
}
}

@Composable
private fun DmsApp(
modifier: Modifier = Modifier,
autoSignIn: Boolean,
) {
// TODO: auto sign in
val autoSignIn by remember { mutableStateOf(false) }

DmsNavHost(
modifier = modifier,
autoSignIn = autoSignIn,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,35 @@
package team.aliens.dms_android.app

import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import team.aliens.dms_android.core.ui.viewmodel.BaseViewModel
import team.aliens.dms_android.core.ui.viewmodel.launchOnViewModelScope
import team.aliens.dms_android.domain.usecase.auth.CheckAutoSignInAvailableUseCase
import javax.inject.Inject

class MainActivityViewModel : ViewModel()
@HiltViewModel
class MainActivityViewModel @Inject constructor(
private val checkAutoSignInAvailableUseCase: CheckAutoSignInAvailableUseCase,
) : BaseViewModel() {

private var _autoSignInAvailable: MutableStateFlow<Boolean?> = MutableStateFlow(null)
val autoSignInAvailable: StateFlow<Boolean?> = _autoSignInAvailable.asStateFlow()

init {
fetchWhetherAutoSignInAvailable()
}

private fun fetchWhetherAutoSignInAvailable() {
launchOnViewModelScope {
runCatching { checkAutoSignInAvailableUseCase() }
.onSuccess { available ->
_autoSignInAvailable.emit(available)
}
.onFailure { throwable ->
throwable.printStackTrace()
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,33 @@ import com.ramcosta.composedestinations.spec.DestinationSpec
import com.ramcosta.composedestinations.spec.NavGraphSpec
import com.ramcosta.composedestinations.spec.Route
import team.aliens.dms_android.app.navigation.authorized.main.MainNavGraph
import team.aliens.dms_android.feature.destinations.NoticeDetailsScreenDestination
import team.aliens.dms_android.feature.destinations.NotificationBoxScreenDestination
import team.aliens.dms_android.feature.destinations.PointHistoryScreenDestination
import team.aliens.dms_android.feature.destinations.RemainsApplicationScreenDestination
import team.aliens.dms_android.feature.destinations.StudyRoomDetailsScreenDestination
import team.aliens.dms_android.feature.destinations.StudyRoomListScreenDestination
import team.aliens.dms_android.feature.editpassword.EditPasswordNavGraph

object AuthorizedNavGraph : NavGraphSpec {
override val route: String = "authorized"
override val startRoute: Route = MainNavGraph
override val nestedNavGraphs: List<NavGraphSpec> =
listOf(
MainNavGraph,
EditPasswordNavGraph,
)

override val destinationsByRoute: Map<String, DestinationSpec<*>> =
listOf<DestinationSpec<*>>(/* TODO */)
listOf<DestinationSpec<*>>(
NoticeDetailsScreenDestination,
NoticeDetailsScreenDestination,
NotificationBoxScreenDestination,
PointHistoryScreenDestination,
RemainsApplicationScreenDestination,
StudyRoomListScreenDestination,
StudyRoomDetailsScreenDestination,
)
.routedIn(navGraphSpec = this)
.associateBy { it.route }
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import com.ramcosta.composedestinations.dynamic.routedIn
import com.ramcosta.composedestinations.spec.DestinationSpec
import com.ramcosta.composedestinations.spec.NavGraphSpec
import com.ramcosta.composedestinations.spec.Route
import team.aliens.dms_android.feature._feature.destinations.AnnouncementListScreenDestination
import team.aliens.dms_android.feature._feature.destinations.ApplicationScreenDestination
import team.aliens.dms_android.feature._feature.destinations.HomeScreenDestination
import team.aliens.dms_android.feature._feature.destinations.MyPageScreenDestination
import team.aliens.dms_android.feature.destinations.AnnouncementListScreenDestination
import team.aliens.dms_android.feature.destinations.ApplicationScreenDestination
import team.aliens.dms_android.feature.destinations.HomeScreenDestination
import team.aliens.dms_android.feature.destinations.MyPageScreenDestination

object MainNavGraph : NavGraphSpec {
override val route: String = "main"
override val startRoute: Route = HomeScreenDestination
override val startRoute: Route = HomeScreenDestination routedIn this
override val destinationsByRoute: Map<String, DestinationSpec<*>> =
listOf<DestinationSpec<*>>(
HomeScreenDestination,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,25 @@ import com.ramcosta.composedestinations.dynamic.routedIn
import com.ramcosta.composedestinations.spec.DestinationSpec
import com.ramcosta.composedestinations.spec.NavGraphSpec
import com.ramcosta.composedestinations.spec.Route
import team.aliens.dms_android.feature.destinations.FindIdScreenDestination
import team.aliens.dms_android.feature.destinations.SignInScreenDestination
import team.aliens.dms_android.feature.resetpassword.ResetPasswordNavGraph
import team.aliens.dms_android.feature.signup.SignUpNavGraph

object UnauthorizedNavGraph : NavGraphSpec {
override val route: String = "unauthorized"
override val startRoute: Route = TODO()
override val startRoute: Route = SignInScreenDestination routedIn this
override val nestedNavGraphs: List<NavGraphSpec> =
listOf(
SignUpNavGraph,
ResetPasswordNavGraph,
)

override val destinationsByRoute: Map<String, DestinationSpec<*>> =
listOf<DestinationSpec<*>>(/* TODO */)
listOf<DestinationSpec<*>>(
SignInScreenDestination,
FindIdScreenDestination,
)
.routedIn(navGraphSpec = this)
.associateBy { it.route }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package team.aliens.dms_android.core.project.logger

fun logInfo(tag: String = "Information", message: String) = Logging.info(tag, message)

fun logError(tag: String = "Error", message: String) = Logging.error(tag, message)

fun logWarn(tag: String = "Warning", message: String) = Logging.warn(tag, message)

fun logDebug(tag: String = "Debug", message: String) = Logging.debug(tag, message)
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
// TODO: need to be checked

package team.aliens.dms_android.core.project.logger

import android.util.Log

internal interface Logger {
val tag: String

fun log(tag: String, type: LoggingType, message: String)

fun info(tag: String, message: String) = log(
tag = tag, type = LoggingType.INFO, message = message
)

fun error(tag: String, message: String) = log(
tag = tag,
type = LoggingType.ERROR,
message = message,
)

fun warn(tag: String, message: String) = log(
tag = tag,
type = LoggingType.WARN,
message = message,
)

fun debug(tag: String, message: String) = log(
tag = tag,
type = LoggingType.DEBUG,
message = message,
)

enum class LoggingType {
INFO, ERROR, WARN, DEBUG,
;
}
}

internal class LoggerImpl : Logger {

override val tag: String = "Logger"

override fun log(
tag: String,
type: Logger.LoggingType,
message: String,
) {
when (type) {
Logger.LoggingType.INFO -> Log.i(tag, message)
Logger.LoggingType.ERROR -> Log.e(tag, message)
Logger.LoggingType.WARN -> Log.w(tag, message)
Logger.LoggingType.DEBUG -> Log.d(tag, message)
}
}
}

object Logging : Logger by LoggerImpl() {
fun i(tag: String = this.tag, message: String) = super.info(tag, message)
fun e(tag: String = this.tag, message: String) = super.error(tag, message)
fun w(tag: String = this.tag, message: String) = super.warn(tag, message)
fun d(tag: String = this.tag, message: String) = super.debug(tag, message)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package team.aliens.dms_android.core.ui.viewmodel

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking

fun <R> ViewModel.launchOnViewModelScope(
context: CoroutineDispatcher = Dispatchers.IO,
block: suspend () -> R,
) = this.viewModelScope.launch(context = context) { block() }

fun <R> ViewModel.asyncOnViewModelScope(
context: CoroutineDispatcher = Dispatchers.IO,
block: suspend () -> R,
) = this.viewModelScope.async(context = context) { block() }

fun <R> ViewModel.runBlockingOnViewModelScope(
context: CoroutineDispatcher = Dispatchers.IO,
block: suspend () -> R,
) = runBlocking(context = context) { block() }
3 changes: 2 additions & 1 deletion feature/.gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
/build
build/
build/**/main/
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package team.aliens.dms_android.feature.main.announcements;

import dagger.internal.DaggerGenerated;
import dagger.internal.Factory;
import dagger.internal.QualifierMetadata;
import dagger.internal.ScopeMetadata;
import javax.annotation.processing.Generated;
import javax.inject.Provider;
import team.aliens.dms_android.domain.usecase.notice.FetchNoticesUseCase;

@ScopeMetadata
@QualifierMetadata
@DaggerGenerated
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://dagger.dev"
)
@SuppressWarnings({
"unchecked",
"rawtypes",
"KotlinInternal",
"KotlinInternalInJava"
})
public final class AnnouncementsViewModel_Factory implements Factory<AnnouncementsViewModel> {
private final Provider<FetchNoticesUseCase> fetchNoticesUseCaseProvider;

public AnnouncementsViewModel_Factory(Provider<FetchNoticesUseCase> fetchNoticesUseCaseProvider) {
this.fetchNoticesUseCaseProvider = fetchNoticesUseCaseProvider;
}

@Override
public AnnouncementsViewModel get() {
return newInstance(fetchNoticesUseCaseProvider.get());
}

public static AnnouncementsViewModel_Factory create(
Provider<FetchNoticesUseCase> fetchNoticesUseCaseProvider) {
return new AnnouncementsViewModel_Factory(fetchNoticesUseCaseProvider);
}

public static AnnouncementsViewModel newInstance(FetchNoticesUseCase fetchNoticesUseCase) {
return new AnnouncementsViewModel(fetchNoticesUseCase);
}
}
Loading

0 comments on commit 9b288ab

Please sign in to comment.