diff --git a/app/build.gradle b/app/build.gradle index 0e479367..21e5c575 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -160,6 +160,12 @@ dependencies { // dataStore implementation 'androidx.datastore:datastore-preferences:1.0.0' + //coil + implementation("io.coil-kt:coil:2.0.0-rc03") + + //tooltip + implementation "com.github.skydoves:balloon:1.4.6" + // test androidTestImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4' androidTestImplementation 'com.squareup.okhttp3:mockwebserver:4.10.0' diff --git a/app/src/main/java/sopt/motivoo/data/model/response/ResponseExerciseDto.kt b/app/src/main/java/sopt/motivoo/data/model/response/ResponseExerciseDto.kt index 7744e48b..c7358450 100644 --- a/app/src/main/java/sopt/motivoo/data/model/response/ResponseExerciseDto.kt +++ b/app/src/main/java/sopt/motivoo/data/model/response/ResponseExerciseDto.kt @@ -17,6 +17,7 @@ data class ResponseExerciseDto( @Serializable data class ExerciseHistoryData( @SerialName("user_type") val userType: String, + @SerialName("opponent_user_type") val opponentUserType: String, @SerialName("today_mission") val todayMission: MissionContent?, @SerialName("mission_history") val missionHistory: List?, ) { @@ -39,8 +40,11 @@ data class ResponseExerciseDto( } fun toExerciseData(): ExerciseData { + fun String.removeDayOfTheWeek(): String = this.removeRange(length - 4 until length) val list: MutableList = - if (data.todayMission == null && data.missionHistory?.isEmpty() == true) { + if (data.todayMission == null && data.missionHistory!!.isEmpty()) { + mutableListOf() + } else if (data.todayMission == null && data.missionHistory!!.size == 1 && data.missionHistory[0].date.removeDayOfTheWeek() == LocalDate.now().prettyString) { mutableListOf() } else if (data.todayMission == null) { mutableListOf( @@ -68,7 +72,6 @@ data class ResponseExerciseDto( } data.missionHistory?.forEach { - fun String.removeDayOfTheWeek(): String = this.removeRange(length - 4 until length) if (it.date.removeDayOfTheWeek() != LocalDate.now().prettyString) { list.add( ExerciseItemInfo.EachDateItemInfo( @@ -83,6 +86,6 @@ data class ResponseExerciseDto( ) } } - return ExerciseData(data.userType, list) + return ExerciseData(data.userType, data.opponentUserType, list) } } diff --git a/app/src/main/java/sopt/motivoo/domain/entity/exercise/ExerciseData.kt b/app/src/main/java/sopt/motivoo/domain/entity/exercise/ExerciseData.kt index 6dc3e5da..d765be48 100644 --- a/app/src/main/java/sopt/motivoo/domain/entity/exercise/ExerciseData.kt +++ b/app/src/main/java/sopt/motivoo/domain/entity/exercise/ExerciseData.kt @@ -2,6 +2,7 @@ package sopt.motivoo.domain.entity.exercise class ExerciseData( val userType: String, + val opponentUserType: String, val exerciseItemInfoList: List, ) { sealed class ExerciseItemInfo { diff --git a/app/src/main/java/sopt/motivoo/presentation/exercise/ExerciseAdapter.kt b/app/src/main/java/sopt/motivoo/presentation/exercise/ExerciseAdapter.kt index 61cf6437..89e420a2 100644 --- a/app/src/main/java/sopt/motivoo/presentation/exercise/ExerciseAdapter.kt +++ b/app/src/main/java/sopt/motivoo/presentation/exercise/ExerciseAdapter.kt @@ -4,10 +4,10 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import sopt.motivoo.databinding.ItemExerciseBinding -import sopt.motivoo.databinding.ItemExerciseNoticeBinding +import sopt.motivoo.databinding.ItemExerciseTodayBinding import sopt.motivoo.domain.entity.exercise.ExerciseData.ExerciseItemInfo -class ExerciseAdapter(private val userType: String) : +class ExerciseAdapter(private val userType: String, private val opponentUserType: String) : RecyclerView.Adapter() { private var exerciseItemInfoList: List = emptyList() @@ -15,7 +15,7 @@ class ExerciseAdapter(private val userType: String) : val inflater = LayoutInflater.from(parent.context) return when (viewType) { NOTICE_INFO_TYPE -> { - val binding = ItemExerciseNoticeBinding.inflate(inflater, parent, false) + val binding = ItemExerciseTodayBinding.inflate(inflater, parent, false) ExerciseNoticeViewHolder(binding) } @@ -30,12 +30,19 @@ class ExerciseAdapter(private val userType: String) : when (holder) { is ExerciseNoticeViewHolder -> { val noticeInfo = exerciseItemInfoList[position] - holder.onBind(noticeInfo as ExerciseItemInfo.NoticeItemInfo, userType) + holder.onBind( + noticeInfo as ExerciseItemInfo.NoticeItemInfo, + userType, + opponentUserType, + itemCount + ) } is ExerciseEachDateInfoViewHolder -> { val dateExerciseInfo = exerciseItemInfoList[position] - holder.onBind(dateExerciseInfo as ExerciseItemInfo.EachDateItemInfo, userType, itemCount) + holder.onBind( + dateExerciseInfo as ExerciseItemInfo.EachDateItemInfo, opponentUserType + ) } } } diff --git a/app/src/main/java/sopt/motivoo/presentation/exercise/ExerciseFragment.kt b/app/src/main/java/sopt/motivoo/presentation/exercise/ExerciseFragment.kt index 25505834..559fafaf 100644 --- a/app/src/main/java/sopt/motivoo/presentation/exercise/ExerciseFragment.kt +++ b/app/src/main/java/sopt/motivoo/presentation/exercise/ExerciseFragment.kt @@ -92,7 +92,10 @@ class ExerciseFragment : BindingFragment(R.layout.fragm } private fun initAdapter(exerciseData: ExerciseData) { - val adapter = ExerciseAdapter(userType = exerciseData.userType) + val adapter = ExerciseAdapter( + userType = exerciseData.userType, + opponentUserType = exerciseData.opponentUserType + ) adapter.updateItemList(exerciseList = exerciseData.exerciseItemInfoList) binding.rvExerciseEachDateExercise.adapter = adapter } diff --git a/app/src/main/java/sopt/motivoo/presentation/exercise/ExerciseViewHolder.kt b/app/src/main/java/sopt/motivoo/presentation/exercise/ExerciseViewHolder.kt index 4952ab4e..a554f68d 100644 --- a/app/src/main/java/sopt/motivoo/presentation/exercise/ExerciseViewHolder.kt +++ b/app/src/main/java/sopt/motivoo/presentation/exercise/ExerciseViewHolder.kt @@ -6,13 +6,15 @@ import androidx.core.content.ContextCompat import androidx.navigation.findNavController import androidx.recyclerview.widget.RecyclerView import coil.load +import coil.transform.RoundedCornersTransformation +import com.skydoves.balloon.ArrowPositionRules +import com.skydoves.balloon.Balloon +import com.skydoves.balloon.BalloonSizeSpec import sopt.motivoo.R import sopt.motivoo.databinding.ItemExerciseBinding -import sopt.motivoo.databinding.ItemExerciseNoticeBinding +import sopt.motivoo.databinding.ItemExerciseTodayBinding import sopt.motivoo.domain.entity.exercise.ExerciseData.ExerciseItemInfo import sopt.motivoo.presentation.exercise.ExerciseFragment.Companion.CHILD -import sopt.motivoo.util.extension.prettyString -import java.time.LocalDate class ExerciseEachDateInfoViewHolder( private val binding: ItemExerciseBinding, @@ -21,39 +23,27 @@ class ExerciseEachDateInfoViewHolder( fun onBind( exerciseItemInfoData: ExerciseItemInfo.EachDateItemInfo, - userType: String, - itemSize: Int, + opponentUserType: String, ) { - setHistoryOrNot(exerciseItemInfoData, userType, itemSize) + setHistory(exerciseItemInfoData, opponentUserType) } - private fun setHistoryOrNot( + private fun setHistory( exerciseItemInfoData: ExerciseItemInfo.EachDateItemInfo, - userType: String, - itemSize: Int, + opponentUserType: String, ) { with(binding) { - fun String.removeDayOfTheWeek(): String = this.removeRange(length - 4 until length) - if (itemSize == 2 && exerciseItemInfoData.date!!.removeDayOfTheWeek() == LocalDate.now().prettyString) { - ivExerciseEmptyHistory.visibility = View.VISIBLE - ivItemExerciseLeftImage.visibility = View.GONE - tvItemExerciseMyExercise.visibility = View.GONE - tvItemExerciseOpponentExercise.visibility = View.GONE - ivItemExerciseRightImage.visibility = View.GONE - } else { - ivExerciseEmptyHistory.visibility = View.GONE - initText(exerciseItemInfoData, binding, userType) - initImage(exerciseItemInfoData, binding) - val context = binding.root.context - checkStatus(exerciseItemInfoData, binding, context) - } + initText(exerciseItemInfoData, binding, opponentUserType) + val context = binding.root.context + initImage(context, exerciseItemInfoData, binding) + checkStatus(exerciseItemInfoData, binding, context) } } private fun initText( exerciseItemInfoData: ExerciseItemInfo.EachDateItemInfo, binding: ItemExerciseBinding, - userType: String, + opponentUserType: String, ) { with(binding) { tvItemExerciseDate.text = exerciseItemInfoData.date @@ -62,26 +52,36 @@ class ExerciseEachDateInfoViewHolder( tvItemExerciseMyState.text = exerciseItemInfoData.myMissionStatus tvItemExerciseParentState.text = exerciseItemInfoData.opponentMissionStatus tvItemExerciseOpponentExercise.text = - if (userType == CHILD) root.context.getString(R.string.exercise_parent_exercise) else root.context.getString( - R.string.exercise_child_exercise + if (opponentUserType == CHILD) root.context.getString(R.string.exercise_child_exercise) else root.context.getString( + R.string.exercise_parent_exercise ) } } + private fun dpToPx(context: Context, dp: Float): Float { + return dp * (context.resources.displayMetrics.density) + } + private fun initImage( + context: Context, exerciseItemInfoData: ExerciseItemInfo.EachDateItemInfo, binding: ItemExerciseBinding, ) { + val pxValue = dpToPx(context, 8f) with(binding) { if (exerciseItemInfoData.myMissionImgUrl != null) { - ivItemExerciseLeftImage.load(exerciseItemInfoData.myMissionImgUrl) + ivItemExerciseLeftImage.load(exerciseItemInfoData.myMissionImgUrl) { + transformations(RoundedCornersTransformation(pxValue)) + } } else if (exerciseItemInfoData.myMissionStatus == "없음") { ivItemExerciseLeftImage.setImageResource(R.drawable.img_choose_exercise) } else { ivItemExerciseLeftImage.setImageResource(R.drawable.img_success_next_exercise) } if (exerciseItemInfoData.opponentMissionImgUrl != null) { - ivItemExerciseRightImage.load(exerciseItemInfoData.opponentMissionImgUrl) + ivItemExerciseRightImage.load(exerciseItemInfoData.opponentMissionImgUrl) { + transformations(RoundedCornersTransformation(pxValue)) + } } else if (exerciseItemInfoData.opponentMissionStatus == "없음") { ivItemExerciseRightImage.setImageResource(R.drawable.img_choose_exercise) } else { @@ -126,23 +126,58 @@ class ExerciseEachDateInfoViewHolder( } } -class ExerciseNoticeViewHolder(private val binding: ItemExerciseNoticeBinding) : +class ExerciseNoticeViewHolder(private val binding: ItemExerciseTodayBinding) : RecyclerView.ViewHolder(binding.root) { - fun onBind(exerciseNoticeData: ExerciseItemInfo.NoticeItemInfo, userType: String) { - setCharacterIcon(userType) + fun onBind( + exerciseNoticeData: ExerciseItemInfo.NoticeItemInfo, + userType: String, + opponentUserType: String, + itemCount: Int, + ) { + clickQuestionMark() + setCharacterIcon(userType, opponentUserType) setText(exerciseNoticeData) + setEmptyHistory(itemCount) } - private fun setCharacterIcon(userType: String) { - if (userType == CHILD) { - binding.ivExerciseTodayIconLeft.setImageResource(R.drawable.ic_child_left) - binding.ivExerciseTodayIconRight.setImageResource(R.drawable.ic_parent_right) - } else { - binding.ivExerciseTodayIconLeft.setImageResource(R.drawable.ic_parent_left) - binding.ivExerciseTodayIconRight.setImageResource(R.drawable.ic_child_right) + private fun clickQuestionMark() { + val context = binding.root.context + val balloon = Balloon.Builder(context) + .setHeight(BalloonSizeSpec.WRAP) + .setWidth(BalloonSizeSpec.WRAP) + .setTextResource(R.string.exercise_today_question_notice) + .setArrowColorResource(R.color.white_FFFFFF) + .setBackgroundColorResource(R.color.white_FFFFFF) + .setTextColorResource(R.color.gray_800_303031) + .setTextSize(15f) + .setTextTypeface(R.font.pretendard) + .setPaddingLeft(11) + .setPaddingRight(15) + .setPaddingTop(14) + .setPaddingBottom(15) + .setMarginTop(3) + .setArrowPositionRules(ArrowPositionRules.ALIGN_ANCHOR) + .setIconDrawableResource(R.drawable.ic_notice) + .setCornerRadius(6f) + .setArrowPosition(0.5f) + .setElevation(5) + .setArrowSize(13) + .build() + + binding.ivExerciseTodayIconQuestion.setOnClickListener { + balloon.showAlignTop(binding.ivExerciseTodayIconQuestion) } } + private fun setCharacterIcon(userType: String, opponentUserType: String) { + if (userType == CHILD) binding.ivExerciseTodayIconLeft.setImageResource(R.drawable.ic_child_left) else binding.ivExerciseTodayIconLeft.setImageResource( + R.drawable.ic_parent_left + ) + if (opponentUserType == CHILD) binding.ivExerciseTodayIconRight.setImageResource(R.drawable.ic_child_right) else binding.ivExerciseTodayIconRight.setImageResource( + R.drawable.ic_parent_right + ) + } + private fun setText(exerciseNoticeData: ExerciseItemInfo.NoticeItemInfo) { val context = binding.root.context if (exerciseNoticeData.missionContent == null) { @@ -156,7 +191,7 @@ class ExerciseNoticeViewHolder(private val binding: ItemExerciseNoticeBinding) : with(binding) { tvExerciseTodayExercise.text = context.getString(R.string.exercise_please_select_today_mission) - clExerciseSelectTodayMission.visibility = View.VISIBLE + clExerciseTodaySelectTodayMission.visibility = View.VISIBLE tvExerciseTodayMission.visibility = View.GONE ivExerciseTodayBubbleLeft.visibility = View.GONE ivExerciseTodayBubbleRight.visibility = View.GONE @@ -165,7 +200,7 @@ class ExerciseNoticeViewHolder(private val binding: ItemExerciseNoticeBinding) : } private fun setClickEvents() { - binding.clExerciseSelectTodayMission.setOnClickListener { + binding.clExerciseTodaySelectTodayMission.setOnClickListener { it.findNavController().navigate(R.id.action_exerciseFragment_to_homeFragment) } } @@ -176,28 +211,44 @@ class ExerciseNoticeViewHolder(private val binding: ItemExerciseNoticeBinding) : ) { with(binding) { tvExerciseTodayExercise.text = context.getString(R.string.exercise_today_exercise) - clExerciseSelectTodayMission.visibility = View.GONE + clExerciseTodaySelectTodayMission.visibility = View.GONE tvExerciseTodayMission.text = exerciseNoticeData.missionContent } - setTodayImageAndBubble(exerciseNoticeData) + setTodayImageAndBubble(context, exerciseNoticeData) + } + + private fun dpToPx(context: Context, dp: Float): Float { + return dp * (context.resources.displayMetrics.density) } private fun setTodayImageAndBubble( + context: Context, exerciseNoticeData: ExerciseItemInfo.NoticeItemInfo, ) { + val pxValue = dpToPx(context, 8f) if (exerciseNoticeData.missionDate == exerciseNoticeData.todayDate) { if (exerciseNoticeData.myMissionStatus == ExerciseEachDateInfoViewHolder.STATE_SUCCESS_TYPE) { binding.ivExerciseTodayBubbleLeft.setImageResource(R.drawable.ic_bubble_success) - binding.ivExerciseTodayImageLeft.load(exerciseNoticeData.myMissionImgUrl) + binding.ivExerciseTodayImageLeft.load(exerciseNoticeData.myMissionImgUrl) { + transformations(RoundedCornersTransformation(pxValue)) + } } else { binding.ivExerciseTodayBubbleLeft.setImageResource(R.drawable.ic_bubble_exercising) } if (exerciseNoticeData.opponentMissionStatus == ExerciseEachDateInfoViewHolder.STATE_SUCCESS_TYPE) { binding.ivExerciseTodayBubbleRight.setImageResource(R.drawable.ic_bubble_success) - binding.ivExerciseTodayImageRight.load(exerciseNoticeData.opponentMissionImgUrl) + binding.ivExerciseTodayImageRight.load(exerciseNoticeData.opponentMissionImgUrl) { + transformations(RoundedCornersTransformation(pxValue)) + } } else { binding.ivExerciseTodayBubbleRight.setImageResource(R.drawable.ic_bubble_exercising) } } } + + private fun setEmptyHistory(itemCount: Int) { + if (itemCount >= 2) { + binding.ivExerciseTodayEmptyHistory.visibility = View.GONE + } + } } diff --git a/app/src/main/res/drawable/background_exercise.xml b/app/src/main/res/drawable/background_exercise.xml index 6f80bff4..7a4e2a40 100644 --- a/app/src/main/res/drawable/background_exercise.xml +++ b/app/src/main/res/drawable/background_exercise.xml @@ -4,5 +4,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_bubble_exercising.xml b/app/src/main/res/drawable/ic_bubble_exercising.xml index 4e27db24..a784a9bf 100644 --- a/app/src/main/res/drawable/ic_bubble_exercising.xml +++ b/app/src/main/res/drawable/ic_bubble_exercising.xml @@ -5,11 +5,11 @@ android:viewportHeight="34"> + android:fillColor="#F4F5F9"/> + android:fillColor="#F4F5F9"/> diff --git a/app/src/main/res/drawable/img_exercise_today_shoes.xml b/app/src/main/res/drawable/img_exercise_today_shoes.xml index 2206cdfe..b0e57744 100644 --- a/app/src/main/res/drawable/img_exercise_today_shoes.xml +++ b/app/src/main/res/drawable/img_exercise_today_shoes.xml @@ -1,35 +1,20 @@ - - - - - - - - - - - + android:width="176dp" + android:height="188dp" + android:viewportWidth="176" + android:viewportHeight="188"> + + + + + + diff --git a/app/src/main/res/drawable/shape_rectangle_white_radius6.xml b/app/src/main/res/drawable/shape_rectangle_white_radius6.xml new file mode 100644 index 00000000..1799e602 --- /dev/null +++ b/app/src/main/res/drawable/shape_rectangle_white_radius6.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/bottom_sheet_home.xml b/app/src/main/res/layout/bottom_sheet_home.xml index 25ce3ffd..bf9e5248 100644 --- a/app/src/main/res/layout/bottom_sheet_home.xml +++ b/app/src/main/res/layout/bottom_sheet_home.xml @@ -87,7 +87,7 @@ android:id="@+id/pv_loading" android:layout_width="0dp" android:layout_height="0dp" - android:background="@color/white_FFFFFF4d" + android:background="@color/gray_600_7072764d" android:padding="150dp" android:visibility="invisible" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/dialog_home_photo.xml b/app/src/main/res/layout/dialog_home_photo.xml index 320dfa86..63811024 100644 --- a/app/src/main/res/layout/dialog_home_photo.xml +++ b/app/src/main/res/layout/dialog_home_photo.xml @@ -35,7 +35,7 @@ android:id="@+id/pv_loading" android:layout_width="0dp" android:layout_height="0dp" - android:background="@color/white_FFFFFF4d" + android:background="@color/gray_600_7072764d" android:padding="150dp" android:visibility="invisible" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 47988237..30281d62 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -166,6 +166,19 @@ app:layout_constraintTop_toTopOf="@id/motivoo_my_pie_chart" app:layout_constraintVertical_bias="0.3" /> + + @@ -237,7 +250,7 @@ android:visibility="@{vm.isPermissionGranted() ? View.GONE : View.VISIBLE}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/iv_step_count" + app:layout_constraintTop_toBottomOf="@id/tv_exercise_percent" tools:visibility="invisible" /> @@ -245,7 +258,7 @@ android:id="@+id/pv_loading" android:layout_width="0dp" android:layout_height="0dp" - android:background="@color/white_FFFFFF4d" + android:background="@color/gray_600_7072764d" android:padding="150dp" android:visibility="invisible" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/fragment_mypage.xml b/app/src/main/res/layout/fragment_mypage.xml index ea032d27..52443087 100644 --- a/app/src/main/res/layout/fragment_mypage.xml +++ b/app/src/main/res/layout/fragment_mypage.xml @@ -98,13 +98,14 @@ diff --git a/app/src/main/res/layout/item_exercise.xml b/app/src/main/res/layout/item_exercise.xml index c396c863..e501180c 100644 --- a/app/src/main/res/layout/item_exercise.xml +++ b/app/src/main/res/layout/item_exercise.xml @@ -8,7 +8,7 @@ + app:layout_constraintTop_toBottomOf="@id/tv_item_exercise_date" /> + app:layout_constraintTop_toTopOf="@id/iv_item_exercise_left_image" /> - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_exercise_notice.xml b/app/src/main/res/layout/item_exercise_today.xml similarity index 77% rename from app/src/main/res/layout/item_exercise_notice.xml rename to app/src/main/res/layout/item_exercise_today.xml index cc8084d6..e9907000 100644 --- a/app/src/main/res/layout/item_exercise_notice.xml +++ b/app/src/main/res/layout/item_exercise_today.xml @@ -9,24 +9,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - - - + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintBottom_toBottomOf="@id/tv_exercise_today_select_today_mission" + app:layout_constraintStart_toEndOf="@id/tv_exercise_today_select_today_mission" + app:layout_constraintTop_toTopOf="@id/tv_exercise_today_select_today_mission" /> @@ -129,11 +108,15 @@ + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_marginHorizontal="1dp" + android:layout_marginTop="1dp" + android:scaleType="centerCrop" + app:layout_constraintDimensionRatio="1:1.1006" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_marginHorizontal="1dp" + android:layout_marginTop="1dp" + android:scaleType="centerCrop" + app:layout_constraintDimensionRatio="1:1.1006" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - - + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index d7748263..f19bebfd 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,11 +2,10 @@ #090909 #FFFFFF - #4dFFFFFF #FF19A3 #FFE6F5 - #FFEDEC + #FFF4F2 #FFCBC8 #FFA8A4 #FF847E diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f4a4aac5..db28f2c4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -66,12 +66,14 @@ 자녀 걸음 오늘의 운동 운동 방법 + 운동 달성률 운동 인증하기 운동 완료 사진 찍기 앨범에서 선택하기 자녀 부모 + 하이파이브 성공! 운동 인증이 완료되었어요! 오늘도 멋지게 운동을 해내셨군요 자정마다 걸음 수를 초기화하려면 알림 및 리마인더를 허용해주세요. @@ -154,7 +156,6 @@ 오늘의 운동 8천걸음 걷고 \n스탠딩 랫폴다운 20번 하기 - 운동 기록은 30일간 보관 후 사라져요! 2023년 12월 25일 월요일 다음 운동은\n꼭 성공해요! 내 운동 @@ -165,6 +166,8 @@ 오늘의 운동 하러가기 오늘의 운동 선택하러가기 오늘 할 운동을 선택하세요! + 운동 기록은 30일간 보관 후 사라져요! + 우리들의 운동 기록 잠시 연결이 불안정해요 @@ -200,7 +203,5 @@ 매칭이 끊어졌어요 매칭이 끊어져 모티부를 이용할 수 없어요\n탈퇴 후 다시 가입해주세요 잠시 연결이 불안정해요 - 우리들의 운동 기록 -