Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,23 @@ import androidx.annotation.LayoutRes
import androidx.core.view.isVisible
import androidx.databinding.ViewDataBinding
import com.runnect.runnect.R
import com.runnect.runnect.presentation.MainActivity
import com.runnect.runnect.presentation.event.VisitorModeManager
import com.runnect.runnect.presentation.login.LoginActivity
import javax.inject.Inject

abstract class BaseVisitorFragment<T : ViewDataBinding>(
@LayoutRes private val layoutRes: Int
) : BindingFragment<T>(layoutRes) {

@Inject
lateinit var visitorModeManager: VisitorModeManager

abstract val visitorContainer: View
abstract val contentViews: List<View>

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if (MainActivity.isVisitorMode) {

if (visitorModeManager.isVisitorMode) {
showVisitorMode()
} else {
showContent()
Expand Down
37 changes: 10 additions & 27 deletions app/src/main/java/com/runnect/runnect/presentation/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,18 @@ import com.runnect.runnect.BuildConfig.REMOTE_KEY_APP_VERSION
import com.runnect.runnect.R
import com.runnect.runnect.binding.BindingActivity
import com.runnect.runnect.databinding.ActivityMainBinding
import com.runnect.runnect.presentation.discover.DiscoverFragment
import com.runnect.runnect.presentation.storage.StorageScrapFragment
import com.runnect.runnect.presentation.event.VisitorModeManager
import com.runnect.runnect.util.analytics.Analytics
import com.runnect.runnect.util.analytics.EventName
import com.runnect.runnect.util.analytics.EventName.EVENT_VIEW_HOME
import com.runnect.runnect.util.preference.AuthUtil.getAccessToken
import com.runnect.runnect.util.preference.StatusType.LoginStatus
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject

@AndroidEntryPoint
class MainActivity : BindingActivity<ActivityMainBinding>(R.layout.activity_main) {
@Inject
lateinit var visitorModeManager: VisitorModeManager

private var isChangeToStorage: Boolean = false
private var isChangeToDiscover: Boolean = false
private var fragmentReplacementDirection: String? = null
Expand All @@ -33,18 +34,11 @@ class MainActivity : BindingActivity<ActivityMainBinding>(R.layout.activity_main

Analytics.logClickedItemEvent(EVENT_VIEW_HOME)
initRemoteConfig()
checkVisitorMode()
checkIntentValue()
initView()
addListener()
}

private fun checkVisitorMode() {
val accessToken = this.getAccessToken()
val loginStatus = LoginStatus.getLoginStatus(accessToken)
isVisitorMode = loginStatus == LoginStatus.VISITOR
}

private fun checkIntentValue() {
fragmentReplacementDirection = intent.getStringExtra(EXTRA_FRAGMENT_REPLACEMENT_DIRECTION)

Expand Down Expand Up @@ -102,12 +96,13 @@ class MainActivity : BindingActivity<ActivityMainBinding>(R.layout.activity_main
}

private fun logClickEvent(menuItemId: Int) {
val isVisitor = visitorModeManager.isVisitorMode
with(EventName) {
when (menuItemId) {
R.id.menu_main_drawing -> if (isVisitorMode) EVENT_CLICK_JOIN_IN_COURSE_DRAWING else EVENT_CLICK_NAV_COURSE_DRAWING
R.id.menu_main_storage -> if (isVisitorMode) EVENT_CLICK_JOIN_IN_STORAGE else EVENT_CLICK_NAV_STORAGE
R.id.menu_main_discover -> if (isVisitorMode) EVENT_CLICK_JOIN_IN_COURSE_DISCOVERY else EVENT_CLICK_NAV_COURSE_DISCOVERY
R.id.menu_main_my_page -> if (isVisitorMode) EVENT_CLICK_JOIN_IN_MY_PAGE else EVENT_CLICK_NAV_MY_PAGE
R.id.menu_main_drawing -> if (isVisitor) EVENT_CLICK_JOIN_IN_COURSE_DRAWING else EVENT_CLICK_NAV_COURSE_DRAWING
R.id.menu_main_storage -> if (isVisitor) EVENT_CLICK_JOIN_IN_STORAGE else EVENT_CLICK_NAV_STORAGE
R.id.menu_main_discover -> if (isVisitor) EVENT_CLICK_JOIN_IN_COURSE_DISCOVERY else EVENT_CLICK_NAV_COURSE_DISCOVERY
R.id.menu_main_my_page -> if (isVisitor) EVENT_CLICK_JOIN_IN_MY_PAGE else EVENT_CLICK_NAV_MY_PAGE
else -> ""
}.let(Analytics::logClickedItemEvent)
}
Expand Down Expand Up @@ -169,17 +164,5 @@ class MainActivity : BindingActivity<ActivityMainBinding>(R.layout.activity_main
companion object {
const val REMOTE_CONFIG_FETCH_INTERVAL_SECONDS = 3600L
const val EXTRA_FRAGMENT_REPLACEMENT_DIRECTION = "fragmentReplacementDirection"

var isVisitorMode = false
var discoverFragment: DiscoverFragment? = null
var storageScrapFragment: StorageScrapFragment? = null

fun updateCourseDiscoverScreen() {
discoverFragment?.refreshDiscoverCourses()
}

fun updateStorageScrapScreen() {
storageScrapFragment?.getMyScrapCourses()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,7 @@ class MainPager(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragm
when (position) {
0 -> CourseMainFragment()
1 -> StorageMainFragment()
2 -> DiscoverFragment().apply {
MainActivity.discoverFragment = this
}
2 -> DiscoverFragment()

3 -> MyPageFragment()
else -> CourseMainFragment()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import android.widget.EditText
import androidx.activity.OnBackPressedCallback
import androidx.activity.viewModels
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import coil3.load
import com.google.firebase.dynamiclinks.DynamicLink
import com.google.firebase.dynamiclinks.FirebaseDynamicLinks
Expand All @@ -23,6 +24,9 @@ import com.runnect.runnect.domain.entity.CourseDetail
import com.runnect.runnect.domain.entity.EditableCourseDetail
import com.runnect.runnect.presentation.MainActivity
import com.runnect.runnect.presentation.countdown.CountDownActivity
import com.runnect.runnect.presentation.event.ScreenRefreshEvent
import com.runnect.runnect.presentation.event.ScreenRefreshEventBus
import com.runnect.runnect.presentation.event.VisitorModeManager
import com.runnect.runnect.presentation.detail.CourseDetailRootScreen.COURSE_DISCOVER
import com.runnect.runnect.presentation.detail.CourseDetailRootScreen.COURSE_DISCOVER_SEARCH
import com.runnect.runnect.presentation.detail.CourseDetailRootScreen.COURSE_STORAGE_SCRAP
Expand Down Expand Up @@ -56,12 +60,20 @@ import com.runnect.runnect.util.extension.showWebBrowser
import com.runnect.runnect.util.mode.ScreenMode.EditMode
import com.runnect.runnect.util.mode.ScreenMode.ReadOnlyMode
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import javax.inject.Inject

@AndroidEntryPoint
class CourseDetailActivity :
BindingActivity<ActivityCourseDetailBinding>(R.layout.activity_course_detail) {
@Inject
lateinit var visitorModeManager: VisitorModeManager

@Inject
lateinit var screenRefreshEventBus: ScreenRefreshEventBus

private val viewModel: CourseDetailViewModel by viewModels()
private val isVisitorMode: Boolean = MainActivity.isVisitorMode
private val isVisitorMode: Boolean get() = visitorModeManager.isVisitorMode
private var isFromDeepLink: Boolean = false

// 인텐트 부가 데이터
Expand Down Expand Up @@ -385,7 +397,9 @@ class CourseDetailActivity :
}

when (rootScreen) {
COURSE_STORAGE_SCRAP -> MainActivity.updateStorageScrapScreen()
COURSE_STORAGE_SCRAP -> lifecycleScope.launch {
screenRefreshEventBus.emit(ScreenRefreshEvent.RefreshStorageScrap)
}
COURSE_DISCOVER -> setActivityResult<MainActivity>()
COURSE_DISCOVER_SEARCH -> setActivityResult<DiscoverSearchActivity>()
MY_PAGE_UPLOAD_COURSE -> setActivityResult<MyUploadActivity>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ import com.runnect.runnect.binding.BindingFragment
import com.runnect.runnect.databinding.FragmentDiscoverBinding
import com.runnect.runnect.domain.entity.DiscoverBanner
import com.runnect.runnect.presentation.MainActivity
import com.runnect.runnect.presentation.MainActivity.Companion.isVisitorMode
import com.runnect.runnect.presentation.detail.CourseDetailActivity
import com.runnect.runnect.presentation.event.ScreenRefreshEvent
import com.runnect.runnect.presentation.event.ScreenRefreshEventBus
import com.runnect.runnect.presentation.event.VisitorModeManager
import com.runnect.runnect.presentation.detail.CourseDetailRootScreen
import com.runnect.runnect.presentation.discover.adapter.BannerAdapter
import com.runnect.runnect.presentation.discover.adapter.multiview.DiscoverMultiViewAdapter
Expand All @@ -28,7 +30,6 @@ import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse
import com.runnect.runnect.presentation.discover.pick.DiscoverPickActivity
import com.runnect.runnect.presentation.discover.search.DiscoverSearchActivity
import com.runnect.runnect.presentation.state.UiStateV2
import com.runnect.runnect.presentation.storage.StorageScrapFragment
import com.runnect.runnect.util.analytics.Analytics
import com.runnect.runnect.util.analytics.EventName.EVENT_CLICK_DATE
import com.runnect.runnect.util.analytics.EventName.EVENT_CLICK_SCRAP
Expand All @@ -46,9 +47,16 @@ import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject

@AndroidEntryPoint
class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragment_discover) {
@Inject
lateinit var visitorModeManager: VisitorModeManager

@Inject
lateinit var screenRefreshEventBus: ScreenRefreshEventBus

private val viewModel: DiscoverViewModel by viewModels()

private lateinit var bannerAdapter: BannerAdapter
Expand All @@ -57,7 +65,6 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
private var bannerItemCount = 0

private lateinit var multiViewAdapter: DiscoverMultiViewAdapter
private var isFromStorageScrap = StorageScrapFragment.isFromStorageScrap

private val resultLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
Expand Down Expand Up @@ -106,6 +113,7 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
handleVisitorMode = {
context?.let { showCourseScrapWarningToast(it) }
},
isVisitorMode = { visitorModeManager.isVisitorMode },
onSortButtonClick = { criteria ->
viewModel.sortRecommendCourses(criteria)
Analytics.logClickedItemEvent(returnEventName(criteria))
Expand Down Expand Up @@ -277,7 +285,7 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm

private fun navigateToCourseUploadScreen() {
val context = context ?: return
if (isVisitorMode) {
if (visitorModeManager.isVisitorMode) {
showCourseUploadWarningToast(context)
return
}
Expand All @@ -300,6 +308,17 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
setupRecommendCourseNextPageStateObserver()
setupRecommendCourseSortStateObserver()
setupCourseScrapStateObserver()
collectScreenRefreshEvents()
}

private fun collectScreenRefreshEvents() {
viewLifeCycleScope.launch {
screenRefreshEventBus.events.collect { event ->
if (event is ScreenRefreshEvent.RefreshDiscoverCourses) {
refreshDiscoverCourses()
}
}
}
}

private fun setupBannerGetStateObserver() {
Expand Down Expand Up @@ -491,10 +510,7 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
}

private fun checkFromStorageScrap() {
if (isFromStorageScrap) {
StorageScrapFragment.isFromStorageScrap = false
MainActivity.updateStorageScrapScreen()
}
// No longer needed — screen refresh is handled via ScreenRefreshEventBus
}

private fun registerRefreshLayoutScrollUpCallback() {
Expand All @@ -509,18 +525,6 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
return layoutManager.findFirstCompletelyVisibleItemPosition() > 0
}

override fun onAttach(context: Context) {
super.onAttach(context)
if (context is MainActivity) {
MainActivity.discoverFragment = this
}
}

override fun onDestroy() {
super.onDestroy()
MainActivity.discoverFragment = null
}

companion object {
private const val BANNER_SCROLL_DELAY_TIME = 5000L
private const val CENTER_POS_OF_INFINITE_BANNERS = Int.MAX_VALUE / 2
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.runnect.runnect.databinding.ItemDiscoverMarathonBinding
import com.runnect.runnect.domain.entity.DiscoverMultiViewItem
import com.runnect.runnect.presentation.MainActivity
import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse
import com.runnect.runnect.util.callback.diff.ItemDiffCallback

class DiscoverMarathonAdapter(
private val onHeartButtonClick: (Int, Boolean) -> Unit,
private val onCourseItemClick: (Int) -> Unit,
private val handleVisitorMode: () -> Unit,
private val isVisitorMode: () -> Boolean,
) : ListAdapter<DiscoverMultiViewItem.MarathonCourse,
DiscoverMarathonAdapter.DiscoverMarathonViewHolder>(diffUtil) {

Expand All @@ -28,7 +28,8 @@ class DiscoverMarathonAdapter(
),
onHeartButtonClick,
onCourseItemClick,
handleVisitorMode
handleVisitorMode,
isVisitorMode
)
}

Expand All @@ -41,6 +42,7 @@ class DiscoverMarathonAdapter(
private val onHeartButtonClick: (Int, Boolean) -> Unit,
private val onCourseItemClick: (Int) -> Unit,
private val handleVisitorMode: () -> Unit,
private val isVisitorMode: () -> Boolean,
) : RecyclerView.ViewHolder(binding.root) {
fun bind(course: DiscoverMultiViewItem.MarathonCourse) {
with(binding) {
Expand All @@ -57,7 +59,7 @@ class DiscoverMarathonAdapter(
course: DiscoverMultiViewItem.MarathonCourse
) {
imageView.setOnClickListener { view ->
if (MainActivity.isVisitorMode) {
if (isVisitorMode()) {
handleVisitorMode.invoke()
return@setOnClickListener
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.runnect.runnect.databinding.ItemDiscoverRecommendBinding
import com.runnect.runnect.domain.entity.DiscoverMultiViewItem
import com.runnect.runnect.presentation.MainActivity
import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse
import com.runnect.runnect.util.callback.diff.ItemDiffCallback
import timber.log.Timber
Expand All @@ -17,6 +16,7 @@ class DiscoverRecommendAdapter(
private val onHeartButtonClick: (Int, Boolean) -> Unit,
private val onCourseItemClick: (Int) -> Unit,
private val handleVisitorMode: () -> Unit,
private val isVisitorMode: () -> Boolean,
) : ListAdapter<DiscoverMultiViewItem.RecommendCourse,
DiscoverRecommendAdapter.DiscoverRecommendViewHolder>(diffUtil) {

Expand All @@ -29,7 +29,8 @@ class DiscoverRecommendAdapter(
),
onHeartButtonClick,
onCourseItemClick,
handleVisitorMode
handleVisitorMode,
isVisitorMode
)
}

Expand All @@ -41,7 +42,8 @@ class DiscoverRecommendAdapter(
private val binding: ItemDiscoverRecommendBinding,
private val onHeartButtonClick: (Int, Boolean) -> Unit,
private val onCourseItemClick: (Int) -> Unit,
private val handleVisitorMode: () -> Unit
private val handleVisitorMode: () -> Unit,
private val isVisitorMode: () -> Boolean
) : RecyclerView.ViewHolder(binding.root) {
fun bind(course: DiscoverMultiViewItem.RecommendCourse) {
with(binding) {
Expand All @@ -58,7 +60,7 @@ class DiscoverRecommendAdapter(
course: DiscoverMultiViewItem.RecommendCourse
) {
imageView.setOnClickListener { view ->
if (MainActivity.isVisitorMode) {
if (isVisitorMode()) {
handleVisitorMode.invoke()
return@setOnClickListener
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class DiscoverMultiViewAdapter(
private val onHeartButtonClick: (Int, Boolean) -> Unit,
private val onCourseItemClick: (Int) -> Unit,
private val handleVisitorMode: () -> Unit,
private val isVisitorMode: () -> Boolean,
private val onSortButtonClick: (String) -> Unit
) : RecyclerView.Adapter<DiscoverMultiViewHolder>() {
private val multiViewHolderFactory by lazy { DiscoverMultiViewHolderFactory() }
Expand All @@ -24,6 +25,7 @@ class DiscoverMultiViewAdapter(
onHeartButtonClick = onHeartButtonClick,
onCourseItemClick = onCourseItemClick,
handleVisitorMode = handleVisitorMode,
isVisitorMode = isVisitorMode,
onSortButtonClick = onSortButtonClick
)
}
Expand Down
Loading
Loading