From b6c80c486e6a423afe78184bb98d4da3203eb08f Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Sat, 20 Jan 2024 21:02:46 +0900 Subject: [PATCH 01/34] =?UTF-8?q?kuring-98=20[=EC=B6=94=EA=B0=80]=20?= =?UTF-8?q?=ED=88=AC=EB=AA=85=20IconButton=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/TransparentIconButton.kt | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/TransparentIconButton.kt diff --git a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/TransparentIconButton.kt b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/TransparentIconButton.kt new file mode 100644 index 000000000..f413e18f8 --- /dev/null +++ b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/TransparentIconButton.kt @@ -0,0 +1,48 @@ +package com.ku_stacks.ku_ring.designsystem.components + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.padding +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import com.ku_stacks.ku_ring.designsystem.R +import com.ku_stacks.ku_ring.designsystem.theme.KuringTheme + +/** + * [IconButton]과 같은 크기를 채우고 싶을 때 사용하는 Composable이다. + * + * @param modifier 적용할 [Modifier]. 단, 일반적으로 매개변수를 넘겨주지 않는 것이 권장되며, + * UI 특성상 [Modifier]를 적용하더라도 크기와 관련된 것은 적용하지 않는 것을 권장한다. + */ +@Composable +fun TransparentIconButton(modifier: Modifier = Modifier) { + IconButton( + onClick = {}, + enabled = false, + modifier = modifier, + ) { + Icon( + painter = painterResource(id = R.drawable.ic_back), + contentDescription = null, + tint = Color.Transparent, + ) + } +} + +@LightPreview +@Composable +private fun TransparentIconButtonPreview() { + KuringTheme { + TransparentIconButton( + modifier = Modifier + .background(Color.Black) + .padding(16.dp) + .border(width = 1.dp, color = Color.White), + ) + } +} \ No newline at end of file From ff70357c765aa1248f63c4c8705313e39aa47269 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Sat, 20 Jan 2024 21:09:51 +0900 Subject: [PATCH 02/34] =?UTF-8?q?kuring-98=20[=EC=B6=94=EA=B0=80]=20?= =?UTF-8?q?=EB=8D=94=20=ED=81=B0=20=EC=83=81=EB=8B=A8=EB=B0=94=EC=9D=B8=20?= =?UTF-8?q?LargeTopAppBar=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designsystem/components/LargeTopAppBar.kt | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/LargeTopAppBar.kt diff --git a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/LargeTopAppBar.kt b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/LargeTopAppBar.kt new file mode 100644 index 000000000..0ec6aad84 --- /dev/null +++ b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/LargeTopAppBar.kt @@ -0,0 +1,105 @@ +package com.ku_stacks.ku_ring.designsystem.components + +import androidx.annotation.DrawableRes +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.ku_stacks.ku_ring.designsystem.R +import com.ku_stacks.ku_ring.designsystem.theme.KuringTheme +import com.ku_stacks.ku_ring.designsystem.theme.Pretendard + +/** + * [CenterTitleTopBar]보다 더 넓은 공간을 차지하는 Top App Bar이다. + * + * 제목은 반드시 보여줘야 하며, 필요하다면 navigation 아이콘을 보여줄 수 있다. + * + * @param title 제목 문자열 + * @param modifier 적용할 [Modifier] + * @param navigationIconId Navigation 아이콘의 drawable ID + * @param onNavigationIconClick Navigation 아이콘을 클릭했을 때 실행할 콜백 + * @param iconDescription Navigation 아이콘을 설명하는 문자열. 접근성 서비스에 제공되는 값이다. + */ +@Composable +fun LargeTopAppBar( + title: String, + modifier: Modifier = Modifier, + @DrawableRes navigationIconId: Int? = null, + onNavigationIconClick: (() -> Unit)? = null, + iconDescription: String? = null, +) { + Column( + modifier = modifier + .background(MaterialTheme.colors.surface) + .padding(start = 14.dp, top = 14.dp), + ) { + if (navigationIconId == null) { + TransparentIconButton() + } else { + IconButton( + onClick = { onNavigationIconClick?.invoke() }, + enabled = onNavigationIconClick != null, + ) { + Icon( + painter = painterResource(id = navigationIconId), + contentDescription = iconDescription, + tint = MaterialTheme.colors.onSurface, + ) + } + } + + LargeTopAppBarTitle(title = title) + } +} + +@Composable +private fun LargeTopAppBarTitle( + title: String, + modifier: Modifier = Modifier, +) { + Text( + text = title, + style = TextStyle( + fontSize = 24.sp, + lineHeight = 36.sp, + fontFamily = Pretendard, + fontWeight = FontWeight(700), + color = MaterialTheme.colors.onSurface, + ), + modifier = modifier.padding(start = 12.dp, top = 26.dp), + ) +} + +@LightAndDarkPreview +@Composable +private fun LargeTopAppBarPreview_Icon() { + KuringTheme { + LargeTopAppBar( + title = "학과를 추가하거나\n삭제할 수 있어요", + modifier = Modifier.fillMaxWidth(), + navigationIconId = R.drawable.ic_back, + ) + } +} + +@LightPreview +@Composable +private fun LargeTopAppBarPreview_NoIcon() { + KuringTheme { + LargeTopAppBar( + title = "학과를 추가하거나\n삭제할 수 있어요", + modifier = Modifier.fillMaxWidth(), + ) + } +} \ No newline at end of file From bb8d94fed3a8d42c196b84ff6d9961aa4ed47f13 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Sat, 20 Jan 2024 22:19:55 +0900 Subject: [PATCH 03/34] =?UTF-8?q?kuring-98=20[=EC=B6=94=EA=B0=80]=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8/=EC=B7=A8=EC=86=8C=EB=A5=BC=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8A=94=20KuringAle?= =?UTF-8?q?rtDialog=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/KuringAlertDIalog.kt | 183 ++++++++++++++++++ .../ku_ring/designsystem/theme/Color.kt | 2 + 2 files changed, 185 insertions(+) create mode 100644 common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/KuringAlertDIalog.kt diff --git a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/KuringAlertDIalog.kt b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/KuringAlertDIalog.kt new file mode 100644 index 000000000..f46a4a794 --- /dev/null +++ b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/KuringAlertDIalog.kt @@ -0,0 +1,183 @@ +package com.ku_stacks.ku_ring.designsystem.components + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Divider +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import com.ku_stacks.ku_ring.designsystem.R +import com.ku_stacks.ku_ring.designsystem.theme.Gray2 +import com.ku_stacks.ku_ring.designsystem.theme.KuringTheme +import com.ku_stacks.ku_ring.designsystem.theme.Pretendard + +@Composable +fun KuringAlertDialog( + text: String, + onConfirm: () -> Unit, + onDismiss: () -> Unit, + modifier: Modifier = Modifier, + confirmText: String = stringResource(id = R.string.confirm), + dismissText: String = stringResource(id = R.string.cancel), +) { + Dialog( + onDismissRequest = onDismiss, + properties = DialogProperties(usePlatformDefaultWidth = false), + ) { + KuringAlertDialogContents( + text = text, + confirmText = confirmText, + onConfirm = onConfirm, + dismissText = dismissText, + onDismiss = onDismiss, + modifier = modifier, + ) + } +} + +@Composable +private fun KuringAlertDialogContents( + text: String, + confirmText: String, + onConfirm: () -> Unit, + dismissText: String, + onDismiss: () -> Unit, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier + .clip(RoundedCornerShape(15.dp)) + .background(MaterialTheme.colors.surface) + .size(width = 314.dp, height = 186.dp), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + // 버튼 클릭 이펙트는 위아래로 16dp씩 보이면서 + // 텍스트의 위치는 팝업 상단과 버튼 텍스트와 중간을 맞추기 위해 + // KuringAlertDialogText에 top padding을 16dp 줌 + Box(modifier = Modifier.weight(1f)) { + KuringAlertDialogText( + text = text, + modifier = Modifier + .align(Alignment.Center) + .padding(top = 16.dp), + ) + } + KuringAlertDialogButtons( + confirmText = confirmText, + onConfirm = onConfirm, + dismissText = dismissText, + onDismiss = onDismiss, + modifier = Modifier.fillMaxWidth(), + ) + } +} + +@Composable +private fun KuringAlertDialogText( + text: String, + modifier: Modifier = Modifier, +) { + Text( + text = text, + style = TextStyle( + fontSize = 18.sp, + lineHeight = 27.sp, + fontFamily = Pretendard, + fontWeight = FontWeight(500), + color = MaterialTheme.colors.onSurface, + textAlign = TextAlign.Center, + ), + modifier = modifier, + ) +} + +@Composable +private fun KuringAlertDialogButtons( + confirmText: String, + onConfirm: () -> Unit, + dismissText: String, + onDismiss: () -> Unit, + modifier: Modifier = Modifier, +) { + Row(modifier = modifier.height(IntrinsicSize.Min)) { + KuringAlertDialogButton( + text = dismissText, + onClick = onDismiss, + modifier = Modifier.weight(1f), + ) + Divider( + color = Color(0x26000000), + modifier = Modifier + .padding(vertical = 16.dp) + .fillMaxHeight() + .width(1.dp), + ) + KuringAlertDialogButton( + text = confirmText, + onClick = onConfirm, + modifier = Modifier.weight(1f), + textColor = MaterialTheme.colors.primary, + ) + } +} + +@Composable +private fun KuringAlertDialogButton( + text: String, + onClick: () -> Unit, + modifier: Modifier = Modifier, + textColor: Color = Gray2, +) { + Box( + modifier = modifier.clickable(onClick = onClick) + ) { + Text( + text = text, + style = TextStyle( + fontSize = 16.sp, + fontFamily = Pretendard, + fontWeight = FontWeight(500), + color = textColor, + ), + modifier = Modifier + .align(Alignment.Center) + .padding(vertical = 16.dp), + ) + } +} + +@LightAndDarkPreview +@Composable +private fun KuringAlertDialogPreview() { + KuringTheme { + KuringAlertDialog( + text = "스마트ICT융합공학과를\n삭제하시겠습니까?", + onConfirm = {}, + onDismiss = {}, + modifier = Modifier.padding(16.dp), + ) + } +} \ No newline at end of file diff --git a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/theme/Color.kt b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/theme/Color.kt index 74f17d54c..c8a314046 100644 --- a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/theme/Color.kt +++ b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/theme/Color.kt @@ -20,6 +20,8 @@ val CaptionGray1: Color @Composable get() = Color(0xFF868A92) val CaptionGray2: Color @Composable get() = Color(0xFFAEB1B6) +val Gray2: Color + @Composable get() = Color(0xFF636363) val lightColorPalette: Colors @Composable get() = lightColors( From f6bbcf41163f30cf10aee3754df804f25dce66c3 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Tue, 23 Jan 2024 21:53:37 +0900 Subject: [PATCH 04/34] =?UTF-8?q?kuring-98=20[=EC=B6=94=EA=B0=80]=20?= =?UTF-8?q?=ED=95=99=EA=B3=BC=20=EA=B5=AC=EB=8F=85=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EB=AA=A8=EB=93=88=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/edit_departments/.gitignore | 1 + feature/edit_departments/build.gradle | 83 +++++++++++++++++++ feature/edit_departments/consumer-rules.pro | 0 feature/edit_departments/proguard-rules.pro | 21 +++++ .../src/main/AndroidManifest.xml | 4 + settings.gradle | 1 + 6 files changed, 110 insertions(+) create mode 100644 feature/edit_departments/.gitignore create mode 100644 feature/edit_departments/build.gradle create mode 100644 feature/edit_departments/consumer-rules.pro create mode 100644 feature/edit_departments/proguard-rules.pro create mode 100644 feature/edit_departments/src/main/AndroidManifest.xml diff --git a/feature/edit_departments/.gitignore b/feature/edit_departments/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/feature/edit_departments/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/feature/edit_departments/build.gradle b/feature/edit_departments/build.gradle new file mode 100644 index 000000000..52cbd6cca --- /dev/null +++ b/feature/edit_departments/build.gradle @@ -0,0 +1,83 @@ +plugins { + id 'com.android.library' + id 'org.jetbrains.kotlin.android' + id 'kotlin-kapt' + id 'dagger.hilt.android.plugin' +} + +android { + namespace 'com.ku_stacks.ku_ring.edit_departments' + compileSdk 34 + + defaultConfig { + minSdk 24 + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } + buildFeatures { + compose true + } + composeOptions { + kotlinCompilerExtensionVersion = libs.versions.compose.compiler.get() + } + packagingOptions { + resources { + excludes += '/META-INF/{AL2.0,LGPL2.1}' + } + } +} + +dependencies { + implementation project(":common:util") + implementation project(":common:designsystem") + implementation project(":common:ui_util") + implementation project(":common:thirdparty") + implementation project(":common:preferences") + implementation project(":data:domain") + implementation project(":data:department") + + implementation libs.androidx.core.ktx + + // dagger hilt + kapt libs.androidx.hilt.compiler + implementation libs.hilt.android + kapt libs.hilt.compiler + androidTestImplementation libs.hilt.android.testing + kaptAndroidTest libs.hilt.compiler + testImplementation libs.hilt.android.testing + kaptTest libs.hilt.compiler + + // Compose + implementation platform(libs.compose.bom) + implementation libs.bundles.compose + implementation libs.bundles.compose.interop + + // coroutines + implementation libs.bundles.coroutines + testImplementation libs.kotlinx.coroutines.test + + // firebase + implementation platform(libs.firebase.bom) + implementation libs.bundles.firebase + + // rxJava + implementation libs.bundles.rxjava + + // Timber + implementation libs.timber +} \ No newline at end of file diff --git a/feature/edit_departments/consumer-rules.pro b/feature/edit_departments/consumer-rules.pro new file mode 100644 index 000000000..e69de29bb diff --git a/feature/edit_departments/proguard-rules.pro b/feature/edit_departments/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/feature/edit_departments/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/feature/edit_departments/src/main/AndroidManifest.xml b/feature/edit_departments/src/main/AndroidManifest.xml new file mode 100644 index 000000000..44008a433 --- /dev/null +++ b/feature/edit_departments/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index b1aae4eee..6f299f426 100644 --- a/settings.gradle +++ b/settings.gradle @@ -35,3 +35,4 @@ include ':feature:onboarding' include ':feature:splash' include ':feature:main' include ':common:designsystem' +include ':feature:edit_departments' From 84addfa6be833a0dcf6c2fc936dcdf599d95c54e Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 24 Jan 2024 14:22:33 +0900 Subject: [PATCH 05/34] =?UTF-8?q?kuring-98=20[=EC=B6=94=EA=B0=80]=20EditDe?= =?UTF-8?q?partmentsActivity=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/AndroidManifest.xml | 10 +++++++- .../EditDepartmentsActivity.kt | 24 +++++++++++++++++++ .../src/main/res/values/strings.xml | 3 +++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt create mode 100644 feature/edit_departments/src/main/res/values/strings.xml diff --git a/feature/edit_departments/src/main/AndroidManifest.xml b/feature/edit_departments/src/main/AndroidManifest.xml index 44008a433..e487cf69a 100644 --- a/feature/edit_departments/src/main/AndroidManifest.xml +++ b/feature/edit_departments/src/main/AndroidManifest.xml @@ -1,4 +1,12 @@ - + + + + + \ No newline at end of file diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt new file mode 100644 index 000000000..0649b5451 --- /dev/null +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt @@ -0,0 +1,24 @@ +package com.ku_stacks.ku_ring.edit_departments + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import com.ku_stacks.ku_ring.designsystem.theme.KuringTheme + +class EditDepartmentsActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + KuringTheme { + + } + } + } + + override fun finish() { + super.finish() + overridePendingTransition(R.anim.anim_slide_left_enter, R.anim.anim_slide_left_exit) + } + + // TODO: companion object에 start 함수 구현 +} \ No newline at end of file diff --git a/feature/edit_departments/src/main/res/values/strings.xml b/feature/edit_departments/src/main/res/values/strings.xml new file mode 100644 index 000000000..829a99f28 --- /dev/null +++ b/feature/edit_departments/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + 학과 수정 화면 + \ No newline at end of file From 167d8cff4b362764d469e4f03e26d6179703642e Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 24 Jan 2024 16:45:04 +0900 Subject: [PATCH 06/34] =?UTF-8?q?kuring-98=20[=EC=B6=94=EA=B0=80]=20?= =?UTF-8?q?=ED=95=99=EA=B3=BC=20component=203=EA=B0=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/DepartmentItems.kt | 238 ++++++++++++++++++ .../src/main/res/values/strings.xml | 2 + 2 files changed, 240 insertions(+) create mode 100644 common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/DepartmentItems.kt diff --git a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/DepartmentItems.kt b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/DepartmentItems.kt new file mode 100644 index 000000000..b91475bcd --- /dev/null +++ b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/DepartmentItems.kt @@ -0,0 +1,238 @@ +package com.ku_stacks.ku_ring.designsystem.components + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.material.contentColorFor +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.ku_stacks.ku_ring.designsystem.R +import com.ku_stacks.ku_ring.designsystem.theme.KuringTheme +import com.ku_stacks.ku_ring.designsystem.theme.Pretendard +import com.ku_stacks.ku_ring.domain.Department + +@Composable +fun DepartmentWithDeleteIcon( + department: Department, + onDeleteDepartment: (Department) -> Unit, + modifier: Modifier = Modifier, +) { + Department( + department = department, + modifier = modifier, + ) { + if (department.isSelected) { + SelectedDepartmentMark() + } + Spacer(modifier = Modifier.weight(1f)) + DeleteIconButton(onClick = { onDeleteDepartment(department) }) + } +} + +@Composable +fun DepartmentWithAddIcon( + department: Department, + onAddDepartment: (Department) -> Unit, + modifier: Modifier = Modifier, +) { + Department( + department = department, + modifier = modifier, + ) { + Spacer(modifier = Modifier.weight(1f)) + AddIconButton(onClick = { onAddDepartment(department) }) + } +} + +@Composable +fun DepartmentWithCheckIcon( + department: Department, + onClickDepartment: (Department) -> Unit, + modifier: Modifier = Modifier, +) { + Department( + department = department, + modifier = modifier, + ) { + Spacer(modifier = Modifier.weight(1f)) + CheckIconButton(onClick = { onClickDepartment(department) }) + } +} + +@Composable +private fun SelectedDepartmentMark( + modifier: Modifier = Modifier, +) { + val shape = RoundedCornerShape(50) + Box( + modifier = modifier + .clip(shape) + .background(MaterialTheme.colors.surface, shape) + .border(0.5.dp, MaterialTheme.colors.primary, shape) + .padding(horizontal = 8.dp), + ) { + Text( + text = stringResource(id = R.string.selected_department), + style = TextStyle( + fontSize = 11.sp, + lineHeight = 17.93.sp, + fontFamily = Pretendard, + fontWeight = FontWeight(600), + color = MaterialTheme.colors.primary, + ), + ) + } +} + +@Composable +private fun DeleteIconButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + contentDescription: String? = null, +) { + IconButton( + onClick = onClick, + modifier = modifier, + ) { + Icon( + painter = painterResource(id = R.drawable.ic_trashcan), + contentDescription = contentDescription, + tint = contentColorFor(backgroundColor = MaterialTheme.colors.surface), + ) + } +} + +@Composable +private fun AddIconButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + contentDescription: String? = null, +) { + IconButton( + onClick = onClick, + modifier = modifier, + ) { + Icon( + painter = painterResource(id = R.drawable.ic_add), + contentDescription = contentDescription, + tint = contentColorFor(backgroundColor = MaterialTheme.colors.surface), + ) + } +} + +@Composable +private fun CheckIconButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + contentDescription: String? = null, +) { + IconButton( + onClick = onClick, + modifier = modifier, + ) { + Icon( + painter = painterResource(id = R.drawable.ic_check_checked), + contentDescription = contentDescription, + tint = MaterialTheme.colors.primary, + ) + } +} + +@Composable +private fun Department( + department: Department, + modifier: Modifier = Modifier, + contents: @Composable RowScope.() -> Unit = {}, +) { + val backgroundColor = MaterialTheme.colors.surface + Row( + modifier = modifier + .background(backgroundColor) + .padding(start = 24.dp, end = 12.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp), + ) { + DepartmentTitle( + departmentName = department.koreanName, + textColor = contentColorFor(backgroundColor), + ) + contents() + } +} + +@Composable +private fun DepartmentTitle( + departmentName: String, + modifier: Modifier = Modifier, + textColor: Color = Color.Unspecified, +) { + Text( + text = departmentName, + style = TextStyle( + fontSize = 16.sp, + lineHeight = 24.sp, + fontFamily = Pretendard, + fontWeight = FontWeight(500), + color = textColor, + ), + modifier = modifier, + ) +} + +private val previewDepartment = Department( + name = "smart_ict", + shortName = "sicte", + koreanName = "스마트ICT융합공학과", + isSubscribed = true, + isSelected = true, + isNotificationEnabled = false, +) + +@LightAndDarkPreview +@Composable +private fun DepartmentItemsPreview() { + KuringTheme { + Column( + modifier = Modifier + .background(Color.Gray) + .fillMaxWidth(), + ) { + DepartmentWithDeleteIcon( + department = previewDepartment, + onDeleteDepartment = {}, + modifier = Modifier.fillMaxWidth(), + ) + DepartmentWithAddIcon( + department = previewDepartment, + onAddDepartment = {}, + modifier = Modifier.fillMaxWidth(), + ) + DepartmentWithCheckIcon( + department = previewDepartment, + onClickDepartment = {}, + modifier = Modifier.fillMaxWidth(), + ) + } + } +} \ No newline at end of file diff --git a/common/designsystem/src/main/res/values/strings.xml b/common/designsystem/src/main/res/values/strings.xml index 5f645a3ea..9f9572972 100644 --- a/common/designsystem/src/main/res/values/strings.xml +++ b/common/designsystem/src/main/res/values/strings.xml @@ -9,6 +9,8 @@ 시작하기 완료하기 + 대표 + ver. %1$s © 2021 KU Ring. All rights reserved. From 92df329f7e8239b95fd70783506f10cc38dee3fb Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 24 Jan 2024 17:50:19 +0900 Subject: [PATCH 07/34] =?UTF-8?q?kuring-98=20[=EC=B6=94=EA=B0=80]=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=EC=B0=BD=20component=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/SearchTextField.kt | 163 ++++++++++++++++++ .../ku_ring/designsystem/theme/Color.kt | 2 + 2 files changed, 165 insertions(+) create mode 100644 common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/SearchTextField.kt diff --git a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/SearchTextField.kt b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/SearchTextField.kt new file mode 100644 index 000000000..6ef4da841 --- /dev/null +++ b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/SearchTextField.kt @@ -0,0 +1,163 @@ +package com.ku_stacks.ku_ring.designsystem.components + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.material.TextFieldDefaults +import androidx.compose.material.contentColorFor +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.scale +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.VisualTransformation +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.ku_stacks.ku_ring.designsystem.R +import com.ku_stacks.ku_ring.designsystem.theme.BoxBackgroundColor2 +import com.ku_stacks.ku_ring.designsystem.theme.CaptionGray1 +import com.ku_stacks.ku_ring.designsystem.theme.KuringTheme +import com.ku_stacks.ku_ring.designsystem.theme.Pretendard + +@OptIn(ExperimentalMaterialApi::class) +@Composable +fun SearchTextField( + query: String, + onQueryUpdate: (String) -> Unit, + modifier: Modifier = Modifier, + placeholderText: String = "", + singleLine: Boolean = true, + keyboardOptions: KeyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, +) { + val shape = RoundedCornerShape(50) + val backgroundColor = BoxBackgroundColor2 + val textColor = contentColorFor(backgroundColor) + + BasicTextField( + value = query, + onValueChange = onQueryUpdate, + modifier = modifier + .clip(shape) + .background(backgroundColor, shape = shape) + .border(1.dp, MaterialTheme.colors.primary, shape = shape), + textStyle = TextStyle( + fontSize = 16.sp, + lineHeight = 24.sp, + fontFamily = Pretendard, + fontWeight = FontWeight(400), + ), + decorationBox = { innerTextField -> + TextFieldDefaults.TextFieldDecorationBox( + value = query, + innerTextField = innerTextField, + enabled = true, + singleLine = singleLine, + visualTransformation = VisualTransformation.None, + interactionSource = interactionSource, + placeholder = { + Placeholder(placeholderText = placeholderText) + }, + leadingIcon = { + LeadingSearchIcon() + }, + trailingIcon = { + AnimatedVisibility( + visible = query.isNotEmpty(), + enter = fadeIn(), + exit = fadeOut(), + ) { + TrailingDeleteIcon(onClear = { onQueryUpdate("") }) + } + }, + colors = TextFieldDefaults.textFieldColors( + textColor = textColor, + backgroundColor = backgroundColor, + ), + ) + }, + singleLine = singleLine, + keyboardOptions = keyboardOptions, + ) +} + +@Composable +private fun LeadingSearchIcon(modifier: Modifier = Modifier) { + Icon( + painter = painterResource(id = R.drawable.ic_search), + contentDescription = null, + tint = MaterialTheme.colors.primary, + modifier = modifier, + ) +} + +@Composable +private fun Placeholder( + placeholderText: String, + modifier: Modifier = Modifier, +) { + Text( + text = placeholderText, + modifier = modifier, + style = TextStyle( + fontSize = 16.sp, + lineHeight = 24.sp, + fontFamily = Pretendard, + fontWeight = FontWeight(400), + color = Color(0xFF8E8E8E), + ) + ) +} + +@Composable +private fun TrailingDeleteIcon( + onClear: () -> Unit, + modifier: Modifier = Modifier, +) { + Icon( + painter = painterResource(id = R.drawable.ic_close), + contentDescription = null, + tint = CaptionGray1, + modifier = modifier + .scale(0.8f) + .clickable(onClick = onClear), + ) +} + +@LightAndDarkPreview +@Composable +private fun SearchTextFieldPreview() { + var query by remember { mutableStateOf("") } + KuringTheme { + SearchTextField( + query = query, + onQueryUpdate = { query = it }, + placeholderText = "추가할 학과를 검색해 주세요", + modifier = Modifier + .background(MaterialTheme.colors.surface) + .padding(16.dp) + .fillMaxWidth(), + ) + } +} \ No newline at end of file diff --git a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/theme/Color.kt b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/theme/Color.kt index c8a314046..050a89584 100644 --- a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/theme/Color.kt +++ b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/theme/Color.kt @@ -22,6 +22,8 @@ val CaptionGray2: Color @Composable get() = Color(0xFFAEB1B6) val Gray2: Color @Composable get() = Color(0xFF636363) +val BoxBackgroundColor2: Color + @Composable get() = Color(0xFFF2F3F5) val lightColorPalette: Colors @Composable get() = lightColors( From b1fd6612b843fbd979012ec4f27ff04cfd8e2a3d Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 24 Jan 2024 17:59:59 +0900 Subject: [PATCH 08/34] =?UTF-8?q?kuring-98=20[=EC=B6=94=EA=B0=80]=20?= =?UTF-8?q?=ED=95=99=EA=B3=BC=20=ED=8E=B8=EC=A7=91=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EC=A0=9C=EB=AA=A9,=20=EA=B2=80=EC=83=89=EC=B0=BD=EA=B9=8C?= =?UTF-8?q?=EC=A7=80=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compose/EditDepartments.kt | 95 +++++++++++++++++++ .../src/main/res/values/strings.xml | 3 + 2 files changed, 98 insertions(+) create mode 100644 feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt new file mode 100644 index 000000000..dcc12dc4e --- /dev/null +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt @@ -0,0 +1,95 @@ +package com.ku_stacks.ku_ring.edit_departments.compose + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.ku_stacks.ku_ring.designsystem.components.LargeTopAppBar +import com.ku_stacks.ku_ring.designsystem.components.LightAndDarkPreview +import com.ku_stacks.ku_ring.designsystem.components.SearchTextField +import com.ku_stacks.ku_ring.designsystem.theme.KuringTheme +import com.ku_stacks.ku_ring.edit_departments.R + +@Composable +fun EditDepartments( + onClose: () -> Unit, + query: String, + onQueryUpdate: (String) -> Unit, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier, + verticalArrangement = Arrangement.spacedBy(20.dp), + ) { + EditDepartmentsTitle( + onClose = onClose, + modifier = Modifier.fillMaxWidth(), + ) + EditDepartmentsContents( + query = query, + onQueryUpdate = onQueryUpdate, + modifier = Modifier.fillMaxWidth(), + ) + } +} + +@Composable +private fun EditDepartmentsTitle( + onClose: () -> Unit, + modifier: Modifier = Modifier, +) { + LargeTopAppBar( + title = stringResource(id = R.string.app_bar_title), + navigationIconId = R.drawable.ic_back, + onNavigationIconClick = onClose, + modifier = modifier, + ) +} + +@Composable +private fun EditDepartmentsContents( + query: String, + onQueryUpdate: (String) -> Unit, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier, + verticalArrangement = Arrangement.spacedBy(13.dp), + ) { + SearchTextField( + query = query, + onQueryUpdate = onQueryUpdate, + placeholderText = stringResource(id = R.string.search_placeholder), + modifier = Modifier + .padding(horizontal = 20.dp) + .fillMaxWidth(), + ) + } +} + +@LightAndDarkPreview +@Composable +private fun EditDepartmentsPreview() { + var query by remember { mutableStateOf("") } + KuringTheme { + EditDepartments( + onClose = {}, + query = query, + onQueryUpdate = { query = it }, + modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colors.surface), + ) + } +} \ No newline at end of file diff --git a/feature/edit_departments/src/main/res/values/strings.xml b/feature/edit_departments/src/main/res/values/strings.xml index 829a99f28..0ee844ee3 100644 --- a/feature/edit_departments/src/main/res/values/strings.xml +++ b/feature/edit_departments/src/main/res/values/strings.xml @@ -1,3 +1,6 @@ 학과 수정 화면 + + 학과를 추가하거나\n삭제할 수 있어요 + 추가할 학과를 검색해 주세요 \ No newline at end of file From bfa50e62b338181d72942cdd4907c3238a365315 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Tue, 30 Jan 2024 16:15:20 +0900 Subject: [PATCH 09/34] =?UTF-8?q?kuring-98=20[=EC=B6=94=EA=B0=80]=20?= =?UTF-8?q?=ED=95=99=EA=B3=BC=20=ED=8E=B8=EC=A7=91=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=B3=B4=EC=97=AC=EC=A4=84=20=ED=95=99?= =?UTF-8?q?=EA=B3=BC=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=EB=A5=BC=20wrap?= =?UTF-8?q?=ED=95=98=EB=8A=94=20DepartmentsUiModel=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../edit_departments/uimodel/DepartmentsUiModel.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/DepartmentsUiModel.kt diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/DepartmentsUiModel.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/DepartmentsUiModel.kt new file mode 100644 index 000000000..317e34ac8 --- /dev/null +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/DepartmentsUiModel.kt @@ -0,0 +1,13 @@ +package com.ku_stacks.ku_ring.edit_departments.uimodel + +import com.ku_stacks.ku_ring.domain.Department + +/** + * 학과 편집 화면에서 학과를 보여주는 경우를 wrap하는 클래스이다. + * + * @param departments 화면에 보여줄 학과 리스트이다. 보여주는 학과의 의미는 상황에 따라 다를 수 있다. + */ +sealed class DepartmentsUiModel(val departments: List) { + class SelectedDepartments(departments: List) : DepartmentsUiModel(departments) + class SearchedDepartments(departments: List) : DepartmentsUiModel(departments) +} \ No newline at end of file From 53ed00e3323b9952761b81d5a1554e8d2e813bd1 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Tue, 30 Jan 2024 16:15:56 +0900 Subject: [PATCH 10/34] =?UTF-8?q?kuring-98=20[=EC=B6=94=EA=B0=80]=20?= =?UTF-8?q?=ED=95=99=EA=B3=BC=20=ED=8E=B8=EC=A7=91=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=B3=B4=EC=97=AC=EC=A4=84=20=ED=8C=9D?= =?UTF-8?q?=EC=97=85=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=A5=BC=20wrap?= =?UTF-8?q?=ED=95=98=EB=8A=94=20PopupUiModel=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../edit_departments/uimodel/PopupUiModel.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/PopupUiModel.kt diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/PopupUiModel.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/PopupUiModel.kt new file mode 100644 index 000000000..6be2f62ae --- /dev/null +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/PopupUiModel.kt @@ -0,0 +1,21 @@ +package com.ku_stacks.ku_ring.edit_departments.uimodel + +import androidx.annotation.StringRes +import com.ku_stacks.ku_ring.edit_departments.R + +/** + * 학과 선택 화면에서 보여줄 팝업 데이터를 wrap하는 클래스이다. + * + * @param departmentKoreanName 팝업에서 보여줄 학과의 한국어 이름이다. + * @param stringResId 팝업에서 보여줄 문자열의 resource id이다. + */ +sealed class PopupUiModel( + val departmentKoreanName: String, + @StringRes val stringResId: Int, +) { + class AddPopupUiModel(departmentKoreanName: String) : + PopupUiModel(departmentKoreanName, R.string.add_department_popup_title) + + class DeletePopupUiModel(departmentKoreanName: String) : + PopupUiModel(departmentKoreanName, R.string.delete_department_popup_title) +} \ No newline at end of file From b30bfe446ad1e71639d71b04fe43bbf36fcdb222 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Tue, 30 Jan 2024 16:17:06 +0900 Subject: [PATCH 11/34] =?UTF-8?q?kuring-98=20[=EC=B6=94=EA=B0=80]=20?= =?UTF-8?q?=ED=95=99=EA=B3=BC=20=ED=8E=B8=EC=A7=91=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=9D=98=20=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EditDepartmentsViewModel.kt | 104 ++++++++++++++++++ .../src/main/res/values/strings.xml | 3 + 2 files changed, 107 insertions(+) create mode 100644 feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt new file mode 100644 index 000000000..c773946ff --- /dev/null +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt @@ -0,0 +1,104 @@ +package com.ku_stacks.ku_ring.edit_departments + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.compose.runtime.snapshotFlow +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.ku_stacks.ku_ring.department.repository.DepartmentRepository +import com.ku_stacks.ku_ring.domain.Department +import com.ku_stacks.ku_ring.edit_departments.uimodel.DepartmentsUiModel +import com.ku_stacks.ku_ring.edit_departments.uimodel.PopupUiModel +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.mapLatest +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch +import javax.inject.Inject + +class EditDepartmentsViewModel @Inject constructor( + private val departmentRepository: DepartmentRepository, +) : ViewModel() { + + var query by mutableStateOf("") + private set + + @OptIn(ExperimentalCoroutinesApi::class) + val departments: StateFlow + get() = snapshotFlow { query } + .mapLatest(::getDepartmentsUiModel) + .stateIn( + scope = viewModelScope, + started = SharingStarted.Lazily, + initialValue = DepartmentsUiModel.SearchedDepartments(emptyList()), + ) + + var popupUiModel by mutableStateOf(null) + private set + + fun onQueryUpdate(newQuery: String) { + query = newQuery + } + + private suspend fun getDepartmentsUiModel(query: String): DepartmentsUiModel { + return if (query.isEmpty()) { + DepartmentsUiModel.SelectedDepartments(getSubscribedDepartments()) + } else { + DepartmentsUiModel.SearchedDepartments(searchDepartments(query)) + } + } + + private suspend fun getSubscribedDepartments(): List { + return departmentRepository.getSubscribedDepartments() + } + + private suspend fun searchDepartments(query: String): List { + return departmentRepository.getDepartmentsByKoreanName(query) + } + + fun onDeleteIconClick(department: Department) { + popupUiModel = PopupUiModel.DeletePopupUiModel(department.koreanName) + } + + fun onAddIconClick(department: Department) { + popupUiModel = PopupUiModel.AddPopupUiModel(department.koreanName) + } + + fun onCheckIconClick(department: Department) { + onDeleteIconClick(department) + } + + fun onPopupConfirmButtonClick(popupUiModel: PopupUiModel) { + when (popupUiModel) { + is PopupUiModel.AddPopupUiModel -> subscribeDepartment(popupUiModel.departmentKoreanName) + is PopupUiModel.DeletePopupUiModel -> unsubscribeDepartment(popupUiModel.departmentKoreanName) + } + closePopup() + } + + private fun subscribeDepartment(departmentKoreanName: String) { + viewModelScope.launch { + departmentRepository.updateSubscribeStatus(departmentKoreanName, true) + } + } + + private fun unsubscribeDepartment(departmentKoreanName: String) { + viewModelScope.launch { + departmentRepository.updateSubscribeStatus(departmentKoreanName, false) + } + } + + fun onPopupDismissButtonClick() { + onDismissPopup() + } + + fun onDismissPopup() { + closePopup() + } + + private fun closePopup() { + popupUiModel = null + } +} \ No newline at end of file diff --git a/feature/edit_departments/src/main/res/values/strings.xml b/feature/edit_departments/src/main/res/values/strings.xml index 0ee844ee3..5c03b2791 100644 --- a/feature/edit_departments/src/main/res/values/strings.xml +++ b/feature/edit_departments/src/main/res/values/strings.xml @@ -3,4 +3,7 @@ 학과를 추가하거나\n삭제할 수 있어요 추가할 학과를 검색해 주세요 + + %s를\n추가하시겠습니까? + %s를\n삭제하시겠습니까? \ No newline at end of file From aeccfc046f721ed11bd1bb7778ea4eb42bdba07f Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 31 Jan 2024 14:12:31 +0900 Subject: [PATCH 12/34] =?UTF-8?q?kuring-98=20[=EC=B6=94=EA=B0=80]=20?= =?UTF-8?q?=ED=95=99=EA=B3=BC=20=ED=8E=B8=EC=A7=91=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=9D=98=20=ED=95=99=EA=B3=BC=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compose/EditDepartments.kt | 183 +++++++++++++++++- .../src/main/res/values/strings.xml | 3 + 2 files changed, 181 insertions(+), 5 deletions(-) diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt index dcc12dc4e..7ab90d126 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt @@ -3,29 +3,69 @@ package com.ku_stacks.ku_ring.edit_departments.compose import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel +import com.ku_stacks.ku_ring.designsystem.components.DarkPreview +import com.ku_stacks.ku_ring.designsystem.components.DepartmentWithAddIcon +import com.ku_stacks.ku_ring.designsystem.components.DepartmentWithCheckIcon +import com.ku_stacks.ku_ring.designsystem.components.DepartmentWithDeleteIcon import com.ku_stacks.ku_ring.designsystem.components.LargeTopAppBar -import com.ku_stacks.ku_ring.designsystem.components.LightAndDarkPreview +import com.ku_stacks.ku_ring.designsystem.components.LightPreview import com.ku_stacks.ku_ring.designsystem.components.SearchTextField import com.ku_stacks.ku_ring.designsystem.theme.KuringTheme +import com.ku_stacks.ku_ring.designsystem.theme.Pretendard +import com.ku_stacks.ku_ring.domain.Department +import com.ku_stacks.ku_ring.edit_departments.EditDepartmentsViewModel import com.ku_stacks.ku_ring.edit_departments.R +import com.ku_stacks.ku_ring.edit_departments.uimodel.DepartmentsUiModel @Composable -fun EditDepartments( +internal fun EditDepartments( + onClose: () -> Unit, + modifier: Modifier = Modifier, + viewModel: EditDepartmentsViewModel = hiltViewModel(), +) { + val departmentsUiModel by viewModel.departments.collectAsState() + + EditDepartments( + onClose = onClose, + query = viewModel.query, + onQueryUpdate = viewModel::onQueryUpdate, + departmentsUiModel = departmentsUiModel, + onAddDepartment = viewModel::onAddIconClick, + onDeleteDepartment = viewModel::onDeleteIconClick, + modifier = modifier, + ) +} + +@Composable +private fun EditDepartments( onClose: () -> Unit, query: String, onQueryUpdate: (String) -> Unit, + departmentsUiModel: DepartmentsUiModel, + onAddDepartment: (Department) -> Unit, + onDeleteDepartment: (Department) -> Unit, modifier: Modifier = Modifier, ) { Column( @@ -39,6 +79,9 @@ fun EditDepartments( EditDepartmentsContents( query = query, onQueryUpdate = onQueryUpdate, + departmentsUiModel = departmentsUiModel, + onAddDepartment = onAddDepartment, + onDeleteDepartment = onDeleteDepartment, modifier = Modifier.fillMaxWidth(), ) } @@ -61,11 +104,14 @@ private fun EditDepartmentsTitle( private fun EditDepartmentsContents( query: String, onQueryUpdate: (String) -> Unit, + departmentsUiModel: DepartmentsUiModel, + onAddDepartment: (Department) -> Unit, + onDeleteDepartment: (Department) -> Unit, modifier: Modifier = Modifier, ) { Column( modifier = modifier, - verticalArrangement = Arrangement.spacedBy(13.dp), + verticalArrangement = Arrangement.spacedBy(24.dp), ) { SearchTextField( query = query, @@ -75,18 +121,145 @@ private fun EditDepartmentsContents( .padding(horizontal = 20.dp) .fillMaxWidth(), ) + Departments( + departmentsUiModel = departmentsUiModel, + onAddDepartment = onAddDepartment, + onDeleteDepartment = onDeleteDepartment, + modifier = Modifier.fillMaxWidth(), + ) + } +} + +@Composable +private fun Departments( + departmentsUiModel: DepartmentsUiModel, + onAddDepartment: (Department) -> Unit, + onDeleteDepartment: (Department) -> Unit, + modifier: Modifier = Modifier, +) { + val captionId = when (departmentsUiModel) { + is DepartmentsUiModel.SelectedDepartments -> R.string.departments_caption_selected + is DepartmentsUiModel.SearchedDepartments -> R.string.departments_caption_searched + } + + Column(modifier = modifier) { + Text( + text = stringResource(id = captionId), + style = TextStyle( + fontSize = 16.sp, + lineHeight = 24.sp, + fontFamily = Pretendard, + fontWeight = FontWeight(500), + color = Color(0xFFABABAB), + ), + modifier = Modifier.padding(start = 24.dp), + ) + + when (departmentsUiModel) { + is DepartmentsUiModel.SelectedDepartments -> SelectedDepartments( + uiModel = departmentsUiModel, + onDeleteDepartment = onDeleteDepartment, + modifier = Modifier.fillMaxWidth(), + ) + + is DepartmentsUiModel.SearchedDepartments -> SearchedDepartments( + uiModel = departmentsUiModel, + onAddDepartment = onAddDepartment, + onDeleteDepartment = onDeleteDepartment, + modifier = Modifier.fillMaxWidth(), + ) + } + } +} + +@Composable +private fun SelectedDepartments( + uiModel: DepartmentsUiModel.SelectedDepartments, + onDeleteDepartment: (Department) -> Unit, + modifier: Modifier = Modifier, +) { + LazyColumn( + modifier = modifier, + contentPadding = PaddingValues(vertical = 6.dp), + ) { + items(uiModel.departments) { + DepartmentWithDeleteIcon( + department = it, + onDeleteDepartment = onDeleteDepartment, + ) + } + } +} + +@Composable +private fun SearchedDepartments( + uiModel: DepartmentsUiModel.SearchedDepartments, + onAddDepartment: (Department) -> Unit, + onDeleteDepartment: (Department) -> Unit, + modifier: Modifier = Modifier, +) { + LazyColumn( + modifier = modifier, + contentPadding = PaddingValues(vertical = 6.dp), + ) { + items(uiModel.departments) { + when { + it.isSubscribed -> DepartmentWithCheckIcon( + department = it, + onClickDepartment = onDeleteDepartment, + ) + + else -> DepartmentWithAddIcon( + department = it, + onAddDepartment = onAddDepartment, + ) + } + } + } +} + +internal val previewDepartments = (1..5).map { + Department( + name = "smart ict $it", + shortName = "sicte$it", + koreanName = "스마트ICT융합공학과 $it", + isSubscribed = (it % 2 == 0), + isSelected = (it == 2), + isNotificationEnabled = (it % 2 == 1), + ) +} + +@LightPreview +@Composable +private fun EditDepartmentsPreview_SelectedDepartments() { + var query by remember { mutableStateOf("") } + KuringTheme { + EditDepartments( + onClose = {}, + query = query, + onQueryUpdate = { query = it }, + departmentsUiModel = DepartmentsUiModel.SelectedDepartments(previewDepartments), + onAddDepartment = {}, + onDeleteDepartment = {}, + modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colors.surface), + ) } } -@LightAndDarkPreview +@DarkPreview @Composable -private fun EditDepartmentsPreview() { +private fun EditDepartmentsPreview_SearchedDepartments() { var query by remember { mutableStateOf("") } KuringTheme { EditDepartments( onClose = {}, query = query, onQueryUpdate = { query = it }, + departmentsUiModel = DepartmentsUiModel.SearchedDepartments(previewDepartments), + onAddDepartment = {}, + onDeleteDepartment = {}, modifier = Modifier .fillMaxSize() .background(MaterialTheme.colors.surface), diff --git a/feature/edit_departments/src/main/res/values/strings.xml b/feature/edit_departments/src/main/res/values/strings.xml index 5c03b2791..1772a397c 100644 --- a/feature/edit_departments/src/main/res/values/strings.xml +++ b/feature/edit_departments/src/main/res/values/strings.xml @@ -6,4 +6,7 @@ %s를\n추가하시겠습니까? %s를\n삭제하시겠습니까? + + 내 학과 + 검색 결과 \ No newline at end of file From 0c13cd1754e30e8f2d0f55eaf88b0cca9781fba0 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 31 Jan 2024 14:47:19 +0900 Subject: [PATCH 13/34] =?UTF-8?q?kuring-98=20[=EC=88=98=EC=A0=95]=20?= =?UTF-8?q?=ED=95=99=EA=B3=BC=20=ED=8E=B8=EC=A7=91=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20ViewModel=EC=9D=84=20inject=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=97=86=EB=8D=98=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ku_ring/edit_departments/EditDepartmentsActivity.kt | 3 +++ .../ku_ring/edit_departments/EditDepartmentsViewModel.kt | 2 ++ 2 files changed, 5 insertions(+) diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt index 0649b5451..bf33685d8 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt @@ -4,7 +4,10 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import com.ku_stacks.ku_ring.designsystem.theme.KuringTheme +import com.ku_stacks.ku_ring.edit_departments.compose.EditDepartments +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class EditDepartmentsActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt index c773946ff..275b5c91c 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt @@ -10,6 +10,7 @@ import com.ku_stacks.ku_ring.department.repository.DepartmentRepository import com.ku_stacks.ku_ring.domain.Department import com.ku_stacks.ku_ring.edit_departments.uimodel.DepartmentsUiModel import com.ku_stacks.ku_ring.edit_departments.uimodel.PopupUiModel +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow @@ -18,6 +19,7 @@ import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import javax.inject.Inject +@HiltViewModel class EditDepartmentsViewModel @Inject constructor( private val departmentRepository: DepartmentRepository, ) : ViewModel() { From c4ff8c3cc9ca0d6fb650efbd5ad6db5015a6ffd2 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 31 Jan 2024 14:47:52 +0900 Subject: [PATCH 14/34] =?UTF-8?q?kuring-98=20[=EC=B6=94=EA=B0=80]=20?= =?UTF-8?q?=ED=95=99=EA=B3=BC=20=ED=8E=B8=EC=A7=91=20Activity=EC=99=80=20C?= =?UTF-8?q?omposable=EC=9D=84=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ku_ring/edit_departments/EditDepartmentsActivity.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt index bf33685d8..969a43183 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt @@ -3,6 +3,8 @@ package com.ku_stacks.ku_ring.edit_departments import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.ui.Modifier import com.ku_stacks.ku_ring.designsystem.theme.KuringTheme import com.ku_stacks.ku_ring.edit_departments.compose.EditDepartments import dagger.hilt.android.AndroidEntryPoint @@ -13,7 +15,10 @@ class EditDepartmentsActivity : ComponentActivity() { super.onCreate(savedInstanceState) setContent { KuringTheme { - + EditDepartments( + onClose = ::finish, + modifier = Modifier.fillMaxSize(), + ) } } } From 5b4f232c8b37301a94c40a0d908d69de97266e3e Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 31 Jan 2024 14:48:15 +0900 Subject: [PATCH 15/34] =?UTF-8?q?kuring-98=20[=EC=88=98=EC=A0=95]=20Kuring?= =?UTF-8?q?Navigator=EC=99=80=20=ED=95=99=EA=B3=BC=20=ED=8E=B8=EC=A7=91=20?= =?UTF-8?q?Activity=EB=A5=BC=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + .../ku_ring/navigator/KuringNavigatorImpl.kt | 11 +++-------- .../com/ku_stacks/ku_ring/ui_util/KuringNavigator.kt | 4 +--- .../edit_departments/EditDepartmentsActivity.kt | 12 +++++++++++- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 493f391f7..dc0c9d594 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,6 +110,7 @@ dependencies { implementation project(":common:thirdparty") implementation project(":data:domain") implementation project(":feature:edit_subscription") + implementation project(":feature:edit_departments") implementation project(":feature:feedback") implementation project(":feature:my_notification") implementation project(":feature:notice_storage") diff --git a/app/src/main/java/com/ku_stacks/ku_ring/navigator/KuringNavigatorImpl.kt b/app/src/main/java/com/ku_stacks/ku_ring/navigator/KuringNavigatorImpl.kt index 587711b64..a3281e1d6 100644 --- a/app/src/main/java/com/ku_stacks/ku_ring/navigator/KuringNavigatorImpl.kt +++ b/app/src/main/java/com/ku_stacks/ku_ring/navigator/KuringNavigatorImpl.kt @@ -3,16 +3,15 @@ package com.ku_stacks.ku_ring.navigator import android.app.Activity import android.content.Context import android.content.Intent -import androidx.fragment.app.FragmentActivity import com.google.android.gms.oss.licenses.OssLicensesMenuActivity import com.ku_stacks.ku_ring.R import com.ku_stacks.ku_ring.domain.Notice import com.ku_stacks.ku_ring.domain.WebViewNotice import com.ku_stacks.ku_ring.domain.mapper.toWebViewNotice +import com.ku_stacks.ku_ring.edit_departments.EditDepartmentsActivity import com.ku_stacks.ku_ring.edit_subscription.EditSubscriptionActivity import com.ku_stacks.ku_ring.feedback.feedback.FeedbackActivity import com.ku_stacks.ku_ring.main.MainActivity -import com.ku_stacks.ku_ring.main.notice.department.fragment_subscribe.DepartmentSubscribeBottomSheet import com.ku_stacks.ku_ring.my_notification.NotificationActivity import com.ku_stacks.ku_ring.notice_detail.NoticeWebActivity import com.ku_stacks.ku_ring.notice_storage.NoticeStorageActivity @@ -34,12 +33,8 @@ class KuringNavigatorImpl @Inject constructor() : KuringNavigator { EditSubscriptionActivity.start(activity, isFirstRun) } - override fun navigateToEditSubscribedDepartment(fragmentActivity: FragmentActivity) { - DepartmentSubscribeBottomSheet.newInstance() - .show( - fragmentActivity.supportFragmentManager, - DepartmentSubscribeBottomSheet::class.java.name - ) + override fun navigateToEditSubscribedDepartment(activity: Activity) { + EditDepartmentsActivity.start(activity) } override fun navigateToFeedback(activity: Activity) { diff --git a/common/ui_util/src/main/java/com/ku_stacks/ku_ring/ui_util/KuringNavigator.kt b/common/ui_util/src/main/java/com/ku_stacks/ku_ring/ui_util/KuringNavigator.kt index 7948e6ea8..c1c6b7796 100644 --- a/common/ui_util/src/main/java/com/ku_stacks/ku_ring/ui_util/KuringNavigator.kt +++ b/common/ui_util/src/main/java/com/ku_stacks/ku_ring/ui_util/KuringNavigator.kt @@ -3,15 +3,13 @@ package com.ku_stacks.ku_ring.ui_util import android.app.Activity import android.content.Context import android.content.Intent -import androidx.fragment.app.FragmentActivity import com.ku_stacks.ku_ring.domain.Notice import com.ku_stacks.ku_ring.domain.WebViewNotice interface KuringNavigator { fun createEditSubscriptionIntent(context: Context, isFirstRun: Boolean = false): Intent fun navigateToEditSubscription(activity: Activity, isFirstRun: Boolean = false) - // TODO: 학과 편집하기 화면 구현 후 일반 Activity로 매개변수 타입 바꾸기 - fun navigateToEditSubscribedDepartment(fragmentActivity: FragmentActivity) + fun navigateToEditSubscribedDepartment(activity: Activity) fun navigateToFeedback(activity: Activity) fun createMainIntent(context: Context): Intent fun navigateToMain(activity: Activity) diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt index 969a43183..758c253f5 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt @@ -1,5 +1,7 @@ package com.ku_stacks.ku_ring.edit_departments +import android.app.Activity +import android.content.Intent import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent @@ -28,5 +30,13 @@ class EditDepartmentsActivity : ComponentActivity() { overridePendingTransition(R.anim.anim_slide_left_enter, R.anim.anim_slide_left_exit) } - // TODO: companion object에 start 함수 구현 + companion object { + fun start(activity: Activity) { + activity.apply { + val intent = Intent(this, EditDepartmentsActivity::class.java) + startActivity(intent) + overridePendingTransition(R.anim.anim_slide_right_enter, R.anim.anim_stay_exit) + } + } + } } \ No newline at end of file From a25a1615ca4ecad0084d8dd4fcc311aff38e6d16 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 31 Jan 2024 16:01:13 +0900 Subject: [PATCH 16/34] =?UTF-8?q?kuring-98=20[=EC=88=98=EC=A0=95]=20?= =?UTF-8?q?=ED=95=99=EA=B3=BC=20=ED=8E=B8=EC=A7=91=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=8B=A4=EB=A5=B8=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=9D=98=20App=20Bar=20=ED=85=8D=EC=8A=A4=ED=8A=B8=EA=B0=80=20?= =?UTF-8?q?=EB=B3=B4=EC=9D=B4=EB=8D=98=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit string id가 겹치면 이렇게 된다. --- .../ku_ring/edit_departments/compose/EditDepartments.kt | 2 +- feature/edit_departments/src/main/res/values/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt index 7ab90d126..f30442c4a 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt @@ -93,7 +93,7 @@ private fun EditDepartmentsTitle( modifier: Modifier = Modifier, ) { LargeTopAppBar( - title = stringResource(id = R.string.app_bar_title), + title = stringResource(id = R.string.edit_departments_app_bar_text), navigationIconId = R.drawable.ic_back, onNavigationIconClick = onClose, modifier = modifier, diff --git a/feature/edit_departments/src/main/res/values/strings.xml b/feature/edit_departments/src/main/res/values/strings.xml index 1772a397c..2e31464e4 100644 --- a/feature/edit_departments/src/main/res/values/strings.xml +++ b/feature/edit_departments/src/main/res/values/strings.xml @@ -1,7 +1,7 @@ 학과 수정 화면 - 학과를 추가하거나\n삭제할 수 있어요 + 학과를 추가하거나\n삭제할 수 있어요 추가할 학과를 검색해 주세요 %s를\n추가하시겠습니까? From 06f809f532b38c2f5a6fec63868d3a5570091851 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 31 Jan 2024 16:19:05 +0900 Subject: [PATCH 17/34] =?UTF-8?q?kuring-98=20[=EC=88=98=EC=A0=95]=20PopupU?= =?UTF-8?q?iModel=EC=97=90=20=ED=95=99=EA=B3=BC=20=EC=9D=B4=EB=A6=84(?= =?UTF-8?q?=EC=98=81=EB=AC=B8=20=ED=92=80=EB=84=A4=EC=9E=84)=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DB에서 학과 구독 작업은 영문 풀네임으로 이루어진다. --- .../ku_ring/edit_departments/EditDepartmentsViewModel.kt | 8 ++++---- .../ku_ring/edit_departments/uimodel/PopupUiModel.kt | 9 +++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt index 275b5c91c..1f298ecbd 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt @@ -61,11 +61,11 @@ class EditDepartmentsViewModel @Inject constructor( } fun onDeleteIconClick(department: Department) { - popupUiModel = PopupUiModel.DeletePopupUiModel(department.koreanName) + popupUiModel = PopupUiModel.DeletePopupUiModel(department.name, department.koreanName) } fun onAddIconClick(department: Department) { - popupUiModel = PopupUiModel.AddPopupUiModel(department.koreanName) + popupUiModel = PopupUiModel.AddPopupUiModel(department.name, department.koreanName) } fun onCheckIconClick(department: Department) { @@ -74,8 +74,8 @@ class EditDepartmentsViewModel @Inject constructor( fun onPopupConfirmButtonClick(popupUiModel: PopupUiModel) { when (popupUiModel) { - is PopupUiModel.AddPopupUiModel -> subscribeDepartment(popupUiModel.departmentKoreanName) - is PopupUiModel.DeletePopupUiModel -> unsubscribeDepartment(popupUiModel.departmentKoreanName) + is PopupUiModel.AddPopupUiModel -> subscribeDepartment(popupUiModel.departmentName) + is PopupUiModel.DeletePopupUiModel -> unsubscribeDepartment(popupUiModel.departmentName) } closePopup() } diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/PopupUiModel.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/PopupUiModel.kt index 6be2f62ae..05fad2382 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/PopupUiModel.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/PopupUiModel.kt @@ -10,12 +10,13 @@ import com.ku_stacks.ku_ring.edit_departments.R * @param stringResId 팝업에서 보여줄 문자열의 resource id이다. */ sealed class PopupUiModel( + val departmentName: String, val departmentKoreanName: String, @StringRes val stringResId: Int, ) { - class AddPopupUiModel(departmentKoreanName: String) : - PopupUiModel(departmentKoreanName, R.string.add_department_popup_title) + class AddPopupUiModel(departmentName: String, departmentKoreanName: String) : + PopupUiModel(departmentName, departmentKoreanName, R.string.add_department_popup_title) - class DeletePopupUiModel(departmentKoreanName: String) : - PopupUiModel(departmentKoreanName, R.string.delete_department_popup_title) + class DeletePopupUiModel(departmentName: String, departmentKoreanName: String) : + PopupUiModel(departmentName, departmentKoreanName, R.string.delete_department_popup_title) } \ No newline at end of file From 091f2e0891bb30e5a6d0f24f64c1adea522161ae Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 31 Jan 2024 16:20:45 +0900 Subject: [PATCH 18/34] =?UTF-8?q?kuring-98=20[=EC=88=98=EC=A0=95]=20?= =?UTF-8?q?=ED=95=99=EA=B3=BC=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EC=9E=91=EC=97=85=EC=9D=B4=20UI=EC=97=90=20?= =?UTF-8?q?=EB=B0=98=EC=98=81=EB=90=98=EC=A7=80=20=EC=95=8A=EB=8D=98=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EditDepartmentsViewModel.kt | 48 +++++++++++++------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt index 1f298ecbd..41e7d93a3 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt @@ -11,10 +11,11 @@ import com.ku_stacks.ku_ring.domain.Department import com.ku_stacks.ku_ring.edit_departments.uimodel.DepartmentsUiModel import com.ku_stacks.ku_ring.edit_departments.uimodel.PopupUiModel import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.mapLatest +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import javax.inject.Inject @@ -27,26 +28,45 @@ class EditDepartmentsViewModel @Inject constructor( var query by mutableStateOf("") private set - @OptIn(ExperimentalCoroutinesApi::class) - val departments: StateFlow - get() = snapshotFlow { query } - .mapLatest(::getDepartmentsUiModel) - .stateIn( - scope = viewModelScope, - started = SharingStarted.Lazily, - initialValue = DepartmentsUiModel.SearchedDepartments(emptyList()), - ) - var popupUiModel by mutableStateOf(null) private set + private val subscribedDepartments = MutableStateFlow>(emptyList()) + + val departments: StateFlow + get() = combine( + snapshotFlow { query }, + subscribedDepartments, + ) { query, subscribedDepartments -> + getDepartmentsUiModel(query, subscribedDepartments) + }.stateIn( + scope = viewModelScope, + started = SharingStarted.Lazily, + initialValue = DepartmentsUiModel.SearchedDepartments(emptyList()), + ) + + init { + collectSubscribedDepartments() + } + + private fun collectSubscribedDepartments() { + viewModelScope.launch { + departmentRepository.getSubscribedDepartmentsAsFlow().collectLatest { + subscribedDepartments.value = it + } + } + } + fun onQueryUpdate(newQuery: String) { query = newQuery } - private suspend fun getDepartmentsUiModel(query: String): DepartmentsUiModel { + private suspend fun getDepartmentsUiModel( + query: String, + subscribedDepartments: List + ): DepartmentsUiModel { return if (query.isEmpty()) { - DepartmentsUiModel.SelectedDepartments(getSubscribedDepartments()) + DepartmentsUiModel.SelectedDepartments(subscribedDepartments) } else { DepartmentsUiModel.SearchedDepartments(searchDepartments(query)) } From 22861db6da8c43654b7d9531b2a0c92338ec5f63 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 31 Jan 2024 16:21:10 +0900 Subject: [PATCH 19/34] =?UTF-8?q?kuring-98=20[=EC=B6=94=EA=B0=80]=20?= =?UTF-8?q?=ED=95=99=EA=B3=BC=20=EC=B6=94=EA=B0=80/=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=ED=8C=9D=EC=97=85=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compose/EditDepartments.kt | 8 ++++ .../compose/EditDepartmentsPopup.kt | 48 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt index f30442c4a..c819fa6d1 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt @@ -56,6 +56,14 @@ internal fun EditDepartments( onDeleteDepartment = viewModel::onDeleteIconClick, modifier = modifier, ) + + viewModel.popupUiModel?.let { popupUiModel -> + DepartmentPopup( + popupUiModel = popupUiModel, + onConfirm = viewModel::onPopupConfirmButtonClick, + onDismiss = viewModel::onPopupDismissButtonClick, + ) + } } @Composable diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt new file mode 100644 index 000000000..6955a15cd --- /dev/null +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt @@ -0,0 +1,48 @@ +package com.ku_stacks.ku_ring.edit_departments.compose + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.padding +import androidx.compose.material.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.ku_stacks.ku_ring.designsystem.components.KuringAlertDialog +import com.ku_stacks.ku_ring.designsystem.components.LightAndDarkPreview +import com.ku_stacks.ku_ring.designsystem.theme.KuringTheme +import com.ku_stacks.ku_ring.edit_departments.R +import com.ku_stacks.ku_ring.edit_departments.uimodel.PopupUiModel + +@Composable +internal fun DepartmentPopup( + popupUiModel: PopupUiModel, + onConfirm: (PopupUiModel) -> Unit, + onDismiss: () -> Unit, + modifier: Modifier = Modifier, +) { + val titleId = when (popupUiModel) { + is PopupUiModel.AddPopupUiModel -> R.string.add_department_popup_title + is PopupUiModel.DeletePopupUiModel -> R.string.delete_department_popup_title + } + KuringAlertDialog( + text = stringResource(id = titleId, popupUiModel.departmentKoreanName), + onConfirm = { onConfirm(popupUiModel) }, + onDismiss = onDismiss, + modifier = modifier, + ) +} + +@LightAndDarkPreview +@Composable +private fun DepartmentPopupPreview() { + KuringTheme { + DepartmentPopup( + popupUiModel = PopupUiModel.AddPopupUiModel("cse", "컴퓨터공학부"), + onConfirm = {}, + onDismiss = {}, + modifier = Modifier + .background(MaterialTheme.colors.onSurface) + .padding(16.dp), + ) + } +} \ No newline at end of file From 8e1e0c21af4381f69805c96d764c78d7fa586633 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 31 Jan 2024 16:26:35 +0900 Subject: [PATCH 20/34] =?UTF-8?q?kuring-98=20[=EC=B6=94=EA=B0=80]=20LargeT?= =?UTF-8?q?opAppBar=EC=97=90=20action=20=EB=A7=A4=EA=B0=9C=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=B6=94=EA=B0=80=20(optional)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designsystem/components/LargeTopAppBar.kt | 52 ++++++++++++++----- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/LargeTopAppBar.kt b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/LargeTopAppBar.kt index 0ec6aad84..5ecc2aeb7 100644 --- a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/LargeTopAppBar.kt +++ b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/LargeTopAppBar.kt @@ -3,13 +3,17 @@ package com.ku_stacks.ku_ring.designsystem.components import androidx.annotation.DrawableRes import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material.Icon import androidx.compose.material.IconButton import androidx.compose.material.MaterialTheme import androidx.compose.material.Text +import androidx.compose.material.TextButton import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.TextStyle @@ -38,25 +42,33 @@ fun LargeTopAppBar( @DrawableRes navigationIconId: Int? = null, onNavigationIconClick: (() -> Unit)? = null, iconDescription: String? = null, + action: @Composable () -> Unit = {}, ) { Column( modifier = modifier .background(MaterialTheme.colors.surface) - .padding(start = 14.dp, top = 14.dp), + .padding(start = 14.dp, top = 14.dp, end = 14.dp), ) { - if (navigationIconId == null) { - TransparentIconButton() - } else { - IconButton( - onClick = { onNavigationIconClick?.invoke() }, - enabled = onNavigationIconClick != null, - ) { - Icon( - painter = painterResource(id = navigationIconId), - contentDescription = iconDescription, - tint = MaterialTheme.colors.onSurface, - ) + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + ) { + if (navigationIconId == null) { + TransparentIconButton() + } else { + IconButton( + onClick = { onNavigationIconClick?.invoke() }, + enabled = onNavigationIconClick != null, + ) { + Icon( + painter = painterResource(id = navigationIconId), + contentDescription = iconDescription, + tint = MaterialTheme.colors.onSurface, + ) + } } + Spacer(modifier = Modifier.weight(1f)) + action() } LargeTopAppBarTitle(title = title) @@ -89,6 +101,20 @@ private fun LargeTopAppBarPreview_Icon() { title = "학과를 추가하거나\n삭제할 수 있어요", modifier = Modifier.fillMaxWidth(), navigationIconId = R.drawable.ic_back, + action = { + TextButton(onClick = { }) { + Text( + text = "전체 삭제", + style = TextStyle( + fontSize = 16.sp, + lineHeight = 24.sp, + fontFamily = Pretendard, + fontWeight = FontWeight(500), + color = MaterialTheme.colors.primary, + ) + ) + } + } ) } } From 10cfb03e19aff627d3f0cf59b4a4929f5112c1b5 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 31 Jan 2024 16:35:04 +0900 Subject: [PATCH 21/34] =?UTF-8?q?kuring-98=20[=EC=B6=94=EA=B0=80]=20?= =?UTF-8?q?=ED=95=99=EA=B3=BC=20Dao=EC=99=80=20Repository=EC=97=90=20?= =?UTF-8?q?=EA=B5=AC=EB=8F=85=ED=95=9C=20=EB=AA=A8=EB=93=A0=20=ED=95=99?= =?UTF-8?q?=EA=B3=BC=EB=A5=BC=20=EA=B5=AC=EB=8F=85=20=ED=95=B4=EC=A0=9C?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ku_ring/department/repository/DepartmentRepository.kt | 1 + .../department/repository/DepartmentRepositoryImpl.kt | 7 +++++++ .../java/com/ku_stacks/ku_ring/local/room/DepartmentDao.kt | 3 +++ 3 files changed, 11 insertions(+) diff --git a/data/department/src/main/java/com/ku_stacks/ku_ring/department/repository/DepartmentRepository.kt b/data/department/src/main/java/com/ku_stacks/ku_ring/department/repository/DepartmentRepository.kt index a154ba15b..fbd1dfc5d 100644 --- a/data/department/src/main/java/com/ku_stacks/ku_ring/department/repository/DepartmentRepository.kt +++ b/data/department/src/main/java/com/ku_stacks/ku_ring/department/repository/DepartmentRepository.kt @@ -11,6 +11,7 @@ interface DepartmentRepository { suspend fun getSubscribedDepartments(): List suspend fun getSubscribedDepartmentsAsFlow(): Flow> suspend fun updateSubscribeStatus(name: String, isSubscribed: Boolean) + suspend fun unsubscribeAllDepartments() suspend fun removeDepartments(departments: List) suspend fun clearDepartments() suspend fun fetchSubscribedDepartments(): List diff --git a/data/department/src/main/java/com/ku_stacks/ku_ring/department/repository/DepartmentRepositoryImpl.kt b/data/department/src/main/java/com/ku_stacks/ku_ring/department/repository/DepartmentRepositoryImpl.kt index 1d2824a12..cff7a507e 100644 --- a/data/department/src/main/java/com/ku_stacks/ku_ring/department/repository/DepartmentRepositoryImpl.kt +++ b/data/department/src/main/java/com/ku_stacks/ku_ring/department/repository/DepartmentRepositoryImpl.kt @@ -110,6 +110,13 @@ class DepartmentRepositoryImpl @Inject constructor( departments = null } + override suspend fun unsubscribeAllDepartments() { + withContext(ioDispatcher) { + departmentDao.unsubscribeAllDepartments() + } + departments = null + } + override suspend fun removeDepartments(departments: List) { withContext(ioDispatcher) { departmentDao.removeDepartments(departments.toEntityList()) diff --git a/data/local/src/main/java/com/ku_stacks/ku_ring/local/room/DepartmentDao.kt b/data/local/src/main/java/com/ku_stacks/ku_ring/local/room/DepartmentDao.kt index fa7b81ac6..7d6bbe31d 100644 --- a/data/local/src/main/java/com/ku_stacks/ku_ring/local/room/DepartmentDao.kt +++ b/data/local/src/main/java/com/ku_stacks/ku_ring/local/room/DepartmentDao.kt @@ -38,6 +38,9 @@ interface DepartmentDao { @Query("UPDATE departments SET isSubscribed = :isSubscribed WHERE name = :name") fun updateSubscribeStatus(name: String, isSubscribed: Boolean) + @Query("UPDATE departments SET isSubscribed = 0") + suspend fun unsubscribeAllDepartments() + @Delete suspend fun removeDepartments(departments: List) From 2d64754fbffdce96d50d3de59c2a3cae3d1e46d1 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 31 Jan 2024 16:53:26 +0900 Subject: [PATCH 22/34] =?UTF-8?q?kuring-98=20[=EC=B6=94=EA=B0=80]=20?= =?UTF-8?q?=ED=95=99=EA=B3=BC=20=ED=8E=B8=EC=A7=91=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=9D=98=20=EC=83=81=EB=8B=A8=20=EB=B0=94=EC=97=90=20=EB=AA=A8?= =?UTF-8?q?=EB=93=A0=20=ED=95=99=EA=B3=BC=20=EC=82=AD=EC=A0=9C=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=EC=9D=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EditDepartmentsViewModel.kt | 13 ++++- .../compose/EditDepartments.kt | 53 +++++++++++++++++++ .../compose/EditDepartmentsPopup.kt | 1 + .../edit_departments/uimodel/PopupUiModel.kt | 2 + .../src/main/res/values/strings.xml | 2 + 5 files changed, 70 insertions(+), 1 deletion(-) diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt index 41e7d93a3..79f1f9395 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt @@ -42,7 +42,7 @@ class EditDepartmentsViewModel @Inject constructor( }.stateIn( scope = viewModelScope, started = SharingStarted.Lazily, - initialValue = DepartmentsUiModel.SearchedDepartments(emptyList()), + initialValue = DepartmentsUiModel.SelectedDepartments(emptyList()), ) init { @@ -57,6 +57,10 @@ class EditDepartmentsViewModel @Inject constructor( } } + fun onDeleteAllButtonClick() { + popupUiModel = PopupUiModel.DeleteAllPopupUiModel() + } + fun onQueryUpdate(newQuery: String) { query = newQuery } @@ -96,6 +100,7 @@ class EditDepartmentsViewModel @Inject constructor( when (popupUiModel) { is PopupUiModel.AddPopupUiModel -> subscribeDepartment(popupUiModel.departmentName) is PopupUiModel.DeletePopupUiModel -> unsubscribeDepartment(popupUiModel.departmentName) + is PopupUiModel.DeleteAllPopupUiModel -> onDeleteAll() } closePopup() } @@ -112,6 +117,12 @@ class EditDepartmentsViewModel @Inject constructor( } } + fun onDeleteAll() { + viewModelScope.launch { + departmentRepository.unsubscribeAllDepartments() + } + } + fun onPopupDismissButtonClick() { onDismissPopup() } diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt index c819fa6d1..85f305be4 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt @@ -1,5 +1,6 @@ package com.ku_stacks.ku_ring.edit_departments.compose +import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -11,6 +12,7 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.MaterialTheme import androidx.compose.material.Text +import androidx.compose.material.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -18,6 +20,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle @@ -49,6 +52,7 @@ internal fun EditDepartments( EditDepartments( onClose = onClose, + onDeleteAllButtonClick = viewModel::onDeleteAllButtonClick, query = viewModel.query, onQueryUpdate = viewModel::onQueryUpdate, departmentsUiModel = departmentsUiModel, @@ -69,6 +73,7 @@ internal fun EditDepartments( @Composable private fun EditDepartments( onClose: () -> Unit, + onDeleteAllButtonClick: () -> Unit, query: String, onQueryUpdate: (String) -> Unit, departmentsUiModel: DepartmentsUiModel, @@ -76,12 +81,19 @@ private fun EditDepartments( onDeleteDepartment: (Department) -> Unit, modifier: Modifier = Modifier, ) { + val isDeleteAllButtonVisible = departmentsUiModel is DepartmentsUiModel.SelectedDepartments + val isDeleteAllButtonEnabled = + (departmentsUiModel as? DepartmentsUiModel.SelectedDepartments)?.departments?.isNotEmpty() + ?: false Column( modifier = modifier, verticalArrangement = Arrangement.spacedBy(20.dp), ) { EditDepartmentsTitle( onClose = onClose, + isDeleteAllButtonVisible = isDeleteAllButtonVisible, + isDeleteAllButtonEnabled = isDeleteAllButtonEnabled, + onDeleteAllButtonClick = onDeleteAllButtonClick, modifier = Modifier.fillMaxWidth(), ) EditDepartmentsContents( @@ -98,6 +110,9 @@ private fun EditDepartments( @Composable private fun EditDepartmentsTitle( onClose: () -> Unit, + isDeleteAllButtonVisible: Boolean, + isDeleteAllButtonEnabled: Boolean, + onDeleteAllButtonClick: () -> Unit, modifier: Modifier = Modifier, ) { LargeTopAppBar( @@ -105,7 +120,43 @@ private fun EditDepartmentsTitle( navigationIconId = R.drawable.ic_back, onNavigationIconClick = onClose, modifier = modifier, + ) { + if (isDeleteAllButtonVisible) { + DeleteAllDepartmentsButton( + isDeleteAllButtonEnabled = isDeleteAllButtonEnabled, + onDeleteAllButtonClick = onDeleteAllButtonClick, + ) + } + } +} + +@Composable +private fun DeleteAllDepartmentsButton( + isDeleteAllButtonEnabled: Boolean, + onDeleteAllButtonClick: () -> Unit, + modifier: Modifier = Modifier, +) { + val buttonAlpha by animateFloatAsState( + targetValue = if (isDeleteAllButtonEnabled) 1f else 0.5f, + label = "button alpha", ) + + TextButton( + onClick = onDeleteAllButtonClick, + enabled = isDeleteAllButtonEnabled, + modifier = modifier.alpha(buttonAlpha), + ) { + Text( + text = stringResource(id = R.string.edit_departments_app_bar_delete_all), + style = TextStyle( + fontSize = 16.sp, + lineHeight = 24.sp, + fontFamily = Pretendard, + fontWeight = FontWeight(500), + color = MaterialTheme.colors.primary, + ) + ) + } } @Composable @@ -244,6 +295,7 @@ private fun EditDepartmentsPreview_SelectedDepartments() { KuringTheme { EditDepartments( onClose = {}, + onDeleteAllButtonClick = {}, query = query, onQueryUpdate = { query = it }, departmentsUiModel = DepartmentsUiModel.SelectedDepartments(previewDepartments), @@ -263,6 +315,7 @@ private fun EditDepartmentsPreview_SearchedDepartments() { KuringTheme { EditDepartments( onClose = {}, + onDeleteAllButtonClick = {}, query = query, onQueryUpdate = { query = it }, departmentsUiModel = DepartmentsUiModel.SearchedDepartments(previewDepartments), diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt index 6955a15cd..0ea797e78 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt @@ -23,6 +23,7 @@ internal fun DepartmentPopup( val titleId = when (popupUiModel) { is PopupUiModel.AddPopupUiModel -> R.string.add_department_popup_title is PopupUiModel.DeletePopupUiModel -> R.string.delete_department_popup_title + is PopupUiModel.DeleteAllPopupUiModel -> R.string.delete_all_department_popup_title } KuringAlertDialog( text = stringResource(id = titleId, popupUiModel.departmentKoreanName), diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/PopupUiModel.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/PopupUiModel.kt index 05fad2382..e536be501 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/PopupUiModel.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/PopupUiModel.kt @@ -19,4 +19,6 @@ sealed class PopupUiModel( class DeletePopupUiModel(departmentName: String, departmentKoreanName: String) : PopupUiModel(departmentName, departmentKoreanName, R.string.delete_department_popup_title) + + class DeleteAllPopupUiModel : PopupUiModel("", "", R.string.delete_all_department_popup_title) } \ No newline at end of file diff --git a/feature/edit_departments/src/main/res/values/strings.xml b/feature/edit_departments/src/main/res/values/strings.xml index 2e31464e4..90c8b1c77 100644 --- a/feature/edit_departments/src/main/res/values/strings.xml +++ b/feature/edit_departments/src/main/res/values/strings.xml @@ -1,11 +1,13 @@ 학과 수정 화면 + 전체 삭제 학과를 추가하거나\n삭제할 수 있어요 추가할 학과를 검색해 주세요 %s를\n추가하시겠습니까? %s를\n삭제하시겠습니까? + 모든 학과를\n삭제하시겠습니까? 내 학과 검색 결과 From 802319888efb8155048d77ef570409b865700540 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 31 Jan 2024 16:53:47 +0900 Subject: [PATCH 23/34] =?UTF-8?q?kuring-98=20[=EC=88=98=EC=A0=95]=20build.?= =?UTF-8?q?gradle=20=ED=8C=8C=EC=9D=BC=EC=9D=98=20=EC=98=A4=ED=83=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/edit_departments/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/edit_departments/build.gradle b/feature/edit_departments/build.gradle index 52cbd6cca..28a3d25c2 100644 --- a/feature/edit_departments/build.gradle +++ b/feature/edit_departments/build.gradle @@ -57,7 +57,7 @@ dependencies { kapt libs.androidx.hilt.compiler implementation libs.hilt.android kapt libs.hilt.compiler - androidTestImplementation libs.hilt.android.testing + androidTestImplementation libs.hilt.android.testing kaptAndroidTest libs.hilt.compiler testImplementation libs.hilt.android.testing kaptTest libs.hilt.compiler From e14133d4d30c858e576d6a78667e090bc987041e Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 31 Jan 2024 17:04:51 +0900 Subject: [PATCH 24/34] =?UTF-8?q?kuring-98=20[=EC=88=98=EC=A0=95]=20?= =?UTF-8?q?=ED=95=99=EA=B3=BC=20=ED=8E=B8=EC=A7=91=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=9D=98=20=EB=B0=B0=EA=B2=BD=EC=83=89=EC=9D=84=20surface?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ku_ring/edit_departments/EditDepartmentsActivity.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt index 758c253f5..10e8cad0c 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt @@ -5,7 +5,9 @@ import android.content.Intent import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.compose.foundation.background import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material.MaterialTheme import androidx.compose.ui.Modifier import com.ku_stacks.ku_ring.designsystem.theme.KuringTheme import com.ku_stacks.ku_ring.edit_departments.compose.EditDepartments @@ -19,7 +21,9 @@ class EditDepartmentsActivity : ComponentActivity() { KuringTheme { EditDepartments( onClose = ::finish, - modifier = Modifier.fillMaxSize(), + modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colors.surface), ) } } From 179efd05438e07ee78cee7b56b75566728c602a6 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Wed, 31 Jan 2024 17:07:10 +0900 Subject: [PATCH 25/34] =?UTF-8?q?kuring-98=20[=EC=88=98=EC=A0=95]=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../edit_departments/EditDepartmentsViewModel.kt | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt index 79f1f9395..f44da1329 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsViewModel.kt @@ -76,10 +76,6 @@ class EditDepartmentsViewModel @Inject constructor( } } - private suspend fun getSubscribedDepartments(): List { - return departmentRepository.getSubscribedDepartments() - } - private suspend fun searchDepartments(query: String): List { return departmentRepository.getDepartmentsByKoreanName(query) } @@ -92,10 +88,6 @@ class EditDepartmentsViewModel @Inject constructor( popupUiModel = PopupUiModel.AddPopupUiModel(department.name, department.koreanName) } - fun onCheckIconClick(department: Department) { - onDeleteIconClick(department) - } - fun onPopupConfirmButtonClick(popupUiModel: PopupUiModel) { when (popupUiModel) { is PopupUiModel.AddPopupUiModel -> subscribeDepartment(popupUiModel.departmentName) @@ -117,17 +109,13 @@ class EditDepartmentsViewModel @Inject constructor( } } - fun onDeleteAll() { + private fun onDeleteAll() { viewModelScope.launch { departmentRepository.unsubscribeAllDepartments() } } fun onPopupDismissButtonClick() { - onDismissPopup() - } - - fun onDismissPopup() { closePopup() } From 6e3ae923fb28ef3a72c6a90de12221290cc84a6f Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Thu, 1 Feb 2024 21:18:32 +0900 Subject: [PATCH 26/34] =?UTF-8?q?kuring-98=20[=EC=88=98=EC=A0=95]=20?= =?UTF-8?q?=ED=8C=9D=EC=97=85=EC=97=90=EC=84=9C=20'=EC=82=AD=EC=A0=9C'=20?= =?UTF-8?q?=ED=85=8D=EC=8A=A4=ED=8A=B8=EB=8A=94=20=EC=A3=BC=ED=99=8D?= =?UTF-8?q?=EC=83=89=EC=9C=BC=EB=A1=9C=20=EB=B3=B4=EC=97=AC=EC=A3=BC?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ku_ring/designsystem/components/KuringAlertDIalog.kt | 7 ++++++- .../edit_departments/compose/EditDepartmentsPopup.kt | 8 ++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/KuringAlertDIalog.kt b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/KuringAlertDIalog.kt index f46a4a794..ff0d12e9c 100644 --- a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/KuringAlertDIalog.kt +++ b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/KuringAlertDIalog.kt @@ -42,6 +42,7 @@ fun KuringAlertDialog( modifier: Modifier = Modifier, confirmText: String = stringResource(id = R.string.confirm), dismissText: String = stringResource(id = R.string.cancel), + confirmTextColor: Color = MaterialTheme.colors.primary, ) { Dialog( onDismissRequest = onDismiss, @@ -54,6 +55,7 @@ fun KuringAlertDialog( dismissText = dismissText, onDismiss = onDismiss, modifier = modifier, + confirmTextColor = confirmTextColor, ) } } @@ -66,6 +68,7 @@ private fun KuringAlertDialogContents( dismissText: String, onDismiss: () -> Unit, modifier: Modifier = Modifier, + confirmTextColor: Color = MaterialTheme.colors.primary, ) { Column( modifier = modifier @@ -90,6 +93,7 @@ private fun KuringAlertDialogContents( onConfirm = onConfirm, dismissText = dismissText, onDismiss = onDismiss, + confirmTextColor = confirmTextColor, modifier = Modifier.fillMaxWidth(), ) } @@ -121,6 +125,7 @@ private fun KuringAlertDialogButtons( dismissText: String, onDismiss: () -> Unit, modifier: Modifier = Modifier, + confirmTextColor: Color = Gray2, ) { Row(modifier = modifier.height(IntrinsicSize.Min)) { KuringAlertDialogButton( @@ -139,7 +144,7 @@ private fun KuringAlertDialogButtons( text = confirmText, onClick = onConfirm, modifier = Modifier.weight(1f), - textColor = MaterialTheme.colors.primary, + textColor = confirmTextColor, ) } } diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt index 0ea797e78..b64775a09 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.ku_stacks.ku_ring.designsystem.components.KuringAlertDialog @@ -25,11 +26,18 @@ internal fun DepartmentPopup( is PopupUiModel.DeletePopupUiModel -> R.string.delete_department_popup_title is PopupUiModel.DeleteAllPopupUiModel -> R.string.delete_all_department_popup_title } + val confirmTextColor = if (popupUiModel is PopupUiModel.AddPopupUiModel) { + MaterialTheme.colors.primary + } else { + Color(0xFFFF4848) + } + KuringAlertDialog( text = stringResource(id = titleId, popupUiModel.departmentKoreanName), onConfirm = { onConfirm(popupUiModel) }, onDismiss = onDismiss, modifier = modifier, + confirmTextColor = confirmTextColor, ) } From 761e4409321b5c39e6e9dfc5590c0eff560fe652 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Thu, 1 Feb 2024 21:25:14 +0900 Subject: [PATCH 27/34] =?UTF-8?q?kuring-98=20[=EC=88=98=EC=A0=95]=20?= =?UTF-8?q?=ED=8C=9D=EC=97=85=20=EB=B2=84=ED=8A=BC=EC=9D=98=20=ED=85=8D?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=EB=94=94=EC=9E=90=EC=9D=B8?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compose/EditDepartmentsPopup.kt | 2 ++ .../edit_departments/uimodel/PopupUiModel.kt | 22 ++++++++++++++++--- .../src/main/res/values/strings.xml | 4 ++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt index b64775a09..88176f52d 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt @@ -38,6 +38,8 @@ internal fun DepartmentPopup( onDismiss = onDismiss, modifier = modifier, confirmTextColor = confirmTextColor, + dismissText = stringResource(id = R.string.department_popup_dismiss), + confirmText = stringResource(id = popupUiModel.confirmStringRes), ) } diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/PopupUiModel.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/PopupUiModel.kt index e536be501..43313bcff 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/PopupUiModel.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/uimodel/PopupUiModel.kt @@ -13,12 +13,28 @@ sealed class PopupUiModel( val departmentName: String, val departmentKoreanName: String, @StringRes val stringResId: Int, + @StringRes val confirmStringRes: Int, ) { class AddPopupUiModel(departmentName: String, departmentKoreanName: String) : - PopupUiModel(departmentName, departmentKoreanName, R.string.add_department_popup_title) + PopupUiModel( + departmentName, + departmentKoreanName, + R.string.add_department_popup_title, + R.string.add_department_popup_confirm, + ) class DeletePopupUiModel(departmentName: String, departmentKoreanName: String) : - PopupUiModel(departmentName, departmentKoreanName, R.string.delete_department_popup_title) + PopupUiModel( + departmentName, + departmentKoreanName, + R.string.delete_department_popup_title, + R.string.delete_department_popup_confirm, + ) - class DeleteAllPopupUiModel : PopupUiModel("", "", R.string.delete_all_department_popup_title) + class DeleteAllPopupUiModel : PopupUiModel( + "", + "", + R.string.delete_all_department_popup_title, + R.string.delete_all_department_popup_confirm, + ) } \ No newline at end of file diff --git a/feature/edit_departments/src/main/res/values/strings.xml b/feature/edit_departments/src/main/res/values/strings.xml index 90c8b1c77..c83c16424 100644 --- a/feature/edit_departments/src/main/res/values/strings.xml +++ b/feature/edit_departments/src/main/res/values/strings.xml @@ -6,8 +6,12 @@ 추가할 학과를 검색해 주세요 %s를\n추가하시겠습니까? + 추가하기 %s를\n삭제하시겠습니까? + 삭제하기 모든 학과를\n삭제하시겠습니까? + 삭제하기 + 취소하기 내 학과 검색 결과 From 8735d0d5a99d0d1bf63e3608089a1027685baaa7 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Thu, 1 Feb 2024 21:25:26 +0900 Subject: [PATCH 28/34] =?UTF-8?q?kuring-98=20[=EC=88=98=EC=A0=95]=20?= =?UTF-8?q?=ED=8C=9D=EC=97=85=20=ED=85=8D=EC=8A=A4=ED=8A=B8=EB=A5=BC=20Pop?= =?UTF-8?q?upUiModel=EB=A1=9C=EB=B6=80=ED=84=B0=20=EB=B0=94=EB=A1=9C=20?= =?UTF-8?q?=EC=96=BB=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../edit_departments/compose/EditDepartmentsPopup.kt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt index 88176f52d..21a0e5b5c 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsPopup.kt @@ -21,11 +21,6 @@ internal fun DepartmentPopup( onDismiss: () -> Unit, modifier: Modifier = Modifier, ) { - val titleId = when (popupUiModel) { - is PopupUiModel.AddPopupUiModel -> R.string.add_department_popup_title - is PopupUiModel.DeletePopupUiModel -> R.string.delete_department_popup_title - is PopupUiModel.DeleteAllPopupUiModel -> R.string.delete_all_department_popup_title - } val confirmTextColor = if (popupUiModel is PopupUiModel.AddPopupUiModel) { MaterialTheme.colors.primary } else { @@ -33,7 +28,7 @@ internal fun DepartmentPopup( } KuringAlertDialog( - text = stringResource(id = titleId, popupUiModel.departmentKoreanName), + text = stringResource(id = popupUiModel.stringResId, popupUiModel.departmentKoreanName), onConfirm = { onConfirm(popupUiModel) }, onDismiss = onDismiss, modifier = modifier, From bb9dda0c8181189139901c8483176f1882bc03a7 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Thu, 1 Feb 2024 22:05:54 +0900 Subject: [PATCH 29/34] =?UTF-8?q?kuring-9=20[=EC=88=98=EC=A0=95]=20?= =?UTF-8?q?=ED=8C=9D=EC=97=85=20=ED=85=8D=EC=8A=A4=ED=8A=B8=EB=A5=BC=20?= =?UTF-8?q?=ED=95=B4=EC=9A=94=EC=B2=B4=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/edit_departments/src/main/res/values/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/feature/edit_departments/src/main/res/values/strings.xml b/feature/edit_departments/src/main/res/values/strings.xml index c83c16424..e6692ef16 100644 --- a/feature/edit_departments/src/main/res/values/strings.xml +++ b/feature/edit_departments/src/main/res/values/strings.xml @@ -5,11 +5,11 @@ 학과를 추가하거나\n삭제할 수 있어요 추가할 학과를 검색해 주세요 - %s를\n추가하시겠습니까? + %s를\n내 학과 목록에 추가할까요? 추가하기 - %s를\n삭제하시겠습니까? + %s를\n내 학과에서 삭제할까요? 삭제하기 - 모든 학과를\n삭제하시겠습니까? + 내 학과 목록을\n모두 삭제할까요? 삭제하기 취소하기 From 2f0d7f315ea180c4856a279946fd8eb9ed96dbb8 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Thu, 1 Feb 2024 22:05:54 +0900 Subject: [PATCH 30/34] =?UTF-8?q?kuring-98=20[=EC=88=98=EC=A0=95]=20?= =?UTF-8?q?=ED=8C=9D=EC=97=85=20=ED=85=8D=EC=8A=A4=ED=8A=B8=EB=A5=BC=20?= =?UTF-8?q?=ED=95=B4=EC=9A=94=EC=B2=B4=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/edit_departments/src/main/res/values/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/feature/edit_departments/src/main/res/values/strings.xml b/feature/edit_departments/src/main/res/values/strings.xml index c83c16424..e6692ef16 100644 --- a/feature/edit_departments/src/main/res/values/strings.xml +++ b/feature/edit_departments/src/main/res/values/strings.xml @@ -5,11 +5,11 @@ 학과를 추가하거나\n삭제할 수 있어요 추가할 학과를 검색해 주세요 - %s를\n추가하시겠습니까? + %s를\n내 학과 목록에 추가할까요? 추가하기 - %s를\n삭제하시겠습니까? + %s를\n내 학과에서 삭제할까요? 삭제하기 - 모든 학과를\n삭제하시겠습니까? + 내 학과 목록을\n모두 삭제할까요? 삭제하기 취소하기 From 492c5cc08479d1a83907c75eaa26c13ccd964f9f Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Fri, 2 Feb 2024 10:31:13 +0900 Subject: [PATCH 31/34] =?UTF-8?q?kuring-98=20[=EC=88=98=EC=A0=95]=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=9D=B4=EB=A6=84=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=9E=98=EB=AA=BB=20=EC=82=AC=EC=9A=A9=EB=90=9C=20=EB=8C=80?= =?UTF-8?q?=EB=AC=B8=EC=9E=90=EB=A5=BC=20=EC=86=8C=EB=AC=B8=EC=9E=90?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/{KuringAlertDIalog.kt => KuringAlertDialog.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/{KuringAlertDIalog.kt => KuringAlertDialog.kt} (100%) diff --git a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/KuringAlertDIalog.kt b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/KuringAlertDialog.kt similarity index 100% rename from common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/KuringAlertDIalog.kt rename to common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/KuringAlertDialog.kt From 7b762d33d09f294462fa640324519f1f90bdd8f9 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Sun, 4 Feb 2024 21:10:55 +0900 Subject: [PATCH 32/34] =?UTF-8?q?kuring-98=20[=EC=88=98=EC=A0=95]=20?= =?UTF-8?q?=ED=95=99=EA=B3=BC=20=ED=8E=B8=EC=A7=91=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=9D=98=20=EC=B5=9C=EC=83=81=EC=9C=84=20composable=EC=97=90?= =?UTF-8?q?=20Screen=EC=9D=84=20postfix=EB=A1=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../edit_departments/EditDepartmentsActivity.kt | 4 ++-- .../{EditDepartments.kt => EditDepartmentsScreen.kt} | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) rename feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/{EditDepartments.kt => EditDepartmentsScreen.kt} (98%) diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt index 10e8cad0c..c75a337b6 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/EditDepartmentsActivity.kt @@ -10,7 +10,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material.MaterialTheme import androidx.compose.ui.Modifier import com.ku_stacks.ku_ring.designsystem.theme.KuringTheme -import com.ku_stacks.ku_ring.edit_departments.compose.EditDepartments +import com.ku_stacks.ku_ring.edit_departments.compose.EditDepartmentsScreen import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint @@ -19,7 +19,7 @@ class EditDepartmentsActivity : ComponentActivity() { super.onCreate(savedInstanceState) setContent { KuringTheme { - EditDepartments( + EditDepartmentsScreen( onClose = ::finish, modifier = Modifier .fillMaxSize() diff --git a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsScreen.kt similarity index 98% rename from feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt rename to feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsScreen.kt index 85f305be4..3b73d0144 100644 --- a/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartments.kt +++ b/feature/edit_departments/src/main/java/com/ku_stacks/ku_ring/edit_departments/compose/EditDepartmentsScreen.kt @@ -43,14 +43,14 @@ import com.ku_stacks.ku_ring.edit_departments.R import com.ku_stacks.ku_ring.edit_departments.uimodel.DepartmentsUiModel @Composable -internal fun EditDepartments( +internal fun EditDepartmentsScreen( onClose: () -> Unit, modifier: Modifier = Modifier, viewModel: EditDepartmentsViewModel = hiltViewModel(), ) { val departmentsUiModel by viewModel.departments.collectAsState() - EditDepartments( + EditDepartmentsScreen( onClose = onClose, onDeleteAllButtonClick = viewModel::onDeleteAllButtonClick, query = viewModel.query, @@ -71,7 +71,7 @@ internal fun EditDepartments( } @Composable -private fun EditDepartments( +private fun EditDepartmentsScreen( onClose: () -> Unit, onDeleteAllButtonClick: () -> Unit, query: String, @@ -293,7 +293,7 @@ internal val previewDepartments = (1..5).map { private fun EditDepartmentsPreview_SelectedDepartments() { var query by remember { mutableStateOf("") } KuringTheme { - EditDepartments( + EditDepartmentsScreen( onClose = {}, onDeleteAllButtonClick = {}, query = query, @@ -313,7 +313,7 @@ private fun EditDepartmentsPreview_SelectedDepartments() { private fun EditDepartmentsPreview_SearchedDepartments() { var query by remember { mutableStateOf("") } KuringTheme { - EditDepartments( + EditDepartmentsScreen( onClose = {}, onDeleteAllButtonClick = {}, query = query, From ed73406445570189e991e3bd30c8aed2919421ad Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Mon, 5 Feb 2024 11:47:11 +0900 Subject: [PATCH 33/34] =?UTF-8?q?kuring-98=20[=EC=88=98=EC=A0=95]=20LargeT?= =?UTF-8?q?opAppBar=EC=9D=98=20navigationIconId=EC=99=80=20onClick=20?= =?UTF-8?q?=EC=BD=9C=EB=B0=B1=EC=9D=84=20=ED=95=84=EC=88=98=20=EB=A7=A4?= =?UTF-8?q?=EA=B0=9C=EB=B3=80=EC=88=98=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designsystem/components/LargeTopAppBar.kt | 64 +++++++------------ 1 file changed, 22 insertions(+), 42 deletions(-) diff --git a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/LargeTopAppBar.kt b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/LargeTopAppBar.kt index 5ecc2aeb7..0dd8e12a5 100644 --- a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/LargeTopAppBar.kt +++ b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/LargeTopAppBar.kt @@ -27,8 +27,6 @@ import com.ku_stacks.ku_ring.designsystem.theme.Pretendard /** * [CenterTitleTopBar]보다 더 넓은 공간을 차지하는 Top App Bar이다. * - * 제목은 반드시 보여줘야 하며, 필요하다면 navigation 아이콘을 보여줄 수 있다. - * * @param title 제목 문자열 * @param modifier 적용할 [Modifier] * @param navigationIconId Navigation 아이콘의 drawable ID @@ -39,8 +37,8 @@ import com.ku_stacks.ku_ring.designsystem.theme.Pretendard fun LargeTopAppBar( title: String, modifier: Modifier = Modifier, - @DrawableRes navigationIconId: Int? = null, - onNavigationIconClick: (() -> Unit)? = null, + @DrawableRes navigationIconId: Int, + onNavigationIconClick: () -> Unit, iconDescription: String? = null, action: @Composable () -> Unit = {}, ) { @@ -53,19 +51,12 @@ fun LargeTopAppBar( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { - if (navigationIconId == null) { - TransparentIconButton() - } else { - IconButton( - onClick = { onNavigationIconClick?.invoke() }, - enabled = onNavigationIconClick != null, - ) { - Icon( - painter = painterResource(id = navigationIconId), - contentDescription = iconDescription, - tint = MaterialTheme.colors.onSurface, - ) - } + IconButton(onClick = onNavigationIconClick) { + Icon( + painter = painterResource(id = navigationIconId), + contentDescription = iconDescription, + tint = MaterialTheme.colors.onSurface, + ) } Spacer(modifier = Modifier.weight(1f)) action() @@ -95,37 +86,26 @@ private fun LargeTopAppBarTitle( @LightAndDarkPreview @Composable -private fun LargeTopAppBarPreview_Icon() { +private fun LargeTopAppBarPreview() { KuringTheme { LargeTopAppBar( title = "학과를 추가하거나\n삭제할 수 있어요", modifier = Modifier.fillMaxWidth(), navigationIconId = R.drawable.ic_back, - action = { - TextButton(onClick = { }) { - Text( - text = "전체 삭제", - style = TextStyle( - fontSize = 16.sp, - lineHeight = 24.sp, - fontFamily = Pretendard, - fontWeight = FontWeight(500), - color = MaterialTheme.colors.primary, - ) + onNavigationIconClick = {}, + ) { + TextButton(onClick = { }) { + Text( + text = "전체 삭제", + style = TextStyle( + fontSize = 16.sp, + lineHeight = 24.sp, + fontFamily = Pretendard, + fontWeight = FontWeight(500), + color = MaterialTheme.colors.primary, ) - } + ) } - ) - } -} - -@LightPreview -@Composable -private fun LargeTopAppBarPreview_NoIcon() { - KuringTheme { - LargeTopAppBar( - title = "학과를 추가하거나\n삭제할 수 있어요", - modifier = Modifier.fillMaxWidth(), - ) + } } } \ No newline at end of file From f5961eac33668340d8448e4491d975b41ce72642 Mon Sep 17 00:00:00 2001 From: Wooyoung Myung Date: Mon, 5 Feb 2024 11:47:34 +0900 Subject: [PATCH 34/34] =?UTF-8?q?kuring-98=20[=EC=82=AD=EC=A0=9C]=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20Tra?= =?UTF-8?q?nsparentIconButton=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/TransparentIconButton.kt | 48 ------------------- 1 file changed, 48 deletions(-) delete mode 100644 common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/TransparentIconButton.kt diff --git a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/TransparentIconButton.kt b/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/TransparentIconButton.kt deleted file mode 100644 index f413e18f8..000000000 --- a/common/designsystem/src/main/java/com/ku_stacks/ku_ring/designsystem/components/TransparentIconButton.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.ku_stacks.ku_ring.designsystem.components - -import androidx.compose.foundation.background -import androidx.compose.foundation.border -import androidx.compose.foundation.layout.padding -import androidx.compose.material.Icon -import androidx.compose.material.IconButton -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.unit.dp -import com.ku_stacks.ku_ring.designsystem.R -import com.ku_stacks.ku_ring.designsystem.theme.KuringTheme - -/** - * [IconButton]과 같은 크기를 채우고 싶을 때 사용하는 Composable이다. - * - * @param modifier 적용할 [Modifier]. 단, 일반적으로 매개변수를 넘겨주지 않는 것이 권장되며, - * UI 특성상 [Modifier]를 적용하더라도 크기와 관련된 것은 적용하지 않는 것을 권장한다. - */ -@Composable -fun TransparentIconButton(modifier: Modifier = Modifier) { - IconButton( - onClick = {}, - enabled = false, - modifier = modifier, - ) { - Icon( - painter = painterResource(id = R.drawable.ic_back), - contentDescription = null, - tint = Color.Transparent, - ) - } -} - -@LightPreview -@Composable -private fun TransparentIconButtonPreview() { - KuringTheme { - TransparentIconButton( - modifier = Modifier - .background(Color.Black) - .padding(16.dp) - .border(width = 1.dp, color = Color.White), - ) - } -} \ No newline at end of file