diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 921cb05..30ec063 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,6 +17,7 @@ android:name=".MainActivity" android:exported="true" android:label="@string/app_name" + android:screenOrientation="portrait" android:theme="@style/Theme.Packie"> diff --git a/app/src/main/java/org/care/packie/feature/PackingNavContract.kt b/app/src/main/java/org/care/packie/feature/PackingNavContract.kt index f73d8a3..4ebbeb2 100644 --- a/app/src/main/java/org/care/packie/feature/PackingNavContract.kt +++ b/app/src/main/java/org/care/packie/feature/PackingNavContract.kt @@ -1,5 +1,7 @@ package org.care.packie.feature +import android.net.Uri + object PackingNavContract { const val ROUTE = "packing" @@ -17,4 +19,16 @@ object PackingNavContract { } ?: "$BASE_ROUTE/{$CATEGORY_ARGUMENT}" } } + + object Url { + private const val PRIVACY_POLICY_URL = "https://2zerozu.notion.site/ccb6d3ff81f742ba9152d31de8a62ab1?pvs=4" + private const val TERMS_URL = "https://2zerozu.notion.site/abbe8debe4f14d19b4a62b3f8db459bb?pvs=4" + private const val CONTACT_US_URL = "https://walla.my/packie" + private const val DEVELOPER_INFO_URL = "https://2zerozu.notion.site/a14c462a913f42029f8b05c596f5441b?pvs=4" + + val privacyPolicyUri = Uri.parse(PRIVACY_POLICY_URL) + val termsUri = Uri.parse(TERMS_URL) + val contactUsUri = Uri.parse(CONTACT_US_URL) + val developerInfoUri = Uri.parse(DEVELOPER_INFO_URL) + } } \ No newline at end of file diff --git a/app/src/main/java/org/care/packie/feature/PackingNavGraph.kt b/app/src/main/java/org/care/packie/feature/PackingNavGraph.kt index c0a8932..929e57d 100644 --- a/app/src/main/java/org/care/packie/feature/PackingNavGraph.kt +++ b/app/src/main/java/org/care/packie/feature/PackingNavGraph.kt @@ -1,10 +1,12 @@ package org.care.packie.feature +import android.content.Context +import android.content.Intent +import android.net.Uri import android.widget.Toast import androidx.activity.compose.BackHandler import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableLongStateOf -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext @@ -50,11 +52,37 @@ private fun NavGraphBuilder.categoryComposable( navController.navigate( route = PackingNavContract.Stuffs.getRoute(category) ) + }, + onClickPrivacyPolicy = { + context.startActionViewActivity( + webUri = PackingNavContract.Url.privacyPolicyUri + ) + }, + onClickContactUs = { + context.startActionViewActivity( + webUri = PackingNavContract.Url.contactUsUri + ) + }, + onClickTerms = { + context.startActionViewActivity( + webUri = PackingNavContract.Url.termsUri + ) + }, + onClickDeveloperInfo = { + context.startActionViewActivity( + webUri = PackingNavContract.Url.developerInfoUri + ) } ) } } +private fun Context.startActionViewActivity(webUri: Uri) { + Intent(Intent.ACTION_VIEW, webUri).also { + startActivity(it) + } +} + private fun NavGraphBuilder.stuffsComposable( navController: NavController ) { diff --git a/app/src/main/java/org/care/packie/feature/category/CategoryScreen.kt b/app/src/main/java/org/care/packie/feature/category/CategoryScreen.kt index 066623d..d6c2642 100644 --- a/app/src/main/java/org/care/packie/feature/category/CategoryScreen.kt +++ b/app/src/main/java/org/care/packie/feature/category/CategoryScreen.kt @@ -33,13 +33,14 @@ import org.care.packie.R import org.care.packie.ui.DoneDialogType import org.care.packie.ui.TextFieldDialogType import org.care.packie.ui.component.category.Category +import org.care.packie.ui.component.category.SettingPopupMenu import org.care.packie.ui.component.common.PackieButton import org.care.packie.ui.component.dialog.DoneDialog import org.care.packie.ui.component.dialog.TextFieldDialog import org.care.packie.ui.theme.PackieDesignSystem import org.care.packie.ui.theme.PackieTheme -private const val MIN_CATEGORY_SIZE = 5 +// private const val MIN_CATEGORY_SIZE = 4 private const val MIN_SPACER_SIZE = 4 private const val MAX_SPACER_SIZE = 80 @@ -50,9 +51,13 @@ fun CategoryScreen( onClickEditCategory: (String, String) -> Unit = { _, _ -> }, onClickDeleteCategory: (String) -> Unit = {}, onClickCategory: (String) -> Unit = {}, + onClickPrivacyPolicy: () -> Unit = {}, + onClickTerms: () -> Unit = {}, + onClickContactUs: () -> Unit = {}, + onClickDeveloperInfo: () -> Unit = {} ) { val state = rememberCollapsingToolbarScaffoldState() - val isCollapseEnabled = categories.size >= MIN_CATEGORY_SIZE + //val isCollapseEnabled = categories.size >= MIN_CATEGORY_SIZE val toolbarStateProgress = state.toolbarState.progress var categoryName by remember { mutableStateOf("") } var dialogType by remember { mutableStateOf(TextFieldDialogType.ADD_CATEGORY) } @@ -61,16 +66,28 @@ fun CategoryScreen( val context = LocalContext.current Column { + Box( + modifier = Modifier + .padding(top = 8.dp, end = 8.dp) + .align(Alignment.End) + ) { + SettingPopupMenu( + onClickPrivacyPolicy = onClickPrivacyPolicy, + onClickTerms = onClickTerms, + onClickContactUs = onClickContactUs, + onClickDeveloperInfo = onClickDeveloperInfo + ) + } CollapsingToolbarScaffold( modifier = Modifier.weight(1f), state = state, - enabled = isCollapseEnabled, + //enabled = isCollapseEnabled, scrollStrategy = ScrollStrategy.ExitUntilCollapsed, toolbar = { Box( modifier = Modifier .fillMaxWidth() - .height(130.dp) + .height(80.dp) .pin() ) Text( diff --git a/app/src/main/java/org/care/packie/feature/category/CategoryScreenRoot.kt b/app/src/main/java/org/care/packie/feature/category/CategoryScreenRoot.kt index 07639a6..1b5ba5a 100644 --- a/app/src/main/java/org/care/packie/feature/category/CategoryScreenRoot.kt +++ b/app/src/main/java/org/care/packie/feature/category/CategoryScreenRoot.kt @@ -15,7 +15,11 @@ import org.care.packie.utils.ui.LoadingScreen @Composable fun CategoryScreenRoot( viewModel: CategoryViewModel = hiltViewModel(), - navigateToStuff: (String) -> Unit = {} + navigateToStuff: (String) -> Unit = {}, + onClickPrivacyPolicy: () -> Unit = {}, + onClickTerms: () -> Unit = {}, + onClickContactUs: () -> Unit = {}, + onClickDeveloperInfo: () -> Unit = {} ) { val state by viewModel.uiState.collectAsState() @@ -40,7 +44,11 @@ fun CategoryScreenRoot( onClickAddCategory = viewModel::addCategory, onClickEditCategory = viewModel::editCategory, onClickDeleteCategory = viewModel::removeCategory, - onClickCategory = { navigateToStuff(it) }, + onClickCategory = navigateToStuff, + onClickPrivacyPolicy = onClickPrivacyPolicy, + onClickTerms = onClickTerms, + onClickContactUs = onClickContactUs, + onClickDeveloperInfo = onClickDeveloperInfo ) LoadingScreen( diff --git a/app/src/main/java/org/care/packie/ui/component/category/SettingWithPopupMenu.kt b/app/src/main/java/org/care/packie/ui/component/category/SettingWithPopupMenu.kt new file mode 100644 index 0000000..50ea778 --- /dev/null +++ b/app/src/main/java/org/care/packie/ui/component/category/SettingWithPopupMenu.kt @@ -0,0 +1,97 @@ +package org.care.packie.ui.component.category + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +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.painterResource +import androidx.compose.ui.unit.dp +import org.care.packie.R +import org.care.packie.ui.theme.PackieDesignSystem + +@Composable +fun SettingPopupMenu( + onClickPrivacyPolicy: () -> Unit, + onClickTerms: () -> Unit, + onClickContactUs: () -> Unit, + onClickDeveloperInfo: () -> Unit, +) { + var isPopupOpen by remember { mutableStateOf(false) } + + Box( + modifier = Modifier.clickable { isPopupOpen = true } + ) { + Icon( + painter = painterResource(id = R.drawable.ic_setting), // 설정 아이콘에 해당하는 리소스를 넣어주세요 + contentDescription = null, + tint = PackieDesignSystem.colors.white, // 아이콘 색상을 설정하세요 + modifier = Modifier.padding(16.dp) + ) + + DropdownMenu( + expanded = isPopupOpen, + onDismissRequest = { isPopupOpen = false } + ) { + DropdownMenuItem( + onClick = { + isPopupOpen = false + onClickPrivacyPolicy() + }, + text = { + Text( + text = "개인정보 보호 정책", + style = PackieDesignSystem.typography.content + ) + } + ) + + DropdownMenuItem( + onClick = { + isPopupOpen = false + onClickTerms() + }, + text = { + Text( + text = "서비스 이용 약관", + style = PackieDesignSystem.typography.content + ) + } + ) + + DropdownMenuItem( + onClick = { + isPopupOpen = false + onClickContactUs() + }, + text = { + Text( + text = "문의하기", + style = PackieDesignSystem.typography.content + ) + } + ) + + DropdownMenuItem( + onClick = { + isPopupOpen = false + onClickDeveloperInfo() + }, + text = { + Text( + text = "개발자 정보", + style = PackieDesignSystem.typography.content + ) + } + ) + } + } +} diff --git a/app/src/main/java/org/care/packie/ui/component/dialog/TextFieldDialog.kt b/app/src/main/java/org/care/packie/ui/component/dialog/TextFieldDialog.kt index b93bc0c..e7a54c8 100644 --- a/app/src/main/java/org/care/packie/ui/component/dialog/TextFieldDialog.kt +++ b/app/src/main/java/org/care/packie/ui/component/dialog/TextFieldDialog.kt @@ -93,7 +93,7 @@ fun TextFieldDialog( confirm = type.confirm, onDismiss = onDismiss, onConfirmation = { - onConfirmation(textFieldValue.text) + onConfirmation(textFieldValue.text.replace("\n", "")) }, isConfirmButtonEnabled = isConfirmButtonEnabled.value ) @@ -131,8 +131,10 @@ fun TextFieldDialogTextField( keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), keyboardActions = KeyboardActions( onDone = { - onConfirmation(textFieldValue.text) - keyboardController?.hide() + if (textFieldValue.text.isNotEmpty()) { + onConfirmation(textFieldValue.text.replace("\n", "")) + keyboardController?.hide() + } } ), cursorBrush = SolidColor(PackieDesignSystem.colors.purple), diff --git a/app/src/main/res/drawable/ic_setting.xml b/app/src/main/res/drawable/ic_setting.xml new file mode 100644 index 0000000..efa25cf --- /dev/null +++ b/app/src/main/res/drawable/ic_setting.xml @@ -0,0 +1,13 @@ + + + + + +