diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/nickname/NicknameActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/nickname/NicknameActivity.kt index fddd7f93..6ee1348c 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/nickname/NicknameActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/nickname/NicknameActivity.kt @@ -5,74 +5,62 @@ import android.content.Intent import android.os.Bundle import android.text.Editable import android.text.TextWatcher -import android.view.View import androidx.activity.viewModels import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import com.android.go.sopt.winey.R import com.android.go.sopt.winey.databinding.ActivityNicknameBinding +import com.android.go.sopt.winey.domain.repository.DataStoreRepository import com.android.go.sopt.winey.presentation.main.MainActivity import com.android.go.sopt.winey.util.binding.BindingActivity +import com.android.go.sopt.winey.util.code.ErrorCode import com.android.go.sopt.winey.util.context.hideKeyboard import com.android.go.sopt.winey.util.context.snackBar import com.android.go.sopt.winey.util.context.stringOf +import com.android.go.sopt.winey.util.view.InputUiState import com.android.go.sopt.winey.util.view.UiState import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch +import javax.inject.Inject @AndroidEntryPoint class NicknameActivity : BindingActivity(R.layout.activity_nickname) { private val viewModel by viewModels() private val prevScreenName by lazy { intent.extras?.getString(EXTRA_KEY, "") } + @Inject + lateinit var dataStoreRepository: DataStoreRepository + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.vm = viewModel + viewModel.updatePrevScreenName(prevScreenName) - switchCloseButtonVisibility() + initRootLayoutClickListener() initCloseButtonClickListener() - switchTitleText() + switchEditTextHint() - initRootLayoutClickListener() initEditTextWatcher() initDuplicateCheckButtonClickListener() + initCompleteButtonClickListener() initPatchNicknameStateObserver() } - private fun switchCloseButtonVisibility() { - when (prevScreenName) { - STORY_SCREEN -> binding.ivNicknameClose.visibility = View.GONE - MY_PAGE_SCREEN -> binding.ivNicknameClose.visibility = View.VISIBLE - } - } - - private fun initCloseButtonClickListener() { - binding.ivNicknameClose.setOnClickListener { - finish() - } - } - - private fun switchTitleText() { - when (prevScreenName) { - STORY_SCREEN -> - binding.tvNicknameTitle.text = - stringOf(R.string.nickname_default_title) - - MY_PAGE_SCREEN -> - binding.tvNicknameTitle.text = - stringOf(R.string.nickname_mypage_title) - } - } - private fun initEditTextWatcher() { var prevText = "" binding.etNickname.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun afterTextChanged(s: Editable?) {} + + // 텍스트가 바뀌면 중복체크 상태 false로 초기화 override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { val inputText = s.toString() - viewModel.updateTextChangedState(inputText.isNotBlank() && inputText != prevText) + if (inputText.isNotBlank() && inputText != prevText) { + viewModel.updateDuplicateCheckState(false) + } prevText = inputText } }) @@ -80,11 +68,23 @@ class NicknameActivity : BindingActivity(R.layout.activ private fun initDuplicateCheckButtonClickListener() { binding.btnNicknameDuplicateCheck.setOnClickListener { - if (viewModel.isTextChanged.value) { - viewModel.apply { - updateDuplicateCheckButtonState(true) - getNicknameDuplicateCheck() - } + viewModel.getNicknameDuplicateCheck() + } + } + + private fun initCompleteButtonClickListener() { + binding.btnNicknameComplete.setOnClickListener { + // 중복체크를 하지 않은 상태에서 완료 버튼을 클릭하면 에러 표시 + if (!viewModel.isDuplicateChecked.value) { + viewModel.updateInputUiState( + InputUiState.Failure(ErrorCode.CODE_UNCHECKED_DUPLICATION) + ) + return@setOnClickListener + } + + // 서버통신 결과 중복되지 않은 닉네임인 경우에만 PATCH 서버통신 진행 + if (viewModel.isValidNickname.value) { + viewModel.patchNickname() } } } @@ -111,6 +111,24 @@ class NicknameActivity : BindingActivity(R.layout.activ binding.btnNicknameComplete.isClickable = false } + private fun switchEditTextHint() { + lifecycleScope.launch { + when (prevScreenName) { + STORY_SCREEN -> binding.etNickname.hint = stringOf(R.string.nickname_default_hint) + MY_PAGE_SCREEN -> { + val user = dataStoreRepository.getUserInfo().first() ?: return@launch + binding.etNickname.hint = user.nickname + } + } + } + } + + private fun initCloseButtonClickListener() { + binding.ivNicknameClose.setOnClickListener { + finish() + } + } + private fun initRootLayoutClickListener() { binding.root.setOnClickListener { hideKeyboard(binding.root) @@ -127,7 +145,7 @@ class NicknameActivity : BindingActivity(R.layout.activ companion object { private const val EXTRA_KEY = "PREV_SCREEN_NAME" - private const val MY_PAGE_SCREEN = "MyPageFragment" - private const val STORY_SCREEN = "StoryActivity" + const val MY_PAGE_SCREEN = "MyPageFragment" + const val STORY_SCREEN = "StoryActivity" } } diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/nickname/NicknameViewModel.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/nickname/NicknameViewModel.kt index 61cc0ac6..feb2fa0f 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/nickname/NicknameViewModel.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/nickname/NicknameViewModel.kt @@ -7,7 +7,6 @@ import com.android.go.sopt.winey.domain.repository.AuthRepository import com.android.go.sopt.winey.util.code.ErrorCode.CODE_DUPLICATE import com.android.go.sopt.winey.util.code.ErrorCode.CODE_INVALID_LENGTH import com.android.go.sopt.winey.util.code.ErrorCode.CODE_SPACE_SPECIAL_CHAR -import com.android.go.sopt.winey.util.code.ErrorCode.CODE_UNCHECKED_DUPLICATION import com.android.go.sopt.winey.util.view.InputUiState import com.android.go.sopt.winey.util.view.UiState import dagger.hilt.android.lifecycle.HiltViewModel @@ -32,12 +31,11 @@ class NicknameViewModel @Inject constructor( val nickname: String get() = _nickname.value private val _inputUiState: MutableStateFlow = - _nickname.map { updateInputUiState(it) } + _nickname.map { checkInputUiState(it) } .mutableStateIn( initialValue = InputUiState.Empty, scope = viewModelScope ) - val inputUiState: StateFlow = _inputUiState.asStateFlow() val isValidNickname: StateFlow = _inputUiState.map { validateNickname(it) } @@ -46,19 +44,29 @@ class NicknameViewModel @Inject constructor( scope = viewModelScope, started = SharingStarted.WhileSubscribed(PRODUCE_STOP_TIMEOUT) ) + private fun validateNickname(state: InputUiState) = state == InputUiState.Success - private val _isTextChanged = MutableStateFlow(false) - val isTextChanged: StateFlow = _isTextChanged.asStateFlow() + private val _isDuplicateChecked = MutableStateFlow(false) + val isDuplicateChecked: StateFlow = _isDuplicateChecked.asStateFlow() - private val _isCheckBtnClicked = MutableStateFlow(false) - val isCheckBtnClicked: StateFlow = _isCheckBtnClicked.asStateFlow() + private val _patchNicknameState = MutableStateFlow>(UiState.Empty) + val patchNicknameState: StateFlow> = _patchNicknameState.asStateFlow() private var prevCheckResult: Pair? = null - private val _patchNicknameState = MutableStateFlow>(UiState.Empty) - val patchNicknameState: StateFlow> = _patchNicknameState.asStateFlow() + var prevScreenName: String? = null - private fun validateNickname(state: InputUiState) = state == InputUiState.Success + fun updatePrevScreenName(name: String?) { + prevScreenName = name + } + + fun updateInputUiState(inputUiState: InputUiState) { + _inputUiState.value = inputUiState + } + + fun updateDuplicateCheckState(checked: Boolean) { + _isDuplicateChecked.value = checked + } fun patchNickname() { viewModelScope.launch { @@ -87,10 +95,10 @@ class NicknameViewModel @Inject constructor( if (response == null) return@onSuccess response.isDuplicated.let { - Timber.d("SUCCESS GET DUPLICATION CHECK: $it") - updateDuplicateCheckState(it) - saveDuplicateCheckState(it) + showDuplicateCheckResult(it) + saveDuplicateCheckResult(it) } + updateDuplicateCheckState(true) } .onFailure { t -> Timber.e("${t.message}") @@ -98,7 +106,7 @@ class NicknameViewModel @Inject constructor( } } - private fun updateDuplicateCheckState(isDuplicated: Boolean) { + private fun showDuplicateCheckResult(isDuplicated: Boolean) { _inputUiState.value = if (isDuplicated) { InputUiState.Failure(CODE_DUPLICATE) } else { @@ -106,70 +114,24 @@ class NicknameViewModel @Inject constructor( } } - // 서버통신 할 때마다 현재 닉네임과 중복여부를 저장한다. - private fun saveDuplicateCheckState(isDuplicated: Boolean) { + private fun saveDuplicateCheckResult(isDuplicated: Boolean) { prevCheckResult = Pair(nickname, isDuplicated) } - private fun updateInputUiState(nickname: String): InputUiState { + private fun checkInputUiState(nickname: String): InputUiState { if (nickname.isEmpty()) return InputUiState.Empty if (!checkLength(nickname)) return InputUiState.Failure(CODE_INVALID_LENGTH) if (containsSpaceOrSpecialChar(nickname)) { - return InputUiState.Failure( - CODE_SPACE_SPECIAL_CHAR - ) - } - - // 텍스트가 바뀌었는데 중복체크 버튼을 누르지 않은 경우 - if (isTextChanged.value && !isCheckBtnClicked.value) { - return comparePrevCheckResult() + return InputUiState.Failure(CODE_SPACE_SPECIAL_CHAR) } - return InputUiState.Empty } - private fun comparePrevCheckResult(): InputUiState { - // 이전에 서버통신 한 결과가 없는 경우 - if (prevCheckResult == null) { - Timber.d("CASE 1") - return InputUiState.Failure(CODE_UNCHECKED_DUPLICATION) - } - - // 현재 입력값이 이전에 서버통신 했던 닉네임과 일치하는 경우 - if (nickname == prevCheckResult?.first) { - // 그때 당시의 서버통신 결과 그대로 반환 - if (prevCheckResult?.second == true) { - Timber.d("CASE 2") - return InputUiState.Failure(CODE_DUPLICATE) - } - - Timber.d("CASE 3") - return InputUiState.Success - } - - // 이전에 서버통신한 결과가 있지만, 입력값이 다른 경우 - Timber.d("CASE 4") - return InputUiState.Failure(CODE_UNCHECKED_DUPLICATION) - } - private fun checkLength(nickname: String) = nickname.length in MIN_LENGTH..MAX_LENGTH private fun containsSpaceOrSpecialChar(nickname: String) = !Regex(REGEX_PATTERN).matches(nickname) - fun updateTextChangedState(state: Boolean) { // updated in Activity - _isTextChanged.value = state - } - - fun updateDuplicateCheckButtonState(state: Boolean) { // updated in Activity - _isCheckBtnClicked.value = state - initDuplicateCheckButtonState() - } - - private fun initDuplicateCheckButtonState() { - _isCheckBtnClicked.value = false - } - // _nickname.map{} Flow -> MutableStateFlow 변환을 위한 확장 함수 private fun Flow.mutableStateIn( initialValue: T, diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt index c0c5efbd..f99b1e69 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/guide/GuideActivity.kt @@ -16,7 +16,6 @@ class GuideActivity : BindingActivity(R.layout.activity_gu super.onCreate(savedInstanceState) initViewPagerAdapter() - preventDefaultSwipe() observePageChange() initNextButtonClickListener() } @@ -25,10 +24,6 @@ class GuideActivity : BindingActivity(R.layout.activity_gu binding.vpGuide.adapter = GuideFragmentStateAdapter(this) } - private fun preventDefaultSwipe() { - binding.vpGuide.isUserInputEnabled = false - } - private fun observePageChange() { binding.vpGuide.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/FirstStoryFragment.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/FirstStoryFragment.kt index 4b22088a..b6738c24 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/FirstStoryFragment.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/FirstStoryFragment.kt @@ -11,10 +11,14 @@ class FirstStoryFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - bringSpeechBubbleToFront() + bringTextToFront() } - private fun bringSpeechBubbleToFront() { - binding.tvStoryWineyCountrySpeechBubble.bringToFront() + private fun bringTextToFront() { + with(binding) { + tvStorySaverSpeechBubble.bringToFront() + tvStoryWineyCountryName.bringToFront() + tvStoryWineyCountrySpeechBubble.bringToFront() + } } } diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/SecondStoryFragment.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/SecondStoryFragment.kt index 8f8a4962..c7b191dc 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/SecondStoryFragment.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/SecondStoryFragment.kt @@ -11,10 +11,14 @@ class SecondStoryFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - bringSpeechBubbleToFront() + bringTextToFront() } - private fun bringSpeechBubbleToFront() { - binding.tvStoryWineyCountrySpeechBubble.bringToFront() + private fun bringTextToFront() { + with(binding) { + tvStorySaverSpeechBubble.bringToFront() + tvStoryWineyCountryName.bringToFront() + tvStoryWineyCountrySpeechBubble.bringToFront() + } } } diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/StoryActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/StoryActivity.kt index 7176be4a..6d96d76a 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/StoryActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/StoryActivity.kt @@ -27,6 +27,13 @@ class StoryActivity : BindingActivity(R.layout.activity_st setUpDefaultNavigationText() setUpDefaultFragment(savedInstanceState) initNextButtonClickListener() + initSkipButtonClickListener() + } + + private fun initSkipButtonClickListener() { + binding.tvStorySkip.setOnClickListener { + navigateToNicknameScreen() + } } private fun initNextButtonClickListener() { diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/ThirdStoryFragment.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/ThirdStoryFragment.kt index 40492a90..5b7a11f9 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/ThirdStoryFragment.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/story/ThirdStoryFragment.kt @@ -11,10 +11,14 @@ class ThirdStoryFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - bringSpeechBubbleToFront() + bringTextToFront() } - private fun bringSpeechBubbleToFront() { - binding.tvStoryWineyCountrySpeechBubble.bringToFront() + private fun bringTextToFront() { + with(binding) { + tvStorySaverSpeechBubble.bringToFront() + tvStoryWineyCountryName.bringToFront() + tvStoryWineyCountrySpeechBubble.bringToFront() + } } } diff --git a/app/src/main/java/com/android/go/sopt/winey/util/binding/BindingAdapter.kt b/app/src/main/java/com/android/go/sopt/winey/util/binding/BindingAdapter.kt index 42388e1f..5906cae0 100644 --- a/app/src/main/java/com/android/go/sopt/winey/util/binding/BindingAdapter.kt +++ b/app/src/main/java/com/android/go/sopt/winey/util/binding/BindingAdapter.kt @@ -7,10 +7,13 @@ import android.widget.EditText import android.widget.ImageView import android.widget.ImageView.ScaleType import android.widget.TextView +import androidx.appcompat.widget.AppCompatButton import androidx.databinding.BindingAdapter import coil.load import coil.transform.RoundedCornersTransformation import com.android.go.sopt.winey.R +import com.android.go.sopt.winey.presentation.nickname.NicknameActivity.Companion.MY_PAGE_SCREEN +import com.android.go.sopt.winey.presentation.nickname.NicknameActivity.Companion.STORY_SCREEN import com.android.go.sopt.winey.util.code.ErrorCode.* import com.android.go.sopt.winey.util.context.colorOf import com.android.go.sopt.winey.util.context.drawableOf @@ -132,6 +135,51 @@ fun TextView.setNicknameHelperTextColor(inputUiState: InputUiState) { } } +@BindingAdapter("switchCloseButtonVisibility") +fun ImageView.switchCloseButtonVisibility(prevScreenName: String) { + when (prevScreenName) { + STORY_SCREEN -> visibility = View.GONE + MY_PAGE_SCREEN -> visibility = View.VISIBLE + } +} + +@BindingAdapter("switchTitleText") +fun TextView.switchTitleText(prevScreenName: String) { + when (prevScreenName) { + STORY_SCREEN -> + text = + context.stringOf(R.string.nickname_default_title) + + MY_PAGE_SCREEN -> + text = + context.stringOf(R.string.nickname_mypage_title) + } +} + +@BindingAdapter("switchCompleteButtonText") +fun TextView.switchCompleteButtonText(prevScreenName: String) { + when (prevScreenName) { + STORY_SCREEN -> + text = + context.stringOf(R.string.nickname_start_btn_text) + + MY_PAGE_SCREEN -> + text = + context.stringOf(R.string.nickname_update_complete_btn_text) + } +} + +@BindingAdapter("switchCompleteButtonBackground") +fun AppCompatButton.switchCompleteButtonBackground(isValidNickname: Boolean) { + if (isValidNickname) { + background = context.drawableOf(R.drawable.shape_yellow_fill_10_rect) + setTextColor(context.colorOf(R.color.gray_900)) + } else { + background = context.drawableOf(R.drawable.shape_gray200_fill_10_rect) + setTextColor(context.colorOf(R.color.gray_500)) + } +} + @BindingAdapter("setFeedLikeImage") fun setLikeImage(view: ImageView, isLiked: Boolean) { val imageRes = if (isLiked) { diff --git a/app/src/main/res/drawable/sel_nickname_edittext_focus_color.xml b/app/src/main/res/drawable/sel_nickname_edittext_focus_color.xml index 3828bbf9..1cba5ce9 100644 --- a/app/src/main/res/drawable/sel_nickname_edittext_focus_color.xml +++ b/app/src/main/res/drawable/sel_nickname_edittext_focus_color.xml @@ -1,5 +1,5 @@ - - + + diff --git a/app/src/main/res/drawable/sel_upload_nickname_btn_color.xml b/app/src/main/res/drawable/sel_upload_nickname_btn_color.xml index d08085bf..a89be533 100644 --- a/app/src/main/res/drawable/sel_upload_nickname_btn_color.xml +++ b/app/src/main/res/drawable/sel_upload_nickname_btn_color.xml @@ -1,5 +1,5 @@ - + - \ No newline at end of file + diff --git a/app/src/main/res/drawable/shape_gray_fill_10_rect.xml b/app/src/main/res/drawable/shape_gray200_fill_10_rect.xml similarity index 100% rename from app/src/main/res/drawable/shape_gray_fill_10_rect.xml rename to app/src/main/res/drawable/shape_gray200_fill_10_rect.xml diff --git a/app/src/main/res/drawable/shape_gray_line_5_rect.xml b/app/src/main/res/drawable/shape_gray200_line_5_rect.xml similarity index 98% rename from app/src/main/res/drawable/shape_gray_line_5_rect.xml rename to app/src/main/res/drawable/shape_gray200_line_5_rect.xml index fd9d6378..f2cc0e4a 100644 --- a/app/src/main/res/drawable/shape_gray_line_5_rect.xml +++ b/app/src/main/res/drawable/shape_gray200_line_5_rect.xml @@ -1,11 +1,8 @@ - - - diff --git a/app/src/main/res/drawable/shape_gray900_line_5_rect.xml b/app/src/main/res/drawable/shape_gray900_line_5_rect.xml new file mode 100644 index 00000000..33abda86 --- /dev/null +++ b/app/src/main/res/drawable/shape_gray900_line_5_rect.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/app/src/main/res/drawable/shape_gray900_line_cursor.xml b/app/src/main/res/drawable/shape_gray900_line_cursor.xml new file mode 100644 index 00000000..be7893c2 --- /dev/null +++ b/app/src/main/res/drawable/shape_gray900_line_cursor.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/activity_nickname.xml b/app/src/main/res/layout/activity_nickname.xml index bdc6d2e9..185c839d 100644 --- a/app/src/main/res/layout/activity_nickname.xml +++ b/app/src/main/res/layout/activity_nickname.xml @@ -9,6 +9,8 @@ name="vm" type="com.android.go.sopt.winey.presentation.nickname.NicknameViewModel" /> + + @@ -19,6 +21,7 @@ + app:layout_constraintTop_toTopOf="parent" + tools:text="@string/nickname_default_title" /> - + android:layout_height="0dp" + android:layout_marginEnd="10dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@id/btn_nickname_duplicate_check" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:textColorHint="@color/gray_400" + android:textCursorDrawable="@drawable/shape_gray900_line_cursor" /> - + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:rippleColor="@android:color/transparent" /> + + + app:layout_constraintStart_toStartOf="@id/cl_nickname_container" + app:layout_constraintTop_toBottomOf="@id/cl_nickname_container" /> + app:layout_constraintStart_toStartOf="parent" + tools:background="@drawable/shape_gray200_fill_10_rect" + tools:text="@string/nickname_start_btn_text" + tools:textColor="@color/gray_500" /> diff --git a/app/src/main/res/layout/activity_story.xml b/app/src/main/res/layout/activity_story.xml index 2be76aec..513be57d 100644 --- a/app/src/main/res/layout/activity_story.xml +++ b/app/src/main/res/layout/activity_story.xml @@ -49,11 +49,23 @@ android:layout_height="wrap_content" android:text="@{@string/story_nav_number(vm.pageNumber)}" android:textAppearance="@style/TextAppearance.WINEY.body_m_14" - android:textColor="@color/gray_400" + android:textColor="@color/gray_900" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:text="@string/story_nav_num_preview" /> + + + app:layout_constraintTop_toBottomOf="@id/tv_story_nav_title" + tools:text="@string/story_first_detail_text" /> - diff --git a/app/src/main/res/layout/fragment_second_story.xml b/app/src/main/res/layout/fragment_second_story.xml index 1ef094f5..896c2827 100644 --- a/app/src/main/res/layout/fragment_second_story.xml +++ b/app/src/main/res/layout/fragment_second_story.xml @@ -74,21 +74,20 @@ - diff --git a/app/src/main/res/layout/fragment_third_story.xml b/app/src/main/res/layout/fragment_third_story.xml index 8fba7042..9f36fee9 100644 --- a/app/src/main/res/layout/fragment_third_story.xml +++ b/app/src/main/res/layout/fragment_third_story.xml @@ -74,21 +74,20 @@ - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0c469098..94fd2b99 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -134,10 +134,11 @@ 위니제국에 들어온 당신,\n어떤 닉네임으로 불리고 싶나요? 위니제국의 국민인 당신,\n어떤 닉네임으로 바꾸고 싶나요? 공백 또는 특수문자는 사용할 수 없습니다 - 닉네임 입력 + 닉네임 입력 (%d/8) 중복확인 - 확인 + 확인 + 시작하기 1~8자로 입력해주세요 :( 공백과 특수문자는 사용할 수 없습니다 :( 닉네임 중복확인을 해주세요 :( @@ -170,7 +171,7 @@ 아니, 어제까지 위니 제국의\n황제였던 내가 갑자기 평민이라고? 그래서 지금 날 쫓아내는거야? 어떻게 해야 다시 돌아갈 수 있어? - 황제님 죄송합니다. 마지막까지 왕가를\n설득 시키려고 하였으나… + 황제님 죄송합니다. 마지막까지 왕가를 \n설득 시키려고 하였으나… 흥청망청 돈을 쓰셔 위니제국의\n황제 자격을 박탈당하셨습니다. 절약 목표 금액을 채우시면, 다시 황제로\n돌아오실 수 있습니다. 다시 뵙기를 바라며… 1/3 @@ -213,4 +214,5 @@ 삭제하기 신고하기 + 건너뛰기