diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 223b9a56..a4000a8a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,6 +42,10 @@ + diff --git a/app/src/main/java/com/sopetit/softie/ui/setting/SampleActivity.kt b/app/src/main/java/com/sopetit/softie/ui/setting/SampleActivity.kt deleted file mode 100644 index 4a9e5a29..00000000 --- a/app/src/main/java/com/sopetit/softie/ui/setting/SampleActivity.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.sopetit.softie.ui.setting - -class SampleActivity diff --git a/app/src/main/java/com/sopetit/softie/ui/setting/SettingActivity.kt b/app/src/main/java/com/sopetit/softie/ui/setting/SettingActivity.kt new file mode 100644 index 00000000..01cfee47 --- /dev/null +++ b/app/src/main/java/com/sopetit/softie/ui/setting/SettingActivity.kt @@ -0,0 +1,72 @@ +package com.sopetit.softie.ui.setting + +import android.os.Bundle +import androidx.activity.viewModels +import androidx.fragment.app.Fragment +import com.sopetit.softie.R +import com.sopetit.softie.databinding.ActivitySettingBinding +import com.sopetit.softie.util.binding.BindingActivity + +class SettingActivity : BindingActivity(R.layout.activity_setting) { + + private val viewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding.viewModel = viewModel + + initMakeInitFragment() + initChangeFragment() + } + + private fun initMakeInitFragment() { + val currentFragment = supportFragmentManager.findFragmentById(R.id.fcv_setting) + if (currentFragment == null) { + supportFragmentManager.beginTransaction() + .add(R.id.fcv_setting, SettingInitFragment()) + .commit() + } + } + + private fun initChangeFragment() { + viewModel.settingFragment.observe(this) { clickSetting -> + when (clickSetting) { + USER_SECURITY -> changeFragment(SettingUserSecurityFragment()) + USER_EXIT -> changeFragment(SettingUserExitFragment()) + // TODO 다른 세부 설정 화면 추가 + } + } + } + + private fun changeFragment(fragment: Fragment) { + supportFragmentManager.beginTransaction() + .replace(R.id.fcv_setting, fragment) + .addToBackStack(FRAGMENT_STACK_TAG).commitAllowingStateLoss() + + setClickBackBtnInDetailView(fragment) + } + + private fun setClickBackBtnInDetailView(fragment: Fragment) { + binding.btnSettingBack.setOnClickListener { + backInitView(fragment) + } + } + + fun backInitView(fragment: Fragment) { + with(supportFragmentManager) { + beginTransaction().remove(fragment).commit() + popBackStack() + } + viewModel.setSettingFragment(SETTING_INIT) + } + + companion object { + const val SETTING_INIT = "설정" + const val USER_SECURITY = "개인정보 처리방침" + const val DOCUMENT = "서비스 이용 약관" + const val GUIDE = "서비스 이용 가이드" + const val FEEDBACK = "피드백" + const val USER_EXIT = "회원 탈퇴" + const val FRAGMENT_STACK_TAG = "BACK_STACK_TAG" + } +} diff --git a/app/src/main/java/com/sopetit/softie/ui/setting/SettingInitFragment.kt b/app/src/main/java/com/sopetit/softie/ui/setting/SettingInitFragment.kt new file mode 100644 index 00000000..b9417790 --- /dev/null +++ b/app/src/main/java/com/sopetit/softie/ui/setting/SettingInitFragment.kt @@ -0,0 +1,79 @@ +package com.sopetit.softie.ui.setting + +import android.os.Bundle +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.sopetit.softie.R +import com.sopetit.softie.databinding.FragmentSettingInitBinding +import com.sopetit.softie.ui.setting.SettingActivity.Companion.USER_EXIT +import com.sopetit.softie.ui.setting.SettingActivity.Companion.USER_SECURITY +import com.sopetit.softie.util.binding.BindingBottomSheet +import com.sopetit.softie.util.binding.BindingFragment + +class SettingInitFragment : + BindingFragment(R.layout.fragment_setting_init) { + + private lateinit var viewModel: SettingViewModel + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewModel = ViewModelProvider(requireActivity()).get(SettingViewModel::class.java) + binding.viewModel = viewModel + + initChangeFragment() + } + + private fun initChangeFragment() { + clickUserSecurity() + clickLogOut() + clickUserExit() + } + + private fun clickUserSecurity() { + binding.clSettingInitUserSecurity.setOnClickListener { + viewModel.setSettingFragment(USER_SECURITY) + } + } + + private fun clickDocument() { + // TODO 서비스 이용 약관 + } + + private fun clickGuide() { + // TODO 서비스 이용 가이드 + } + + private fun clickFeedback() { + // TODO 피드백 + } + + private fun clickLogOut() { + binding.btnSettingInitLogout.setOnClickListener { + BindingBottomSheet.Builder().build( + isDrawable = true, + imageDrawable = R.drawable.ic_bear_face_crying, + imageUri = "", + title = "제목", + content = "내용", + isContentVisible = true, + contentColor = R.color.gray300, + backBtnContent = "돌아가기", + doBtnContent = "그냥 해", + doBtnColor = R.drawable.shape_red_fill_12_rect, + backBtnAction = {}, + doBtnAction = {} + ).show(parentFragmentManager, BOTTOM_SHEET_TAG) + } + } + + private fun clickUserExit() { + binding.btnSettingInitUserExit.setOnClickListener { + viewModel.setSettingFragment(USER_EXIT) + } + } + + companion object { + const val BOTTOM_SHEET_TAG = "BOTTOM SHEET TAG" + } +} diff --git a/app/src/main/java/com/sopetit/softie/ui/setting/SettingUserExitFragment.kt b/app/src/main/java/com/sopetit/softie/ui/setting/SettingUserExitFragment.kt new file mode 100644 index 00000000..4ade853f --- /dev/null +++ b/app/src/main/java/com/sopetit/softie/ui/setting/SettingUserExitFragment.kt @@ -0,0 +1,60 @@ +package com.sopetit.softie.ui.setting + +import android.os.Bundle +import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.style.ForegroundColorSpan +import android.view.View +import androidx.core.content.ContextCompat +import com.sopetit.softie.R +import com.sopetit.softie.databinding.FragmentSettingUserExitBinding +import com.sopetit.softie.util.binding.BindingFragment + +class SettingUserExitFragment : + BindingFragment(R.layout.fragment_setting_user_exit) { + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + initSetSpeechText() + initSetClickBackBtn() + } + + private fun initSetSpeechText() { + binding.tvUserExitSpeech.text = + SpannableStringBuilder(getString(R.string.user_exit_title)).apply { + setSpan( + ForegroundColorSpan( + ContextCompat.getColor( + requireActivity(), + R.color.red + ) + ), + SETTING_SPAN_START, + SETTING_SPAN_END, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + ) + } + } + + private fun initSetBear() { + // TODO bear type 받아서 bear 이미지 띄우기 + } + + private fun initSetClickBackBtn() { + binding.btnUserExitBack.setOnClickListener { + (activity as SettingActivity).backInitView(this) + } + } + + private fun initSetClickExitBtn() { + binding.btnUserExitExit.setOnClickListener { + // TODO 회원탈퇴 로직 추가 + } + } + + companion object { + const val SETTING_SPAN_START = 8 + const val SETTING_SPAN_END = 10 + } +} diff --git a/app/src/main/java/com/sopetit/softie/ui/setting/SettingUserSecurityFragment.kt b/app/src/main/java/com/sopetit/softie/ui/setting/SettingUserSecurityFragment.kt new file mode 100644 index 00000000..74e85fa3 --- /dev/null +++ b/app/src/main/java/com/sopetit/softie/ui/setting/SettingUserSecurityFragment.kt @@ -0,0 +1,15 @@ +package com.sopetit.softie.ui.setting + +import android.os.Bundle +import android.view.View +import com.sopetit.softie.R +import com.sopetit.softie.databinding.FragmentSettingUserSecurityBinding +import com.sopetit.softie.util.binding.BindingFragment + +class SettingUserSecurityFragment : + BindingFragment(R.layout.fragment_setting_user_security) { + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + } +} diff --git a/app/src/main/java/com/sopetit/softie/ui/setting/SettingViewModel.kt b/app/src/main/java/com/sopetit/softie/ui/setting/SettingViewModel.kt new file mode 100644 index 00000000..e7b8d03c --- /dev/null +++ b/app/src/main/java/com/sopetit/softie/ui/setting/SettingViewModel.kt @@ -0,0 +1,17 @@ +package com.sopetit.softie.ui.setting + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.sopetit.softie.ui.setting.SettingActivity.Companion.SETTING_INIT + +class SettingViewModel : ViewModel() { + + private val _settingFragment: MutableLiveData = MutableLiveData(SETTING_INIT) + val settingFragment: LiveData + get() = _settingFragment + + fun setSettingFragment(clickFragment: String) { + _settingFragment.value = clickFragment + } +} diff --git a/app/src/main/java/com/sopetit/softie/util/OriginalBottomSheet.kt b/app/src/main/java/com/sopetit/softie/util/OriginalBottomSheet.kt new file mode 100644 index 00000000..747f99cc --- /dev/null +++ b/app/src/main/java/com/sopetit/softie/util/OriginalBottomSheet.kt @@ -0,0 +1,72 @@ +package com.sopetit.softie.util + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.sopetit.softie.databinding.FragmentBottomsheetBinding +import com.sopetit.softie.util.binding.BindingAdapter.setImage +import com.sopetit.softie.util.binding.BindingBottomSheet + +class OriginalBottomSheet : BindingBottomSheet() { + + private val binding: FragmentBottomsheetBinding + get() = requireNotNull(_binding as FragmentBottomsheetBinding) + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = FragmentBottomsheetBinding.inflate(inflater, container, false) + return binding.root + } + + override fun setImage() { + if (isDrawable == true) { + imageDrawable?.let { binding.ivBottomSheet.setImageResource(it) } + } else { + binding.ivBottomSheet.setImage(imageUri) + } + } + + override fun setTitle() { + binding.tvBottomSheetTitle.text = title + } + + override fun setContent() { + binding.tvBottomSheetContent.text = content + } + + override fun setContentVisible() { + if (isContentVisible == true) { + binding.tvBottomSheetContent.visibility = View.VISIBLE + } else { + binding.tvBottomSheetContent.visibility = View.INVISIBLE + } + } + + override fun setContentColor() { + contentColor?.let { binding.tvBottomSheetContent.setTextColor(it) } + } + + override fun setBackBtnContent() { + binding.btnBottomSheetBack.text = backBtnContent + } + + override fun setDoBtnContent() { + binding.btnBottomSheetDo.text = doBtnContent + } + + override fun setDoBtnColor() { + doBtnColor?.let { binding.btnBottomSheetDo.setBackgroundResource(it) } + } + + override fun setBackBtnClick(action: () -> Unit) { + binding.btnBottomSheetBack.setOnClickListener { action() } + } + + override fun setDoBtnClick(action: () -> Unit) { + binding.btnBottomSheetDo.setOnClickListener { action() } + } +} diff --git a/app/src/main/java/com/sopetit/softie/util/binding/BindingBottomSheet.kt b/app/src/main/java/com/sopetit/softie/util/binding/BindingBottomSheet.kt new file mode 100644 index 00000000..5b7d5e77 --- /dev/null +++ b/app/src/main/java/com/sopetit/softie/util/binding/BindingBottomSheet.kt @@ -0,0 +1,89 @@ +package com.sopetit.softie.util.binding + +import android.os.Bundle +import android.view.View +import androidx.viewbinding.ViewBinding +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import com.sopetit.softie.util.OriginalBottomSheet + +abstract class BindingBottomSheet : BottomSheetDialogFragment() { + + protected var _binding: ViewBinding? = null + protected var isDrawable: Boolean? = null + protected var imageDrawable: Int? = null + protected var imageUri: String? = null + protected var title: String? = null + protected var content: String? = null + protected var isContentVisible: Boolean? = null + protected var contentColor: Int? = null + protected var backBtnContent: String? = null + protected var doBtnContent: String? = null + protected var doBtnColor: Int? = null + protected lateinit var backBtnAction: () -> Unit + protected lateinit var doBtnAction: () -> Unit + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + setImage() + setTitle() + setContent() + setContentVisible() + setContentColor() + setBackBtnContent() + setDoBtnContent() + setDoBtnColor() + setBackBtnClick { backBtnAction(); dismiss() } + setDoBtnClick { doBtnAction(); dismiss() } + } + + abstract fun setImage() + abstract fun setTitle() + abstract fun setContent() + abstract fun setContentVisible() + abstract fun setContentColor() + abstract fun setBackBtnContent() + abstract fun setDoBtnContent() + abstract fun setDoBtnColor() + + abstract fun setBackBtnClick(action: () -> Unit) + abstract fun setDoBtnClick(action: () -> Unit) + + class Builder() { + fun build( + isDrawable: Boolean, + imageDrawable: Int, + imageUri: String, + title: String, + content: String, + isContentVisible: Boolean, + contentColor: Int, + backBtnContent: String, + doBtnContent: String, + doBtnColor: Int, + backBtnAction: () -> Unit, + doBtnAction: () -> Unit + ): BindingBottomSheet { + val bottomSheet = OriginalBottomSheet() + return bottomSheet.apply { + this.isDrawable = isDrawable + this.imageDrawable = imageDrawable + this.imageUri = imageUri + this.title = title + this.content = content + this.isContentVisible = isContentVisible + this.contentColor = contentColor + this.backBtnContent = backBtnContent + this.doBtnContent = doBtnContent + this.doBtnColor = doBtnColor + this.backBtnAction = backBtnAction + this.doBtnAction = doBtnAction + } + } + } + + override fun onDestroyView() { + _binding = null + super.onDestroyView() + } +} diff --git a/app/src/main/res/drawable/ic_bear_brown_crying.png b/app/src/main/res/drawable/ic_bear_brown_crying.png new file mode 100644 index 00000000..9a2490f8 Binary files /dev/null and b/app/src/main/res/drawable/ic_bear_brown_crying.png differ diff --git a/app/src/main/res/drawable/ic_doll_face_1.xml b/app/src/main/res/drawable/ic_bear_face_1.xml similarity index 100% rename from app/src/main/res/drawable/ic_doll_face_1.xml rename to app/src/main/res/drawable/ic_bear_face_1.xml diff --git a/app/src/main/res/drawable/ic_bear_face_crying.xml b/app/src/main/res/drawable/ic_bear_face_crying.xml new file mode 100644 index 00000000..645593af --- /dev/null +++ b/app/src/main/res/drawable/ic_bear_face_crying.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_bear_gray_crying.png b/app/src/main/res/drawable/ic_bear_gray_crying.png new file mode 100644 index 00000000..758e6fb4 Binary files /dev/null and b/app/src/main/res/drawable/ic_bear_gray_crying.png differ diff --git a/app/src/main/res/drawable/ic_bear_panda_crying.png b/app/src/main/res/drawable/ic_bear_panda_crying.png new file mode 100644 index 00000000..261770ab Binary files /dev/null and b/app/src/main/res/drawable/ic_bear_panda_crying.png differ diff --git a/app/src/main/res/drawable/ic_bear_red_crying.png b/app/src/main/res/drawable/ic_bear_red_crying.png new file mode 100644 index 00000000..5dc39d2a Binary files /dev/null and b/app/src/main/res/drawable/ic_bear_red_crying.png differ diff --git a/app/src/main/res/drawable/ic_document.xml b/app/src/main/res/drawable/ic_document.xml new file mode 100644 index 00000000..e5e6aef5 --- /dev/null +++ b/app/src/main/res/drawable/ic_document.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_feedback.xml b/app/src/main/res/drawable/ic_feedback.xml new file mode 100644 index 00000000..4fd87b4d --- /dev/null +++ b/app/src/main/res/drawable/ic_feedback.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_guide.xml b/app/src/main/res/drawable/ic_guide.xml new file mode 100644 index 00000000..6f26109d --- /dev/null +++ b/app/src/main/res/drawable/ic_guide.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_right_btn.xml b/app/src/main/res/drawable/ic_right_btn.xml new file mode 100644 index 00000000..3771d630 --- /dev/null +++ b/app/src/main/res/drawable/ic_right_btn.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_speech_bottom.xml b/app/src/main/res/drawable/ic_speech_bottom.xml new file mode 100644 index 00000000..bfca24ac --- /dev/null +++ b/app/src/main/res/drawable/ic_speech_bottom.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_user_security.xml b/app/src/main/res/drawable/ic_user_security.xml new file mode 100644 index 00000000..4eb2f5a7 --- /dev/null +++ b/app/src/main/res/drawable/ic_user_security.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/drawable/shape_gray000_fill_top20_rect.xml b/app/src/main/res/drawable/shape_gray000_fill_top20_rect.xml new file mode 100644 index 00000000..1ce37f2f --- /dev/null +++ b/app/src/main/res/drawable/shape_gray000_fill_top20_rect.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/app/src/main/res/drawable/shape_red_fill_12_rect.xml b/app/src/main/res/drawable/shape_red_fill_12_rect.xml new file mode 100644 index 00000000..d1ad4862 --- /dev/null +++ b/app/src/main/res/drawable/shape_red_fill_12_rect.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml new file mode 100644 index 00000000..6c680657 --- /dev/null +++ b/app/src/main/res/layout/activity_setting.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_bottomsheet.xml b/app/src/main/res/layout/fragment_bottomsheet.xml new file mode 100644 index 00000000..6cde7172 --- /dev/null +++ b/app/src/main/res/layout/fragment_bottomsheet.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_onboarding_choice_routine.xml b/app/src/main/res/layout/fragment_onboarding_choice_routine.xml index 70c2b235..d83d1a66 100644 --- a/app/src/main/res/layout/fragment_onboarding_choice_routine.xml +++ b/app/src/main/res/layout/fragment_onboarding_choice_routine.xml @@ -24,7 +24,7 @@ android:id="@+id/iv_onboarding_choice_routine_title_bear" android:layout_width="53dp" android:layout_height="50dp" - android:src="@drawable/ic_doll_face_1" + android:src="@drawable/ic_bear_face_1" android:layout_marginTop="34dp" android:layout_marginStart="22dp" app:layout_constraintTop_toTopOf="parent" diff --git a/app/src/main/res/layout/fragment_onboarding_choice_theme.xml b/app/src/main/res/layout/fragment_onboarding_choice_theme.xml index 4eb6185b..24de9c5c 100644 --- a/app/src/main/res/layout/fragment_onboarding_choice_theme.xml +++ b/app/src/main/res/layout/fragment_onboarding_choice_theme.xml @@ -65,7 +65,7 @@ android:id="@+id/iv_onboarding_choice_theme_title_bear" android:layout_width="53dp" android:layout_height="50dp" - android:src="@drawable/ic_doll_face_1" + android:src="@drawable/ic_bear_face_1" android:layout_marginTop="34dp" android:layout_marginStart="22dp" app:layout_constraintTop_toTopOf="parent" diff --git a/app/src/main/res/layout/fragment_setting_init.xml b/app/src/main/res/layout/fragment_setting_init.xml new file mode 100644 index 00000000..e6096ea3 --- /dev/null +++ b/app/src/main/res/layout/fragment_setting_init.xml @@ -0,0 +1,286 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_setting_user_exit.xml b/app/src/main/res/layout/fragment_setting_user_exit.xml new file mode 100644 index 00000000..4a9877ed --- /dev/null +++ b/app/src/main/res/layout/fragment_setting_user_exit.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_setting_user_security.xml b/app/src/main/res/layout/fragment_setting_user_security.xml new file mode 100644 index 00000000..5f4a6ede --- /dev/null +++ b/app/src/main/res/layout/fragment_setting_user_security.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1e67519a..c0bba807 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -21,6 +21,33 @@ 행복 루틴은 매일 조금씩 너에 대해\n알아갈 수 있는 특별한 이벤트형 루틴이야! 진행 중인 행복루틴이 없어요.\n루틴을 추가할까요? + + 어떤 친구와 함께 할까요? + 한 번 선택한 인형은 바꿀 수 없어요 + 이 친구와 함께 할래 + + + 설정 + 개인정보 처리방침 + 서비스 이용 약관 + 서비스 이용 가이드 + 피드백 + 현재 버전 1.0.0 + 로그아웃 + 회원 탈퇴 + 소프티를 정말 탈퇴하시나요? + 탈퇴하면 계정이 삭제되고 모든 데이터가 사라집니다. + 정말 가는 거야..?\n나는 영영 사라져 + 더 써볼래 + 탈퇴할래 + 소프티 개인정보처리방침 + + + 정말 로그아웃할까요? + "잠시만 안녕..다음에 또 봐!" + 취소 + 로그아웃 할래 + 어떤 친구와 함께 할까요? 한 번 선택한 인형은 바꿀 수 없어요 diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index f364ebb1..97fab17a 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -10,4 +10,14 @@ + +