diff --git a/app/src/main/java/com/runnect/runnect/navigator/base/Extras.kt b/app/src/main/java/com/runnect/runnect/navigator/base/Extras.kt new file mode 100644 index 00000000..3e217e0c --- /dev/null +++ b/app/src/main/java/com/runnect/runnect/navigator/base/Extras.kt @@ -0,0 +1,6 @@ +package com.runnect.runnect.navigator.base + +object Extras { + // common + const val PUBLIC_COURSE_ID = "PUBLIC_COURSE_ID" +} \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/navigator/base/Navigator.kt b/app/src/main/java/com/runnect/runnect/navigator/base/Navigator.kt new file mode 100644 index 00000000..5f6cf3fb --- /dev/null +++ b/app/src/main/java/com/runnect/runnect/navigator/base/Navigator.kt @@ -0,0 +1,12 @@ +package com.runnect.runnect.navigator.base + +import android.app.Activity +import android.content.Intent + +interface Navigator { + fun navigateFrom( + activity: Activity, + intentBuilder: Intent.() -> Intent = { this }, + withFinish: Boolean = false, + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/navigator/feature/detail/CourseDetailNavigator.kt b/app/src/main/java/com/runnect/runnect/navigator/feature/detail/CourseDetailNavigator.kt new file mode 100644 index 00000000..de207495 --- /dev/null +++ b/app/src/main/java/com/runnect/runnect/navigator/feature/detail/CourseDetailNavigator.kt @@ -0,0 +1,5 @@ +package com.runnect.runnect.navigator.feature.detail + +import com.runnect.runnect.navigator.base.Navigator + +interface CourseDetailNavigator : Navigator \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt b/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt index c702fd2a..fc0b8de9 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt @@ -22,6 +22,7 @@ import com.runnect.runnect.data.dto.CourseData import com.runnect.runnect.databinding.ActivityCourseDetailBinding import com.runnect.runnect.domain.entity.CourseDetail import com.runnect.runnect.domain.entity.EditableCourseDetail +import com.runnect.runnect.navigator.base.Extras import com.runnect.runnect.presentation.MainActivity import com.runnect.runnect.presentation.countdown.CountDownActivity import com.runnect.runnect.presentation.detail.CourseDetailRootScreen.COURSE_DISCOVER @@ -98,7 +99,7 @@ class CourseDetailActivity : intent.getCompatibleSerializableExtra(EXTRA_ROOT_SCREEN)?.let { rootScreen = it } - publicCourseId = intent.getIntExtra(EXTRA_PUBLIC_COURSE_ID, -1) + publicCourseId = intent.getIntExtra(Extras.PUBLIC_COURSE_ID,-1) Timber.tag("intent-publicCourseId").d("$publicCourseId") } @@ -167,7 +168,11 @@ class CourseDetailActivity : intent?.let { newIntent -> newIntent.getCompatibleSerializableExtra(EXTRA_ROOT_SCREEN) ?.let { rootScreen = it } - publicCourseId = newIntent.getIntExtra(EXTRA_PUBLIC_COURSE_ID, -1) + + publicCourseId = newIntent.getIntExtra( + Extras.PUBLIC_COURSE_ID, + -1 + ) getCourseDetail() } } @@ -620,7 +625,6 @@ class CourseDetailActivity : private const val RES_STAMP_TYPE = "drawable" private const val EXTRA_ROOT_SCREEN = "rootScreen" - private const val EXTRA_PUBLIC_COURSE_ID = "publicCourseId" private const val EXTRA_COURSE_DATA = "CourseData" private const val EXTRA_FRAGMENT_REPLACEMENT_DIRECTION = "fragmentReplacementDirection" private const val EXTRA_FROM_COURSE_DETAIL = "fromCourseDetail" diff --git a/app/src/main/java/com/runnect/runnect/presentation/detail/navigator/impl/CourseDetailNavigatorImpl.kt b/app/src/main/java/com/runnect/runnect/presentation/detail/navigator/impl/CourseDetailNavigatorImpl.kt new file mode 100644 index 00000000..4982b205 --- /dev/null +++ b/app/src/main/java/com/runnect/runnect/presentation/detail/navigator/impl/CourseDetailNavigatorImpl.kt @@ -0,0 +1,21 @@ +package com.runnect.runnect.presentation.detail.navigator.impl + +import com.runnect.runnect.navigator.feature.detail.CourseDetailNavigator +import android.app.Activity +import android.content.Intent +import com.runnect.runnect.presentation.detail.CourseDetailActivity +import com.runnect.runnect.util.extension.startActivityWithAnimation +import javax.inject.Inject + +internal class CourseDetailNavigatorImpl @Inject constructor() : CourseDetailNavigator { + override fun navigateFrom( + activity: Activity, + intentBuilder: Intent.() -> Intent, + withFinish: Boolean + ) { + activity.startActivityWithAnimation( + intentBuilder = intentBuilder, + withFinish = withFinish, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/presentation/detail/navigator/module/CourseDetailNavigatorModule.kt b/app/src/main/java/com/runnect/runnect/presentation/detail/navigator/module/CourseDetailNavigatorModule.kt new file mode 100644 index 00000000..b74d58d1 --- /dev/null +++ b/app/src/main/java/com/runnect/runnect/presentation/detail/navigator/module/CourseDetailNavigatorModule.kt @@ -0,0 +1,18 @@ +package com.runnect.runnect.presentation.detail.navigator.module + +import com.runnect.runnect.navigator.feature.detail.CourseDetailNavigator +import com.runnect.runnect.presentation.detail.navigator.impl.CourseDetailNavigatorImpl +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal abstract class CourseDetailNavigatorModule { + + @Singleton + @Binds + abstract fun bindDetailNavigator(navigator: CourseDetailNavigatorImpl): CourseDetailNavigator +} \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/presentation/profile/ProfileActivity.kt b/app/src/main/java/com/runnect/runnect/presentation/profile/ProfileActivity.kt index 5781284a..7b24a320 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/profile/ProfileActivity.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/profile/ProfileActivity.kt @@ -4,22 +4,28 @@ import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import androidx.core.view.isVisible +import com.runnect.runnect.navigator.feature.detail.CourseDetailNavigator import com.runnect.runnect.R import com.runnect.runnect.binding.BindingActivity import com.runnect.runnect.databinding.ActivityProfileBinding -import com.runnect.runnect.presentation.detail.CourseDetailActivity +import com.runnect.runnect.navigator.base.Extras import com.runnect.runnect.presentation.state.UiStateV2 import com.runnect.runnect.util.analytics.Analytics import com.runnect.runnect.util.analytics.EventName.VIEW_USER_PROFILE -import com.runnect.runnect.util.extension.applyScreenEnterAnimation import com.runnect.runnect.util.extension.showSnackbar import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject @AndroidEntryPoint class ProfileActivity : BindingActivity(R.layout.activity_profile) { + + @Inject + lateinit var detailNavigator: CourseDetailNavigator + private val viewModel: ProfileViewModel by viewModels() private lateinit var adapter: ProfileCourseAdapter private var userId: Int = -1 + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.vm = viewModel @@ -56,12 +62,13 @@ class ProfileActivity : BindingActivity(R.layout.activit } private fun navigateToCourseDetail(courseId: Int) { - Intent(this@ProfileActivity, CourseDetailActivity::class.java).apply { - putExtra(EXTRA_PUBLIC_COURSE_ID, courseId) - addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) - startActivity(this) - } - applyScreenEnterAnimation() + detailNavigator.navigateFrom( + this, + intentBuilder = { + putExtra(Extras.PUBLIC_COURSE_ID, courseId) + addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) + }, + ) } private fun initBackButtonClickListener() { @@ -140,6 +147,5 @@ class ProfileActivity : BindingActivity(R.layout.activit companion object { private const val EXTRA_COURSE_USER_ID = "courseUserId" - private const val EXTRA_PUBLIC_COURSE_ID = "publicCourseId" } } \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/util/extension/ActivityExt.kt b/app/src/main/java/com/runnect/runnect/util/extension/ActivityExt.kt index 63ee1f12..6e8fc135 100644 --- a/app/src/main/java/com/runnect/runnect/util/extension/ActivityExt.kt +++ b/app/src/main/java/com/runnect/runnect/util/extension/ActivityExt.kt @@ -1,8 +1,25 @@ package com.runnect.runnect.util.extension import android.app.Activity +import android.content.Intent import com.runnect.runnect.R +/** + * 애니메이션과 함께 새로운 액티비티를 시작합니다. + * + * @param intentBuilder 새로 시작할 액티비티의 [Intent] + * @param withFinish 현재 액티비티를 종료할 지 여부 + */ +inline fun Activity.startActivityWithAnimation( + intentBuilder: Intent.() -> Intent = { this }, + withFinish: Boolean = false, +) { + startActivity(intentBuilder(Intent(this, T::class.java))) + applyScreenEnterAnimation() + + if (withFinish) finish() +} + fun Activity.navigateToPreviousScreenWithAnimation() { finish() applyScreenExitAnimation()