Skip to content

Commit c610f27

Browse files
mwy3055l2hyunwoo
andauthored
kuring-168 메인 화면을 compose로 migrate (#235)
* [추가] 메인 화면의 navigation route 정의 * [추가] 메인 화면의 navigation bar 정의 * [추가] compose type-safe navigation 라이브러리 추가 * [수정] 메인 화면 route에 @serializable 어노테이션 추가 * [수정] KuringSwitch에서 라이브러리 변경에 대응 * [추가] MainScreen composable 구현 * [수정] MainActivity에서 XML 대신 Compose MainScreen을 호출 * [제거] 사용하지 않는 view 코드 제거 * Fix transition issue * [수정] KuringSwitch의 미구현 인터페이스 구현 --------- Co-authored-by: HyunWoo Lee <[email protected]>
1 parent be81489 commit c610f27

File tree

11 files changed

+472
-111
lines changed

11 files changed

+472
-111
lines changed

build-logic/src/main/kotlin/com/ku_stacks/ku_ring/buildlogic/primitive/KotlinPlugin.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class KotlinPlugin : Plugin<Project> {
1818
with(target) {
1919
with(plugins) {
2020
apply("kotlin-android")
21+
apply("kotlinx-serialization")
2122
}
2223

2324
tasks.withType<KotlinCompile> {
@@ -36,6 +37,8 @@ class KotlinPlugin : Plugin<Project> {
3637
implementation(libs.library("kotlinx-coroutines-android"))
3738
implementation(libs.library("kotlinx-coroutines-reactive"))
3839
implementation(libs.library("kotlinx-coroutines-rxjava3"))
40+
41+
implementation(libs.library("kotlinx-serialization"))
3942
}
4043
}
4144
}

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ buildscript {
1111
classpath(libs.google.services)
1212
classpath(libs.firebase.crashlytics.gradle)
1313
classpath(libs.oss.licenses)
14+
classpath(libs.kotlinx.serialization.plugin)
1415
}
1516
}
1617

common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/KuringSwitch.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package com.ku_stacks.ku_ring.designsystem.components
22

33
import androidx.compose.animation.animateColorAsState
4+
import androidx.compose.animation.core.AnimationVector
5+
import androidx.compose.animation.core.DecayAnimationSpec
46
import androidx.compose.animation.core.TweenSpec
7+
import androidx.compose.animation.core.TwoWayConverter
8+
import androidx.compose.animation.core.VectorizedDecayAnimationSpec
59
import androidx.compose.foundation.Canvas
610
import androidx.compose.foundation.ExperimentalFoundationApi
711
import androidx.compose.foundation.background
@@ -102,13 +106,18 @@ fun KuringSwitch(
102106
val anchoredDraggableState = remember(maxBound, switchVelocityThresholdPx) {
103107
AnchoredDraggableState(
104108
initialValue = checked,
105-
animationSpec = AnimationSpec,
106109
anchors = DraggableAnchors {
107110
false at minBound
108111
true at maxBound
109112
},
110-
positionalThreshold = { distance -> distance * SwitchPositionalThreshold },
111-
velocityThreshold = { switchVelocityThresholdPx }
113+
positionalThreshold = { distance: Float -> distance * SwitchPositionalThreshold },
114+
velocityThreshold = { switchVelocityThresholdPx },
115+
snapAnimationSpec = AnimationSpec,
116+
decayAnimationSpec = object : DecayAnimationSpec<Float> {
117+
override fun <V : AnimationVector> vectorize(typeConverter: TwoWayConverter<Float, V>): VectorizedDecayAnimationSpec<V> {
118+
return vectorize(typeConverter)
119+
}
120+
},
112121
)
113122
}
114123
val currentOnCheckedChange by rememberUpdatedState(onCheckedChange)

feature/main/src/main/java/com/ku_stacks/ku_ring/main/MainActivity.kt

Lines changed: 26 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,18 @@ import android.app.Activity
44
import android.content.Context
55
import android.content.Intent
66
import android.os.Bundle
7-
import android.view.MenuItem
7+
import androidx.activity.compose.setContent
88
import androidx.appcompat.app.AppCompatActivity
9-
import androidx.viewpager2.widget.ViewPager2
9+
import androidx.compose.foundation.background
10+
import androidx.compose.foundation.layout.fillMaxSize
11+
import androidx.compose.runtime.getValue
12+
import androidx.compose.runtime.mutableStateOf
13+
import androidx.compose.runtime.remember
14+
import androidx.compose.runtime.setValue
15+
import androidx.compose.ui.Modifier
16+
import androidx.navigation.compose.rememberNavController
17+
import com.ku_stacks.ku_ring.designsystem.kuringtheme.KuringTheme
1018
import com.ku_stacks.ku_ring.domain.WebViewNotice
11-
import com.ku_stacks.ku_ring.main.databinding.ActivityMainBinding
1219
import com.ku_stacks.ku_ring.ui_util.KuringNavigator
1320
import com.ku_stacks.ku_ring.ui_util.showToast
1421
import dagger.hilt.android.AndroidEntryPoint
@@ -17,23 +24,9 @@ import javax.inject.Inject
1724
@AndroidEntryPoint
1825
class MainActivity : AppCompatActivity() {
1926

20-
private lateinit var binding: ActivityMainBinding
21-
2227
@Inject
2328
lateinit var navigator: KuringNavigator
2429

25-
private val pageChangeCallback = object : ViewPager2.OnPageChangeCallback() {
26-
override fun onPageSelected(position: Int) {
27-
binding.mainBottomNavigation.selectedItemId = when (position) {
28-
0 -> R.id.notice_screen
29-
1 -> R.id.archive_screen
30-
2 -> R.id.campus_map_screen
31-
3 -> R.id.setting_screen
32-
else -> throw IllegalStateException("no such main viewpager position")
33-
}
34-
}
35-
}
36-
3730
private var backPressedTime = 0L
3831

3932
override fun onNewIntent(intent: Intent) {
@@ -51,40 +44,23 @@ class MainActivity : AppCompatActivity() {
5144
navToNoticeActivity(webViewNotice)
5245
}
5346

54-
setupBinding()
55-
setupView()
56-
}
57-
58-
private fun setupBinding() {
59-
binding = ActivityMainBinding.inflate(layoutInflater)
60-
setContentView(binding.root)
61-
}
62-
63-
private fun setupView() {
64-
val pagerAdapter = MainPagerAdapter(supportFragmentManager, lifecycle)
65-
66-
binding.mainViewPager.apply {
67-
adapter = pagerAdapter
68-
registerOnPageChangeCallback(pageChangeCallback)
69-
isUserInputEnabled = false
70-
offscreenPageLimit = pagerAdapter.itemCount
71-
}
72-
73-
binding.mainBottomNavigation.setOnItemSelectedListener {
74-
navigationSelected(it)
75-
}
76-
}
77-
78-
private fun navigationSelected(item: MenuItem): Boolean {
79-
when (item.setChecked(true).itemId) {
80-
R.id.notice_screen -> binding.mainViewPager.setCurrentItem(0, false)
81-
R.id.archive_screen -> binding.mainViewPager.setCurrentItem(1, false)
82-
R.id.campus_map_screen -> binding.mainViewPager.setCurrentItem(2, false)
83-
R.id.setting_screen -> binding.mainViewPager.setCurrentItem(3, false)
84-
else -> return false
47+
setContent {
48+
KuringTheme {
49+
var currentRoute: MainScreenRoute by remember { mutableStateOf(MainScreenRoute.Notice) }
50+
val navController = rememberNavController()
51+
MainScreen(
52+
navController = navController,
53+
currentRoute = currentRoute,
54+
onNavigateToRoute = {
55+
if (currentRoute != it) {
56+
currentRoute = it
57+
navController.navigate(it)
58+
}
59+
},
60+
modifier = Modifier.fillMaxSize().background(KuringTheme.colors.background),
61+
)
62+
}
8563
}
86-
87-
return true
8864
}
8965

9066
private fun navToNoticeActivity(webViewNotice: WebViewNotice) {
@@ -100,11 +76,6 @@ class MainActivity : AppCompatActivity() {
10076
}
10177
}
10278

103-
override fun onDestroy() {
104-
super.onDestroy()
105-
binding.mainViewPager.unregisterOnPageChangeCallback(pageChangeCallback)
106-
}
107-
10879
companion object {
10980
fun createIntent(context: Context) = Intent(context, MainActivity::class.java)
11081

feature/main/src/main/java/com/ku_stacks/ku_ring/main/MainPagerAdapter.kt

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)