diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5188a2ce..14016943 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -147,8 +147,6 @@ dependencies { implementation(libs.bundles.compose) - implementation(libs.bundles.mavericks) - implementation(platform(libs.firebase)) implementation(libs.bundles.firebase) implementation(libs.process.phoenix) diff --git a/app/src/main/java/org/sopt/official/App.kt b/app/src/main/java/org/sopt/official/App.kt index f726ba43..a751fa3b 100644 --- a/app/src/main/java/org/sopt/official/App.kt +++ b/app/src/main/java/org/sopt/official/App.kt @@ -27,45 +27,45 @@ package org.sopt.official import android.app.Application import androidx.appcompat.app.AppCompatDelegate import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ProcessLifecycleOwner -import androidx.lifecycle.coroutineScope +import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle -import com.airbnb.mvrx.mocking.MockableMavericks import com.google.firebase.messaging.FirebaseMessaging import dagger.hilt.android.HiltAndroidApp -import javax.inject.Inject import kotlinx.coroutines.launch import kotlinx.coroutines.tasks.await +import org.sopt.official.common.context.appContext import org.sopt.official.network.FlipperInitializer import org.sopt.official.network.persistence.SoptDataStore import timber.log.Timber +import javax.inject.Inject @HiltAndroidApp class App : Application() { - @Inject - lateinit var dataStore: SoptDataStore + @Inject + lateinit var dataStore: SoptDataStore + private val lifecycleOwner: LifecycleOwner + get() = ProcessLifecycleOwner.get() - override fun onCreate() { - super.onCreate() - initFlipper() - initMavericks() - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) - ProcessLifecycleOwner.get().lifecycle.coroutineScope.launch { - ProcessLifecycleOwner.get().lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { - runCatching { - FirebaseMessaging.getInstance().token.await() - }.onSuccess { - dataStore.pushToken = it - }.onFailure(Timber::e) - } - } - } + override fun onCreate() { + super.onCreate() + appContext = this.applicationContext - private fun initMavericks() { - MockableMavericks.initialize(this) + initFlipper() + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) + lifecycleOwner.lifecycleScope.launch { + lifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { + runCatching { + FirebaseMessaging.getInstance().token.await() + }.onSuccess { + dataStore.pushToken = it + }.onFailure(Timber::e) + } } + } - private fun initFlipper() { - FlipperInitializer.init(this) - } + private fun initFlipper() { + FlipperInitializer.init(this) + } } diff --git a/app/src/main/java/org/sopt/official/di/NavigatorModule.kt b/app/src/main/java/org/sopt/official/di/NavigatorModule.kt index 464eccf3..95db65f3 100644 --- a/app/src/main/java/org/sopt/official/di/NavigatorModule.kt +++ b/app/src/main/java/org/sopt/official/di/NavigatorModule.kt @@ -26,7 +26,6 @@ package org.sopt.official.di import dagger.Binds import dagger.Module -import dagger.hilt.EntryPoint import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import org.sopt.official.common.navigator.NavigatorProvider @@ -41,9 +40,3 @@ interface NavigationModule { fun bindNavigatorIntent(navigatorProviderIntent: NavigatorProviderIntent): NavigatorProvider } -@InstallIn(SingletonComponent::class) -@EntryPoint -interface NavigatorEntryPoint { - fun navigatorProvider(): NavigatorProvider -} - diff --git a/core/common/src/main/java/org/sopt/official/common/context/ApplicationContext.kt b/core/common/src/main/java/org/sopt/official/common/context/ApplicationContext.kt new file mode 100644 index 00000000..2f97000d --- /dev/null +++ b/core/common/src/main/java/org/sopt/official/common/context/ApplicationContext.kt @@ -0,0 +1,5 @@ +package org.sopt.official.common.context + +import android.content.Context + +lateinit var appContext: Context diff --git a/core/common/src/main/java/org/sopt/official/common/navigator/DeepLinkType.kt b/core/common/src/main/java/org/sopt/official/common/navigator/DeepLinkType.kt index 9a61817d..4e790269 100644 --- a/core/common/src/main/java/org/sopt/official/common/navigator/DeepLinkType.kt +++ b/core/common/src/main/java/org/sopt/official/common/navigator/DeepLinkType.kt @@ -26,11 +26,12 @@ package org.sopt.official.common.navigator import android.content.Context import android.content.Intent +import dagger.hilt.android.EntryPointAccessors import org.sopt.official.auth.model.UserActiveState import org.sopt.official.auth.model.UserStatus +import org.sopt.official.common.context.appContext import org.sopt.official.common.util.extractQueryParameter import org.sopt.official.feature.attendance.AttendanceActivity -import org.sopt.official.feature.auth.AuthActivity import org.sopt.official.feature.home.HomeActivity import org.sopt.official.feature.mypage.mypage.MyPageActivity import org.sopt.official.feature.notification.NotificationDetailActivity @@ -39,6 +40,10 @@ import org.sopt.official.feature.poke.notification.PokeNotificationActivity import org.sopt.official.stamp.SoptampActivity import timber.log.Timber +internal val navigator by lazy { + EntryPointAccessors.fromApplication(appContext, NavigatorEntryPoint::class.java).navigatorProvider() +} + enum class DeepLinkType( val link: String ) { @@ -50,7 +55,7 @@ enum class DeepLinkType( NOTIFICATION_LIST("home/notification") { override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String): Intent { return userStatus.setIntent( - context, Intent(context, NotificationHistoryActivity::class.java) + Intent(context, NotificationHistoryActivity::class.java) ) } }, @@ -58,7 +63,7 @@ enum class DeepLinkType( override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String): Intent { val notificationId = deepLink.extractQueryParameter("id") return userStatus.setIntent( - context, NotificationDetailActivity.getIntent( + NotificationDetailActivity.getIntent( context, NotificationDetailActivity.StartArgs(notificationId) ) ) @@ -67,7 +72,7 @@ enum class DeepLinkType( MY_PAGE("home/mypage") { override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String): Intent { return userStatus.setIntent( - context, MyPageActivity.getIntent( + MyPageActivity.getIntent( context, MyPageActivity.StartArgs(UserActiveState.valueOf(userStatus.name)) ) ) @@ -76,42 +81,42 @@ enum class DeepLinkType( ATTENDANCE("home/attendance") { override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String): Intent { return userStatus.setIntent( - context, Intent(context, AttendanceActivity::class.java) + Intent(context, AttendanceActivity::class.java) ) } }, ATTENDANCE_MODAL("home/attendance/attendance-modal") { override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String): Intent { return userStatus.setIntent( - context, Intent(context, AttendanceActivity::class.java) + Intent(context, AttendanceActivity::class.java) ) } }, SOPTAMP("home/soptamp") { override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String): Intent { return userStatus.setIntent( - context, Intent(context, SoptampActivity::class.java) + Intent(context, SoptampActivity::class.java) ) } }, SOPTAMP_ENTIRE_RANKING("home/soptamp/entire-ranking") { override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String): Intent { return userStatus.setIntent( - context, Intent(context, SoptampActivity::class.java) + Intent(context, SoptampActivity::class.java) ) } }, SOPTAMP_CURRENT_GENERATION_RANKING("home/soptamp/current-generation-ranking") { override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String): Intent { return userStatus.setIntent( - context, Intent(context, SoptampActivity::class.java) + Intent(context, SoptampActivity::class.java) ) } }, POKE_NOTIFICATION_LIST("home/poke/notification-list") { override fun getIntent(context: Context, userStatus: UserStatus, deepLink: String): Intent { return userStatus.setIntent( - context, PokeNotificationActivity.getIntent( + PokeNotificationActivity.getIntent( context, PokeNotificationActivity.StartArgs(userStatus.name) ) ) @@ -131,16 +136,16 @@ enum class DeepLinkType( abstract fun getIntent(context: Context, userStatus: UserStatus, deepLink: String): Intent companion object { - private fun UserStatus.setIntent(context: Context, intent: Intent): Intent { + private fun UserStatus.setIntent(intent: Intent): Intent { return when (this == UserStatus.UNAUTHENTICATED) { - true -> AuthActivity.newInstance(context) + true -> navigator.getAuthActivityIntent() false -> intent } } fun getHomeIntent(context: Context, userStatus: UserStatus, deepLinkType: DeepLinkType? = null): Intent { return userStatus.setIntent( - context, HomeActivity.getIntent( + HomeActivity.getIntent( context, HomeActivity.StartArgs( userStatus = userStatus, deepLinkType = deepLinkType ) diff --git a/core/common/src/main/java/org/sopt/official/common/navigator/NavigatorProvider.kt b/core/common/src/main/java/org/sopt/official/common/navigator/NavigatorProvider.kt index 211d855f..41f75e64 100644 --- a/core/common/src/main/java/org/sopt/official/common/navigator/NavigatorProvider.kt +++ b/core/common/src/main/java/org/sopt/official/common/navigator/NavigatorProvider.kt @@ -25,6 +25,9 @@ package org.sopt.official.common.navigator import android.content.Intent +import dagger.hilt.EntryPoint +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent import org.sopt.official.auth.model.UserStatus interface NavigatorProvider { @@ -37,3 +40,9 @@ interface NavigatorProvider { fun getPokeNotificationActivityIntent(name: String): Intent fun getHomeActivityIntent(userStatus: UserStatus, deepLinkType: DeepLinkType): Intent } + +@InstallIn(SingletonComponent::class) +@EntryPoint +interface NavigatorEntryPoint { + fun navigatorProvider(): NavigatorProvider +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0c407de1..aede63cb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -51,7 +51,6 @@ okhttp = "4.12.0" retrofit = "2.11.0" timber = "5.0.1" compose-destination = "1.10.2" -mavericks = "3.0.9" coil = "2.7.0" lottie = "6.5.2" dotsindicator = "5.0" @@ -155,11 +154,6 @@ retrofit-response-type-keeper = { module = "com.squareup.retrofit2:response-type timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" } -mavericks = { module = "com.airbnb.android:mavericks", version.ref = "mavericks" } -mavericks-compose = { module = "com.airbnb.android:mavericks-compose", version.ref = "mavericks" } -mavericks-navigation = { module = "com.airbnb.android:mavericks-navigation", version.ref = "mavericks" } -mavericks-mockable = { module = "com.airbnb.android:mavericks-mocking", version.ref = "mavericks" } - hilt = { module = "com.google.dagger:hilt-android", version.ref = "dagger-hilt" } hilt-ksp = { module = "com.google.dagger:hilt-compiler", version.ref = "dagger-hilt" } hilt-plugin = { group = "com.google.dagger", name = "hilt-android-gradle-plugin", version.ref = "dagger-hilt" } @@ -208,7 +202,6 @@ android-test = ["androidx-test-junit", "androidx-test-espresso"] okhttp = ["okhttp", "okhttp-logging-interceptor"] flipper = ["flipper", "soloader"] firebase = ["firebase-analytics", "firebase-crashlytics", "firebase-messaging"] -mavericks = ["mavericks", "mavericks-compose", "mavericks-navigation", "mavericks-mockable"] junit5-test = ["junit5", "junit5-engine", "junit5-params", "junit5-vintage"] androidx-android-test = ["androidx-test-runner", "androidx-test-rules", "androidx-uiautomator"]