From 76c842a8771e91e89ec65e0f829ebdb99de929dc Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sun, 1 Jan 2023 14:48:26 +0900 Subject: [PATCH 001/745] =?UTF-8?q?[add]=20#6=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EB=B7=B0=20=EB=82=B4=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EB=90=A0=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EB=A6=AC=EC=86=8C=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../res/drawable/ic_default_green_sticker.xml | 43 ++++ .../drawable/ic_default_orange_sticker.xml | 39 ++++ .../res/drawable/ic_snail_green_sticker.xml | 202 ++++++++++++++++ .../res/drawable/ic_snail_orange_sticker.xml | 216 ++++++++++++++++++ 4 files changed, 500 insertions(+) create mode 100644 app/src/main/res/drawable/ic_default_green_sticker.xml create mode 100644 app/src/main/res/drawable/ic_default_orange_sticker.xml create mode 100644 app/src/main/res/drawable/ic_snail_green_sticker.xml create mode 100644 app/src/main/res/drawable/ic_snail_orange_sticker.xml diff --git a/app/src/main/res/drawable/ic_default_green_sticker.xml b/app/src/main/res/drawable/ic_default_green_sticker.xml new file mode 100644 index 00000000..46285e8f --- /dev/null +++ b/app/src/main/res/drawable/ic_default_green_sticker.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_default_orange_sticker.xml b/app/src/main/res/drawable/ic_default_orange_sticker.xml new file mode 100644 index 00000000..7070d6a2 --- /dev/null +++ b/app/src/main/res/drawable/ic_default_orange_sticker.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_snail_green_sticker.xml b/app/src/main/res/drawable/ic_snail_green_sticker.xml new file mode 100644 index 00000000..99925510 --- /dev/null +++ b/app/src/main/res/drawable/ic_snail_green_sticker.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_snail_orange_sticker.xml b/app/src/main/res/drawable/ic_snail_orange_sticker.xml new file mode 100644 index 00000000..a85793dd --- /dev/null +++ b/app/src/main/res/drawable/ic_snail_orange_sticker.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 880c9db2aa7e79772c6e800a87536e38c7e4b3d0 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sun, 1 Jan 2023 14:49:25 +0900 Subject: [PATCH 002/745] =?UTF-8?q?[feat]=20#6=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EB=B7=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/domain/model/GoalSticker.kt | 6 +++ .../presentation/detail/GoalDetailActivity.kt | 50 +++++++++++++++++++ .../detail/GoalDetailViewModel.kt | 30 +++++++++++ .../detail/GoalStickerListAdapter.kt | 45 +++++++++++++++++ .../keepgoeat/presentation/type/EatingType.kt | 27 ++++++++++ .../presentation/type/RecyclerLayoutType.kt | 5 ++ .../org/keepgoeat/util/ItemDecorationUtil.kt | 36 +++++++++++++ .../org/keepgoeat/util/extension/IntExt.kt | 7 +++ .../res/drawable/shape_border_radius_8.xml | 4 ++ .../main/res/layout/activity_goal_detail.xml | 49 ++++++++++++++++++ app/src/main/res/layout/item_goal_sticker.xml | 24 +++++++++ app/src/main/res/values/dimens.xml | 4 ++ app/src/main/res/values/strings.xml | 3 ++ 13 files changed, 290 insertions(+) create mode 100644 app/src/main/java/org/keepgoeat/domain/model/GoalSticker.kt create mode 100644 app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt create mode 100644 app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt create mode 100644 app/src/main/java/org/keepgoeat/presentation/detail/GoalStickerListAdapter.kt create mode 100644 app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt create mode 100644 app/src/main/java/org/keepgoeat/presentation/type/RecyclerLayoutType.kt create mode 100644 app/src/main/java/org/keepgoeat/util/ItemDecorationUtil.kt create mode 100644 app/src/main/java/org/keepgoeat/util/extension/IntExt.kt create mode 100644 app/src/main/res/drawable/shape_border_radius_8.xml create mode 100644 app/src/main/res/layout/activity_goal_detail.xml create mode 100644 app/src/main/res/layout/item_goal_sticker.xml create mode 100644 app/src/main/res/values/dimens.xml diff --git a/app/src/main/java/org/keepgoeat/domain/model/GoalSticker.kt b/app/src/main/java/org/keepgoeat/domain/model/GoalSticker.kt new file mode 100644 index 00000000..29d585ae --- /dev/null +++ b/app/src/main/java/org/keepgoeat/domain/model/GoalSticker.kt @@ -0,0 +1,6 @@ +package org.keepgoeat.domain.model + +data class GoalSticker( + val id: Int, + val isDone: Boolean, +) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt new file mode 100644 index 00000000..d46b169d --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -0,0 +1,50 @@ +package org.keepgoeat.presentation.detail + +import android.os.Bundle +import androidx.activity.viewModels +import dagger.hilt.android.AndroidEntryPoint +import org.keepgoeat.R +import org.keepgoeat.databinding.ActivityGoalDetailBinding +import org.keepgoeat.presentation.detail.GoalDetailViewModel.Companion.CELL_COUNT +import org.keepgoeat.presentation.type.EatingType +import org.keepgoeat.presentation.type.RecyclerLayoutType +import org.keepgoeat.util.ItemDecorationUtil +import org.keepgoeat.util.binding.BindingActivity + +@AndroidEntryPoint +class GoalDetailActivity : BindingActivity(R.layout.activity_goal_detail) { + private val viewModel: GoalDetailViewModel by viewModels() + private lateinit var adapter: GoalStickerListAdapter + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding.viewModel = viewModel + adapter = GoalStickerListAdapter(EatingType.MORE, CELL_COUNT) + + initLayout() + addObservers() + } + + private fun initLayout() { + binding.rvGoalCard.adapter = adapter + binding.rvGoalCard.addItemDecoration( + ItemDecorationUtil(CARD_ITEM_SPACE, Pair(CARD_MATRIX_ROW, CARD_MATRIX_COL), RecyclerLayoutType.GRID) + ) + } + + private fun addListeners() { + TODO("Not yet implemented") + } + + private fun addObservers() { + viewModel.goalStickers.observe(this) { stickers -> + adapter.submitList(stickers) + } + } + + companion object { + private const val CARD_ITEM_SPACE = 2 + private const val CARD_MATRIX_ROW = 5 + private const val CARD_MATRIX_COL = 7 + } +} diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt new file mode 100644 index 00000000..22dab423 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt @@ -0,0 +1,30 @@ +package org.keepgoeat.presentation.detail + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import org.keepgoeat.domain.model.GoalSticker +import javax.inject.Inject + +@HiltViewModel +class GoalDetailViewModel @Inject constructor() : ViewModel() { + private val _goalStickers = MutableLiveData>() + val goalStickers: LiveData> get() = _goalStickers + + init { + fetchGoalDetailInfo() + } + + private fun fetchGoalDetailInfo() { + // TODO api 연동 후 remote에서 데이터 불러오기 + val totalAchievementDays = 8 + _goalStickers.value = Array(CELL_COUNT) { idx -> + GoalSticker(idx, idx < totalAchievementDays) + }.toList() + } + + companion object { + const val CELL_COUNT = 35 + } +} diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalStickerListAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalStickerListAdapter.kt new file mode 100644 index 00000000..af647cc5 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalStickerListAdapter.kt @@ -0,0 +1,45 @@ +package org.keepgoeat.presentation.detail + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import org.keepgoeat.databinding.ItemGoalStickerBinding +import org.keepgoeat.domain.model.GoalSticker +import org.keepgoeat.presentation.type.EatingType +import org.keepgoeat.util.ItemDiffCallback +import java.time.LocalDate + +class GoalStickerListAdapter(private val eatingType: EatingType, private val cellCount: Int) : + ListAdapter( + ItemDiffCallback( + onContentsTheSame = { old, new -> old == new }, + onItemsTheSame = { old, new -> old.id == new.id } + )) { + + private lateinit var inflater: LayoutInflater + /** 전체 셀 개수에서 월별 일 수를 뺀 빈칸 수 */ + private val blankCellCount: Int = cellCount - LocalDate.now().lengthOfMonth() + + class FollowerViewHolder(private val binding: ItemGoalStickerBinding) : + RecyclerView.ViewHolder(binding.root) { + fun onBind(data: GoalSticker, eatingType: EatingType, isDefault: Boolean) { + binding.layout.setBackgroundColor(eatingType.cardBackgroundColor) + if (isDefault) + binding.ivSticker.setBackgroundResource(eatingType.defaultStickerRes) + else if (data.isDone) + binding.ivSticker.setBackgroundResource(eatingType.snailStickerRes) + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FollowerViewHolder { + if (!::inflater.isInitialized) + inflater = LayoutInflater.from(parent.context) + + return FollowerViewHolder(ItemGoalStickerBinding.inflate(inflater, parent, false)) + } + + override fun onBindViewHolder(holder: FollowerViewHolder, position: Int) { + holder.onBind(currentList[position], eatingType, position >= itemCount - blankCellCount) + } +} diff --git a/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt b/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt new file mode 100644 index 00000000..5dfbe628 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt @@ -0,0 +1,27 @@ +package org.keepgoeat.presentation.type + +import android.graphics.Color +import androidx.annotation.ColorInt +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import org.keepgoeat.R + +enum class EatingType( + @StringRes val strRes: Int, + @DrawableRes val snailStickerRes: Int, + @DrawableRes val defaultStickerRes: Int, + @ColorInt val cardBackgroundColor: Int, +) { + LESS( + R.string.eating_type_less, + R.drawable.ic_snail_green_sticker, + R.drawable.ic_default_green_sticker, + Color.parseColor("#EAFBF4"), + ), + MORE( + R.string.eating_type_more, + R.drawable.ic_snail_orange_sticker, + R.drawable.ic_default_orange_sticker, + Color.parseColor("#FFF0EB"), + ) +} diff --git a/app/src/main/java/org/keepgoeat/presentation/type/RecyclerLayoutType.kt b/app/src/main/java/org/keepgoeat/presentation/type/RecyclerLayoutType.kt new file mode 100644 index 00000000..cc6889db --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/type/RecyclerLayoutType.kt @@ -0,0 +1,5 @@ +package org.keepgoeat.presentation.type + +enum class RecyclerLayoutType { + HORIZONTAL, VERTICAL, GRID +} diff --git a/app/src/main/java/org/keepgoeat/util/ItemDecorationUtil.kt b/app/src/main/java/org/keepgoeat/util/ItemDecorationUtil.kt new file mode 100644 index 00000000..c791260e --- /dev/null +++ b/app/src/main/java/org/keepgoeat/util/ItemDecorationUtil.kt @@ -0,0 +1,36 @@ +package org.keepgoeat.util + +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import org.keepgoeat.presentation.type.RecyclerLayoutType +import org.keepgoeat.util.extension.dp + +/** @param space : 여백 사이즈 + * @param gridMatrix : 그리드 레이아웃 메니저 적용 시 row, colume 수를 나타내는 Pair + * @param layoutType : 리사이클러뷰 레이아웃 배치 방식 */ +class ItemDecorationUtil( + private val space: Int, + private val gridMatrix: Pair? = null, + private val layoutType: RecyclerLayoutType, +) : RecyclerView.ItemDecoration() { + private val spaceDp = space.dp + private val zeroDp = 0.dp + + override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { + super.getItemOffsets(outRect, view, parent, state) + val pos = parent.getChildAdapterPosition(view) + + when (layoutType) { + RecyclerLayoutType.GRID -> { + if (gridMatrix == null) return + + with(gridMatrix) { + outRect.bottom = if (pos / second + 1 < first) spaceDp else zeroDp + outRect.right = if (pos % second + 1 < second) spaceDp else zeroDp + } + } + else -> {} + } + } +} diff --git a/app/src/main/java/org/keepgoeat/util/extension/IntExt.kt b/app/src/main/java/org/keepgoeat/util/extension/IntExt.kt new file mode 100644 index 00000000..7c2e4363 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/util/extension/IntExt.kt @@ -0,0 +1,7 @@ +package org.keepgoeat.util.extension + +import android.content.res.Resources +import kotlin.math.roundToInt + +val Int.dp: Int + get() = (this * Resources.getSystem().displayMetrics.density).roundToInt() diff --git a/app/src/main/res/drawable/shape_border_radius_8.xml b/app/src/main/res/drawable/shape_border_radius_8.xml new file mode 100644 index 00000000..a15ba5c8 --- /dev/null +++ b/app/src/main/res/drawable/shape_border_radius_8.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_goal_detail.xml b/app/src/main/res/layout/activity_goal_detail.xml new file mode 100644 index 00000000..7c3f8a62 --- /dev/null +++ b/app/src/main/res/layout/activity_goal_detail.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_goal_sticker.xml b/app/src/main/res/layout/item_goal_sticker.xml new file mode 100644 index 00000000..dd457749 --- /dev/null +++ b/app/src/main/res/layout/item_goal_sticker.xml @@ -0,0 +1,24 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 00000000..cb0285a5 --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,4 @@ + + 16dp + 20dp + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 94ddbc75..8d42c22d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,4 +1,7 @@ KeepGoEat upload + + 덜 먹기 + 더 먹기 \ No newline at end of file From 25163018ef45e010c2c776a8391c9c176735ec78 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sun, 1 Jan 2023 14:53:53 +0900 Subject: [PATCH 003/745] =?UTF-8?q?[add]=20#6=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=EB=B7=B0=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EB=A6=AC=EC=86=8C=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/ic_back.xml | 9 +++++++++ app/src/main/res/drawable/ic_edit.xml | 12 ++++++++++++ app/src/main/res/drawable/ic_storage.xml | 12 ++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 app/src/main/res/drawable/ic_back.xml create mode 100644 app/src/main/res/drawable/ic_edit.xml create mode 100644 app/src/main/res/drawable/ic_storage.xml diff --git a/app/src/main/res/drawable/ic_back.xml b/app/src/main/res/drawable/ic_back.xml new file mode 100644 index 00000000..37787112 --- /dev/null +++ b/app/src/main/res/drawable/ic_back.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_edit.xml b/app/src/main/res/drawable/ic_edit.xml new file mode 100644 index 00000000..9d80cdab --- /dev/null +++ b/app/src/main/res/drawable/ic_edit.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_storage.xml b/app/src/main/res/drawable/ic_storage.xml new file mode 100644 index 00000000..91206a81 --- /dev/null +++ b/app/src/main/res/drawable/ic_storage.xml @@ -0,0 +1,12 @@ + + + + From f5328d8794cd5fec7b067304cef14a486677a048 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sun, 1 Jan 2023 16:34:09 +0900 Subject: [PATCH 004/745] =?UTF-8?q?[feat]=20#6=20eatingType=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20=ED=83=9C=EA=B7=B8=20=EB=B7=B0=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalDetailActivity.kt | 5 +- .../detail/GoalDetailViewModel.kt | 7 +++ .../keepgoeat/presentation/type/EatingType.kt | 10 +++ .../res/drawable/ic_eating_less_tag_minus.xml | 10 +++ .../res/drawable/ic_eating_more_tag_plus.xml | 10 +++ .../res/drawable/shape_border_radius_4.xml | 4 ++ .../main/res/layout/activity_goal_detail.xml | 63 ++++++++++++++++++- app/src/main/res/layout/item_goal_sticker.xml | 2 +- app/src/main/res/layout/view_eating_tag.xml | 48 ++++++++++++++ app/src/main/res/values/dimens.xml | 5 ++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/themes.xml | 2 + 12 files changed, 164 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/drawable/ic_eating_less_tag_minus.xml create mode 100644 app/src/main/res/drawable/ic_eating_more_tag_plus.xml create mode 100644 app/src/main/res/drawable/shape_border_radius_4.xml create mode 100644 app/src/main/res/layout/view_eating_tag.xml diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index d46b169d..829df67d 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -19,7 +19,10 @@ class GoalDetailActivity : BindingActivity(R.layout.a override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.viewModel = viewModel - adapter = GoalStickerListAdapter(EatingType.MORE, CELL_COUNT) + + val eatingType = EatingType.MORE // TODO intent로 argument 전달받기 + viewModel.setEatingType(eatingType) + adapter = GoalStickerListAdapter(eatingType, CELL_COUNT) initLayout() addObservers() diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt index 22dab423..4406e15c 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt @@ -5,12 +5,15 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import dagger.hilt.android.lifecycle.HiltViewModel import org.keepgoeat.domain.model.GoalSticker +import org.keepgoeat.presentation.type.EatingType import javax.inject.Inject @HiltViewModel class GoalDetailViewModel @Inject constructor() : ViewModel() { private val _goalStickers = MutableLiveData>() val goalStickers: LiveData> get() = _goalStickers + private var _eatingType = MutableLiveData() + val eatingType: LiveData get() = _eatingType init { fetchGoalDetailInfo() @@ -24,6 +27,10 @@ class GoalDetailViewModel @Inject constructor() : ViewModel() { }.toList() } + fun setEatingType(eatingType: EatingType) { + _eatingType.value = eatingType + } + companion object { const val CELL_COUNT = 35 } diff --git a/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt b/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt index 5dfbe628..582ccef2 100644 --- a/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt +++ b/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt @@ -2,6 +2,7 @@ package org.keepgoeat.presentation.type import android.graphics.Color import androidx.annotation.ColorInt +import androidx.annotation.ColorRes import androidx.annotation.DrawableRes import androidx.annotation.StringRes import org.keepgoeat.R @@ -10,18 +11,27 @@ enum class EatingType( @StringRes val strRes: Int, @DrawableRes val snailStickerRes: Int, @DrawableRes val defaultStickerRes: Int, + @DrawableRes val tagIconRes: Int, + @ColorRes val tagTextColor: Int, + @ColorRes val tagBackgroundColor: Int, @ColorInt val cardBackgroundColor: Int, ) { LESS( R.string.eating_type_less, R.drawable.ic_snail_green_sticker, R.drawable.ic_default_green_sticker, + R.drawable.ic_eating_less_tag_minus, + R.color.green_600, + R.color.green_200, Color.parseColor("#EAFBF4"), ), MORE( R.string.eating_type_more, R.drawable.ic_snail_orange_sticker, R.drawable.ic_default_orange_sticker, + R.drawable.ic_eating_more_tag_plus, + R.color.orange_600, + R.color.orange_100, Color.parseColor("#FFF0EB"), ) } diff --git a/app/src/main/res/drawable/ic_eating_less_tag_minus.xml b/app/src/main/res/drawable/ic_eating_less_tag_minus.xml new file mode 100644 index 00000000..cba7d1b2 --- /dev/null +++ b/app/src/main/res/drawable/ic_eating_less_tag_minus.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_eating_more_tag_plus.xml b/app/src/main/res/drawable/ic_eating_more_tag_plus.xml new file mode 100644 index 00000000..c06dc4b4 --- /dev/null +++ b/app/src/main/res/drawable/ic_eating_more_tag_plus.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/shape_border_radius_4.xml b/app/src/main/res/drawable/shape_border_radius_4.xml new file mode 100644 index 00000000..c0f94629 --- /dev/null +++ b/app/src/main/res/drawable/shape_border_radius_4.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_goal_detail.xml b/app/src/main/res/layout/activity_goal_detail.xml index 7c3f8a62..77faecbe 100644 --- a/app/src/main/res/layout/activity_goal_detail.xml +++ b/app/src/main/res/layout/activity_goal_detail.xml @@ -1,6 +1,7 @@ @@ -15,6 +16,56 @@ android:layout_height="match_parent" tools:context=".presentation.detail.GoalDetailActivity"> + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_goal_sticker.xml b/app/src/main/res/layout/item_goal_sticker.xml index dd457749..eeb1c7ef 100644 --- a/app/src/main/res/layout/item_goal_sticker.xml +++ b/app/src/main/res/layout/item_goal_sticker.xml @@ -8,7 +8,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="2dp" - tools:background="@color/orange_200"> + tools:background="@color/orange_50"> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index cb0285a5..2c1a7554 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,4 +1,9 @@ + 4dp + 8dp + 16dp + 20dp + 24dp \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8d42c22d..6b5f42fb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4,4 +4,5 @@ 덜 먹기 더 먹기 + 나의 목표 \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index c989bc2d..58371b29 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -13,6 +13,8 @@ @color/white true + + false From 7a63f3c6d2d66c07d84c1c1b6a68ebbe95d9703b Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sun, 1 Jan 2023 18:33:18 +0900 Subject: [PATCH 005/745] =?UTF-8?q?[feat]=20#6=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=EB=B7=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalDetailActivity.kt | 7 +- .../detail/GoalDetailViewModel.kt | 19 +++- .../keepgoeat/presentation/type/EatingType.kt | 3 + .../drawable/shape_border_gray_radius_8.xml | 7 ++ .../main/res/layout/activity_goal_detail.xml | 92 ++++++++++++++++++- app/src/main/res/values/dimens.xml | 2 + app/src/main/res/values/strings.xml | 3 + 7 files changed, 127 insertions(+), 6 deletions(-) create mode 100644 app/src/main/res/drawable/shape_border_gray_radius_8.xml diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 829df67d..f55ae49d 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -19,12 +19,15 @@ class GoalDetailActivity : BindingActivity(R.layout.a override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.viewModel = viewModel + binding.lifecycleOwner = this val eatingType = EatingType.MORE // TODO intent로 argument 전달받기 viewModel.setEatingType(eatingType) + viewModel.fetchGoalDetailInfo() adapter = GoalStickerListAdapter(eatingType, CELL_COUNT) initLayout() + addListeners() addObservers() } @@ -36,7 +39,9 @@ class GoalDetailActivity : BindingActivity(R.layout.a } private fun addListeners() { - TODO("Not yet implemented") + binding.ivBack.setOnClickListener { + finish() + } } private fun addObservers() { diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt index 4406e15c..d0bd70b2 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt @@ -12,19 +12,30 @@ import javax.inject.Inject class GoalDetailViewModel @Inject constructor() : ViewModel() { private val _goalStickers = MutableLiveData>() val goalStickers: LiveData> get() = _goalStickers + private val _goalTitle = MutableLiveData() + val goalTitle: LiveData get() = _goalTitle + private val _numOfDaysEatenLastMonth = MutableLiveData() + val numOfDaysEatenLastMonth: LiveData get() = _numOfDaysEatenLastMonth + private val _numOfDaysEatenThisMonth = MutableLiveData() + val numOfDaysEatenThisMonth: LiveData get() = _numOfDaysEatenThisMonth private var _eatingType = MutableLiveData() val eatingType: LiveData get() = _eatingType - init { - fetchGoalDetailInfo() - } + // TODO api 연동 후 해당 주석 제거 예정 +// init { +// fetchGoalDetailInfo() +// } - private fun fetchGoalDetailInfo() { + fun fetchGoalDetailInfo() { // TODO api 연동 후 remote에서 데이터 불러오기 val totalAchievementDays = 8 _goalStickers.value = Array(CELL_COUNT) { idx -> GoalSticker(idx, idx < totalAchievementDays) }.toList() + + _goalTitle.value = if (eatingType.value == EatingType.MORE) "하루 1끼 이상 야채" else "라면" + _numOfDaysEatenLastMonth.value = 4 + _numOfDaysEatenThisMonth.value = 8 } fun setEatingType(eatingType: EatingType) { diff --git a/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt b/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt index 582ccef2..95b682b3 100644 --- a/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt +++ b/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt @@ -14,6 +14,7 @@ enum class EatingType( @DrawableRes val tagIconRes: Int, @ColorRes val tagTextColor: Int, @ColorRes val tagBackgroundColor: Int, + @ColorRes val thisMonthTextColor: Int, @ColorInt val cardBackgroundColor: Int, ) { LESS( @@ -23,6 +24,7 @@ enum class EatingType( R.drawable.ic_eating_less_tag_minus, R.color.green_600, R.color.green_200, + R.color.green_700, Color.parseColor("#EAFBF4"), ), MORE( @@ -32,6 +34,7 @@ enum class EatingType( R.drawable.ic_eating_more_tag_plus, R.color.orange_600, R.color.orange_100, + R.color.orange_600, Color.parseColor("#FFF0EB"), ) } diff --git a/app/src/main/res/drawable/shape_border_gray_radius_8.xml b/app/src/main/res/drawable/shape_border_gray_radius_8.xml new file mode 100644 index 00000000..647973be --- /dev/null +++ b/app/src/main/res/drawable/shape_border_gray_radius_8.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_goal_detail.xml b/app/src/main/res/layout/activity_goal_detail.xml index 77faecbe..945a0c27 100644 --- a/app/src/main/res/layout/activity_goal_detail.xml +++ b/app/src/main/res/layout/activity_goal_detail.xml @@ -90,6 +90,96 @@ app:layout_constraintTop_toBottomOf="@id/layout_toolbar" bind:eatingType="@{viewModel.eatingType}" /> + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 2c1a7554..09e602dd 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,8 +2,10 @@ 4dp 8dp + 12dp 16dp 20dp 24dp + 36dp \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6b5f42fb..f7054c7f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,4 +5,7 @@ 덜 먹기 더 먹기 나의 목표 + %s %s + 지난달 먹은 날 + 이번달 먹은 날 \ No newline at end of file From 12e45d4d11ac94a806f66fd42789965dc7dbc0e1 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sun, 1 Jan 2023 18:54:51 +0900 Subject: [PATCH 006/745] =?UTF-8?q?[feat]=20#6=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=EB=B7=B0=20=EC=9E=84=EC=8B=9C=EB=A1=9C=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=A0=84=ED=99=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 15 ++++-- .../presentation/detail/GoalDetailActivity.kt | 11 +++-- .../detail/GoalDetailTestActivity.kt | 37 ++++++++++++++ .../res/layout/activity_goal_detail_test.xml | 48 +++++++++++++++++++ 4 files changed, 105 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailTestActivity.kt create mode 100644 app/src/main/res/layout/activity_goal_detail_test.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dcd7f02a..c6416212 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,15 +19,24 @@ + + + + + + + + - \ No newline at end of file diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index f55ae49d..eedc0166 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -10,6 +10,7 @@ import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.presentation.type.RecyclerLayoutType import org.keepgoeat.util.ItemDecorationUtil import org.keepgoeat.util.binding.BindingActivity +import org.keepgoeat.util.safeValueOf @AndroidEntryPoint class GoalDetailActivity : BindingActivity(R.layout.activity_goal_detail) { @@ -21,10 +22,13 @@ class GoalDetailActivity : BindingActivity(R.layout.a binding.viewModel = viewModel binding.lifecycleOwner = this - val eatingType = EatingType.MORE // TODO intent로 argument 전달받기 - viewModel.setEatingType(eatingType) + intent.getStringExtra(ARG_EATING_TYPE)?.let { strExtra -> + val eatingType = safeValueOf(strExtra) ?: return@let + viewModel.setEatingType(eatingType) + adapter = GoalStickerListAdapter(eatingType, CELL_COUNT) + } + viewModel.fetchGoalDetailInfo() - adapter = GoalStickerListAdapter(eatingType, CELL_COUNT) initLayout() addListeners() @@ -54,5 +58,6 @@ class GoalDetailActivity : BindingActivity(R.layout.a private const val CARD_ITEM_SPACE = 2 private const val CARD_MATRIX_ROW = 5 private const val CARD_MATRIX_COL = 7 + const val ARG_EATING_TYPE = "eatingType" } } diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailTestActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailTestActivity.kt new file mode 100644 index 00000000..3ef2c415 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailTestActivity.kt @@ -0,0 +1,37 @@ +package org.keepgoeat.presentation.detail + +import android.content.Intent +import android.os.Bundle +import dagger.hilt.android.AndroidEntryPoint +import org.keepgoeat.R +import org.keepgoeat.databinding.ActivityGoalDetailTestBinding +import org.keepgoeat.presentation.detail.GoalDetailActivity.Companion.ARG_EATING_TYPE +import org.keepgoeat.presentation.type.EatingType +import org.keepgoeat.util.binding.BindingActivity + +// TODO 더먹기 및 덜먹기 카드 상세뷰 확인을 위한 테스트 액티비티로, 뷰 구현 마칠 때 해당 파일 삭제 예정 +@AndroidEntryPoint +class GoalDetailTestActivity : BindingActivity(R.layout.activity_goal_detail_test) { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + addListeners() + } + + private fun addListeners() { + binding.viewEatingLessTag.root.setOnClickListener { + moveToGoalDetail(EatingType.LESS) + } + binding.viewEatingMoreTag.root.setOnClickListener { + moveToGoalDetail(EatingType.MORE) + } + } + + private fun moveToGoalDetail(eatingType: EatingType) { + Intent(this, GoalDetailActivity::class.java).apply { + putExtra(ARG_EATING_TYPE, eatingType.name) + }.also { + startActivity(it) + } + } +} diff --git a/app/src/main/res/layout/activity_goal_detail_test.xml b/app/src/main/res/layout/activity_goal_detail_test.xml new file mode 100644 index 00000000..ac52bcb6 --- /dev/null +++ b/app/src/main/res/layout/activity_goal_detail_test.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file From e7dfeef13d3ad839d7a756f348a3e71a4bdefc5c Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sun, 1 Jan 2023 18:55:17 +0900 Subject: [PATCH 007/745] =?UTF-8?q?[refactor]=20#6=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A0=AC=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/values/themes.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 58371b29..43a6cdbc 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -22,22 +22,27 @@ 24dp @font/pretendard_r + + + + + + + + + + + + @@ -79,6 +80,22 @@ + + + + + + + + + + \ No newline at end of file From e66722a903b7f2c668a8b26515d45176f1ca7a9b Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sat, 7 Jan 2023 14:37:06 +0900 Subject: [PATCH 139/745] =?UTF-8?q?[mod]=20#43=20=ED=99=88=20=EB=B7=B0=20b?= =?UTF-8?q?ackground=20scalType=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/item_home_header.xml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/item_home_header.xml b/app/src/main/res/layout/item_home_header.xml index 3cbf68f6..cce95f30 100644 --- a/app/src/main/res/layout/item_home_header.xml +++ b/app/src/main/res/layout/item_home_header.xml @@ -7,10 +7,12 @@ android:layout_height="wrap_content" android:background="@color/gray_700"> - From 8120fc8622ff90a7c84cfd14aab9509ac095aa45 Mon Sep 17 00:00:00 2001 From: Daeun Date: Sat, 7 Jan 2023 14:37:55 +0900 Subject: [PATCH 140/745] =?UTF-8?q?[chore]=20#32=20=EC=83=81=EC=88=98?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/sign/SignSharedPreferences.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignSharedPreferences.kt b/app/src/main/java/org/keepgoeat/presentation/sign/SignSharedPreferences.kt index 43c097d6..6405a33e 100644 --- a/app/src/main/java/org/keepgoeat/presentation/sign/SignSharedPreferences.kt +++ b/app/src/main/java/org/keepgoeat/presentation/sign/SignSharedPreferences.kt @@ -26,17 +26,19 @@ class SignSharedPreferences @Inject constructor(@ApplicationContext context: Con ) var accestToken: String - set(value) = dataStore.edit { putString("ACCESS_TOKEN", value) } + set(value) = dataStore.edit { putString(ACCESS_TOKEN, value) } get() = dataStore.getString( - "ACCESS_TOKEN", + ACCESS_TOKEN, "" ) ?: "" var isLogin: Boolean - set(value) = dataStore.edit { putBoolean("IS_LOGIN", value) } - get() = dataStore.getBoolean("IS_LOGIN", false) + set(value) = dataStore.edit { putBoolean(IS_LOGIN, value) } + get() = dataStore.getBoolean(IS_LOGIN, false) companion object { const val FILE_NAME = "SignSharedPreferences" + const val ACCESS_TOKEN = "AccessToken" + const val IS_LOGIN = "IsLogin" } } From 41d586fdf3bb79d36c6106fc3b9d0d2977140fc5 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sat, 7 Jan 2023 14:49:32 +0900 Subject: [PATCH 141/745] =?UTF-8?q?[chore]=20#43=20=EB=B0=B0=EA=B2=BD=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=ED=8C=8C=EC=9D=BC=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ground_1.png => img_home_background_evening.png} | Bin ...ground_0.png => img_home_background_morning.png} | Bin ...ckground_2.png => img_home_background_night.png} | Bin ...ground_1.png => img_home_background_evening.png} | Bin ...ground_0.png => img_home_background_morning.png} | Bin ...ckground_2.png => img_home_background_night.png} | Bin ...ground_1.png => img_home_background_evening.png} | Bin ...ground_0.png => img_home_background_morning.png} | Bin ...ckground_2.png => img_home_background_night.png} | Bin ...ground_1.png => img_home_background_evening.png} | Bin ...ground_0.png => img_home_background_morning.png} | Bin ...ckground_2.png => img_home_background_night.png} | Bin ...ground_1.png => img_home_background_evening.png} | Bin ...ground_0.png => img_home_background_morning.png} | Bin ...ckground_2.png => img_home_background_night.png} | Bin app/src/main/res/layout/item_home_header.xml | 2 +- 16 files changed, 1 insertion(+), 1 deletion(-) rename app/src/main/res/drawable-hdpi/{img_home_background_1.png => img_home_background_evening.png} (100%) rename app/src/main/res/drawable-hdpi/{img_home_background_0.png => img_home_background_morning.png} (100%) rename app/src/main/res/drawable-hdpi/{img_home_background_2.png => img_home_background_night.png} (100%) rename app/src/main/res/drawable-mdpi/{img_home_background_1.png => img_home_background_evening.png} (100%) rename app/src/main/res/drawable-mdpi/{img_home_background_0.png => img_home_background_morning.png} (100%) rename app/src/main/res/drawable-mdpi/{img_home_background_2.png => img_home_background_night.png} (100%) rename app/src/main/res/drawable-xhdpi/{img_home_background_1.png => img_home_background_evening.png} (100%) rename app/src/main/res/drawable-xhdpi/{img_home_background_0.png => img_home_background_morning.png} (100%) rename app/src/main/res/drawable-xhdpi/{img_home_background_2.png => img_home_background_night.png} (100%) rename app/src/main/res/drawable-xxhdpi/{img_home_background_1.png => img_home_background_evening.png} (100%) rename app/src/main/res/drawable-xxhdpi/{img_home_background_0.png => img_home_background_morning.png} (100%) rename app/src/main/res/drawable-xxhdpi/{img_home_background_2.png => img_home_background_night.png} (100%) rename app/src/main/res/drawable-xxxhdpi/{img_home_background_1.png => img_home_background_evening.png} (100%) rename app/src/main/res/drawable-xxxhdpi/{img_home_background_0.png => img_home_background_morning.png} (100%) rename app/src/main/res/drawable-xxxhdpi/{img_home_background_2.png => img_home_background_night.png} (100%) diff --git a/app/src/main/res/drawable-hdpi/img_home_background_1.png b/app/src/main/res/drawable-hdpi/img_home_background_evening.png similarity index 100% rename from app/src/main/res/drawable-hdpi/img_home_background_1.png rename to app/src/main/res/drawable-hdpi/img_home_background_evening.png diff --git a/app/src/main/res/drawable-hdpi/img_home_background_0.png b/app/src/main/res/drawable-hdpi/img_home_background_morning.png similarity index 100% rename from app/src/main/res/drawable-hdpi/img_home_background_0.png rename to app/src/main/res/drawable-hdpi/img_home_background_morning.png diff --git a/app/src/main/res/drawable-hdpi/img_home_background_2.png b/app/src/main/res/drawable-hdpi/img_home_background_night.png similarity index 100% rename from app/src/main/res/drawable-hdpi/img_home_background_2.png rename to app/src/main/res/drawable-hdpi/img_home_background_night.png diff --git a/app/src/main/res/drawable-mdpi/img_home_background_1.png b/app/src/main/res/drawable-mdpi/img_home_background_evening.png similarity index 100% rename from app/src/main/res/drawable-mdpi/img_home_background_1.png rename to app/src/main/res/drawable-mdpi/img_home_background_evening.png diff --git a/app/src/main/res/drawable-mdpi/img_home_background_0.png b/app/src/main/res/drawable-mdpi/img_home_background_morning.png similarity index 100% rename from app/src/main/res/drawable-mdpi/img_home_background_0.png rename to app/src/main/res/drawable-mdpi/img_home_background_morning.png diff --git a/app/src/main/res/drawable-mdpi/img_home_background_2.png b/app/src/main/res/drawable-mdpi/img_home_background_night.png similarity index 100% rename from app/src/main/res/drawable-mdpi/img_home_background_2.png rename to app/src/main/res/drawable-mdpi/img_home_background_night.png diff --git a/app/src/main/res/drawable-xhdpi/img_home_background_1.png b/app/src/main/res/drawable-xhdpi/img_home_background_evening.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/img_home_background_1.png rename to app/src/main/res/drawable-xhdpi/img_home_background_evening.png diff --git a/app/src/main/res/drawable-xhdpi/img_home_background_0.png b/app/src/main/res/drawable-xhdpi/img_home_background_morning.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/img_home_background_0.png rename to app/src/main/res/drawable-xhdpi/img_home_background_morning.png diff --git a/app/src/main/res/drawable-xhdpi/img_home_background_2.png b/app/src/main/res/drawable-xhdpi/img_home_background_night.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/img_home_background_2.png rename to app/src/main/res/drawable-xhdpi/img_home_background_night.png diff --git a/app/src/main/res/drawable-xxhdpi/img_home_background_1.png b/app/src/main/res/drawable-xxhdpi/img_home_background_evening.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/img_home_background_1.png rename to app/src/main/res/drawable-xxhdpi/img_home_background_evening.png diff --git a/app/src/main/res/drawable-xxhdpi/img_home_background_0.png b/app/src/main/res/drawable-xxhdpi/img_home_background_morning.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/img_home_background_0.png rename to app/src/main/res/drawable-xxhdpi/img_home_background_morning.png diff --git a/app/src/main/res/drawable-xxhdpi/img_home_background_2.png b/app/src/main/res/drawable-xxhdpi/img_home_background_night.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/img_home_background_2.png rename to app/src/main/res/drawable-xxhdpi/img_home_background_night.png diff --git a/app/src/main/res/drawable-xxxhdpi/img_home_background_1.png b/app/src/main/res/drawable-xxxhdpi/img_home_background_evening.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/img_home_background_1.png rename to app/src/main/res/drawable-xxxhdpi/img_home_background_evening.png diff --git a/app/src/main/res/drawable-xxxhdpi/img_home_background_0.png b/app/src/main/res/drawable-xxxhdpi/img_home_background_morning.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/img_home_background_0.png rename to app/src/main/res/drawable-xxxhdpi/img_home_background_morning.png diff --git a/app/src/main/res/drawable-xxxhdpi/img_home_background_2.png b/app/src/main/res/drawable-xxxhdpi/img_home_background_night.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/img_home_background_2.png rename to app/src/main/res/drawable-xxxhdpi/img_home_background_night.png diff --git a/app/src/main/res/layout/item_home_header.xml b/app/src/main/res/layout/item_home_header.xml index cce95f30..db3d5d2c 100644 --- a/app/src/main/res/layout/item_home_header.xml +++ b/app/src/main/res/layout/item_home_header.xml @@ -12,7 +12,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="fitXY" - android:src="@drawable/img_home_background_0" + android:src="@drawable/img_home_background_morning" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> From 38a45bb6ba8222f648473bac01048b14db5b2ae7 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sat, 7 Jan 2023 14:46:25 +0900 Subject: [PATCH 142/745] =?UTF-8?q?[fix]=20#47=20=EB=A6=B0=ED=8A=B8=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/util/BindingAdatper.kt | 16 ++++++++++++---- .../java/org/keepgoeat/util/extension/IntExt.kt | 2 ++ app/src/main/res/values/strings.xml | 15 ++++++++------- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/util/BindingAdatper.kt b/app/src/main/java/org/keepgoeat/util/BindingAdatper.kt index 6d90a21a..98c72571 100644 --- a/app/src/main/java/org/keepgoeat/util/BindingAdatper.kt +++ b/app/src/main/java/org/keepgoeat/util/BindingAdatper.kt @@ -6,6 +6,8 @@ import android.widget.TextView import androidx.core.view.isVisible import androidx.databinding.BindingAdapter import coil.load +import org.keepgoeat.R +import org.keepgoeat.util.extension.padZero import java.time.LocalDate @BindingAdapter("image") @@ -21,9 +23,15 @@ fun View.setVisibility(isVisible: Boolean?) { @BindingAdapter(value = ["startDate", "endDate"], requireAll = false) fun TextView.setDuration(startDate: LocalDate?, endDate: LocalDate?) { - safeLet(startDate, endDate) { start, end -> - text = "${start.year}. ${ - start.monthValue.toString().padStart(2, '0') - }. ${start.dayOfMonth} ~ ${end.year}. " + "${end.monthValue.toString().padStart(2, '0')}. ${end.dayOfMonth}" + safeLet(startDate, endDate) { s, e -> + text = String.format( + context.getString(R.string.my_goal_duration_format), + s.year, + s.monthValue.padZero(2), + s.dayOfMonth.padZero(2), + e.year, + e.monthValue.padZero(2), + e.dayOfMonth.padZero(2) + ) } } diff --git a/app/src/main/java/org/keepgoeat/util/extension/IntExt.kt b/app/src/main/java/org/keepgoeat/util/extension/IntExt.kt index 7c2e4363..67289c7d 100644 --- a/app/src/main/java/org/keepgoeat/util/extension/IntExt.kt +++ b/app/src/main/java/org/keepgoeat/util/extension/IntExt.kt @@ -5,3 +5,5 @@ import kotlin.math.roundToInt val Int.dp: Int get() = (this * Resources.getSystem().displayMetrics.density).roundToInt() + +fun Int.padZero(length: Int) = toString().padStart(length, '0') diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 98c59842..7c21e742 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,6 +2,12 @@ KeepGoEat upload + + 킵고잇 + 완료 + 덜 먹기 + 더 먹기 + 8023bf5dba44e18383b689f7efcad88c kakao8023bf5dba44e18383b689f7efcad88c @@ -9,12 +15,6 @@ 식습관 관리, 같이 천천히 시작해볼까요?\n먹는 재미는 언제나 소중하니까! - 킵고잇 - - 완료 - 덜 먹기 - 더 먹기 - 나의 목표 %s %s @@ -46,6 +46,7 @@ 건강한 음식을 더 먹어볼까? 안 좋은 식습관을 줄여가보자! + 목표 달성이 끝났나요?\n달성 완료된 목표는 보관해서 모아볼 수 있어요. 잘못된 목표인가요? 삭제하기 @@ -78,5 +79,5 @@ 보관한 목표 총 달성일 진행기간 - + %s. %s. %s ~ %s. %s. %s \ No newline at end of file From e1413d6fdc86e646103a9940931ffc9c61fe8be1 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sat, 7 Jan 2023 14:50:07 +0900 Subject: [PATCH 143/745] =?UTF-8?q?[add]=20#43=20=EB=B0=B0=EA=B2=BD=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20Type=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/type/HomeBackgroundType.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 app/src/main/java/org/keepgoeat/presentation/type/HomeBackgroundType.kt diff --git a/app/src/main/java/org/keepgoeat/presentation/type/HomeBackgroundType.kt b/app/src/main/java/org/keepgoeat/presentation/type/HomeBackgroundType.kt new file mode 100644 index 00000000..3db90692 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/type/HomeBackgroundType.kt @@ -0,0 +1,12 @@ +package org.keepgoeat.presentation.type + +import androidx.annotation.DrawableRes +import org.keepgoeat.R + +enum class HomeBackgroundType( + @DrawableRes val sky : Int +) { + MORNING(R.drawable.img_home_background_morning), + EVENING(R.drawable.img_home_background_evening), + NIGHT(R.drawable.img_home_background_night) +} \ No newline at end of file From 21715f9246b0e27e5a06b7490f6535e211fc0726 Mon Sep 17 00:00:00 2001 From: Daeun Date: Sat, 7 Jan 2023 14:57:29 +0900 Subject: [PATCH 144/745] =?UTF-8?q?[fix]=20#32=20conflict=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 --- app/src/main/AndroidManifest.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dd083800..912fc09e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,7 +17,7 @@ android:usesCleartextTraffic="true" tools:targetApi="31"> @@ -78,8 +78,8 @@ android:scheme="@string/kakao_app_key2" /> From b387df47026f2e4dc731bdfd65ca500dcdd7f4a8 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sat, 7 Jan 2023 15:01:25 +0900 Subject: [PATCH 145/745] =?UTF-8?q?[feat]=20#43=20local=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=EC=9C=BC=EB=A1=9C=20=EB=B0=B0=EA=B2=BD=20=EB=B0=94?= =?UTF-8?q?=EA=BE=B8=EB=8A=94=20=EB=A1=9C=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/presentation/home/HomeMyGoalAdapter.kt | 10 +++++++++- app/src/main/res/layout/item_home_header.xml | 7 ++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt index 95daa723..ae5afbd8 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt @@ -10,10 +10,13 @@ import org.keepgoeat.databinding.ItemAddGoalBinding import org.keepgoeat.databinding.ItemHomeGoalBinding import org.keepgoeat.databinding.ItemHomeHeaderBinding import org.keepgoeat.presentation.type.EatingType +import org.keepgoeat.presentation.type.HomeBackgroundType import org.keepgoeat.presentation.type.HomeBtnType import org.keepgoeat.presentation.type.HomeGoalViewType import org.keepgoeat.util.ItemDiffCallback +import org.keepgoeat.util.setImage import org.keepgoeat.util.setVisibility +import java.time.LocalDateTime class HomeMyGoalAdapter( private val changeBtnColor: (MyGoalInfo) -> Unit, @@ -37,6 +40,11 @@ class HomeMyGoalAdapter( binding.ivMyPage.setOnClickListener { changeActivityToMyPage() } + when (LocalDateTime.now().hour) { + in 7..16 -> binding.ivHomeBackground.setImageResource(HomeBackgroundType.MORNING.sky) + in 18..24, in 0..5 -> binding.ivHomeBackground.setImageResource(HomeBackgroundType.NIGHT.sky) + in 5..7, in 16..18 -> binding.ivHomeBackground.setImageResource(HomeBackgroundType.EVENING.sky) + } } } @@ -101,7 +109,7 @@ class HomeMyGoalAdapter( AddGoalViewHolder(ItemAddGoalBinding.inflate(inflater, parent, false)) } HomeGoalViewType.HOME_HEADER_TYPE.goalType -> { - HomeHeaderHolder(ItemHomeHeaderBinding.inflate(inflater, parent, false)) + HomeMyGoalAdapter.HomeHeaderHolder(ItemHomeHeaderBinding.inflate(inflater, parent, false)) } else -> { throw java.lang.ClassCastException("Unknown ViewType Error") diff --git a/app/src/main/res/layout/item_home_header.xml b/app/src/main/res/layout/item_home_header.xml index db3d5d2c..316ffcfd 100644 --- a/app/src/main/res/layout/item_home_header.xml +++ b/app/src/main/res/layout/item_home_header.xml @@ -1,6 +1,7 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + app:layout_constraintTop_toTopOf="parent" + tools:src="@drawable/img_home_background_night"/> Date: Sat, 7 Jan 2023 15:03:10 +0900 Subject: [PATCH 146/745] =?UTF-8?q?[chore]=20#43=20=ED=99=88=20=EB=B7=B0?= =?UTF-8?q?=20=ED=97=A4=EB=8D=94=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20?= =?UTF-8?q?margin=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/item_home_header.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/item_home_header.xml b/app/src/main/res/layout/item_home_header.xml index 316ffcfd..5c07fdbe 100644 --- a/app/src/main/res/layout/item_home_header.xml +++ b/app/src/main/res/layout/item_home_header.xml @@ -79,7 +79,7 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing16" android:layout_marginTop="20dp" - android:layout_marginBottom="@dimen/spacing24" + android:layout_marginBottom="@dimen/spacing16" android:text="@string/home_today_goal" android:textAppearance="@style/TextAppearance.System2_Bold" app:layout_constraintBottom_toBottomOf="parent" From 80351e96acd841b8c65c46c4fe148ea21d8cfb1c Mon Sep 17 00:00:00 2001 From: Daeun Date: Sat, 7 Jan 2023 15:26:37 +0900 Subject: [PATCH 147/745] =?UTF-8?q?[fix]=20#32=20manifest=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=B0=9C=EC=83=9D=ED=95=9C=20build=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 912fc09e..98e17ee2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -57,25 +57,23 @@ android:name=".presentation.setting.GoalSettingActivity" android:exported="false" android:screenOrientation="portrait" - android:windowSoftInputMode="adjustResize" tools:ignore="LockedOrientationActivity" /> + - - + Date: Sat, 7 Jan 2023 15:40:00 +0900 Subject: [PATCH 148/745] =?UTF-8?q?[chore]=20#43=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9,=20itemAnimator=20=EC=BD=94=EB=93=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/presentation/home/HomeActivity.kt | 8 +++----- .../org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt | 1 - .../org/keepgoeat/presentation/type/HomeBackgroundType.kt | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index a1bf893c..645230ab 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -3,7 +3,6 @@ package org.keepgoeat.presentation.home import android.content.Intent import android.os.Bundle import androidx.activity.viewModels -import androidx.recyclerview.widget.SimpleItemAnimator import org.keepgoeat.R import org.keepgoeat.databinding.ActivityHomeBinding import org.keepgoeat.presentation.detail.GoalDetailActivity @@ -33,11 +32,10 @@ class HomeActivity : BindingActivity(R.layout.activity_home private fun initLayout() { goalAdapter = HomeMyGoalAdapter(::changeGoalItemBtnColor, ::changeActivityToDetail, ::changeActivityToMyPage) - var animator = binding.rvMyGoals.itemAnimator - if (animator is SimpleItemAnimator) { - animator.supportsChangeAnimations = false + binding.rvMyGoals.apply { + itemAnimator = null + adapter = goalAdapter } - binding.rvMyGoals.adapter = goalAdapter } private fun addObservers() { diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt index ae5afbd8..4a21c385 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt @@ -14,7 +14,6 @@ import org.keepgoeat.presentation.type.HomeBackgroundType import org.keepgoeat.presentation.type.HomeBtnType import org.keepgoeat.presentation.type.HomeGoalViewType import org.keepgoeat.util.ItemDiffCallback -import org.keepgoeat.util.setImage import org.keepgoeat.util.setVisibility import java.time.LocalDateTime diff --git a/app/src/main/java/org/keepgoeat/presentation/type/HomeBackgroundType.kt b/app/src/main/java/org/keepgoeat/presentation/type/HomeBackgroundType.kt index 3db90692..e6ebd6fb 100644 --- a/app/src/main/java/org/keepgoeat/presentation/type/HomeBackgroundType.kt +++ b/app/src/main/java/org/keepgoeat/presentation/type/HomeBackgroundType.kt @@ -4,7 +4,7 @@ import androidx.annotation.DrawableRes import org.keepgoeat.R enum class HomeBackgroundType( - @DrawableRes val sky : Int + @DrawableRes val sky: Int ) { MORNING(R.drawable.img_home_background_morning), EVENING(R.drawable.img_home_background_evening), From 3f0c814f5240f4f99594e1ac05039c118cd1e380 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sat, 7 Jan 2023 16:23:54 +0900 Subject: [PATCH 149/745] =?UTF-8?q?[mod]=20#43=20=ED=98=84=EC=9E=AC=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=20bindingAdapter=20=EC=9D=B4=EC=9A=A9?= =?UTF-8?q?=ED=95=B4=EC=84=9C=20=EC=A0=84=EB=8B=AC=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=EC=9C=BC=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 --- .../presentation/home/HomeMyGoalAdapter.kt | 21 +++++++++---------- .../java/org/keepgoeat/util/BindingAdatper.kt | 14 +++++++++++++ app/src/main/res/layout/item_home_header.xml | 2 +- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt index 4a21c385..39236723 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt @@ -10,10 +10,10 @@ import org.keepgoeat.databinding.ItemAddGoalBinding import org.keepgoeat.databinding.ItemHomeGoalBinding import org.keepgoeat.databinding.ItemHomeHeaderBinding import org.keepgoeat.presentation.type.EatingType -import org.keepgoeat.presentation.type.HomeBackgroundType import org.keepgoeat.presentation.type.HomeBtnType import org.keepgoeat.presentation.type.HomeGoalViewType import org.keepgoeat.util.ItemDiffCallback +import org.keepgoeat.util.setBackground import org.keepgoeat.util.setVisibility import java.time.LocalDateTime @@ -34,15 +34,14 @@ class HomeMyGoalAdapter( private val binding: ItemHomeHeaderBinding, ) : RecyclerView.ViewHolder(binding.root) { fun bind(goalCount: Int, changeActivityToMyPage: () -> Unit) { - if (goalCount == 0) - binding.ivHomeSnail.setImageResource(R.drawable.img_snail_orange_hungry) - binding.ivMyPage.setOnClickListener { - changeActivityToMyPage() - } - when (LocalDateTime.now().hour) { - in 7..16 -> binding.ivHomeBackground.setImageResource(HomeBackgroundType.MORNING.sky) - in 18..24, in 0..5 -> binding.ivHomeBackground.setImageResource(HomeBackgroundType.NIGHT.sky) - in 5..7, in 16..18 -> binding.ivHomeBackground.setImageResource(HomeBackgroundType.EVENING.sky) + with(binding) { + if (goalCount == 0) { + ivHomeSnail.setImageResource(R.drawable.img_snail_orange_hungry) + } + ivMyPage.setOnClickListener { + changeActivityToMyPage() + } + ivHomeBackground.setBackground(LocalDateTime.now().hour) } } } @@ -108,7 +107,7 @@ class HomeMyGoalAdapter( AddGoalViewHolder(ItemAddGoalBinding.inflate(inflater, parent, false)) } HomeGoalViewType.HOME_HEADER_TYPE.goalType -> { - HomeMyGoalAdapter.HomeHeaderHolder(ItemHomeHeaderBinding.inflate(inflater, parent, false)) + HomeHeaderHolder(ItemHomeHeaderBinding.inflate(inflater, parent, false)) } else -> { throw java.lang.ClassCastException("Unknown ViewType Error") diff --git a/app/src/main/java/org/keepgoeat/util/BindingAdatper.kt b/app/src/main/java/org/keepgoeat/util/BindingAdatper.kt index 98c72571..912404e0 100644 --- a/app/src/main/java/org/keepgoeat/util/BindingAdatper.kt +++ b/app/src/main/java/org/keepgoeat/util/BindingAdatper.kt @@ -7,6 +7,7 @@ import androidx.core.view.isVisible import androidx.databinding.BindingAdapter import coil.load import org.keepgoeat.R +import org.keepgoeat.presentation.type.HomeBackgroundType import org.keepgoeat.util.extension.padZero import java.time.LocalDate @@ -35,3 +36,16 @@ fun TextView.setDuration(startDate: LocalDate?, endDate: LocalDate?) { ) } } + +@BindingAdapter("homeBackground") +fun ImageView.setBackground(hour: Int) { + val imgRes = when (hour) { + in 7..16 -> HomeBackgroundType.MORNING.sky + in 18..24, in 0..5 -> HomeBackgroundType.NIGHT.sky + in 5..7, in 16..18 -> HomeBackgroundType.EVENING.sky + else -> { + HomeBackgroundType.MORNING.sky + } + } + setBackgroundResource(imgRes) +} diff --git a/app/src/main/res/layout/item_home_header.xml b/app/src/main/res/layout/item_home_header.xml index 5c07fdbe..dd77fd96 100644 --- a/app/src/main/res/layout/item_home_header.xml +++ b/app/src/main/res/layout/item_home_header.xml @@ -16,7 +16,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - tools:src="@drawable/img_home_background_night"/> + tools:src="@drawable/img_home_background_night" /> Date: Sat, 7 Jan 2023 16:26:52 +0900 Subject: [PATCH 150/745] =?UTF-8?q?[chore]=20#43=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/presentation/type/HomeBackgroundType.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/type/HomeBackgroundType.kt b/app/src/main/java/org/keepgoeat/presentation/type/HomeBackgroundType.kt index e6ebd6fb..3e00a75d 100644 --- a/app/src/main/java/org/keepgoeat/presentation/type/HomeBackgroundType.kt +++ b/app/src/main/java/org/keepgoeat/presentation/type/HomeBackgroundType.kt @@ -9,4 +9,4 @@ enum class HomeBackgroundType( MORNING(R.drawable.img_home_background_morning), EVENING(R.drawable.img_home_background_evening), NIGHT(R.drawable.img_home_background_night) -} \ No newline at end of file +} From 4b008326ab3144ae59af0c3b8d58e1462652263b Mon Sep 17 00:00:00 2001 From: Daeun Date: Sat, 7 Jan 2023 19:36:04 +0900 Subject: [PATCH 151/745] =?UTF-8?q?[mod]=20#40=20=EC=8A=A4=ED=94=8C?= =?UTF-8?q?=EB=9E=98=EC=8B=9C=20=EC=95=84=EC=9D=B4=EC=BD=98=20=ED=88=AC?= =?UTF-8?q?=EB=AA=85=ED=99=94=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 6 +++--- .../java/org/keepgoeat/presentation/SplashActivity.kt | 8 +++++--- app/src/main/res/drawable/launch_transparent.xml | 4 ---- app/src/main/res/values/themes.xml | 8 +++++--- 4 files changed, 13 insertions(+), 13 deletions(-) delete mode 100644 app/src/main/res/drawable/launch_transparent.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2a2cd8c9..4cd924ab 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,10 +20,10 @@ android:name=".presentation.SplashActivity" android:exported="true" android:screenOrientation="portrait" + android:theme="@style/Theme.KeepGoEat.Splash" tools:ignore="LockedOrientationActivity"> - @@ -31,7 +31,7 @@ android:name=".presentation.home.HomeActivity" android:exported="true" android:screenOrientation="portrait" - tools:ignore="LockedOrientationActivity"/> + tools:ignore="LockedOrientationActivity" /> @@ -82,6 +82,6 @@ android:name=".presentation.my.MyActivity" android:exported="false" android:screenOrientation="portrait" - tools:ignore="LockedOrientationActivity"/> + tools:ignore="LockedOrientationActivity" /> \ No newline at end of file diff --git a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt index 273c2bfc..d5e3fde4 100644 --- a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt @@ -2,19 +2,21 @@ package org.keepgoeat.presentation import android.content.Intent import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.keepgoeat.R -import org.keepgoeat.databinding.ActivitySplashBinding import org.keepgoeat.presentation.dummy.DummyActivity -import org.keepgoeat.util.binding.BindingActivity @AndroidEntryPoint -class SplashActivity : BindingActivity(R.layout.activity_splash) { +class SplashActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { + installSplashScreen() super.onCreate(savedInstanceState) + setContentView(R.layout.activity_splash) loadSplashScreen() } diff --git a/app/src/main/res/drawable/launch_transparent.xml b/app/src/main/res/drawable/launch_transparent.xml deleted file mode 100644 index eadde48f..00000000 --- a/app/src/main/res/drawable/launch_transparent.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 83292201..8e833921 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,4 +1,4 @@ - + - \ No newline at end of file From 8c8efb3c733081c1b544e5b6b1dcdbc0282b5bb2 Mon Sep 17 00:00:00 2001 From: Daeun Date: Sat, 7 Jan 2023 20:30:36 +0900 Subject: [PATCH 152/745] =?UTF-8?q?[fix]=20#40=20merge=20conflict=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 5 ----- .../main/java/org/keepgoeat/presentation/SplashActivity.kt | 3 --- 2 files changed, 8 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8eb0576a..cf679146 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -80,10 +80,5 @@ android:scheme="@string/kakao_app_key2" /> - \ No newline at end of file diff --git a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt index 645c1741..6b2d494e 100644 --- a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt @@ -9,12 +9,9 @@ import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.keepgoeat.R -import org.keepgoeat.presentation.dummy.DummyActivity -import org.keepgoeat.databinding.ActivitySplashBinding import org.keepgoeat.presentation.onboarding.OnboardingActivity import org.keepgoeat.presentation.sign.SignActivity import org.keepgoeat.presentation.sign.SignSharedPreferences -import org.keepgoeat.util.binding.BindingActivity @AndroidEntryPoint class SplashActivity : AppCompatActivity() { From 2103d965dc29783a745e45982dd48c41024fc47b Mon Sep 17 00:00:00 2001 From: Daeun Date: Sat, 7 Jan 2023 21:12:38 +0900 Subject: [PATCH 153/745] =?UTF-8?q?[mod]=20#53=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EB=B7=B0=20=EB=A7=90=ED=92=8D=EC=84=A0=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/drawable/background_sign_box.xml | 9 ++++ app/src/main/res/layout/activity_sign.xml | 53 +++++++++++-------- 2 files changed, 41 insertions(+), 21 deletions(-) create mode 100644 app/src/main/res/drawable/background_sign_box.xml diff --git a/app/src/main/res/drawable/background_sign_box.xml b/app/src/main/res/drawable/background_sign_box.xml new file mode 100644 index 00000000..32cd0265 --- /dev/null +++ b/app/src/main/res/drawable/background_sign_box.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_sign.xml b/app/src/main/res/layout/activity_sign.xml index 3d6883db..22547b32 100644 --- a/app/src/main/res/layout/activity_sign.xml +++ b/app/src/main/res/layout/activity_sign.xml @@ -13,43 +13,54 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing36" - android:background="@color/gray_100" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - + app:layout_constraintTop_toTopOf="parent"> - + + + + + + app:layout_constraintTop_toBottomOf="@+id/layout_texts"> Date: Sat, 7 Jan 2023 21:49:06 +0900 Subject: [PATCH 154/745] =?UTF-8?q?[mod]=20#56=20header=EC=97=90=EC=84=9C?= =?UTF-8?q?=20home=EC=9C=BC=EB=A1=9C=20xml=20=EC=98=AE=EA=B8=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_home.xml | 93 +++++++++++++++++++- app/src/main/res/layout/item_home_header.xml | 90 ------------------- 2 files changed, 91 insertions(+), 92 deletions(-) delete mode 100644 app/src/main/res/layout/item_home_header.xml diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 12418325..ac43de72 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -15,6 +15,94 @@ android:layout_height="match_parent" tools:context=".presentation.home.HomeActivity"> + + + + + + + + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@+id/layout_home_header" /> - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From b49cf91d14d2a8a2c93ee1902f14e15053a2e041 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sat, 7 Jan 2023 22:01:12 +0900 Subject: [PATCH 155/745] =?UTF-8?q?[mod]=20#56=20adapter=EC=97=90=EC=84=9C?= =?UTF-8?q?=20home=EC=9C=BC=EB=A1=9C=20=EB=A1=9C=EC=A7=81=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/home/HomeActivity.kt | 19 +++++++++++--- .../presentation/home/HomeMyGoalAdapter.kt | 26 +------------------ .../presentation/type/HomeGoalViewType.kt | 3 +-- 3 files changed, 18 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 645230ab..a7c23685 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -9,6 +9,8 @@ import org.keepgoeat.presentation.detail.GoalDetailActivity import org.keepgoeat.presentation.my.MyActivity import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.binding.BindingActivity +import org.keepgoeat.util.setBackground +import java.time.LocalDateTime class HomeActivity : BindingActivity(R.layout.activity_home) { private val viewModel: HomeViewModel by viewModels() @@ -25,23 +27,34 @@ class HomeActivity : BindingActivity(R.layout.activity_home } private fun addListeners() { - binding.btnNoGoal.setOnClickListener { - showMakeGoalDialog() + with(binding) { + btnNoGoal.setOnClickListener { + showMakeGoalDialog() + } + ivMyPage.setOnClickListener { + changeActivityToMyPage() + } } } private fun initLayout() { - goalAdapter = HomeMyGoalAdapter(::changeGoalItemBtnColor, ::changeActivityToDetail, ::changeActivityToMyPage) + goalAdapter = HomeMyGoalAdapter(::changeGoalItemBtnColor, ::changeActivityToDetail) binding.rvMyGoals.apply { itemAnimator = null adapter = goalAdapter } + binding.ivHomeBackground.setBackground(LocalDateTime.now().hour) } private fun addObservers() { viewModel.goalList.observe(this) { goalList -> goalAdapter.submitList(goalList.toMutableList()) } + viewModel.goalCount.observe(this) { goalCount -> + if (goalCount == 0) { + binding.ivHomeSnail.setImageResource(R.drawable.img_snail_orange_hungry) + } + } } private fun showMakeGoalDialog() { diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt index 39236723..99c696e7 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt @@ -8,19 +8,15 @@ import androidx.recyclerview.widget.RecyclerView import org.keepgoeat.R import org.keepgoeat.databinding.ItemAddGoalBinding import org.keepgoeat.databinding.ItemHomeGoalBinding -import org.keepgoeat.databinding.ItemHomeHeaderBinding import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.presentation.type.HomeBtnType import org.keepgoeat.presentation.type.HomeGoalViewType import org.keepgoeat.util.ItemDiffCallback -import org.keepgoeat.util.setBackground import org.keepgoeat.util.setVisibility -import java.time.LocalDateTime class HomeMyGoalAdapter( private val changeBtnColor: (MyGoalInfo) -> Unit, - private val changeActivityToDetail: (EatingType) -> Unit, - private val changeActivityToMyPage: () -> Unit + private val changeActivityToDetail: (EatingType) -> Unit ) : ListAdapter( ItemDiffCallback( onContentsTheSame = { old, new -> old == new }, @@ -30,22 +26,6 @@ class HomeMyGoalAdapter( ) { private lateinit var inflater: LayoutInflater - class HomeHeaderHolder( - private val binding: ItemHomeHeaderBinding, - ) : RecyclerView.ViewHolder(binding.root) { - fun bind(goalCount: Int, changeActivityToMyPage: () -> Unit) { - with(binding) { - if (goalCount == 0) { - ivHomeSnail.setImageResource(R.drawable.img_snail_orange_hungry) - } - ivMyPage.setOnClickListener { - changeActivityToMyPage() - } - ivHomeBackground.setBackground(LocalDateTime.now().hour) - } - } - } - class MyGoalViewHolder( private val binding: ItemHomeGoalBinding ) : RecyclerView.ViewHolder(binding.root) { @@ -106,9 +86,6 @@ class HomeMyGoalAdapter( HomeGoalViewType.ADD_GOAL_TYPE.goalType -> { AddGoalViewHolder(ItemAddGoalBinding.inflate(inflater, parent, false)) } - HomeGoalViewType.HOME_HEADER_TYPE.goalType -> { - HomeHeaderHolder(ItemHomeHeaderBinding.inflate(inflater, parent, false)) - } else -> { throw java.lang.ClassCastException("Unknown ViewType Error") } @@ -126,7 +103,6 @@ class HomeMyGoalAdapter( } // TODO 서버통신 데이터클래스로 변경하면 size 정보 받아온걸로 바꾸기 is AddGoalViewHolder -> holder.bind(currentList.size - 2) - is HomeHeaderHolder -> holder.bind(currentList.size - 2, changeActivityToMyPage) } } diff --git a/app/src/main/java/org/keepgoeat/presentation/type/HomeGoalViewType.kt b/app/src/main/java/org/keepgoeat/presentation/type/HomeGoalViewType.kt index 8aabe03a..dcde8f71 100644 --- a/app/src/main/java/org/keepgoeat/presentation/type/HomeGoalViewType.kt +++ b/app/src/main/java/org/keepgoeat/presentation/type/HomeGoalViewType.kt @@ -4,6 +4,5 @@ enum class HomeGoalViewType( val goalType: Int ) { MY_GOAL_TYPE(0), - ADD_GOAL_TYPE(1), - HOME_HEADER_TYPE(2) + ADD_GOAL_TYPE(1) } From e65b2be41b9b34df636382cd32f6f8aee0323182 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sat, 7 Jan 2023 22:01:38 +0900 Subject: [PATCH 156/745] =?UTF-8?q?[feat]=20#56=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EA=B0=9C=EC=88=98=20LiveData=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/presentation/home/HomeViewModel.kt | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 1e262b0f..9d3282ff 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -8,6 +8,8 @@ import org.keepgoeat.presentation.type.HomeGoalViewType class HomeViewModel : ViewModel() { private val _goalList = MutableLiveData>() val goalList: LiveData> get() = _goalList + private val _goalCount = MutableLiveData() + val goalCount: LiveData get() = _goalCount init { fetchGoalList() @@ -27,15 +29,6 @@ class HomeViewModel : ViewModel() { } private fun fetchGoalList() { - var homeList = mutableListOf( - MyGoalInfo( - "1", - "", - false, - false, - HomeGoalViewType.HOME_HEADER_TYPE - ) - ) var myGoalList = mutableListOf( MyGoalInfo( "하루 1끼 이상 야채 더 먹기", @@ -69,9 +62,11 @@ class HomeViewModel : ViewModel() { HomeGoalViewType.ADD_GOAL_TYPE ) ) + var homeList = mutableListOf() homeList.addAll(myGoalList) if (myGoalList.size > 0) homeList.addAll(addGoalBtn) _goalList.value = homeList.toMutableList() + _goalCount.value = myGoalList.size } } From 84446ca10f36326b9274fc2b3f355be9161f7897 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sat, 7 Jan 2023 22:04:34 +0900 Subject: [PATCH 157/745] =?UTF-8?q?[chore]=20#56=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EA=B0=9C=EC=88=98=EB=A5=BC=20=EC=9D=B8=EC=9E=90=EB=A1=9C=20?= =?UTF-8?q?=EB=84=98=EA=B8=B0=EB=8F=84=EB=A1=9D=20bind=ED=95=A8=EC=88=98?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt index 99c696e7..481f6ce3 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt @@ -102,7 +102,7 @@ class HomeMyGoalAdapter( } } // TODO 서버통신 데이터클래스로 변경하면 size 정보 받아온걸로 바꾸기 - is AddGoalViewHolder -> holder.bind(currentList.size - 2) + is AddGoalViewHolder -> holder.bind(currentList.size - 1) } } From 8cadcd1fb12e75fc2ff69eb2fba6099797cab30a Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sat, 7 Jan 2023 22:12:35 +0900 Subject: [PATCH 158/745] =?UTF-8?q?[feat]=20#50=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EB=8B=A4=EC=9D=B4=EC=96=BC=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../detail/GoalDeleteBottomDialogFragment.kt | 32 +++++++ .../keep/GoalKeepBottomDialogFragment.kt | 9 +- app/src/main/res/drawable/ic_trash.xml | 9 ++ .../res/layout/dialog_bottom_goal_delete.xml | 83 +++++++++++++++++++ app/src/main/res/values/strings.xml | 2 + 5 files changed, 132 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/presentation/detail/GoalDeleteBottomDialogFragment.kt create mode 100644 app/src/main/res/drawable/ic_trash.xml create mode 100644 app/src/main/res/layout/dialog_bottom_goal_delete.xml diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDeleteBottomDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDeleteBottomDialogFragment.kt new file mode 100644 index 00000000..6cbc7be8 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDeleteBottomDialogFragment.kt @@ -0,0 +1,32 @@ +package org.keepgoeat.presentation.detail + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.activityViewModels +import dagger.hilt.android.AndroidEntryPoint +import org.keepgoeat.R +import org.keepgoeat.databinding.DialogBottomGoalDeleteBinding +import org.keepgoeat.util.binding.BindingBottomSheetDialogFragment + +@AndroidEntryPoint +class GoalDeleteBottomDialogFragment : + BindingBottomSheetDialogFragment(R.layout.dialog_bottom_goal_delete) { + private val viewModel: GoalDetailViewModel by activityViewModels() + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.viewModel = viewModel + + addListeners() + } + + private fun addListeners() { + binding.btnNo.setOnClickListener { + dismiss() + } + + binding.btnYes.setOnClickListener { + viewModel.deleteGoal() + } + } +} diff --git a/app/src/main/java/org/keepgoeat/presentation/keep/GoalKeepBottomDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/keep/GoalKeepBottomDialogFragment.kt index 8bb9a6c3..6f1a73df 100644 --- a/app/src/main/java/org/keepgoeat/presentation/keep/GoalKeepBottomDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/keep/GoalKeepBottomDialogFragment.kt @@ -6,6 +6,7 @@ import androidx.fragment.app.activityViewModels import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.DialogBottomGoalKeepBinding +import org.keepgoeat.presentation.detail.GoalDeleteBottomDialogFragment import org.keepgoeat.presentation.detail.GoalDetailViewModel import org.keepgoeat.util.binding.BindingBottomSheetDialogFragment @@ -23,13 +24,15 @@ class GoalKeepBottomDialogFragment : private fun addListeners() { binding.btnKeep.setOnClickListener { - // TODO 화면 전환 처리 구현 viewModel.keepGoal() } binding.tvDelete.setOnClickListener { - // TODO 화면 전환 처리 구현 - viewModel.deleteGoal() + showGoalDeleteDialog() } } + + private fun showGoalDeleteDialog() { + GoalDeleteBottomDialogFragment().show(parentFragmentManager, "goalDeleteDialog") + } } diff --git a/app/src/main/res/drawable/ic_trash.xml b/app/src/main/res/drawable/ic_trash.xml new file mode 100644 index 00000000..ec20c9cb --- /dev/null +++ b/app/src/main/res/drawable/ic_trash.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/dialog_bottom_goal_delete.xml b/app/src/main/res/layout/dialog_bottom_goal_delete.xml new file mode 100644 index 00000000..7f9f992d --- /dev/null +++ b/app/src/main/res/layout/dialog_bottom_goal_delete.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 867f62a4..934ed2c9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,6 +7,7 @@ 완료 덜 먹기 더 먹기 + 아니오 5b258b06c6f8e90a646e2675b2f8e8aa @@ -80,4 +81,5 @@ 총 달성일 진행기간 %s. %s. %s ~ %s. %s. %s + 네, 삭제할래요 \ No newline at end of file From 3b069767f42ddfcea910e0531519bdd6ac6a2054 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sat, 7 Jan 2023 22:14:24 +0900 Subject: [PATCH 159/745] =?UTF-8?q?[chore]=20#50=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/detail/GoalDetailActivity.kt | 1 - .../{keep => detail}/GoalKeepBottomDialogFragment.kt | 2 +- app/src/main/res/layout/dialog_bottom_goal_delete.xml | 2 +- app/src/main/res/layout/dialog_bottom_goal_keep.xml | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) rename app/src/main/java/org/keepgoeat/presentation/{keep => detail}/GoalKeepBottomDialogFragment.kt (96%) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 94b31db0..44c7ef93 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -6,7 +6,6 @@ import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.ActivityGoalDetailBinding import org.keepgoeat.presentation.detail.GoalDetailViewModel.Companion.CELL_COUNT -import org.keepgoeat.presentation.keep.GoalKeepBottomDialogFragment import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.presentation.type.RecyclerLayoutType import org.keepgoeat.util.ItemDecorationUtil diff --git a/app/src/main/java/org/keepgoeat/presentation/keep/GoalKeepBottomDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt similarity index 96% rename from app/src/main/java/org/keepgoeat/presentation/keep/GoalKeepBottomDialogFragment.kt rename to app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt index 6f1a73df..299a55cc 100644 --- a/app/src/main/java/org/keepgoeat/presentation/keep/GoalKeepBottomDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt @@ -1,4 +1,4 @@ -package org.keepgoeat.presentation.keep +package org.keepgoeat.presentation.detail import android.os.Bundle import android.view.View diff --git a/app/src/main/res/layout/dialog_bottom_goal_delete.xml b/app/src/main/res/layout/dialog_bottom_goal_delete.xml index 7f9f992d..93537746 100644 --- a/app/src/main/res/layout/dialog_bottom_goal_delete.xml +++ b/app/src/main/res/layout/dialog_bottom_goal_delete.xml @@ -14,7 +14,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="79dp" - tools:context=".presentation.keep.GoalKeepBottomDialogFragment"> + tools:context=".presentation.detail.GoalKeepBottomDialogFragment"> + tools:context=".presentation.detail.GoalKeepBottomDialogFragment"> Date: Sat, 7 Jan 2023 22:14:38 +0900 Subject: [PATCH 160/745] =?UTF-8?q?[mod]=20#56=20xml=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_home.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index ac43de72..d58abfe4 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -39,7 +39,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing16" - android:layout_marginTop="31dp" + android:layout_marginTop="@dimen/spacing12" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/iv_my_page" app:srcCompat="@drawable/img_snail_orange_cheer" /> @@ -48,7 +48,7 @@ android:id="@+id/iv_my_page" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing12" + android:layout_marginTop="@dimen/spacing8" android:layout_marginEnd="@dimen/spacing16" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -58,7 +58,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing4" - android:layout_marginTop="31dp" + android:layout_marginTop="20dp" android:layout_marginEnd="@dimen/spacing16" android:background="@drawable/background_cheer_msg" app:layout_constraintEnd_toEndOf="parent" @@ -83,7 +83,7 @@ android:id="@+id/layout_home_blank" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="20dp" + android:layout_marginTop="@dimen/spacing8" android:background="@drawable/background_home_bottom" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" From 67b67cbdce5ca011854e8386c3af0ccf68f23b59 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sat, 7 Jan 2023 22:24:10 +0900 Subject: [PATCH 161/745] =?UTF-8?q?[chore]=20#50=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalKeepBottomDialogFragment.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt index 299a55cc..b854cf6c 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt @@ -6,8 +6,6 @@ import androidx.fragment.app.activityViewModels import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.DialogBottomGoalKeepBinding -import org.keepgoeat.presentation.detail.GoalDeleteBottomDialogFragment -import org.keepgoeat.presentation.detail.GoalDetailViewModel import org.keepgoeat.util.binding.BindingBottomSheetDialogFragment @AndroidEntryPoint From 16d81d66b42838170242aa455b920fd9d428f130 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sat, 7 Jan 2023 22:27:57 +0900 Subject: [PATCH 162/745] =?UTF-8?q?[mod]=20#56=20xml=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EB=8B=A4=EC=8B=9C=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_home.xml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index d58abfe4..61260222 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -39,7 +39,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing16" - android:layout_marginTop="@dimen/spacing12" + android:layout_marginTop="32dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/iv_my_page" app:srcCompat="@drawable/img_snail_orange_cheer" /> @@ -58,7 +58,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing4" - android:layout_marginTop="20dp" + android:layout_marginTop="32dp" android:layout_marginEnd="@dimen/spacing16" android:background="@drawable/background_cheer_msg" app:layout_constraintEnd_toEndOf="parent" @@ -83,7 +83,7 @@ android:id="@+id/layout_home_blank" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing8" + android:layout_marginTop="28dp" android:background="@drawable/background_home_bottom" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -103,12 +103,14 @@ app:layout_constraintTop_toTopOf="parent" /> + From 154bf54a93e5439e07d2b77f54ee164e7cc2d56f Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sat, 7 Jan 2023 22:30:46 +0900 Subject: [PATCH 163/745] =?UTF-8?q?[chore]=20#56=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_home.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 61260222..0661aa4f 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -20,9 +20,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/gray_700" - app:layout_constraintTop_toTopOf="parent" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent"> + app:layout_constraintTop_toTopOf="parent"> Date: Sat, 7 Jan 2023 22:41:31 +0900 Subject: [PATCH 164/745] =?UTF-8?q?[feat]=20#58=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=ED=88=B4=EB=B0=94=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 --- app/src/main/res/layout/activity_my.xml | 29 +++++++++++++++++-------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/layout/activity_my.xml b/app/src/main/res/layout/activity_my.xml index 727da707..c3220f3a 100644 --- a/app/src/main/res/layout/activity_my.xml +++ b/app/src/main/res/layout/activity_my.xml @@ -15,15 +15,26 @@ android:layout_height="match_parent" tools:context=".presentation.my.MyActivity"> - + android:background="@color/white" + android:elevation="4dp" + android:paddingHorizontal="@dimen/spacing16" + android:paddingVertical="@dimen/spacing8" + app:layout_constraintTop_toTopOf="parent"> + + + + \ No newline at end of file From 76b7c098d35e4775ed6ac55b15b48150fe26f237 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sat, 7 Jan 2023 23:20:50 +0900 Subject: [PATCH 165/745] =?UTF-8?q?[mod]=20#56=20=EB=AA=A9=ED=91=9C=200?= =?UTF-8?q?=EA=B0=9C=EC=9D=BC=20=EB=95=8C=20layout=5Fno=5Fgoal=20=EB=B3=B4?= =?UTF-8?q?=EC=9D=B4=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 --- app/src/main/res/layout/activity_home.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 0661aa4f..f7b60518 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -125,7 +125,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/layout_home_header" - app:visibility="@{viewModel.goalList.size() == 1}"> + app:visibility="@{viewModel.goalCount == 0}"> Date: Sat, 7 Jan 2023 23:38:14 +0900 Subject: [PATCH 166/745] =?UTF-8?q?[chore]=20#56=20=EC=95=A1=ED=8B=B0?= =?UTF-8?q?=EB=B9=84=ED=8B=B0=20=EC=9D=B4=EB=8F=99=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=EB=AA=85=20=EC=BD=94=EB=94=A9=EC=BB=A8=EB=B2=A4=EC=85=98=20?= =?UTF-8?q?=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 --- .../org/keepgoeat/presentation/home/HomeActivity.kt | 8 ++++---- .../keepgoeat/presentation/home/HomeMyGoalAdapter.kt | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index a7c23685..e28a3f0b 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -32,13 +32,13 @@ class HomeActivity : BindingActivity(R.layout.activity_home showMakeGoalDialog() } ivMyPage.setOnClickListener { - changeActivityToMyPage() + moveToMy() } } } private fun initLayout() { - goalAdapter = HomeMyGoalAdapter(::changeGoalItemBtnColor, ::changeActivityToDetail) + goalAdapter = HomeMyGoalAdapter(::changeGoalItemBtnColor, ::moveToDetail) binding.rvMyGoals.apply { itemAnimator = null adapter = goalAdapter @@ -61,13 +61,13 @@ class HomeActivity : BindingActivity(R.layout.activity_home HomeBottomDialogFragment().show(supportFragmentManager, "homeDialog") } - private fun changeActivityToDetail(eatingType: EatingType) { + private fun moveToDetail(eatingType: EatingType) { val intent = Intent(this@HomeActivity, GoalDetailActivity::class.java) intent.putExtra(GoalDetailActivity.ARG_EATING_TYPE, eatingType.name) startActivity(intent) } - private fun changeActivityToMyPage() { + private fun moveToMy() { val intent = Intent(this@HomeActivity, MyActivity::class.java) startActivity(intent) } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt index 481f6ce3..a5345684 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt @@ -16,7 +16,7 @@ import org.keepgoeat.util.setVisibility class HomeMyGoalAdapter( private val changeBtnColor: (MyGoalInfo) -> Unit, - private val changeActivityToDetail: (EatingType) -> Unit + private val moveToDetail: (EatingType) -> Unit ) : ListAdapter( ItemDiffCallback( onContentsTheSame = { old, new -> old == new }, @@ -30,7 +30,7 @@ class HomeMyGoalAdapter( private val binding: ItemHomeGoalBinding ) : RecyclerView.ViewHolder(binding.root) { var layout = binding - fun bind(myGoal: MyGoalInfo, eatingType: EatingType, changeBtnColor: (MyGoalInfo) -> Unit, changeActivity: (EatingType) -> Unit) { + fun bind(myGoal: MyGoalInfo, eatingType: EatingType, changeBtnColor: (MyGoalInfo) -> Unit, moveToDetail: (EatingType) -> Unit) { val btnType: HomeBtnType = if (eatingType == EatingType.MORE) { // 더 먹기인 경우 if (myGoal.goalAchieved) { HomeBtnType.PLUS_ACHIEVED @@ -53,7 +53,7 @@ class HomeMyGoalAdapter( changeBtnColor(myGoal) } layoutHomeGoal.setOnClickListener { - changeActivity(eatingType) + moveToDetail(eatingType) } } } @@ -96,9 +96,9 @@ class HomeMyGoalAdapter( when (holder) { is MyGoalViewHolder -> { if (currentList[position].moreGoal) { - holder.bind(currentList[position], EatingType.MORE, changeBtnColor, changeActivityToDetail) + holder.bind(currentList[position], EatingType.MORE, changeBtnColor, moveToDetail) } else { - holder.bind(currentList[position], EatingType.LESS, changeBtnColor, changeActivityToDetail) + holder.bind(currentList[position], EatingType.LESS, changeBtnColor, moveToDetail) } } // TODO 서버통신 데이터클래스로 변경하면 size 정보 받아온걸로 바꾸기 From a2c6c8539655bf08875b065b8ccde529dbffa1be Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sat, 7 Jan 2023 23:47:09 +0900 Subject: [PATCH 167/745] =?UTF-8?q?[mod]=20#56=20=ED=99=88=20=EB=B7=B0,=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=20LiveData=EB=A1=9C=20=EC=A0=84=EB=8B=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/presentation/home/HomeActivity.kt | 6 +----- .../java/org/keepgoeat/presentation/home/HomeViewModel.kt | 3 +++ app/src/main/res/layout/activity_home.xml | 1 + 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index e28a3f0b..fc4923e8 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -9,8 +9,6 @@ import org.keepgoeat.presentation.detail.GoalDetailActivity import org.keepgoeat.presentation.my.MyActivity import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.binding.BindingActivity -import org.keepgoeat.util.setBackground -import java.time.LocalDateTime class HomeActivity : BindingActivity(R.layout.activity_home) { private val viewModel: HomeViewModel by viewModels() @@ -43,7 +41,6 @@ class HomeActivity : BindingActivity(R.layout.activity_home itemAnimator = null adapter = goalAdapter } - binding.ivHomeBackground.setBackground(LocalDateTime.now().hour) } private fun addObservers() { @@ -51,9 +48,8 @@ class HomeActivity : BindingActivity(R.layout.activity_home goalAdapter.submitList(goalList.toMutableList()) } viewModel.goalCount.observe(this) { goalCount -> - if (goalCount == 0) { + if (goalCount == 0) binding.ivHomeSnail.setImageResource(R.drawable.img_snail_orange_hungry) - } } } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 9d3282ff..8894a64b 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -4,12 +4,15 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.keepgoeat.presentation.type.HomeGoalViewType +import java.time.LocalDateTime class HomeViewModel : ViewModel() { private val _goalList = MutableLiveData>() val goalList: LiveData> get() = _goalList private val _goalCount = MutableLiveData() val goalCount: LiveData get() = _goalCount + private val _hour = MutableLiveData(LocalDateTime.now().hour) + val hour: LiveData get() = _hour init { fetchGoalList() diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index f7b60518..c7bd17c0 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -29,6 +29,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="fitXY" + app:homeBackground="@{viewModel.hour}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" From 1d1d316fec2dbcf3fa4a6e084747eccbff0234b8 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sun, 8 Jan 2023 10:25:46 +0900 Subject: [PATCH 168/745] =?UTF-8?q?[add]=20#64=20PR=20Builder=EC=97=90=20K?= =?UTF-8?q?GE=5FBASE=5FURL=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr_builder.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/pr_builder.yml b/.github/workflows/pr_builder.yml index 6b446544..11ba7568 100644 --- a/.github/workflows/pr_builder.yml +++ b/.github/workflows/pr_builder.yml @@ -43,6 +43,11 @@ jobs: - name: Touch local properties run: touch local.properties + - name: Access KGE_BASE_URL + env: + HFM_BASE_URL: ${{ secrets.KGE_BASE_URL }} + run: echo "KGE_BASE_URL=\"$KGE_BASE_URL\"" >> local.properties + - name: Lint Check run: ./gradlew ktlintCheck From 4445a765935bf670c81d92eeb28ecc248f8439d6 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sun, 8 Jan 2023 10:30:33 +0900 Subject: [PATCH 169/745] =?UTF-8?q?[add]=20#64=20BuildConfig=EC=97=90=20KG?= =?UTF-8?q?E=5FBASE=5FURL=20=EB=B3=80=EC=88=98=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + app/src/main/java/org/keepgoeat/di/NetworkModule.kt | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 9a893df7..11b763d7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,6 +25,7 @@ android { versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + buildConfigField "String", "KGE_BASE_URL", properties["KGE_BASE_URL"] } buildTypes { diff --git a/app/src/main/java/org/keepgoeat/di/NetworkModule.kt b/app/src/main/java/org/keepgoeat/di/NetworkModule.kt index 823d5dc0..e561382b 100644 --- a/app/src/main/java/org/keepgoeat/di/NetworkModule.kt +++ b/app/src/main/java/org/keepgoeat/di/NetworkModule.kt @@ -10,6 +10,7 @@ import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor +import org.keepgoeat.BuildConfig import org.keepgoeat.BuildConfig.DEBUG import retrofit2.Retrofit import java.util.concurrent.TimeUnit @@ -32,7 +33,7 @@ object NetworkModule { @Provides @Singleton fun provideRetrofit(client: OkHttpClient, json: Json): Retrofit = Retrofit.Builder() - .baseUrl("https://reqres.in/") // TODO BaseUrl 변경 및 BuildConfig 변수 사용 + .baseUrl(BuildConfig.KGE_BASE_URL) .client(client) .addConverterFactory(json.asConverterFactory(requireNotNull("application/json".toMediaTypeOrNull()))) .build() From 8bd22b1d046275f47ffae970b894801895b53f19 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sun, 8 Jan 2023 12:07:08 +0900 Subject: [PATCH 170/745] =?UTF-8?q?[mod]=20#61=20=ED=99=88=20=EB=B7=B0=20?= =?UTF-8?q?=EB=B0=94=ED=85=80=EC=8B=9C=ED=8A=B8=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=EB=AA=85=20=EB=B3=80=EA=B2=BD,=20=EC=95=A1=ED=8B=B0=EB=B9=84?= =?UTF-8?q?=ED=8B=B0=20=EC=9D=B4=EB=8F=99=20=ED=9B=84=20dismiss=20?= =?UTF-8?q?=EA=B5=AC=EB=AC=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/home/HomeBottomDialogFragment.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeBottomDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeBottomDialogFragment.kt index ddffad2c..4bbb4e94 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeBottomDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeBottomDialogFragment.kt @@ -18,14 +18,16 @@ class HomeBottomDialogFragment : private fun addListeners() { binding.layoutHomeBottomMore.setOnClickListener { - changeActivity(EatingType.MORE) + moveActivity(EatingType.MORE) + dismiss() } binding.layoutHomeBottomLess.setOnClickListener { - changeActivity(EatingType.LESS) + moveActivity(EatingType.LESS) + dismiss() } } - private fun changeActivity(eatingType: EatingType) { + private fun moveActivity(eatingType: EatingType) { val intent = Intent(requireActivity(), GoalSettingActivity::class.java) intent.putExtra(GoalSettingActivity.ARG_EATING_TYPE, eatingType.name) startActivity(intent) From 515eb2c47739170547f40dd00725af922954ad2a Mon Sep 17 00:00:00 2001 From: Daeun Date: Sun, 8 Jan 2023 12:10:50 +0900 Subject: [PATCH 171/745] =?UTF-8?q?[mod]=20#66=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EB=A1=9C=EC=A7=81=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 --- .../org/keepgoeat/data/service/SignService.kt | 69 ++++++++++--------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/SignService.kt b/app/src/main/java/org/keepgoeat/data/service/SignService.kt index 741d3389..e5d096f5 100644 --- a/app/src/main/java/org/keepgoeat/data/service/SignService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/SignService.kt @@ -1,46 +1,53 @@ package org.keepgoeat.data.service import android.content.Context +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import com.kakao.sdk.auth.model.OAuthToken -import com.kakao.sdk.common.model.ClientError -import com.kakao.sdk.common.model.ClientErrorCause import com.kakao.sdk.user.UserApiClient import dagger.hilt.android.qualifiers.ActivityContext -import org.keepgoeat.presentation.sign.SignSharedPreferences import timber.log.Timber import javax.inject.Inject class SignService @Inject constructor( @ActivityContext private val context: Context, + private val client: UserApiClient ) { - fun loginKakao() { - val callback: (OAuthToken?, Throwable?) -> Unit = { token, error -> - if (error != null) { - Timber.e("카카오계정으로 로그인 실패", error) - } else if (token != null) { - UserApiClient.instance.me { user, error -> - Timber.i("카카오계정으로 로그인 성공 ${token.accessToken}") - SignSharedPreferences(context).isLogin = true - SignSharedPreferences(context).accestToken = token.accessToken - } - } - } - if (UserApiClient.instance.isKakaoTalkLoginAvailable(context)) { - UserApiClient.instance.loginWithKakaoTalk(context) { token, error -> - if (error != null) { - Timber.e("카카오톡으로 로그인 실패", error) - if (error is ClientError && error.reason == ClientErrorCause.Cancelled) { - return@loginWithKakaoTalk - } - UserApiClient.instance.loginWithKakaoAccount(context, callback = callback) - } else if (token != null) { - Timber.i("카카오톡으로 로그인 성공 ${token.accessToken}") - SignSharedPreferences(context).isLogin = true - SignSharedPreferences(context).accestToken = token.accessToken - } - } - } else { - UserApiClient.instance.loginWithKakaoAccount(context, callback = callback) + val isKakaoTalkLoginAvailable: Boolean + get() = client.isKakaoTalkLoginAvailable(context) + private val _loginState = MutableLiveData(LoginState.Init) + val loginState: LiveData get() = _loginState + + private val callback: (OAuthToken?, Throwable?) -> Unit = { token, error -> + error?.let(::handleLoginError) + token?.let(::handleLoginSuccess) + } + + fun loginByKakaotalk() { + client.loginWithKakaoTalk(context, callback = callback) + } + + fun loginByKakaoAccount() { + client.loginWithKakaoAccount(context, callback = callback) + } + + private fun handleLoginError(throwable: Throwable) { + _loginState.value = LoginState.Failure(throwable) + } + + private fun handleLoginSuccess(oAuthToken: OAuthToken) { + client.me { user, _ -> + _loginState.value = LoginState.Success(oAuthToken.accessToken, user?.id.toString()) } } + + fun logout() { + client.logout(Timber::e) + } + + sealed class LoginState { + object Init : LoginState() + data class Success(val token: String, val id: String) : LoginState() + data class Failure(val error: Throwable) : LoginState() + } } From 6d19cf271b414d21af239a63af659130fd1dc17e Mon Sep 17 00:00:00 2001 From: Daeun Date: Sun, 8 Jan 2023 12:11:55 +0900 Subject: [PATCH 172/745] =?UTF-8?q?[add]=20#66=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20di=20=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 --- .../main/java/org/keepgoeat/di/SignModule.kt | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 app/src/main/java/org/keepgoeat/di/SignModule.kt diff --git a/app/src/main/java/org/keepgoeat/di/SignModule.kt b/app/src/main/java/org/keepgoeat/di/SignModule.kt new file mode 100644 index 00000000..8d309f20 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/di/SignModule.kt @@ -0,0 +1,25 @@ +package org.keepgoeat.di + +import android.content.Context +import com.google.android.datatransport.runtime.dagger.Module +import com.google.android.datatransport.runtime.dagger.Provides +import com.kakao.sdk.user.UserApiClient +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ActivityComponent +import dagger.hilt.android.qualifiers.ActivityContext +import dagger.hilt.android.scopes.ActivityScoped +import org.keepgoeat.data.service.SignService + +@Module +@InstallIn(ActivityComponent::class) +object SignModule { + @Provides + @ActivityScoped + fun provideUserApiClient(): UserApiClient = UserApiClient.instance + + @Provides + fun provideKakaoAuthService( + @ActivityContext context: Context, + client: UserApiClient + ) = SignService(context, client) +} From 4b2f8abbe335dc26ca4d407fdc060ab9d4e441b8 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sun, 8 Jan 2023 12:19:15 +0900 Subject: [PATCH 173/745] =?UTF-8?q?[mod]=20#61=20color=EA=B0=92=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83?= =?UTF-8?q?=EC=97=90=20=EC=BB=AC=EB=9F=AC=EA=B0=92=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/background_goal_info.xml | 2 +- app/src/main/res/values/colors.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/drawable/background_goal_info.xml b/app/src/main/res/drawable/background_goal_info.xml index b9f02736..f61c8636 100644 --- a/app/src/main/res/drawable/background_goal_info.xml +++ b/app/src/main/res/drawable/background_goal_info.xml @@ -3,6 +3,6 @@ android:shape="rectangle"> - + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 78d150ed..0968afce 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -9,6 +9,7 @@ #FFFFFFFF + #FFF6F2 #FFECE5 #FFD8CC #FFCDBD From d330cda9c30e564cc9c4c4283e70ec9950d1267d Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sun, 8 Jan 2023 12:50:58 +0900 Subject: [PATCH 174/745] =?UTF-8?q?[mod]=20#61=20MyGoalInfo=20->=20HomeMyG?= =?UTF-8?q?oal=EB=A1=9C=20=EB=8C=80=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/home/HomeActivity.kt | 3 +- .../presentation/home/HomeMyGoalAdapter.kt | 18 ++++----- .../presentation/home/HomeViewModel.kt | 39 +++++++++++-------- .../keepgoeat/presentation/home/MyGoalInfo.kt | 13 ------- app/src/main/res/layout/item_home_goal.xml | 6 +-- 5 files changed, 36 insertions(+), 43 deletions(-) delete mode 100644 app/src/main/java/org/keepgoeat/presentation/home/MyGoalInfo.kt diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index fc4923e8..6cbf7882 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import androidx.activity.viewModels import org.keepgoeat.R import org.keepgoeat.databinding.ActivityHomeBinding +import org.keepgoeat.domain.model.HomeMyGoal import org.keepgoeat.presentation.detail.GoalDetailActivity import org.keepgoeat.presentation.my.MyActivity import org.keepgoeat.presentation.type.EatingType @@ -68,7 +69,7 @@ class HomeActivity : BindingActivity(R.layout.activity_home startActivity(intent) } - private fun changeGoalItemBtnColor(myGoal: MyGoalInfo) { + private fun changeGoalItemBtnColor(myGoal: HomeMyGoal) { viewModel.changeGoalAchieved(myGoal) } } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt index a5345684..df238948 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt @@ -8,6 +8,7 @@ import androidx.recyclerview.widget.RecyclerView import org.keepgoeat.R import org.keepgoeat.databinding.ItemAddGoalBinding import org.keepgoeat.databinding.ItemHomeGoalBinding +import org.keepgoeat.domain.model.HomeMyGoal import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.presentation.type.HomeBtnType import org.keepgoeat.presentation.type.HomeGoalViewType @@ -15,13 +16,12 @@ import org.keepgoeat.util.ItemDiffCallback import org.keepgoeat.util.setVisibility class HomeMyGoalAdapter( - private val changeBtnColor: (MyGoalInfo) -> Unit, + private val changeBtnColor: (HomeMyGoal) -> Unit, private val moveToDetail: (EatingType) -> Unit -) : ListAdapter( - ItemDiffCallback( +) : ListAdapter( + ItemDiffCallback( onContentsTheSame = { old, new -> old == new }, - // TODO Response에서 받아올 때는 목표별 고유 아이디 값으로 바꾸기 - onItemsTheSame = { old, new -> old.goalName == new.goalName } + onItemsTheSame = { old, new -> old.id == new.id } ) ) { private lateinit var inflater: LayoutInflater @@ -30,15 +30,15 @@ class HomeMyGoalAdapter( private val binding: ItemHomeGoalBinding ) : RecyclerView.ViewHolder(binding.root) { var layout = binding - fun bind(myGoal: MyGoalInfo, eatingType: EatingType, changeBtnColor: (MyGoalInfo) -> Unit, moveToDetail: (EatingType) -> Unit) { + fun bind(myGoal: HomeMyGoal, eatingType: EatingType, changeBtnColor: (HomeMyGoal) -> Unit, moveToDetail: (EatingType) -> Unit) { val btnType: HomeBtnType = if (eatingType == EatingType.MORE) { // 더 먹기인 경우 - if (myGoal.goalAchieved) { + if (myGoal.isAchieved) { HomeBtnType.PLUS_ACHIEVED } else { HomeBtnType.PLUS_NOT_ACHIEVED } } else { // 덜 먹기인 경우 - if (myGoal.goalAchieved) { + if (myGoal.isAchieved) { HomeBtnType.MINUS_ACHIEVED } else { HomeBtnType.MINUS_NOT_ACHIEVED @@ -95,7 +95,7 @@ class HomeMyGoalAdapter( override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder) { is MyGoalViewHolder -> { - if (currentList[position].moreGoal) { + if (currentList[position].isMore) { holder.bind(currentList[position], EatingType.MORE, changeBtnColor, moveToDetail) } else { holder.bind(currentList[position], EatingType.LESS, changeBtnColor, moveToDetail) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 8894a64b..2900dff0 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -3,12 +3,13 @@ package org.keepgoeat.presentation.home import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import org.keepgoeat.domain.model.HomeMyGoal import org.keepgoeat.presentation.type.HomeGoalViewType import java.time.LocalDateTime class HomeViewModel : ViewModel() { - private val _goalList = MutableLiveData>() - val goalList: LiveData> get() = _goalList + private val _goalList = MutableLiveData>() + val goalList: LiveData> get() = _goalList private val _goalCount = MutableLiveData() val goalCount: LiveData get() = _goalCount private val _hour = MutableLiveData(LocalDateTime.now().hour) @@ -18,13 +19,13 @@ class HomeViewModel : ViewModel() { fetchGoalList() } - fun changeGoalAchieved(myGoal: MyGoalInfo) { + fun changeGoalAchieved(myGoal: HomeMyGoal) { val position = goalList.value?.indexOf(myGoal) ?: return with(myGoal) { _goalList.value?.set( position, - MyGoalInfo( - goalName, goalDate, moreGoal, !goalAchieved, type + HomeMyGoal( + id, goalTitle, isMore, !isAchieved, thisMonthCount, type ) ) } @@ -33,39 +34,43 @@ class HomeViewModel : ViewModel() { private fun fetchGoalList() { var myGoalList = mutableListOf( - MyGoalInfo( + HomeMyGoal( + 1, "하루 1끼 이상 야채 더 먹기", - "8", true, - false, + true, + 8, HomeGoalViewType.MY_GOAL_TYPE ), - MyGoalInfo( + HomeMyGoal( + 2, "라면 덜 먹기", - "8", false, false, + 8, HomeGoalViewType.MY_GOAL_TYPE ), - MyGoalInfo( + HomeMyGoal( + 3, "커피 덜 먹기", - "30", - false, true, + false, + 30, HomeGoalViewType.MY_GOAL_TYPE ) ) -// val myGoalList = emptyList() +// val myGoalList = emptyList() val addGoalBtn = mutableListOf( - MyGoalInfo( - "3", + HomeMyGoal( + 0, "", false, false, + 0, HomeGoalViewType.ADD_GOAL_TYPE ) ) - var homeList = mutableListOf() + var homeList = mutableListOf() homeList.addAll(myGoalList) if (myGoalList.size > 0) homeList.addAll(addGoalBtn) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/MyGoalInfo.kt b/app/src/main/java/org/keepgoeat/presentation/home/MyGoalInfo.kt deleted file mode 100644 index dd3886f6..00000000 --- a/app/src/main/java/org/keepgoeat/presentation/home/MyGoalInfo.kt +++ /dev/null @@ -1,13 +0,0 @@ -package org.keepgoeat.presentation.home - -import kotlinx.serialization.Serializable -import org.keepgoeat.presentation.type.HomeGoalViewType - -@Serializable -data class MyGoalInfo( - val goalName: String, - val goalDate: String, - val moreGoal: Boolean, - var goalAchieved: Boolean, - var type: HomeGoalViewType -) diff --git a/app/src/main/res/layout/item_home_goal.xml b/app/src/main/res/layout/item_home_goal.xml index 5cfad64d..cd2550ca 100644 --- a/app/src/main/res/layout/item_home_goal.xml +++ b/app/src/main/res/layout/item_home_goal.xml @@ -8,7 +8,7 @@ + type="org.keepgoeat.domain.model.HomeMyGoal" /> Date: Sun, 8 Jan 2023 12:58:34 +0900 Subject: [PATCH 175/745] =?UTF-8?q?[feat]=20#61=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EB=B7=B0=EB=AA=A8=EB=8D=B8=EC=97=90?= =?UTF-8?q?=EC=84=9C=20intent=EB=A1=9C=20=EB=AA=A9=ED=91=9C=20id=EA=B0=92?= =?UTF-8?q?=20=EB=B0=9B=EB=8A=94=20=EB=A1=9C=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 --- .../org/keepgoeat/presentation/detail/GoalDetailActivity.kt | 6 ++++++ .../keepgoeat/presentation/detail/GoalDetailViewModel.kt | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 44c7ef93..54de014d 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -27,6 +27,11 @@ class GoalDetailActivity : BindingActivity(R.layout.a viewModel.setEatingType(eatingType) adapter = GoalStickerListAdapter(eatingType, CELL_COUNT) } + if (intent.hasExtra(ARG_GOAL_ID)) { + val goalId = intent.getIntExtra(ARG_GOAL_ID, -1) + viewModel.setGoalId(goalId) + } + viewModel.fetchGoalDetailInfo() @@ -66,5 +71,6 @@ class GoalDetailActivity : BindingActivity(R.layout.a private const val CARD_MATRIX_ROW = 5 private const val CARD_MATRIX_COL = 7 const val ARG_EATING_TYPE = "eatingType" + const val ARG_GOAL_ID = "goalId" } } diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt index 31ce89b6..bec4d2cf 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt @@ -20,6 +20,8 @@ class GoalDetailViewModel @Inject constructor() : ViewModel() { val numOfDaysEatenThisMonth: LiveData get() = _numOfDaysEatenThisMonth private var _eatingType = MutableLiveData() val eatingType: LiveData get() = _eatingType + private var _goalId = MutableLiveData() + val goalId: LiveData get() = _goalId // TODO api 연동 후 해당 주석 제거 예정 // init { @@ -50,6 +52,10 @@ class GoalDetailViewModel @Inject constructor() : ViewModel() { _eatingType.value = eatingType } + fun setGoalId(id: Int) { + _goalId.value = id + } + companion object { const val CELL_COUNT = 35 } From 8b7dfdf24e68272c3955c1d4bd24a1295fce50da Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sun, 8 Jan 2023 13:01:54 +0900 Subject: [PATCH 176/745] =?UTF-8?q?[mod]=20#61=20=ED=99=88=20=EB=B7=B0?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=AA=A9=ED=91=9C=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=EB=B7=B0=EB=A1=9C=20=ED=81=B4=EB=A6=AD=ED=95=9C=20=EB=AA=A9?= =?UTF-8?q?=ED=91=9C=EC=9D=98=20id=EA=B0=92=20=EC=A0=84=EB=8B=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalDetailActivity.kt | 1 - .../org/keepgoeat/presentation/home/HomeActivity.kt | 3 ++- .../keepgoeat/presentation/home/HomeMyGoalAdapter.kt | 11 ++++++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 54de014d..07a1a324 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -32,7 +32,6 @@ class GoalDetailActivity : BindingActivity(R.layout.a viewModel.setGoalId(goalId) } - viewModel.fetchGoalDetailInfo() initLayout() diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 6cbf7882..af3497b7 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -58,9 +58,10 @@ class HomeActivity : BindingActivity(R.layout.activity_home HomeBottomDialogFragment().show(supportFragmentManager, "homeDialog") } - private fun moveToDetail(eatingType: EatingType) { + private fun moveToDetail(eatingType: EatingType, goalId: Int) { val intent = Intent(this@HomeActivity, GoalDetailActivity::class.java) intent.putExtra(GoalDetailActivity.ARG_EATING_TYPE, eatingType.name) + intent.putExtra(GoalDetailActivity.ARG_GOAL_ID, goalId) startActivity(intent) } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt index df238948..59559af9 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt @@ -17,7 +17,7 @@ import org.keepgoeat.util.setVisibility class HomeMyGoalAdapter( private val changeBtnColor: (HomeMyGoal) -> Unit, - private val moveToDetail: (EatingType) -> Unit + private val moveToDetail: (EatingType, Int) -> Unit ) : ListAdapter( ItemDiffCallback( onContentsTheSame = { old, new -> old == new }, @@ -30,7 +30,12 @@ class HomeMyGoalAdapter( private val binding: ItemHomeGoalBinding ) : RecyclerView.ViewHolder(binding.root) { var layout = binding - fun bind(myGoal: HomeMyGoal, eatingType: EatingType, changeBtnColor: (HomeMyGoal) -> Unit, moveToDetail: (EatingType) -> Unit) { + fun bind( + myGoal: HomeMyGoal, + eatingType: EatingType, + changeBtnColor: (HomeMyGoal) -> Unit, + moveToDetail: (EatingType, Int) -> Unit + ) { val btnType: HomeBtnType = if (eatingType == EatingType.MORE) { // 더 먹기인 경우 if (myGoal.isAchieved) { HomeBtnType.PLUS_ACHIEVED @@ -53,7 +58,7 @@ class HomeMyGoalAdapter( changeBtnColor(myGoal) } layoutHomeGoal.setOnClickListener { - moveToDetail(eatingType) + moveToDetail(eatingType, myGoal.id) } } } From 6905b6919f1c51abb8967e1c6ed3caf0023c2b62 Mon Sep 17 00:00:00 2001 From: Daeun Date: Sun, 8 Jan 2023 13:15:49 +0900 Subject: [PATCH 177/745] =?UTF-8?q?[refactor]=20#66=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20=EC=BD=94=EB=93=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/data/service/SignService.kt | 35 ++++++++++--------- .../main/java/org/keepgoeat/di/SignModule.kt | 6 ++-- .../presentation/sign/SignActivity.kt | 16 +++++---- .../presentation/sign/SignViewModel.kt | 13 +++++++ app/src/main/res/layout/activity_sign.xml | 7 ++++ 5 files changed, 51 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt diff --git a/app/src/main/java/org/keepgoeat/data/service/SignService.kt b/app/src/main/java/org/keepgoeat/data/service/SignService.kt index e5d096f5..65e6847a 100644 --- a/app/src/main/java/org/keepgoeat/data/service/SignService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/SignService.kt @@ -1,8 +1,6 @@ package org.keepgoeat.data.service import android.content.Context -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import com.kakao.sdk.auth.model.OAuthToken import com.kakao.sdk.user.UserApiClient import dagger.hilt.android.qualifiers.ActivityContext @@ -15,39 +13,42 @@ class SignService @Inject constructor( ) { val isKakaoTalkLoginAvailable: Boolean get() = client.isKakaoTalkLoginAvailable(context) - private val _loginState = MutableLiveData(LoginState.Init) - val loginState: LiveData get() = _loginState - private val callback: (OAuthToken?, Throwable?) -> Unit = { token, error -> - error?.let(::handleLoginError) - token?.let(::handleLoginSuccess) + fun loginKakao(loginListener: (() -> Unit)? = null) { + val callback: (OAuthToken?, Throwable?) -> Unit = { token, error -> + error?.let(::handleLoginError) + token?.let(::handleLoginSuccess) + } + if (isKakaoTalkLoginAvailable) + loginByKakaotalk(loginListener, callback) + else + loginByKakaoAccount(loginListener, callback) } - fun loginByKakaotalk() { + fun loginByKakaotalk(loginListener: (() -> Unit)? = null, callback: (OAuthToken?, Throwable?) -> Unit) { client.loginWithKakaoTalk(context, callback = callback) } - fun loginByKakaoAccount() { + fun loginByKakaoAccount(loginListener: (() -> Unit)? = null, callback: (OAuthToken?, Throwable?) -> Unit) { client.loginWithKakaoAccount(context, callback = callback) } private fun handleLoginError(throwable: Throwable) { - _loginState.value = LoginState.Failure(throwable) + Timber.d( + "${ + if (isKakaoTalkLoginAvailable) "카카오톡" + else "카카오계정" + }으로 로그인 실패" + ) } private fun handleLoginSuccess(oAuthToken: OAuthToken) { client.me { user, _ -> - _loginState.value = LoginState.Success(oAuthToken.accessToken, user?.id.toString()) + // TODO 로그인 Api 연결 } } fun logout() { client.logout(Timber::e) } - - sealed class LoginState { - object Init : LoginState() - data class Success(val token: String, val id: String) : LoginState() - data class Failure(val error: Throwable) : LoginState() - } } diff --git a/app/src/main/java/org/keepgoeat/di/SignModule.kt b/app/src/main/java/org/keepgoeat/di/SignModule.kt index 8d309f20..af04bf89 100644 --- a/app/src/main/java/org/keepgoeat/di/SignModule.kt +++ b/app/src/main/java/org/keepgoeat/di/SignModule.kt @@ -1,9 +1,9 @@ package org.keepgoeat.di import android.content.Context -import com.google.android.datatransport.runtime.dagger.Module -import com.google.android.datatransport.runtime.dagger.Provides import com.kakao.sdk.user.UserApiClient +import dagger.Module +import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.components.ActivityComponent import dagger.hilt.android.qualifiers.ActivityContext @@ -18,7 +18,7 @@ object SignModule { fun provideUserApiClient(): UserApiClient = UserApiClient.instance @Provides - fun provideKakaoAuthService( + fun provideSignService( @ActivityContext context: Context, client: UserApiClient ) = SignService(context, client) diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt index bf143ba2..fd65438d 100644 --- a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt @@ -2,36 +2,40 @@ package org.keepgoeat.presentation.sign import android.content.Intent import android.os.Bundle +import androidx.activity.viewModels import com.kakao.sdk.common.KakaoSdk import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.data.service.SignService import org.keepgoeat.databinding.ActivitySignBinding -import org.keepgoeat.presentation.home.HomeActivity +import org.keepgoeat.presentation.onboarding.OnboardingActivity import org.keepgoeat.util.binding.BindingActivity import javax.inject.Inject @AndroidEntryPoint class SignActivity : BindingActivity(R.layout.activity_sign) { + private val viewModel: SignViewModel by viewModels() @Inject lateinit var signService: SignService override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + binding.viewModel = viewModel + binding.lifecycleOwner = this + KakaoSdk.init(this, this.getString(R.string.kakao_app_key1)) addListeners() - // moveMain() } private fun addListeners() { binding.layoutSignIn.setOnClickListener { - signService.loginKakao() + signService.loginKakao(::moveToOnBoarding) +// viewModel.login(::moveToOnBoarding) } } - private fun moveMain() { - val intent = Intent(this, HomeActivity::class.java) - startActivity(intent) + private fun moveToOnBoarding(){ + startActivity(Intent(this, OnboardingActivity::class.java)) finish() } } diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt new file mode 100644 index 00000000..a3690d11 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt @@ -0,0 +1,13 @@ +package org.keepgoeat.presentation.sign + +import androidx.lifecycle.ViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import org.keepgoeat.data.service.SignService +import javax.inject.Inject + +@HiltViewModel +class SignViewModel @Inject constructor(private val signService: SignService) : ViewModel() { + fun login(loginListener: () -> Unit) { +// signService.loginKakao(loginListener) + } +} diff --git a/app/src/main/res/layout/activity_sign.xml b/app/src/main/res/layout/activity_sign.xml index 22547b32..def27a97 100644 --- a/app/src/main/res/layout/activity_sign.xml +++ b/app/src/main/res/layout/activity_sign.xml @@ -3,6 +3,13 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> + + + + + Date: Sun, 8 Jan 2023 13:21:46 +0900 Subject: [PATCH 178/745] =?UTF-8?q?[mod]=20#61=20=ED=99=88=20=EB=B7=B0=20i?= =?UTF-8?q?nt=ED=98=95=20string=EC=9C=BC=EB=A1=9C=20=EB=B0=94=EA=BF=94?= =?UTF-8?q?=EC=84=9C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=B0=94=EC=9D=B8?= =?UTF-8?q?=EB=94=A9=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/item_home_goal.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/item_home_goal.xml b/app/src/main/res/layout/item_home_goal.xml index cd2550ca..47b380d5 100644 --- a/app/src/main/res/layout/item_home_goal.xml +++ b/app/src/main/res/layout/item_home_goal.xml @@ -65,7 +65,7 @@ android:id="@+id/tv_item_goal_date" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@{goal.thisMonthCount}" + android:text="@{String.valueOf(goal.thisMonthCount)}" android:textAppearance="@style/TextAppearance.System1_Bold" android:textColor="@{context.getColor(goalType.tagTextColor)}" android:textSize="36dp" From e54b681f8664f02423dbab467657edf6b2fb5fd8 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sun, 8 Jan 2023 15:23:29 +0900 Subject: [PATCH 179/745] =?UTF-8?q?[chore]=20#61=20=EC=95=A1=ED=8B=B0?= =?UTF-8?q?=EB=B9=84=ED=8B=B0=20=EC=9D=B4=EB=8F=99=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/presentation/home/HomeBottomDialogFragment.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeBottomDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeBottomDialogFragment.kt index 4bbb4e94..260cc61c 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeBottomDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeBottomDialogFragment.kt @@ -18,16 +18,16 @@ class HomeBottomDialogFragment : private fun addListeners() { binding.layoutHomeBottomMore.setOnClickListener { - moveActivity(EatingType.MORE) + moveToSetting(EatingType.MORE) dismiss() } binding.layoutHomeBottomLess.setOnClickListener { - moveActivity(EatingType.LESS) + moveToSetting(EatingType.LESS) dismiss() } } - private fun moveActivity(eatingType: EatingType) { + private fun moveToSetting(eatingType: EatingType) { val intent = Intent(requireActivity(), GoalSettingActivity::class.java) intent.putExtra(GoalSettingActivity.ARG_EATING_TYPE, eatingType.name) startActivity(intent) From 47cb9bfa7599ca184a267163296cb908c5422301 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sun, 8 Jan 2023 20:15:03 +0900 Subject: [PATCH 180/745] =?UTF-8?q?[add]=20#69=20BuildConfig=EC=97=90=20KA?= =?UTF-8?q?KAO=5FNATIVE=5FKEY=20=EB=B3=80=EC=88=98=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + app/proguard-rules.pro | 5 ++++- app/src/main/java/org/keepgoeat/App.kt | 3 +++ .../java/org/keepgoeat/presentation/sign/SignActivity.kt | 2 -- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 11b763d7..33e232c2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,6 +26,7 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" buildConfigField "String", "KGE_BASE_URL", properties["KGE_BASE_URL"] + buildConfigField "String", "KAKAO_NATIVE_KEY", properties["KAKAO_NATIVE_KEY"] } buildTypes { diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 481bb434..cd849a26 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -18,4 +18,7 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile + +-keep class com.kakao.sdk.**.model.* { ; } +-keep class * extends com.google.gson.TypeAdapter \ No newline at end of file diff --git a/app/src/main/java/org/keepgoeat/App.kt b/app/src/main/java/org/keepgoeat/App.kt index b9b6e20c..1086d8f7 100644 --- a/app/src/main/java/org/keepgoeat/App.kt +++ b/app/src/main/java/org/keepgoeat/App.kt @@ -2,7 +2,9 @@ package org.keepgoeat import android.app.Application import androidx.appcompat.app.AppCompatDelegate +import com.kakao.sdk.common.KakaoSdk import dagger.hilt.android.HiltAndroidApp +import org.keepgoeat.BuildConfig.KAKAO_NATIVE_KEY import org.keepgoeat.util.KGEDebugTree import timber.log.Timber @@ -10,6 +12,7 @@ import timber.log.Timber class App : Application() { override fun onCreate() { super.onCreate() + KakaoSdk.init(this, KAKAO_NATIVE_KEY) if (BuildConfig.DEBUG) Timber.plant(KGEDebugTree()) AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) } diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt index bf143ba2..c9fd0e9d 100644 --- a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt @@ -2,7 +2,6 @@ package org.keepgoeat.presentation.sign import android.content.Intent import android.os.Bundle -import com.kakao.sdk.common.KakaoSdk import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.data.service.SignService @@ -18,7 +17,6 @@ class SignActivity : BindingActivity(R.layout.activity_sign override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - KakaoSdk.init(this, this.getString(R.string.kakao_app_key1)) addListeners() // moveMain() } From c73fe2c969c3c7d7f95cf5ecc2e5eec19de658d2 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sun, 8 Jan 2023 20:20:23 +0900 Subject: [PATCH 181/745] =?UTF-8?q?[add]=20#69=20PR=20Builder=EC=97=90=20K?= =?UTF-8?q?AKAO=5FNATIVE=5FKEY=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr_builder.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/pr_builder.yml b/.github/workflows/pr_builder.yml index 11ba7568..7579478f 100644 --- a/.github/workflows/pr_builder.yml +++ b/.github/workflows/pr_builder.yml @@ -43,6 +43,11 @@ jobs: - name: Touch local properties run: touch local.properties + - name: Access KAKAO_NATIVE_KEY + env: + KAKAO_NATIVE_KEY: ${{ secrets.KAKAO_NATIVE_KEY }} + run: echo "KAKAO_NATIVE_KEY=\"$KAKAO_NATIVE_KEY\"" >> local.properties + - name: Access KGE_BASE_URL env: HFM_BASE_URL: ${{ secrets.KGE_BASE_URL }} From f316862e8a9df353b3144e5f5afffaf07808bfda Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sun, 8 Jan 2023 21:50:34 +0900 Subject: [PATCH 182/745] =?UTF-8?q?[add]=20#69=20=EB=A7=A4=EB=8B=88?= =?UTF-8?q?=ED=8E=98=EC=8A=A4=ED=8A=B8=EC=97=90=20KAKAO=5FNATIVE=5FKEY=20?= =?UTF-8?q?=EB=B9=8C=EB=93=9C=20=EB=B3=80=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 --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 33e232c2..9c91046b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,6 +27,7 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" buildConfigField "String", "KGE_BASE_URL", properties["KGE_BASE_URL"] buildConfigField "String", "KAKAO_NATIVE_KEY", properties["KAKAO_NATIVE_KEY"] + manifestPlaceholders["KAKAO_NATIVE_KEY"] = properties["KAKAO_NATIVE_KEY"] } buildTypes { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 98e17ee2..b1a42324 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -70,9 +70,10 @@ - + + + Date: Mon, 9 Jan 2023 00:26:33 +0900 Subject: [PATCH 183/745] =?UTF-8?q?[mod]=20#40=20=EC=8A=A4=ED=94=8C?= =?UTF-8?q?=EB=9E=98=EC=8B=9C=20activity=EC=97=90=EC=84=9C=20BindingActivi?= =?UTF-8?q?ty=20=EC=83=81=EC=86=8D=20=EB=B0=9B=EB=8A=94=EA=B1=B8=EB=A1=9C?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- .../main/java/org/keepgoeat/presentation/SplashActivity.kt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8332c25f..bc6e6b8a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -94,7 +94,7 @@ dependencies { // ViewPager2 implementation 'androidx.viewpager2:viewpager2:1.0.0' - //Splashscreen + // Splashscreen implementation 'androidx.core:core-splashscreen:1.0.0-rc01' } diff --git a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt index 6b2d494e..3b458815 100644 --- a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt @@ -2,23 +2,23 @@ package org.keepgoeat.presentation import android.content.Intent import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.keepgoeat.R +import org.keepgoeat.databinding.ActivitySplashBinding import org.keepgoeat.presentation.onboarding.OnboardingActivity import org.keepgoeat.presentation.sign.SignActivity import org.keepgoeat.presentation.sign.SignSharedPreferences +import org.keepgoeat.util.binding.BindingActivity @AndroidEntryPoint -class SplashActivity : AppCompatActivity() { +class SplashActivity : BindingActivity(R.layout.activity_splash) { override fun onCreate(savedInstanceState: Bundle?) { installSplashScreen() super.onCreate(savedInstanceState) - setContentView(R.layout.activity_splash) loadSplashScreen() } From 3953f78e0a7e4ae82e25c2ca0138fe6d7875be6d Mon Sep 17 00:00:00 2001 From: Daeun Date: Mon, 9 Jan 2023 00:27:27 +0900 Subject: [PATCH 184/745] =?UTF-8?q?[mod]=20#40=20=EC=8A=A4=ED=94=8C?= =?UTF-8?q?=EB=9E=98=EC=8B=9C=20=EB=A1=9C=EB=94=A9=20=EC=8B=9C=EA=B0=84=20?= =?UTF-8?q?2=EC=B4=88=EC=97=90=EC=84=9C=201=EC=B4=88=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt index 3b458815..5855bb6b 100644 --- a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt @@ -24,7 +24,7 @@ class SplashActivity : BindingActivity(R.layout.activity_ private fun loadSplashScreen() { lifecycleScope.launch { - delay(2000) + delay(1000L) moveToNext() } } From 7f57ebc6a05acc8c98f8bdc75e74cf6b2242c3ee Mon Sep 17 00:00:00 2001 From: Daeun Date: Mon, 9 Jan 2023 00:28:10 +0900 Subject: [PATCH 185/745] =?UTF-8?q?[feat]=20#40=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=ED=99=94=EB=A9=B4=EC=97=90=EC=84=9C=20=EB=92=A4?= =?UTF-8?q?=EB=A1=9C=20=EA=B0=94=EC=9D=84=20=EB=95=8C=20=EC=95=B1=20?= =?UTF-8?q?=EC=A2=85=EB=A3=8C=EC=8B=9C=ED=82=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt index 5855bb6b..5b9216d9 100644 --- a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt @@ -26,6 +26,7 @@ class SplashActivity : BindingActivity(R.layout.activity_ lifecycleScope.launch { delay(1000L) moveToNext() + finish() } } From b2bf135b5ed48829187c8444145290f6d8ae5c21 Mon Sep 17 00:00:00 2001 From: Daeun Date: Mon, 9 Jan 2023 00:44:10 +0900 Subject: [PATCH 186/745] =?UTF-8?q?[chore]=20#66=20klint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/data/service/SignService.kt | 8 ++------ .../java/org/keepgoeat/presentation/sign/SignActivity.kt | 3 ++- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/SignService.kt b/app/src/main/java/org/keepgoeat/data/service/SignService.kt index 65e6847a..029e195a 100644 --- a/app/src/main/java/org/keepgoeat/data/service/SignService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/SignService.kt @@ -34,12 +34,8 @@ class SignService @Inject constructor( } private fun handleLoginError(throwable: Throwable) { - Timber.d( - "${ - if (isKakaoTalkLoginAvailable) "카카오톡" - else "카카오계정" - }으로 로그인 실패" - ) + val kakaoType = if (isKakaoTalkLoginAvailable) "카카오톡" else "카카오계정" + Timber.d("$kakaoType 으로 로그인 실패") } private fun handleLoginSuccess(oAuthToken: OAuthToken) { diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt index fd65438d..66b3a64a 100644 --- a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt @@ -15,6 +15,7 @@ import javax.inject.Inject @AndroidEntryPoint class SignActivity : BindingActivity(R.layout.activity_sign) { private val viewModel: SignViewModel by viewModels() + @Inject lateinit var signService: SignService @@ -34,7 +35,7 @@ class SignActivity : BindingActivity(R.layout.activity_sign } } - private fun moveToOnBoarding(){ + private fun moveToOnBoarding() { startActivity(Intent(this, OnboardingActivity::class.java)) finish() } From 199aa1b491a6c24d3837629c0b4cfa4f384ecdb4 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 9 Jan 2023 01:48:43 +0900 Subject: [PATCH 187/745] =?UTF-8?q?[feat]=20#68=20Home=20=EC=84=9C?= =?UTF-8?q?=EB=B2=84=20=ED=86=B5=EC=8B=A0=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=93=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/HomeDataSource.kt | 14 ++++++ .../data/model/response/ResponseHome.kt | 47 +++++++++++++++++++ .../data/repository/HomeRepositoryImpl.kt | 29 ++++++++++++ .../org/keepgoeat/data/service/HomeService.kt | 10 ++++ .../domain/repository/HomeRepository.kt | 7 +++ .../presentation/home/HomeViewModel.kt | 14 +++++- 6 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/org/keepgoeat/data/datasource/remote/HomeDataSource.kt create mode 100644 app/src/main/java/org/keepgoeat/data/model/response/ResponseHome.kt create mode 100644 app/src/main/java/org/keepgoeat/data/repository/HomeRepositoryImpl.kt create mode 100644 app/src/main/java/org/keepgoeat/data/service/HomeService.kt create mode 100644 app/src/main/java/org/keepgoeat/domain/repository/HomeRepository.kt diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/HomeDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/HomeDataSource.kt new file mode 100644 index 00000000..a8593f63 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/HomeDataSource.kt @@ -0,0 +1,14 @@ +package org.keepgoeat.data.datasource.remote + +import org.keepgoeat.data.ApiResult +import org.keepgoeat.data.model.response.ResponseHome +import org.keepgoeat.data.service.HomeService +import org.keepgoeat.util.safeApiCall +import javax.inject.Inject + +class HomeDataSource @Inject constructor( + private val homeService : HomeService +){ + suspend fun fetchHomeEntire(): ApiResult = + safeApiCall { homeService.fetchHomeEntire() } +} diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseHome.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseHome.kt new file mode 100644 index 00000000..4b1b0d49 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseHome.kt @@ -0,0 +1,47 @@ +package org.keepgoeat.data.model.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import org.keepgoeat.domain.model.HomeMyGoal +import org.keepgoeat.presentation.type.HomeGoalViewType + +@Serializable +data class ResponseHome( + @SerialName("data") + val homeData: HomeData, + val message: String, + val status: Int, + val success: Boolean +) { + @Serializable + data class HomeData( + val cheeringMessage: String, + val daytime: Int, + val goalCount: Int, + val goals: List + ) { + @Serializable + data class Goal( + val goalContent: String, + val goalId: Int, + val isAchieved: Boolean, + val isMore: Boolean, + val isOngoing: Boolean, + val keptAt: String, + val startedAt: String, + val thisMonthCount: Int, + val totalCount: Int, + val writerId: Int + ) { + fun toHomeMyGoal(goal: Goal): HomeMyGoal = + HomeMyGoal( + goal.goalId, + goal.goalContent, + goal.isMore, + goal.isAchieved, + goal.thisMonthCount, + HomeGoalViewType.MY_GOAL_TYPE + ) + } + } +} diff --git a/app/src/main/java/org/keepgoeat/data/repository/HomeRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/HomeRepositoryImpl.kt new file mode 100644 index 00000000..ed8168cd --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/repository/HomeRepositoryImpl.kt @@ -0,0 +1,29 @@ +package org.keepgoeat.data.repository + +import org.keepgoeat.data.ApiResult +import org.keepgoeat.data.datasource.remote.HomeDataSource +import org.keepgoeat.data.model.response.ResponseHome +import org.keepgoeat.domain.repository.HomeRepository +import timber.log.Timber +import javax.inject.Inject + +class HomeRepositoryImpl @Inject constructor( + private val homeDataSource: HomeDataSource, +) : HomeRepository { + override suspend fun fetchHome(): ResponseHome.HomeData? { + val result = homeDataSource.fetchHomeEntire() + return when (result) { + is ApiResult.Success -> { + result.data?.homeData + } + is ApiResult.NetworkError -> { + Timber.d("Network Error") + null + } + is ApiResult.GenericError -> { + Timber.d("(${result.code}): $(result.message}") + null + } + } + } +} diff --git a/app/src/main/java/org/keepgoeat/data/service/HomeService.kt b/app/src/main/java/org/keepgoeat/data/service/HomeService.kt new file mode 100644 index 00000000..992c7975 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/service/HomeService.kt @@ -0,0 +1,10 @@ +package org.keepgoeat.data.service + +import org.keepgoeat.data.model.response.ResponseHome +import retrofit2.Response +import retrofit2.http.GET + +interface HomeService { + @GET("home") + suspend fun fetchHomeEntire(): Response +} diff --git a/app/src/main/java/org/keepgoeat/domain/repository/HomeRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/HomeRepository.kt new file mode 100644 index 00000000..37c56fa3 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/domain/repository/HomeRepository.kt @@ -0,0 +1,7 @@ +package org.keepgoeat.domain.repository + +import org.keepgoeat.data.model.response.ResponseHome + +interface HomeRepository { + suspend fun fetchHome(): ResponseHome.HomeData? +} \ No newline at end of file diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 2900dff0..10f1d919 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -3,11 +3,19 @@ package org.keepgoeat.presentation.home import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import org.keepgoeat.data.datasource.remote.HomeDataSource import org.keepgoeat.domain.model.HomeMyGoal import org.keepgoeat.presentation.type.HomeGoalViewType import java.time.LocalDateTime +import javax.inject.Inject -class HomeViewModel : ViewModel() { +@HiltViewModel +class HomeViewModel @Inject constructor( + private val homeDataSource: HomeDataSource +): ViewModel() { private val _goalList = MutableLiveData>() val goalList: LiveData> get() = _goalList private val _goalCount = MutableLiveData() @@ -33,6 +41,10 @@ class HomeViewModel : ViewModel() { } private fun fetchGoalList() { + viewModelScope.launch { + homeDataSource.fetchHomeEntire() + } + var myGoalList = mutableListOf( HomeMyGoal( 1, From d09f14e93894c7ca336dc38f8d0c2870e0195888 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 9 Jan 2023 02:48:29 +0900 Subject: [PATCH 188/745] =?UTF-8?q?[mod]=20#68=20=ED=99=88=EB=B7=B0?= =?UTF-8?q?=EB=AA=A8=EB=8D=B8=EC=97=90=EC=84=9C=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EB=B0=9B=EC=95=84=EC=98=A4=EA=B8=B0,=20ResponseHom?= =?UTF-8?q?e=20=EC=97=90=EC=84=9C=20HomeMyGoal=20=EB=A1=9C=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EB=B0=94=EA=BE=B8=EB=8A=94=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/model/response/ResponseHome.kt | 25 +++++++++---------- .../presentation/home/HomeViewModel.kt | 13 +++++++--- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseHome.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseHome.kt index 4b1b0d49..7eb7746f 100644 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseHome.kt +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseHome.kt @@ -1,14 +1,12 @@ package org.keepgoeat.data.model.response -import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import org.keepgoeat.domain.model.HomeMyGoal import org.keepgoeat.presentation.type.HomeGoalViewType @Serializable data class ResponseHome( - @SerialName("data") - val homeData: HomeData, + val data: HomeData, val message: String, val status: Int, val success: Boolean @@ -32,16 +30,17 @@ data class ResponseHome( val thisMonthCount: Int, val totalCount: Int, val writerId: Int - ) { - fun toHomeMyGoal(goal: Goal): HomeMyGoal = - HomeMyGoal( - goal.goalId, - goal.goalContent, - goal.isMore, - goal.isAchieved, - goal.thisMonthCount, - HomeGoalViewType.MY_GOAL_TYPE - ) + ) + + fun toHomeMyGoal() = goals.map { goal -> + HomeMyGoal( + goal.goalId, + goal.goalContent, + goal.isMore, + goal.isAchieved, + goal.thisMonthCount, + HomeGoalViewType.MY_GOAL_TYPE + ) } } } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 10f1d919..5804a2c3 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -6,22 +6,24 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch -import org.keepgoeat.data.datasource.remote.HomeDataSource import org.keepgoeat.domain.model.HomeMyGoal +import org.keepgoeat.domain.repository.HomeRepository import org.keepgoeat.presentation.type.HomeGoalViewType import java.time.LocalDateTime import javax.inject.Inject @HiltViewModel class HomeViewModel @Inject constructor( - private val homeDataSource: HomeDataSource -): ViewModel() { + private val homeRepository: HomeRepository +) : ViewModel() { private val _goalList = MutableLiveData>() val goalList: LiveData> get() = _goalList private val _goalCount = MutableLiveData() val goalCount: LiveData get() = _goalCount private val _hour = MutableLiveData(LocalDateTime.now().hour) val hour: LiveData get() = _hour + private val _cheeringMessage = MutableLiveData() + val cheeringMessage: LiveData get() = _cheeringMessage init { fetchGoalList() @@ -42,7 +44,10 @@ class HomeViewModel @Inject constructor( private fun fetchGoalList() { viewModelScope.launch { - homeDataSource.fetchHomeEntire() + homeRepository.fetchHome()?.let { homeData -> + _cheeringMessage.value = homeData.cheeringMessage + _goalList.value = homeData.toHomeMyGoal().toMutableList() + } } var myGoalList = mutableListOf( From 89e8c4541071165f90e994ed761cde43f2115a73 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 9 Jan 2023 02:50:17 +0900 Subject: [PATCH 189/745] =?UTF-8?q?[mod]=20#68=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=EB=B0=94=EC=9D=B8=EB=94=A9=EC=9C=BC=EB=A1=9C=20xml?= =?UTF-8?q?=EC=97=90=20=EC=9D=91=EC=9B=90=EB=A9=94=EC=8B=9C=EC=A7=80=20?= =?UTF-8?q?=EC=A0=84=EB=8B=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_home.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index c7bd17c0..5e0d418d 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -71,7 +71,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing12" - android:text="@string/cheer_msg" + android:text="@{viewModel.cheeringMessage}" android:textAppearance="@style/TextAppearance.System4_Bold" android:textColor="@color/gray_700" app:layout_constraintBottom_toBottomOf="parent" From d08dd8a398f9b5c6c7b3006a775e24662c7cc41c Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 9 Jan 2023 03:18:13 +0900 Subject: [PATCH 190/745] =?UTF-8?q?[fix]=20#69=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4=20=EA=B3=84=EC=A0=95=EC=9C=BC=EB=A1=9C=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=EC=97=90=20=EC=8B=A4=ED=8C=A8=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/sign/SignActivity.kt | 44 ++++++++++++++++++- app/src/main/res/values/strings.xml | 4 +- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt index c9fd0e9d..9ee9ce2f 100644 --- a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt @@ -2,12 +2,18 @@ package org.keepgoeat.presentation.sign import android.content.Intent import android.os.Bundle +import com.kakao.sdk.auth.model.OAuthToken +import com.kakao.sdk.common.model.ClientError +import com.kakao.sdk.common.model.ClientErrorCause +import com.kakao.sdk.user.UserApiClient import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.data.service.SignService import org.keepgoeat.databinding.ActivitySignBinding import org.keepgoeat.presentation.home.HomeActivity +import org.keepgoeat.presentation.onboarding.OnboardingActivity import org.keepgoeat.util.binding.BindingActivity +import timber.log.Timber import javax.inject.Inject @AndroidEntryPoint @@ -15,15 +21,49 @@ class SignActivity : BindingActivity(R.layout.activity_sign @Inject lateinit var signService: SignService + // 카카오계정으로 로그인 공통 callback 구성 + // 카카오톡으로 로그인 할 수 없어 카카오계정으로 로그인할 경우 사용됨 + val callback: (OAuthToken?, Throwable?) -> Unit = { token, error -> + if (error != null) { + Timber.e("카카오계정으로 로그인 실패 $error") + } else if (token != null) { + Timber.d("카카오계정으로 로그인 성공 ${token.accessToken}") + startActivity(Intent(this, OnboardingActivity::class.java)) + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + addListeners() - // moveMain() } private fun addListeners() { binding.layoutSignIn.setOnClickListener { - signService.loginKakao() + // 카카오톡이 설치되어 있으면 카카오톡으로 로그인, 아니면 카카오계정으로 로그인 + if (UserApiClient.instance.isKakaoTalkLoginAvailable(this)) { + Timber.d("카카오톡 가능") + UserApiClient.instance.loginWithKakaoTalk(this) { token, error -> + Timber.d("$token $error") + if (error != null) { + Timber.e("카카오톡으로 로그인 실패 $error") + + // 사용자가 카카오톡 설치 후 디바이스 권한 요청 화면에서 로그인을 취소한 경우, + // 의도적인 로그인 취소로 보고 카카오계정으로 로그인 시도 없이 로그인 취소로 처리 (예: 뒤로 가기) + if (error is ClientError && error.reason == ClientErrorCause.Cancelled) { + return@loginWithKakaoTalk + } + + // 카카오톡에 연결된 카카오계정이 없는 경우, 카카오계정으로 로그인 시도 + UserApiClient.instance.loginWithKakaoAccount(this, callback = callback) + } else if (token != null) { + Timber.i("카카오톡으로 로그인 성공 ${token.accessToken}") + } + } + } else { + Timber.d("카카오계정으로 가능") + UserApiClient.instance.loginWithKakaoAccount(this, callback = callback) + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 934ed2c9..330a2617 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,9 +9,7 @@ 더 먹기 아니오 - - 5b258b06c6f8e90a646e2675b2f8e8aa - kakao5b258b06c6f8e90a646e2675b2f8e8aa + 카카오톡 로그인 식습관 관리, 같이 천천히 시작해볼까요?\n먹는 재미는 언제나 소중하니까! From 77988e919ea589df4b0c00b5f15c9dfd991532fe Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 9 Jan 2023 03:33:52 +0900 Subject: [PATCH 191/745] =?UTF-8?q?[chore]=20#68=20HomeService=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20GoalService=EB=A1=9C=20=EB=B3=80=EA=B2=BD(?= =?UTF-8?q?=ED=86=B5=ED=95=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{HomeDataSource.kt => GoalDataSource.kt} | 10 +++++----- ...HomeRepositoryImpl.kt => GoalRepositoryImpl.kt} | 14 +++++++------- .../service/{HomeService.kt => GoalService.kt} | 2 +- .../{HomeRepository.kt => GoalRepository.kt} | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) rename app/src/main/java/org/keepgoeat/data/datasource/remote/{HomeDataSource.kt => GoalDataSource.kt} (58%) rename app/src/main/java/org/keepgoeat/data/repository/{HomeRepositoryImpl.kt => GoalRepositoryImpl.kt} (65%) rename app/src/main/java/org/keepgoeat/data/service/{HomeService.kt => GoalService.kt} (90%) rename app/src/main/java/org/keepgoeat/domain/repository/{HomeRepository.kt => GoalRepository.kt} (84%) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/HomeDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt similarity index 58% rename from app/src/main/java/org/keepgoeat/data/datasource/remote/HomeDataSource.kt rename to app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index a8593f63..9d037505 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/HomeDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -2,13 +2,13 @@ package org.keepgoeat.data.datasource.remote import org.keepgoeat.data.ApiResult import org.keepgoeat.data.model.response.ResponseHome -import org.keepgoeat.data.service.HomeService +import org.keepgoeat.data.service.GoalService import org.keepgoeat.util.safeApiCall import javax.inject.Inject -class HomeDataSource @Inject constructor( - private val homeService : HomeService -){ +class GoalDataSource @Inject constructor( + private val goalService: GoalService +) { suspend fun fetchHomeEntire(): ApiResult = - safeApiCall { homeService.fetchHomeEntire() } + safeApiCall { goalService.fetchHomeEntire() } } diff --git a/app/src/main/java/org/keepgoeat/data/repository/HomeRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt similarity index 65% rename from app/src/main/java/org/keepgoeat/data/repository/HomeRepositoryImpl.kt rename to app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index ed8168cd..1d1b7387 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/HomeRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -1,20 +1,20 @@ package org.keepgoeat.data.repository import org.keepgoeat.data.ApiResult -import org.keepgoeat.data.datasource.remote.HomeDataSource +import org.keepgoeat.data.datasource.remote.GoalDataSource import org.keepgoeat.data.model.response.ResponseHome -import org.keepgoeat.domain.repository.HomeRepository +import org.keepgoeat.domain.repository.GoalRepository import timber.log.Timber import javax.inject.Inject -class HomeRepositoryImpl @Inject constructor( - private val homeDataSource: HomeDataSource, -) : HomeRepository { +class GoalRepositoryImpl @Inject constructor( + private val goalDataSource: GoalDataSource, +) : GoalRepository { override suspend fun fetchHome(): ResponseHome.HomeData? { - val result = homeDataSource.fetchHomeEntire() + val result = goalDataSource.fetchHomeEntire() return when (result) { is ApiResult.Success -> { - result.data?.homeData + result.data?.data } is ApiResult.NetworkError -> { Timber.d("Network Error") diff --git a/app/src/main/java/org/keepgoeat/data/service/HomeService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt similarity index 90% rename from app/src/main/java/org/keepgoeat/data/service/HomeService.kt rename to app/src/main/java/org/keepgoeat/data/service/GoalService.kt index 992c7975..4d01920c 100644 --- a/app/src/main/java/org/keepgoeat/data/service/HomeService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -4,7 +4,7 @@ import org.keepgoeat.data.model.response.ResponseHome import retrofit2.Response import retrofit2.http.GET -interface HomeService { +interface GoalService { @GET("home") suspend fun fetchHomeEntire(): Response } diff --git a/app/src/main/java/org/keepgoeat/domain/repository/HomeRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt similarity index 84% rename from app/src/main/java/org/keepgoeat/domain/repository/HomeRepository.kt rename to app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 37c56fa3..c109f0bc 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/HomeRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -2,6 +2,6 @@ package org.keepgoeat.domain.repository import org.keepgoeat.data.model.response.ResponseHome -interface HomeRepository { +interface GoalRepository { suspend fun fetchHome(): ResponseHome.HomeData? } \ No newline at end of file From f87f05aae4ec6fbdc056be42753b31ecac02937e Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 9 Jan 2023 03:34:38 +0900 Subject: [PATCH 192/745] =?UTF-8?q?[feat]=20#68=20Hilt=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/keepgoeat/di/RepositoryModule.kt | 8 ++++++++ app/src/main/java/org/keepgoeat/di/ServiceModule.kt | 8 ++++++++ .../java/org/keepgoeat/presentation/home/HomeActivity.kt | 2 ++ .../java/org/keepgoeat/presentation/home/HomeViewModel.kt | 6 +++--- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt b/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt index d3d75e7f..a9e3a8f1 100644 --- a/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt +++ b/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt @@ -5,7 +5,9 @@ import dagger.Module import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import org.keepgoeat.data.repository.DummyRepositoryImpl +import org.keepgoeat.data.repository.GoalRepositoryImpl import org.keepgoeat.domain.repository.DummyRepository +import org.keepgoeat.domain.repository.GoalRepository import javax.inject.Singleton @Module @@ -16,4 +18,10 @@ interface RepositoryModule { fun bindDummyRepository( dummyRepositoryImpl: DummyRepositoryImpl, ): DummyRepository + + @Binds + @Singleton + fun bindGoalRepository( + goalRepositoryImpl: GoalRepositoryImpl, + ): GoalRepository } diff --git a/app/src/main/java/org/keepgoeat/di/ServiceModule.kt b/app/src/main/java/org/keepgoeat/di/ServiceModule.kt index e1fdd008..55945558 100644 --- a/app/src/main/java/org/keepgoeat/di/ServiceModule.kt +++ b/app/src/main/java/org/keepgoeat/di/ServiceModule.kt @@ -1,11 +1,14 @@ package org.keepgoeat.di +import android.view.ViewDebug.ExportedProperty import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import org.keepgoeat.data.service.DummyService +import org.keepgoeat.data.service.GoalService import retrofit2.Retrofit +import retrofit2.create import javax.inject.Singleton @Module @@ -15,4 +18,9 @@ object ServiceModule { @Provides fun provideDummyService(retrofit: Retrofit): DummyService = retrofit.create(DummyService::class.java) + + @Singleton + @Provides + fun provideGoalService(retrofit: Retrofit): GoalService = + retrofit.create(GoalService::class.java) } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index af3497b7..988e64a7 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -3,6 +3,7 @@ package org.keepgoeat.presentation.home import android.content.Intent import android.os.Bundle import androidx.activity.viewModels +import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.ActivityHomeBinding import org.keepgoeat.domain.model.HomeMyGoal @@ -11,6 +12,7 @@ import org.keepgoeat.presentation.my.MyActivity import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.binding.BindingActivity +@AndroidEntryPoint class HomeActivity : BindingActivity(R.layout.activity_home) { private val viewModel: HomeViewModel by viewModels() private lateinit var goalAdapter: HomeMyGoalAdapter diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 5804a2c3..477ee4d3 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -7,14 +7,14 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import org.keepgoeat.domain.model.HomeMyGoal -import org.keepgoeat.domain.repository.HomeRepository +import org.keepgoeat.domain.repository.GoalRepository import org.keepgoeat.presentation.type.HomeGoalViewType import java.time.LocalDateTime import javax.inject.Inject @HiltViewModel class HomeViewModel @Inject constructor( - private val homeRepository: HomeRepository + private val goalRepository: GoalRepository ) : ViewModel() { private val _goalList = MutableLiveData>() val goalList: LiveData> get() = _goalList @@ -44,7 +44,7 @@ class HomeViewModel @Inject constructor( private fun fetchGoalList() { viewModelScope.launch { - homeRepository.fetchHome()?.let { homeData -> + goalRepository.fetchHome()?.let { homeData -> _cheeringMessage.value = homeData.cheeringMessage _goalList.value = homeData.toHomeMyGoal().toMutableList() } From f141816189ab5229da3c4c201c4da72cc779daf7 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 9 Jan 2023 03:43:14 +0900 Subject: [PATCH 193/745] =?UTF-8?q?[chore]=20#68=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/keepgoeat/di/ServiceModule.kt | 2 -- .../main/java/org/keepgoeat/domain/repository/GoalRepository.kt | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/di/ServiceModule.kt b/app/src/main/java/org/keepgoeat/di/ServiceModule.kt index 55945558..79198044 100644 --- a/app/src/main/java/org/keepgoeat/di/ServiceModule.kt +++ b/app/src/main/java/org/keepgoeat/di/ServiceModule.kt @@ -1,6 +1,5 @@ package org.keepgoeat.di -import android.view.ViewDebug.ExportedProperty import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -8,7 +7,6 @@ import dagger.hilt.components.SingletonComponent import org.keepgoeat.data.service.DummyService import org.keepgoeat.data.service.GoalService import retrofit2.Retrofit -import retrofit2.create import javax.inject.Singleton @Module diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index c109f0bc..67acdf3d 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -4,4 +4,4 @@ import org.keepgoeat.data.model.response.ResponseHome interface GoalRepository { suspend fun fetchHome(): ResponseHome.HomeData? -} \ No newline at end of file +} From 62bad66f9be4fbfef991b6841e8a52213b4d48dd Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 9 Jan 2023 13:51:47 +0900 Subject: [PATCH 194/745] =?UTF-8?q?[chore]=20#68=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/GoalDataSource.kt | 4 ++-- .../data/model/response/ResponseHome.kt | 6 ++--- .../data/repository/GoalRepositoryImpl.kt | 4 ++-- .../org/keepgoeat/data/service/GoalService.kt | 2 +- .../model/{HomeMyGoal.kt => HomeGoal.kt} | 2 +- .../domain/repository/GoalRepository.kt | 2 +- .../presentation/home/HomeActivity.kt | 4 ++-- .../presentation/home/HomeMyGoalAdapter.kt | 12 +++++----- .../presentation/home/HomeViewModel.kt | 24 +++++++++---------- app/src/main/res/layout/item_home_goal.xml | 2 +- 10 files changed, 31 insertions(+), 31 deletions(-) rename app/src/main/java/org/keepgoeat/domain/model/{HomeMyGoal.kt => HomeGoal.kt} (91%) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index 9d037505..98f4d3ad 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -9,6 +9,6 @@ import javax.inject.Inject class GoalDataSource @Inject constructor( private val goalService: GoalService ) { - suspend fun fetchHomeEntire(): ApiResult = - safeApiCall { goalService.fetchHomeEntire() } + suspend fun fetchHomeEntireData(): ApiResult = + safeApiCall { goalService.fetchHomeEntireData() } } diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseHome.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseHome.kt index 7eb7746f..1e2a8ded 100644 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseHome.kt +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseHome.kt @@ -1,7 +1,7 @@ package org.keepgoeat.data.model.response import kotlinx.serialization.Serializable -import org.keepgoeat.domain.model.HomeMyGoal +import org.keepgoeat.domain.model.HomeGoal import org.keepgoeat.presentation.type.HomeGoalViewType @Serializable @@ -32,8 +32,8 @@ data class ResponseHome( val writerId: Int ) - fun toHomeMyGoal() = goals.map { goal -> - HomeMyGoal( + fun toHomeGoal() = goals.map { goal -> + HomeGoal( goal.goalId, goal.goalContent, goal.isMore, diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index 1d1b7387..b6f0286b 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -10,8 +10,8 @@ import javax.inject.Inject class GoalRepositoryImpl @Inject constructor( private val goalDataSource: GoalDataSource, ) : GoalRepository { - override suspend fun fetchHome(): ResponseHome.HomeData? { - val result = goalDataSource.fetchHomeEntire() + override suspend fun fetchHomeEntireData(): ResponseHome.HomeData? { + val result = goalDataSource.fetchHomeEntireData() return when (result) { is ApiResult.Success -> { result.data?.data diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index 4d01920c..e37397e7 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -6,5 +6,5 @@ import retrofit2.http.GET interface GoalService { @GET("home") - suspend fun fetchHomeEntire(): Response + suspend fun fetchHomeEntireData(): Response } diff --git a/app/src/main/java/org/keepgoeat/domain/model/HomeMyGoal.kt b/app/src/main/java/org/keepgoeat/domain/model/HomeGoal.kt similarity index 91% rename from app/src/main/java/org/keepgoeat/domain/model/HomeMyGoal.kt rename to app/src/main/java/org/keepgoeat/domain/model/HomeGoal.kt index 818d0623..d95b6c43 100644 --- a/app/src/main/java/org/keepgoeat/domain/model/HomeMyGoal.kt +++ b/app/src/main/java/org/keepgoeat/domain/model/HomeGoal.kt @@ -2,7 +2,7 @@ package org.keepgoeat.domain.model import org.keepgoeat.presentation.type.HomeGoalViewType -data class HomeMyGoal( +data class HomeGoal( val id: Int, val goalTitle: String, val isMore: Boolean, diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 67acdf3d..afd9418e 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -3,5 +3,5 @@ package org.keepgoeat.domain.repository import org.keepgoeat.data.model.response.ResponseHome interface GoalRepository { - suspend fun fetchHome(): ResponseHome.HomeData? + suspend fun fetchHomeEntireData(): ResponseHome.HomeData? } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 988e64a7..8f46a657 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -6,7 +6,7 @@ import androidx.activity.viewModels import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.ActivityHomeBinding -import org.keepgoeat.domain.model.HomeMyGoal +import org.keepgoeat.domain.model.HomeGoal import org.keepgoeat.presentation.detail.GoalDetailActivity import org.keepgoeat.presentation.my.MyActivity import org.keepgoeat.presentation.type.EatingType @@ -72,7 +72,7 @@ class HomeActivity : BindingActivity(R.layout.activity_home startActivity(intent) } - private fun changeGoalItemBtnColor(myGoal: HomeMyGoal) { + private fun changeGoalItemBtnColor(myGoal: HomeGoal) { viewModel.changeGoalAchieved(myGoal) } } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt index 59559af9..8ad05f50 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt @@ -8,7 +8,7 @@ import androidx.recyclerview.widget.RecyclerView import org.keepgoeat.R import org.keepgoeat.databinding.ItemAddGoalBinding import org.keepgoeat.databinding.ItemHomeGoalBinding -import org.keepgoeat.domain.model.HomeMyGoal +import org.keepgoeat.domain.model.HomeGoal import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.presentation.type.HomeBtnType import org.keepgoeat.presentation.type.HomeGoalViewType @@ -16,10 +16,10 @@ import org.keepgoeat.util.ItemDiffCallback import org.keepgoeat.util.setVisibility class HomeMyGoalAdapter( - private val changeBtnColor: (HomeMyGoal) -> Unit, + private val changeBtnColor: (HomeGoal) -> Unit, private val moveToDetail: (EatingType, Int) -> Unit -) : ListAdapter( - ItemDiffCallback( +) : ListAdapter( + ItemDiffCallback( onContentsTheSame = { old, new -> old == new }, onItemsTheSame = { old, new -> old.id == new.id } ) @@ -31,9 +31,9 @@ class HomeMyGoalAdapter( ) : RecyclerView.ViewHolder(binding.root) { var layout = binding fun bind( - myGoal: HomeMyGoal, + myGoal: HomeGoal, eatingType: EatingType, - changeBtnColor: (HomeMyGoal) -> Unit, + changeBtnColor: (HomeGoal) -> Unit, moveToDetail: (EatingType, Int) -> Unit ) { val btnType: HomeBtnType = if (eatingType == EatingType.MORE) { // 더 먹기인 경우 diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 477ee4d3..7d5338d9 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -6,7 +6,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch -import org.keepgoeat.domain.model.HomeMyGoal +import org.keepgoeat.domain.model.HomeGoal import org.keepgoeat.domain.repository.GoalRepository import org.keepgoeat.presentation.type.HomeGoalViewType import java.time.LocalDateTime @@ -16,8 +16,8 @@ import javax.inject.Inject class HomeViewModel @Inject constructor( private val goalRepository: GoalRepository ) : ViewModel() { - private val _goalList = MutableLiveData>() - val goalList: LiveData> get() = _goalList + private val _goalList = MutableLiveData>() + val goalList: LiveData> get() = _goalList private val _goalCount = MutableLiveData() val goalCount: LiveData get() = _goalCount private val _hour = MutableLiveData(LocalDateTime.now().hour) @@ -29,12 +29,12 @@ class HomeViewModel @Inject constructor( fetchGoalList() } - fun changeGoalAchieved(myGoal: HomeMyGoal) { + fun changeGoalAchieved(myGoal: HomeGoal) { val position = goalList.value?.indexOf(myGoal) ?: return with(myGoal) { _goalList.value?.set( position, - HomeMyGoal( + HomeGoal( id, goalTitle, isMore, !isAchieved, thisMonthCount, type ) ) @@ -44,14 +44,14 @@ class HomeViewModel @Inject constructor( private fun fetchGoalList() { viewModelScope.launch { - goalRepository.fetchHome()?.let { homeData -> + goalRepository.fetchHomeEntireData()?.let { homeData -> _cheeringMessage.value = homeData.cheeringMessage - _goalList.value = homeData.toHomeMyGoal().toMutableList() + _goalList.value = homeData.toHomeGoal().toMutableList() } } var myGoalList = mutableListOf( - HomeMyGoal( + HomeGoal( 1, "하루 1끼 이상 야채 더 먹기", true, @@ -59,7 +59,7 @@ class HomeViewModel @Inject constructor( 8, HomeGoalViewType.MY_GOAL_TYPE ), - HomeMyGoal( + HomeGoal( 2, "라면 덜 먹기", false, @@ -67,7 +67,7 @@ class HomeViewModel @Inject constructor( 8, HomeGoalViewType.MY_GOAL_TYPE ), - HomeMyGoal( + HomeGoal( 3, "커피 덜 먹기", true, @@ -78,7 +78,7 @@ class HomeViewModel @Inject constructor( ) // val myGoalList = emptyList() val addGoalBtn = mutableListOf( - HomeMyGoal( + HomeGoal( 0, "", false, @@ -87,7 +87,7 @@ class HomeViewModel @Inject constructor( HomeGoalViewType.ADD_GOAL_TYPE ) ) - var homeList = mutableListOf() + var homeList = mutableListOf() homeList.addAll(myGoalList) if (myGoalList.size > 0) homeList.addAll(addGoalBtn) diff --git a/app/src/main/res/layout/item_home_goal.xml b/app/src/main/res/layout/item_home_goal.xml index 47b380d5..ad1394db 100644 --- a/app/src/main/res/layout/item_home_goal.xml +++ b/app/src/main/res/layout/item_home_goal.xml @@ -8,7 +8,7 @@ + type="org.keepgoeat.domain.model.HomeGoal" /> Date: Mon, 9 Jan 2023 15:47:46 +0900 Subject: [PATCH 195/745] =?UTF-8?q?[mod]=20#68=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EA=B0=9C=EC=88=98=EC=97=90=20=EB=94=B0=EB=9D=BC=20=ED=91=B8?= =?UTF-8?q?=ED=84=B0=20=EB=B6=99=EC=9D=B4=EB=8A=94=20=EB=A1=9C=EC=A7=81=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 --- .../presentation/home/HomeActivity.kt | 3 +- .../presentation/home/HomeMyGoalAdapter.kt | 17 +++++++ .../presentation/home/HomeViewModel.kt | 48 +------------------ 3 files changed, 21 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 8f46a657..1a135b4a 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -10,6 +10,7 @@ import org.keepgoeat.domain.model.HomeGoal import org.keepgoeat.presentation.detail.GoalDetailActivity import org.keepgoeat.presentation.my.MyActivity import org.keepgoeat.presentation.type.EatingType +import org.keepgoeat.presentation.type.HomeGoalViewType import org.keepgoeat.util.binding.BindingActivity @AndroidEntryPoint @@ -47,7 +48,7 @@ class HomeActivity : BindingActivity(R.layout.activity_home } private fun addObservers() { - viewModel.goalList.observe(this) { goalList -> + viewModel.goalList.observe(this) { goalList -> // EventObserver goalAdapter.submitList(goalList.toMutableList()) } viewModel.goalCount.observe(this) { goalCount -> diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt index 8ad05f50..a2b30096 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt @@ -112,4 +112,21 @@ class HomeMyGoalAdapter( } override fun getItemViewType(position: Int): Int = currentList[position].type.goalType + + override fun submitList(list: MutableList?) { + super.submitList( + list?.plus( + mutableListOf( + HomeGoal( + 0, + "", + false, + false, + 0, + HomeGoalViewType.ADD_GOAL_TYPE + ) + ) + ) + ) + } } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 7d5338d9..99b513e6 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -8,7 +8,6 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import org.keepgoeat.domain.model.HomeGoal import org.keepgoeat.domain.repository.GoalRepository -import org.keepgoeat.presentation.type.HomeGoalViewType import java.time.LocalDateTime import javax.inject.Inject @@ -16,7 +15,7 @@ import javax.inject.Inject class HomeViewModel @Inject constructor( private val goalRepository: GoalRepository ) : ViewModel() { - private val _goalList = MutableLiveData>() + private var _goalList = MutableLiveData>() val goalList: LiveData> get() = _goalList private val _goalCount = MutableLiveData() val goalCount: LiveData get() = _goalCount @@ -47,51 +46,8 @@ class HomeViewModel @Inject constructor( goalRepository.fetchHomeEntireData()?.let { homeData -> _cheeringMessage.value = homeData.cheeringMessage _goalList.value = homeData.toHomeGoal().toMutableList() + _goalCount.value = homeData.goals.size } } - - var myGoalList = mutableListOf( - HomeGoal( - 1, - "하루 1끼 이상 야채 더 먹기", - true, - true, - 8, - HomeGoalViewType.MY_GOAL_TYPE - ), - HomeGoal( - 2, - "라면 덜 먹기", - false, - false, - 8, - HomeGoalViewType.MY_GOAL_TYPE - ), - HomeGoal( - 3, - "커피 덜 먹기", - true, - false, - 30, - HomeGoalViewType.MY_GOAL_TYPE - ) - ) -// val myGoalList = emptyList() - val addGoalBtn = mutableListOf( - HomeGoal( - 0, - "", - false, - false, - 0, - HomeGoalViewType.ADD_GOAL_TYPE - ) - ) - var homeList = mutableListOf() - homeList.addAll(myGoalList) - if (myGoalList.size > 0) - homeList.addAll(addGoalBtn) - _goalList.value = homeList.toMutableList() - _goalCount.value = myGoalList.size } } From 081247e522d193d2824981f5421d64ade8e250a2 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 9 Jan 2023 15:50:14 +0900 Subject: [PATCH 196/745] =?UTF-8?q?[chore]=20#68=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/presentation/home/HomeActivity.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 1a135b4a..172ccbb4 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -10,7 +10,6 @@ import org.keepgoeat.domain.model.HomeGoal import org.keepgoeat.presentation.detail.GoalDetailActivity import org.keepgoeat.presentation.my.MyActivity import org.keepgoeat.presentation.type.EatingType -import org.keepgoeat.presentation.type.HomeGoalViewType import org.keepgoeat.util.binding.BindingActivity @AndroidEntryPoint From 63a5cdf871a6b26972a1b152d4c5b51bb8970f89 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 9 Jan 2023 17:13:11 +0900 Subject: [PATCH 197/745] =?UTF-8?q?[feat]=20#73=20=EB=AA=A9=ED=91=9C?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20api=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/GoalDataSource.kt | 5 ++++ .../data/model/request/RequestGoalContent.kt | 9 ++++++++ .../model/response/ResponseGoalContent.kt | 18 +++++++++++++++ .../data/repository/GoalRepositoryImpl.kt | 20 ++++++++++++++++ .../org/keepgoeat/data/service/GoalService.kt | 7 ++++++ .../domain/repository/GoalRepository.kt | 2 ++ .../setting/GoalSettingActivity.kt | 13 +++++++++++ .../setting/GoalSettingViewModel.kt | 23 +++++++++++++++---- .../main/res/layout/activity_goal_setting.xml | 1 + 9 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/data/model/request/RequestGoalContent.kt create mode 100644 app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalContent.kt diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index 98f4d3ad..ec62bb9e 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -1,6 +1,8 @@ package org.keepgoeat.data.datasource.remote import org.keepgoeat.data.ApiResult +import org.keepgoeat.data.model.request.RequestGoalContent +import org.keepgoeat.data.model.response.ResponseGoalContent import org.keepgoeat.data.model.response.ResponseHome import org.keepgoeat.data.service.GoalService import org.keepgoeat.util.safeApiCall @@ -11,4 +13,7 @@ class GoalDataSource @Inject constructor( ) { suspend fun fetchHomeEntireData(): ApiResult = safeApiCall { goalService.fetchHomeEntireData() } + + suspend fun uploadGoalContent(requestGoalContent: RequestGoalContent): ApiResult = + safeApiCall { goalService.uploadGoalContent(requestGoalContent) } } diff --git a/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalContent.kt b/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalContent.kt new file mode 100644 index 00000000..0581f0d2 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalContent.kt @@ -0,0 +1,9 @@ +package org.keepgoeat.data.model.request + +import kotlinx.serialization.Serializable + +@Serializable +data class RequestGoalContent( + val goalContent: String, + val isMore: Boolean, +) diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalContent.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalContent.kt new file mode 100644 index 00000000..d3ee7645 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalContent.kt @@ -0,0 +1,18 @@ +package org.keepgoeat.data.model.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ResponseGoalContent( + val status: Int, + val success: Boolean, + val message: String, + val data: ResponseGoalContentData, +) { + @Serializable + data class ResponseGoalContentData( + @SerialName("goalId") + val id: Int, + ) +} diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index b6f0286b..688f94f0 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -2,6 +2,8 @@ package org.keepgoeat.data.repository import org.keepgoeat.data.ApiResult import org.keepgoeat.data.datasource.remote.GoalDataSource +import org.keepgoeat.data.model.request.RequestGoalContent +import org.keepgoeat.data.model.response.ResponseGoalContent import org.keepgoeat.data.model.response.ResponseHome import org.keepgoeat.domain.repository.GoalRepository import timber.log.Timber @@ -26,4 +28,22 @@ class GoalRepositoryImpl @Inject constructor( } } } + + override suspend fun uploadGoalContent(title: String, isMore: Boolean): ResponseGoalContent.ResponseGoalContentData? { + val result = goalDataSource.uploadGoalContent(RequestGoalContent(title, isMore)) + + return when (result) { + is ApiResult.Success -> { + result.data?.data + } + is ApiResult.NetworkError -> { + Timber.d("Network Error") + null + } + is ApiResult.GenericError -> { + Timber.d("(${result.code}): ${result.message}") + null + } + } + } } diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index e37397e7..f2f6c357 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -1,10 +1,17 @@ package org.keepgoeat.data.service +import org.keepgoeat.data.model.request.RequestGoalContent +import org.keepgoeat.data.model.response.ResponseGoalContent import org.keepgoeat.data.model.response.ResponseHome import retrofit2.Response +import retrofit2.http.Body import retrofit2.http.GET +import retrofit2.http.POST interface GoalService { @GET("home") suspend fun fetchHomeEntireData(): Response + + @POST("goal") + suspend fun uploadGoalContent(@Body request: RequestGoalContent): Response } diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index afd9418e..91a33d3c 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -1,7 +1,9 @@ package org.keepgoeat.domain.repository +import org.keepgoeat.data.model.response.ResponseGoalContent import org.keepgoeat.data.model.response.ResponseHome interface GoalRepository { suspend fun fetchHomeEntireData(): ResponseHome.HomeData? + suspend fun uploadGoalContent(title: String, isMore: Boolean): ResponseGoalContent.ResponseGoalContentData? } diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt index 3db67fa4..7dffa18f 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt @@ -6,6 +6,7 @@ import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.ActivityGoalSettingBinding import org.keepgoeat.presentation.type.EatingType +import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity import org.keepgoeat.util.extension.showKeyboard import org.keepgoeat.util.safeValueOf @@ -25,6 +26,18 @@ class GoalSettingActivity : BindingActivity(R.layout } addListeners() + addObservers() + } + + private fun addObservers() { + viewModel.uploadState.observe(this) { state -> + when (state) { + is UiState.Success -> { + finish() + } + else -> {} + } + } } private fun addListeners() { diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt index e62ed375..d77e8dec 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt @@ -1,15 +1,17 @@ package org.keepgoeat.presentation.setting -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.Transformations -import androidx.lifecycle.ViewModel +import androidx.lifecycle.* import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import org.keepgoeat.domain.repository.GoalRepository import org.keepgoeat.presentation.type.EatingType +import org.keepgoeat.util.UiState import javax.inject.Inject @HiltViewModel -class GoalSettingViewModel @Inject constructor() : ViewModel() { +class GoalSettingViewModel @Inject constructor( + private val goalRepository: GoalRepository, +) : ViewModel() { val goalTitle = MutableLiveData() private val _eatingType = MutableLiveData() val eatingType: LiveData get() = _eatingType @@ -19,6 +21,17 @@ class GoalSettingViewModel @Inject constructor() : ViewModel() { title.length in 1..20 && title.isNotBlank() && title.matches(TITLE_PATTERN.toRegex()) } + private val _uploadState = MutableLiveData>(UiState.Loading) + val uploadState: LiveData> get() = _uploadState + + fun uploadGoal() { + viewModelScope.launch { + goalRepository.uploadGoalContent(goalTitle.value ?: return@launch, eatingType.value == EatingType.MORE).let { result -> + _uploadState.value = if (result?.id != null) UiState.Success(result.id) else UiState.Empty + } + } + } + fun setEatingType(eatingType: EatingType) { _eatingType.value = eatingType } diff --git a/app/src/main/res/layout/activity_goal_setting.xml b/app/src/main/res/layout/activity_goal_setting.xml index d2df3f39..ec33c545 100644 --- a/app/src/main/res/layout/activity_goal_setting.xml +++ b/app/src/main/res/layout/activity_goal_setting.xml @@ -136,6 +136,7 @@ android:layout_marginBottom="42dp" android:backgroundTint="@color/selector_complete_button_color" android:enabled="@{viewModel.isValidTitle}" + android:onClick="@{() -> viewModel.uploadGoal()}" android:text="@string/complete" android:textColor="@color/selector_complete_button_text_color" app:layout_constraintBottom_toBottomOf="parent" From beb8b9ab6ec801686c53d1e6baba3188682090af Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 9 Jan 2023 17:13:47 +0900 Subject: [PATCH 198/745] =?UTF-8?q?[feat]=20#73=20=ED=99=88=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=ED=91=B8=ED=84=B0=20=ED=81=B4=EB=A6=AD=20=EC=8B=9C?= =?UTF-8?q?=20=EB=AA=A9=ED=91=9C=20=EC=B6=94=EA=B0=80=20=EB=8B=A4=EC=9D=B4?= =?UTF-8?q?=EC=96=BC=EB=A1=9C=EA=B7=B8=20=EB=9D=84=EC=9A=B0=EA=B8=B0=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 --- .../keepgoeat/presentation/home/HomeActivity.kt | 2 +- .../presentation/home/HomeMyGoalAdapter.kt | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 172ccbb4..875e3a4a 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -39,7 +39,7 @@ class HomeActivity : BindingActivity(R.layout.activity_home } private fun initLayout() { - goalAdapter = HomeMyGoalAdapter(::changeGoalItemBtnColor, ::moveToDetail) + goalAdapter = HomeMyGoalAdapter(::changeGoalItemBtnColor, ::moveToDetail, ::showMakeGoalDialog) binding.rvMyGoals.apply { itemAnimator = null adapter = goalAdapter diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt index a2b30096..3063f0a5 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt @@ -17,7 +17,8 @@ import org.keepgoeat.util.setVisibility class HomeMyGoalAdapter( private val changeBtnColor: (HomeGoal) -> Unit, - private val moveToDetail: (EatingType, Int) -> Unit + private val moveToDetail: (EatingType, Int) -> Unit, + private val showMakeGoalDialog: () -> Unit, ) : ListAdapter( ItemDiffCallback( onContentsTheSame = { old, new -> old == new }, @@ -27,14 +28,14 @@ class HomeMyGoalAdapter( private lateinit var inflater: LayoutInflater class MyGoalViewHolder( - private val binding: ItemHomeGoalBinding + private val binding: ItemHomeGoalBinding, ) : RecyclerView.ViewHolder(binding.root) { var layout = binding fun bind( myGoal: HomeGoal, eatingType: EatingType, changeBtnColor: (HomeGoal) -> Unit, - moveToDetail: (EatingType, Int) -> Unit + moveToDetail: (EatingType, Int) -> Unit, ) { val btnType: HomeBtnType = if (eatingType == EatingType.MORE) { // 더 먹기인 경우 if (myGoal.isAchieved) { @@ -65,10 +66,10 @@ class HomeMyGoalAdapter( } class AddGoalViewHolder( - private val binding: ItemAddGoalBinding + private val binding: ItemAddGoalBinding, ) : RecyclerView.ViewHolder(binding.root) { var layout = binding - fun bind(goalCount: Int) { + fun bind(goalCount: Int, showMakeGoalDialog: () -> Unit) { when (goalCount) { 0 -> binding.layoutGoalInfo.visibility = View.GONE 1 -> binding.tvAddMoreGoal.setText(R.string.home_two_more_goal) @@ -78,6 +79,10 @@ class HomeMyGoalAdapter( binding.btnMakeGoal.setVisibility(false) } } + + binding.root.setOnClickListener { + showMakeGoalDialog() + } } } @@ -107,7 +112,7 @@ class HomeMyGoalAdapter( } } // TODO 서버통신 데이터클래스로 변경하면 size 정보 받아온걸로 바꾸기 - is AddGoalViewHolder -> holder.bind(currentList.size - 1) + is AddGoalViewHolder -> holder.bind(currentList.size - 1, showMakeGoalDialog) } } From d0c385ea645e4bc7fb55ba8594bb18f43221fd82 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 9 Jan 2023 17:14:05 +0900 Subject: [PATCH 199/745] =?UTF-8?q?[chore]=20#73=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/presentation/home/HomeBottomDialogFragment.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeBottomDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeBottomDialogFragment.kt index 260cc61c..26a720f7 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeBottomDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeBottomDialogFragment.kt @@ -19,11 +19,9 @@ class HomeBottomDialogFragment : private fun addListeners() { binding.layoutHomeBottomMore.setOnClickListener { moveToSetting(EatingType.MORE) - dismiss() } binding.layoutHomeBottomLess.setOnClickListener { moveToSetting(EatingType.LESS) - dismiss() } } @@ -31,5 +29,6 @@ class HomeBottomDialogFragment : val intent = Intent(requireActivity(), GoalSettingActivity::class.java) intent.putExtra(GoalSettingActivity.ARG_EATING_TYPE, eatingType.name) startActivity(intent) + dismiss() } } From 91443e4177ffa0eef28f5befdd0f2508ba343e24 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 9 Jan 2023 18:48:43 +0900 Subject: [PATCH 200/745] =?UTF-8?q?[feat]=20#73=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=EC=84=B1=EA=B3=B5=20=EC=8B=9C=20?= =?UTF-8?q?=ED=99=88=EC=97=90=EC=84=9C=20=EB=AA=A9=ED=91=9C=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20api=20=ED=98=B8=EC=B6=9C=ED=95=98=EB=8F=84=EB=A1=9D?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/home/HomeViewModel.kt | 2 +- .../presentation/setting/GoalSettingActivity.kt | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 99b513e6..2a882bb6 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -13,7 +13,7 @@ import javax.inject.Inject @HiltViewModel class HomeViewModel @Inject constructor( - private val goalRepository: GoalRepository + private val goalRepository: GoalRepository, ) : ViewModel() { private var _goalList = MutableLiveData>() val goalList: LiveData> get() = _goalList diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt index 7dffa18f..2336c5e1 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt @@ -1,10 +1,12 @@ package org.keepgoeat.presentation.setting +import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.ActivityGoalSettingBinding +import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity @@ -33,7 +35,7 @@ class GoalSettingActivity : BindingActivity(R.layout viewModel.uploadState.observe(this) { state -> when (state) { is UiState.Success -> { - finish() + moveToHome() } else -> {} } @@ -50,6 +52,12 @@ class GoalSettingActivity : BindingActivity(R.layout } } + private fun moveToHome() { + val intent = Intent(this, HomeActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + startActivity(intent) + } + companion object { const val ARG_EATING_TYPE = "eatingType" } From 5a0edebc4d53826fb2040dc0e6a145983279a234 Mon Sep 17 00:00:00 2001 From: Daeun Date: Mon, 9 Jan 2023 23:03:52 +0900 Subject: [PATCH 201/745] =?UTF-8?q?[add]=20#74=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=B7=B0=EC=97=90=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20string=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/values/strings.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 934ed2c9..5b2cb7b5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -75,11 +75,12 @@ 전체 - 더먹기 - 덜먹기 + %s 더 먹기 + %s 덜 먹기 보관한 목표 총 달성일 진행기간 %s. %s. %s ~ %s. %s. %s 네, 삭제할래요 + \ No newline at end of file From 2798f7e9ebd047ce3eafd5ee9b9cc1324c7a4297 Mon Sep 17 00:00:00 2001 From: Daeun Date: Mon, 9 Jan 2023 23:13:01 +0900 Subject: [PATCH 202/745] =?UTF-8?q?[add]=20#74=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=20=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20titleStrRes=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?=EC=B4=9D=20=EB=8B=AC=EC=84=B1=EC=9D=BC=20=EC=83=89=EC=83=81=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/presentation/type/EatingType.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt b/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt index 4844ff21..f16f05e6 100644 --- a/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt +++ b/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt @@ -9,6 +9,7 @@ import org.keepgoeat.R enum class EatingType( @StringRes val strRes: Int, + @StringRes val titleStrRes: Int, @DrawableRes val snailStickerRes: Int, @DrawableRes val defaultStickerRes: Int, @DrawableRes val tagIconRes: Int, @@ -24,6 +25,7 @@ enum class EatingType( ) { LESS( R.string.eating_type_less, + R.string.title_less, R.drawable.ic_snail_green_sticker, R.drawable.ic_default_green_sticker, R.drawable.ic_eating_less_tag_minus, @@ -39,6 +41,7 @@ enum class EatingType( ), MORE( R.string.eating_type_more, + R.string.title_more, R.drawable.ic_snail_orange_sticker, R.drawable.ic_default_orange_sticker, R.drawable.ic_eating_more_tag_plus, @@ -49,7 +52,7 @@ enum class EatingType( R.color.orange_600, R.color.gray_50, R.color.orange_700, - R.color.green_500, + R.color.orange_500, Color.parseColor("#FFF0EB"), ) } From d0a71438defd677743c0ac61399919bb10ab140f Mon Sep 17 00:00:00 2001 From: Daeun Date: Mon, 9 Jan 2023 23:15:36 +0900 Subject: [PATCH 203/745] =?UTF-8?q?[feat]=20#74=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20api=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/MyDataSource.kt | 16 +++++++ .../data/model/response/ResponseMy.kt | 42 +++++++++++++++++++ .../data/repository/MyRepositoryImpl.kt | 29 +++++++++++++ .../org/keepgoeat/data/service/MyService.kt | 13 ++++++ .../java/org/keepgoeat/di/NetworkModule.kt | 24 ++++++++++- .../java/org/keepgoeat/di/RepositoryModule.kt | 8 ++++ .../java/org/keepgoeat/di/ServiceModule.kt | 6 +++ .../java/org/keepgoeat/domain/model/MyGoal.kt | 10 +++++ .../domain/repository/MyRepository.kt | 7 ++++ .../keepgoeat/presentation/my/MyActivity.kt | 15 ++----- .../presentation/my/MyGoalAdapter.kt | 19 ++++++--- .../keepgoeat/presentation/my/MyViewModel.kt | 35 +++++++--------- .../keepgoeat/presentation/type/SortType.kt | 5 +++ .../java/org/keepgoeat/util/BindingAdatper.kt | 12 ++++-- app/src/main/res/layout/item_my_goal.xml | 20 +++++---- app/src/main/res/layout/layout_my_header.xml | 4 +- 16 files changed, 215 insertions(+), 50 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/data/datasource/remote/MyDataSource.kt create mode 100644 app/src/main/java/org/keepgoeat/data/model/response/ResponseMy.kt create mode 100644 app/src/main/java/org/keepgoeat/data/repository/MyRepositoryImpl.kt create mode 100644 app/src/main/java/org/keepgoeat/data/service/MyService.kt create mode 100644 app/src/main/java/org/keepgoeat/domain/model/MyGoal.kt create mode 100644 app/src/main/java/org/keepgoeat/domain/repository/MyRepository.kt create mode 100644 app/src/main/java/org/keepgoeat/presentation/type/SortType.kt diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/MyDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/MyDataSource.kt new file mode 100644 index 00000000..2457be3e --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/MyDataSource.kt @@ -0,0 +1,16 @@ +package org.keepgoeat.data.datasource.remote + +import org.keepgoeat.data.ApiResult +import org.keepgoeat.data.model.response.ResponseHome +import org.keepgoeat.data.model.response.ResponseMy +import org.keepgoeat.data.service.MyService +import org.keepgoeat.presentation.type.SortType +import org.keepgoeat.util.safeApiCall +import javax.inject.Inject + +class MyDataSource @Inject constructor( + private val myService: MyService +) { + suspend fun fetchMyData(sortType: String): ApiResult = + safeApiCall { myService.fetchMyData(sortType) } +} diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseMy.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseMy.kt new file mode 100644 index 00000000..886a5bda --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseMy.kt @@ -0,0 +1,42 @@ +package org.keepgoeat.data.model.response + +import kotlinx.serialization.Serializable +import org.keepgoeat.domain.model.MyGoal + +@Serializable +data class ResponseMy( + val status: Int, + val success: Boolean, + val message: String, + val data: MyData +) { + @Serializable + data class MyData( + val goals: List, + val goalCount: Int + ) { + @Serializable + data class GoalInfo( + val goalId: Int, + val goalContent: String, + val isMore: Boolean, + val isOngoing: Boolean, + val writerId: Int, + val totalCount: Int, + val startedAt: String, + val keptAt: String?, + val isAchieved: Boolean + ) + + fun toMyGoal() = goals.map { goal -> + MyGoal( + goal.goalId, + goal.goalContent, + goal.isMore, + goal.startedAt, + goal.keptAt, + goal.totalCount + ) + } + } +} diff --git a/app/src/main/java/org/keepgoeat/data/repository/MyRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/MyRepositoryImpl.kt new file mode 100644 index 00000000..2bd751bc --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/repository/MyRepositoryImpl.kt @@ -0,0 +1,29 @@ +package org.keepgoeat.data.repository + +import org.keepgoeat.data.ApiResult +import org.keepgoeat.data.datasource.remote.MyDataSource +import org.keepgoeat.data.model.response.ResponseMy +import org.keepgoeat.domain.repository.MyRepository +import timber.log.Timber +import javax.inject.Inject + +class MyRepositoryImpl @Inject constructor( + private val myDataSource: MyDataSource +) : MyRepository { + override suspend fun fetchMyData(sortType: String): ResponseMy.MyData? { + val result = myDataSource.fetchMyData(sortType) + return when (result) { + is ApiResult.Success -> { + result.data?.data + } + is ApiResult.NetworkError -> { + Timber.d("Network Error") + null + } + is ApiResult.GenericError -> { + Timber.d("(${result.code}): $(result.message}") + null + } + } + } +} diff --git a/app/src/main/java/org/keepgoeat/data/service/MyService.kt b/app/src/main/java/org/keepgoeat/data/service/MyService.kt new file mode 100644 index 00000000..77a077e5 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/service/MyService.kt @@ -0,0 +1,13 @@ +package org.keepgoeat.data.service + +import org.keepgoeat.data.model.response.ResponseMy +import retrofit2.Response +import retrofit2.http.GET +import retrofit2.http.Query + +interface MyService { + @GET("mypage") + suspend fun fetchMyData( + @Query("sort") value: String + ): Response +} diff --git a/app/src/main/java/org/keepgoeat/di/NetworkModule.kt b/app/src/main/java/org/keepgoeat/di/NetworkModule.kt index e561382b..d408b015 100644 --- a/app/src/main/java/org/keepgoeat/di/NetworkModule.kt +++ b/app/src/main/java/org/keepgoeat/di/NetworkModule.kt @@ -7,6 +7,7 @@ import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json +import okhttp3.Interceptor import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor @@ -40,11 +41,32 @@ object NetworkModule { @Provides @Singleton - fun provideOkHttpClientBuilder(): OkHttpClient = + fun providesInterceptor(): Interceptor = + Interceptor { chain -> + with(chain) { + proceed( + request() + .newBuilder() + .addHeader( + "accesstoken", + "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTIsImVtYWlsIjoicGFya191YmluQG5hdmVyLmNvbSIsImlhdCI6MTY3MzI2OTU2NywiZXhwIjoxNjczNzczNTY3LCJpc3MiOiJLRUVQR09FQVRfU0VSVkVSIn0.Uk_LjMBfRauozQDEBoq6sIDFEf6k8zAxifXljcToNgk" + ) + .addHeader("Content-Type", "Application/json") + .build() + ) + } + } + + @Provides + @Singleton + fun provideOkHttpClientBuilder( + interceptor: Interceptor + ): OkHttpClient = OkHttpClient.Builder().apply { connectTimeout(10, TimeUnit.SECONDS) writeTimeout(10, TimeUnit.SECONDS) readTimeout(10, TimeUnit.SECONDS) + addInterceptor(interceptor) if (DEBUG) addInterceptor( HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY diff --git a/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt b/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt index a9e3a8f1..d1563eff 100644 --- a/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt +++ b/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt @@ -6,8 +6,10 @@ import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import org.keepgoeat.data.repository.DummyRepositoryImpl import org.keepgoeat.data.repository.GoalRepositoryImpl +import org.keepgoeat.data.repository.MyRepositoryImpl import org.keepgoeat.domain.repository.DummyRepository import org.keepgoeat.domain.repository.GoalRepository +import org.keepgoeat.domain.repository.MyRepository import javax.inject.Singleton @Module @@ -24,4 +26,10 @@ interface RepositoryModule { fun bindGoalRepository( goalRepositoryImpl: GoalRepositoryImpl, ): GoalRepository + + @Binds + @Singleton + fun bindMyRepository( + myRepositoryImRepositoryImpl: MyRepositoryImpl, + ): MyRepository } diff --git a/app/src/main/java/org/keepgoeat/di/ServiceModule.kt b/app/src/main/java/org/keepgoeat/di/ServiceModule.kt index 79198044..45a41921 100644 --- a/app/src/main/java/org/keepgoeat/di/ServiceModule.kt +++ b/app/src/main/java/org/keepgoeat/di/ServiceModule.kt @@ -6,6 +6,7 @@ import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import org.keepgoeat.data.service.DummyService import org.keepgoeat.data.service.GoalService +import org.keepgoeat.data.service.MyService import retrofit2.Retrofit import javax.inject.Singleton @@ -21,4 +22,9 @@ object ServiceModule { @Provides fun provideGoalService(retrofit: Retrofit): GoalService = retrofit.create(GoalService::class.java) + + @Singleton + @Provides + fun provideMyService(retrofit: Retrofit): MyService = + retrofit.create(MyService::class.java) } diff --git a/app/src/main/java/org/keepgoeat/domain/model/MyGoal.kt b/app/src/main/java/org/keepgoeat/domain/model/MyGoal.kt new file mode 100644 index 00000000..3cd48a60 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/domain/model/MyGoal.kt @@ -0,0 +1,10 @@ +package org.keepgoeat.domain.model + +data class MyGoal( + val id: Int, + val goalContent: String, + val isMore: Boolean, + val startedAt: String, + val keptAt: String?, + val totalCount: Int +) diff --git a/app/src/main/java/org/keepgoeat/domain/repository/MyRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/MyRepository.kt new file mode 100644 index 00000000..cf1a4c9c --- /dev/null +++ b/app/src/main/java/org/keepgoeat/domain/repository/MyRepository.kt @@ -0,0 +1,7 @@ +package org.keepgoeat.domain.repository + +import org.keepgoeat.data.model.response.ResponseMy + +interface MyRepository { + suspend fun fetchMyData(sortType: String): ResponseMy.MyData? +} diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt index 6d230917..da18a8d2 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt @@ -7,6 +7,7 @@ import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.ActivityMyBinding import org.keepgoeat.presentation.type.EatingType +import org.keepgoeat.presentation.type.SortType import org.keepgoeat.util.binding.BindingActivity @AndroidEntryPoint @@ -35,17 +36,9 @@ class MyActivity : BindingActivity(R.layout.activity_my) { private fun getFilteredGoalWithEatingType(eatingType: EatingType?) { when (eatingType) { - null -> goalAdapter.submitList( - viewModel.goalList.value?.toMutableList() - ) - EatingType.MORE -> goalAdapter.submitList( - viewModel.goalList.value?.filter { it.eatingType == EatingType.MORE } - ?.toMutableList() - ) - EatingType.LESS -> goalAdapter.submitList( - viewModel.goalList.value?.filter { it.eatingType == EatingType.LESS } - ?.toMutableList() - ) + null -> viewModel.fetchAchievedGoalBySort(SortType.ALL) + EatingType.MORE -> viewModel.fetchAchievedGoalBySort(SortType.MORE) + EatingType.LESS -> viewModel.fetchAchievedGoalBySort(SortType.LESS) } } diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyGoalAdapter.kt index c3a9b919..bc7e9a50 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyGoalAdapter.kt @@ -5,12 +5,13 @@ import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import org.keepgoeat.databinding.ItemMyGoalBinding -import org.keepgoeat.domain.model.AchievedGoal +import org.keepgoeat.domain.model.MyGoal +import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.ItemDiffCallback class MyGoalAdapter : - ListAdapter( - ItemDiffCallback( + ListAdapter( + ItemDiffCallback( onContentsTheSame = { old, new -> old == new }, onItemsTheSame = { old, new -> old.id == new.id } ) @@ -19,8 +20,12 @@ class MyGoalAdapter : class MyGoalViewHolder(private val binding: ItemMyGoalBinding) : RecyclerView.ViewHolder(binding.root) { - fun onBind(data: AchievedGoal) { + fun onBind( + data: MyGoal, + eatingType: EatingType + ) { binding.goal = data + binding.eatingType = eatingType } } @@ -32,6 +37,10 @@ class MyGoalAdapter : } override fun onBindViewHolder(holder: MyGoalViewHolder, position: Int) { - holder.onBind(currentList[position]) + if (currentList[position].isMore) { + holder.onBind(currentList[position], EatingType.MORE) + } else { + holder.onBind(currentList[position], EatingType.LESS) + } } } diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt index 2bb3e88a..357d9fb1 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt @@ -3,33 +3,28 @@ package org.keepgoeat.presentation.my import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import org.keepgoeat.domain.model.AchievedGoal -import org.keepgoeat.presentation.type.EatingType -import java.time.LocalDate +import kotlinx.coroutines.launch +import org.keepgoeat.domain.model.MyGoal +import org.keepgoeat.domain.repository.MyRepository +import org.keepgoeat.presentation.type.SortType import javax.inject.Inject @HiltViewModel -class MyViewModel @Inject constructor() : ViewModel() { - private val _eatingType = MutableLiveData() - val eatingType: LiveData get() = _eatingType - private val _goalList = MutableLiveData>() - val goalList: LiveData> get() = _goalList +class MyViewModel @Inject constructor(private val myRepository: MyRepository) : ViewModel() { + private val _goalList = MutableLiveData>() + val goalList: LiveData> get() = _goalList init { - fetchGoalList() + fetchAchievedGoalBySort(SortType.ALL) } - private fun fetchGoalList() { - // TODO api 연동 후 remote에서 데이터 불러오기 - _goalList.value = listOf( - AchievedGoal(1, EatingType.LESS, "라면 덜 먹기", 30, LocalDate.of(2022, 9, 1), LocalDate.of(2022, 12, 31)), - AchievedGoal(2, EatingType.MORE, "하루 1끼 이상 야채 더 먹기", 30, LocalDate.of(2022, 9, 1), LocalDate.of(2022, 12, 19)), - AchievedGoal(3, EatingType.LESS, "밀가루 덜 먹기", 30, LocalDate.of(2022, 9, 1), LocalDate.of(2022, 12, 15)), - ) - } - - fun setEatingType(eatingType: EatingType?) { - _eatingType.value = eatingType + fun fetchAchievedGoalBySort(sortType: SortType) { + viewModelScope.launch { + myRepository.fetchMyData(sortType.name.lowercase())?.let { MyData -> + _goalList.value = MyData.toMyGoal() + } + } } } diff --git a/app/src/main/java/org/keepgoeat/presentation/type/SortType.kt b/app/src/main/java/org/keepgoeat/presentation/type/SortType.kt new file mode 100644 index 00000000..11da00bb --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/type/SortType.kt @@ -0,0 +1,5 @@ +package org.keepgoeat.presentation.type + +enum class SortType { + MORE, LESS, ALL +} diff --git a/app/src/main/java/org/keepgoeat/util/BindingAdatper.kt b/app/src/main/java/org/keepgoeat/util/BindingAdatper.kt index 912404e0..47bef289 100644 --- a/app/src/main/java/org/keepgoeat/util/BindingAdatper.kt +++ b/app/src/main/java/org/keepgoeat/util/BindingAdatper.kt @@ -6,10 +6,7 @@ import android.widget.TextView import androidx.core.view.isVisible import androidx.databinding.BindingAdapter import coil.load -import org.keepgoeat.R import org.keepgoeat.presentation.type.HomeBackgroundType -import org.keepgoeat.util.extension.padZero -import java.time.LocalDate @BindingAdapter("image") fun ImageView.setImage(imageUrl: String) { @@ -22,6 +19,7 @@ fun View.setVisibility(isVisible: Boolean?) { this.isVisible = isVisible } +/* @BindingAdapter(value = ["startDate", "endDate"], requireAll = false) fun TextView.setDuration(startDate: LocalDate?, endDate: LocalDate?) { safeLet(startDate, endDate) { s, e -> @@ -36,6 +34,14 @@ fun TextView.setDuration(startDate: LocalDate?, endDate: LocalDate?) { ) } } +*/ + +@BindingAdapter(value = ["startDate", "endDate"], requireAll = false) +fun TextView.setDurationText(startDate: String?, endDate: String?) { + safeLet(startDate, endDate) { s, e -> + text = "$s ~ $e" + } +} @BindingAdapter("homeBackground") fun ImageView.setBackground(hour: Int) { diff --git a/app/src/main/res/layout/item_my_goal.xml b/app/src/main/res/layout/item_my_goal.xml index 971c3e45..1dcc4fde 100644 --- a/app/src/main/res/layout/item_my_goal.xml +++ b/app/src/main/res/layout/item_my_goal.xml @@ -6,9 +6,13 @@ + + + type="org.keepgoeat.domain.model.MyGoal" /> + bind:eatingType="@{eatingType}" /> + tools:text="하루 1끼 이상 야채 더 먹기" /> diff --git a/app/src/main/res/layout/layout_my_header.xml b/app/src/main/res/layout/layout_my_header.xml index 3dab3dbf..0578c983 100644 --- a/app/src/main/res/layout/layout_my_header.xml +++ b/app/src/main/res/layout/layout_my_header.xml @@ -40,7 +40,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="@dimen/spacing8" - android:text="@string/more_without_space" + android:text="@string/eating_type_more" android:textAppearance="@style/TextAppearance.System5" android:textColor="@color/gray_400" /> @@ -49,7 +49,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="@dimen/spacing8" - android:text="@string/less_without_space" + android:text="@string/eating_type_less" android:textAppearance="@style/TextAppearance.System5" android:textColor="@color/gray_400" /> From 4454e5862d5ba1ec844630836894135db45ba52f Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 9 Jan 2023 23:25:50 +0900 Subject: [PATCH 204/745] =?UTF-8?q?[feat]=20#76=20safeApiCall=20>=20ApiRes?= =?UTF-8?q?ult.GenericError=20=EB=B0=9C=EC=83=9D=20=EC=8B=9C=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/keepgoeat/util/ApiUtil.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/util/ApiUtil.kt b/app/src/main/java/org/keepgoeat/util/ApiUtil.kt index 9ec76266..e4f1c7d4 100644 --- a/app/src/main/java/org/keepgoeat/util/ApiUtil.kt +++ b/app/src/main/java/org/keepgoeat/util/ApiUtil.kt @@ -12,7 +12,7 @@ suspend inline fun safeApiCall(crossinline apiCall: suspend () -> Response ApiResult.NetworkError is HttpException -> ApiResult.GenericError(throwable.code(), throwable.message) - else -> ApiResult.GenericError(null, null) + else -> ApiResult.GenericError(null, throwable.message) } } } From 29bb6d27aac63a3d5cfa7306773517a695aeee35 Mon Sep 17 00:00:00 2001 From: Daeun Date: Mon, 9 Jan 2023 23:27:39 +0900 Subject: [PATCH 205/745] =?UTF-8?q?[chore]=20#74=20klint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/data/datasource/remote/MyDataSource.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/MyDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/MyDataSource.kt index 2457be3e..b80c1408 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/MyDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/MyDataSource.kt @@ -1,10 +1,8 @@ package org.keepgoeat.data.datasource.remote import org.keepgoeat.data.ApiResult -import org.keepgoeat.data.model.response.ResponseHome import org.keepgoeat.data.model.response.ResponseMy import org.keepgoeat.data.service.MyService -import org.keepgoeat.presentation.type.SortType import org.keepgoeat.util.safeApiCall import javax.inject.Inject From fef58c9d2afb21c00030c7feff6d235f95891ce1 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 9 Jan 2023 23:28:53 +0900 Subject: [PATCH 206/745] =?UTF-8?q?[feat]=20#76=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=EB=B7=B0=20api=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/GoalDataSource.kt | 6 ++- .../data/model/response/ResponseGoalDetail.kt | 34 ++++++++++++ .../data/repository/GoalRepositoryImpl.kt | 19 +++++++ .../org/keepgoeat/data/service/GoalService.kt | 8 +-- .../org/keepgoeat/domain/model/GoalDetail.kt | 11 ++++ .../domain/repository/GoalRepository.kt | 2 + .../presentation/detail/GoalDetailActivity.kt | 16 ++---- .../detail/GoalDetailViewModel.kt | 53 ++++++------------- .../main/res/layout/activity_goal_detail.xml | 12 +++-- .../res/layout/dialog_bottom_goal_keep.xml | 8 +-- app/src/main/res/layout/view_eating_tag.xml | 10 ++-- 11 files changed, 115 insertions(+), 64 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDetail.kt create mode 100644 app/src/main/java/org/keepgoeat/domain/model/GoalDetail.kt diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index ec62bb9e..397e2894 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -3,17 +3,21 @@ package org.keepgoeat.data.datasource.remote import org.keepgoeat.data.ApiResult import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.response.ResponseGoalContent +import org.keepgoeat.data.model.response.ResponseGoalDetail import org.keepgoeat.data.model.response.ResponseHome import org.keepgoeat.data.service.GoalService import org.keepgoeat.util.safeApiCall import javax.inject.Inject class GoalDataSource @Inject constructor( - private val goalService: GoalService + private val goalService: GoalService, ) { suspend fun fetchHomeEntireData(): ApiResult = safeApiCall { goalService.fetchHomeEntireData() } suspend fun uploadGoalContent(requestGoalContent: RequestGoalContent): ApiResult = safeApiCall { goalService.uploadGoalContent(requestGoalContent) } + + suspend fun fetchGoalDetail(goalId: Int): ApiResult = + safeApiCall { goalService.fetchGoalDetail(goalId) } } diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDetail.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDetail.kt new file mode 100644 index 00000000..e5cb93e3 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDetail.kt @@ -0,0 +1,34 @@ +package org.keepgoeat.data.model.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import org.keepgoeat.domain.model.GoalDetail +import org.keepgoeat.presentation.type.EatingType + +@Serializable +data class ResponseGoalDetail( + val status: Int, + val success: Boolean, + val message: String, + val data: ResponseGoalDetailData, +) { + @Serializable + data class ResponseGoalDetailData( + @SerialName("goalId") + val id: Int, + val isMore: Boolean, + val thisMonthCount: Int, + val lastMonthCount: Int, + val goalContent: String, + val blankBoxCount: Int, + val emptyBoxCount: Int, + ) { + fun toGoalDetail() = GoalDetail( + id = id, + eatingType = if (isMore) EatingType.MORE else EatingType.LESS, + thisMonthCount = thisMonthCount, + lastMonthCount = lastMonthCount, + goalTitle = goalContent + ) + } +} diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index 688f94f0..88f904dc 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -4,6 +4,7 @@ import org.keepgoeat.data.ApiResult import org.keepgoeat.data.datasource.remote.GoalDataSource import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.response.ResponseGoalContent +import org.keepgoeat.data.model.response.ResponseGoalDetail import org.keepgoeat.data.model.response.ResponseHome import org.keepgoeat.domain.repository.GoalRepository import timber.log.Timber @@ -46,4 +47,22 @@ class GoalRepositoryImpl @Inject constructor( } } } + + override suspend fun fetchGoalDetail(goalId: Int): ResponseGoalDetail.ResponseGoalDetailData? { + val result = goalDataSource.fetchGoalDetail(goalId) + + return when (result) { + is ApiResult.Success -> { + result.data?.data + } + is ApiResult.NetworkError -> { + Timber.d("Network Error") + null + } + is ApiResult.GenericError -> { + Timber.d("(${result.code}): ${result.message}") + null + } + } + } } diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index f2f6c357..904ebbfe 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -2,11 +2,10 @@ package org.keepgoeat.data.service import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.response.ResponseGoalContent +import org.keepgoeat.data.model.response.ResponseGoalDetail import org.keepgoeat.data.model.response.ResponseHome import retrofit2.Response -import retrofit2.http.Body -import retrofit2.http.GET -import retrofit2.http.POST +import retrofit2.http.* interface GoalService { @GET("home") @@ -14,4 +13,7 @@ interface GoalService { @POST("goal") suspend fun uploadGoalContent(@Body request: RequestGoalContent): Response + + @GET("history/{goalId}") + suspend fun fetchGoalDetail(@Path("goalId") goalId: Int): Response } diff --git a/app/src/main/java/org/keepgoeat/domain/model/GoalDetail.kt b/app/src/main/java/org/keepgoeat/domain/model/GoalDetail.kt new file mode 100644 index 00000000..6e6a45a3 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/domain/model/GoalDetail.kt @@ -0,0 +1,11 @@ +package org.keepgoeat.domain.model + +import org.keepgoeat.presentation.type.EatingType + +data class GoalDetail( + val id: Int, + val eatingType: EatingType, + val thisMonthCount: Int, + val lastMonthCount: Int, + val goalTitle: String, +) diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 91a33d3c..65f89ba8 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -1,9 +1,11 @@ package org.keepgoeat.domain.repository import org.keepgoeat.data.model.response.ResponseGoalContent +import org.keepgoeat.data.model.response.ResponseGoalDetail import org.keepgoeat.data.model.response.ResponseHome interface GoalRepository { suspend fun fetchHomeEntireData(): ResponseHome.HomeData? suspend fun uploadGoalContent(title: String, isMore: Boolean): ResponseGoalContent.ResponseGoalContentData? + suspend fun fetchGoalDetail(goalId: Int): ResponseGoalDetail.ResponseGoalDetailData? } diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 07a1a324..e45b8b0b 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -6,11 +6,9 @@ import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.ActivityGoalDetailBinding import org.keepgoeat.presentation.detail.GoalDetailViewModel.Companion.CELL_COUNT -import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.presentation.type.RecyclerLayoutType import org.keepgoeat.util.ItemDecorationUtil import org.keepgoeat.util.binding.BindingActivity -import org.keepgoeat.util.safeValueOf @AndroidEntryPoint class GoalDetailActivity : BindingActivity(R.layout.activity_goal_detail) { @@ -22,25 +20,17 @@ class GoalDetailActivity : BindingActivity(R.layout.a binding.viewModel = viewModel binding.lifecycleOwner = this - intent.getStringExtra(ARG_EATING_TYPE)?.let { strExtra -> - val eatingType = safeValueOf(strExtra) ?: return@let - viewModel.setEatingType(eatingType) - adapter = GoalStickerListAdapter(eatingType, CELL_COUNT) - } if (intent.hasExtra(ARG_GOAL_ID)) { val goalId = intent.getIntExtra(ARG_GOAL_ID, -1) - viewModel.setGoalId(goalId) + viewModel.fetchGoalDetailInfo(goalId) } - viewModel.fetchGoalDetailInfo() - initLayout() addListeners() addObservers() } private fun initLayout() { - binding.rvGoalCard.adapter = adapter binding.rvGoalCard.addItemDecoration( ItemDecorationUtil(CARD_ITEM_SPACE, Pair(CARD_MATRIX_ROW, CARD_MATRIX_COL), RecyclerLayoutType.GRID) ) @@ -56,6 +46,10 @@ class GoalDetailActivity : BindingActivity(R.layout.a } private fun addObservers() { + viewModel.goalDetail.observe(this) { detail -> // TODO 리팩토링 필요 + adapter = GoalStickerListAdapter(detail.eatingType, CELL_COUNT) + binding.rvGoalCard.adapter = adapter + } viewModel.goalStickers.observe(this) { stickers -> adapter.submitList(stickers) } diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt index bec4d2cf..b2c469f8 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt @@ -3,41 +3,30 @@ package org.keepgoeat.presentation.detail import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import org.keepgoeat.domain.model.GoalDetail import org.keepgoeat.domain.model.GoalSticker -import org.keepgoeat.presentation.type.EatingType +import org.keepgoeat.domain.repository.GoalRepository import javax.inject.Inject @HiltViewModel -class GoalDetailViewModel @Inject constructor() : ViewModel() { +class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRepository) : ViewModel() { private val _goalStickers = MutableLiveData>() val goalStickers: LiveData> get() = _goalStickers - private val _goalTitle = MutableLiveData() - val goalTitle: LiveData get() = _goalTitle - private val _numOfDaysEatenLastMonth = MutableLiveData() - val numOfDaysEatenLastMonth: LiveData get() = _numOfDaysEatenLastMonth - private val _numOfDaysEatenThisMonth = MutableLiveData() - val numOfDaysEatenThisMonth: LiveData get() = _numOfDaysEatenThisMonth - private var _eatingType = MutableLiveData() - val eatingType: LiveData get() = _eatingType - private var _goalId = MutableLiveData() - val goalId: LiveData get() = _goalId - - // TODO api 연동 후 해당 주석 제거 예정 -// init { -// fetchGoalDetailInfo() -// } - - fun fetchGoalDetailInfo() { - // TODO api 연동 후 remote에서 데이터 불러오기 - val totalAchievementDays = 8 - _goalStickers.value = Array(CELL_COUNT) { idx -> - GoalSticker(idx, idx < totalAchievementDays) - }.toList() - - _goalTitle.value = if (eatingType.value == EatingType.MORE) "하루 1끼 이상 야채" else "라면" - _numOfDaysEatenLastMonth.value = 4 - _numOfDaysEatenThisMonth.value = 8 + private val _goalDetail = MutableLiveData() + val goalDetail: LiveData get() = _goalDetail + + fun fetchGoalDetailInfo(goalId: Int) { + viewModelScope.launch { + goalRepository.fetchGoalDetail(goalId).let { detail -> + _goalDetail.value = detail?.toGoalDetail() ?: return@launch + _goalStickers.value = Array(CELL_COUNT) { idx -> + GoalSticker(idx, idx < detail.thisMonthCount) + }.toList() + } + } } fun keepGoal() { @@ -48,14 +37,6 @@ class GoalDetailViewModel @Inject constructor() : ViewModel() { // TODO api 연동 필요 } - fun setEatingType(eatingType: EatingType) { - _eatingType.value = eatingType - } - - fun setGoalId(id: Int) { - _goalId.value = id - } - companion object { const val CELL_COUNT = 35 } diff --git a/app/src/main/res/layout/activity_goal_detail.xml b/app/src/main/res/layout/activity_goal_detail.xml index 939c2d4e..19e607e1 100644 --- a/app/src/main/res/layout/activity_goal_detail.xml +++ b/app/src/main/res/layout/activity_goal_detail.xml @@ -6,6 +6,8 @@ + + @@ -88,14 +90,14 @@ android:layout_marginTop="@dimen/spacing24" app:layout_constraintStart_toStartOf="@id/gl_start" app:layout_constraintTop_toBottomOf="@id/layout_toolbar" - bind:eatingType="@{viewModel.eatingType}" /> + bind:eatingType="@{viewModel.goalDetail.eatingType}" /> + + @@ -15,7 +17,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/shape_border_radius_4" - android:backgroundTint="@{context.getColor(eatingType.tagBackgroundColor)}" + android:backgroundTint="@{context.getColor(eatingType == null ? R.color.white : eatingType.tagBackgroundColor)}" android:paddingVertical="@dimen/spacing4" android:paddingStart="6dp" android:paddingEnd="@dimen/spacing4" @@ -25,7 +27,7 @@ android:id="@+id/iv_tag_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:src="@{context.getDrawable(eatingType.tagIconRes)}" + android:src="@{eatingType == null ? null : context.getDrawable(eatingType.tagIconRes)}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -36,8 +38,8 @@ android:layout_height="wrap_content" android:layout_marginStart="6dp" android:fontFamily="@font/pretendard_b" - android:text="@{eatingType.strRes}" - android:textColor="@{context.getColor(eatingType.tagTextColor)}" + android:text="@{eatingType == null ? `` : context.getString(eatingType.strRes)}" + android:textColor="@{context.getColor(eatingType == null ? R.color.white : eatingType.tagTextColor)}" android:textSize="12dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toEndOf="@id/iv_tag_icon" From a049260fb8c4ea0627a51da3827495472a163e19 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 10 Jan 2023 14:55:38 +0900 Subject: [PATCH 207/745] =?UTF-8?q?[feat]=20#79=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=8B=9C=20=EA=B8=B0=EC=A1=B4=20=EB=AA=A9?= =?UTF-8?q?=ED=91=9C=20=EB=82=B4=EC=9A=A9=20=EB=B6=88=EB=9F=AC=EC=98=A4?= =?UTF-8?q?=EA=B8=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalDetailActivity.kt | 15 +++++++++++++++ .../keepgoeat/presentation/model/GoalContent.kt | 10 ++++++++++ .../presentation/setting/GoalSettingActivity.kt | 15 ++++++++++++--- .../presentation/setting/GoalSettingViewModel.kt | 7 +++++++ app/src/main/res/layout/activity_goal_setting.xml | 4 ++-- 5 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/presentation/model/GoalContent.kt diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index e45b8b0b..94e40c69 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -1,11 +1,15 @@ package org.keepgoeat.presentation.detail +import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.ActivityGoalDetailBinding import org.keepgoeat.presentation.detail.GoalDetailViewModel.Companion.CELL_COUNT +import org.keepgoeat.presentation.model.GoalContent +import org.keepgoeat.presentation.setting.GoalSettingActivity +import org.keepgoeat.presentation.setting.GoalSettingActivity.Companion.ARG_GOAL_CONTENT import org.keepgoeat.presentation.type.RecyclerLayoutType import org.keepgoeat.util.ItemDecorationUtil import org.keepgoeat.util.binding.BindingActivity @@ -43,6 +47,17 @@ class GoalDetailActivity : BindingActivity(R.layout.a binding.ivKeep.setOnClickListener { showGoalKeepDialog() } + binding.ivEdit.setOnClickListener { + viewModel.goalDetail.value?.let { detail -> + val content = GoalContent(detail.id, detail.goalTitle) + Intent(this, GoalSettingActivity::class.java).apply { + putExtra(ARG_GOAL_CONTENT, content) + putExtra(ARG_EATING_TYPE, detail.eatingType) + }.also { + startActivity(it) + } + } + } } private fun addObservers() { diff --git a/app/src/main/java/org/keepgoeat/presentation/model/GoalContent.kt b/app/src/main/java/org/keepgoeat/presentation/model/GoalContent.kt new file mode 100644 index 00000000..8ceae8f9 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/model/GoalContent.kt @@ -0,0 +1,10 @@ +package org.keepgoeat.presentation.model + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +data class GoalContent( + val id: Int, + val goalTitle: String, +) : Parcelable diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt index 2336c5e1..e55b6240 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt @@ -7,9 +7,11 @@ import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.ActivityGoalSettingBinding import org.keepgoeat.presentation.home.HomeActivity +import org.keepgoeat.presentation.model.GoalContent import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity +import org.keepgoeat.util.extension.getParcelable import org.keepgoeat.util.extension.showKeyboard import org.keepgoeat.util.safeValueOf @@ -22,9 +24,15 @@ class GoalSettingActivity : BindingActivity(R.layout binding.viewModel = viewModel binding.lifecycleOwner = this - intent.getStringExtra(ARG_EATING_TYPE)?.let { strExtra -> - val eatingType = safeValueOf(strExtra) ?: return@let - viewModel.setEatingType(eatingType) + intent.let { + it.getStringExtra(ARG_EATING_TYPE)?.let { strExtra -> + val eatingType = safeValueOf(strExtra) ?: return@let + viewModel.setEatingType(eatingType) + } + + it.getParcelable(ARG_GOAL_CONTENT, GoalContent::class.java)?.let { goal -> + viewModel.setGoalContent(goal) + } } addListeners() @@ -60,5 +68,6 @@ class GoalSettingActivity : BindingActivity(R.layout companion object { const val ARG_EATING_TYPE = "eatingType" + const val ARG_GOAL_CONTENT = "goalContent" } } diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt index d77e8dec..10360611 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.* import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import org.keepgoeat.domain.repository.GoalRepository +import org.keepgoeat.presentation.model.GoalContent import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.UiState import javax.inject.Inject @@ -15,6 +16,7 @@ class GoalSettingViewModel @Inject constructor( val goalTitle = MutableLiveData() private val _eatingType = MutableLiveData() val eatingType: LiveData get() = _eatingType + var goalId: Int? = null val isValidTitle: LiveData get() = Transformations.map(goalTitle) { title -> @@ -36,6 +38,11 @@ class GoalSettingViewModel @Inject constructor( _eatingType.value = eatingType } + fun setGoalContent(goal: GoalContent) { + goalId = goal.id + goalTitle.value = goal.goalTitle + } + companion object { private const val TITLE_PATTERN = "^[A-Za-zㄱ-ㅎ가-힣0-9\\s]*\$" } diff --git a/app/src/main/res/layout/activity_goal_setting.xml b/app/src/main/res/layout/activity_goal_setting.xml index ec33c545..3695682e 100644 --- a/app/src/main/res/layout/activity_goal_setting.xml +++ b/app/src/main/res/layout/activity_goal_setting.xml @@ -78,7 +78,7 @@ android:layout_height="wrap_content" android:layout_marginEnd="@dimen/spacing16" android:background="@drawable/selector_edittext_background" - android:hint="@{context.getString(viewModel.eatingType == EatingType.MORE ? R.string.goal_setting_title_hint_for_more : R.string.goal_setting_title_hint_for_less)}" + android:hint="@{viewModel.eatingType == null ? `` : context.getString(viewModel.eatingType == EatingType.MORE ? R.string.goal_setting_title_hint_for_more : R.string.goal_setting_title_hint_for_less)}" android:maxLength="20" android:maxLines="1" android:text="@={viewModel.goalTitle}" @@ -99,7 +99,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="33dp" - android:text="@{viewModel.eatingType.strRes}" + android:text="@{viewModel.eatingType == null ? `` : context.getString(viewModel.eatingType.strRes)}" android:textAppearance="@style/TextAppearance.System4_Bold" android:textColor="@color/gray_700" app:layout_constraintEnd_toEndOf="@id/gl_end" From 120d1b74b0f6a16d0847e46baba3e576386a6ba5 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 10 Jan 2023 15:22:25 +0900 Subject: [PATCH 208/745] =?UTF-8?q?[feat]=20#79=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=EB=B7=B0=20api=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/GoalDataSource.kt | 4 ++++ .../data/repository/GoalRepositoryImpl.kt | 18 ++++++++++++++++++ .../org/keepgoeat/data/service/GoalService.kt | 4 ++++ .../domain/repository/GoalRepository.kt | 1 + .../setting/GoalSettingViewModel.kt | 11 +++++++++++ 5 files changed, 38 insertions(+) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index 397e2894..9657051a 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -18,6 +18,10 @@ class GoalDataSource @Inject constructor( suspend fun uploadGoalContent(requestGoalContent: RequestGoalContent): ApiResult = safeApiCall { goalService.uploadGoalContent(requestGoalContent) } + suspend fun editGoalContent(id: Int, title: String): ApiResult = + safeApiCall { goalService.editGoalContent(id, title) } + + // TODO goalId -> id 로 파라미터명 변경 suspend fun fetchGoalDetail(goalId: Int): ApiResult = safeApiCall { goalService.fetchGoalDetail(goalId) } } diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index 88f904dc..f4875abc 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -48,6 +48,24 @@ class GoalRepositoryImpl @Inject constructor( } } + override suspend fun editGoalContent(id: Int, title: String): ResponseGoalContent.ResponseGoalContentData? { + val result = goalDataSource.editGoalContent(id, title) + + return when (result) { + is ApiResult.Success -> { + result.data?.data + } + is ApiResult.NetworkError -> { + Timber.d("Network Error") + null + } + is ApiResult.GenericError -> { + Timber.d("(${result.code}): ${result.message}") + null + } + } + } + override suspend fun fetchGoalDetail(goalId: Int): ResponseGoalDetail.ResponseGoalDetailData? { val result = goalDataSource.fetchGoalDetail(goalId) diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index 904ebbfe..a1c25abe 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -14,6 +14,10 @@ interface GoalService { @POST("goal") suspend fun uploadGoalContent(@Body request: RequestGoalContent): Response + @FormUrlEncoded + @POST("goal/{goalId}") + suspend fun editGoalContent(@Path("goalId") id: Int, @Field("goalContent") goalContent: String): Response + @GET("history/{goalId}") suspend fun fetchGoalDetail(@Path("goalId") goalId: Int): Response } diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 65f89ba8..bec2bd37 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -7,5 +7,6 @@ import org.keepgoeat.data.model.response.ResponseHome interface GoalRepository { suspend fun fetchHomeEntireData(): ResponseHome.HomeData? suspend fun uploadGoalContent(title: String, isMore: Boolean): ResponseGoalContent.ResponseGoalContentData? + suspend fun editGoalContent(id: Int, title: String): ResponseGoalContent.ResponseGoalContentData? suspend fun fetchGoalDetail(goalId: Int): ResponseGoalDetail.ResponseGoalDetailData? } diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt index 10360611..ac2d27ea 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt @@ -7,6 +7,7 @@ import org.keepgoeat.domain.repository.GoalRepository import org.keepgoeat.presentation.model.GoalContent import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.UiState +import org.keepgoeat.util.safeLet import javax.inject.Inject @HiltViewModel @@ -34,6 +35,16 @@ class GoalSettingViewModel @Inject constructor( } } + fun editGoal() { + viewModelScope.launch { + safeLet(goalId, goalTitle.value) { id, title -> + goalRepository.editGoalContent(id, title).let { result -> + _uploadState.value = if (result?.id != null) UiState.Success(result.id) else UiState.Empty + } + } + } + } + fun setEatingType(eatingType: EatingType) { _eatingType.value = eatingType } From a3a6790360cfa62889d48335af370d1600560a8c Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 10 Jan 2023 16:01:12 +0900 Subject: [PATCH 209/745] =?UTF-8?q?[mod]=20#79=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20RequestBody=20=EA=B0=92=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/data/datasource/remote/GoalDataSource.kt | 3 ++- .../data/model/request/RequestGoalContentTitle.kt | 8 ++++++++ .../org/keepgoeat/data/repository/GoalRepositoryImpl.kt | 3 ++- .../main/java/org/keepgoeat/data/service/GoalService.kt | 4 ++-- .../org/keepgoeat/domain/repository/GoalRepository.kt | 1 + .../presentation/setting/GoalSettingViewModel.kt | 7 ++++++- 6 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/data/model/request/RequestGoalContentTitle.kt diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index 9657051a..187e46a1 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -2,6 +2,7 @@ package org.keepgoeat.data.datasource.remote import org.keepgoeat.data.ApiResult import org.keepgoeat.data.model.request.RequestGoalContent +import org.keepgoeat.data.model.request.RequestGoalContentTitle import org.keepgoeat.data.model.response.ResponseGoalContent import org.keepgoeat.data.model.response.ResponseGoalDetail import org.keepgoeat.data.model.response.ResponseHome @@ -18,7 +19,7 @@ class GoalDataSource @Inject constructor( suspend fun uploadGoalContent(requestGoalContent: RequestGoalContent): ApiResult = safeApiCall { goalService.uploadGoalContent(requestGoalContent) } - suspend fun editGoalContent(id: Int, title: String): ApiResult = + suspend fun editGoalContent(id: Int, title: RequestGoalContentTitle): ApiResult = safeApiCall { goalService.editGoalContent(id, title) } // TODO goalId -> id 로 파라미터명 변경 diff --git a/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalContentTitle.kt b/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalContentTitle.kt new file mode 100644 index 00000000..5acd6727 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalContentTitle.kt @@ -0,0 +1,8 @@ +package org.keepgoeat.data.model.request + +import kotlinx.serialization.Serializable + +@Serializable +data class RequestGoalContentTitle( + val goalContent: String, +) diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index f4875abc..28a4f497 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -3,6 +3,7 @@ package org.keepgoeat.data.repository import org.keepgoeat.data.ApiResult import org.keepgoeat.data.datasource.remote.GoalDataSource import org.keepgoeat.data.model.request.RequestGoalContent +import org.keepgoeat.data.model.request.RequestGoalContentTitle import org.keepgoeat.data.model.response.ResponseGoalContent import org.keepgoeat.data.model.response.ResponseGoalDetail import org.keepgoeat.data.model.response.ResponseHome @@ -49,7 +50,7 @@ class GoalRepositoryImpl @Inject constructor( } override suspend fun editGoalContent(id: Int, title: String): ResponseGoalContent.ResponseGoalContentData? { - val result = goalDataSource.editGoalContent(id, title) + val result = goalDataSource.editGoalContent(id, RequestGoalContentTitle(title)) return when (result) { is ApiResult.Success -> { diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index a1c25abe..afc3a787 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -1,6 +1,7 @@ package org.keepgoeat.data.service import org.keepgoeat.data.model.request.RequestGoalContent +import org.keepgoeat.data.model.request.RequestGoalContentTitle import org.keepgoeat.data.model.response.ResponseGoalContent import org.keepgoeat.data.model.response.ResponseGoalDetail import org.keepgoeat.data.model.response.ResponseHome @@ -14,9 +15,8 @@ interface GoalService { @POST("goal") suspend fun uploadGoalContent(@Body request: RequestGoalContent): Response - @FormUrlEncoded @POST("goal/{goalId}") - suspend fun editGoalContent(@Path("goalId") id: Int, @Field("goalContent") goalContent: String): Response + suspend fun editGoalContent(@Path("goalId") id: Int, @Body goalContent: RequestGoalContentTitle): Response @GET("history/{goalId}") suspend fun fetchGoalDetail(@Path("goalId") goalId: Int): Response diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index bec2bd37..7857eece 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -6,6 +6,7 @@ import org.keepgoeat.data.model.response.ResponseHome interface GoalRepository { suspend fun fetchHomeEntireData(): ResponseHome.HomeData? + // TODO update -> add 네이밍 수정 필요 suspend fun uploadGoalContent(title: String, isMore: Boolean): ResponseGoalContent.ResponseGoalContentData? suspend fun editGoalContent(id: Int, title: String): ResponseGoalContent.ResponseGoalContentData? suspend fun fetchGoalDetail(goalId: Int): ResponseGoalDetail.ResponseGoalDetailData? diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt index ac2d27ea..e1994cf0 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt @@ -28,6 +28,11 @@ class GoalSettingViewModel @Inject constructor( val uploadState: LiveData> get() = _uploadState fun uploadGoal() { + if (goalId == null) addGoal() + else editGoal() + } + + private fun addGoal() { viewModelScope.launch { goalRepository.uploadGoalContent(goalTitle.value ?: return@launch, eatingType.value == EatingType.MORE).let { result -> _uploadState.value = if (result?.id != null) UiState.Success(result.id) else UiState.Empty @@ -35,7 +40,7 @@ class GoalSettingViewModel @Inject constructor( } } - fun editGoal() { + private fun editGoal() { viewModelScope.launch { safeLet(goalId, goalTitle.value) { id, title -> goalRepository.editGoalContent(id, title).let { result -> From a77dfbe99dd378af03f45811dd9ab0f981526d13 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 10 Jan 2023 16:24:12 +0900 Subject: [PATCH 210/745] =?UTF-8?q?[feat]=20#79=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=99=84=EB=A3=8C=20=ED=9B=84=20=EC=9D=B4?= =?UTF-8?q?=EC=A0=84=20=ED=99=94=EB=A9=B4=20=EB=B3=B5=EA=B7=80=20=EC=8B=9C?= =?UTF-8?q?=20ui=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalDetailActivity.kt | 25 ++++++++++++++++--- .../setting/GoalSettingActivity.kt | 17 ++++++++++++- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 94e40c69..686cffbb 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -2,14 +2,17 @@ package org.keepgoeat.presentation.detail import android.content.Intent import android.os.Bundle +import androidx.activity.OnBackPressedCallback import androidx.activity.viewModels import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.ActivityGoalDetailBinding import org.keepgoeat.presentation.detail.GoalDetailViewModel.Companion.CELL_COUNT +import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.model.GoalContent import org.keepgoeat.presentation.setting.GoalSettingActivity import org.keepgoeat.presentation.setting.GoalSettingActivity.Companion.ARG_GOAL_CONTENT +import org.keepgoeat.presentation.setting.GoalSettingActivity.Companion.ARG_IS_UPDATED import org.keepgoeat.presentation.type.RecyclerLayoutType import org.keepgoeat.util.ItemDecorationUtil import org.keepgoeat.util.binding.BindingActivity @@ -18,15 +21,24 @@ import org.keepgoeat.util.binding.BindingActivity class GoalDetailActivity : BindingActivity(R.layout.activity_goal_detail) { private val viewModel: GoalDetailViewModel by viewModels() private lateinit var adapter: GoalStickerListAdapter + private var isUpdated = false + private val callback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + moveToHome() + } + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.viewModel = viewModel binding.lifecycleOwner = this - if (intent.hasExtra(ARG_GOAL_ID)) { - val goalId = intent.getIntExtra(ARG_GOAL_ID, -1) + intent.let { + val goalId = it.getIntExtra(ARG_GOAL_ID, -1) viewModel.fetchGoalDetailInfo(goalId) + + isUpdated = it.getBooleanExtra(ARG_IS_UPDATED, false) + if (isUpdated) this.onBackPressedDispatcher.addCallback(this, callback) } initLayout() @@ -42,7 +54,8 @@ class GoalDetailActivity : BindingActivity(R.layout.a private fun addListeners() { binding.ivBack.setOnClickListener { - finish() + if (isUpdated) moveToHome() + else finish() } binding.ivKeep.setOnClickListener { showGoalKeepDialog() @@ -74,6 +87,12 @@ class GoalDetailActivity : BindingActivity(R.layout.a GoalKeepBottomDialogFragment().show(supportFragmentManager, "goalKeepDialog") } + private fun moveToHome() { + val intent = Intent(this, HomeActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + startActivity(intent) + } + companion object { private const val CARD_ITEM_SPACE = 2 private const val CARD_MATRIX_ROW = 5 diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt index e55b6240..72e95178 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt @@ -6,6 +6,8 @@ import androidx.activity.viewModels import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.ActivityGoalSettingBinding +import org.keepgoeat.presentation.detail.GoalDetailActivity +import org.keepgoeat.presentation.detail.GoalDetailActivity.Companion.ARG_GOAL_ID import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.model.GoalContent import org.keepgoeat.presentation.type.EatingType @@ -18,6 +20,7 @@ import org.keepgoeat.util.safeValueOf @AndroidEntryPoint class GoalSettingActivity : BindingActivity(R.layout.activity_goal_setting) { private val viewModel: GoalSettingViewModel by viewModels() + private var isEditMode: Boolean = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -31,6 +34,7 @@ class GoalSettingActivity : BindingActivity(R.layout } it.getParcelable(ARG_GOAL_CONTENT, GoalContent::class.java)?.let { goal -> + isEditMode = true viewModel.setGoalContent(goal) } } @@ -43,7 +47,8 @@ class GoalSettingActivity : BindingActivity(R.layout viewModel.uploadState.observe(this) { state -> when (state) { is UiState.Success -> { - moveToHome() + if (isEditMode) moveToDetail() + else moveToHome() } else -> {} } @@ -66,8 +71,18 @@ class GoalSettingActivity : BindingActivity(R.layout startActivity(intent) } + private fun moveToDetail() { + val intent = Intent(this, GoalDetailActivity::class.java).apply { + putExtra(ARG_GOAL_ID, viewModel.goalId) + putExtra(ARG_IS_UPDATED, true) + } + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + startActivity(intent) + } + companion object { const val ARG_EATING_TYPE = "eatingType" const val ARG_GOAL_CONTENT = "goalContent" + const val ARG_IS_UPDATED = "isUpdated" } } From 470b0549236a5f7e1e040f4a58068f2d92302465 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 16:30:59 +0900 Subject: [PATCH 211/745] =?UTF-8?q?[feat]=20#68=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EB=8B=AC=EC=84=B1=20API=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/model/request/RequestGoalCompleted.kt | 8 ++++++++ .../model/response/ResponseCompletedResult.kt | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 app/src/main/java/org/keepgoeat/data/model/request/RequestGoalCompleted.kt create mode 100644 app/src/main/java/org/keepgoeat/data/model/response/ResponseCompletedResult.kt diff --git a/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalCompleted.kt b/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalCompleted.kt new file mode 100644 index 00000000..5418e736 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalCompleted.kt @@ -0,0 +1,8 @@ +package org.keepgoeat.data.model.request + +import kotlinx.serialization.Serializable + +@Serializable +data class RequestGoalCompleted( + val isAchieved: Boolean +) diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseCompletedResult.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseCompletedResult.kt new file mode 100644 index 00000000..b17d82c6 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseCompletedResult.kt @@ -0,0 +1,18 @@ +package org.keepgoeat.data.model.response + +import kotlinx.serialization.Serializable + +@Serializable +data class ResponseCompletedResult( + val data: Data?, + val message: String, + val status: Int, + val success: Boolean +) { + @Serializable + data class Data( + val goalId: Int, + val thisMonthCount: Int, + val updatedIsAchieved: Boolean + ) +} \ No newline at end of file From 72229b323c771427e6c711c513eeaa7ecdec7e2b Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 16:34:12 +0900 Subject: [PATCH 212/745] =?UTF-8?q?[chore]=20#68=20LAUNCHER=20=ED=99=88=20?= =?UTF-8?q?=EB=B7=B0=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 --- app/src/main/AndroidManifest.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cf679146..bab59ad9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,20 +18,20 @@ tools:targetApi="31"> + tools:ignore="LockedOrientationActivity"/> + - From f2c37a0991ef9e7d201c94b6da937c4a6c7f7525 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 16:34:59 +0900 Subject: [PATCH 213/745] =?UTF-8?q?[feat]=20#68=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EB=8B=AC=EC=84=B1=20API=20=EC=97=B0=EA=B2=B0=EC=9D=84=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/GoalDataSource.kt | 5 +++++ .../model/response/ResponseCompletedResult.kt | 2 +- .../data/repository/GoalRepositoryImpl.kt | 19 +++++++++++++++++++ .../org/keepgoeat/data/service/GoalService.kt | 8 ++++++++ .../domain/repository/GoalRepository.kt | 2 ++ 5 files changed, 35 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index 397e2894..356c9790 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -1,7 +1,9 @@ package org.keepgoeat.data.datasource.remote import org.keepgoeat.data.ApiResult +import org.keepgoeat.data.model.request.RequestGoalCompleted import org.keepgoeat.data.model.request.RequestGoalContent +import org.keepgoeat.data.model.response.ResponseCompletedResult import org.keepgoeat.data.model.response.ResponseGoalContent import org.keepgoeat.data.model.response.ResponseGoalDetail import org.keepgoeat.data.model.response.ResponseHome @@ -20,4 +22,7 @@ class GoalDataSource @Inject constructor( suspend fun fetchGoalDetail(goalId: Int): ApiResult = safeApiCall { goalService.fetchGoalDetail(goalId) } + + suspend fun completeGoal(goalId: Int, requestGoalCompleted: RequestGoalCompleted): ApiResult = + safeApiCall { goalService.completeGoal(goalId, requestGoalCompleted) } } diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseCompletedResult.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseCompletedResult.kt index b17d82c6..e0756f2b 100644 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseCompletedResult.kt +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseCompletedResult.kt @@ -15,4 +15,4 @@ data class ResponseCompletedResult( val thisMonthCount: Int, val updatedIsAchieved: Boolean ) -} \ No newline at end of file +} diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index 88f904dc..8714e6d5 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -2,7 +2,9 @@ package org.keepgoeat.data.repository import org.keepgoeat.data.ApiResult import org.keepgoeat.data.datasource.remote.GoalDataSource +import org.keepgoeat.data.model.request.RequestGoalCompleted import org.keepgoeat.data.model.request.RequestGoalContent +import org.keepgoeat.data.model.response.ResponseCompletedResult import org.keepgoeat.data.model.response.ResponseGoalContent import org.keepgoeat.data.model.response.ResponseGoalDetail import org.keepgoeat.data.model.response.ResponseHome @@ -30,6 +32,23 @@ class GoalRepositoryImpl @Inject constructor( } } + override suspend fun completeGoal(goalId: Int, isCompleted: Boolean): ResponseCompletedResult.Data? { + val result = goalDataSource.completeGoal(goalId, RequestGoalCompleted(isCompleted)) + return when (result) { + is ApiResult.Success -> { + result.data?.data + } + is ApiResult.NetworkError -> { + Timber.d("Network Error") + null + } + is ApiResult.GenericError -> { + Timber.d("(${result.code}): ${result.message}") + null + } + } + } + override suspend fun uploadGoalContent(title: String, isMore: Boolean): ResponseGoalContent.ResponseGoalContentData? { val result = goalDataSource.uploadGoalContent(RequestGoalContent(title, isMore)) diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index 904ebbfe..581cc836 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -1,6 +1,8 @@ package org.keepgoeat.data.service +import org.keepgoeat.data.model.request.RequestGoalCompleted import org.keepgoeat.data.model.request.RequestGoalContent +import org.keepgoeat.data.model.response.ResponseCompletedResult import org.keepgoeat.data.model.response.ResponseGoalContent import org.keepgoeat.data.model.response.ResponseGoalDetail import org.keepgoeat.data.model.response.ResponseHome @@ -16,4 +18,10 @@ interface GoalService { @GET("history/{goalId}") suspend fun fetchGoalDetail(@Path("goalId") goalId: Int): Response + + @POST("goal/achieve/{goalId}") + suspend fun completeGoal( + @Path("goalId") goalId: Int, + @Body request: RequestGoalCompleted + ): Response } diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 65f89ba8..6ef6b1aa 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -1,11 +1,13 @@ package org.keepgoeat.domain.repository +import org.keepgoeat.data.model.response.ResponseCompletedResult import org.keepgoeat.data.model.response.ResponseGoalContent import org.keepgoeat.data.model.response.ResponseGoalDetail import org.keepgoeat.data.model.response.ResponseHome interface GoalRepository { suspend fun fetchHomeEntireData(): ResponseHome.HomeData? + suspend fun completeGoal(goalId: Int, isCompleted: Boolean): ResponseCompletedResult.Data? suspend fun uploadGoalContent(title: String, isMore: Boolean): ResponseGoalContent.ResponseGoalContentData? suspend fun fetchGoalDetail(goalId: Int): ResponseGoalDetail.ResponseGoalDetailData? } From 2450380cf81267a48beb8c36cf450f4dbdf2db76 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 16:35:46 +0900 Subject: [PATCH 214/745] =?UTF-8?q?[mod]=20#68=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EB=8B=AC=EC=84=B1=20API=20viewModelScope=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/home/HomeViewModel.kt | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 2a882bb6..1dbdd09c 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -30,15 +30,19 @@ class HomeViewModel @Inject constructor( fun changeGoalAchieved(myGoal: HomeGoal) { val position = goalList.value?.indexOf(myGoal) ?: return - with(myGoal) { - _goalList.value?.set( - position, - HomeGoal( - id, goalTitle, isMore, !isAchieved, thisMonthCount, type - ) - ) + viewModelScope.launch { + goalRepository.completeGoal(myGoal.id, myGoal.isAchieved)?.let { goalData -> + with(myGoal) { + _goalList.value?.set( + position, + HomeGoal( + id, goalTitle, isMore, goalData.updatedIsAchieved, goalData.thisMonthCount, type + ) + ) + } + _goalList.value = _goalList.value?.toMutableList() // TODO 서버쪽에서 api 확인해주면 toMutableList 안붙여도 되는지 확인하기 + } } - _goalList.value = _goalList.value } private fun fetchGoalList() { From 779c43c717e5011731cfa22b1dc46f4929f66017 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 10 Jan 2023 16:36:19 +0900 Subject: [PATCH 215/745] =?UTF-8?q?[mod]=20#79=20dummyAccessToken=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/keepgoeat/di/NetworkModule.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/di/NetworkModule.kt b/app/src/main/java/org/keepgoeat/di/NetworkModule.kt index d408b015..e80cc831 100644 --- a/app/src/main/java/org/keepgoeat/di/NetworkModule.kt +++ b/app/src/main/java/org/keepgoeat/di/NetworkModule.kt @@ -20,6 +20,7 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) object NetworkModule { + private const val dummyAccessToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTIsImVtYWlsIjoicGFya191YmluQG5hdmVyLmNvbSIsImlhdCI6MTY3MzMyOTE3NSwiZXhwIjoxNjczODMzMTc1LCJpc3MiOiJLRUVQR09FQVRfU0VSVkVSIn0.zPlL2aRxpILrmvJVT298FbeXrKpZUkkYJ4HecPBvh4U" @OptIn(ExperimentalSerializationApi::class) @Provides @Singleton @@ -49,7 +50,7 @@ object NetworkModule { .newBuilder() .addHeader( "accesstoken", - "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTIsImVtYWlsIjoicGFya191YmluQG5hdmVyLmNvbSIsImlhdCI6MTY3MzI2OTU2NywiZXhwIjoxNjczNzczNTY3LCJpc3MiOiJLRUVQR09FQVRfU0VSVkVSIn0.Uk_LjMBfRauozQDEBoq6sIDFEf6k8zAxifXljcToNgk" + dummyAccessToken ) .addHeader("Content-Type", "Application/json") .build() @@ -60,7 +61,7 @@ object NetworkModule { @Provides @Singleton fun provideOkHttpClientBuilder( - interceptor: Interceptor + interceptor: Interceptor, ): OkHttpClient = OkHttpClient.Builder().apply { connectTimeout(10, TimeUnit.SECONDS) From a1a339930df2e7be481e58a563668823865cb1e4 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 10 Jan 2023 17:13:19 +0900 Subject: [PATCH 216/745] =?UTF-8?q?[mod]=20#81=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80,=20=EC=88=98=EC=A0=95=20=EC=84=B1=EA=B3=B5?= =?UTF-8?q?=20=EC=8B=9C=20=ED=86=A0=EC=8A=A4=ED=8A=B8=20=EB=9D=84=EC=9A=B0?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/setting/GoalSettingActivity.kt | 11 +++++++++-- app/src/main/res/values/strings.xml | 2 ++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt index 72e95178..be2aa09a 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt @@ -15,6 +15,7 @@ import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity import org.keepgoeat.util.extension.getParcelable import org.keepgoeat.util.extension.showKeyboard +import org.keepgoeat.util.extension.showToast import org.keepgoeat.util.safeValueOf @AndroidEntryPoint @@ -47,8 +48,14 @@ class GoalSettingActivity : BindingActivity(R.layout viewModel.uploadState.observe(this) { state -> when (state) { is UiState.Success -> { - if (isEditMode) moveToDetail() - else moveToHome() + if (isEditMode) { + showToast(getString(R.string.goal_setting_success_edit_toast_message)) + moveToDetail() + } + else { + showToast(getString(R.string.goal_setting_success_add_toast_message)) + moveToHome() + } } else -> {} } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 561ead5b..d76fd721 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -80,5 +80,7 @@ 진행기간 %s. %s. %s ~ %s. %s. %s 네, 삭제할래요 + 목표가 수정되었습니다. + 목표가 추가되었습니다. \ No newline at end of file From b36cb1ba64a1f1feb4cbfb53106dbf2bfce18c07 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 10 Jan 2023 17:20:05 +0900 Subject: [PATCH 217/745] =?UTF-8?q?[chore]=20#81=20ktlint=20>=20max=5Fline?= =?UTF-8?q?=5Flength=EC=9D=84=20off=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 --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index 1c514dae..5969a198 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,5 +1,5 @@ [*] -max_line_length = 140 +max_line_length = off [*.{kt, kts}] disabled_rules = import-ordering, no-wildcard-imports \ No newline at end of file From 3f04cfb5ddd942a0c56e5490f01687f262201393 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 10 Jan 2023 17:26:20 +0900 Subject: [PATCH 218/745] =?UTF-8?q?[chore]=20#81=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/presentation/setting/GoalSettingActivity.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt index be2aa09a..e63086b4 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt @@ -19,7 +19,8 @@ import org.keepgoeat.util.extension.showToast import org.keepgoeat.util.safeValueOf @AndroidEntryPoint -class GoalSettingActivity : BindingActivity(R.layout.activity_goal_setting) { +class GoalSettingActivity : + BindingActivity(R.layout.activity_goal_setting) { private val viewModel: GoalSettingViewModel by viewModels() private var isEditMode: Boolean = false @@ -51,8 +52,7 @@ class GoalSettingActivity : BindingActivity(R.layout if (isEditMode) { showToast(getString(R.string.goal_setting_success_edit_toast_message)) moveToDetail() - } - else { + } else { showToast(getString(R.string.goal_setting_success_add_toast_message)) moveToHome() } From 69683da59ea228c767f0a59492bd6d0813719479 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 10 Jan 2023 17:38:36 +0900 Subject: [PATCH 219/745] =?UTF-8?q?[fix]=20#87=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B7=B0=EC=97=90=EC=84=9C=20=ED=82=A4?= =?UTF-8?q?=EB=B3=B4=EB=93=9C=20=EC=9C=84=EB=A1=9C=20=EB=B2=84=ED=8A=BC?= =?UTF-8?q?=EC=9D=B4=20=EC=98=AC=EB=9D=BC=EC=98=A4=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a6b18b27..29bc0e7f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -62,6 +62,7 @@ android:name=".presentation.setting.GoalSettingActivity" android:exported="false" android:screenOrientation="portrait" + android:windowSoftInputMode="adjustResize" tools:ignore="LockedOrientationActivity" /> Date: Tue, 10 Jan 2023 17:43:41 +0900 Subject: [PATCH 220/745] =?UTF-8?q?[mod]=20#89=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20->=20=EB=AA=A9=ED=91=9C=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=EC=9C=BC=EB=A1=9C=20=EC=8A=A4=ED=8A=B8=EB=A7=81=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 --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d76fd721..29b8f53f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -51,7 +51,7 @@ 잘못된 목표인가요? 삭제하기 - 목표 설정 + 목표 입력 나의 목표를 입력해볼까요? ex) 하루 1끼 이상 야채 ex) 라면 From b21c5203e20dc9c002fcd8656c7c4ad54ed633f9 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 10 Jan 2023 17:51:52 +0900 Subject: [PATCH 221/745] =?UTF-8?q?=20[fix]=20#86=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B7=B0=EC=97=90=EC=84=9C=20=EB=8D=94?= =?UTF-8?q?=EB=A8=B9=EA=B8=B0,=20=EB=8D=9C=EB=A8=B9=EA=B8=B0=20TextView?= =?UTF-8?q?=EA=B0=80=20=EB=B3=B4=EC=9D=B4=EC=A7=80=20=EC=95=8A=EB=8A=94=20?= =?UTF-8?q?=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/detail/GoalDetailActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 686cffbb..0603f9a1 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -65,7 +65,7 @@ class GoalDetailActivity : BindingActivity(R.layout.a val content = GoalContent(detail.id, detail.goalTitle) Intent(this, GoalSettingActivity::class.java).apply { putExtra(ARG_GOAL_CONTENT, content) - putExtra(ARG_EATING_TYPE, detail.eatingType) + putExtra(ARG_EATING_TYPE, detail.eatingType.name) }.also { startActivity(it) } From 960ffebf26de15c09e6c2c9f189845d08414116e Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 18:11:41 +0900 Subject: [PATCH 222/745] =?UTF-8?q?[feat]=20#83=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EB=B3=B4=EA=B4=80=20API=20response=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/model/response/ResponseGoalKeep.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalKeep.kt diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalKeep.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalKeep.kt new file mode 100644 index 00000000..4abe1f54 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalKeep.kt @@ -0,0 +1,16 @@ +package org.keepgoeat.data.model.response + +import kotlinx.serialization.Serializable + +@Serializable +data class ResponseGoalKeep( + val data: Data?, + val message: String, + val status: Int, + val success: Boolean +) { + @Serializable + data class Data( + val goalId: Int + ) +} \ No newline at end of file From 74665c111373c197f83025f753eb5fa9986f1cd8 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 18:12:20 +0900 Subject: [PATCH 223/745] =?UTF-8?q?[feat]=20#83=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EB=B3=B4=EA=B4=80=20API=20=EC=97=B0=EB=8F=99=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/GoalDataSource.kt | 4 ++++ .../data/repository/GoalRepositoryImpl.kt | 19 +++++++++++++++++++ .../org/keepgoeat/data/service/GoalService.kt | 4 ++++ .../domain/repository/GoalRepository.kt | 2 ++ 4 files changed, 29 insertions(+) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index 187e46a1..bafa7aa0 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -5,6 +5,7 @@ import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.request.RequestGoalContentTitle import org.keepgoeat.data.model.response.ResponseGoalContent import org.keepgoeat.data.model.response.ResponseGoalDetail +import org.keepgoeat.data.model.response.ResponseGoalKeep import org.keepgoeat.data.model.response.ResponseHome import org.keepgoeat.data.service.GoalService import org.keepgoeat.util.safeApiCall @@ -25,4 +26,7 @@ class GoalDataSource @Inject constructor( // TODO goalId -> id 로 파라미터명 변경 suspend fun fetchGoalDetail(goalId: Int): ApiResult = safeApiCall { goalService.fetchGoalDetail(goalId) } + + suspend fun keepGoalDetail(id: Int): ApiResult = + safeApiCall { goalService.keepGoalDetail(id) } } diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index 28a4f497..c4db5d34 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -6,6 +6,7 @@ import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.request.RequestGoalContentTitle import org.keepgoeat.data.model.response.ResponseGoalContent import org.keepgoeat.data.model.response.ResponseGoalDetail +import org.keepgoeat.data.model.response.ResponseGoalKeep import org.keepgoeat.data.model.response.ResponseHome import org.keepgoeat.domain.repository.GoalRepository import timber.log.Timber @@ -84,4 +85,22 @@ class GoalRepositoryImpl @Inject constructor( } } } + + override suspend fun keepGoalDetail(id: Int): ResponseGoalKeep.Data? { + val result = goalDataSource.keepGoalDetail(id) + + return when(result){ + is ApiResult.Success -> { + result.data?.data + } + is ApiResult.NetworkError -> { + Timber.d("Network Error") + null + } + is ApiResult.GenericError -> { + Timber.d("(${result.code}): ${result.message}") + null + } + } + } } diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index afc3a787..9d650e03 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -4,6 +4,7 @@ import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.request.RequestGoalContentTitle import org.keepgoeat.data.model.response.ResponseGoalContent import org.keepgoeat.data.model.response.ResponseGoalDetail +import org.keepgoeat.data.model.response.ResponseGoalKeep import org.keepgoeat.data.model.response.ResponseHome import retrofit2.Response import retrofit2.http.* @@ -20,4 +21,7 @@ interface GoalService { @GET("history/{goalId}") suspend fun fetchGoalDetail(@Path("goalId") goalId: Int): Response + + @POST("goal/keep/{goalId}") + suspend fun keepGoalDetail(@Path("goalId") id: Int): Response } diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 7857eece..e27b6e5f 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -2,6 +2,7 @@ package org.keepgoeat.domain.repository import org.keepgoeat.data.model.response.ResponseGoalContent import org.keepgoeat.data.model.response.ResponseGoalDetail +import org.keepgoeat.data.model.response.ResponseGoalKeep import org.keepgoeat.data.model.response.ResponseHome interface GoalRepository { @@ -10,4 +11,5 @@ interface GoalRepository { suspend fun uploadGoalContent(title: String, isMore: Boolean): ResponseGoalContent.ResponseGoalContentData? suspend fun editGoalContent(id: Int, title: String): ResponseGoalContent.ResponseGoalContentData? suspend fun fetchGoalDetail(goalId: Int): ResponseGoalDetail.ResponseGoalDetailData? + suspend fun keepGoalDetail(id:Int):ResponseGoalKeep.Data? } From c6cb5a06f0aee176c15673d45066234220eb4c94 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 18:13:11 +0900 Subject: [PATCH 224/745] =?UTF-8?q?[feat]=20#83=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EB=B3=B4=EA=B4=80=20API=20=EC=97=B0=EA=B2=B0,=20goalId=20?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalDetailActivity.kt | 11 ++++++++++- .../presentation/detail/GoalDetailViewModel.kt | 11 +++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 686cffbb..215b705a 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -10,6 +10,7 @@ import org.keepgoeat.databinding.ActivityGoalDetailBinding import org.keepgoeat.presentation.detail.GoalDetailViewModel.Companion.CELL_COUNT import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.model.GoalContent +import org.keepgoeat.presentation.my.MyActivity import org.keepgoeat.presentation.setting.GoalSettingActivity import org.keepgoeat.presentation.setting.GoalSettingActivity.Companion.ARG_GOAL_CONTENT import org.keepgoeat.presentation.setting.GoalSettingActivity.Companion.ARG_IS_UPDATED @@ -81,10 +82,18 @@ class GoalDetailActivity : BindingActivity(R.layout.a viewModel.goalStickers.observe(this) { stickers -> adapter.submitList(stickers) } + viewModel.goalId.observe(this){ + val intent = Intent(this, MyActivity::class.java) + startActivity(intent) + finish() + } } private fun showGoalKeepDialog() { - GoalKeepBottomDialogFragment().show(supportFragmentManager, "goalKeepDialog") + intent?.let { + val goalId = it.getIntExtra(ARG_GOAL_ID, -1) + GoalKeepBottomDialogFragment(goalId).show(supportFragmentManager, "goalKeepDialog") + } } private fun moveToHome() { diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt index b2c469f8..e0fadd5d 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt @@ -17,6 +17,8 @@ class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRe val goalStickers: LiveData> get() = _goalStickers private val _goalDetail = MutableLiveData() val goalDetail: LiveData get() = _goalDetail + private val _goalId = MutableLiveData() + val goalId: LiveData get() = _goalId fun fetchGoalDetailInfo(goalId: Int) { viewModelScope.launch { @@ -29,8 +31,13 @@ class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRe } } - fun keepGoal() { - // TODO api 연동 필요 + fun keepGoal(goalId: Int) { + viewModelScope.launch { + goalRepository.keepGoalDetail(goalId).let { keptData -> + keptData ?: return@launch + _goalId.value = keptData.goalId + } + } } fun deleteGoal() { From 203e9cb47c8be9bff4e629645042044a589c5a33 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 18:13:48 +0900 Subject: [PATCH 225/745] =?UTF-8?q?[mod]=20#83=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=EB=B7=B0=EC=97=90=EC=84=9C=20=ED=98=84=EC=9E=AC=20=EB=AA=A9?= =?UTF-8?q?=ED=91=9C=20=EC=95=84=EC=9D=B4=EB=94=94=20=EA=B0=92=20=EB=B0=9B?= =?UTF-8?q?=EC=95=84=EC=98=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalKeepBottomDialogFragment.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt index b854cf6c..59d7609b 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt @@ -9,7 +9,7 @@ import org.keepgoeat.databinding.DialogBottomGoalKeepBinding import org.keepgoeat.util.binding.BindingBottomSheetDialogFragment @AndroidEntryPoint -class GoalKeepBottomDialogFragment : +class GoalKeepBottomDialogFragment(val goalId: Int) : BindingBottomSheetDialogFragment(R.layout.dialog_bottom_goal_keep) { private val viewModel: GoalDetailViewModel by activityViewModels() @@ -22,7 +22,7 @@ class GoalKeepBottomDialogFragment : private fun addListeners() { binding.btnKeep.setOnClickListener { - viewModel.keepGoal() + viewModel.keepGoal(goalId) } binding.tvDelete.setOnClickListener { From 0dea7b57f89c61a2261e47bcfd44922eafa8a99c Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 18:26:47 +0900 Subject: [PATCH 226/745] =?UTF-8?q?[mod]=20#83=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=EC=84=9C=20=ED=99=88?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=8F=8C=EC=95=84=EA=B0=88=EB=95=8C=20?= =?UTF-8?q?=ED=99=88=20=EB=B7=B0=20=EB=A6=AC=ED=94=84=EB=A0=88=EC=89=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/presentation/my/MyActivity.kt | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt index da18a8d2..5d1866f1 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt @@ -1,11 +1,14 @@ package org.keepgoeat.presentation.my +import android.content.Intent import android.os.Bundle +import androidx.activity.OnBackPressedCallback import androidx.activity.viewModels import androidx.recyclerview.widget.ConcatAdapter import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.ActivityMyBinding +import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.presentation.type.SortType import org.keepgoeat.util.binding.BindingActivity @@ -16,6 +19,11 @@ class MyActivity : BindingActivity(R.layout.activity_my) { private val goalAdapter = MyGoalAdapter() private val headerAdapter = MyHeaderAdapter(::getFilteredGoalWithEatingType) private val goalConcatAdapter = ConcatAdapter(headerAdapter, goalAdapter) + private val callback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + moveToHome() + } + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -32,6 +40,7 @@ class MyActivity : BindingActivity(R.layout.activity_my) { adapter = goalConcatAdapter itemAnimator = null } + this.onBackPressedDispatcher.addCallback(this, callback) } private fun getFilteredGoalWithEatingType(eatingType: EatingType?) { @@ -44,7 +53,7 @@ class MyActivity : BindingActivity(R.layout.activity_my) { private fun addListeners() { binding.ivBack.setOnClickListener { - finish() + moveToHome() } } @@ -53,4 +62,11 @@ class MyActivity : BindingActivity(R.layout.activity_my) { goalAdapter.submitList(goals.toMutableList()) } } + + private fun moveToHome() { + val intent = Intent(this, HomeActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + startActivity(intent) + finish() + } } From 056473c3ffd58484bed508adb22d954afb092da8 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 18:48:37 +0900 Subject: [PATCH 227/745] =?UTF-8?q?[mod]=20#83=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=A6=AC=EC=8B=B8=EC=9D=B4?= =?UTF-8?q?=ED=81=B4=EB=9F=AC=EB=B7=B0=20=ED=95=98=EB=8B=A8=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=ED=85=9C=20=EC=9E=98=EB=A0=A4=EB=B3=B4=EC=9D=B4?= =?UTF-8?q?=EB=8A=94=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_my.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_my.xml b/app/src/main/res/layout/activity_my.xml index c3220f3a..4dacaa72 100644 --- a/app/src/main/res/layout/activity_my.xml +++ b/app/src/main/res/layout/activity_my.xml @@ -39,10 +39,12 @@ \ No newline at end of file From 6210d3cebb661227ffccc55f621f48eb2043f70b Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 18:51:52 +0900 Subject: [PATCH 228/745] =?UTF-8?q?[chore]=20#83=20=EC=BB=A8=EB=B2=A4?= =?UTF-8?q?=EC=85=98=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 --- app/src/main/AndroidManifest.xml | 14 +++++++------- .../data/model/response/ResponseGoalKeep.kt | 2 +- .../keepgoeat/domain/repository/GoalRepository.kt | 3 ++- .../presentation/detail/GoalDetailActivity.kt | 2 +- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a6b18b27..ecc5e355 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,20 +18,20 @@ tools:targetApi="31"> + tools:ignore="LockedOrientationActivity"/> + - diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalKeep.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalKeep.kt index 4abe1f54..4f5a2e90 100644 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalKeep.kt +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalKeep.kt @@ -13,4 +13,4 @@ data class ResponseGoalKeep( data class Data( val goalId: Int ) -} \ No newline at end of file +} diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index e27b6e5f..2a6a309e 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -7,9 +7,10 @@ import org.keepgoeat.data.model.response.ResponseHome interface GoalRepository { suspend fun fetchHomeEntireData(): ResponseHome.HomeData? + // TODO update -> add 네이밍 수정 필요 suspend fun uploadGoalContent(title: String, isMore: Boolean): ResponseGoalContent.ResponseGoalContentData? suspend fun editGoalContent(id: Int, title: String): ResponseGoalContent.ResponseGoalContentData? suspend fun fetchGoalDetail(goalId: Int): ResponseGoalDetail.ResponseGoalDetailData? - suspend fun keepGoalDetail(id:Int):ResponseGoalKeep.Data? + suspend fun keepGoalDetail(id: Int): ResponseGoalKeep.Data? } diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 215b705a..1b36f63f 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -82,7 +82,7 @@ class GoalDetailActivity : BindingActivity(R.layout.a viewModel.goalStickers.observe(this) { stickers -> adapter.submitList(stickers) } - viewModel.goalId.observe(this){ + viewModel.goalId.observe(this) { val intent = Intent(this, MyActivity::class.java) startActivity(intent) finish() From 30f80df50b00f1b0f3335a99f6a975a7755a933c Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 18:54:33 +0900 Subject: [PATCH 229/745] =?UTF-8?q?[mod]=20#83=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=A6=AC=EC=8B=B8=EC=9D=B4?= =?UTF-8?q?=ED=81=B4=EB=9F=AC=EB=B7=B0=20=ED=95=98=EB=8B=A8=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=ED=85=9C=20=EC=9E=98=EB=A0=A4=EB=B3=B4=EC=9D=B4?= =?UTF-8?q?=EB=8A=94=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_my.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/activity_my.xml b/app/src/main/res/layout/activity_my.xml index 4dacaa72..475aa8f9 100644 --- a/app/src/main/res/layout/activity_my.xml +++ b/app/src/main/res/layout/activity_my.xml @@ -40,11 +40,11 @@ android:id="@+id/rv_goal_list" android:layout_width="match_parent" android:layout_height="0dp" - android:paddingTop="6dp" android:clipToPadding="false" + android:paddingTop="6dp" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" - app:layout_constraintTop_toBottomOf="@id/layout_toolbar" app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@id/layout_toolbar" tools:listitem="@layout/item_my_goal" /> \ No newline at end of file From 250a5a6d5b9ee11c810ef17e0b455ee007a33f78 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 19:01:47 +0900 Subject: [PATCH 230/745] =?UTF-8?q?[chore]=20#83=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/data/repository/GoalRepositoryImpl.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index c4db5d34..6397c27d 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -32,7 +32,10 @@ class GoalRepositoryImpl @Inject constructor( } } - override suspend fun uploadGoalContent(title: String, isMore: Boolean): ResponseGoalContent.ResponseGoalContentData? { + override suspend fun uploadGoalContent( + title: String, + isMore: Boolean + ): ResponseGoalContent.ResponseGoalContentData? { val result = goalDataSource.uploadGoalContent(RequestGoalContent(title, isMore)) return when (result) { @@ -50,7 +53,10 @@ class GoalRepositoryImpl @Inject constructor( } } - override suspend fun editGoalContent(id: Int, title: String): ResponseGoalContent.ResponseGoalContentData? { + override suspend fun editGoalContent( + id: Int, + title: String + ): ResponseGoalContent.ResponseGoalContentData? { val result = goalDataSource.editGoalContent(id, RequestGoalContentTitle(title)) return when (result) { @@ -89,7 +95,7 @@ class GoalRepositoryImpl @Inject constructor( override suspend fun keepGoalDetail(id: Int): ResponseGoalKeep.Data? { val result = goalDataSource.keepGoalDetail(id) - return when(result){ + return when (result) { is ApiResult.Success -> { result.data?.data } From bb0004ee1bcec111c1361ac5165a8d5263b76caf Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 19:28:55 +0900 Subject: [PATCH 231/745] =?UTF-8?q?[mod]=20#83=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=EC=84=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=85=90=ED=8A=B8=20=ED=95=84=ED=84=B0=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=8B=9C=20finish()=ED=95=A8=EC=88=98=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt index 5d1866f1..0b09c91d 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt @@ -67,6 +67,5 @@ class MyActivity : BindingActivity(R.layout.activity_my) { val intent = Intent(this, HomeActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK startActivity(intent) - finish() } } From bc1715766da434e4dfbd1071909310bc36909c9c Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 20:24:29 +0900 Subject: [PATCH 232/745] =?UTF-8?q?[chore]=20#83=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/data/datasource/remote/GoalDataSource.kt | 4 ++-- .../org/keepgoeat/data/model/response/ResponseGoalKeep.kt | 4 ++-- .../java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt | 4 ++-- app/src/main/java/org/keepgoeat/data/service/GoalService.kt | 2 +- .../java/org/keepgoeat/domain/repository/GoalRepository.kt | 2 +- .../org/keepgoeat/presentation/detail/GoalDetailViewModel.kt | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index bafa7aa0..5b7c28c3 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -27,6 +27,6 @@ class GoalDataSource @Inject constructor( suspend fun fetchGoalDetail(goalId: Int): ApiResult = safeApiCall { goalService.fetchGoalDetail(goalId) } - suspend fun keepGoalDetail(id: Int): ApiResult = - safeApiCall { goalService.keepGoalDetail(id) } + suspend fun keepGoal(id: Int): ApiResult = + safeApiCall { goalService.keepGoal(id) } } diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalKeep.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalKeep.kt index 4f5a2e90..cb720ac5 100644 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalKeep.kt +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalKeep.kt @@ -4,13 +4,13 @@ import kotlinx.serialization.Serializable @Serializable data class ResponseGoalKeep( - val data: Data?, + val data: ResponseGoalKeepData?, val message: String, val status: Int, val success: Boolean ) { @Serializable - data class Data( + data class ResponseGoalKeepData( val goalId: Int ) } diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index 6397c27d..a9b67cbf 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -92,8 +92,8 @@ class GoalRepositoryImpl @Inject constructor( } } - override suspend fun keepGoalDetail(id: Int): ResponseGoalKeep.Data? { - val result = goalDataSource.keepGoalDetail(id) + override suspend fun keepGoal(id: Int): ResponseGoalKeep.ResponseGoalKeepData? { + val result = goalDataSource.keepGoal(id) return when (result) { is ApiResult.Success -> { diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index 9d650e03..804c2001 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -23,5 +23,5 @@ interface GoalService { suspend fun fetchGoalDetail(@Path("goalId") goalId: Int): Response @POST("goal/keep/{goalId}") - suspend fun keepGoalDetail(@Path("goalId") id: Int): Response + suspend fun keepGoal(@Path("goalId") id: Int): Response } diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 2a6a309e..ae4817f5 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -12,5 +12,5 @@ interface GoalRepository { suspend fun uploadGoalContent(title: String, isMore: Boolean): ResponseGoalContent.ResponseGoalContentData? suspend fun editGoalContent(id: Int, title: String): ResponseGoalContent.ResponseGoalContentData? suspend fun fetchGoalDetail(goalId: Int): ResponseGoalDetail.ResponseGoalDetailData? - suspend fun keepGoalDetail(id: Int): ResponseGoalKeep.Data? + suspend fun keepGoal(id: Int): ResponseGoalKeep.ResponseGoalKeepData? } diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt index e0fadd5d..e2f815ee 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt @@ -33,7 +33,7 @@ class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRe fun keepGoal(goalId: Int) { viewModelScope.launch { - goalRepository.keepGoalDetail(goalId).let { keptData -> + goalRepository.keepGoal(goalId).let { keptData -> keptData ?: return@launch _goalId.value = keptData.goalId } From f06cac421a28236086fa869435aaee58e1e78543 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 20:28:16 +0900 Subject: [PATCH 233/745] =?UTF-8?q?[mod]=20#83=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20activity=EC=97=90=EC=84=9C=20UiState=20obs?= =?UTF-8?q?erve=20=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=EC=9C=BC?= =?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 --- .../presentation/detail/GoalDetailActivity.kt | 23 ++++++++++++++----- .../detail/GoalDetailViewModel.kt | 6 ++++- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 422adc93..7dc27f0f 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -16,10 +16,12 @@ import org.keepgoeat.presentation.setting.GoalSettingActivity.Companion.ARG_GOAL import org.keepgoeat.presentation.setting.GoalSettingActivity.Companion.ARG_IS_UPDATED import org.keepgoeat.presentation.type.RecyclerLayoutType import org.keepgoeat.util.ItemDecorationUtil +import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity @AndroidEntryPoint -class GoalDetailActivity : BindingActivity(R.layout.activity_goal_detail) { +class GoalDetailActivity : + BindingActivity(R.layout.activity_goal_detail) { private val viewModel: GoalDetailViewModel by viewModels() private lateinit var adapter: GoalStickerListAdapter private var isUpdated = false @@ -49,7 +51,11 @@ class GoalDetailActivity : BindingActivity(R.layout.a private fun initLayout() { binding.rvGoalCard.addItemDecoration( - ItemDecorationUtil(CARD_ITEM_SPACE, Pair(CARD_MATRIX_ROW, CARD_MATRIX_COL), RecyclerLayoutType.GRID) + ItemDecorationUtil( + CARD_ITEM_SPACE, + Pair(CARD_MATRIX_ROW, CARD_MATRIX_COL), + RecyclerLayoutType.GRID + ) ) } @@ -82,10 +88,15 @@ class GoalDetailActivity : BindingActivity(R.layout.a viewModel.goalStickers.observe(this) { stickers -> adapter.submitList(stickers) } - viewModel.goalId.observe(this) { - val intent = Intent(this, MyActivity::class.java) - startActivity(intent) - finish() + viewModel.keepState.observe(this) { keepState -> + when (keepState) { + is UiState.Success -> { + val intent = Intent(this, MyActivity::class.java) + startActivity(intent) + finish() + } + else -> {} + } } } diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt index e2f815ee..ad21930a 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt @@ -6,9 +6,11 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import org.keepgoeat.data.model.response.ResponseGoalKeep import org.keepgoeat.domain.model.GoalDetail import org.keepgoeat.domain.model.GoalSticker import org.keepgoeat.domain.repository.GoalRepository +import org.keepgoeat.util.UiState import javax.inject.Inject @HiltViewModel @@ -19,6 +21,8 @@ class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRe val goalDetail: LiveData get() = _goalDetail private val _goalId = MutableLiveData() val goalId: LiveData get() = _goalId + private val _keepState = MutableLiveData>() + val keepState: LiveData> get() = _keepState fun fetchGoalDetailInfo(goalId: Int) { viewModelScope.launch { @@ -35,7 +39,7 @@ class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRe viewModelScope.launch { goalRepository.keepGoal(goalId).let { keptData -> keptData ?: return@launch - _goalId.value = keptData.goalId + _keepState.value = UiState.Success(keptData) } } } From b5c02380fac1144f6df76216b680377b3504e9df Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 21:15:44 +0900 Subject: [PATCH 234/745] =?UTF-8?q?[mod]=20#83=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EB=B3=B4=EA=B4=80=20setOnClickListener=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=EB=B0=94=EC=9D=B8=EB=94=A9=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/detail/GoalDetailActivity.kt | 2 +- .../presentation/detail/GoalKeepBottomDialogFragment.kt | 4 ---- app/src/main/res/layout/dialog_bottom_goal_keep.xml | 1 + 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 7dc27f0f..a841765b 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -39,7 +39,7 @@ class GoalDetailActivity : intent.let { val goalId = it.getIntExtra(ARG_GOAL_ID, -1) viewModel.fetchGoalDetailInfo(goalId) - + viewModel.setGoalId(goalId) isUpdated = it.getBooleanExtra(ARG_IS_UPDATED, false) if (isUpdated) this.onBackPressedDispatcher.addCallback(this, callback) } diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt index 59d7609b..f03b44ef 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt @@ -21,10 +21,6 @@ class GoalKeepBottomDialogFragment(val goalId: Int) : } private fun addListeners() { - binding.btnKeep.setOnClickListener { - viewModel.keepGoal(goalId) - } - binding.tvDelete.setOnClickListener { showGoalDeleteDialog() } diff --git a/app/src/main/res/layout/dialog_bottom_goal_keep.xml b/app/src/main/res/layout/dialog_bottom_goal_keep.xml index 1fdd3211..4c758ae0 100644 --- a/app/src/main/res/layout/dialog_bottom_goal_keep.xml +++ b/app/src/main/res/layout/dialog_bottom_goal_keep.xml @@ -48,6 +48,7 @@ android:layout_marginTop="12dp" android:backgroundTint="@{context.getColor(viewModel.goalDetail.eatingType.buttonBackgroundColor)}" android:text="목표 보관하기" + android:onClick="@{viewModel::keepGoal}" android:textColor="@{context.getColor(viewModel.goalDetail.eatingType.buttonTextColor)}" app:layout_constraintTop_toBottomOf="@id/iv_snail" app:rippleColor="@{context.getColor(viewModel.goalDetail.eatingType.buttonRippleColor)}" From 3730bf49cf049fc44e2b4edfaf750e69f8e2701e Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 21:16:22 +0900 Subject: [PATCH 235/745] =?UTF-8?q?[mod]=20#83=20=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B8=8C=EB=8D=B0=EC=9D=B4=ED=84=B0=20set=ED=95=A8=EC=88=98=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 --- .../presentation/detail/GoalDetailViewModel.kt | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt index ad21930a..e5717b8e 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt @@ -1,5 +1,6 @@ package org.keepgoeat.presentation.detail +import android.view.View import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -14,7 +15,8 @@ import org.keepgoeat.util.UiState import javax.inject.Inject @HiltViewModel -class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRepository) : ViewModel() { +class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRepository) : + ViewModel() { private val _goalStickers = MutableLiveData>() val goalStickers: LiveData> get() = _goalStickers private val _goalDetail = MutableLiveData() @@ -35,15 +37,21 @@ class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRe } } - fun keepGoal(goalId: Int) { + fun keepGoal(view: View) { viewModelScope.launch { - goalRepository.keepGoal(goalId).let { keptData -> - keptData ?: return@launch - _keepState.value = UiState.Success(keptData) + goalId.value?.let { id -> + goalRepository.keepGoal(id).let { keptData -> + keptData ?: return@launch + _keepState.value = UiState.Success(keptData) + } } } } + fun setGoalId(id: Int) { + _goalId.value = id + } + fun deleteGoal() { // TODO api 연동 필요 } From 24065df5e28105d1bc863ee24a346aea6501a5d6 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 21:20:37 +0900 Subject: [PATCH 236/745] =?UTF-8?q?[chore]=20#83=20string=EA=B0=92=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/dialog_bottom_goal_keep.xml | 2 +- app/src/main/res/values/strings.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/dialog_bottom_goal_keep.xml b/app/src/main/res/layout/dialog_bottom_goal_keep.xml index 4c758ae0..74450690 100644 --- a/app/src/main/res/layout/dialog_bottom_goal_keep.xml +++ b/app/src/main/res/layout/dialog_bottom_goal_keep.xml @@ -47,7 +47,7 @@ android:layout_marginHorizontal="@dimen/spacing16" android:layout_marginTop="12dp" android:backgroundTint="@{context.getColor(viewModel.goalDetail.eatingType.buttonBackgroundColor)}" - android:text="목표 보관하기" + android:text="@string/goal_keep" android:onClick="@{viewModel::keepGoal}" android:textColor="@{context.getColor(viewModel.goalDetail.eatingType.buttonTextColor)}" app:layout_constraintTop_toBottomOf="@id/iv_snail" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 29b8f53f..38e9a54c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -49,6 +49,7 @@ 목표 달성이 끝났나요?\n달성 완료된 목표는 보관해서 모아볼 수 있어요. 잘못된 목표인가요? 삭제하기 + 목표 보관하기 목표 입력 From 38061b72acaf811283790f5359b6466f25f3ce75 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 21:22:47 +0900 Subject: [PATCH 237/745] =?UTF-8?q?[mod]=20#83=20BottomDialogFragment=20?= =?UTF-8?q?=EC=9D=B8=EC=9E=90=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/detail/GoalDetailActivity.kt | 2 +- .../presentation/detail/GoalKeepBottomDialogFragment.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index a841765b..2c42344a 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -103,7 +103,7 @@ class GoalDetailActivity : private fun showGoalKeepDialog() { intent?.let { val goalId = it.getIntExtra(ARG_GOAL_ID, -1) - GoalKeepBottomDialogFragment(goalId).show(supportFragmentManager, "goalKeepDialog") + GoalKeepBottomDialogFragment().show(supportFragmentManager, "goalKeepDialog") } } diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt index f03b44ef..94e4d351 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt @@ -9,7 +9,7 @@ import org.keepgoeat.databinding.DialogBottomGoalKeepBinding import org.keepgoeat.util.binding.BindingBottomSheetDialogFragment @AndroidEntryPoint -class GoalKeepBottomDialogFragment(val goalId: Int) : +class GoalKeepBottomDialogFragment() : BindingBottomSheetDialogFragment(R.layout.dialog_bottom_goal_keep) { private val viewModel: GoalDetailViewModel by activityViewModels() From 62e82ccf5c06054a5491076a58cdfb894296d83c Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 21:51:42 +0900 Subject: [PATCH 238/745] =?UTF-8?q?[mod]=20#83=20clipToPadding=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_my.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/res/layout/activity_my.xml b/app/src/main/res/layout/activity_my.xml index 475aa8f9..a7132184 100644 --- a/app/src/main/res/layout/activity_my.xml +++ b/app/src/main/res/layout/activity_my.xml @@ -40,7 +40,6 @@ android:id="@+id/rv_goal_list" android:layout_width="match_parent" android:layout_height="0dp" - android:clipToPadding="false" android:paddingTop="6dp" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layout_constraintBottom_toBottomOf="parent" From ad65f268ca1a6a78398ecf108d89d1a908566251 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 21:52:17 +0900 Subject: [PATCH 239/745] =?UTF-8?q?[mod]=20#83=20databinding=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/dialog_bottom_goal_keep.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/dialog_bottom_goal_keep.xml b/app/src/main/res/layout/dialog_bottom_goal_keep.xml index 74450690..e6849cb3 100644 --- a/app/src/main/res/layout/dialog_bottom_goal_keep.xml +++ b/app/src/main/res/layout/dialog_bottom_goal_keep.xml @@ -47,8 +47,8 @@ android:layout_marginHorizontal="@dimen/spacing16" android:layout_marginTop="12dp" android:backgroundTint="@{context.getColor(viewModel.goalDetail.eatingType.buttonBackgroundColor)}" + android:onClick="@{() -> viewModel.keepGoal()}" android:text="@string/goal_keep" - android:onClick="@{viewModel::keepGoal}" android:textColor="@{context.getColor(viewModel.goalDetail.eatingType.buttonTextColor)}" app:layout_constraintTop_toBottomOf="@id/iv_snail" app:rippleColor="@{context.getColor(viewModel.goalDetail.eatingType.buttonRippleColor)}" From e4d626e50e36282ff72cc1dc506e0bf56af548d6 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 21:52:39 +0900 Subject: [PATCH 240/745] =?UTF-8?q?[chore]=20#83=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/detail/GoalDetailActivity.kt | 5 +---- .../presentation/detail/GoalKeepBottomDialogFragment.kt | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 2c42344a..993d07ab 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -39,7 +39,6 @@ class GoalDetailActivity : intent.let { val goalId = it.getIntExtra(ARG_GOAL_ID, -1) viewModel.fetchGoalDetailInfo(goalId) - viewModel.setGoalId(goalId) isUpdated = it.getBooleanExtra(ARG_IS_UPDATED, false) if (isUpdated) this.onBackPressedDispatcher.addCallback(this, callback) } @@ -91,8 +90,7 @@ class GoalDetailActivity : viewModel.keepState.observe(this) { keepState -> when (keepState) { is UiState.Success -> { - val intent = Intent(this, MyActivity::class.java) - startActivity(intent) + startActivity(Intent(this, MyActivity::class.java)) finish() } else -> {} @@ -102,7 +100,6 @@ class GoalDetailActivity : private fun showGoalKeepDialog() { intent?.let { - val goalId = it.getIntExtra(ARG_GOAL_ID, -1) GoalKeepBottomDialogFragment().show(supportFragmentManager, "goalKeepDialog") } } diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt index 94e4d351..9adb2da5 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt @@ -9,7 +9,7 @@ import org.keepgoeat.databinding.DialogBottomGoalKeepBinding import org.keepgoeat.util.binding.BindingBottomSheetDialogFragment @AndroidEntryPoint -class GoalKeepBottomDialogFragment() : +class GoalKeepBottomDialogFragment : BindingBottomSheetDialogFragment(R.layout.dialog_bottom_goal_keep) { private val viewModel: GoalDetailViewModel by activityViewModels() From 62906487fc72b1f542bcaec10142cd5c9405e671 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 21:53:02 +0900 Subject: [PATCH 241/745] =?UTF-8?q?[mod]=20#83=20LiveData=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalDetailViewModel.kt | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt index e5717b8e..b54bba9b 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt @@ -1,13 +1,11 @@ package org.keepgoeat.presentation.detail -import android.view.View import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch -import org.keepgoeat.data.model.response.ResponseGoalKeep import org.keepgoeat.domain.model.GoalDetail import org.keepgoeat.domain.model.GoalSticker import org.keepgoeat.domain.repository.GoalRepository @@ -23,10 +21,11 @@ class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRe val goalDetail: LiveData get() = _goalDetail private val _goalId = MutableLiveData() val goalId: LiveData get() = _goalId - private val _keepState = MutableLiveData>() - val keepState: LiveData> get() = _keepState + private val _keepState = MutableLiveData>() + val keepState: LiveData> get() = _keepState fun fetchGoalDetailInfo(goalId: Int) { + _goalId.value = goalId viewModelScope.launch { goalRepository.fetchGoalDetail(goalId).let { detail -> _goalDetail.value = detail?.toGoalDetail() ?: return@launch @@ -37,21 +36,17 @@ class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRe } } - fun keepGoal(view: View) { + fun keepGoal() { viewModelScope.launch { goalId.value?.let { id -> goalRepository.keepGoal(id).let { keptData -> keptData ?: return@launch - _keepState.value = UiState.Success(keptData) + _keepState.value = UiState.Success(keptData.goalId) } } } } - fun setGoalId(id: Int) { - _goalId.value = id - } - fun deleteGoal() { // TODO api 연동 필요 } From 950dd95b8a6a62561de6c2aab4068761599101ee Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 22:13:29 +0900 Subject: [PATCH 242/745] =?UTF-8?q?[chore]=20#83=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=EB=AA=85,=20=EB=B3=80=EC=88=98=EB=AA=85,=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/GoalDataSource.kt | 20 ++++++++++-------- ...Completed.kt => RequestGoalAchievement.kt} | 2 +- ...edResult.kt => ResponseGoalAchievement.kt} | 6 +++--- .../data/repository/GoalRepositoryImpl.kt | 15 +++++++------ .../org/keepgoeat/data/service/GoalService.kt | 21 +++++++++---------- .../domain/repository/GoalRepository.kt | 4 ++-- .../presentation/home/HomeViewModel.kt | 8 +++---- 7 files changed, 38 insertions(+), 38 deletions(-) rename app/src/main/java/org/keepgoeat/data/model/request/{RequestGoalCompleted.kt => RequestGoalAchievement.kt} (78%) rename app/src/main/java/org/keepgoeat/data/model/response/{ResponseCompletedResult.kt => ResponseGoalAchievement.kt} (70%) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index 868c95cb..9cac0e10 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -1,14 +1,10 @@ package org.keepgoeat.data.datasource.remote import org.keepgoeat.data.ApiResult -import org.keepgoeat.data.model.request.RequestGoalCompleted +import org.keepgoeat.data.model.request.RequestGoalAchievement import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.request.RequestGoalContentTitle -import org.keepgoeat.data.model.response.ResponseCompletedResult -import org.keepgoeat.data.model.response.ResponseGoalContent -import org.keepgoeat.data.model.response.ResponseGoalDetail -import org.keepgoeat.data.model.response.ResponseGoalKeep -import org.keepgoeat.data.model.response.ResponseHome +import org.keepgoeat.data.model.response.* import org.keepgoeat.data.service.GoalService import org.keepgoeat.util.safeApiCall import javax.inject.Inject @@ -22,7 +18,10 @@ class GoalDataSource @Inject constructor( suspend fun uploadGoalContent(requestGoalContent: RequestGoalContent): ApiResult = safeApiCall { goalService.uploadGoalContent(requestGoalContent) } - suspend fun editGoalContent(id: Int, title: RequestGoalContentTitle): ApiResult = + suspend fun editGoalContent( + id: Int, + title: RequestGoalContentTitle + ): ApiResult = safeApiCall { goalService.editGoalContent(id, title) } // TODO goalId -> id 로 파라미터명 변경 @@ -32,6 +31,9 @@ class GoalDataSource @Inject constructor( suspend fun keepGoal(id: Int): ApiResult = safeApiCall { goalService.keepGoal(id) } - suspend fun completeGoal(goalId: Int, requestGoalCompleted: RequestGoalCompleted): ApiResult = - safeApiCall { goalService.completeGoal(goalId, requestGoalCompleted) } + suspend fun completeGoal( + goalId: Int, + requestGoalAchievement: RequestGoalAchievement + ): ApiResult = + safeApiCall { goalService.achieveGoal(goalId, requestGoalAchievement) } } diff --git a/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalCompleted.kt b/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalAchievement.kt similarity index 78% rename from app/src/main/java/org/keepgoeat/data/model/request/RequestGoalCompleted.kt rename to app/src/main/java/org/keepgoeat/data/model/request/RequestGoalAchievement.kt index 5418e736..74c704a5 100644 --- a/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalCompleted.kt +++ b/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalAchievement.kt @@ -3,6 +3,6 @@ package org.keepgoeat.data.model.request import kotlinx.serialization.Serializable @Serializable -data class RequestGoalCompleted( +data class RequestGoalAchievement( val isAchieved: Boolean ) diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseCompletedResult.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalAchievement.kt similarity index 70% rename from app/src/main/java/org/keepgoeat/data/model/response/ResponseCompletedResult.kt rename to app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalAchievement.kt index e0756f2b..366a3486 100644 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseCompletedResult.kt +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalAchievement.kt @@ -3,14 +3,14 @@ package org.keepgoeat.data.model.response import kotlinx.serialization.Serializable @Serializable -data class ResponseCompletedResult( - val data: Data?, +data class ResponseGoalAchievement( + val data: ResponseGoalAchievementData?, val message: String, val status: Int, val success: Boolean ) { @Serializable - data class Data( + data class ResponseGoalAchievementData( val goalId: Int, val thisMonthCount: Int, val updatedIsAchieved: Boolean diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index 3e777f4c..1edb4f17 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -2,14 +2,10 @@ package org.keepgoeat.data.repository import org.keepgoeat.data.ApiResult import org.keepgoeat.data.datasource.remote.GoalDataSource -import org.keepgoeat.data.model.request.RequestGoalCompleted +import org.keepgoeat.data.model.request.RequestGoalAchievement import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.request.RequestGoalContentTitle -import org.keepgoeat.data.model.response.ResponseCompletedResult -import org.keepgoeat.data.model.response.ResponseGoalContent -import org.keepgoeat.data.model.response.ResponseGoalDetail -import org.keepgoeat.data.model.response.ResponseGoalKeep -import org.keepgoeat.data.model.response.ResponseHome +import org.keepgoeat.data.model.response.* import org.keepgoeat.domain.repository.GoalRepository import timber.log.Timber import javax.inject.Inject @@ -34,8 +30,11 @@ class GoalRepositoryImpl @Inject constructor( } } - override suspend fun completeGoal(goalId: Int, isCompleted: Boolean): ResponseCompletedResult.Data? { - val result = goalDataSource.completeGoal(goalId, RequestGoalCompleted(isCompleted)) + override suspend fun achieveGoal( + goalId: Int, + isAchieved: Boolean + ): ResponseGoalAchievement.ResponseGoalAchievementData? { + val result = goalDataSource.completeGoal(goalId, RequestGoalAchievement(isAchieved)) return when (result) { is ApiResult.Success -> { result.data?.data diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index 0cc7ca14..441f93ba 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -1,13 +1,9 @@ package org.keepgoeat.data.service -import org.keepgoeat.data.model.request.RequestGoalCompleted +import org.keepgoeat.data.model.request.RequestGoalAchievement import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.request.RequestGoalContentTitle -import org.keepgoeat.data.model.response.ResponseCompletedResult -import org.keepgoeat.data.model.response.ResponseGoalContent -import org.keepgoeat.data.model.response.ResponseGoalDetail -import org.keepgoeat.data.model.response.ResponseGoalKeep -import org.keepgoeat.data.model.response.ResponseHome +import org.keepgoeat.data.model.response.* import retrofit2.Response import retrofit2.http.* @@ -19,7 +15,10 @@ interface GoalService { suspend fun uploadGoalContent(@Body request: RequestGoalContent): Response @POST("goal/{goalId}") - suspend fun editGoalContent(@Path("goalId") id: Int, @Body goalContent: RequestGoalContentTitle): Response + suspend fun editGoalContent( + @Path("goalId") id: Int, + @Body goalContent: RequestGoalContentTitle + ): Response @GET("history/{goalId}") suspend fun fetchGoalDetail(@Path("goalId") goalId: Int): Response @@ -28,8 +27,8 @@ interface GoalService { suspend fun keepGoal(@Path("goalId") id: Int): Response @POST("goal/achieve/{goalId}") - suspend fun completeGoal( - @Path("goalId") goalId: Int, - @Body request: RequestGoalCompleted - ): Response + suspend fun achieveGoal( + @Path("goalId") id: Int, + @Body goalAchievement: RequestGoalAchievement + ): Response } diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index e449e689..985ab786 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -1,6 +1,6 @@ package org.keepgoeat.domain.repository -import org.keepgoeat.data.model.response.ResponseCompletedResult +import org.keepgoeat.data.model.response.ResponseGoalAchievement import org.keepgoeat.data.model.response.ResponseGoalContent import org.keepgoeat.data.model.response.ResponseGoalDetail import org.keepgoeat.data.model.response.ResponseGoalKeep @@ -8,7 +8,7 @@ import org.keepgoeat.data.model.response.ResponseHome interface GoalRepository { suspend fun fetchHomeEntireData(): ResponseHome.HomeData? - suspend fun completeGoal(goalId: Int, isCompleted: Boolean): ResponseCompletedResult.Data? + suspend fun achieveGoal(goalId: Int, isAchieved: Boolean): ResponseGoalAchievement.ResponseGoalAchievementData? // TODO update -> add 네이밍 수정 필요 suspend fun uploadGoalContent(title: String, isMore: Boolean): ResponseGoalContent.ResponseGoalContentData? diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 1dbdd09c..becde312 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -28,11 +28,11 @@ class HomeViewModel @Inject constructor( fetchGoalList() } - fun changeGoalAchieved(myGoal: HomeGoal) { - val position = goalList.value?.indexOf(myGoal) ?: return + fun changeGoalAchieved(goal: HomeGoal) { + val position = goalList.value?.indexOf(goal) ?: return viewModelScope.launch { - goalRepository.completeGoal(myGoal.id, myGoal.isAchieved)?.let { goalData -> - with(myGoal) { + goalRepository.achieveGoal(goal.id, goal.isAchieved)?.let { goalData -> + with(goal) { _goalList.value?.set( position, HomeGoal( From 46ffcab9ec4cefe45af20f7753f6960a8a31a960 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 22:19:53 +0900 Subject: [PATCH 243/745] =?UTF-8?q?[mod]=20#68=20=EC=84=9C=EB=B2=84?= =?UTF-8?q?=ED=86=B5=EC=8B=A0=20=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/presentation/home/HomeViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index becde312..a1b454d0 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -31,7 +31,7 @@ class HomeViewModel @Inject constructor( fun changeGoalAchieved(goal: HomeGoal) { val position = goalList.value?.indexOf(goal) ?: return viewModelScope.launch { - goalRepository.achieveGoal(goal.id, goal.isAchieved)?.let { goalData -> + goalRepository.achieveGoal(goal.id, !goal.isAchieved)?.let { goalData -> with(goal) { _goalList.value?.set( position, From 445111aff46572bd3e16b6330a27d77f1877e267 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 22:57:16 +0900 Subject: [PATCH 244/745] =?UTF-8?q?[fix]=20#88=20=ED=99=88=20=EB=B7=B0=20?= =?UTF-8?q?=EB=AA=A9=ED=91=9C=203=EA=B0=9C=20=EC=9D=BC=EB=95=8C=20?= =?UTF-8?q?=EB=AA=A9=ED=91=9C=20=EC=B6=94=EA=B0=80=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EB=B9=84=ED=99=9C=EC=84=B1=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/home/HomeMyGoalAdapter.kt | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt index 3063f0a5..2fee576a 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt @@ -79,9 +79,10 @@ class HomeMyGoalAdapter( binding.btnMakeGoal.setVisibility(false) } } - - binding.root.setOnClickListener { - showMakeGoalDialog() + if (goalCount < 3) { + binding.root.setOnClickListener { + showMakeGoalDialog() + } } } } @@ -106,9 +107,19 @@ class HomeMyGoalAdapter( when (holder) { is MyGoalViewHolder -> { if (currentList[position].isMore) { - holder.bind(currentList[position], EatingType.MORE, changeBtnColor, moveToDetail) + holder.bind( + currentList[position], + EatingType.MORE, + changeBtnColor, + moveToDetail + ) } else { - holder.bind(currentList[position], EatingType.LESS, changeBtnColor, moveToDetail) + holder.bind( + currentList[position], + EatingType.LESS, + changeBtnColor, + moveToDetail + ) } } // TODO 서버통신 데이터클래스로 변경하면 size 정보 받아온걸로 바꾸기 From 99d4919497238af4f2973ea7fccac8a9e1f78767 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 23:07:17 +0900 Subject: [PATCH 245/745] =?UTF-8?q?[fix]=20#88=20=ED=99=88=20=EB=B7=B0=20?= =?UTF-8?q?=EB=AA=A9=ED=91=9C=EC=97=90=20=EB=8D=94=EB=A8=B9=EA=B8=B0/?= =?UTF-8?q?=EB=8D=9C=EB=A8=B9=EA=B8=B0=20string=20=EB=B6=99=EC=9D=B4?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/item_home_goal.xml | 2 +- app/src/main/res/values/strings.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/item_home_goal.xml b/app/src/main/res/layout/item_home_goal.xml index ad1394db..3976410b 100644 --- a/app/src/main/res/layout/item_home_goal.xml +++ b/app/src/main/res/layout/item_home_goal.xml @@ -46,7 +46,7 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing16" android:layout_marginTop="@dimen/spacing12" - android:text="@{goal.goalTitle}" + android:text="@{String.format(context.getString(goalType.titleStrRes), goal.goalTitle)}" android:textAppearance="@style/TextAppearance.System4_Bold" android:textColor="@color/gray_700" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 38e9a54c..51ce1ed9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -8,6 +8,8 @@ 덜 먹기 더 먹기 아니오 + %s 더 먹기 + %s 덜 먹기 카카오톡 로그인 @@ -74,8 +76,6 @@ 전체 - %s 더 먹기 - %s 덜 먹기 보관한 목표 총 달성일 진행기간 From 0c001e70d8fdce80bcf6fb26edbe7b193638517c Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 23:20:49 +0900 Subject: [PATCH 246/745] =?UTF-8?q?[chore]=20#68=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt | 2 +- .../java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index 9cac0e10..f8d569ad 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -31,7 +31,7 @@ class GoalDataSource @Inject constructor( suspend fun keepGoal(id: Int): ApiResult = safeApiCall { goalService.keepGoal(id) } - suspend fun completeGoal( + suspend fun achievedGoal( goalId: Int, requestGoalAchievement: RequestGoalAchievement ): ApiResult = diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index 1edb4f17..a6691d2d 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -34,7 +34,7 @@ class GoalRepositoryImpl @Inject constructor( goalId: Int, isAchieved: Boolean ): ResponseGoalAchievement.ResponseGoalAchievementData? { - val result = goalDataSource.completeGoal(goalId, RequestGoalAchievement(isAchieved)) + val result = goalDataSource.achievedGoal(goalId, RequestGoalAchievement(isAchieved)) return when (result) { is ApiResult.Success -> { result.data?.data From 1ca0f90cdb45fe5d20c8f91a8d226c1a46f48b18 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 23:45:57 +0900 Subject: [PATCH 247/745] =?UTF-8?q?[feat]=20#85=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20api=20response=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/model/response/ResponseGoalDeleted.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDeleted.kt diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDeleted.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDeleted.kt new file mode 100644 index 00000000..85704852 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDeleted.kt @@ -0,0 +1,16 @@ +package org.keepgoeat.data.model.response + +import kotlinx.serialization.Serializable + +@Serializable +data class ResponseGoalDeleted( + val data: ResponseGoalDeletedData?, + val message: String, + val status: Int, + val success: Boolean +) { + @Serializable + data class ResponseGoalDeletedData( + val goalId: Int + ) +} \ No newline at end of file From 1578ce903d82d33aa3429e717c0ff4813df37a83 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 23:46:22 +0900 Subject: [PATCH 248/745] =?UTF-8?q?[feat]=20#85=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20api=20=EB=A9=94=EC=86=8C=EB=93=9C=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 --- .../data/datasource/remote/GoalDataSource.kt | 5 ++++ .../data/repository/GoalRepositoryImpl.kt | 18 ++++++++++++++ .../org/keepgoeat/data/service/GoalService.kt | 5 ++++ .../domain/repository/GoalRepository.kt | 24 ++++++++++++------- 4 files changed, 44 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index f8d569ad..fec43ad8 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -36,4 +36,9 @@ class GoalDataSource @Inject constructor( requestGoalAchievement: RequestGoalAchievement ): ApiResult = safeApiCall { goalService.achieveGoal(goalId, requestGoalAchievement) } + + suspend fun deleteGoal( + id: Int + ): ApiResult = + safeApiCall { goalService.deleteGoal(id) } } diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index a6691d2d..e2e5eca6 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -127,4 +127,22 @@ class GoalRepositoryImpl @Inject constructor( } } } + + override suspend fun deleteGoal(id: Int): ResponseGoalDeleted.ResponseGoalDeletedData? { + val result = goalDataSource.deleteGoal(id) + + return when (result) { + is ApiResult.Success -> { + result.data?.data + } + is ApiResult.NetworkError -> { + Timber.d("Network Error") + null + } + is ApiResult.GenericError -> { + Timber.d("(${result.code}): ${result.message}") + null + } + } + } } diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index 441f93ba..d5a38302 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -31,4 +31,9 @@ interface GoalService { @Path("goalId") id: Int, @Body goalAchievement: RequestGoalAchievement ): Response + + @DELETE("goal/{goalId}") + suspend fun deleteGoal( + @Path("goalId") id: Int + ): Response } diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 985ab786..779c1385 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -1,18 +1,26 @@ package org.keepgoeat.domain.repository -import org.keepgoeat.data.model.response.ResponseGoalAchievement -import org.keepgoeat.data.model.response.ResponseGoalContent -import org.keepgoeat.data.model.response.ResponseGoalDetail -import org.keepgoeat.data.model.response.ResponseGoalKeep -import org.keepgoeat.data.model.response.ResponseHome +import org.keepgoeat.data.model.response.* interface GoalRepository { suspend fun fetchHomeEntireData(): ResponseHome.HomeData? - suspend fun achieveGoal(goalId: Int, isAchieved: Boolean): ResponseGoalAchievement.ResponseGoalAchievementData? + suspend fun achieveGoal( + goalId: Int, + isAchieved: Boolean + ): ResponseGoalAchievement.ResponseGoalAchievementData? // TODO update -> add 네이밍 수정 필요 - suspend fun uploadGoalContent(title: String, isMore: Boolean): ResponseGoalContent.ResponseGoalContentData? - suspend fun editGoalContent(id: Int, title: String): ResponseGoalContent.ResponseGoalContentData? + suspend fun uploadGoalContent( + title: String, + isMore: Boolean + ): ResponseGoalContent.ResponseGoalContentData? + + suspend fun editGoalContent( + id: Int, + title: String + ): ResponseGoalContent.ResponseGoalContentData? + suspend fun fetchGoalDetail(goalId: Int): ResponseGoalDetail.ResponseGoalDetailData? suspend fun keepGoal(id: Int): ResponseGoalKeep.ResponseGoalKeepData? + suspend fun deleteGoal(id: Int): ResponseGoalDeleted.ResponseGoalDeletedData? } From 0ceeb4f4d91a6af048de96af4f5e4e5cef40fa80 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 23:46:53 +0900 Subject: [PATCH 249/745] =?UTF-8?q?[feat]=20#85=20state=20LiveData=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1,=20viewModelScope=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalDetailViewModel.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt index b54bba9b..0fd75af7 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt @@ -23,6 +23,8 @@ class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRe val goalId: LiveData get() = _goalId private val _keepState = MutableLiveData>() val keepState: LiveData> get() = _keepState + private val _deleteState = MutableLiveData>() + val deleteState: LiveData> get() = _deleteState fun fetchGoalDetailInfo(goalId: Int) { _goalId.value = goalId @@ -48,7 +50,14 @@ class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRe } fun deleteGoal() { - // TODO api 연동 필요 + viewModelScope.launch { + goalId.value?.let { id -> + goalRepository.deleteGoal(id).let { deletedData -> + deletedData ?: return@launch + _deleteState.value = UiState.Success(deletedData.goalId) + } + } + } } companion object { From 71fa867a016494a4e768e956fc9b51b3ef66d030 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 23:47:26 +0900 Subject: [PATCH 250/745] =?UTF-8?q?[feat]=20#85=20xml=EC=97=90=20=EB=B7=B0?= =?UTF-8?q?=EB=AA=A8=EB=8D=B8=20=ED=95=A8=EC=88=98=20=EB=B0=94=EB=A1=9C=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/dialog_bottom_goal_delete.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/dialog_bottom_goal_delete.xml b/app/src/main/res/layout/dialog_bottom_goal_delete.xml index 93537746..d1446951 100644 --- a/app/src/main/res/layout/dialog_bottom_goal_delete.xml +++ b/app/src/main/res/layout/dialog_bottom_goal_delete.xml @@ -71,6 +71,7 @@ android:layout_marginStart="13dp" android:layout_marginEnd="@dimen/spacing16" android:backgroundTint="@color/gray_200" + android:onClick="@{() -> viewModel.deleteGoal()}" android:text="@string/goal_detail_delete_button_text" android:textAppearance="@style/TextAppearance.System5_Bold" android:textColor="@color/gray_400" From 79e53b1906e15ad133d6376f4fbfce078d9f5172 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 23:49:32 +0900 Subject: [PATCH 251/745] =?UTF-8?q?[delete]=20#85=20=EB=B7=B0=EB=AA=A8?= =?UTF-8?q?=EB=8D=B8=20=ED=95=A8=EC=88=98=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalDeleteBottomDialogFragment.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDeleteBottomDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDeleteBottomDialogFragment.kt index 6cbc7be8..1184c6f7 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDeleteBottomDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDeleteBottomDialogFragment.kt @@ -24,9 +24,5 @@ class GoalDeleteBottomDialogFragment : binding.btnNo.setOnClickListener { dismiss() } - - binding.btnYes.setOnClickListener { - viewModel.deleteGoal() - } } } From eddea95b3158abaecbbe5826727bb035c49f8f96 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 23:51:55 +0900 Subject: [PATCH 252/745] =?UTF-8?q?[feat]=20#85=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=EB=B7=B0=EC=97=90=EC=84=9C=20deleteState=20observe=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/presentation/detail/GoalDetailActivity.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 993d07ab..39054f59 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -96,6 +96,14 @@ class GoalDetailActivity : else -> {} } } + viewModel.deleteState.observe(this) { deleteState -> + when (deleteState) { + is UiState.Success -> { + startActivity(Intent(this, HomeActivity::class.java)) + } + else -> {} + } + } } private fun showGoalKeepDialog() { From 8131850acd503d98a6c020d285e5138c5dd088b5 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 23:56:27 +0900 Subject: [PATCH 253/745] =?UTF-8?q?[feat]=20#85=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=ED=9B=84=20HomeActivity=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=ED=95=A0=20=EB=95=8C=20=EC=83=81=EC=84=B8=20=EB=B7=B0?= =?UTF-8?q?=20finish=20=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 39054f59..5e604120 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -100,6 +100,7 @@ class GoalDetailActivity : when (deleteState) { is UiState.Success -> { startActivity(Intent(this, HomeActivity::class.java)) + finish() } else -> {} } From 3a244e19d26924bc9f5617c2cf0955953a1d3b3a Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 10 Jan 2023 23:58:46 +0900 Subject: [PATCH 254/745] =?UTF-8?q?[feat]=20#85=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EC=84=B1=EA=B3=B5=20=EC=8B=9C=20=ED=86=A0?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=A9=94=EC=8B=9C=EC=A7=80=20=EB=9D=84?= =?UTF-8?q?=EC=9A=B0=EA=B8=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/detail/GoalDetailActivity.kt | 2 ++ app/src/main/res/values/strings.xml | 1 + 2 files changed, 3 insertions(+) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 5e604120..d8eeda16 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -18,6 +18,7 @@ import org.keepgoeat.presentation.type.RecyclerLayoutType import org.keepgoeat.util.ItemDecorationUtil import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity +import org.keepgoeat.util.extension.showToast @AndroidEntryPoint class GoalDetailActivity : @@ -99,6 +100,7 @@ class GoalDetailActivity : viewModel.deleteState.observe(this) { deleteState -> when (deleteState) { is UiState.Success -> { + showToast(getString(R.string.goal_detail_success_goal_delete_toast_message)) startActivity(Intent(this, HomeActivity::class.java)) finish() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 51ce1ed9..a5fcea4d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -21,6 +21,7 @@ %s %s 지난달 먹은 날 이번달 먹은 날 + 목표가 삭제되었습니다. 오늘 식습관 목표 From d08931cfbf665d7c11244f05bcbb8efbbf0836f4 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Wed, 11 Jan 2023 04:06:07 +0900 Subject: [PATCH 255/745] =?UTF-8?q?[add]=20#93=20=EB=A1=9C=ED=8B=B0=20json?= =?UTF-8?q?=20=ED=8C=8C=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/home_background.json | 1 + app/src/main/assets/home_snail.json | 1 + 2 files changed, 2 insertions(+) create mode 100644 app/src/main/assets/home_background.json create mode 100644 app/src/main/assets/home_snail.json diff --git a/app/src/main/assets/home_background.json b/app/src/main/assets/home_background.json new file mode 100644 index 00000000..bc9bdd97 --- /dev/null +++ b/app/src/main/assets/home_background.json @@ -0,0 +1 @@ +{"v":"5.10.1","fr":60,"ip":0,"op":85,"w":360,"h":245,"nm":"homeBackgroundImage_0_and.png 2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[68,71,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[57.485,57.485,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.303,11.303],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-37.349,-10.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"boom_33","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.836121323529,0.836121323529,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"boom_32","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.836121323529,0.836121323529,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"boom_31","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":135,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.836121323529,0.836121323529,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"boom_30","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.836121323529,0.836121323529,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"boom_29","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":225,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.836121323529,0.836121323529,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"boom_28","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":270,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.836121323529,0.836121323529,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"boom_27","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":315,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.836121323529,0.836121323529,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"boom_26","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":360,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.836121323529,0.836121323529,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"round_4","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":62,"s":[39]},{"t":65,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-33.746,-11.708,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,3,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":26,"s":[31.68,31.68,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":65,"s":[292.769,292.769,100]},{"t":76.4,"s":[210.767,210.767,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[27.438,27.438],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":8,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.997341978784,0.892892156863,1,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.281,3.219],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":26,"op":85,"st":26,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"star_3","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":45,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-29.614,65.425,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[137.738,137.738,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-3.5,-55.5],[-3.5,35.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[49]},{"t":33,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[49]},{"t":37,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.835294117647,0.835294117647,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":7,"op":85,"st":7,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[325.5,92.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[78.706,78.706,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.303,11.303],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-37.349,-10.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"boom_25","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"boom_24","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"boom_23","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":135,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"boom_22","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"boom_21","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":225,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"boom_20","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":270,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"boom_19","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":315,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"boom_18","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":360,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"round_3","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":46,"s":[39]},{"t":49,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-33.746,-11.708,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,3,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":10,"s":[31.68,31.68,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":49,"s":[292.769,292.769,100]},{"t":60.4,"s":[210.767,210.767,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[27.438,27.438],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":8,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.997341978784,0.892892156863,1,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.281,3.219],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":82,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"star_2","parent":12,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[100]},{"t":29,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-29.614,65.425,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[137.738,137.738,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-3.5,-55.5],[-3.5,35.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[49]},{"t":28,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[49]},{"t":32,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":-9,"ct":1,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/assets/home_snail.json b/app/src/main/assets/home_snail.json new file mode 100644 index 00000000..30e52434 --- /dev/null +++ b/app/src/main/assets/home_snail.json @@ -0,0 +1 @@ + {"v":"5.10.1","fr":60,"ip":0,"op":85,"w":140,"h":140,"nm":"snail_orange_cheer 2","ddd":0,"assets":[{"id":"comp_0","nm":"snail_orange_cheer","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":0.9,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129,52.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[72.602,72.602,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.303,11.303],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":0,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-37.349,-10.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"boom_17","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"boom_16","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"boom_15","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":135,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"boom_14","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"boom_13","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":225,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"boom_12","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":270,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"boom_11","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":315,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"boom_10","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":360,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"round_2","sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60.5,"s":[100]},{"t":64.1,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[104.5,44.5,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,3,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20,"s":[23,23,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":64.1,"s":[167.904,167.904,100]},{"t":76.7,"s":[153.02,153.02,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[27.438,27.438],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":8,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.997341978784,0.892892156863,1,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.281,3.219],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":85,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":3,"nm":"▽ Group","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75.265,75,0],"ix":2,"l":2},"a":{"a":0,"k":[74.583,62.727,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"particle_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.755,35.363,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.776,-1.894],[0,0],[0,0],[0,0],[-2.403,-0.439],[0,0],[0,0]],"o":[[-2.507,-0.669],[0,0],[0,0],[0,0],[1.637,-1.804],[0,0],[0,0],[0,0]],"v":[[3.827,1.705],[-3.131,3.697],[-3.131,3.69],[-4.44,-0.97],[-4.064,-1.381],[2.427,-3.582],[3.159,-3.449],[4.44,1.865]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.709803938866,0.674509823322,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"particle_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[21.158,62.503,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.591,0.084],[0,0],[0,0],[0,0],[1.386,2.006],[0,0],[0,0]],"o":[[1.302,2.243],[0,0],[0,0],[0,0],[-2.438,0.118],[0,0],[0,0],[0,0]],"v":[[-1.581,-3.608],[4.743,-0.098],[4.75,-0.098],[2.382,4.122],[1.825,4.15],[-4.325,1.114],[-4.75,0.501],[-1.901,-4.159]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.709803938866,0.674509823322,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"particle_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.931,64.461,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.591,0.084],[0,0],[0,0],[0,0],[1.386,2.006],[0,0],[0,0]],"o":[[1.302,2.243],[0,0],[0,0],[0,0],[-2.438,0.118],[0,0],[0,0],[0,0]],"v":[[-1.581,-3.608],[4.743,-0.098],[4.75,-0.098],[2.382,4.122],[1.825,4.15],[-4.325,1.114],[-4.75,0.501],[-1.901,-4.159]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.596078455448,0.549019634724,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"particle_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.15,31.677,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-3.211,-0.104],[0,0],[0,0],[0,0],[1.546,2.591],[0,0],[0,0]],"o":[[1.428,2.876],[0,0],[0,0],[0,0],[-3.023,-0.049],[0,0],[0,0],[0,0]],"v":[[-1.647,-4.583],[5.882,0.265],[5.889,0.272],[2.622,5.286],[1.933,5.272],[-5.415,1.031],[-5.889,0.244],[-1.995,-5.286]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.596078455448,0.549019634724,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"particle_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50.642,43.465,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.104,3.211],[0,0],[0,0],[0,0],[2.486,-1.713],[0,0],[0,0]],"o":[[2.779,-1.609],[0,0],[0,0],[0,0],[0.146,3.016],[0,0],[0,0],[0,0]],"v":[[-4.459,1.954],[-0.113,-5.875],[-0.127,-5.875],[5.097,-2.943],[5.131,-2.253],[1.377,5.352],[0.625,5.875],[-5.142,2.351]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.807843148708,0.505882382393,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"particle_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[68.784,15.37,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.11,0.878],[0,0],[0,0],[0,0],[1.769,1.219],[0,0],[0,0]],"o":[[1.776,1.442],[0,0],[0,0],[0,0],[-1.964,0.857],[0,0],[0,0],[0,0]],"v":[[-2.493,-2.742],[3.81,-1.829],[3.81,-1.822],[3.183,2.384],[2.73,2.579],[-3.273,2.001],[-3.81,1.632],[-2.925,-3.097]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.784313738346,0.337254911661,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"cheer_2","parent":28,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-7.302,-4.357,0],"ix":2,"l":2},"a":{"a":0,"k":[10,-10,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.089,0.146],[-1.254,-1.86],[0,0],[0.536,-2.187],[-1.073,-1.295],[-0.369,-0.077],[0,0],[0.634,1.414],[0.049,0.334],[0,0],[0,0],[0,0],[-0.501,2.124],[-0.286,0.627],[0,0],[0.404,-3.106],[-0.021,-0.467],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.358,1.553],[-0.592,0.954],[2.814,-0.174],[0.279,0.021],[0,0],[-1.915,0.926],[-0.696,0.759],[1.24,1.811],[0.118,0.32],[0,0],[-1.79,0.237]],"o":[[2.25,-0.153],[0,0],[1.901,2.821],[-0.759,3.092],[0.362,0.432],[0,0],[-0.474,-0.209],[-0.188,-0.418],[0,0],[0,0],[0,0],[-0.23,-1.198],[0.202,-0.857],[0,0],[-1.08,0.989],[-0.063,0.529],[0,0],[0,0],[0,0],[0,0],[0,0],[1.17,-0.857],[0.961,-1.093],[-1.024,1.114],[-0.299,0.021],[0,0],[1.045,-0.063],[1.839,-0.891],[-0.55,-0.014],[-0.153,-0.223],[0,0],[1.066,0.383],[2.591,-0.348]],"v":[[5.417,-13.3],[11.393,-10.264],[11.407,-10.257],[11.804,-1.314],[10.71,5.303],[11.957,5.992],[9.366,10.652],[6.991,8.374],[6.664,7.232],[5.619,7.901],[6.19,11.188],[1.558,12.449],[1.649,7.288],[2.408,5.059],[1.823,5.595],[-1.638,11.815],[-1.701,13.312],[-6.681,12.268],[-4.027,6.459],[-4.94,5.86],[-8.701,10.38],[-12.009,6.334],[-8.102,2.754],[-5.789,-0.367],[-11.668,2.788],[-12.531,2.788],[-11.709,-3.173],[-7.008,-4.392],[-3.247,-7.192],[-7.551,-9.107],[-7.969,-9.915],[-4.313,-12.005],[0.089,-11.475]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.588235318661,0.498039245605,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"cheer_1","parent":29,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-8.562,-5.959,0],"ix":2,"l":2},"a":{"a":0,"k":[6,-10,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.839,0.383],[-1.344,-1.497],[0,0],[0.209,-2.013],[-1.114,-1.017],[-0.334,-0.028],[0,0],[0.738,1.184],[0.084,0.293],[0,0],[0,0],[0,0],[-0.181,1.95],[-0.174,0.592],[0,0],[-0.028,-2.814],[-0.077,-0.418],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.017,1.553],[-0.411,0.926],[2.479,-0.501],[0.258,-0.021],[0,0],[-1.588,1.059],[-0.522,0.759],[1.323,1.456],[0.146,0.272],[0,0],[-1.56,0.432]],"o":[[1.985,-0.418],[0,0],[2.034,2.271],[-0.293,2.842],[0.376,0.341],[0,0],[-0.453,-0.132],[-0.216,-0.348],[0,0],[0,0],[0,0],[-0.348,-1.038],[0.07,-0.787],[0,0],[-0.836,1.017],[0,0.474],[0,0],[0,0],[0,0],[0,0],[0,0],[0.933,-0.905],[0.717,-1.093],[-0.766,1.114],[-0.265,0.049],[0,0],[0.926,-0.181],[1.518,-1.017],[-0.488,0.056],[-0.16,-0.174],[0,0],[0.989,0.216],[2.264,-0.634]],"v":[[2.894,-12.216],[8.584,-10.259],[8.591,-10.252],[10.047,-2.354],[9.893,3.663],[11.084,4.123],[9.357,8.587],[6.961,6.853],[6.529,5.878],[5.687,6.602],[6.599,9.451],[2.636,11.144],[2.079,6.547],[2.476,4.471],[2.023,5.021],[-0.282,10.983],[-0.157,12.321],[-4.712,12.007],[-3.068,6.519],[-3.953,6.094],[-6.738,10.579],[-10.179,7.396],[-7.149,3.733],[-5.478,0.668],[-10.311,4.2],[-11.084,4.304],[-11.084,-1.101],[-7.052,-2.765],[-4.057,-5.718],[-8.117,-6.888],[-8.584,-7.55],[-5.596,-9.862],[-1.619,-9.932]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.588235318661,0.498039245605,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":21,"ty":3,"nm":"▽ Group 2","parent":11,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[84.106,69.501,0],"ix":2,"l":2},"a":{"a":0,"k":[65.06,55.953,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"eye_2","parent":30,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-29.964,-15.717,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[{"i":[[1.351,0.55],[-0.23,0.564],[0,0],[-1.351,-0.55],[0.299,-0.738]],"o":[[-1.351,-0.55],[0,0],[0.286,-0.703],[1.351,0.55],[-0.418,1.024]],"v":[[-0.364,0.835],[-2.454,-1.025],[-2.454,-1.032],[0.346,-1.06],[2.436,0.96]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[1.218,0.741],[-0.212,0.519],[0,0],[-1.237,-0.522],[0.277,-0.679]],"o":[[-1.147,-0.698],[0,0],[0.552,-1.309],[1.455,0.615],[-0.385,0.942]],"v":[[-1.412,2.024],[-2.472,-0.723],[-2.472,-0.729],[0.91,-2.078],[2.027,1.104]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[1.218,0.741],[-0.212,0.519],[0,0],[-1.237,-0.522],[0.277,-0.679]],"o":[[-1.147,-0.698],[0,0],[0.552,-1.309],[1.455,0.615],[-0.385,0.942]],"v":[[-1.412,2.024],[-2.472,-0.723],[-2.472,-0.729],[0.91,-2.078],[2.027,1.104]],"c":true}]},{"t":48,"s":[{"i":[[1.351,0.55],[-0.23,0.564],[0,0],[-1.351,-0.55],[0.299,-0.738]],"o":[[-1.351,-0.55],[0,0],[0.286,-0.703],[1.351,0.55],[-0.418,1.024]],"v":[[-0.364,0.835],[-2.454,-1.025],[-2.454,-1.032],[0.346,-1.06],[2.436,0.96]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921574354,0.372549027205,0.368627458811,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"eye_1","parent":30,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-47.734,-15.612,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[{"i":[[-1.198,0.488],[0.202,0.501],[0,0],[1.198,-0.495],[-0.265,-0.655]],"o":[[1.198,-0.488],[0,0],[-0.251,-0.62],[-1.198,0.495],[0.369,0.912]],"v":[[0.321,0.743],[2.181,-0.914],[2.181,-0.921],[-0.305,-0.942],[-2.165,0.855]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[-1.564,0.58],[0.361,0.886],[0,0],[1.785,-0.836],[-0.265,-0.655]],"o":[[1.408,-0.522],[0,0],[-0.327,-0.732],[-1.174,0.55],[0.369,0.912]],"v":[[1.134,2.118],[2.181,-0.914],[2.181,-0.921],[-1.118,-1.817],[-2.165,0.855]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[-1.564,0.58],[0.361,0.886],[0,0],[1.785,-0.836],[-0.265,-0.655]],"o":[[1.408,-0.522],[0,0],[-0.327,-0.732],[-1.174,0.55],[0.369,0.912]],"v":[[1.134,2.118],[2.181,-0.914],[2.181,-0.921],[-1.118,-1.817],[-2.165,0.855]],"c":true}]},{"t":48,"s":[{"i":[[-1.198,0.488],[0.202,0.501],[0,0],[1.198,-0.495],[-0.265,-0.655]],"o":[[1.198,-0.488],[0,0],[-0.251,-0.62],[-1.198,0.495],[0.369,0.912]],"v":[[0.321,0.743],[2.181,-0.914],[2.181,-0.921],[-0.305,-0.942],[-2.165,0.855]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921574354,0.372549027205,0.368627458811,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"Vector","parent":30,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-21.365,-10.39,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.043,0],[0,1.9],[3.043,0],[0,-1.9]],"o":[[3.043,0],[0,-1.9],[-3.043,0],[0,1.9]],"v":[[0,3.441],[5.509,0],[0,-3.441],[-5.509,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.666666686535,0.57647061348,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"Vector","parent":30,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-52.699,-10.822,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.7,0],[0,1.281],[1.7,0],[0,-1.281]],"o":[[1.7,0],[0,-1.281],[-1.7,0],[0,1.281]],"v":[[0,2.319],[3.078,0],[0,-2.319],[-3.078,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.666666686535,0.57647061348,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":"Vector","parent":30,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-38.031,-7.883,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.481,2.382],[0.425,0],[0,0],[-0.084,-0.411],[-3.106,0]],"o":[[0.084,-0.411],[0,0],[-0.418,0],[0.481,2.389],[3.106,0]],"v":[[6.171,-1.699],[5.537,-2.507],[-5.537,-2.507],[-6.171,-1.699],[0,2.507]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921574354,0.372549027205,0.368627458811,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"hand_2","parent":21,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[6]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[-3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[6]},{"t":65,"s":[-3]}],"ix":10},"p":{"a":0,"k":[56.935,71.222,0],"ix":2,"l":2},"a":{"a":0,"k":[7,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[2.466,1.609],[0.738,-1.282],[-0.752,-1.08],[-4.437,-1.811],[0,0]],"o":[[0,0],[-2.793,0],[-1.128,-0.738],[-0.669,1.163],[3.044,4.367],[0,0],[0,0]],"v":[[5.305,-4.71],[5.124,-4.71],[-2.879,-7.155],[-6.138,-6.2],[-5.992,-2.391],[5.444,7.047],[6.601,7.52]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":7,"k":{"a":0,"k":[0.089,0.98,0.902,0.792,0.25,0.98,0.896,0.78,0.411,0.98,0.89,0.769,0.636,0.98,0.842,0.741,0.86,0.98,0.794,0.714,0.93,0.99,0.804,0.711,1,1,0.813,0.708,0.089,0,0.25,0.11,0.411,0.22,0.636,0.525,0.86,0.83,0.93,0.915,1,1],"ix":9}},"s":{"a":0,"k":[6.601,-0.002],"ix":5},"e":{"a":0,"k":[-6.598,-0.002],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":"hand_1","parent":21,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[-5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[10]},{"t":65,"s":[-3]}],"ix":10},"p":{"a":0,"k":[13.601,73.702,0],"ix":2,"l":2},"a":{"a":0,"k":[7,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[2.466,1.609],[0.738,-1.282],[-0.752,-1.08],[-4.437,-1.811],[0,0]],"o":[[0,0],[-2.793,0],[-1.128,-0.738],[-0.669,1.163],[3.044,4.367],[0,0],[0,0]],"v":[[5.305,-4.71],[5.124,-4.71],[-2.879,-7.155],[-6.138,-6.2],[-5.992,-2.391],[5.444,7.047],[6.601,7.52]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.98,0.902,0.792,0.096,0.982,0.894,0.794,0.193,0.984,0.886,0.796,0.596,0.992,0.874,0.79,1,1,0.861,0.783,0,0,0.096,0.5,0.193,1,0.596,1,1,1],"ix":9}},"s":{"a":0,"k":[6.608,-0.002],"ix":5},"e":{"a":0,"k":[-6.591,-0.002],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"body","parent":21,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[64.278,65.132,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":14,"s":[98,104,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":27,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":40,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":54,"s":[98,104,100]},{"t":67,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.682,0.501],[4.611,2.584],[0,0],[1.616,12.739],[0,0],[0,6.38],[-5.3,4.297],[0.299,1.351],[0,0],[-1.658,1.191],[-1.867,-1.637],[-5.349,-0.898],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.462,3.462],[0,0],[-0.258,-3.58],[0.348,-2.013],[0,0],[-0.425,-1.685],[-0.146,-0.641],[-1.344,-3.594],[-0.341,-2.863],[-9.827,-1.867],[-1.003,-0.195],[-4.054,-3.51],[0,0],[0.947,-2.835],[3.099,0.313],[0,0],[13.714,-3.204]],"o":[[-5.279,-0.348],[0,0],[-10.134,-7.877],[0,0],[-5.091,-4.269],[0,-6.38],[0.209,-1.358],[0,0],[-0.348,-2.013],[2.013,-1.449],[4.081,3.58],[0,0],[0,0],[0.007,0],[0,0],[0,0],[4.827,-0.815],[0,0],[1.651,-1.651],[0.348,1.574],[0,0],[-0.376,1.692],[0.153,0.641],[1.226,2.709],[1.017,2.695],[1.156,9.73],[1.045,0.195],[5.265,1.038],[0,0],[2.479,1.672],[-0.989,2.953],[0,0],[-14.02,-1.414],[-4.464,1.045]],"v":[[-25.794,46.575],[-40.81,42.089],[-40.824,42.089],[-57.191,7.836],[-53.974,11.549],[-57.972,-1.434],[-51.007,-29.112],[-51.132,-33.207],[-52.107,-38.883],[-49.962,-44.121],[-43.332,-43.801],[-28.907,-36.947],[-27.055,-36.627],[-27.062,-36.627],[-27.048,-36.634],[-27.055,-36.634],[-23.524,-37.226],[-10.785,-43.794],[-8.612,-45.967],[-1.682,-43.181],[-2.002,-38.883],[-2.977,-33.207],[-2.908,-28.074],[-2.462,-26.159],[1.215,-17.961],[3.145,-9.569],[21.218,10.135],[24.29,10.72],[38.512,17.657],[55.13,32.046],[57.728,39.672],[50.742,44.193],[37.432,42.848],[-4.454,45.551]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0.969,0.89,0.5,0.99,0.926,0.841,1,0.98,0.883,0.792],"ix":9}},"s":{"a":0,"k":[-20.951,4.441],"ix":5},"e":{"a":0,"k":[28.254,4.441],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.111,0.705],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":"back_4","parent":33,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-12.935,24.072,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.31,-10.935],[-22.656,-11.896],[0,0],[-6.31,10.935],[22.155,12.794]],"o":[[-6.31,10.935],[0,0],[6.624,3.482],[6.31,-10.935],[-22.155,-12.794]],"v":[[-40.098,-21.891],[-11.41,21.068],[-11.41,21.068],[40.136,24.432],[11.448,-18.527]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":11,"k":{"a":0,"k":[0,0.937,0.565,0.439,0.045,0.912,0.524,0.418,0.09,0.886,0.482,0.396,0.14,0.869,0.449,0.378,0.19,0.851,0.416,0.361,0.255,0.837,0.392,0.349,0.32,0.824,0.369,0.337,0.41,0.816,0.355,0.329,0.5,0.808,0.341,0.322,0.75,0.806,0.339,0.322,1,0.804,0.337,0.322],"ix":9}},"s":{"a":0,"k":[-15.647,-0.018],"ix":5},"e":{"a":0,"k":[70.134,-5.084],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":"back_3","parent":33,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[3.096,-2.073,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.074,3.455],[-15.88,-9.173],[0,0],[-4.827,-16.597],[2.528,-4.019],[0.536,-0.85],[20.219,11.673],[15.664,-2.082],[-0.369,0.592]],"o":[[14.793,-1.024],[0,0],[19.606,11.318],[-1.351,4.325],[-0.578,0.912],[-4.423,-17.092],[-17.301,-9.988],[0.355,-0.564],[2.995,-4.764]],"v":[[-36.906,-35.89],[10.733,-23.841],[10.747,-23.841],[48.691,20.831],[42.889,33.403],[41.218,36.049],[2.849,-10.169],[-48.691,-21.828],[-47.604,-23.555]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.937,0.565,0.439,0.285,0.927,0.451,0.38,0.57,0.918,0.337,0.322,0.785,0.927,0.451,0.38,1,0.937,0.565,0.439],"ix":9}},"s":{"a":0,"k":[-48.698,0],"ix":5},"e":{"a":0,"k":[48.67,0],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":"back_2","parent":21,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":54,"s":[-4]},{"t":67,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[70.93,52.773,0],"to":[0.583,-0.5,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[74.43,49.773,0],"to":[0,0,0],"ti":[0.583,-0.5,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[70.93,52.773,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[70.93,52.773,0],"to":[0.583,-0.333,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54,"s":[74.43,50.773,0],"to":[0,0,0],"ti":[0.583,-0.333,0]},{"t":67,"s":[70.93,52.773,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-50.251,-31.961],[-15.727,24.983],[0,0],[24.983,15.727],[15.727,-24.983]],"o":[[40.793,25.944],[0,0],[15.733,-24.99],[-24.99,-15.733],[-15.727,24.99]],"v":[[-11.37,31.705],[45.971,31.329],[45.964,31.329],[29.207,-42.393],[-44.516,-25.636]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":7,"k":{"a":0,"k":[0,0.937,0.784,0.718,0.182,0.937,0.62,0.558,0.365,0.937,0.455,0.399,0.477,0.937,0.434,0.378,0.589,0.937,0.412,0.357,0.784,0.937,0.547,0.457,0.98,0.937,0.682,0.557],"ix":9}},"s":{"a":0,"k":[-54.19,0.002],"ix":5},"e":{"a":0,"k":[54.189,0.002],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":34,"ty":4,"nm":"back_1","parent":33,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[30.365,-36.361,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.885,-0.773],[0,0],[0,0],[0,0],[0,0],[0.808,1.644],[13.045,2.02]],"o":[[0,0],[0,0],[0,0],[0,0],[1.316,-1.282],[-5.356,-12.063],[-1.163,-0.181]],"v":[[-13.242,-14.432],[-18.577,-9.779],[-18.584,-9.772],[11.093,15.413],[17.305,9.367],[18.148,4.471],[-10.01,-15.365]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":7,"k":{"a":0,"k":[0,0.937,0.784,0.718,0.182,0.937,0.62,0.558,0.365,0.937,0.455,0.399,0.477,0.937,0.434,0.378,0.589,0.937,0.412,0.357,0.784,0.937,0.547,0.457,0.98,0.937,0.682,0.557],"ix":9}},"s":{"a":0,"k":[-18.584,0.001],"ix":5},"e":{"a":0,"k":[18.584,0.001],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":35,"ty":4,"nm":"boom_9","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":360,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":36,"ty":4,"nm":"boom_8","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":315,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":37,"ty":4,"nm":"boom_7","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":270,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":38,"ty":4,"nm":"boom_6","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":225,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":39,"ty":4,"nm":"boom_5","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":40,"ty":4,"nm":"boom_4","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":135,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":41,"ty":4,"nm":"boom_3","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":42,"ty":4,"nm":"boom_2","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":43,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.303,11.303],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":0,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-37.349,-10.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":44,"ty":4,"nm":"round_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[100]},{"t":41,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[41,64.5,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,3,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[23,23,100]},{"t":41,"s":[227.439,227.439,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[27.438,27.438],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":8,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.997341978784,0.892892156863,1,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.281,3.219],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":45,"ty":4,"nm":"snail_orange_cheer","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[-100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[150,150],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"snail_orange_cheer","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"snail_orange_cheer","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[70,70,0],"ix":2,"l":2},"a":{"a":0,"k":[75,75,0],"ix":1,"l":2},"s":{"a":0,"k":[-94,94,100],"ix":6,"l":2}},"ao":0,"w":150,"h":150,"ip":0,"op":85,"st":0,"bm":0}],"markers":[]} \ No newline at end of file From 3cf979c008e390faf471c6ddb5c93874012bb5d7 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Wed, 11 Jan 2023 04:07:58 +0900 Subject: [PATCH 256/745] =?UTF-8?q?[feat]=20#93=20=EB=A1=9C=ED=8B=B0=20?= =?UTF-8?q?=EB=B7=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 3 +++ .../presentation/home/HomeViewModel.kt | 13 +++++++-- app/src/main/res/layout/activity_home.xml | 27 +++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b77349d1..13a2f5a3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -99,6 +99,9 @@ dependencies { // Splashscreen implementation 'androidx.core:core-splashscreen:1.0.0-rc01' + + // Lottie + implementation 'com.airbnb.android:lottie:5.2.0' } ktlint { diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index a1b454d0..6ff9d8a0 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -23,6 +23,8 @@ class HomeViewModel @Inject constructor( val hour: LiveData get() = _hour private val _cheeringMessage = MutableLiveData() val cheeringMessage: LiveData get() = _cheeringMessage + private val _achievedState = MutableLiveData() + val achievedState: LiveData get() = _achievedState init { fetchGoalList() @@ -36,11 +38,18 @@ class HomeViewModel @Inject constructor( _goalList.value?.set( position, HomeGoal( - id, goalTitle, isMore, goalData.updatedIsAchieved, goalData.thisMonthCount, type + id, + goalTitle, + isMore, + goalData.updatedIsAchieved, + goalData.thisMonthCount, + type ) ) } - _goalList.value = _goalList.value?.toMutableList() // TODO 서버쪽에서 api 확인해주면 toMutableList 안붙여도 되는지 확인하기 + _achievedState.value = goalData.updatedIsAchieved + _goalList.value = + _goalList.value?.toMutableList() // TODO 서버쪽에서 api 확인해주면 toMutableList 안붙여도 되는지 확인하기 } } } diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 5e0d418d..f4ad2cf2 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -5,6 +5,8 @@ + + @@ -35,16 +37,41 @@ app:layout_constraintTop_toTopOf="parent" tools:src="@drawable/img_home_background_night" /> + + + + Date: Wed, 11 Jan 2023 12:14:26 +0900 Subject: [PATCH 257/745] =?UTF-8?q?[chore]=20#93=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/data/model/response/ResponseGoalDeleted.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDeleted.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDeleted.kt index 85704852..5fbf2ff9 100644 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDeleted.kt +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDeleted.kt @@ -13,4 +13,4 @@ data class ResponseGoalDeleted( data class ResponseGoalDeletedData( val goalId: Int ) -} \ No newline at end of file +} From 68393b40d84b367edc5ca6d90831d19771b7a731 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Wed, 11 Jan 2023 12:48:45 +0900 Subject: [PATCH 258/745] =?UTF-8?q?[mod]=20#93=20=ED=99=88=20=EB=B7=B0=20?= =?UTF-8?q?=EB=A1=9C=ED=8B=B0=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/presentation/home/HomeActivity.kt | 9 ++++++++- .../org/keepgoeat/presentation/home/HomeViewModel.kt | 4 +++- app/src/main/res/layout/activity_home.xml | 7 +++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 875e3a4a..4cbcc078 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -39,7 +39,8 @@ class HomeActivity : BindingActivity(R.layout.activity_home } private fun initLayout() { - goalAdapter = HomeMyGoalAdapter(::changeGoalItemBtnColor, ::moveToDetail, ::showMakeGoalDialog) + goalAdapter = + HomeMyGoalAdapter(::changeGoalItemBtnColor, ::moveToDetail, ::showMakeGoalDialog) binding.rvMyGoals.apply { itemAnimator = null adapter = goalAdapter @@ -54,6 +55,12 @@ class HomeActivity : BindingActivity(R.layout.activity_home if (goalCount == 0) binding.ivHomeSnail.setImageResource(R.drawable.img_snail_orange_hungry) } + viewModel.achievedState.observe(this) { achieved -> + if (achieved) { + binding.lottieSnail.playAnimation() + binding.lottieBackground.playAnimation() + } + } } private fun showMakeGoalDialog() { diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 6ff9d8a0..c4457cc2 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -47,7 +47,8 @@ class HomeViewModel @Inject constructor( ) ) } - _achievedState.value = goalData.updatedIsAchieved + if (goalData.updatedIsAchieved) + _achievedState.value = true _goalList.value = _goalList.value?.toMutableList() // TODO 서버쪽에서 api 확인해주면 toMutableList 안붙여도 되는지 확인하기 } @@ -58,6 +59,7 @@ class HomeViewModel @Inject constructor( viewModelScope.launch { goalRepository.fetchHomeEntireData()?.let { homeData -> _cheeringMessage.value = homeData.cheeringMessage + _achievedState.value = false _goalList.value = homeData.toHomeGoal().toMutableList() _goalCount.value = homeData.goals.size } diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index f4ad2cf2..d2e046f1 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -38,15 +38,14 @@ tools:src="@drawable/img_home_background_night" /> Date: Wed, 11 Jan 2023 12:51:43 +0900 Subject: [PATCH 259/745] =?UTF-8?q?[mod]=20#93=20=ED=99=88=20=EB=B7=B0=20?= =?UTF-8?q?=EB=AA=A9=ED=91=9C=20=EC=B6=94=EA=B0=80=20=EB=B2=84=ED=8A=BC?= =?UTF-8?q?=EC=9D=84Material=20Btn=20->=20ImageView=20=EB=A1=9C=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 --- app/src/main/res/layout/item_add_goal.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/res/layout/item_add_goal.xml b/app/src/main/res/layout/item_add_goal.xml index a1b87cef..e752f604 100644 --- a/app/src/main/res/layout/item_add_goal.xml +++ b/app/src/main/res/layout/item_add_goal.xml @@ -35,14 +35,12 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/tv_more_goal" /> - From 69c6a19acdb3abe4eab54a310dcf403af4e38ebf Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Wed, 11 Jan 2023 13:18:06 +0900 Subject: [PATCH 260/745] =?UTF-8?q?[chore]=20#93=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=EB=AA=85,=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=AA=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD,=20json=20=ED=8C=8C=EC=9D=BC=20assets=20->=20raw=20?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/presentation/home/HomeActivity.kt | 8 ++++---- .../home/{HomeMyGoalAdapter.kt => HomeGoalAdapter.kt} | 2 +- .../java/org/keepgoeat/presentation/home/HomeViewModel.kt | 2 +- app/src/main/res/layout/activity_home.xml | 4 ++-- app/src/main/{assets => res/raw}/home_background.json | 0 app/src/main/{assets => res/raw}/home_snail.json | 0 6 files changed, 8 insertions(+), 8 deletions(-) rename app/src/main/java/org/keepgoeat/presentation/home/{HomeMyGoalAdapter.kt => HomeGoalAdapter.kt} (99%) rename app/src/main/{assets => res/raw}/home_background.json (100%) rename app/src/main/{assets => res/raw}/home_snail.json (100%) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 4cbcc078..3176c009 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -15,7 +15,7 @@ import org.keepgoeat.util.binding.BindingActivity @AndroidEntryPoint class HomeActivity : BindingActivity(R.layout.activity_home) { private val viewModel: HomeViewModel by viewModels() - private lateinit var goalAdapter: HomeMyGoalAdapter + private lateinit var goalAdapter: HomeGoalAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -40,7 +40,7 @@ class HomeActivity : BindingActivity(R.layout.activity_home private fun initLayout() { goalAdapter = - HomeMyGoalAdapter(::changeGoalItemBtnColor, ::moveToDetail, ::showMakeGoalDialog) + HomeGoalAdapter(::changeGoalItemBtnColor, ::moveToDetail, ::showMakeGoalDialog) binding.rvMyGoals.apply { itemAnimator = null adapter = goalAdapter @@ -55,8 +55,8 @@ class HomeActivity : BindingActivity(R.layout.activity_home if (goalCount == 0) binding.ivHomeSnail.setImageResource(R.drawable.img_snail_orange_hungry) } - viewModel.achievedState.observe(this) { achieved -> - if (achieved) { + viewModel.achievedState.observe(this) { isAchieved -> + if (isAchieved) { binding.lottieSnail.playAnimation() binding.lottieBackground.playAnimation() } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt similarity index 99% rename from app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt rename to app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt index 2fee576a..cb7eae66 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeMyGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt @@ -15,7 +15,7 @@ import org.keepgoeat.presentation.type.HomeGoalViewType import org.keepgoeat.util.ItemDiffCallback import org.keepgoeat.util.setVisibility -class HomeMyGoalAdapter( +class HomeGoalAdapter( private val changeBtnColor: (HomeGoal) -> Unit, private val moveToDetail: (EatingType, Int) -> Unit, private val showMakeGoalDialog: () -> Unit, diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index c4457cc2..30dc2feb 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -50,7 +50,7 @@ class HomeViewModel @Inject constructor( if (goalData.updatedIsAchieved) _achievedState.value = true _goalList.value = - _goalList.value?.toMutableList() // TODO 서버쪽에서 api 확인해주면 toMutableList 안붙여도 되는지 확인하기 + _goalList.value?.toMutableList() } } } diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index d2e046f1..3992a61e 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -45,7 +45,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:lottie_autoPlay="false" - app:lottie_fileName="home_background.json" + app:lottie_rawRes="@raw/home_background" app:visibility="@{viewModel.achievedState}" /> Date: Wed, 11 Jan 2023 15:45:09 +0900 Subject: [PATCH 261/745] =?UTF-8?q?=20[mod]=20#66=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EB=A1=9C=EC=A7=81=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 --- app/build.gradle | 1 + .../org/keepgoeat/data/service/SignService.kt | 31 +++++++------------ .../keepgoeat/presentation/SplashActivity.kt | 6 +--- .../presentation/sign/SignActivity.kt | 9 ------ .../presentation/sign/SignViewModel.kt | 13 -------- 5 files changed, 14 insertions(+), 46 deletions(-) delete mode 100644 app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt diff --git a/app/build.gradle b/app/build.gradle index b77349d1..d74c38c9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,6 +67,7 @@ dependencies { implementation "com.google.dagger:hilt-android:$hilt_version" implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0' kapt "com.google.dagger:hilt-compiler:$hilt_version" + kapt "com.google.dagger:dagger-compiler:$hilt_version" // Coil implementation 'io.coil-kt:coil:2.2.2' diff --git a/app/src/main/java/org/keepgoeat/data/service/SignService.kt b/app/src/main/java/org/keepgoeat/data/service/SignService.kt index 029e195a..41839742 100644 --- a/app/src/main/java/org/keepgoeat/data/service/SignService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/SignService.kt @@ -9,38 +9,31 @@ import javax.inject.Inject class SignService @Inject constructor( @ActivityContext private val context: Context, - private val client: UserApiClient + private val client: UserApiClient, ) { - val isKakaoTalkLoginAvailable: Boolean + private val isKakaoTalkLoginAvailable: Boolean get() = client.isKakaoTalkLoginAvailable(context) - fun loginKakao(loginListener: (() -> Unit)? = null) { + fun loginKakao(loginListener: (() -> Unit)) { val callback: (OAuthToken?, Throwable?) -> Unit = { token, error -> - error?.let(::handleLoginError) - token?.let(::handleLoginSuccess) + if (error != null) handleLoginError(error) + else if (token != null) handleLoginSuccess(token, loginListener) } - if (isKakaoTalkLoginAvailable) - loginByKakaotalk(loginListener, callback) - else - loginByKakaoAccount(loginListener, callback) - } - - fun loginByKakaotalk(loginListener: (() -> Unit)? = null, callback: (OAuthToken?, Throwable?) -> Unit) { - client.loginWithKakaoTalk(context, callback = callback) - } - fun loginByKakaoAccount(loginListener: (() -> Unit)? = null, callback: (OAuthToken?, Throwable?) -> Unit) { - client.loginWithKakaoAccount(context, callback = callback) + if (isKakaoTalkLoginAvailable) client.loginWithKakaoTalk(context, callback = callback) + else client.loginWithKakaoAccount(context, callback = callback) } private fun handleLoginError(throwable: Throwable) { - val kakaoType = if (isKakaoTalkLoginAvailable) "카카오톡" else "카카오계정" - Timber.d("$kakaoType 으로 로그인 실패") + val kakaoType = if (isKakaoTalkLoginAvailable) "카카오톡" else "카카오 계정" + Timber.d("$kakaoType 으로 로그인 실패 (${throwable.message})") } - private fun handleLoginSuccess(oAuthToken: OAuthToken) { + private fun handleLoginSuccess(oAuthToken: OAuthToken, loginListener: (() -> Unit)) { client.me { user, _ -> // TODO 로그인 Api 연결 + Timber.d(oAuthToken.accessToken) + loginListener() } } diff --git a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt index 5b9216d9..834aa4d3 100644 --- a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt @@ -31,10 +31,6 @@ class SplashActivity : BindingActivity(R.layout.activity_ } private fun moveToNext() { - if (SignSharedPreferences(this).isLogin) { - startActivity(Intent(this, OnboardingActivity::class.java)) - } else { - startActivity(Intent(this, SignActivity::class.java)) - } + startActivity(Intent(this, SignActivity::class.java)) } } diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt index 66b3a64a..1d56d72b 100644 --- a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt @@ -2,8 +2,6 @@ package org.keepgoeat.presentation.sign import android.content.Intent import android.os.Bundle -import androidx.activity.viewModels -import com.kakao.sdk.common.KakaoSdk import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.data.service.SignService @@ -14,24 +12,17 @@ import javax.inject.Inject @AndroidEntryPoint class SignActivity : BindingActivity(R.layout.activity_sign) { - private val viewModel: SignViewModel by viewModels() - @Inject lateinit var signService: SignService override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding.viewModel = viewModel - binding.lifecycleOwner = this - - KakaoSdk.init(this, this.getString(R.string.kakao_app_key1)) addListeners() } private fun addListeners() { binding.layoutSignIn.setOnClickListener { signService.loginKakao(::moveToOnBoarding) -// viewModel.login(::moveToOnBoarding) } } diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt deleted file mode 100644 index a3690d11..00000000 --- a/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt +++ /dev/null @@ -1,13 +0,0 @@ -package org.keepgoeat.presentation.sign - -import androidx.lifecycle.ViewModel -import dagger.hilt.android.lifecycle.HiltViewModel -import org.keepgoeat.data.service.SignService -import javax.inject.Inject - -@HiltViewModel -class SignViewModel @Inject constructor(private val signService: SignService) : ViewModel() { - fun login(loginListener: () -> Unit) { -// signService.loginKakao(loginListener) - } -} From 171411eb828b0dd6b1a12ee6efaf7dcaed232d8d Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 11 Jan 2023 15:45:32 +0900 Subject: [PATCH 262/745] =?UTF-8?q?=20[add]=20#66=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20response=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/model/request/RequestAuth.kt | 9 +++++++++ .../data/model/response/ResponseAuth.kt | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 app/src/main/java/org/keepgoeat/data/model/request/RequestAuth.kt create mode 100644 app/src/main/java/org/keepgoeat/data/model/response/ResponseAuth.kt diff --git a/app/src/main/java/org/keepgoeat/data/model/request/RequestAuth.kt b/app/src/main/java/org/keepgoeat/data/model/request/RequestAuth.kt new file mode 100644 index 00000000..47936aac --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/model/request/RequestAuth.kt @@ -0,0 +1,9 @@ +package org.keepgoeat.data.model.request + +import kotlinx.serialization.Serializable + +@Serializable +data class RequestAuth( + val platformAccessToken: String, + val platform: String, +) diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseAuth.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseAuth.kt new file mode 100644 index 00000000..9c01cfbd --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseAuth.kt @@ -0,0 +1,19 @@ +package org.keepgoeat.data.model.response + +import kotlinx.serialization.Serializable + +@Serializable +data class ResponseAuth( + val data: ResponseAuthData?, + val message: String, + val status: Int, + val success: Boolean, +) { + @Serializable + data class ResponseAuthData( + val type: String, + val email: String, + val accessToken: String, + val refreshToken: String, + ) +} From de6cbc47d6296db41198a9a5a83128118025017b Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 11 Jan 2023 15:46:28 +0900 Subject: [PATCH 263/745] =?UTF-8?q?=20[mod]=20#66=20=EB=9F=B0=EC=B2=98=20?= =?UTF-8?q?=EC=95=A1=ED=8B=B0=EB=B9=84=ED=8B=B0=EB=A5=BC=20SplashActivity?= =?UTF-8?q?=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 --- app/src/main/AndroidManifest.xml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d524bb1e..7b10a4a1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,20 +18,20 @@ tools:targetApi="31"> - + android:theme="@style/Theme.KeepGoEat.Splash" + tools:ignore="LockedOrientationActivity"> + @@ -74,11 +74,13 @@ android:exported="true"> + - From 027e94b93f9fdf32fabdacd090686364fe76d540 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 11 Jan 2023 15:51:05 +0900 Subject: [PATCH 264/745] =?UTF-8?q?=20[chore]=20#66=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt index 834aa4d3..60276492 100644 --- a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt @@ -9,9 +9,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.keepgoeat.R import org.keepgoeat.databinding.ActivitySplashBinding -import org.keepgoeat.presentation.onboarding.OnboardingActivity import org.keepgoeat.presentation.sign.SignActivity -import org.keepgoeat.presentation.sign.SignSharedPreferences import org.keepgoeat.util.binding.BindingActivity @AndroidEntryPoint From df5ddf585c6e8d184c21b1bddc7471bb9743312a Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 11 Jan 2023 15:55:50 +0900 Subject: [PATCH 265/745] =?UTF-8?q?=20[del]=20#66=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=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 --- app/src/main/res/layout/activity_sign.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/src/main/res/layout/activity_sign.xml b/app/src/main/res/layout/activity_sign.xml index def27a97..22547b32 100644 --- a/app/src/main/res/layout/activity_sign.xml +++ b/app/src/main/res/layout/activity_sign.xml @@ -3,13 +3,6 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> - - - - - Date: Wed, 11 Jan 2023 16:52:31 +0900 Subject: [PATCH 266/745] =?UTF-8?q?[feat]=20#96=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20api=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../local}/SignSharedPreferences.kt | 16 +++++++- .../data/datasource/remote/AuthDataSource.kt | 15 +++++++ .../data/model/request/RequestAuth.kt | 2 +- .../data/repository/AuthRepositoryImpl.kt | 41 +++++++++++++++++++ .../org/keepgoeat/data/service/AuthService.kt | 12 ++++++ .../org/keepgoeat/data/service/SignService.kt | 9 ++++ .../java/org/keepgoeat/di/RepositoryModule.kt | 8 ++++ .../java/org/keepgoeat/di/ServiceModule.kt | 6 +++ .../main/java/org/keepgoeat/di/SignModule.kt | 6 ++- .../domain/repository/AuthRepository.kt | 8 ++++ 10 files changed, 119 insertions(+), 4 deletions(-) rename app/src/main/java/org/keepgoeat/{presentation/sign => data/datasource/local}/SignSharedPreferences.kt (80%) create mode 100644 app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt create mode 100644 app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt create mode 100644 app/src/main/java/org/keepgoeat/data/service/AuthService.kt create mode 100644 app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignSharedPreferences.kt b/app/src/main/java/org/keepgoeat/data/datasource/local/SignSharedPreferences.kt similarity index 80% rename from app/src/main/java/org/keepgoeat/presentation/sign/SignSharedPreferences.kt rename to app/src/main/java/org/keepgoeat/data/datasource/local/SignSharedPreferences.kt index 6405a33e..bf4f314d 100644 --- a/app/src/main/java/org/keepgoeat/presentation/sign/SignSharedPreferences.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/local/SignSharedPreferences.kt @@ -1,4 +1,4 @@ -package org.keepgoeat.presentation.sign +package org.keepgoeat.data.datasource.local import android.content.Context import android.content.SharedPreferences @@ -32,13 +32,27 @@ class SignSharedPreferences @Inject constructor(@ApplicationContext context: Con "" ) ?: "" + var refreshToken: String + set(value) = dataStore.edit { putString(REFRESH_TOKEN, value) } + get() = dataStore.getString( + REFRESH_TOKEN, + "" + ) ?: "" + var isLogin: Boolean set(value) = dataStore.edit { putBoolean(IS_LOGIN, value) } get() = dataStore.getBoolean(IS_LOGIN, false) + fun clear() { + dataStore.edit { + clear() + } + } + companion object { const val FILE_NAME = "SignSharedPreferences" const val ACCESS_TOKEN = "AccessToken" const val IS_LOGIN = "IsLogin" + const val REFRESH_TOKEN = "RefreshToken" } } diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt new file mode 100644 index 00000000..bdfbaaa2 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt @@ -0,0 +1,15 @@ +package org.keepgoeat.data.datasource.remote + +import org.keepgoeat.data.ApiResult +import org.keepgoeat.data.model.request.RequestAuth +import org.keepgoeat.data.model.response.ResponseAuth +import org.keepgoeat.data.service.AuthService +import org.keepgoeat.util.safeApiCall +import javax.inject.Inject + +class AuthDataSource @Inject constructor( + private val authService: AuthService +) { + suspend fun login(requestAuth: RequestAuth): ApiResult = + safeApiCall { authService.login(requestAuth) } +} diff --git a/app/src/main/java/org/keepgoeat/data/model/request/RequestAuth.kt b/app/src/main/java/org/keepgoeat/data/model/request/RequestAuth.kt index 47936aac..27f27568 100644 --- a/app/src/main/java/org/keepgoeat/data/model/request/RequestAuth.kt +++ b/app/src/main/java/org/keepgoeat/data/model/request/RequestAuth.kt @@ -5,5 +5,5 @@ import kotlinx.serialization.Serializable @Serializable data class RequestAuth( val platformAccessToken: String, - val platform: String, + val platform: String = "KAKAO", ) diff --git a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt new file mode 100644 index 00000000..6ff4a46e --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt @@ -0,0 +1,41 @@ +package org.keepgoeat.data.repository + +import org.keepgoeat.data.ApiResult +import org.keepgoeat.data.datasource.local.SignSharedPreferences +import org.keepgoeat.data.datasource.remote.AuthDataSource +import org.keepgoeat.data.model.request.RequestAuth +import org.keepgoeat.data.model.response.ResponseAuth +import org.keepgoeat.domain.repository.AuthRepository +import timber.log.Timber +import javax.inject.Inject + +class AuthRepositoryImpl @Inject constructor( + private val authDataSource: AuthDataSource, + private val signSharedPreferences: SignSharedPreferences +) : AuthRepository { + override suspend fun login(requestAuth: RequestAuth): ResponseAuth.ResponseAuthData? { + val result = authDataSource.login(requestAuth) + return when (result) { + is ApiResult.Success -> { + val response = result.data?.data + with(signSharedPreferences) { + isLogin = true + response?.let { + accestToken = it.accessToken + refreshToken = it.refreshToken + } + } + Timber.d(result.data?.message) + result.data?.data + } + is ApiResult.NetworkError -> { + Timber.d("Network Error") + null + } + is ApiResult.GenericError -> { + Timber.d("(${result.code}): ${result.message}") + null + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/keepgoeat/data/service/AuthService.kt b/app/src/main/java/org/keepgoeat/data/service/AuthService.kt new file mode 100644 index 00000000..3e963951 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/service/AuthService.kt @@ -0,0 +1,12 @@ +package org.keepgoeat.data.service + +import org.keepgoeat.data.model.request.RequestAuth +import org.keepgoeat.data.model.response.ResponseAuth +import retrofit2.Response +import retrofit2.http.Body +import retrofit2.http.POST + +interface AuthService { + @POST("auth") + suspend fun login(@Body request: RequestAuth): Response +} \ No newline at end of file diff --git a/app/src/main/java/org/keepgoeat/data/service/SignService.kt b/app/src/main/java/org/keepgoeat/data/service/SignService.kt index 41839742..ceb691c2 100644 --- a/app/src/main/java/org/keepgoeat/data/service/SignService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/SignService.kt @@ -4,12 +4,18 @@ import android.content.Context import com.kakao.sdk.auth.model.OAuthToken import com.kakao.sdk.user.UserApiClient import dagger.hilt.android.qualifiers.ActivityContext +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import org.keepgoeat.data.model.request.RequestAuth +import org.keepgoeat.domain.repository.AuthRepository import timber.log.Timber import javax.inject.Inject class SignService @Inject constructor( @ActivityContext private val context: Context, private val client: UserApiClient, + private val authRepository: AuthRepository ) { private val isKakaoTalkLoginAvailable: Boolean get() = client.isKakaoTalkLoginAvailable(context) @@ -32,6 +38,9 @@ class SignService @Inject constructor( private fun handleLoginSuccess(oAuthToken: OAuthToken, loginListener: (() -> Unit)) { client.me { user, _ -> // TODO 로그인 Api 연결 + CoroutineScope(Dispatchers.IO).launch { + authRepository.login(RequestAuth(oAuthToken.accessToken)) + } Timber.d(oAuthToken.accessToken) loginListener() } diff --git a/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt b/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt index d1563eff..cffd3aab 100644 --- a/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt +++ b/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt @@ -4,9 +4,11 @@ import dagger.Binds import dagger.Module import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent +import org.keepgoeat.data.repository.AuthRepositoryImpl import org.keepgoeat.data.repository.DummyRepositoryImpl import org.keepgoeat.data.repository.GoalRepositoryImpl import org.keepgoeat.data.repository.MyRepositoryImpl +import org.keepgoeat.domain.repository.AuthRepository import org.keepgoeat.domain.repository.DummyRepository import org.keepgoeat.domain.repository.GoalRepository import org.keepgoeat.domain.repository.MyRepository @@ -32,4 +34,10 @@ interface RepositoryModule { fun bindMyRepository( myRepositoryImRepositoryImpl: MyRepositoryImpl, ): MyRepository + + @Binds + @Singleton + fun bindAuthRepository( + authRepositoryImpl: AuthRepositoryImpl, + ): AuthRepository } diff --git a/app/src/main/java/org/keepgoeat/di/ServiceModule.kt b/app/src/main/java/org/keepgoeat/di/ServiceModule.kt index 45a41921..b3ef8d89 100644 --- a/app/src/main/java/org/keepgoeat/di/ServiceModule.kt +++ b/app/src/main/java/org/keepgoeat/di/ServiceModule.kt @@ -4,6 +4,7 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent +import org.keepgoeat.data.service.AuthService import org.keepgoeat.data.service.DummyService import org.keepgoeat.data.service.GoalService import org.keepgoeat.data.service.MyService @@ -27,4 +28,9 @@ object ServiceModule { @Provides fun provideMyService(retrofit: Retrofit): MyService = retrofit.create(MyService::class.java) + + @Singleton + @Provides + fun provideAuthService(retrofit: Retrofit): AuthService = + retrofit.create(AuthService::class.java) } diff --git a/app/src/main/java/org/keepgoeat/di/SignModule.kt b/app/src/main/java/org/keepgoeat/di/SignModule.kt index af04bf89..2b14f0bd 100644 --- a/app/src/main/java/org/keepgoeat/di/SignModule.kt +++ b/app/src/main/java/org/keepgoeat/di/SignModule.kt @@ -9,6 +9,7 @@ import dagger.hilt.android.components.ActivityComponent import dagger.hilt.android.qualifiers.ActivityContext import dagger.hilt.android.scopes.ActivityScoped import org.keepgoeat.data.service.SignService +import org.keepgoeat.domain.repository.AuthRepository @Module @InstallIn(ActivityComponent::class) @@ -20,6 +21,7 @@ object SignModule { @Provides fun provideSignService( @ActivityContext context: Context, - client: UserApiClient - ) = SignService(context, client) + client: UserApiClient, + authRepository: AuthRepository + ) = SignService(context, client, authRepository) } diff --git a/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt new file mode 100644 index 00000000..29c92144 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt @@ -0,0 +1,8 @@ +package org.keepgoeat.domain.repository + +import org.keepgoeat.data.model.request.RequestAuth +import org.keepgoeat.data.model.response.ResponseAuth + +interface AuthRepository { + suspend fun login(requestAuth: RequestAuth): ResponseAuth.ResponseAuthData? +} \ No newline at end of file From 31d9183804c0e3d0a93b6dcb58fc45497ecdbdb0 Mon Sep 17 00:00:00 2001 From: Daeun Date: Wed, 11 Jan 2023 17:12:05 +0900 Subject: [PATCH 267/745] =?UTF-8?q?[feat]=20#55=20=EC=8A=A4=ED=94=8C?= =?UTF-8?q?=EB=9E=98=EC=8B=9C=EC=97=90=EC=84=9C=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20=ED=8E=98=EC=9D=B4=EC=A7=80=EA=B9=8C=EC=A7=80=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 2 +- .../java/org/keepgoeat/presentation/SplashActivity.kt | 7 ++++++- .../presentation/onboarding/OnboardingActivity.kt | 10 +++++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7b10a4a1..a893c60c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:scheme="kakaod799c706c62fb280c279b5befc65116f" /> diff --git a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt index 60276492..d3cd1dd5 100644 --- a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt @@ -9,7 +9,9 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.keepgoeat.R import org.keepgoeat.databinding.ActivitySplashBinding +import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.sign.SignActivity +import org.keepgoeat.presentation.sign.SignSharedPreferences import org.keepgoeat.util.binding.BindingActivity @AndroidEntryPoint @@ -29,6 +31,9 @@ class SplashActivity : BindingActivity(R.layout.activity_ } private fun moveToNext() { - startActivity(Intent(this, SignActivity::class.java)) + if (SignSharedPreferences(this).isLogin) + startActivity(Intent(this, HomeActivity::class.java)) + else + startActivity(Intent(this, SignActivity::class.java)) } } diff --git a/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt index a4e74eb1..22b10905 100644 --- a/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt @@ -1,5 +1,6 @@ package org.keepgoeat.presentation.onboarding +import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import androidx.viewpager2.widget.ViewPager2 @@ -7,10 +8,12 @@ import com.google.android.material.tabs.TabLayoutMediator import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.ActivityOnboardingBinding +import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.util.binding.BindingActivity @AndroidEntryPoint -class OnboardingActivity : BindingActivity(R.layout.activity_onboarding) { +class OnboardingActivity : + BindingActivity(R.layout.activity_onboarding) { private val viewModel: OnboardingViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { @@ -39,7 +42,12 @@ class OnboardingActivity : BindingActivity(R.layout.a private fun addListeners() { binding.btnNext.setOnClickListener { + if (binding.vpViewPager.currentItem == 2) + startActivity(Intent(this, HomeActivity::class.java)) binding.vpViewPager.currentItem++ } + binding.tvSkip.setOnClickListener { + startActivity(Intent(this, HomeActivity::class.java)) + } } } From c72bbda4bbbe6dbb2d5fea9f3800242bf638423d Mon Sep 17 00:00:00 2001 From: Daeun Date: Wed, 11 Jan 2023 17:20:55 +0900 Subject: [PATCH 268/745] =?UTF-8?q?[chore]=20#96=20klint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt | 2 +- app/src/main/java/org/keepgoeat/data/service/AuthService.kt | 2 +- .../main/java/org/keepgoeat/domain/repository/AuthRepository.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt index 6ff4a46e..29a72392 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt @@ -38,4 +38,4 @@ class AuthRepositoryImpl @Inject constructor( } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/keepgoeat/data/service/AuthService.kt b/app/src/main/java/org/keepgoeat/data/service/AuthService.kt index 3e963951..2152d1c5 100644 --- a/app/src/main/java/org/keepgoeat/data/service/AuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/AuthService.kt @@ -9,4 +9,4 @@ import retrofit2.http.POST interface AuthService { @POST("auth") suspend fun login(@Body request: RequestAuth): Response -} \ No newline at end of file +} diff --git a/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt index 29c92144..5f738474 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt @@ -5,4 +5,4 @@ import org.keepgoeat.data.model.response.ResponseAuth interface AuthRepository { suspend fun login(requestAuth: RequestAuth): ResponseAuth.ResponseAuthData? -} \ No newline at end of file +} From 296d3b4140a635ff2abc0b732dc0f19662737898 Mon Sep 17 00:00:00 2001 From: Daeun Date: Wed, 11 Jan 2023 17:27:55 +0900 Subject: [PATCH 269/745] =?UTF-8?q?[mod]=20#55=20manifest=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a893c60c..7b10a4a1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:scheme="kakao${KAKAO_NATIVE_KEY}" /> From 9f3fb6e1f8085c775837bfa84784da5321f3e879 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 11 Jan 2023 19:33:50 +0900 Subject: [PATCH 270/745] =?UTF-8?q?=20[fix]=20#99=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20api=20=EC=97=B0=EB=8F=99=20=EC=8B=A4=ED=8C=A8=20?= =?UTF-8?q?=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/interceptor/AuthInterceptor.kt | 27 +++++++++++++++++++ .../data/model/request/RequestAuth.kt | 2 +- .../org/keepgoeat/data/service/SignService.kt | 9 ++++--- .../java/org/keepgoeat/di/NetworkModule.kt | 27 +++++++------------ 4 files changed, 43 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/data/interceptor/AuthInterceptor.kt diff --git a/app/src/main/java/org/keepgoeat/data/interceptor/AuthInterceptor.kt b/app/src/main/java/org/keepgoeat/data/interceptor/AuthInterceptor.kt new file mode 100644 index 00000000..a82d755d --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/interceptor/AuthInterceptor.kt @@ -0,0 +1,27 @@ +package org.keepgoeat.data.interceptor + +import com.google.gson.Gson +import okhttp3.Interceptor +import okhttp3.Response +import org.keepgoeat.data.datasource.local.SignSharedPreferences +import javax.inject.Inject + +class AuthInterceptor @Inject constructor( + private val localStorage: SignSharedPreferences, + private val gson: Gson, +) : Interceptor { + + override fun intercept(chain: Interceptor.Chain): Response { + val originalRequest = chain.request() + val authRequest = + originalRequest.newBuilder().addHeader("accesstoken", localStorage.accestToken).build() + val response = chain.proceed(authRequest) + + when (response.code) { + 401 -> { + // TODO 토큰 재발급 api 연동 + } + } + return response + } +} diff --git a/app/src/main/java/org/keepgoeat/data/model/request/RequestAuth.kt b/app/src/main/java/org/keepgoeat/data/model/request/RequestAuth.kt index 27f27568..47936aac 100644 --- a/app/src/main/java/org/keepgoeat/data/model/request/RequestAuth.kt +++ b/app/src/main/java/org/keepgoeat/data/model/request/RequestAuth.kt @@ -5,5 +5,5 @@ import kotlinx.serialization.Serializable @Serializable data class RequestAuth( val platformAccessToken: String, - val platform: String = "KAKAO", + val platform: String, ) diff --git a/app/src/main/java/org/keepgoeat/data/service/SignService.kt b/app/src/main/java/org/keepgoeat/data/service/SignService.kt index ceb691c2..51e5e0a3 100644 --- a/app/src/main/java/org/keepgoeat/data/service/SignService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/SignService.kt @@ -15,7 +15,7 @@ import javax.inject.Inject class SignService @Inject constructor( @ActivityContext private val context: Context, private val client: UserApiClient, - private val authRepository: AuthRepository + private val authRepository: AuthRepository, ) { private val isKakaoTalkLoginAvailable: Boolean get() = client.isKakaoTalkLoginAvailable(context) @@ -37,9 +37,8 @@ class SignService @Inject constructor( private fun handleLoginSuccess(oAuthToken: OAuthToken, loginListener: (() -> Unit)) { client.me { user, _ -> - // TODO 로그인 Api 연결 CoroutineScope(Dispatchers.IO).launch { - authRepository.login(RequestAuth(oAuthToken.accessToken)) + authRepository.login(RequestAuth(oAuthToken.accessToken, PLATFORM_KAKAO)) } Timber.d(oAuthToken.accessToken) loginListener() @@ -49,4 +48,8 @@ class SignService @Inject constructor( fun logout() { client.logout(Timber::e) } + + companion object { + private const val PLATFORM_KAKAO = "KAKAO" + } } diff --git a/app/src/main/java/org/keepgoeat/di/NetworkModule.kt b/app/src/main/java/org/keepgoeat/di/NetworkModule.kt index e80cc831..76419ce8 100644 --- a/app/src/main/java/org/keepgoeat/di/NetworkModule.kt +++ b/app/src/main/java/org/keepgoeat/di/NetworkModule.kt @@ -1,5 +1,7 @@ package org.keepgoeat.di +import com.google.gson.Gson +import com.google.gson.GsonBuilder import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory import dagger.Module import dagger.Provides @@ -13,6 +15,7 @@ import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import org.keepgoeat.BuildConfig import org.keepgoeat.BuildConfig.DEBUG +import org.keepgoeat.data.interceptor.AuthInterceptor import retrofit2.Retrofit import java.util.concurrent.TimeUnit import javax.inject.Singleton @@ -20,7 +23,6 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) object NetworkModule { - private const val dummyAccessToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTIsImVtYWlsIjoicGFya191YmluQG5hdmVyLmNvbSIsImlhdCI6MTY3MzMyOTE3NSwiZXhwIjoxNjczODMzMTc1LCJpc3MiOiJLRUVQR09FQVRfU0VSVkVSIn0.zPlL2aRxpILrmvJVT298FbeXrKpZUkkYJ4HecPBvh4U" @OptIn(ExperimentalSerializationApi::class) @Provides @Singleton @@ -31,6 +33,10 @@ object NetworkModule { ignoreUnknownKeys = true } + @Provides + @Singleton + fun provideGson(): Gson = GsonBuilder().setLenient().create() + @ExperimentalSerializationApi @Provides @Singleton @@ -42,26 +48,12 @@ object NetworkModule { @Provides @Singleton - fun providesInterceptor(): Interceptor = - Interceptor { chain -> - with(chain) { - proceed( - request() - .newBuilder() - .addHeader( - "accesstoken", - dummyAccessToken - ) - .addHeader("Content-Type", "Application/json") - .build() - ) - } - } + fun provideAuthInterceptor(interceptor: AuthInterceptor): Interceptor = interceptor @Provides @Singleton fun provideOkHttpClientBuilder( - interceptor: Interceptor, + interceptor: AuthInterceptor, ): OkHttpClient = OkHttpClient.Builder().apply { connectTimeout(10, TimeUnit.SECONDS) @@ -73,6 +65,5 @@ object NetworkModule { level = HttpLoggingInterceptor.Level.BODY } ) - // TODO AuthInterceptor 추가 }.build() } From 068e435fc88f89e89428ee0c2b4d25b31764eb58 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 11 Jan 2023 19:34:14 +0900 Subject: [PATCH 271/745] =?UTF-8?q?=20[del]=20#99=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EB=90=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20import=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt index d3cd1dd5..d5e6257e 100644 --- a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt @@ -8,10 +8,10 @@ import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.keepgoeat.R +import org.keepgoeat.data.datasource.local.SignSharedPreferences import org.keepgoeat.databinding.ActivitySplashBinding import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.sign.SignActivity -import org.keepgoeat.presentation.sign.SignSharedPreferences import org.keepgoeat.util.binding.BindingActivity @AndroidEntryPoint From 2527269228cba1923a9444291eab37b7287a1f18 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 11 Jan 2023 19:37:12 +0900 Subject: [PATCH 272/745] =?UTF-8?q?=20[chore]=20#99=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/service/{SignService.kt => KakaoAuthService.kt} | 4 ++-- app/src/main/java/org/keepgoeat/di/SignModule.kt | 4 ++-- .../main/java/org/keepgoeat/presentation/sign/SignActivity.kt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) rename app/src/main/java/org/keepgoeat/data/service/{SignService.kt => KakaoAuthService.kt} (93%) diff --git a/app/src/main/java/org/keepgoeat/data/service/SignService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt similarity index 93% rename from app/src/main/java/org/keepgoeat/data/service/SignService.kt rename to app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index 51e5e0a3..1cbf8b9a 100644 --- a/app/src/main/java/org/keepgoeat/data/service/SignService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -12,7 +12,7 @@ import org.keepgoeat.domain.repository.AuthRepository import timber.log.Timber import javax.inject.Inject -class SignService @Inject constructor( +class KakaoAuthService @Inject constructor( @ActivityContext private val context: Context, private val client: UserApiClient, private val authRepository: AuthRepository, @@ -32,7 +32,7 @@ class SignService @Inject constructor( private fun handleLoginError(throwable: Throwable) { val kakaoType = if (isKakaoTalkLoginAvailable) "카카오톡" else "카카오 계정" - Timber.d("$kakaoType 으로 로그인 실패 (${throwable.message})") + Timber.d("${kakaoType}으로 로그인 실패 (${throwable.message})") } private fun handleLoginSuccess(oAuthToken: OAuthToken, loginListener: (() -> Unit)) { diff --git a/app/src/main/java/org/keepgoeat/di/SignModule.kt b/app/src/main/java/org/keepgoeat/di/SignModule.kt index 2b14f0bd..d9b82314 100644 --- a/app/src/main/java/org/keepgoeat/di/SignModule.kt +++ b/app/src/main/java/org/keepgoeat/di/SignModule.kt @@ -8,7 +8,7 @@ import dagger.hilt.InstallIn import dagger.hilt.android.components.ActivityComponent import dagger.hilt.android.qualifiers.ActivityContext import dagger.hilt.android.scopes.ActivityScoped -import org.keepgoeat.data.service.SignService +import org.keepgoeat.data.service.KakaoAuthService import org.keepgoeat.domain.repository.AuthRepository @Module @@ -23,5 +23,5 @@ object SignModule { @ActivityContext context: Context, client: UserApiClient, authRepository: AuthRepository - ) = SignService(context, client, authRepository) + ) = KakaoAuthService(context, client, authRepository) } diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt index 1d56d72b..c6532d03 100644 --- a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt @@ -4,7 +4,7 @@ import android.content.Intent import android.os.Bundle import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R -import org.keepgoeat.data.service.SignService +import org.keepgoeat.data.service.KakaoAuthService import org.keepgoeat.databinding.ActivitySignBinding import org.keepgoeat.presentation.onboarding.OnboardingActivity import org.keepgoeat.util.binding.BindingActivity @@ -13,7 +13,7 @@ import javax.inject.Inject @AndroidEntryPoint class SignActivity : BindingActivity(R.layout.activity_sign) { @Inject - lateinit var signService: SignService + lateinit var signService: KakaoAuthService override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) From 3691e8aa99dd8e05a9e840447722844bda9d1b2b Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 11 Jan 2023 19:40:28 +0900 Subject: [PATCH 273/745] =?UTF-8?q?=20[chore]=20#99=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/local/KGEDataSource.kt | 56 +++++++++++++++++- .../datasource/local/SignSharedPreferences.kt | 58 ------------------- .../data/interceptor/AuthInterceptor.kt | 4 +- .../data/repository/AuthRepositoryImpl.kt | 6 +- .../keepgoeat/presentation/SplashActivity.kt | 4 +- 5 files changed, 62 insertions(+), 66 deletions(-) delete mode 100644 app/src/main/java/org/keepgoeat/data/datasource/local/SignSharedPreferences.kt diff --git a/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt index 2f9410b5..712c5128 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt @@ -1,6 +1,60 @@ package org.keepgoeat.data.datasource.local +import android.content.Context +import android.content.SharedPreferences +import androidx.core.content.edit +import androidx.databinding.ktx.BuildConfig +import androidx.security.crypto.EncryptedSharedPreferences +import androidx.security.crypto.MasterKey +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject import javax.inject.Singleton @Singleton -class KGEDataSource +class KGEDataSource @Inject constructor(@ApplicationContext context: Context) { + + private val masterKey = MasterKey.Builder(context, MasterKey.DEFAULT_MASTER_KEY_ALIAS) + .setKeyScheme(MasterKey.KeyScheme.AES256_GCM) + .build() + + private val dataStore: SharedPreferences = + if (BuildConfig.DEBUG) context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE) + else EncryptedSharedPreferences.create( + context, + FILE_NAME, + masterKey, + EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, + EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM + ) + + var accestToken: String + set(value) = dataStore.edit { putString(ACCESS_TOKEN, value) } + get() = dataStore.getString( + ACCESS_TOKEN, + "" + ) ?: "" + + var refreshToken: String + set(value) = dataStore.edit { putString(REFRESH_TOKEN, value) } + get() = dataStore.getString( + REFRESH_TOKEN, + "" + ) ?: "" + + var isLogin: Boolean + set(value) = dataStore.edit { putBoolean(IS_LOGIN, value) } + get() = dataStore.getBoolean(IS_LOGIN, false) + + fun clear() { + dataStore.edit { + clear() + } + } + + companion object { + const val FILE_NAME = "SignSharedPreferences" + const val ACCESS_TOKEN = "AccessToken" + const val IS_LOGIN = "IsLogin" + const val REFRESH_TOKEN = "RefreshToken" + } +} diff --git a/app/src/main/java/org/keepgoeat/data/datasource/local/SignSharedPreferences.kt b/app/src/main/java/org/keepgoeat/data/datasource/local/SignSharedPreferences.kt deleted file mode 100644 index bf4f314d..00000000 --- a/app/src/main/java/org/keepgoeat/data/datasource/local/SignSharedPreferences.kt +++ /dev/null @@ -1,58 +0,0 @@ -package org.keepgoeat.data.datasource.local - -import android.content.Context -import android.content.SharedPreferences -import androidx.core.content.edit -import androidx.databinding.ktx.BuildConfig -import androidx.security.crypto.EncryptedSharedPreferences -import androidx.security.crypto.MasterKey -import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject - -class SignSharedPreferences @Inject constructor(@ApplicationContext context: Context) { - - private val masterKey = MasterKey.Builder(context, MasterKey.DEFAULT_MASTER_KEY_ALIAS) - .setKeyScheme(MasterKey.KeyScheme.AES256_GCM) - .build() - - private val dataStore: SharedPreferences = - if (BuildConfig.DEBUG) context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE) - else EncryptedSharedPreferences.create( - context, - FILE_NAME, - masterKey, - EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, - EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM - ) - - var accestToken: String - set(value) = dataStore.edit { putString(ACCESS_TOKEN, value) } - get() = dataStore.getString( - ACCESS_TOKEN, - "" - ) ?: "" - - var refreshToken: String - set(value) = dataStore.edit { putString(REFRESH_TOKEN, value) } - get() = dataStore.getString( - REFRESH_TOKEN, - "" - ) ?: "" - - var isLogin: Boolean - set(value) = dataStore.edit { putBoolean(IS_LOGIN, value) } - get() = dataStore.getBoolean(IS_LOGIN, false) - - fun clear() { - dataStore.edit { - clear() - } - } - - companion object { - const val FILE_NAME = "SignSharedPreferences" - const val ACCESS_TOKEN = "AccessToken" - const val IS_LOGIN = "IsLogin" - const val REFRESH_TOKEN = "RefreshToken" - } -} diff --git a/app/src/main/java/org/keepgoeat/data/interceptor/AuthInterceptor.kt b/app/src/main/java/org/keepgoeat/data/interceptor/AuthInterceptor.kt index a82d755d..f38f47bb 100644 --- a/app/src/main/java/org/keepgoeat/data/interceptor/AuthInterceptor.kt +++ b/app/src/main/java/org/keepgoeat/data/interceptor/AuthInterceptor.kt @@ -3,11 +3,11 @@ package org.keepgoeat.data.interceptor import com.google.gson.Gson import okhttp3.Interceptor import okhttp3.Response -import org.keepgoeat.data.datasource.local.SignSharedPreferences +import org.keepgoeat.data.datasource.local.KGEDataSource import javax.inject.Inject class AuthInterceptor @Inject constructor( - private val localStorage: SignSharedPreferences, + private val localStorage: KGEDataSource, private val gson: Gson, ) : Interceptor { diff --git a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt index 29a72392..2181c106 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt @@ -1,7 +1,7 @@ package org.keepgoeat.data.repository import org.keepgoeat.data.ApiResult -import org.keepgoeat.data.datasource.local.SignSharedPreferences +import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.data.datasource.remote.AuthDataSource import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.data.model.response.ResponseAuth @@ -11,14 +11,14 @@ import javax.inject.Inject class AuthRepositoryImpl @Inject constructor( private val authDataSource: AuthDataSource, - private val signSharedPreferences: SignSharedPreferences + private val localStorage: KGEDataSource ) : AuthRepository { override suspend fun login(requestAuth: RequestAuth): ResponseAuth.ResponseAuthData? { val result = authDataSource.login(requestAuth) return when (result) { is ApiResult.Success -> { val response = result.data?.data - with(signSharedPreferences) { + with(localStorage) { isLogin = true response?.let { accestToken = it.accessToken diff --git a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt index d5e6257e..3892ede9 100644 --- a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt @@ -8,7 +8,7 @@ import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.keepgoeat.R -import org.keepgoeat.data.datasource.local.SignSharedPreferences +import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.databinding.ActivitySplashBinding import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.sign.SignActivity @@ -31,7 +31,7 @@ class SplashActivity : BindingActivity(R.layout.activity_ } private fun moveToNext() { - if (SignSharedPreferences(this).isLogin) + if (KGEDataSource(this).isLogin) startActivity(Intent(this, HomeActivity::class.java)) else startActivity(Intent(this, SignActivity::class.java)) From 68272bfd46a0565b778ebd4c5eabed53ef4397ce Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 11 Jan 2023 19:41:08 +0900 Subject: [PATCH 274/745] =?UTF-8?q?=20[chore]=20#99=20=EC=83=81=EC=88=98?= =?UTF-8?q?=EA=B0=92=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/data/datasource/local/KGEDataSource.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt index 712c5128..e6a2b6d0 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt @@ -52,9 +52,9 @@ class KGEDataSource @Inject constructor(@ApplicationContext context: Context) { } companion object { - const val FILE_NAME = "SignSharedPreferences" - const val ACCESS_TOKEN = "AccessToken" - const val IS_LOGIN = "IsLogin" - const val REFRESH_TOKEN = "RefreshToken" + const val FILE_NAME = "signSharedPreferences" + const val ACCESS_TOKEN = "accessToken" + const val IS_LOGIN = "isLogin" + const val REFRESH_TOKEN = "refreshToken" } } From 5f90d2d21d516fca58d49f0db63cb80dd2f447f0 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 11 Jan 2023 19:50:21 +0900 Subject: [PATCH 275/745] =?UTF-8?q?=20[chore]=20#99=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/onboarding/OnboardingActivity.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt index 22b10905..583b6967 100644 --- a/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt @@ -36,18 +36,22 @@ class OnboardingActivity : this@OnboardingActivity.viewModel.setPosition(position) } }) - TabLayoutMediator(binding.indicator, vpViewPager) { _, _ -> }.attach() + TabLayoutMediator(indicator, vpViewPager) { _, _ -> }.attach() } } private fun addListeners() { binding.btnNext.setOnClickListener { - if (binding.vpViewPager.currentItem == 2) - startActivity(Intent(this, HomeActivity::class.java)) + if (binding.vpViewPager.currentItem == 2) moveToHome() binding.vpViewPager.currentItem++ } binding.tvSkip.setOnClickListener { - startActivity(Intent(this, HomeActivity::class.java)) + moveToHome() } } + + private fun moveToHome() { + startActivity(Intent(this, HomeActivity::class.java)) + finish() + } } From 1cc87a8044968eadd9fa8a564a0a29b92f9c6dfb Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 11 Jan 2023 20:27:14 +0900 Subject: [PATCH 276/745] =?UTF-8?q?=20[chore]=20#101=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=EC=84=9C=20=EB=B0=B1?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=EB=88=8C=EB=A0=80=EC=9D=84=20=EB=95=8C=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=EC=A0=84=ED=99=98=EC=9D=B4=20=EB=B6=80?= =?UTF-8?q?=EC=9E=90=EC=97=B0=EC=8A=A4=EB=9F=AC=EC=9A=B4=20=EB=B2=84?= =?UTF-8?q?=EA=B7=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalDetailActivity.kt | 19 ++++++++++--------- .../detail/GoalKeepBottomDialogFragment.kt | 13 +++++++++++++ .../keepgoeat/presentation/my/MyActivity.kt | 17 +++++++++++++++-- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index d8eeda16..468ee983 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -11,6 +11,7 @@ import org.keepgoeat.presentation.detail.GoalDetailViewModel.Companion.CELL_COUN import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.model.GoalContent import org.keepgoeat.presentation.my.MyActivity +import org.keepgoeat.presentation.my.MyActivity.Companion.ARG_IS_ENTERED_FROM_KEEP import org.keepgoeat.presentation.setting.GoalSettingActivity import org.keepgoeat.presentation.setting.GoalSettingActivity.Companion.ARG_GOAL_CONTENT import org.keepgoeat.presentation.setting.GoalSettingActivity.Companion.ARG_IS_UPDATED @@ -50,13 +51,9 @@ class GoalDetailActivity : } private fun initLayout() { - binding.rvGoalCard.addItemDecoration( - ItemDecorationUtil( - CARD_ITEM_SPACE, - Pair(CARD_MATRIX_ROW, CARD_MATRIX_COL), - RecyclerLayoutType.GRID - ) - ) + binding.rvGoalCard.addItemDecoration(ItemDecorationUtil(CARD_ITEM_SPACE, + Pair(CARD_MATRIX_ROW, CARD_MATRIX_COL), + RecyclerLayoutType.GRID)) } private fun addListeners() { @@ -91,8 +88,12 @@ class GoalDetailActivity : viewModel.keepState.observe(this) { keepState -> when (keepState) { is UiState.Success -> { - startActivity(Intent(this, MyActivity::class.java)) - finish() + Intent(this, MyActivity::class.java).apply { + putExtra(ARG_IS_ENTERED_FROM_KEEP, true) + }.also { + startActivity(it) + finish() + } } else -> {} } diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt index 9adb2da5..8aaeb295 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt @@ -6,6 +6,7 @@ import androidx.fragment.app.activityViewModels import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.DialogBottomGoalKeepBinding +import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingBottomSheetDialogFragment @AndroidEntryPoint @@ -18,6 +19,7 @@ class GoalKeepBottomDialogFragment : binding.viewModel = viewModel addListeners() + addObservers() } private fun addListeners() { @@ -26,6 +28,17 @@ class GoalKeepBottomDialogFragment : } } + private fun addObservers() { + viewModel.keepState.observe(this) { keepState -> + when (keepState) { + is UiState.Success -> { + dismiss() + } + else -> {} + } + } + } + private fun showGoalDeleteDialog() { GoalDeleteBottomDialogFragment().show(parentFragmentManager, "goalDeleteDialog") } diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt index 0b09c91d..48fe5226 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt @@ -19,9 +19,11 @@ class MyActivity : BindingActivity(R.layout.activity_my) { private val goalAdapter = MyGoalAdapter() private val headerAdapter = MyHeaderAdapter(::getFilteredGoalWithEatingType) private val goalConcatAdapter = ConcatAdapter(headerAdapter, goalAdapter) + private var isEnteredFromKeep: Boolean = false + private val callback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { - moveToHome() + moveToPrevious() } } @@ -30,6 +32,8 @@ class MyActivity : BindingActivity(R.layout.activity_my) { binding.viewModel = viewModel binding.lifecycleOwner = this + isEnteredFromKeep = intent.getBooleanExtra(ARG_IS_ENTERED_FROM_KEEP, false) + initLayout() addListeners() addObservers() @@ -53,7 +57,7 @@ class MyActivity : BindingActivity(R.layout.activity_my) { private fun addListeners() { binding.ivBack.setOnClickListener { - moveToHome() + moveToPrevious() } } @@ -68,4 +72,13 @@ class MyActivity : BindingActivity(R.layout.activity_my) { intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK startActivity(intent) } + + private fun moveToPrevious() { + if (isEnteredFromKeep) moveToHome() + else finish() + } + + companion object { + const val ARG_IS_ENTERED_FROM_KEEP = "isEnteredFromKeep" + } } From 1ea3ab3d12d854f22e44e4334013103eb804937a Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 11 Jan 2023 20:32:18 +0900 Subject: [PATCH 277/745] =?UTF-8?q?=20[chore]=20#101=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalDetailActivity.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 468ee983..7345eaec 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -51,9 +51,13 @@ class GoalDetailActivity : } private fun initLayout() { - binding.rvGoalCard.addItemDecoration(ItemDecorationUtil(CARD_ITEM_SPACE, - Pair(CARD_MATRIX_ROW, CARD_MATRIX_COL), - RecyclerLayoutType.GRID)) + binding.rvGoalCard.addItemDecoration( + ItemDecorationUtil( + CARD_ITEM_SPACE, + Pair(CARD_MATRIX_ROW, CARD_MATRIX_COL), + RecyclerLayoutType.GRID + ) + ) } private fun addListeners() { From 4d9a51d76fb0943b83cf62c283009d2fceb095e7 Mon Sep 17 00:00:00 2001 From: choiyoungjin Date: Thu, 12 Jan 2023 01:32:29 +0900 Subject: [PATCH 278/745] =?UTF-8?q?[docs]=20Contributors=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e1f6fed2..d5a2e700 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ IN SOPT 31st APPJAM 킵고잇 Android 팀 레포입니다. | [@YuBeen-Park](https://github.com/YuBeen-Park) | [@Dani43](https://github.com/Dan2dani) | [@youngjinc](https://github.com/youngjinc) | | :---: | :---: | :---: | -|||| +|||| |`HomeView`|`LoginView`, `OnBoardingView`|`GoalSettingView`, `GoalDetailView`|
From 96e46e791e9ffca9a7ba3494d3a292f4fd7d047b Mon Sep 17 00:00:00 2001 From: Daeun Date: Thu, 12 Jan 2023 12:22:00 +0900 Subject: [PATCH 279/745] =?UTF-8?q?[feat]=20#103=20=ED=86=A0=ED=81=B0=20?= =?UTF-8?q?=EC=9E=AC=EB=B0=9C=EA=B8=89=20api=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 + .../data/datasource/local/KGEDataSource.kt | 2 +- .../data/datasource/remote/AuthDataSource.kt | 4 ++ .../data/interceptor/AuthInterceptor.kt | 54 ++++++++++++++++++- .../data/model/response/ResponseRefresh.kt | 17 ++++++ .../data/repository/AuthRepositoryImpl.kt | 21 +++++++- .../org/keepgoeat/data/service/AuthService.kt | 4 ++ .../domain/repository/AuthRepository.kt | 3 ++ app/src/main/res/values/strings.xml | 1 + 9 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/data/model/response/ResponseRefresh.kt diff --git a/app/build.gradle b/app/build.gradle index 6a1f7e13..04601ba8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -103,6 +103,8 @@ dependencies { // Lottie implementation 'com.airbnb.android:lottie:5.2.0' + + implementation 'com.google.code.gson:gson:2.10' } ktlint { diff --git a/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt index e6a2b6d0..34d0fc41 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt @@ -27,7 +27,7 @@ class KGEDataSource @Inject constructor(@ApplicationContext context: Context) { EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) - var accestToken: String + var accessToken: String set(value) = dataStore.edit { putString(ACCESS_TOKEN, value) } get() = dataStore.getString( ACCESS_TOKEN, diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt index bdfbaaa2..64585ec1 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt @@ -3,6 +3,7 @@ package org.keepgoeat.data.datasource.remote import org.keepgoeat.data.ApiResult import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.data.model.response.ResponseAuth +import org.keepgoeat.data.model.response.ResponseRefresh import org.keepgoeat.data.service.AuthService import org.keepgoeat.util.safeApiCall import javax.inject.Inject @@ -12,4 +13,7 @@ class AuthDataSource @Inject constructor( ) { suspend fun login(requestAuth: RequestAuth): ApiResult = safeApiCall { authService.login(requestAuth) } + + suspend fun refresh(): ApiResult = + safeApiCall { authService.refresh() } } diff --git a/app/src/main/java/org/keepgoeat/data/interceptor/AuthInterceptor.kt b/app/src/main/java/org/keepgoeat/data/interceptor/AuthInterceptor.kt index f38f47bb..8649c2af 100644 --- a/app/src/main/java/org/keepgoeat/data/interceptor/AuthInterceptor.kt +++ b/app/src/main/java/org/keepgoeat/data/interceptor/AuthInterceptor.kt @@ -1,27 +1,79 @@ package org.keepgoeat.data.interceptor +import android.app.Application +import android.content.Intent import com.google.gson.Gson +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch import okhttp3.Interceptor import okhttp3.Response +import org.keepgoeat.BuildConfig +import org.keepgoeat.R import org.keepgoeat.data.datasource.local.KGEDataSource +import org.keepgoeat.data.model.response.ResponseRefresh +import org.keepgoeat.util.extension.showToast import javax.inject.Inject class AuthInterceptor @Inject constructor( private val localStorage: KGEDataSource, private val gson: Gson, + private val context: Application ) : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() val authRequest = - originalRequest.newBuilder().addHeader("accesstoken", localStorage.accestToken).build() + originalRequest.newBuilder().addHeader(ACCESS_TOKEN, localStorage.accessToken).build() val response = chain.proceed(authRequest) when (response.code) { 401 -> { // TODO 토큰 재발급 api 연동 + val refreshTokenRequest = originalRequest.newBuilder().get() + .url("${BuildConfig.KGE_BASE_URL}auth/refresh") + .addHeader(ACCESS_TOKEN, localStorage.accessToken) + .addHeader(REFRESH_TOKEN, localStorage.refreshToken) + .build() + val refreshTokenResponse = chain.proceed(refreshTokenRequest) + + if (refreshTokenResponse.isSuccessful) { + val responseRefresh = gson.fromJson( + refreshTokenResponse.body?.string(), + ResponseRefresh::class.java + ) + with(localStorage) { + accessToken = responseRefresh.data.accessToken + refreshToken = responseRefresh.data.refreshToken + } + val newRequest = + originalRequest.newBuilder() + .addHeader(ACCESS_TOKEN, localStorage.accessToken) + .build() + return chain.proceed(newRequest) + + } else { + with(context) { + CoroutineScope(Dispatchers.Main).launch { + startActivity( + Intent.makeRestartActivityTask( + packageManager.getLaunchIntentForPackage(packageName)?.component + ) + ) + showToast(getString(R.string.auto_login_failure)) + localStorage.clear() + cancel() + } + } + } } } return response } + + companion object { + private const val ACCESS_TOKEN = "accesstoken" + private const val REFRESH_TOKEN = "refreshtoken" + } } diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseRefresh.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseRefresh.kt new file mode 100644 index 00000000..6c4d60d1 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseRefresh.kt @@ -0,0 +1,17 @@ +package org.keepgoeat.data.model.response + +import kotlinx.serialization.Serializable + +@Serializable +data class ResponseRefresh( + val status: Int, + val success: Boolean, + val message: String, + val data: Token, +) { + @Serializable + data class Token( + val accessToken: String, + val refreshToken: String + ) +} diff --git a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt index 2181c106..3fc12617 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt @@ -5,6 +5,7 @@ import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.data.datasource.remote.AuthDataSource import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.data.model.response.ResponseAuth +import org.keepgoeat.data.model.response.ResponseRefresh import org.keepgoeat.domain.repository.AuthRepository import timber.log.Timber import javax.inject.Inject @@ -13,6 +14,7 @@ class AuthRepositoryImpl @Inject constructor( private val authDataSource: AuthDataSource, private val localStorage: KGEDataSource ) : AuthRepository { + override suspend fun login(requestAuth: RequestAuth): ResponseAuth.ResponseAuthData? { val result = authDataSource.login(requestAuth) return when (result) { @@ -21,7 +23,7 @@ class AuthRepositoryImpl @Inject constructor( with(localStorage) { isLogin = true response?.let { - accestToken = it.accessToken + accessToken = it.accessToken refreshToken = it.refreshToken } } @@ -38,4 +40,21 @@ class AuthRepositoryImpl @Inject constructor( } } } + + override suspend fun refresh(): ResponseRefresh.Token? { + val result = authDataSource.refresh() + return when (result) { + is ApiResult.Success -> { + result.data?.data + } + is ApiResult.NetworkError -> { + Timber.d("Network Error") + null + } + is ApiResult.GenericError -> { + Timber.d("(${result.code}): ${result.message}") + null + } + } + } } diff --git a/app/src/main/java/org/keepgoeat/data/service/AuthService.kt b/app/src/main/java/org/keepgoeat/data/service/AuthService.kt index 2152d1c5..d17f0161 100644 --- a/app/src/main/java/org/keepgoeat/data/service/AuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/AuthService.kt @@ -2,6 +2,7 @@ package org.keepgoeat.data.service import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.data.model.response.ResponseAuth +import org.keepgoeat.data.model.response.ResponseRefresh import retrofit2.Response import retrofit2.http.Body import retrofit2.http.POST @@ -9,4 +10,7 @@ import retrofit2.http.POST interface AuthService { @POST("auth") suspend fun login(@Body request: RequestAuth): Response + + @POST("auth/refresh") + suspend fun refresh(): Response } diff --git a/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt index 5f738474..3e0642f5 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt @@ -2,7 +2,10 @@ package org.keepgoeat.domain.repository import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.data.model.response.ResponseAuth +import org.keepgoeat.data.model.response.ResponseRefresh interface AuthRepository { suspend fun login(requestAuth: RequestAuth): ResponseAuth.ResponseAuthData? + + suspend fun refresh(): ResponseRefresh.Token? } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a5fcea4d..3876b86d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,6 +15,7 @@ 카카오톡 로그인 식습관 관리, 같이 천천히 시작해볼까요?\n먹는 재미는 언제나 소중하니까! + 자동 로그인 실패 나의 목표 From d79c93483f554c2dca2eff3566787c2ec6d30f51 Mon Sep 17 00:00:00 2001 From: Daeun Date: Thu, 12 Jan 2023 12:26:45 +0900 Subject: [PATCH 280/745] =?UTF-8?q?[chore]=20#103=20klint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/data/interceptor/AuthInterceptor.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/data/interceptor/AuthInterceptor.kt b/app/src/main/java/org/keepgoeat/data/interceptor/AuthInterceptor.kt index 8649c2af..62ccb95b 100644 --- a/app/src/main/java/org/keepgoeat/data/interceptor/AuthInterceptor.kt +++ b/app/src/main/java/org/keepgoeat/data/interceptor/AuthInterceptor.kt @@ -52,7 +52,6 @@ class AuthInterceptor @Inject constructor( .addHeader(ACCESS_TOKEN, localStorage.accessToken) .build() return chain.proceed(newRequest) - } else { with(context) { CoroutineScope(Dispatchers.Main).launch { From be08522861045d6accd5a5d43788363e786defba Mon Sep 17 00:00:00 2001 From: Daeun Date: Thu, 12 Jan 2023 14:33:44 +0900 Subject: [PATCH 281/745] =?UTF-8?q?[chore]=20#103=20=EB=B3=80=EC=88=98?= =?UTF-8?q?=EB=AA=85=20=EB=B0=8F=20string=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 3 +-- .../java/org/keepgoeat/data/model/response/ResponseRefresh.kt | 4 ++-- app/src/main/res/values/strings.xml | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 04601ba8..20e03a4e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -82,6 +82,7 @@ dependencies { implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0' implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1' + implementation 'com.google.code.gson:gson:2.10' // Firebase implementation platform('com.google.firebase:firebase-bom:31.1.1') @@ -103,8 +104,6 @@ dependencies { // Lottie implementation 'com.airbnb.android:lottie:5.2.0' - - implementation 'com.google.code.gson:gson:2.10' } ktlint { diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseRefresh.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseRefresh.kt index 6c4d60d1..4fd4f317 100644 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseRefresh.kt +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseRefresh.kt @@ -7,10 +7,10 @@ data class ResponseRefresh( val status: Int, val success: Boolean, val message: String, - val data: Token, + val data: ResponseToken, ) { @Serializable - data class Token( + data class ResponseToken( val accessToken: String, val refreshToken: String ) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3876b86d..c2c340bf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,7 +15,7 @@ 카카오톡 로그인 식습관 관리, 같이 천천히 시작해볼까요?\n먹는 재미는 언제나 소중하니까! - 자동 로그인 실패 + 자동 로그인이 만료되었습니다. 나의 목표 From 70c8a56721cbdc7ac3a5c0058e77f26bf6eca35c Mon Sep 17 00:00:00 2001 From: Daeun Date: Thu, 12 Jan 2023 14:40:14 +0900 Subject: [PATCH 282/745] =?UTF-8?q?[chore]=20#103=20klint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt | 2 +- .../main/java/org/keepgoeat/domain/repository/AuthRepository.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt index 3fc12617..ca3f6f2a 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt @@ -41,7 +41,7 @@ class AuthRepositoryImpl @Inject constructor( } } - override suspend fun refresh(): ResponseRefresh.Token? { + override suspend fun refresh(): ResponseRefresh.ResponseToken? { val result = authDataSource.refresh() return when (result) { is ApiResult.Success -> { diff --git a/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt index 3e0642f5..4042e65a 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt @@ -7,5 +7,5 @@ import org.keepgoeat.data.model.response.ResponseRefresh interface AuthRepository { suspend fun login(requestAuth: RequestAuth): ResponseAuth.ResponseAuthData? - suspend fun refresh(): ResponseRefresh.Token? + suspend fun refresh(): ResponseRefresh.ResponseToken? } From b0da9f2899c1f0bc0e69f98f13999868a20105de Mon Sep 17 00:00:00 2001 From: youngjinc Date: Thu, 12 Jan 2023 16:53:29 +0900 Subject: [PATCH 283/745] =?UTF-8?q?=20[fix]=20#105=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=EC=97=90=EC=84=9C=20=EA=B1=B4=EB=84=88=EB=9B=B0?= =?UTF-8?q?=EA=B8=B0=20=EB=B2=84=ED=8A=BC=EC=9D=B4=20=EB=88=8C=EB=A6=AC?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/layout/activity_onboarding.xml | 59 +++++++++---------- app/src/main/res/layout/item_onboarding.xml | 23 +++++--- 2 files changed, 43 insertions(+), 39 deletions(-) diff --git a/app/src/main/res/layout/activity_onboarding.xml b/app/src/main/res/layout/activity_onboarding.xml index 7217d6e2..82fee80d 100644 --- a/app/src/main/res/layout/activity_onboarding.xml +++ b/app/src/main/res/layout/activity_onboarding.xml @@ -15,45 +15,41 @@ android:layout_height="match_parent" tools:context=".presentation.onboarding.OnboardingActivity"> - - - + android:layout_marginTop="21dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:tabBackground="@drawable/tab_selector" + app:tabIndicatorHeight="0dp" + app:tabPaddingStart="32dp" /> - - + + app:layout_constraintTop_toBottomOf="@id/indicator" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/item_onboarding.xml b/app/src/main/res/layout/item_onboarding.xml index 62aeebdb..72f6f61a 100644 --- a/app/src/main/res/layout/item_onboarding.xml +++ b/app/src/main/res/layout/item_onboarding.xml @@ -1,6 +1,7 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> @@ -19,28 +20,34 @@ android:layout_height="wrap_content" android:text="@{context.getString(item.titleStrRes)}" android:textAppearance="@style/TextAppearance.System3_Bold" + android:textColor="@color/gray_800" app:layout_constraintBottom_toTopOf="@+id/tv_onboarding_des" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" /> + app:layout_constraintStart_toStartOf="parent" + tools:text="@string/onboarding1_title" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tv_onboarding_title" + tools:text="@string/onboarding1_des" /> + app:layout_constraintTop_toBottomOf="@id/tv_onboarding_des" + tools:src="@drawable/img_onboarding_1" /> \ No newline at end of file From 021e855fb9a70740e6482318c69cfb21503fbb66 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Thu, 12 Jan 2023 16:54:35 +0900 Subject: [PATCH 284/745] =?UTF-8?q?=20[mod]=20#105=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=ED=85=9C=20=EA=B7=B8=EB=A6=BC=EC=9E=90=20?= =?UTF-8?q?=EC=82=AC=EC=9D=B4=EC=A6=88=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/item_home_goal.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/item_home_goal.xml b/app/src/main/res/layout/item_home_goal.xml index 3976410b..deed329f 100644 --- a/app/src/main/res/layout/item_home_goal.xml +++ b/app/src/main/res/layout/item_home_goal.xml @@ -27,7 +27,7 @@ android:layout_marginVertical="@dimen/spacing8" android:background="@drawable/background_goal_list" android:backgroundTint="@color/white" - android:elevation="4dp"> + android:elevation="2dp"> Date: Thu, 12 Jan 2023 16:57:31 +0900 Subject: [PATCH 285/745] =?UTF-8?q?=20[chore]=20#105=20=ED=88=B4=EB=B0=94?= =?UTF-8?q?=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_goal_detail.xml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/res/layout/activity_goal_detail.xml b/app/src/main/res/layout/activity_goal_detail.xml index 19e607e1..5fce3cbd 100644 --- a/app/src/main/res/layout/activity_goal_detail.xml +++ b/app/src/main/res/layout/activity_goal_detail.xml @@ -20,12 +20,9 @@ Date: Thu, 12 Jan 2023 21:07:18 +0900 Subject: [PATCH 286/745] =?UTF-8?q?[mod]=20#106=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20=EB=B2=84=ED=8A=BC=20=ED=85=8D=EC=8A=A4=ED=8A=B8=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 --- .../presentation/onboarding/OnboardingActivity.kt | 11 +++++++++++ app/src/main/res/layout/item_onboarding.xml | 1 + 2 files changed, 12 insertions(+) diff --git a/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt index 583b6967..b55c3cf0 100644 --- a/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt @@ -23,6 +23,7 @@ class OnboardingActivity : initLayout() addListeners() + addObservers() } private fun initLayout() { @@ -50,6 +51,16 @@ class OnboardingActivity : } } + private fun addObservers() { + viewModel.position.observe(this) { + when (it) { + 0 -> binding.btnNext.setText(R.string.onboarding1_button) + 1 -> binding.btnNext.setText(R.string.onboarding2_button) + 2 -> binding.btnNext.setText(R.string.onboarding3_button) + } + } + } + private fun moveToHome() { startActivity(Intent(this, HomeActivity::class.java)) finish() diff --git a/app/src/main/res/layout/item_onboarding.xml b/app/src/main/res/layout/item_onboarding.xml index 62aeebdb..bb54a653 100644 --- a/app/src/main/res/layout/item_onboarding.xml +++ b/app/src/main/res/layout/item_onboarding.xml @@ -17,6 +17,7 @@ android:id="@+id/tv_onboarding_title" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginBottom="@dimen/spacing4" android:text="@{context.getString(item.titleStrRes)}" android:textAppearance="@style/TextAppearance.System3_Bold" app:layout_constraintBottom_toTopOf="@+id/tv_onboarding_des" From 9531fe3cb6bbffd0e779163e9000a505a4384554 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Thu, 12 Jan 2023 21:09:40 +0900 Subject: [PATCH 287/745] =?UTF-8?q?=20[mod]=20#105=20margin=20=EC=82=AC?= =?UTF-8?q?=EC=9D=B4=EC=A6=88=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_onboarding.xml | 2 +- app/src/main/res/layout/layout_my_header.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_onboarding.xml b/app/src/main/res/layout/activity_onboarding.xml index 82fee80d..fed28fc9 100644 --- a/app/src/main/res/layout/activity_onboarding.xml +++ b/app/src/main/res/layout/activity_onboarding.xml @@ -45,7 +45,7 @@ android:id="@+id/vp_view_pager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="56dp" + android:layout_marginTop="32dp" app:layout_constraintBottom_toTopOf="@id/btn_next" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/layout_my_header.xml b/app/src/main/res/layout/layout_my_header.xml index 0578c983..7420b567 100644 --- a/app/src/main/res/layout/layout_my_header.xml +++ b/app/src/main/res/layout/layout_my_header.xml @@ -40,6 +40,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="@dimen/spacing8" + android:layout_marginHorizontal="2dp" android:text="@string/eating_type_more" android:textAppearance="@style/TextAppearance.System5" android:textColor="@color/gray_400" /> From 0feb85bc684093226b6584a9d4a78c816429ceb7 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Thu, 12 Jan 2023 22:04:21 +0900 Subject: [PATCH 288/745] =?UTF-8?q?[mod]=20#93=20=ED=99=88=20=EB=B7=B0=20?= =?UTF-8?q?=EB=A1=9C=ED=8B=B0=20=ED=8C=8C=EC=9D=BC=20=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/raw/home_background.json | 2 +- app/src/main/res/raw/home_snail.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/raw/home_background.json b/app/src/main/res/raw/home_background.json index bc9bdd97..653fba59 100644 --- a/app/src/main/res/raw/home_background.json +++ b/app/src/main/res/raw/home_background.json @@ -1 +1 @@ -{"v":"5.10.1","fr":60,"ip":0,"op":85,"w":360,"h":245,"nm":"homeBackgroundImage_0_and.png 2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[68,71,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[57.485,57.485,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.303,11.303],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-37.349,-10.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"boom_33","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.836121323529,0.836121323529,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"boom_32","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.836121323529,0.836121323529,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"boom_31","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":135,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.836121323529,0.836121323529,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"boom_30","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.836121323529,0.836121323529,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"boom_29","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":225,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.836121323529,0.836121323529,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"boom_28","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":270,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.836121323529,0.836121323529,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"boom_27","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":315,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.836121323529,0.836121323529,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"boom_26","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":360,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.836121323529,0.836121323529,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"round_4","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":62,"s":[39]},{"t":65,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-33.746,-11.708,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,3,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":26,"s":[31.68,31.68,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":65,"s":[292.769,292.769,100]},{"t":76.4,"s":[210.767,210.767,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[27.438,27.438],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":8,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.997341978784,0.892892156863,1,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.281,3.219],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":26,"op":85,"st":26,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"star_3","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":45,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-29.614,65.425,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[137.738,137.738,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-3.5,-55.5],[-3.5,35.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[49]},{"t":33,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[49]},{"t":37,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.835294117647,0.835294117647,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":7,"op":85,"st":7,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[325.5,92.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[78.706,78.706,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.303,11.303],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-37.349,-10.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"boom_25","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"boom_24","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"boom_23","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":135,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"boom_22","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"boom_21","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":225,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"boom_20","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":270,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"boom_19","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":315,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"boom_18","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":360,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"round_3","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":46,"s":[39]},{"t":49,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-33.746,-11.708,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,3,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":10,"s":[31.68,31.68,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":49,"s":[292.769,292.769,100]},{"t":60.4,"s":[210.767,210.767,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[27.438,27.438],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":8,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.997341978784,0.892892156863,1,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.281,3.219],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":82,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"star_2","parent":12,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[100]},{"t":29,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-29.614,65.425,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[137.738,137.738,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-3.5,-55.5],[-3.5,35.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[49]},{"t":28,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[49]},{"t":32,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":-9,"ct":1,"bm":0}],"markers":[]} \ No newline at end of file +{"v":"5.10.1","fr":60,"ip":0,"op":85,"w":360,"h":245,"nm":"homeBackgroundImage_0_and.png 2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[68,61,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[57.485,57.485,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.303,11.303],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-37.349,-10.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"boom_41","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"t":57.4,"s":[100]}],"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[268.185,202.467,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":39.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":55.8,"s":[102.458,102.458,100]},{"t":74.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42.2,"s":[0]},{"t":73.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40.6,"s":[0]},{"t":71.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":39,"op":92,"st":39,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"boom_40","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"t":57.4,"s":[100]}],"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[268.185,202.467,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":39.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":55.8,"s":[102.458,102.458,100]},{"t":74.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42.2,"s":[0]},{"t":73.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40.6,"s":[0]},{"t":71.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":39,"op":92,"st":39,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"boom_39","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"t":57.4,"s":[100]}],"ix":11},"r":{"a":0,"k":135,"ix":10},"p":{"a":0,"k":[268.185,202.467,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":39.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":55.8,"s":[102.458,102.458,100]},{"t":74.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42.2,"s":[0]},{"t":73.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40.6,"s":[0]},{"t":71.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":39,"op":92,"st":39,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"boom_38","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"t":57.4,"s":[100]}],"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[268.185,202.467,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":39.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":55.8,"s":[102.458,102.458,100]},{"t":74.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42.2,"s":[0]},{"t":73.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40.6,"s":[0]},{"t":71.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":39,"op":92,"st":39,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"boom_37","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"t":57.4,"s":[100]}],"ix":11},"r":{"a":0,"k":225,"ix":10},"p":{"a":0,"k":[268.185,202.467,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":39.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":55.8,"s":[102.458,102.458,100]},{"t":74.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42.2,"s":[0]},{"t":73.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40.6,"s":[0]},{"t":71.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":39,"op":92,"st":39,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"boom_36","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"t":57.4,"s":[100]}],"ix":11},"r":{"a":0,"k":270,"ix":10},"p":{"a":0,"k":[268.185,202.467,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":39.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":55.8,"s":[102.458,102.458,100]},{"t":74.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42.2,"s":[0]},{"t":73.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40.6,"s":[0]},{"t":71.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":39,"op":92,"st":39,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"boom_35","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"t":57.4,"s":[100]}],"ix":11},"r":{"a":0,"k":315,"ix":10},"p":{"a":0,"k":[268.185,202.467,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":39.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":55.8,"s":[102.458,102.458,100]},{"t":74.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42.2,"s":[0]},{"t":73.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40.6,"s":[0]},{"t":71.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":39,"op":92,"st":39,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"boom_34","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"t":57.4,"s":[100]}],"ix":11},"r":{"a":0,"k":360,"ix":10},"p":{"a":0,"k":[268.185,202.467,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":39.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":55.8,"s":[102.458,102.458,100]},{"t":74.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42.2,"s":[0]},{"t":73.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40.6,"s":[0]},{"t":71.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":39,"op":92,"st":39,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"round_5","parent":1,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":63,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":69,"s":[39]},{"t":72,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[268.939,202.259,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,3,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":33,"s":[31.68,31.68,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":72,"s":[292.769,292.769,100]},{"t":83.4,"s":[210.767,210.767,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[27.438,27.438],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":40,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":54,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.281,3.219],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":33,"op":92,"st":33,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"star_4","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[100]},{"t":52,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[273.072,279.393,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[137.738,137.738,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-3.5,-55.5],[-3.5,35.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[49]},{"t":40,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[49]},{"t":44,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":14,"op":92,"st":14,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[68,61,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[57.485,57.485,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.303,11.303],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-37.349,-10.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"boom_33","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"boom_32","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"boom_31","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":135,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"boom_30","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"boom_29","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":225,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"boom_28","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":270,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"boom_27","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":315,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"boom_26","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"t":50.4,"s":[100]}],"ix":11},"r":{"a":0,"k":360,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48.8,"s":[102.458,102.458,100]},{"t":67.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.2,"s":[0]},{"t":66.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.6,"s":[0]},{"t":64.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":32,"op":85,"st":32,"ct":1,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"round_4","parent":12,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":56,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":62,"s":[39]},{"t":65,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-33.746,-11.708,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,3,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":26,"s":[31.68,31.68,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":65,"s":[292.769,292.769,100]},{"t":76.4,"s":[210.767,210.767,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[27.438,27.438],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":40,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":64,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.281,3.219],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":26,"op":85,"st":26,"ct":1,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"star_3","parent":12,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":45,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-29.614,65.425,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[137.738,137.738,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-3.5,-55.5],[-3.5,35.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[49]},{"t":33,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[49]},{"t":37,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":7,"op":85,"st":7,"ct":1,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[325.5,82.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[78.706,78.706,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.303,11.303],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-37.349,-10.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"boom_25","parent":23,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"boom_24","parent":23,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"boom_23","parent":23,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":135,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":"boom_22","parent":23,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"boom_21","parent":23,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":225,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":"boom_20","parent":23,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":270,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"boom_19","parent":23,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":315,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":"boom_18","parent":23,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":34.4,"s":[100]}],"ix":11},"r":{"a":0,"k":360,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":16.8,"s":[67.503,67.503,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32.8,"s":[102.458,102.458,100]},{"t":51.2,"s":[136.89,136.89,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19.2,"s":[0]},{"t":50.4,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17.6,"s":[0]},{"t":48.8,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":16,"op":85,"st":16,"ct":1,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":"round_3","parent":23,"sr":0.8,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[98]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":23,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":46,"s":[39]},{"t":49,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-33.746,-11.708,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,3,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":10,"s":[31.68,31.68,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":49,"s":[292.769,292.769,100]},{"t":60.4,"s":[210.767,210.767,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[27.438,27.438],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":54,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":52,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.281,3.219],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":82,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":"star_2","parent":23,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[100]},{"t":29,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-29.614,65.425,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[137.738,137.738,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-3.5,-55.5],[-3.5,35.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[49]},{"t":28,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[49]},{"t":32,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":-9,"ct":1,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/res/raw/home_snail.json b/app/src/main/res/raw/home_snail.json index 30e52434..ca274807 100644 --- a/app/src/main/res/raw/home_snail.json +++ b/app/src/main/res/raw/home_snail.json @@ -1 +1 @@ - {"v":"5.10.1","fr":60,"ip":0,"op":85,"w":140,"h":140,"nm":"snail_orange_cheer 2","ddd":0,"assets":[{"id":"comp_0","nm":"snail_orange_cheer","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":0.9,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129,52.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[72.602,72.602,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.303,11.303],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":0,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-37.349,-10.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"boom_17","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"boom_16","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"boom_15","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":135,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"boom_14","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"boom_13","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":225,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"boom_12","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":270,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"boom_11","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":315,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"boom_10","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":360,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"round_2","sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60.5,"s":[100]},{"t":64.1,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[104.5,44.5,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,3,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20,"s":[23,23,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":64.1,"s":[167.904,167.904,100]},{"t":76.7,"s":[153.02,153.02,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[27.438,27.438],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":8,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.997341978784,0.892892156863,1,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.281,3.219],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":85,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":3,"nm":"▽ Group","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75.265,75,0],"ix":2,"l":2},"a":{"a":0,"k":[74.583,62.727,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"particle_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.755,35.363,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.776,-1.894],[0,0],[0,0],[0,0],[-2.403,-0.439],[0,0],[0,0]],"o":[[-2.507,-0.669],[0,0],[0,0],[0,0],[1.637,-1.804],[0,0],[0,0],[0,0]],"v":[[3.827,1.705],[-3.131,3.697],[-3.131,3.69],[-4.44,-0.97],[-4.064,-1.381],[2.427,-3.582],[3.159,-3.449],[4.44,1.865]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.709803938866,0.674509823322,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"particle_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[21.158,62.503,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.591,0.084],[0,0],[0,0],[0,0],[1.386,2.006],[0,0],[0,0]],"o":[[1.302,2.243],[0,0],[0,0],[0,0],[-2.438,0.118],[0,0],[0,0],[0,0]],"v":[[-1.581,-3.608],[4.743,-0.098],[4.75,-0.098],[2.382,4.122],[1.825,4.15],[-4.325,1.114],[-4.75,0.501],[-1.901,-4.159]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.709803938866,0.674509823322,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"particle_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.931,64.461,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.591,0.084],[0,0],[0,0],[0,0],[1.386,2.006],[0,0],[0,0]],"o":[[1.302,2.243],[0,0],[0,0],[0,0],[-2.438,0.118],[0,0],[0,0],[0,0]],"v":[[-1.581,-3.608],[4.743,-0.098],[4.75,-0.098],[2.382,4.122],[1.825,4.15],[-4.325,1.114],[-4.75,0.501],[-1.901,-4.159]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.596078455448,0.549019634724,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"particle_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.15,31.677,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-3.211,-0.104],[0,0],[0,0],[0,0],[1.546,2.591],[0,0],[0,0]],"o":[[1.428,2.876],[0,0],[0,0],[0,0],[-3.023,-0.049],[0,0],[0,0],[0,0]],"v":[[-1.647,-4.583],[5.882,0.265],[5.889,0.272],[2.622,5.286],[1.933,5.272],[-5.415,1.031],[-5.889,0.244],[-1.995,-5.286]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.596078455448,0.549019634724,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"particle_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50.642,43.465,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.104,3.211],[0,0],[0,0],[0,0],[2.486,-1.713],[0,0],[0,0]],"o":[[2.779,-1.609],[0,0],[0,0],[0,0],[0.146,3.016],[0,0],[0,0],[0,0]],"v":[[-4.459,1.954],[-0.113,-5.875],[-0.127,-5.875],[5.097,-2.943],[5.131,-2.253],[1.377,5.352],[0.625,5.875],[-5.142,2.351]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.807843148708,0.505882382393,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"particle_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[68.784,15.37,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.11,0.878],[0,0],[0,0],[0,0],[1.769,1.219],[0,0],[0,0]],"o":[[1.776,1.442],[0,0],[0,0],[0,0],[-1.964,0.857],[0,0],[0,0],[0,0]],"v":[[-2.493,-2.742],[3.81,-1.829],[3.81,-1.822],[3.183,2.384],[2.73,2.579],[-3.273,2.001],[-3.81,1.632],[-2.925,-3.097]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.784313738346,0.337254911661,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"cheer_2","parent":28,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-7.302,-4.357,0],"ix":2,"l":2},"a":{"a":0,"k":[10,-10,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.089,0.146],[-1.254,-1.86],[0,0],[0.536,-2.187],[-1.073,-1.295],[-0.369,-0.077],[0,0],[0.634,1.414],[0.049,0.334],[0,0],[0,0],[0,0],[-0.501,2.124],[-0.286,0.627],[0,0],[0.404,-3.106],[-0.021,-0.467],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.358,1.553],[-0.592,0.954],[2.814,-0.174],[0.279,0.021],[0,0],[-1.915,0.926],[-0.696,0.759],[1.24,1.811],[0.118,0.32],[0,0],[-1.79,0.237]],"o":[[2.25,-0.153],[0,0],[1.901,2.821],[-0.759,3.092],[0.362,0.432],[0,0],[-0.474,-0.209],[-0.188,-0.418],[0,0],[0,0],[0,0],[-0.23,-1.198],[0.202,-0.857],[0,0],[-1.08,0.989],[-0.063,0.529],[0,0],[0,0],[0,0],[0,0],[0,0],[1.17,-0.857],[0.961,-1.093],[-1.024,1.114],[-0.299,0.021],[0,0],[1.045,-0.063],[1.839,-0.891],[-0.55,-0.014],[-0.153,-0.223],[0,0],[1.066,0.383],[2.591,-0.348]],"v":[[5.417,-13.3],[11.393,-10.264],[11.407,-10.257],[11.804,-1.314],[10.71,5.303],[11.957,5.992],[9.366,10.652],[6.991,8.374],[6.664,7.232],[5.619,7.901],[6.19,11.188],[1.558,12.449],[1.649,7.288],[2.408,5.059],[1.823,5.595],[-1.638,11.815],[-1.701,13.312],[-6.681,12.268],[-4.027,6.459],[-4.94,5.86],[-8.701,10.38],[-12.009,6.334],[-8.102,2.754],[-5.789,-0.367],[-11.668,2.788],[-12.531,2.788],[-11.709,-3.173],[-7.008,-4.392],[-3.247,-7.192],[-7.551,-9.107],[-7.969,-9.915],[-4.313,-12.005],[0.089,-11.475]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.588235318661,0.498039245605,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"cheer_1","parent":29,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-8.562,-5.959,0],"ix":2,"l":2},"a":{"a":0,"k":[6,-10,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.839,0.383],[-1.344,-1.497],[0,0],[0.209,-2.013],[-1.114,-1.017],[-0.334,-0.028],[0,0],[0.738,1.184],[0.084,0.293],[0,0],[0,0],[0,0],[-0.181,1.95],[-0.174,0.592],[0,0],[-0.028,-2.814],[-0.077,-0.418],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.017,1.553],[-0.411,0.926],[2.479,-0.501],[0.258,-0.021],[0,0],[-1.588,1.059],[-0.522,0.759],[1.323,1.456],[0.146,0.272],[0,0],[-1.56,0.432]],"o":[[1.985,-0.418],[0,0],[2.034,2.271],[-0.293,2.842],[0.376,0.341],[0,0],[-0.453,-0.132],[-0.216,-0.348],[0,0],[0,0],[0,0],[-0.348,-1.038],[0.07,-0.787],[0,0],[-0.836,1.017],[0,0.474],[0,0],[0,0],[0,0],[0,0],[0,0],[0.933,-0.905],[0.717,-1.093],[-0.766,1.114],[-0.265,0.049],[0,0],[0.926,-0.181],[1.518,-1.017],[-0.488,0.056],[-0.16,-0.174],[0,0],[0.989,0.216],[2.264,-0.634]],"v":[[2.894,-12.216],[8.584,-10.259],[8.591,-10.252],[10.047,-2.354],[9.893,3.663],[11.084,4.123],[9.357,8.587],[6.961,6.853],[6.529,5.878],[5.687,6.602],[6.599,9.451],[2.636,11.144],[2.079,6.547],[2.476,4.471],[2.023,5.021],[-0.282,10.983],[-0.157,12.321],[-4.712,12.007],[-3.068,6.519],[-3.953,6.094],[-6.738,10.579],[-10.179,7.396],[-7.149,3.733],[-5.478,0.668],[-10.311,4.2],[-11.084,4.304],[-11.084,-1.101],[-7.052,-2.765],[-4.057,-5.718],[-8.117,-6.888],[-8.584,-7.55],[-5.596,-9.862],[-1.619,-9.932]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.588235318661,0.498039245605,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":21,"ty":3,"nm":"▽ Group 2","parent":11,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[84.106,69.501,0],"ix":2,"l":2},"a":{"a":0,"k":[65.06,55.953,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"eye_2","parent":30,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-29.964,-15.717,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[{"i":[[1.351,0.55],[-0.23,0.564],[0,0],[-1.351,-0.55],[0.299,-0.738]],"o":[[-1.351,-0.55],[0,0],[0.286,-0.703],[1.351,0.55],[-0.418,1.024]],"v":[[-0.364,0.835],[-2.454,-1.025],[-2.454,-1.032],[0.346,-1.06],[2.436,0.96]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[1.218,0.741],[-0.212,0.519],[0,0],[-1.237,-0.522],[0.277,-0.679]],"o":[[-1.147,-0.698],[0,0],[0.552,-1.309],[1.455,0.615],[-0.385,0.942]],"v":[[-1.412,2.024],[-2.472,-0.723],[-2.472,-0.729],[0.91,-2.078],[2.027,1.104]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[1.218,0.741],[-0.212,0.519],[0,0],[-1.237,-0.522],[0.277,-0.679]],"o":[[-1.147,-0.698],[0,0],[0.552,-1.309],[1.455,0.615],[-0.385,0.942]],"v":[[-1.412,2.024],[-2.472,-0.723],[-2.472,-0.729],[0.91,-2.078],[2.027,1.104]],"c":true}]},{"t":48,"s":[{"i":[[1.351,0.55],[-0.23,0.564],[0,0],[-1.351,-0.55],[0.299,-0.738]],"o":[[-1.351,-0.55],[0,0],[0.286,-0.703],[1.351,0.55],[-0.418,1.024]],"v":[[-0.364,0.835],[-2.454,-1.025],[-2.454,-1.032],[0.346,-1.06],[2.436,0.96]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921574354,0.372549027205,0.368627458811,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"eye_1","parent":30,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-47.734,-15.612,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[{"i":[[-1.198,0.488],[0.202,0.501],[0,0],[1.198,-0.495],[-0.265,-0.655]],"o":[[1.198,-0.488],[0,0],[-0.251,-0.62],[-1.198,0.495],[0.369,0.912]],"v":[[0.321,0.743],[2.181,-0.914],[2.181,-0.921],[-0.305,-0.942],[-2.165,0.855]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[-1.564,0.58],[0.361,0.886],[0,0],[1.785,-0.836],[-0.265,-0.655]],"o":[[1.408,-0.522],[0,0],[-0.327,-0.732],[-1.174,0.55],[0.369,0.912]],"v":[[1.134,2.118],[2.181,-0.914],[2.181,-0.921],[-1.118,-1.817],[-2.165,0.855]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[-1.564,0.58],[0.361,0.886],[0,0],[1.785,-0.836],[-0.265,-0.655]],"o":[[1.408,-0.522],[0,0],[-0.327,-0.732],[-1.174,0.55],[0.369,0.912]],"v":[[1.134,2.118],[2.181,-0.914],[2.181,-0.921],[-1.118,-1.817],[-2.165,0.855]],"c":true}]},{"t":48,"s":[{"i":[[-1.198,0.488],[0.202,0.501],[0,0],[1.198,-0.495],[-0.265,-0.655]],"o":[[1.198,-0.488],[0,0],[-0.251,-0.62],[-1.198,0.495],[0.369,0.912]],"v":[[0.321,0.743],[2.181,-0.914],[2.181,-0.921],[-0.305,-0.942],[-2.165,0.855]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921574354,0.372549027205,0.368627458811,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"Vector","parent":30,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-21.365,-10.39,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.043,0],[0,1.9],[3.043,0],[0,-1.9]],"o":[[3.043,0],[0,-1.9],[-3.043,0],[0,1.9]],"v":[[0,3.441],[5.509,0],[0,-3.441],[-5.509,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.666666686535,0.57647061348,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"Vector","parent":30,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-52.699,-10.822,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.7,0],[0,1.281],[1.7,0],[0,-1.281]],"o":[[1.7,0],[0,-1.281],[-1.7,0],[0,1.281]],"v":[[0,2.319],[3.078,0],[0,-2.319],[-3.078,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.666666686535,0.57647061348,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":"Vector","parent":30,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-38.031,-7.883,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.481,2.382],[0.425,0],[0,0],[-0.084,-0.411],[-3.106,0]],"o":[[0.084,-0.411],[0,0],[-0.418,0],[0.481,2.389],[3.106,0]],"v":[[6.171,-1.699],[5.537,-2.507],[-5.537,-2.507],[-6.171,-1.699],[0,2.507]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921574354,0.372549027205,0.368627458811,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"hand_2","parent":21,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[6]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[-3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[6]},{"t":65,"s":[-3]}],"ix":10},"p":{"a":0,"k":[56.935,71.222,0],"ix":2,"l":2},"a":{"a":0,"k":[7,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[2.466,1.609],[0.738,-1.282],[-0.752,-1.08],[-4.437,-1.811],[0,0]],"o":[[0,0],[-2.793,0],[-1.128,-0.738],[-0.669,1.163],[3.044,4.367],[0,0],[0,0]],"v":[[5.305,-4.71],[5.124,-4.71],[-2.879,-7.155],[-6.138,-6.2],[-5.992,-2.391],[5.444,7.047],[6.601,7.52]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":7,"k":{"a":0,"k":[0.089,0.98,0.902,0.792,0.25,0.98,0.896,0.78,0.411,0.98,0.89,0.769,0.636,0.98,0.842,0.741,0.86,0.98,0.794,0.714,0.93,0.99,0.804,0.711,1,1,0.813,0.708,0.089,0,0.25,0.11,0.411,0.22,0.636,0.525,0.86,0.83,0.93,0.915,1,1],"ix":9}},"s":{"a":0,"k":[6.601,-0.002],"ix":5},"e":{"a":0,"k":[-6.598,-0.002],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":"hand_1","parent":21,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[-5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[10]},{"t":65,"s":[-3]}],"ix":10},"p":{"a":0,"k":[13.601,73.702,0],"ix":2,"l":2},"a":{"a":0,"k":[7,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[2.466,1.609],[0.738,-1.282],[-0.752,-1.08],[-4.437,-1.811],[0,0]],"o":[[0,0],[-2.793,0],[-1.128,-0.738],[-0.669,1.163],[3.044,4.367],[0,0],[0,0]],"v":[[5.305,-4.71],[5.124,-4.71],[-2.879,-7.155],[-6.138,-6.2],[-5.992,-2.391],[5.444,7.047],[6.601,7.52]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.98,0.902,0.792,0.096,0.982,0.894,0.794,0.193,0.984,0.886,0.796,0.596,0.992,0.874,0.79,1,1,0.861,0.783,0,0,0.096,0.5,0.193,1,0.596,1,1,1],"ix":9}},"s":{"a":0,"k":[6.608,-0.002],"ix":5},"e":{"a":0,"k":[-6.591,-0.002],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"body","parent":21,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[64.278,65.132,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":14,"s":[98,104,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":27,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":40,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":54,"s":[98,104,100]},{"t":67,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.682,0.501],[4.611,2.584],[0,0],[1.616,12.739],[0,0],[0,6.38],[-5.3,4.297],[0.299,1.351],[0,0],[-1.658,1.191],[-1.867,-1.637],[-5.349,-0.898],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.462,3.462],[0,0],[-0.258,-3.58],[0.348,-2.013],[0,0],[-0.425,-1.685],[-0.146,-0.641],[-1.344,-3.594],[-0.341,-2.863],[-9.827,-1.867],[-1.003,-0.195],[-4.054,-3.51],[0,0],[0.947,-2.835],[3.099,0.313],[0,0],[13.714,-3.204]],"o":[[-5.279,-0.348],[0,0],[-10.134,-7.877],[0,0],[-5.091,-4.269],[0,-6.38],[0.209,-1.358],[0,0],[-0.348,-2.013],[2.013,-1.449],[4.081,3.58],[0,0],[0,0],[0.007,0],[0,0],[0,0],[4.827,-0.815],[0,0],[1.651,-1.651],[0.348,1.574],[0,0],[-0.376,1.692],[0.153,0.641],[1.226,2.709],[1.017,2.695],[1.156,9.73],[1.045,0.195],[5.265,1.038],[0,0],[2.479,1.672],[-0.989,2.953],[0,0],[-14.02,-1.414],[-4.464,1.045]],"v":[[-25.794,46.575],[-40.81,42.089],[-40.824,42.089],[-57.191,7.836],[-53.974,11.549],[-57.972,-1.434],[-51.007,-29.112],[-51.132,-33.207],[-52.107,-38.883],[-49.962,-44.121],[-43.332,-43.801],[-28.907,-36.947],[-27.055,-36.627],[-27.062,-36.627],[-27.048,-36.634],[-27.055,-36.634],[-23.524,-37.226],[-10.785,-43.794],[-8.612,-45.967],[-1.682,-43.181],[-2.002,-38.883],[-2.977,-33.207],[-2.908,-28.074],[-2.462,-26.159],[1.215,-17.961],[3.145,-9.569],[21.218,10.135],[24.29,10.72],[38.512,17.657],[55.13,32.046],[57.728,39.672],[50.742,44.193],[37.432,42.848],[-4.454,45.551]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0.969,0.89,0.5,0.99,0.926,0.841,1,0.98,0.883,0.792],"ix":9}},"s":{"a":0,"k":[-20.951,4.441],"ix":5},"e":{"a":0,"k":[28.254,4.441],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.111,0.705],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":"back_4","parent":33,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-12.935,24.072,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.31,-10.935],[-22.656,-11.896],[0,0],[-6.31,10.935],[22.155,12.794]],"o":[[-6.31,10.935],[0,0],[6.624,3.482],[6.31,-10.935],[-22.155,-12.794]],"v":[[-40.098,-21.891],[-11.41,21.068],[-11.41,21.068],[40.136,24.432],[11.448,-18.527]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":11,"k":{"a":0,"k":[0,0.937,0.565,0.439,0.045,0.912,0.524,0.418,0.09,0.886,0.482,0.396,0.14,0.869,0.449,0.378,0.19,0.851,0.416,0.361,0.255,0.837,0.392,0.349,0.32,0.824,0.369,0.337,0.41,0.816,0.355,0.329,0.5,0.808,0.341,0.322,0.75,0.806,0.339,0.322,1,0.804,0.337,0.322],"ix":9}},"s":{"a":0,"k":[-15.647,-0.018],"ix":5},"e":{"a":0,"k":[70.134,-5.084],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":"back_3","parent":33,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[3.096,-2.073,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.074,3.455],[-15.88,-9.173],[0,0],[-4.827,-16.597],[2.528,-4.019],[0.536,-0.85],[20.219,11.673],[15.664,-2.082],[-0.369,0.592]],"o":[[14.793,-1.024],[0,0],[19.606,11.318],[-1.351,4.325],[-0.578,0.912],[-4.423,-17.092],[-17.301,-9.988],[0.355,-0.564],[2.995,-4.764]],"v":[[-36.906,-35.89],[10.733,-23.841],[10.747,-23.841],[48.691,20.831],[42.889,33.403],[41.218,36.049],[2.849,-10.169],[-48.691,-21.828],[-47.604,-23.555]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.937,0.565,0.439,0.285,0.927,0.451,0.38,0.57,0.918,0.337,0.322,0.785,0.927,0.451,0.38,1,0.937,0.565,0.439],"ix":9}},"s":{"a":0,"k":[-48.698,0],"ix":5},"e":{"a":0,"k":[48.67,0],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":"back_2","parent":21,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":54,"s":[-4]},{"t":67,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[70.93,52.773,0],"to":[0.583,-0.5,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[74.43,49.773,0],"to":[0,0,0],"ti":[0.583,-0.5,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[70.93,52.773,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[70.93,52.773,0],"to":[0.583,-0.333,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54,"s":[74.43,50.773,0],"to":[0,0,0],"ti":[0.583,-0.333,0]},{"t":67,"s":[70.93,52.773,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-50.251,-31.961],[-15.727,24.983],[0,0],[24.983,15.727],[15.727,-24.983]],"o":[[40.793,25.944],[0,0],[15.733,-24.99],[-24.99,-15.733],[-15.727,24.99]],"v":[[-11.37,31.705],[45.971,31.329],[45.964,31.329],[29.207,-42.393],[-44.516,-25.636]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":7,"k":{"a":0,"k":[0,0.937,0.784,0.718,0.182,0.937,0.62,0.558,0.365,0.937,0.455,0.399,0.477,0.937,0.434,0.378,0.589,0.937,0.412,0.357,0.784,0.937,0.547,0.457,0.98,0.937,0.682,0.557],"ix":9}},"s":{"a":0,"k":[-54.19,0.002],"ix":5},"e":{"a":0,"k":[54.189,0.002],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":34,"ty":4,"nm":"back_1","parent":33,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[30.365,-36.361,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.885,-0.773],[0,0],[0,0],[0,0],[0,0],[0.808,1.644],[13.045,2.02]],"o":[[0,0],[0,0],[0,0],[0,0],[1.316,-1.282],[-5.356,-12.063],[-1.163,-0.181]],"v":[[-13.242,-14.432],[-18.577,-9.779],[-18.584,-9.772],[11.093,15.413],[17.305,9.367],[18.148,4.471],[-10.01,-15.365]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":7,"k":{"a":0,"k":[0,0.937,0.784,0.718,0.182,0.937,0.62,0.558,0.365,0.937,0.455,0.399,0.477,0.937,0.434,0.378,0.589,0.937,0.412,0.357,0.784,0.937,0.547,0.457,0.98,0.937,0.682,0.557],"ix":9}},"s":{"a":0,"k":[-18.584,0.001],"ix":5},"e":{"a":0,"k":[18.584,0.001],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":35,"ty":4,"nm":"boom_9","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":360,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":36,"ty":4,"nm":"boom_8","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":315,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":37,"ty":4,"nm":"boom_7","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":270,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":38,"ty":4,"nm":"boom_6","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":225,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":39,"ty":4,"nm":"boom_5","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":40,"ty":4,"nm":"boom_4","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":135,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":41,"ty":4,"nm":"boom_3","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":42,"ty":4,"nm":"boom_2","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":43,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.303,11.303],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":0,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-37.349,-10.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":44,"ty":4,"nm":"round_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[100]},{"t":41,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[41,64.5,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,3,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[23,23,100]},{"t":41,"s":[227.439,227.439,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[27.438,27.438],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":8,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.997341978784,0.892892156863,1,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.281,3.219],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":45,"ty":4,"nm":"snail_orange_cheer","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[-100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[150,150],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"snail_orange_cheer","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"snail_orange_cheer","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[70,70,0],"ix":2,"l":2},"a":{"a":0,"k":[75,75,0],"ix":1,"l":2},"s":{"a":0,"k":[-94,94,100],"ix":6,"l":2}},"ao":0,"w":150,"h":150,"ip":0,"op":85,"st":0,"bm":0}],"markers":[]} \ No newline at end of file +{"v":"5.10.1","fr":60,"ip":0,"op":85,"w":140,"h":140,"nm":"snail_orange_cheer 2","ddd":0,"assets":[{"id":"comp_0","nm":"snail_orange_cheer","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":0.9,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129,52.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[72.602,72.602,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.303,11.303],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":0,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-37.349,-10.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"boom_17","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"boom_16","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"boom_15","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":135,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"boom_14","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"boom_13","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":225,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"boom_12","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":270,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"boom_11","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":315,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"boom_10","parent":1,"sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.5,"s":[0]},{"t":49.7,"s":[100]}],"ix":11},"r":{"a":0,"k":360,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29.9,"s":[67.5,67.5,100]},{"t":47.9,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.552144667682,1,0.813283823051,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32.6,"s":[0]},{"t":67.7,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[0]},{"t":65.9,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":85,"st":29,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"round_2","sr":0.9,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60.999,"s":[100]},{"t":64.1,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[104.5,44.5,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,3,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20,"s":[23,23,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":64.1,"s":[167.904,167.904,100]},{"t":76.7,"s":[153.02,153.02,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[27.438,27.438],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":28,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.997341978784,0.892892156863,1,1],"ix":4},"o":{"a":0,"k":40,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.281,3.219],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":85,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":3,"nm":"▽ Group","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75.265,75,0],"ix":2,"l":2},"a":{"a":0,"k":[74.583,62.727,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"particle_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[114.755,35.363,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.776,-1.894],[0,0],[0,0],[0,0],[-2.403,-0.439],[0,0],[0,0]],"o":[[-2.507,-0.669],[0,0],[0,0],[0,0],[1.637,-1.804],[0,0],[0,0],[0,0]],"v":[[3.827,1.705],[-3.131,3.697],[-3.131,3.69],[-4.44,-0.97],[-4.064,-1.381],[2.427,-3.582],[3.159,-3.449],[4.44,1.865]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.709803938866,0.674509823322,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"particle_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[21.158,62.503,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.591,0.084],[0,0],[0,0],[0,0],[1.386,2.006],[0,0],[0,0]],"o":[[1.302,2.243],[0,0],[0,0],[0,0],[-2.438,0.118],[0,0],[0,0],[0,0]],"v":[[-1.581,-3.608],[4.743,-0.098],[4.75,-0.098],[2.382,4.122],[1.825,4.15],[-4.325,1.114],[-4.75,0.501],[-1.901,-4.159]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.709803938866,0.674509823322,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"particle_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.931,64.461,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.591,0.084],[0,0],[0,0],[0,0],[1.386,2.006],[0,0],[0,0]],"o":[[1.302,2.243],[0,0],[0,0],[0,0],[-2.438,0.118],[0,0],[0,0],[0,0]],"v":[[-1.581,-3.608],[4.743,-0.098],[4.75,-0.098],[2.382,4.122],[1.825,4.15],[-4.325,1.114],[-4.75,0.501],[-1.901,-4.159]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.596078455448,0.549019634724,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"particle_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[24.15,31.677,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-3.211,-0.104],[0,0],[0,0],[0,0],[1.546,2.591],[0,0],[0,0]],"o":[[1.428,2.876],[0,0],[0,0],[0,0],[-3.023,-0.049],[0,0],[0,0],[0,0]],"v":[[-1.647,-4.583],[5.882,0.265],[5.889,0.272],[2.622,5.286],[1.933,5.272],[-5.415,1.031],[-5.889,0.244],[-1.995,-5.286]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.596078455448,0.549019634724,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"particle_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50.642,43.465,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.104,3.211],[0,0],[0,0],[0,0],[2.486,-1.713],[0,0],[0,0]],"o":[[2.779,-1.609],[0,0],[0,0],[0,0],[0.146,3.016],[0,0],[0,0],[0,0]],"v":[[-4.459,1.954],[-0.113,-5.875],[-0.127,-5.875],[5.097,-2.943],[5.131,-2.253],[1.377,5.352],[0.625,5.875],[-5.142,2.351]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.807843148708,0.505882382393,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"particle_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[68.784,15.37,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.11,0.878],[0,0],[0,0],[0,0],[1.769,1.219],[0,0],[0,0]],"o":[[1.776,1.442],[0,0],[0,0],[0,0],[-1.964,0.857],[0,0],[0,0],[0,0]],"v":[[-2.493,-2.742],[3.81,-1.829],[3.81,-1.822],[3.183,2.384],[2.73,2.579],[-3.273,2.001],[-3.81,1.632],[-2.925,-3.097]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.784313738346,0.337254911661,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"cheer_2","parent":28,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-7.302,-4.357,0],"ix":2,"l":2},"a":{"a":0,"k":[10,-10,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.089,0.146],[-1.254,-1.86],[0,0],[0.536,-2.187],[-1.073,-1.295],[-0.369,-0.077],[0,0],[0.634,1.414],[0.049,0.334],[0,0],[0,0],[0,0],[-0.501,2.124],[-0.286,0.627],[0,0],[0.404,-3.106],[-0.021,-0.467],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.358,1.553],[-0.592,0.954],[2.814,-0.174],[0.279,0.021],[0,0],[-1.915,0.926],[-0.696,0.759],[1.24,1.811],[0.118,0.32],[0,0],[-1.79,0.237]],"o":[[2.25,-0.153],[0,0],[1.901,2.821],[-0.759,3.092],[0.362,0.432],[0,0],[-0.474,-0.209],[-0.188,-0.418],[0,0],[0,0],[0,0],[-0.23,-1.198],[0.202,-0.857],[0,0],[-1.08,0.989],[-0.063,0.529],[0,0],[0,0],[0,0],[0,0],[0,0],[1.17,-0.857],[0.961,-1.093],[-1.024,1.114],[-0.299,0.021],[0,0],[1.045,-0.063],[1.839,-0.891],[-0.55,-0.014],[-0.153,-0.223],[0,0],[1.066,0.383],[2.591,-0.348]],"v":[[5.417,-13.3],[11.393,-10.264],[11.407,-10.257],[11.804,-1.314],[10.71,5.303],[11.957,5.992],[9.366,10.652],[6.991,8.374],[6.664,7.232],[5.619,7.901],[6.19,11.188],[1.558,12.449],[1.649,7.288],[2.408,5.059],[1.823,5.595],[-1.638,11.815],[-1.701,13.312],[-6.681,12.268],[-4.027,6.459],[-4.94,5.86],[-8.701,10.38],[-12.009,6.334],[-8.102,2.754],[-5.789,-0.367],[-11.668,2.788],[-12.531,2.788],[-11.709,-3.173],[-7.008,-4.392],[-3.247,-7.192],[-7.551,-9.107],[-7.969,-9.915],[-4.313,-12.005],[0.089,-11.475]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.588235318661,0.498039245605,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"cheer_1","parent":29,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-8.562,-5.959,0],"ix":2,"l":2},"a":{"a":0,"k":[6,-10,0],"ix":1,"l":2},"s":{"a":0,"k":[90,90,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.839,0.383],[-1.344,-1.497],[0,0],[0.209,-2.013],[-1.114,-1.017],[-0.334,-0.028],[0,0],[0.738,1.184],[0.084,0.293],[0,0],[0,0],[0,0],[-0.181,1.95],[-0.174,0.592],[0,0],[-0.028,-2.814],[-0.077,-0.418],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.017,1.553],[-0.411,0.926],[2.479,-0.501],[0.258,-0.021],[0,0],[-1.588,1.059],[-0.522,0.759],[1.323,1.456],[0.146,0.272],[0,0],[-1.56,0.432]],"o":[[1.985,-0.418],[0,0],[2.034,2.271],[-0.293,2.842],[0.376,0.341],[0,0],[-0.453,-0.132],[-0.216,-0.348],[0,0],[0,0],[0,0],[-0.348,-1.038],[0.07,-0.787],[0,0],[-0.836,1.017],[0,0.474],[0,0],[0,0],[0,0],[0,0],[0,0],[0.933,-0.905],[0.717,-1.093],[-0.766,1.114],[-0.265,0.049],[0,0],[0.926,-0.181],[1.518,-1.017],[-0.488,0.056],[-0.16,-0.174],[0,0],[0.989,0.216],[2.264,-0.634]],"v":[[2.894,-12.216],[8.584,-10.259],[8.591,-10.252],[10.047,-2.354],[9.893,3.663],[11.084,4.123],[9.357,8.587],[6.961,6.853],[6.529,5.878],[5.687,6.602],[6.599,9.451],[2.636,11.144],[2.079,6.547],[2.476,4.471],[2.023,5.021],[-0.282,10.983],[-0.157,12.321],[-4.712,12.007],[-3.068,6.519],[-3.953,6.094],[-6.738,10.579],[-10.179,7.396],[-7.149,3.733],[-5.478,0.668],[-10.311,4.2],[-11.084,4.304],[-11.084,-1.101],[-7.052,-2.765],[-4.057,-5.718],[-8.117,-6.888],[-8.584,-7.55],[-5.596,-9.862],[-1.619,-9.932]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.588235318661,0.498039245605,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":21,"ty":3,"nm":"▽ Group 2","parent":11,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[84.106,69.501,0],"ix":2,"l":2},"a":{"a":0,"k":[65.06,55.953,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"eye_2","parent":30,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-29.964,-15.717,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[{"i":[[1.351,0.55],[-0.23,0.564],[0,0],[-1.351,-0.55],[0.299,-0.738]],"o":[[-1.351,-0.55],[0,0],[0.286,-0.703],[1.351,0.55],[-0.418,1.024]],"v":[[-0.364,0.835],[-2.454,-1.025],[-2.454,-1.032],[0.346,-1.06],[2.436,0.96]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[1.218,0.741],[-0.212,0.519],[0,0],[-1.237,-0.522],[0.277,-0.679]],"o":[[-1.147,-0.698],[0,0],[0.552,-1.309],[1.455,0.615],[-0.385,0.942]],"v":[[-1.412,2.024],[-2.472,-0.723],[-2.472,-0.729],[0.91,-2.078],[2.027,1.104]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[1.218,0.741],[-0.212,0.519],[0,0],[-1.237,-0.522],[0.277,-0.679]],"o":[[-1.147,-0.698],[0,0],[0.552,-1.309],[1.455,0.615],[-0.385,0.942]],"v":[[-1.412,2.024],[-2.472,-0.723],[-2.472,-0.729],[0.91,-2.078],[2.027,1.104]],"c":true}]},{"t":48,"s":[{"i":[[1.351,0.55],[-0.23,0.564],[0,0],[-1.351,-0.55],[0.299,-0.738]],"o":[[-1.351,-0.55],[0,0],[0.286,-0.703],[1.351,0.55],[-0.418,1.024]],"v":[[-0.364,0.835],[-2.454,-1.025],[-2.454,-1.032],[0.346,-1.06],[2.436,0.96]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921574354,0.372549027205,0.368627458811,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"eye_1","parent":30,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-47.734,-15.612,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[{"i":[[-1.198,0.488],[0.202,0.501],[0,0],[1.198,-0.495],[-0.265,-0.655]],"o":[[1.198,-0.488],[0,0],[-0.251,-0.62],[-1.198,0.495],[0.369,0.912]],"v":[[0.321,0.743],[2.181,-0.914],[2.181,-0.921],[-0.305,-0.942],[-2.165,0.855]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[-1.564,0.58],[0.361,0.886],[0,0],[1.785,-0.836],[-0.265,-0.655]],"o":[[1.408,-0.522],[0,0],[-0.327,-0.732],[-1.174,0.55],[0.369,0.912]],"v":[[1.134,2.118],[2.181,-0.914],[2.181,-0.921],[-1.118,-1.817],[-2.165,0.855]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[-1.564,0.58],[0.361,0.886],[0,0],[1.785,-0.836],[-0.265,-0.655]],"o":[[1.408,-0.522],[0,0],[-0.327,-0.732],[-1.174,0.55],[0.369,0.912]],"v":[[1.134,2.118],[2.181,-0.914],[2.181,-0.921],[-1.118,-1.817],[-2.165,0.855]],"c":true}]},{"t":48,"s":[{"i":[[-1.198,0.488],[0.202,0.501],[0,0],[1.198,-0.495],[-0.265,-0.655]],"o":[[1.198,-0.488],[0,0],[-0.251,-0.62],[-1.198,0.495],[0.369,0.912]],"v":[[0.321,0.743],[2.181,-0.914],[2.181,-0.921],[-0.305,-0.942],[-2.165,0.855]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921574354,0.372549027205,0.368627458811,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"Vector","parent":30,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-21.365,-10.39,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.043,0],[0,1.9],[3.043,0],[0,-1.9]],"o":[[3.043,0],[0,-1.9],[-3.043,0],[0,1.9]],"v":[[0,3.441],[5.509,0],[0,-3.441],[-5.509,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.666666686535,0.57647061348,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"Vector","parent":30,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-52.699,-10.822,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.7,0],[0,1.281],[1.7,0],[0,-1.281]],"o":[[1.7,0],[0,-1.281],[-1.7,0],[0,1.281]],"v":[[0,2.319],[3.078,0],[0,-2.319],[-3.078,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.666666686535,0.57647061348,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":"Vector","parent":30,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-38.031,-7.883,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.481,2.382],[0.425,0],[0,0],[-0.084,-0.411],[-3.106,0]],"o":[[0.084,-0.411],[0,0],[-0.418,0],[0.481,2.389],[3.106,0]],"v":[[6.171,-1.699],[5.537,-2.507],[-5.537,-2.507],[-6.171,-1.699],[0,2.507]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921574354,0.372549027205,0.368627458811,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"hand_2","parent":21,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[6]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[-3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[6]},{"t":65,"s":[-3]}],"ix":10},"p":{"a":0,"k":[56.935,71.222,0],"ix":2,"l":2},"a":{"a":0,"k":[7,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[2.466,1.609],[0.738,-1.282],[-0.752,-1.08],[-4.437,-1.811],[0,0]],"o":[[0,0],[-2.793,0],[-1.128,-0.738],[-0.669,1.163],[3.044,4.367],[0,0],[0,0]],"v":[[5.305,-4.71],[5.124,-4.71],[-2.879,-7.155],[-6.138,-6.2],[-5.992,-2.391],[5.444,7.047],[6.601,7.52]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":7,"k":{"a":0,"k":[0.089,0.98,0.902,0.792,0.25,0.98,0.896,0.78,0.411,0.98,0.89,0.769,0.636,0.98,0.842,0.741,0.86,0.98,0.794,0.714,0.93,0.99,0.804,0.711,1,1,0.813,0.708,0.089,0,0.25,0.11,0.411,0.22,0.636,0.525,0.86,0.83,0.93,0.915,1,1],"ix":9}},"s":{"a":0,"k":[6.601,-0.002],"ix":5},"e":{"a":0,"k":[-6.598,-0.002],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":"hand_1","parent":21,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[-5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[10]},{"t":65,"s":[-3]}],"ix":10},"p":{"a":0,"k":[13.601,73.702,0],"ix":2,"l":2},"a":{"a":0,"k":[7,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[2.466,1.609],[0.738,-1.282],[-0.752,-1.08],[-4.437,-1.811],[0,0]],"o":[[0,0],[-2.793,0],[-1.128,-0.738],[-0.669,1.163],[3.044,4.367],[0,0],[0,0]],"v":[[5.305,-4.71],[5.124,-4.71],[-2.879,-7.155],[-6.138,-6.2],[-5.992,-2.391],[5.444,7.047],[6.601,7.52]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.98,0.902,0.792,0.096,0.982,0.894,0.794,0.193,0.984,0.886,0.796,0.596,0.992,0.874,0.79,1,1,0.861,0.783,0,0,0.096,0.5,0.193,1,0.596,1,1,1],"ix":9}},"s":{"a":0,"k":[6.608,-0.002],"ix":5},"e":{"a":0,"k":[-6.591,-0.002],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"body","parent":21,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[64.278,65.132,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":14,"s":[98,104,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":27,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":40,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":54,"s":[98,104,100]},{"t":67,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.682,0.501],[4.611,2.584],[0,0],[1.616,12.739],[0,0],[0,6.38],[-5.3,4.297],[0.299,1.351],[0,0],[-1.658,1.191],[-1.867,-1.637],[-5.349,-0.898],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.462,3.462],[0,0],[-0.258,-3.58],[0.348,-2.013],[0,0],[-0.425,-1.685],[-0.146,-0.641],[-1.344,-3.594],[-0.341,-2.863],[-9.827,-1.867],[-1.003,-0.195],[-4.054,-3.51],[0,0],[0.947,-2.835],[3.099,0.313],[0,0],[13.714,-3.204]],"o":[[-5.279,-0.348],[0,0],[-10.134,-7.877],[0,0],[-5.091,-4.269],[0,-6.38],[0.209,-1.358],[0,0],[-0.348,-2.013],[2.013,-1.449],[4.081,3.58],[0,0],[0,0],[0.007,0],[0,0],[0,0],[4.827,-0.815],[0,0],[1.651,-1.651],[0.348,1.574],[0,0],[-0.376,1.692],[0.153,0.641],[1.226,2.709],[1.017,2.695],[1.156,9.73],[1.045,0.195],[5.265,1.038],[0,0],[2.479,1.672],[-0.989,2.953],[0,0],[-14.02,-1.414],[-4.464,1.045]],"v":[[-25.794,46.575],[-40.81,42.089],[-40.824,42.089],[-57.191,7.836],[-53.974,11.549],[-57.972,-1.434],[-51.007,-29.112],[-51.132,-33.207],[-52.107,-38.883],[-49.962,-44.121],[-43.332,-43.801],[-28.907,-36.947],[-27.055,-36.627],[-27.062,-36.627],[-27.048,-36.634],[-27.055,-36.634],[-23.524,-37.226],[-10.785,-43.794],[-8.612,-45.967],[-1.682,-43.181],[-2.002,-38.883],[-2.977,-33.207],[-2.908,-28.074],[-2.462,-26.159],[1.215,-17.961],[3.145,-9.569],[21.218,10.135],[24.29,10.72],[38.512,17.657],[55.13,32.046],[57.728,39.672],[50.742,44.193],[37.432,42.848],[-4.454,45.551]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0.969,0.89,0.5,0.99,0.926,0.841,1,0.98,0.883,0.792],"ix":9}},"s":{"a":0,"k":[-20.951,4.441],"ix":5},"e":{"a":0,"k":[28.254,4.441],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.111,0.705],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":"back_4","parent":33,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-12.935,24.072,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.31,-10.935],[-22.656,-11.896],[0,0],[-6.31,10.935],[22.155,12.794]],"o":[[-6.31,10.935],[0,0],[6.624,3.482],[6.31,-10.935],[-22.155,-12.794]],"v":[[-40.098,-21.891],[-11.41,21.068],[-11.41,21.068],[40.136,24.432],[11.448,-18.527]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":11,"k":{"a":0,"k":[0,0.937,0.565,0.439,0.045,0.912,0.524,0.418,0.09,0.886,0.482,0.396,0.14,0.869,0.449,0.378,0.19,0.851,0.416,0.361,0.255,0.837,0.392,0.349,0.32,0.824,0.369,0.337,0.41,0.816,0.355,0.329,0.5,0.808,0.341,0.322,0.75,0.806,0.339,0.322,1,0.804,0.337,0.322],"ix":9}},"s":{"a":0,"k":[-15.647,-0.018],"ix":5},"e":{"a":0,"k":[70.134,-5.084],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":"back_3","parent":33,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[3.096,-2.073,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.074,3.455],[-15.88,-9.173],[0,0],[-4.827,-16.597],[2.528,-4.019],[0.536,-0.85],[20.219,11.673],[15.664,-2.082],[-0.369,0.592]],"o":[[14.793,-1.024],[0,0],[19.606,11.318],[-1.351,4.325],[-0.578,0.912],[-4.423,-17.092],[-17.301,-9.988],[0.355,-0.564],[2.995,-4.764]],"v":[[-36.906,-35.89],[10.733,-23.841],[10.747,-23.841],[48.691,20.831],[42.889,33.403],[41.218,36.049],[2.849,-10.169],[-48.691,-21.828],[-47.604,-23.555]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.937,0.565,0.439,0.285,0.927,0.451,0.38,0.57,0.918,0.337,0.322,0.785,0.927,0.451,0.38,1,0.937,0.565,0.439],"ix":9}},"s":{"a":0,"k":[-48.698,0],"ix":5},"e":{"a":0,"k":[48.67,0],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":"back_2","parent":21,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":54,"s":[-4]},{"t":67,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[70.93,52.773,0],"to":[0.583,-0.5,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[74.43,49.773,0],"to":[0,0,0],"ti":[0.583,-0.5,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[70.93,52.773,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[70.93,52.773,0],"to":[0.583,-0.333,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54,"s":[74.43,50.773,0],"to":[0,0,0],"ti":[0.583,-0.333,0]},{"t":67,"s":[70.93,52.773,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-50.251,-31.961],[-15.727,24.983],[0,0],[24.983,15.727],[15.727,-24.983]],"o":[[40.793,25.944],[0,0],[15.733,-24.99],[-24.99,-15.733],[-15.727,24.99]],"v":[[-11.37,31.705],[45.971,31.329],[45.964,31.329],[29.207,-42.393],[-44.516,-25.636]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":7,"k":{"a":0,"k":[0,0.937,0.784,0.718,0.182,0.937,0.62,0.558,0.365,0.937,0.455,0.399,0.477,0.937,0.434,0.378,0.589,0.937,0.412,0.357,0.784,0.937,0.547,0.457,0.98,0.937,0.682,0.557],"ix":9}},"s":{"a":0,"k":[-54.19,0.002],"ix":5},"e":{"a":0,"k":[54.189,0.002],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":34,"ty":4,"nm":"back_1","parent":33,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[30.365,-36.361,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.885,-0.773],[0,0],[0,0],[0,0],[0,0],[0.808,1.644],[13.045,2.02]],"o":[[0,0],[0,0],[0,0],[0,0],[1.316,-1.282],[-5.356,-12.063],[-1.163,-0.181]],"v":[[-13.242,-14.432],[-18.577,-9.779],[-18.584,-9.772],[11.093,15.413],[17.305,9.367],[18.148,4.471],[-10.01,-15.365]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":7,"k":{"a":0,"k":[0,0.937,0.784,0.718,0.182,0.937,0.62,0.558,0.365,0.937,0.455,0.399,0.477,0.937,0.434,0.378,0.589,0.937,0.412,0.357,0.784,0.937,0.547,0.457,0.98,0.937,0.682,0.557],"ix":9}},"s":{"a":0,"k":[-18.584,0.001],"ix":5},"e":{"a":0,"k":[18.584,0.001],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":35,"ty":4,"nm":"boom_9","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":360,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":36,"ty":4,"nm":"boom_8","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":315,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":37,"ty":4,"nm":"boom_7","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":270,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":38,"ty":4,"nm":"boom_6","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":225,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":39,"ty":4,"nm":"boom_5","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":40,"ty":4,"nm":"boom_4","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":135,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":41,"ty":4,"nm":"boom_3","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":42,"ty":4,"nm":"boom_2","parent":43,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[-34.5,-11.5,0],"ix":2,"l":2},"a":{"a":0,"k":[26,-5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[67.5,67.5,100]},{"t":26,"s":[102.455,102.455,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[26,-5],[26,-35]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.862545955882,0.862545955882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.372549019608,0.36862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":48,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":43,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.303,11.303],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937255021638,0.494118006089,0.415686005237,1],"ix":4},"o":{"a":0,"k":0,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-37.349,-10.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":85,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":44,"ty":4,"nm":"round_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[55]},{"t":41,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[41,64.5,0],"ix":2,"l":2},"a":{"a":0,"k":[-2,3,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[23,23,100]},{"t":41,"s":[227.439,227.439,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[27.438,27.438],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":28,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.281,3.219],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":45,"ty":4,"nm":"snail_orange_cheer","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[-100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[150,150],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"snail_orange_cheer","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":85,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"snail_orange_cheer","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[70,70,0],"ix":2,"l":2},"a":{"a":0,"k":[75,75,0],"ix":1,"l":2},"s":{"a":0,"k":[-94,94,100],"ix":6,"l":2}},"ao":0,"w":150,"h":150,"ip":0,"op":85,"st":0,"bm":0}],"markers":[]} \ No newline at end of file From 8c65ebe6d46b1f01d117b1390f355572bf07beda Mon Sep 17 00:00:00 2001 From: youngjinc Date: Thu, 12 Jan 2023 23:07:12 +0900 Subject: [PATCH 289/745] =?UTF-8?q?=20[feat]=20#110=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20=EC=84=B8=EB=B2=88=EC=A7=B8=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EC=97=90=EC=84=9C=20=EB=8B=A4=EC=9D=8C=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=EC=9D=84=20=EB=88=84=EB=A5=B4=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EA=B3=A0=20=EC=95=B1=EC=9D=84=20=EC=9D=B4=ED=83=88=ED=95=9C=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EC=98=A8=EB=B3=B4=EB=94=A9=20=EB=8B=A4?= =?UTF-8?q?=EC=8B=9C=20=EB=9D=84=EC=9A=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/local/KGEDataSource.kt | 5 +++++ .../data/service/KakaoAuthService.kt | 21 +++++++++++++------ .../main/java/org/keepgoeat/di/SignModule.kt | 6 ++++-- .../keepgoeat/presentation/SplashActivity.kt | 16 +++++++++----- .../onboarding/OnboardingActivity.kt | 6 +++++- .../onboarding/OnboardingViewModel.kt | 11 +++++++++- .../presentation/sign/SignActivity.kt | 12 ++++++++--- 7 files changed, 59 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt index 34d0fc41..d0305f3a 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt @@ -45,6 +45,10 @@ class KGEDataSource @Inject constructor(@ApplicationContext context: Context) { set(value) = dataStore.edit { putBoolean(IS_LOGIN, value) } get() = dataStore.getBoolean(IS_LOGIN, false) + var isClickedOnboardingButton: Boolean + set(value) = dataStore.edit { putBoolean(IS_CLICKED_ONBOARDING_BUTTON, value) } + get() = dataStore.getBoolean(IS_CLICKED_ONBOARDING_BUTTON, false) + fun clear() { dataStore.edit { clear() @@ -56,5 +60,6 @@ class KGEDataSource @Inject constructor(@ApplicationContext context: Context) { const val ACCESS_TOKEN = "accessToken" const val IS_LOGIN = "isLogin" const val REFRESH_TOKEN = "refreshToken" + const val IS_CLICKED_ONBOARDING_BUTTON = "isClickedOnboardingButton" } } diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index 1cbf8b9a..266d7f36 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -7,6 +7,8 @@ import dagger.hilt.android.qualifiers.ActivityContext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.domain.repository.AuthRepository import timber.log.Timber @@ -16,11 +18,12 @@ class KakaoAuthService @Inject constructor( @ActivityContext private val context: Context, private val client: UserApiClient, private val authRepository: AuthRepository, + private val localStorage: KGEDataSource, ) { private val isKakaoTalkLoginAvailable: Boolean get() = client.isKakaoTalkLoginAvailable(context) - fun loginKakao(loginListener: (() -> Unit)) { + fun loginKakao(loginListener: ((Boolean, Boolean) -> Unit)) { val callback: (OAuthToken?, Throwable?) -> Unit = { token, error -> if (error != null) handleLoginError(error) else if (token != null) handleLoginSuccess(token, loginListener) @@ -35,13 +38,18 @@ class KakaoAuthService @Inject constructor( Timber.d("${kakaoType}으로 로그인 실패 (${throwable.message})") } - private fun handleLoginSuccess(oAuthToken: OAuthToken, loginListener: (() -> Unit)) { + private fun handleLoginSuccess( + oAuthToken: OAuthToken, + loginListener: ((Boolean, Boolean) -> Unit), + ) { client.me { user, _ -> - CoroutineScope(Dispatchers.IO).launch { - authRepository.login(RequestAuth(oAuthToken.accessToken, PLATFORM_KAKAO)) + CoroutineScope(Dispatchers.Main).launch { + val result = withContext(Dispatchers.IO) { + authRepository.login(RequestAuth(oAuthToken.accessToken, PLATFORM_KAKAO)) + } + Timber.d(oAuthToken.accessToken) + loginListener(result?.type == SIGN_UP, localStorage.isClickedOnboardingButton) } - Timber.d(oAuthToken.accessToken) - loginListener() } } @@ -51,5 +59,6 @@ class KakaoAuthService @Inject constructor( companion object { private const val PLATFORM_KAKAO = "KAKAO" + private const val SIGN_UP = "signup" } } diff --git a/app/src/main/java/org/keepgoeat/di/SignModule.kt b/app/src/main/java/org/keepgoeat/di/SignModule.kt index d9b82314..bedfcbfc 100644 --- a/app/src/main/java/org/keepgoeat/di/SignModule.kt +++ b/app/src/main/java/org/keepgoeat/di/SignModule.kt @@ -8,6 +8,7 @@ import dagger.hilt.InstallIn import dagger.hilt.android.components.ActivityComponent import dagger.hilt.android.qualifiers.ActivityContext import dagger.hilt.android.scopes.ActivityScoped +import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.data.service.KakaoAuthService import org.keepgoeat.domain.repository.AuthRepository @@ -22,6 +23,7 @@ object SignModule { fun provideSignService( @ActivityContext context: Context, client: UserApiClient, - authRepository: AuthRepository - ) = KakaoAuthService(context, client, authRepository) + authRepository: AuthRepository, + localStorage: KGEDataSource, + ) = KakaoAuthService(context, client, authRepository, localStorage) } diff --git a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt index 3892ede9..cb8f2ef0 100644 --- a/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/SplashActivity.kt @@ -11,6 +11,7 @@ import org.keepgoeat.R import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.databinding.ActivitySplashBinding import org.keepgoeat.presentation.home.HomeActivity +import org.keepgoeat.presentation.onboarding.OnboardingActivity import org.keepgoeat.presentation.sign.SignActivity import org.keepgoeat.util.binding.BindingActivity @@ -26,14 +27,19 @@ class SplashActivity : BindingActivity(R.layout.activity_ lifecycleScope.launch { delay(1000L) moveToNext() - finish() } } private fun moveToNext() { - if (KGEDataSource(this).isLogin) - startActivity(Intent(this, HomeActivity::class.java)) - else - startActivity(Intent(this, SignActivity::class.java)) + val storage = KGEDataSource(this) + val nextScreen = + if (storage.isLogin) { + if (storage.isClickedOnboardingButton) HomeActivity::class.java + else OnboardingActivity::class.java + } else { + SignActivity::class.java + } + startActivity(Intent(this, nextScreen)) + finish() } } diff --git a/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt index b55c3cf0..119561e6 100644 --- a/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt @@ -43,10 +43,14 @@ class OnboardingActivity : private fun addListeners() { binding.btnNext.setOnClickListener { - if (binding.vpViewPager.currentItem == 2) moveToHome() + if (binding.vpViewPager.currentItem == 2) { + viewModel.setClickedOnboardingButton() + moveToHome() + } binding.vpViewPager.currentItem++ } binding.tvSkip.setOnClickListener { + viewModel.setClickedOnboardingButton() moveToHome() } } diff --git a/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingViewModel.kt index 077044af..71ff58d8 100644 --- a/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingViewModel.kt @@ -3,8 +3,13 @@ package org.keepgoeat.presentation.onboarding import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import org.keepgoeat.data.datasource.local.KGEDataSource +import javax.inject.Inject -class OnboardingViewModel : ViewModel() { +@HiltViewModel +class OnboardingViewModel @Inject constructor(private val localStorage: KGEDataSource) : + ViewModel() { private val _position: MutableLiveData = MutableLiveData() val position: LiveData get() = _position @@ -12,4 +17,8 @@ class OnboardingViewModel : ViewModel() { fun setPosition(position: Int) { _position.value = position } + + fun setClickedOnboardingButton() { + localStorage.isClickedOnboardingButton = true + } } diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt index c6532d03..631107bb 100644 --- a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt @@ -6,8 +6,10 @@ import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.data.service.KakaoAuthService import org.keepgoeat.databinding.ActivitySignBinding +import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.onboarding.OnboardingActivity import org.keepgoeat.util.binding.BindingActivity +import timber.log.Timber import javax.inject.Inject @AndroidEntryPoint @@ -22,12 +24,16 @@ class SignActivity : BindingActivity(R.layout.activity_sign private fun addListeners() { binding.layoutSignIn.setOnClickListener { - signService.loginKakao(::moveToOnBoarding) + signService.loginKakao(::moveToNext) } } - private fun moveToOnBoarding() { - startActivity(Intent(this, OnboardingActivity::class.java)) + private fun moveToNext(isFirst: Boolean, isClicked: Boolean) { + Timber.d("isFirst : $isFirst !isClicked : ${!isClicked}") + val nextScreen = + if (isFirst && !isClicked) OnboardingActivity::class.java + else HomeActivity::class.java + startActivity(Intent(this, nextScreen)) finish() } } From 88d7981cc13843595d55256edc61809249e8bf9b Mon Sep 17 00:00:00 2001 From: youngjinc Date: Thu, 12 Jan 2023 23:07:27 +0900 Subject: [PATCH 290/745] =?UTF-8?q?=20[chore]=20#110=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt | 1 - .../main/java/org/keepgoeat/domain/repository/AuthRepository.kt | 1 - 2 files changed, 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt index ca3f6f2a..b197d162 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt @@ -14,7 +14,6 @@ class AuthRepositoryImpl @Inject constructor( private val authDataSource: AuthDataSource, private val localStorage: KGEDataSource ) : AuthRepository { - override suspend fun login(requestAuth: RequestAuth): ResponseAuth.ResponseAuthData? { val result = authDataSource.login(requestAuth) return when (result) { diff --git a/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt index 4042e65a..065a2e32 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt @@ -6,6 +6,5 @@ import org.keepgoeat.data.model.response.ResponseRefresh interface AuthRepository { suspend fun login(requestAuth: RequestAuth): ResponseAuth.ResponseAuthData? - suspend fun refresh(): ResponseRefresh.ResponseToken? } From 4b595c396c42712fd0a47bfe648b8475bee23c74 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Thu, 12 Jan 2023 23:08:32 +0900 Subject: [PATCH 291/745] =?UTF-8?q?=20[mod]=20#110=20splashscreen=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EB=B2=84=EC=A0=84=201.0.0-rc01?= =?UTF-8?q?=20->=201.0.0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 20e03a4e..87f62ad5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -100,7 +100,7 @@ dependencies { implementation 'androidx.viewpager2:viewpager2:1.0.0' // Splashscreen - implementation 'androidx.core:core-splashscreen:1.0.0-rc01' + implementation 'androidx.core:core-splashscreen:1.0.0' // Lottie implementation 'com.airbnb.android:lottie:5.2.0' From e9b94f2b1129cf1d85d14c2f48b613d70dde6cdf Mon Sep 17 00:00:00 2001 From: youngjinc Date: Thu, 12 Jan 2023 23:10:53 +0900 Subject: [PATCH 292/745] =?UTF-8?q?=20[chore]=20#110=20manifestPlaceholder?= =?UTF-8?q?s=20>=20KAKAO=5FNATIVE=5FKEY=20=EC=84=A0=EC=96=B8=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=EB=A5=BC=20buildTypes=20=EB=82=B4=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 87f62ad5..d40e7acf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,11 +27,14 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" buildConfigField "String", "KGE_BASE_URL", properties["KGE_BASE_URL"] buildConfigField "String", "KAKAO_NATIVE_KEY", properties["KAKAO_NATIVE_KEY"] - manifestPlaceholders["KAKAO_NATIVE_KEY"] = properties["KAKAO_NATIVE_KEY"] } buildTypes { + debug { + manifestPlaceholders = [KAKAO_NATIVE_APP_KEY: properties["KAKAO_NATIVE_KEY"]] + } release { + manifestPlaceholders = [KAKAO_NATIVE_APP_KEY: properties["KAKAO_NATIVE_KEY"]] minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } From 811a4f041e4f9ae8ae57257a9249ce943f99d53f Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Fri, 13 Jan 2023 04:51:40 +0900 Subject: [PATCH 293/745] =?UTF-8?q?[mod]=20#112=20HomeGoalViewType=20enum?= =?UTF-8?q?=20class=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/home/HomeGoalAdapter.kt | 6 +++--- .../org/keepgoeat/presentation/type/HomeGoalViewType.kt | 8 +++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt index cb7eae66..ff8a68c5 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt @@ -91,10 +91,10 @@ class HomeGoalAdapter( if (!::inflater.isInitialized) inflater = LayoutInflater.from(parent.context) return when (viewType) { - HomeGoalViewType.MY_GOAL_TYPE.goalType -> { + HomeGoalViewType.MY_GOAL_TYPE.ordinal -> { MyGoalViewHolder(ItemHomeGoalBinding.inflate(inflater, parent, false)) } - HomeGoalViewType.ADD_GOAL_TYPE.goalType -> { + HomeGoalViewType.ADD_GOAL_TYPE.ordinal -> { AddGoalViewHolder(ItemAddGoalBinding.inflate(inflater, parent, false)) } else -> { @@ -127,7 +127,7 @@ class HomeGoalAdapter( } } - override fun getItemViewType(position: Int): Int = currentList[position].type.goalType + override fun getItemViewType(position: Int): Int = currentList[position].type.ordinal override fun submitList(list: MutableList?) { super.submitList( diff --git a/app/src/main/java/org/keepgoeat/presentation/type/HomeGoalViewType.kt b/app/src/main/java/org/keepgoeat/presentation/type/HomeGoalViewType.kt index dcde8f71..d5b0dd2d 100644 --- a/app/src/main/java/org/keepgoeat/presentation/type/HomeGoalViewType.kt +++ b/app/src/main/java/org/keepgoeat/presentation/type/HomeGoalViewType.kt @@ -1,8 +1,6 @@ package org.keepgoeat.presentation.type -enum class HomeGoalViewType( - val goalType: Int -) { - MY_GOAL_TYPE(0), - ADD_GOAL_TYPE(1) +enum class HomeGoalViewType { + MY_GOAL_TYPE, + ADD_GOAL_TYPE } From b3f0391c808726a98f88a5ff44b5449548b626b9 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Fri, 13 Jan 2023 16:18:38 +0900 Subject: [PATCH 294/745] =?UTF-8?q?[mod]=20#116=20=ED=99=88=20=EB=B7=B0=20?= =?UTF-8?q?textView=20=EC=A4=84=EB=B0=94=EA=BF=88=20=EA=B8=B8=EC=9D=B4=20?= =?UTF-8?q?=EC=A0=9C=ED=95=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/item_home_goal.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/item_home_goal.xml b/app/src/main/res/layout/item_home_goal.xml index deed329f..78d68d93 100644 --- a/app/src/main/res/layout/item_home_goal.xml +++ b/app/src/main/res/layout/item_home_goal.xml @@ -42,13 +42,15 @@ From 1fde208b5e0a1c3b7e52f2df267ec9366fe002cb Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Fri, 13 Jan 2023 16:26:18 +0900 Subject: [PATCH 295/745] =?UTF-8?q?[mod]=20#116=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EB=B7=B0=20=EC=A4=84=EB=B0=94=EA=BF=88=20?= =?UTF-8?q?=EC=B5=9C=EB=8C=80=202=EC=A4=84=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 --- app/src/main/res/layout/activity_goal_detail.xml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/activity_goal_detail.xml b/app/src/main/res/layout/activity_goal_detail.xml index 5fce3cbd..1b6c5600 100644 --- a/app/src/main/res/layout/activity_goal_detail.xml +++ b/app/src/main/res/layout/activity_goal_detail.xml @@ -91,12 +91,15 @@ From 3c7d4cb1e26b4f5b7cc4cc342c4db24558619a7d Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Fri, 13 Jan 2023 17:45:57 +0900 Subject: [PATCH 296/745] =?UTF-8?q?[mod]=20#116=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=B7=B0=20=EC=A4=84=EB=B0=94?= =?UTF-8?q?=EA=BF=88=20=EC=B5=9C=EB=8C=80=202=EC=A4=84=EB=A1=9C=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 --- app/src/main/res/layout/item_my_goal.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/item_my_goal.xml b/app/src/main/res/layout/item_my_goal.xml index 1dcc4fde..06b017c3 100644 --- a/app/src/main/res/layout/item_my_goal.xml +++ b/app/src/main/res/layout/item_my_goal.xml @@ -38,12 +38,15 @@ From 859a47bdf52309f225393b9df72ed45e17913be8 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Fri, 13 Jan 2023 17:58:22 +0900 Subject: [PATCH 297/745] =?UTF-8?q?=20[refactor]=20#117=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_goal_detail.xml | 6 ++---- app/src/main/res/layout/activity_goal_detail_test.xml | 5 ++--- app/src/main/res/layout/item_home_goal.xml | 3 +-- app/src/main/res/layout/item_my_goal.xml | 3 +-- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/layout/activity_goal_detail.xml b/app/src/main/res/layout/activity_goal_detail.xml index 5fce3cbd..462ad374 100644 --- a/app/src/main/res/layout/activity_goal_detail.xml +++ b/app/src/main/res/layout/activity_goal_detail.xml @@ -1,7 +1,6 @@ @@ -85,9 +84,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing24" + app:eatingType="@{viewModel.goalDetail.eatingType}" app:layout_constraintStart_toStartOf="@id/gl_start" - app:layout_constraintTop_toBottomOf="@id/layout_toolbar" - bind:eatingType="@{viewModel.goalDetail.eatingType}" /> + app:layout_constraintTop_toBottomOf="@id/layout_toolbar" /> - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_goal_detail_test.xml b/app/src/main/res/layout/activity_goal_detail_test.xml index ac52bcb6..e6bd4063 100644 --- a/app/src/main/res/layout/activity_goal_detail_test.xml +++ b/app/src/main/res/layout/activity_goal_detail_test.xml @@ -1,7 +1,6 @@ @@ -32,7 +31,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing24" app:layout_constraintTop_toTopOf="parent" - bind:eatingType="@{eatingType.MORE}" /> + app:eatingType="@{eatingType.MORE}" /> + app:eatingType="@{eatingType.LESS}" /> diff --git a/app/src/main/res/layout/item_home_goal.xml b/app/src/main/res/layout/item_home_goal.xml index deed329f..5004370b 100644 --- a/app/src/main/res/layout/item_home_goal.xml +++ b/app/src/main/res/layout/item_home_goal.xml @@ -1,7 +1,6 @@ @@ -38,7 +37,7 @@ android:layout_marginTop="@dimen/spacing16" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - bind:eatingType="@{goalType}" /> + app:eatingType="@{goalType}" /> @@ -34,7 +33,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing24" app:layout_constraintStart_toStartOf="parent" - bind:eatingType="@{eatingType}" /> + app:eatingType="@{eatingType}" /> Date: Fri, 13 Jan 2023 18:10:11 +0900 Subject: [PATCH 298/745] =?UTF-8?q?=20[fix]=20#117=20=EB=AA=A8=EC=9D=8C?= =?UTF-8?q?=EB=A7=8C=20=EC=9E=85=EB=A0=A5=ED=95=A0=20=EC=88=98=20=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/setting/GoalSettingViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt index e1994cf0..151eaccd 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt @@ -60,6 +60,6 @@ class GoalSettingViewModel @Inject constructor( } companion object { - private const val TITLE_PATTERN = "^[A-Za-zㄱ-ㅎ가-힣0-9\\s]*\$" + private const val TITLE_PATTERN = "^[A-Za-zㄱ-ㅎㅏ-ㅣ가-힣0-9\\s]*\$" } } From bb9e72c76725a8e2d27108219e902fb0db022f30 Mon Sep 17 00:00:00 2001 From: Daeun Date: Fri, 13 Jan 2023 18:12:43 +0900 Subject: [PATCH 299/745] =?UTF-8?q?[fix]=20#115=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=8D=9C=EB=A8=B9=EA=B8=B0,=20?= =?UTF-8?q?=EB=8D=94=EB=A8=B9=EA=B8=B0=20=ED=83=9C=EA=B7=B8=20=EA=B0=84?= =?UTF-8?q?=EA=B2=A9=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/ic_eating_less_tag_minus.xml | 10 +++++----- app/src/main/res/drawable/ic_eating_more_tag_plus.xml | 10 +++++----- app/src/main/res/layout/view_eating_tag.xml | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/drawable/ic_eating_less_tag_minus.xml b/app/src/main/res/drawable/ic_eating_less_tag_minus.xml index cba7d1b2..dbb323bb 100644 --- a/app/src/main/res/drawable/ic_eating_less_tag_minus.xml +++ b/app/src/main/res/drawable/ic_eating_less_tag_minus.xml @@ -1,10 +1,10 @@ + android:width="16dp" + android:height="16dp" + android:viewportWidth="16" + android:viewportHeight="16"> diff --git a/app/src/main/res/drawable/ic_eating_more_tag_plus.xml b/app/src/main/res/drawable/ic_eating_more_tag_plus.xml index c06dc4b4..bfea1d02 100644 --- a/app/src/main/res/drawable/ic_eating_more_tag_plus.xml +++ b/app/src/main/res/drawable/ic_eating_more_tag_plus.xml @@ -1,10 +1,10 @@ + android:width="16dp" + android:height="16dp" + android:viewportWidth="16" + android:viewportHeight="16"> diff --git a/app/src/main/res/layout/view_eating_tag.xml b/app/src/main/res/layout/view_eating_tag.xml index 6ec8bd6a..79782e42 100644 --- a/app/src/main/res/layout/view_eating_tag.xml +++ b/app/src/main/res/layout/view_eating_tag.xml @@ -19,7 +19,7 @@ android:background="@drawable/shape_border_radius_4" android:backgroundTint="@{context.getColor(eatingType == null ? R.color.white : eatingType.tagBackgroundColor)}" android:paddingVertical="@dimen/spacing4" - android:paddingStart="6dp" + android:paddingStart="@dimen/spacing4" android:paddingEnd="@dimen/spacing4" tools:backgroundTint="@color/orange_100"> @@ -36,7 +36,7 @@ Date: Fri, 13 Jan 2023 18:13:57 +0900 Subject: [PATCH 300/745] =?UTF-8?q?=20[fix]=20#117=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=8B=9C=20=EC=A4=84=EB=B0=94=EA=BF=88?= =?UTF-8?q?=EC=9D=B4=20=EB=B6=88=EA=B0=80=ED=95=98=EB=8F=84=EB=A1=9D=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 --- app/src/main/res/layout/activity_goal_setting.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/activity_goal_setting.xml b/app/src/main/res/layout/activity_goal_setting.xml index 3695682e..ea1b2d1e 100644 --- a/app/src/main/res/layout/activity_goal_setting.xml +++ b/app/src/main/res/layout/activity_goal_setting.xml @@ -79,6 +79,7 @@ android:layout_marginEnd="@dimen/spacing16" android:background="@drawable/selector_edittext_background" android:hint="@{viewModel.eatingType == null ? `` : context.getString(viewModel.eatingType == EatingType.MORE ? R.string.goal_setting_title_hint_for_more : R.string.goal_setting_title_hint_for_less)}" + android:inputType="text" android:maxLength="20" android:maxLines="1" android:text="@={viewModel.goalTitle}" From 52c10aecd582ea34be624444d9f25393331b42cd Mon Sep 17 00:00:00 2001 From: Daeun Date: Fri, 13 Jan 2023 18:14:04 +0900 Subject: [PATCH 301/745] =?UTF-8?q?[fix]=20#115=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=EB=B7=B0=EC=97=90=EC=84=9C=20=EB=8D=9C=20?= =?UTF-8?q?=EB=A8=B9=EA=B8=B0=20=EB=B7=B0=20=EB=AC=B8=EA=B5=AC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EB=9D=84=EC=96=B4=EC=93=B0=EA=B8=B0=20?= =?UTF-8?q?=EA=B5=90=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/presentation/type/EatingType.kt | 3 +++ app/src/main/res/layout/activity_goal_detail.xml | 10 ++++++---- app/src/main/res/values/strings.xml | 9 ++++++--- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt b/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt index f16f05e6..81a4c4ec 100644 --- a/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt +++ b/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt @@ -10,6 +10,7 @@ import org.keepgoeat.R enum class EatingType( @StringRes val strRes: Int, @StringRes val titleStrRes: Int, + @StringRes val achievementCountTitle: Int, @DrawableRes val snailStickerRes: Int, @DrawableRes val defaultStickerRes: Int, @DrawableRes val tagIconRes: Int, @@ -26,6 +27,7 @@ enum class EatingType( LESS( R.string.eating_type_less, R.string.title_less, + R.string.less, R.drawable.ic_snail_green_sticker, R.drawable.ic_default_green_sticker, R.drawable.ic_eating_less_tag_minus, @@ -42,6 +44,7 @@ enum class EatingType( MORE( R.string.eating_type_more, R.string.title_more, + R.string.more, R.drawable.ic_snail_orange_sticker, R.drawable.ic_default_orange_sticker, R.drawable.ic_eating_more_tag_plus, diff --git a/app/src/main/res/layout/activity_goal_detail.xml b/app/src/main/res/layout/activity_goal_detail.xml index 5fce3cbd..0a6d75d1 100644 --- a/app/src/main/res/layout/activity_goal_detail.xml +++ b/app/src/main/res/layout/activity_goal_detail.xml @@ -117,12 +117,13 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="6dp" - android:text="@string/goal_detail_num_of_days_eaten_last_month" + android:text="@{@string/goal_detail_num_of_days_eaten_last_month(viewModel.goalDetail == null ? `` : context.getString(viewModel.goalDetail.eatingType.achievementCountTitle))}" android:textAppearance="@style/TextAppearance.System5" android:textColor="@color/gray_600" app:layout_constraintEnd_toEndOf="@id/view_divider" app:layout_constraintStart_toStartOf="@id/layout_day_container" - app:layout_constraintTop_toTopOf="@id/layout_day_container" /> + app:layout_constraintTop_toTopOf="@id/layout_day_container" + tools:text="지난달 먹은 날" /> + app:layout_constraintTop_toTopOf="@id/layout_day_container" + tools:text="이번달 먹은 날" /> 나의 목표 %s %s - 지난달 먹은 날 - 이번달 먹은 날 + 지난달 %s 날 + 이번달 %s 날 + 먹은 + 참은 목표가 삭제되었습니다. + 목표가 보관되었습니다. 오늘 식습관 목표 @@ -57,7 +60,7 @@ 목표 입력 - 나의 목표를 입력해볼까요? + 나의 목표를 입력해 볼까요? ex) 하루 1끼 이상 야채 ex) 라면 목표는 최소 1글자 이상 입력해주세요. From 6b4bab4a066b162f699cfd143387d6bbb4cace57 Mon Sep 17 00:00:00 2001 From: Daeun Date: Fri, 13 Jan 2023 18:14:54 +0900 Subject: [PATCH 302/745] =?UTF-8?q?[fix]=20#115=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EA=B8=80=EC=94=A8=EC=B2=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_home.xml | 3 ++- app/src/main/res/layout/activity_onboarding.xml | 6 +----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 3992a61e..82f3e176 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -224,9 +224,10 @@ android:layout_height="wrap_content" android:layout_marginVertical="14dp" android:layout_marginStart="@dimen/spacing4" + android:fontFamily="@font/pretendard_b" android:text="@string/home_make_goal" - android:textAppearance="@style/TextAppearance.System4_Bold" android:textColor="@color/gray_50" + android:textSize="16dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toEndOf="@+id/iv_home_btn_plus" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/activity_onboarding.xml b/app/src/main/res/layout/activity_onboarding.xml index fed28fc9..626aed75 100644 --- a/app/src/main/res/layout/activity_onboarding.xml +++ b/app/src/main/res/layout/activity_onboarding.xml @@ -53,17 +53,13 @@ From f17bd2eea763954f69ec66c2f97b7d6977eb3489 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Fri, 13 Jan 2023 18:21:04 +0900 Subject: [PATCH 303/745] =?UTF-8?q?=20[fix]=20#117=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EB=B0=94=ED=85=80=EC=8B=9C=ED=8A=B8?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=B0=94=EA=B9=A5=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=9D=84=20=ED=84=B0=EC=B9=98=ED=95=98=EB=A9=B4=20=EB=B3=B4?= =?UTF-8?q?=EA=B4=80=20=EB=B0=94=ED=85=80=EC=8B=9C=ED=8A=B8=EA=B0=80=20?= =?UTF-8?q?=EB=B3=B4=EC=9D=B4=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalKeepBottomDialogFragment.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt index 8aaeb295..d938caf3 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt @@ -41,5 +41,6 @@ class GoalKeepBottomDialogFragment : private fun showGoalDeleteDialog() { GoalDeleteBottomDialogFragment().show(parentFragmentManager, "goalDeleteDialog") + dismiss() } } From 4af9bd5140e88e5626faab99452259e13b64c7ef Mon Sep 17 00:00:00 2001 From: Daeun Date: Fri, 13 Jan 2023 18:23:56 +0900 Subject: [PATCH 304/745] =?UTF-8?q?[feat]=20#115=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EB=B3=B4=EA=B4=80=20=ED=86=A0=EC=8A=A4=ED=8A=B8=20=EB=9D=84?= =?UTF-8?q?=EC=9A=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 7345eaec..c467e990 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -92,6 +92,7 @@ class GoalDetailActivity : viewModel.keepState.observe(this) { keepState -> when (keepState) { is UiState.Success -> { + showToast(getString(R.string.goal_detail_success_goal_keep_toast_message)) Intent(this, MyActivity::class.java).apply { putExtra(ARG_IS_ENTERED_FROM_KEEP, true) }.also { From af63b724d5c4407a6e8c498d62a9c4bb067aa08a Mon Sep 17 00:00:00 2001 From: youngjinc Date: Fri, 13 Jan 2023 18:27:29 +0900 Subject: [PATCH 305/745] =?UTF-8?q?=20[fix]=20#117=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=ED=99=94=EB=A9=B4=20=EA=B0=80=EB=A1=9C=20=ED=9A=8C?= =?UTF-8?q?=EC=A0=84=20=EB=A7=89=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7b10a4a1..63ab2937 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,7 +37,9 @@ android:exported="false" /> + android:exported="false" + android:screenOrientation="portrait" + tools:ignore="LockedOrientationActivity" /> Date: Fri, 13 Jan 2023 18:32:59 +0900 Subject: [PATCH 306/745] =?UTF-8?q?=20[fix]=20#117=20api=20=EB=A0=88?= =?UTF-8?q?=EB=B2=A8=2031=20=EB=AF=B8=EB=A7=8C=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=EB=B7=B0=20=EB=9D=BC=EC=9A=B4=EB=94=A9?= =?UTF-8?q?=EC=9D=B4=20=EC=A0=81=EC=9A=A9=EB=90=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalDetailActivity.kt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 7345eaec..0cdfbf37 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -51,13 +51,16 @@ class GoalDetailActivity : } private fun initLayout() { - binding.rvGoalCard.addItemDecoration( - ItemDecorationUtil( - CARD_ITEM_SPACE, - Pair(CARD_MATRIX_ROW, CARD_MATRIX_COL), - RecyclerLayoutType.GRID + binding.rvGoalCard.apply { + addItemDecoration( + ItemDecorationUtil( + CARD_ITEM_SPACE, + Pair(CARD_MATRIX_ROW, CARD_MATRIX_COL), + RecyclerLayoutType.GRID + ) ) - ) + clipToOutline = true + } } private fun addListeners() { From 3b70f97f0a7bd8499d4ad74c41f5ab92b44b11dd Mon Sep 17 00:00:00 2001 From: Daeun Date: Fri, 13 Jan 2023 18:34:58 +0900 Subject: [PATCH 307/745] =?UTF-8?q?[chore]=20#115=20=EB=A8=B9=EA=B8=B0,=20?= =?UTF-8?q?=EC=B0=B8=EA=B8=B0=20=EB=B3=80=EC=88=98=EB=AA=85=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/presentation/type/EatingType.kt | 4 ++-- app/src/main/res/values/strings.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt b/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt index 81a4c4ec..d1231d2b 100644 --- a/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt +++ b/app/src/main/java/org/keepgoeat/presentation/type/EatingType.kt @@ -27,7 +27,7 @@ enum class EatingType( LESS( R.string.eating_type_less, R.string.title_less, - R.string.less, + R.string.goal_detail_hold, R.drawable.ic_snail_green_sticker, R.drawable.ic_default_green_sticker, R.drawable.ic_eating_less_tag_minus, @@ -44,7 +44,7 @@ enum class EatingType( MORE( R.string.eating_type_more, R.string.title_more, - R.string.more, + R.string.goal_detail_eat, R.drawable.ic_snail_orange_sticker, R.drawable.ic_default_orange_sticker, R.drawable.ic_eating_more_tag_plus, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 30fa42a3..c4bb4e2f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -22,8 +22,8 @@ %s %s 지난달 %s 날 이번달 %s 날 - 먹은 - 참은 + 먹은 + 참은 목표가 삭제되었습니다. 목표가 보관되었습니다. From edc2b7e95a5d416391ab985685884746ae35fea3 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Fri, 13 Jan 2023 18:38:15 +0900 Subject: [PATCH 308/745] =?UTF-8?q?[mod]=20#116=20=ED=86=A0=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/setting/GoalSettingActivity.kt | 4 ++++ .../presentation/setting/GoalSettingViewModel.kt | 11 ++++++++--- app/src/main/res/layout/activity_goal_setting.xml | 1 - 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt index e63086b4..301fb183 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt @@ -70,6 +70,10 @@ class GoalSettingActivity : binding.ivBack.setOnClickListener { finish() } + binding.btnComplete.setOnClickListener { + showKeyboard(it, false) + viewModel.uploadGoal() + } } private fun moveToHome() { diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt index e1994cf0..b151ee4b 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt @@ -34,8 +34,12 @@ class GoalSettingViewModel @Inject constructor( private fun addGoal() { viewModelScope.launch { - goalRepository.uploadGoalContent(goalTitle.value ?: return@launch, eatingType.value == EatingType.MORE).let { result -> - _uploadState.value = if (result?.id != null) UiState.Success(result.id) else UiState.Empty + goalRepository.uploadGoalContent( + goalTitle.value ?: return@launch, + eatingType.value == EatingType.MORE + ).let { result -> + _uploadState.value = + if (result?.id != null) UiState.Success(result.id) else UiState.Empty } } } @@ -44,7 +48,8 @@ class GoalSettingViewModel @Inject constructor( viewModelScope.launch { safeLet(goalId, goalTitle.value) { id, title -> goalRepository.editGoalContent(id, title).let { result -> - _uploadState.value = if (result?.id != null) UiState.Success(result.id) else UiState.Empty + _uploadState.value = + if (result?.id != null) UiState.Success(result.id) else UiState.Empty } } } diff --git a/app/src/main/res/layout/activity_goal_setting.xml b/app/src/main/res/layout/activity_goal_setting.xml index 3695682e..41d2c9b4 100644 --- a/app/src/main/res/layout/activity_goal_setting.xml +++ b/app/src/main/res/layout/activity_goal_setting.xml @@ -136,7 +136,6 @@ android:layout_marginBottom="42dp" android:backgroundTint="@color/selector_complete_button_color" android:enabled="@{viewModel.isValidTitle}" - android:onClick="@{() -> viewModel.uploadGoal()}" android:text="@string/complete" android:textColor="@color/selector_complete_button_text_color" app:layout_constraintBottom_toBottomOf="parent" From c08aa9c549c76ad314187f7d400e6d7cf4dc0aa0 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Fri, 13 Jan 2023 18:44:44 +0900 Subject: [PATCH 309/745] =?UTF-8?q?=20[fix]=20#117=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=EB=B7=B0=EC=97=90=EC=84=9C=20=ED=83=80=EC=9D=B4=ED=8B=80?= =?UTF-8?q?=EC=9D=B4=20=EA=B8=B8=EC=96=B4=EC=A7=88=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EC=9E=98=EB=A0=A4=EB=B3=B4=EC=9D=B4=EB=8A=94=20=EB=B2=84?= =?UTF-8?q?=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_goal_detail.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/activity_goal_detail.xml b/app/src/main/res/layout/activity_goal_detail.xml index 462ad374..5fcbd8ed 100644 --- a/app/src/main/res/layout/activity_goal_detail.xml +++ b/app/src/main/res/layout/activity_goal_detail.xml @@ -90,13 +90,14 @@ @@ -185,7 +186,6 @@ android:layout_marginTop="@dimen/spacing16" android:background="@drawable/shape_border_radius_8" android:backgroundTint="@color/white" - android:clipToOutline="true" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" app:layout_constraintEnd_toEndOf="@id/gl_end" app:layout_constraintStart_toStartOf="@id/gl_start" From 0073fd27f993ddf860e25a3d7a8bd40b4b371332 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Fri, 13 Jan 2023 18:47:54 +0900 Subject: [PATCH 310/745] =?UTF-8?q?=20[mod]=20#117=20=ED=83=80=EC=9D=B4?= =?UTF-8?q?=ED=8B=80=20=EA=B8=80=EC=9E=90=20=EC=88=98=20=EC=A0=9C=ED=95=9C?= =?UTF-8?q?=2020=20->=2015=EC=9E=90=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 --- .../presentation/setting/GoalSettingViewModel.kt | 11 +++++++---- app/src/main/res/layout/activity_goal_setting.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt index 151eaccd..558c5716 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt @@ -21,7 +21,7 @@ class GoalSettingViewModel @Inject constructor( val isValidTitle: LiveData get() = Transformations.map(goalTitle) { title -> - title.length in 1..20 && title.isNotBlank() && title.matches(TITLE_PATTERN.toRegex()) + title.length in 1..15 && title.isNotBlank() && title.matches(TITLE_PATTERN.toRegex()) } private val _uploadState = MutableLiveData>(UiState.Loading) @@ -34,8 +34,10 @@ class GoalSettingViewModel @Inject constructor( private fun addGoal() { viewModelScope.launch { - goalRepository.uploadGoalContent(goalTitle.value ?: return@launch, eatingType.value == EatingType.MORE).let { result -> - _uploadState.value = if (result?.id != null) UiState.Success(result.id) else UiState.Empty + goalRepository.uploadGoalContent(goalTitle.value ?: return@launch, + eatingType.value == EatingType.MORE).let { result -> + _uploadState.value = + if (result?.id != null) UiState.Success(result.id) else UiState.Empty } } } @@ -44,7 +46,8 @@ class GoalSettingViewModel @Inject constructor( viewModelScope.launch { safeLet(goalId, goalTitle.value) { id, title -> goalRepository.editGoalContent(id, title).let { result -> - _uploadState.value = if (result?.id != null) UiState.Success(result.id) else UiState.Empty + _uploadState.value = + if (result?.id != null) UiState.Success(result.id) else UiState.Empty } } } diff --git a/app/src/main/res/layout/activity_goal_setting.xml b/app/src/main/res/layout/activity_goal_setting.xml index ea1b2d1e..4a538120 100644 --- a/app/src/main/res/layout/activity_goal_setting.xml +++ b/app/src/main/res/layout/activity_goal_setting.xml @@ -80,7 +80,7 @@ android:background="@drawable/selector_edittext_background" android:hint="@{viewModel.eatingType == null ? `` : context.getString(viewModel.eatingType == EatingType.MORE ? R.string.goal_setting_title_hint_for_more : R.string.goal_setting_title_hint_for_less)}" android:inputType="text" - android:maxLength="20" + android:maxLength="15" android:maxLines="1" android:text="@={viewModel.goalTitle}" android:textAppearance="@style/TextAppearance.System4_Bold" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c2c340bf..271ab982 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -62,7 +62,7 @@ ex) 라면 목표는 최소 1글자 이상 입력해주세요. 한글, 영문, 숫자만 입력 가능합니다. - (%d/20) + (%d/15) 차근차근 식습관 목표를 세워보세요. From 0d61b4095fcd6ec72122f24a023d934e5cc8cb74 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Fri, 13 Jan 2023 18:59:44 +0900 Subject: [PATCH 311/745] =?UTF-8?q?[chore]=20#121=20=EB=B3=80=EC=88=98?= =?UTF-8?q?=EB=AA=85=20id=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/data/datasource/remote/GoalDataSource.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index fec43ad8..f67bdeff 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -24,18 +24,17 @@ class GoalDataSource @Inject constructor( ): ApiResult = safeApiCall { goalService.editGoalContent(id, title) } - // TODO goalId -> id 로 파라미터명 변경 - suspend fun fetchGoalDetail(goalId: Int): ApiResult = - safeApiCall { goalService.fetchGoalDetail(goalId) } + suspend fun fetchGoalDetail(id: Int): ApiResult = + safeApiCall { goalService.fetchGoalDetail(id) } suspend fun keepGoal(id: Int): ApiResult = safeApiCall { goalService.keepGoal(id) } suspend fun achievedGoal( - goalId: Int, + id: Int, requestGoalAchievement: RequestGoalAchievement ): ApiResult = - safeApiCall { goalService.achieveGoal(goalId, requestGoalAchievement) } + safeApiCall { goalService.achieveGoal(id, requestGoalAchievement) } suspend fun deleteGoal( id: Int From e59a9931e19829d57b3c95bf95053aa89e533c1f Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Fri, 13 Jan 2023 19:05:29 +0900 Subject: [PATCH 312/745] =?UTF-8?q?[chore]=20#121=20TODO=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/domain/repository/GoalRepository.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 779c1385..6187f464 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -9,7 +9,6 @@ interface GoalRepository { isAchieved: Boolean ): ResponseGoalAchievement.ResponseGoalAchievementData? - // TODO update -> add 네이밍 수정 필요 suspend fun uploadGoalContent( title: String, isMore: Boolean From 037c67f634d07f1b2826e7e3b360bc9b90814f94 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Fri, 13 Jan 2023 19:08:28 +0900 Subject: [PATCH 313/745] =?UTF-8?q?=20[del]=20#113=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EB=8D=94=EB=AF=B8=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 13 ----- .../data/datasource/remote/DummyDataSource.kt | 15 ------ .../data/model/request/RequestData.kt | 9 ---- .../data/model/response/ResponseListResult.kt | 27 ----------- .../data/model/response/ResponseResult.kt | 24 ---------- .../data/repository/DummyRepositoryImpl.kt | 29 ------------ .../keepgoeat/data/service/DummyService.kt | 12 ----- .../java/org/keepgoeat/di/RepositoryModule.kt | 8 ---- .../java/org/keepgoeat/di/ServiceModule.kt | 6 --- .../org/keepgoeat/domain/model/DummyData.kt | 7 --- .../domain/repository/DummyRepository.kt | 7 --- .../keepgoeat/presentation/MainActivity.kt | 7 --- .../detail/GoalDetailTestActivity.kt | 37 --------------- .../presentation/dummy/DummyActivity.kt | 39 --------------- .../presentation/dummy/DummyViewModel.kt | 28 ----------- app/src/main/res/layout/activity_dummy.xml | 33 ------------- .../res/layout/activity_goal_detail_test.xml | 47 ------------------- app/src/main/res/layout/activity_main.xml | 21 --------- 18 files changed, 369 deletions(-) delete mode 100644 app/src/main/java/org/keepgoeat/data/datasource/remote/DummyDataSource.kt delete mode 100644 app/src/main/java/org/keepgoeat/data/model/request/RequestData.kt delete mode 100644 app/src/main/java/org/keepgoeat/data/model/response/ResponseListResult.kt delete mode 100644 app/src/main/java/org/keepgoeat/data/model/response/ResponseResult.kt delete mode 100644 app/src/main/java/org/keepgoeat/data/repository/DummyRepositoryImpl.kt delete mode 100644 app/src/main/java/org/keepgoeat/data/service/DummyService.kt delete mode 100644 app/src/main/java/org/keepgoeat/domain/model/DummyData.kt delete mode 100644 app/src/main/java/org/keepgoeat/domain/repository/DummyRepository.kt delete mode 100644 app/src/main/java/org/keepgoeat/presentation/MainActivity.kt delete mode 100644 app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailTestActivity.kt delete mode 100644 app/src/main/java/org/keepgoeat/presentation/dummy/DummyActivity.kt delete mode 100644 app/src/main/java/org/keepgoeat/presentation/dummy/DummyViewModel.kt delete mode 100644 app/src/main/res/layout/activity_dummy.xml delete mode 100644 app/src/main/res/layout/activity_goal_detail_test.xml delete mode 100644 app/src/main/res/layout/activity_main.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 63ab2937..a0fda9d1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,29 +32,16 @@ android:exported="true" android:screenOrientation="portrait" tools:ignore="LockedOrientationActivity" /> - - - = - safeApiCall { dummyService.uploadDummy(signInRequest) } -} diff --git a/app/src/main/java/org/keepgoeat/data/model/request/RequestData.kt b/app/src/main/java/org/keepgoeat/data/model/request/RequestData.kt deleted file mode 100644 index 10f5cc49..00000000 --- a/app/src/main/java/org/keepgoeat/data/model/request/RequestData.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.keepgoeat.data.model.request - -import kotlinx.serialization.Serializable - -@Serializable -data class RequestData( - val name: String, - val email: String, -) diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseListResult.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseListResult.kt deleted file mode 100644 index ab65a6e6..00000000 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseListResult.kt +++ /dev/null @@ -1,27 +0,0 @@ -package org.keepgoeat.data.model.response - -import kotlinx.serialization.Serializable -import org.keepgoeat.domain.model.DummyData - -@Serializable -data class ResponseListResult( - val status: Int, - val message: String, - val data: List, -) { - @Serializable - data class ResponseData( - // TODO ResponseUser가 중복으로 사용된다면 파일 분리하기 - val id: Int, - val name: String, - val email: String, - ) - - fun toDummyDataList(): List = data.map { - DummyData( - id = it.id.toString(), - email = it.email, - name = it.name - ) - } -} diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseResult.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseResult.kt deleted file mode 100644 index 03764215..00000000 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseResult.kt +++ /dev/null @@ -1,24 +0,0 @@ -package org.keepgoeat.data.model.response - -import kotlinx.serialization.Serializable -import org.keepgoeat.domain.model.DummyData - -@Serializable -data class ResponseResult( - val status: Int, - val message: String, - val data: ResponseData, -) { - @Serializable - data class ResponseData( // TODO ResponseUser가 중복으로 사용된다면 파일 분리하기 - val id: Int, - val name: String, - val email: String, - ) { - fun toDummyData() = DummyData( - id = id.toString(), - email = email, - name = name - ) - } -} diff --git a/app/src/main/java/org/keepgoeat/data/repository/DummyRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/DummyRepositoryImpl.kt deleted file mode 100644 index fb8e12c9..00000000 --- a/app/src/main/java/org/keepgoeat/data/repository/DummyRepositoryImpl.kt +++ /dev/null @@ -1,29 +0,0 @@ -package org.keepgoeat.data.repository - -import org.keepgoeat.data.ApiResult -import org.keepgoeat.data.datasource.remote.DummyDataSource -import org.keepgoeat.data.model.request.RequestData -import org.keepgoeat.data.model.response.ResponseListResult -import org.keepgoeat.domain.repository.DummyRepository -import timber.log.Timber -import javax.inject.Inject - -class DummyRepositoryImpl @Inject constructor( - private val dummyDataSource: DummyDataSource, -) : DummyRepository { - override suspend fun uploadDummy(name: String, email: String): ResponseListResult? { - val result = dummyDataSource.uploadDummy(RequestData(name, email)) - - return when (result) { - is ApiResult.Success -> { result.data } - is ApiResult.NetworkError -> { - Timber.d("Network Error") - null - } - is ApiResult.GenericError -> { - Timber.d("(${result.code}): ${result.message}") - null - } - } - } -} diff --git a/app/src/main/java/org/keepgoeat/data/service/DummyService.kt b/app/src/main/java/org/keepgoeat/data/service/DummyService.kt deleted file mode 100644 index e848a4a8..00000000 --- a/app/src/main/java/org/keepgoeat/data/service/DummyService.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.keepgoeat.data.service - -import org.keepgoeat.data.model.request.RequestData -import org.keepgoeat.data.model.response.ResponseListResult -import retrofit2.Response -import retrofit2.http.Body -import retrofit2.http.POST - -interface DummyService { - @POST("api/dummy") - suspend fun uploadDummy(@Body request: RequestData): Response -} diff --git a/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt b/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt index cffd3aab..0dfb5fce 100644 --- a/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt +++ b/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt @@ -5,11 +5,9 @@ import dagger.Module import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import org.keepgoeat.data.repository.AuthRepositoryImpl -import org.keepgoeat.data.repository.DummyRepositoryImpl import org.keepgoeat.data.repository.GoalRepositoryImpl import org.keepgoeat.data.repository.MyRepositoryImpl import org.keepgoeat.domain.repository.AuthRepository -import org.keepgoeat.domain.repository.DummyRepository import org.keepgoeat.domain.repository.GoalRepository import org.keepgoeat.domain.repository.MyRepository import javax.inject.Singleton @@ -17,12 +15,6 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) interface RepositoryModule { - @Binds - @Singleton - fun bindDummyRepository( - dummyRepositoryImpl: DummyRepositoryImpl, - ): DummyRepository - @Binds @Singleton fun bindGoalRepository( diff --git a/app/src/main/java/org/keepgoeat/di/ServiceModule.kt b/app/src/main/java/org/keepgoeat/di/ServiceModule.kt index b3ef8d89..3b435bb1 100644 --- a/app/src/main/java/org/keepgoeat/di/ServiceModule.kt +++ b/app/src/main/java/org/keepgoeat/di/ServiceModule.kt @@ -5,7 +5,6 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import org.keepgoeat.data.service.AuthService -import org.keepgoeat.data.service.DummyService import org.keepgoeat.data.service.GoalService import org.keepgoeat.data.service.MyService import retrofit2.Retrofit @@ -14,11 +13,6 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) object ServiceModule { - @Singleton - @Provides - fun provideDummyService(retrofit: Retrofit): DummyService = - retrofit.create(DummyService::class.java) - @Singleton @Provides fun provideGoalService(retrofit: Retrofit): GoalService = diff --git a/app/src/main/java/org/keepgoeat/domain/model/DummyData.kt b/app/src/main/java/org/keepgoeat/domain/model/DummyData.kt deleted file mode 100644 index 828500d1..00000000 --- a/app/src/main/java/org/keepgoeat/domain/model/DummyData.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.keepgoeat.domain.model - -data class DummyData( - val email: String, - val id: String, - val name: String, -) diff --git a/app/src/main/java/org/keepgoeat/domain/repository/DummyRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/DummyRepository.kt deleted file mode 100644 index 5f990c08..00000000 --- a/app/src/main/java/org/keepgoeat/domain/repository/DummyRepository.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.keepgoeat.domain.repository - -import org.keepgoeat.data.model.response.ResponseListResult - -interface DummyRepository { - suspend fun uploadDummy(name: String, email: String): ResponseListResult? -} diff --git a/app/src/main/java/org/keepgoeat/presentation/MainActivity.kt b/app/src/main/java/org/keepgoeat/presentation/MainActivity.kt deleted file mode 100644 index 24767676..00000000 --- a/app/src/main/java/org/keepgoeat/presentation/MainActivity.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.keepgoeat.presentation - -import org.keepgoeat.R -import org.keepgoeat.databinding.ActivityMainBinding -import org.keepgoeat.util.binding.BindingActivity - -class MainActivity : BindingActivity(R.layout.activity_main) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailTestActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailTestActivity.kt deleted file mode 100644 index 3ef2c415..00000000 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailTestActivity.kt +++ /dev/null @@ -1,37 +0,0 @@ -package org.keepgoeat.presentation.detail - -import android.content.Intent -import android.os.Bundle -import dagger.hilt.android.AndroidEntryPoint -import org.keepgoeat.R -import org.keepgoeat.databinding.ActivityGoalDetailTestBinding -import org.keepgoeat.presentation.detail.GoalDetailActivity.Companion.ARG_EATING_TYPE -import org.keepgoeat.presentation.type.EatingType -import org.keepgoeat.util.binding.BindingActivity - -// TODO 더먹기 및 덜먹기 카드 상세뷰 확인을 위한 테스트 액티비티로, 뷰 구현 마칠 때 해당 파일 삭제 예정 -@AndroidEntryPoint -class GoalDetailTestActivity : BindingActivity(R.layout.activity_goal_detail_test) { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - addListeners() - } - - private fun addListeners() { - binding.viewEatingLessTag.root.setOnClickListener { - moveToGoalDetail(EatingType.LESS) - } - binding.viewEatingMoreTag.root.setOnClickListener { - moveToGoalDetail(EatingType.MORE) - } - } - - private fun moveToGoalDetail(eatingType: EatingType) { - Intent(this, GoalDetailActivity::class.java).apply { - putExtra(ARG_EATING_TYPE, eatingType.name) - }.also { - startActivity(it) - } - } -} diff --git a/app/src/main/java/org/keepgoeat/presentation/dummy/DummyActivity.kt b/app/src/main/java/org/keepgoeat/presentation/dummy/DummyActivity.kt deleted file mode 100644 index 13a82b95..00000000 --- a/app/src/main/java/org/keepgoeat/presentation/dummy/DummyActivity.kt +++ /dev/null @@ -1,39 +0,0 @@ -package org.keepgoeat.presentation.dummy - -import android.os.Bundle -import androidx.activity.viewModels -import dagger.hilt.android.AndroidEntryPoint -import org.keepgoeat.R -import org.keepgoeat.databinding.ActivityDummyBinding -import org.keepgoeat.util.UiState -import org.keepgoeat.util.binding.BindingActivity - -@AndroidEntryPoint -class DummyActivity : BindingActivity(R.layout.activity_dummy) { - private val viewModel: DummyViewModel by viewModels() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - binding.viewModel = viewModel -// binding.lifecycleOwner = this // binding에서 LiveData를 사용할 경우 해당 코드 필요 - } - - private fun initLayout() { - TODO("Not yet implemented") - } - - private fun addListeners() { - TODO("Not yet implemented") - } - - private fun addObservers() { - viewModel.dummyList.observe(this) { result -> - when (result) { - is UiState.Success -> {} - is UiState.Loading -> {} - is UiState.Empty -> {} - else -> {} - } - } - } -} diff --git a/app/src/main/java/org/keepgoeat/presentation/dummy/DummyViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/dummy/DummyViewModel.kt deleted file mode 100644 index 7ec9ea43..00000000 --- a/app/src/main/java/org/keepgoeat/presentation/dummy/DummyViewModel.kt +++ /dev/null @@ -1,28 +0,0 @@ -package org.keepgoeat.presentation.dummy - -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.launch -import org.keepgoeat.domain.model.DummyData -import org.keepgoeat.domain.repository.DummyRepository -import org.keepgoeat.util.UiState -import org.keepgoeat.util.toUiState -import javax.inject.Inject - -@HiltViewModel -class DummyViewModel @Inject constructor(private val dummyRepository: DummyRepository) : - ViewModel() { - private val _dummyList = MutableLiveData>>(UiState.Loading) - val dummyList: LiveData>> get() = _dummyList - - fun uploadDummy() { - viewModelScope.launch { - dummyRepository.uploadDummy("keepgoeat", "keepgoeat@gmail.com").let { dummy -> - _dummyList.value = dummy?.toDummyDataList()?.toUiState() - } - } - } -} diff --git a/app/src/main/res/layout/activity_dummy.xml b/app/src/main/res/layout/activity_dummy.xml deleted file mode 100644 index 07a3154a..00000000 --- a/app/src/main/res/layout/activity_dummy.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_goal_detail_test.xml b/app/src/main/res/layout/activity_goal_detail_test.xml deleted file mode 100644 index e6bd4063..00000000 --- a/app/src/main/res/layout/activity_goal_detail_test.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index a9b8cabc..00000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - \ No newline at end of file From dfbfa20bc71b3c7ccc3c4565d70fe4cd0fa337f1 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Fri, 13 Jan 2023 19:09:16 +0900 Subject: [PATCH 314/745] =?UTF-8?q?=20[fix]=20#117=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20>=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=EC=95=BD=EA=B4=80=20=EB=8F=99=EC=9D=98=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=EC=84=9C=20=EB=8B=A4?= =?UTF-8?q?=EC=9D=8C=ED=99=94=EB=A9=B4=EC=9C=BC=EB=A1=9C=20=EB=84=98?= =?UTF-8?q?=EC=96=B4=EA=B0=80=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=B2=84?= =?UTF-8?q?=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a0fda9d1..58f9566b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -70,7 +70,7 @@ + android:scheme="kakaod799c706c62fb280c279b5befc65116f" /> From 73b48054d67139fc4328931bf11acf199b161170 Mon Sep 17 00:00:00 2001 From: Daeun Date: Fri, 13 Jan 2023 19:55:46 +0900 Subject: [PATCH 315/745] =?UTF-8?q?[mod]=20#119=20=EC=95=B1=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EC=BD=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 4 +- app/src/main/ic_keepgoeat-playstore.png | Bin 0 -> 23287 bytes .../res/drawable/ic_keepgoeat_background.xml | 74 ++++++++++++++++++ .../res/mipmap-anydpi-v26/ic_keepgoeat.xml | 5 ++ .../mipmap-anydpi-v26/ic_keepgoeat_round.xml | 5 ++ app/src/main/res/mipmap-hdpi/ic_keepgoeat.png | Bin 0 -> 2515 bytes .../mipmap-hdpi/ic_keepgoeat_foreground.png | Bin 0 -> 2923 bytes .../res/mipmap-hdpi/ic_keepgoeat_round.png | Bin 0 -> 4165 bytes app/src/main/res/mipmap-mdpi/ic_keepgoeat.png | Bin 0 -> 1858 bytes .../mipmap-mdpi/ic_keepgoeat_foreground.png | Bin 0 -> 1884 bytes .../res/mipmap-mdpi/ic_keepgoeat_round.png | Bin 0 -> 2708 bytes .../main/res/mipmap-xhdpi/ic_keepgoeat.png | Bin 0 -> 3563 bytes .../mipmap-xhdpi/ic_keepgoeat_foreground.png | Bin 0 -> 4201 bytes .../res/mipmap-xhdpi/ic_keepgoeat_round.png | Bin 0 -> 5891 bytes .../main/res/mipmap-xxhdpi/ic_keepgoeat.png | Bin 0 -> 5760 bytes .../mipmap-xxhdpi/ic_keepgoeat_foreground.png | Bin 0 -> 6761 bytes .../res/mipmap-xxhdpi/ic_keepgoeat_round.png | Bin 0 -> 9045 bytes .../main/res/mipmap-xxxhdpi/ic_keepgoeat.png | Bin 0 -> 7781 bytes .../ic_keepgoeat_foreground.png | Bin 0 -> 9570 bytes .../res/mipmap-xxxhdpi/ic_keepgoeat_round.png | Bin 0 -> 13107 bytes 20 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 app/src/main/ic_keepgoeat-playstore.png create mode 100644 app/src/main/res/drawable/ic_keepgoeat_background.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_keepgoeat.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_keepgoeat_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_keepgoeat.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_keepgoeat_foreground.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_keepgoeat_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_keepgoeat.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_keepgoeat_foreground.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_keepgoeat_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_keepgoeat.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_keepgoeat_foreground.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_keepgoeat_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_keepgoeat.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_keepgoeat_foreground.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_keepgoeat_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_keepgoeat.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_keepgoeat_foreground.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_keepgoeat_round.png diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 58f9566b..593e855c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,9 +9,9 @@ android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" - android:icon="@mipmap/ic_launcher" + android:icon="@mipmap/ic_keepgoeat" android:label="@string/keep_go_eat" - android:roundIcon="@mipmap/ic_launcher_round" + android:roundIcon="@mipmap/ic_keepgoeat_round" android:supportsRtl="true" android:theme="@style/Theme.KeepGoEat" android:usesCleartextTraffic="true" diff --git a/app/src/main/ic_keepgoeat-playstore.png b/app/src/main/ic_keepgoeat-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..eb91034439e88c8ce20bb2bad58056e5c913ad8f GIT binary patch literal 23287 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 W + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_keepgoeat.xml b/app/src/main/res/mipmap-anydpi-v26/ic_keepgoeat.xml new file mode 100644 index 00000000..6fa0b1ce --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_keepgoeat.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_keepgoeat_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_keepgoeat_round.xml new file mode 100644 index 00000000..6fa0b1ce --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_keepgoeat_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_keepgoeat.png b/app/src/main/res/mipmap-hdpi/ic_keepgoeat.png new file mode 100644 index 0000000000000000000000000000000000000000..d140f369f7cd37a9598c088f7183bb429e827f87 GIT binary patch literal 2515 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_keepgoeat_foreground.png b/app/src/main/res/mipmap-hdpi/ic_keepgoeat_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..9b4ed0f09a88f6054899150e7a58ab1fc28b6c91 GIT binary patch literal 2923 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 IHFk^p7m;a**8l(j literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_keepgoeat_round.png b/app/src/main/res/mipmap-hdpi/ic_keepgoeat_round.png new file mode 100644 index 0000000000000000000000000000000000000000..95419bcb0cc5b117c8695aa561d75af1d49ddbec GIT binary patch literal 4165 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 P00000NkvXXu0mjf&4wF) literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_keepgoeat.png b/app/src/main/res/mipmap-mdpi/ic_keepgoeat.png new file mode 100644 index 0000000000000000000000000000000000000000..55359e364b946b6c84a99d9925d65374b17ff8d4 GIT binary patch literal 1858 zcmV-I2fg@-P)abG7PasQ50Mhb{B9#2@zCO zAQe#K!!JNFBVi=bF$oaZ6$MTFfL%nzl|7v9*}E^^E{pCaxohK{`OUlU?7i=v-#s7q zynO=(JZ%o#d@*O>_+O;Y*%PFLxn2)#Qj|VRFqhk{*`$wX;DlP)5Er##*r%$fHwkVk zrQs@urv({}bL%CuZ9ZLTZPG!|=b7NOn~#T3ppJt%OPHxK?j$Yn>yA+=Al-$PFAlokl^Ua@0>(F}qUeUtFC6i8K9W6HDM|YJnMRGxj zUNzB}zGo3$lKEn1mRR2ea*FAeqF*Qok$GO zb%lC>ewn*n01Wp-J#=MBGtm9a>Kmgo178>GYSJj;>H0x&@H-Rg6`G9&A*fsK!5;EC z+7m>ii&-Q-J4pLs%G~$Fx|%dWI4Wy_lWT*l?evD}hRNm+eB2-%x%f0mmg^r3*O>0j4ypW^owzHFR$d!|L5p4oYB!Cqncrgbj-kwyj3k zvjL$f6QS$?!l|REuPlb{%A;6azQ;NOE-Z+>`#XpYyXl7zJ0D@=4+!aN5pp*o9Nmpj zeh}egAwos5L1CyULMY8cII~Hx9$FdO)??A}ggs?jfAuR$SF$6&|4?*gW5Iz-Qr8l$A7pP~I0L4I!U1MPF4CW>? z5u(^N@=JsWAEuxevy4aYv1aI>EVPR4hGK4SL{3AH&*6RY<5g4Gy@hdN$YvXM*5FoA zjMVz?5aPdOyY9o4CJWFwdTy9kKM~ln65(ni!etdg%O!*xS2)NOu3qH*hO-De)|mco z2~Bkf%7r{wY3`j{2)8tRzVaL9THETP;Rm*0dk+^%&(KaN7ydqpv*(T zd8ea?z~1#t@%sqcn+SiFBdE{u-_%uXQw~`qQ2R(hOfGc2nJ?bO7Vf-*aC{%ak1TU^ z-sNPjU*-fTd(@rou@dEUa{}8UxcdlW1pJ!IVS#|vE@Y9wI_8@t**tGk{-#Vqatgx2 z44$*|Q+ckphCo7)!N1{bDZ;fTgez(mPdPk&(i(R=xTV>d(LV&};Gvx-+-l>C5Kb2H zog(?QX6r3L1n9YxMk%FMmGd~Ec!~LnXDMT*vYCLz7|4j~QHXrL{tUv!8t(UcJ(p9T zQX*xd=7yf}l_gxZe=EYlG=6x+EDVFLXW+i>N4|KCytR~9GIs*U6 z`+xu{;3%FbRZ@9ErN_P`?)&EN1;%#+ed#{vF8&GY_9s0;5I+u3-WRIVG-idI1a?TK zqrNQPwl^}n5$FSk7+_YbP6&L03D_FMPc(u5#XobOH7MFt3Q;LxM+gMYt(|J!pSvUW z2EI!!bUb;MLlG!S2+)p*pFTpYt4R|+8jMVw{>H@fvYQdb%djI%qN9%t^bmW%xVG-@ zN(nB_4Q_Q>;y#>ov`E0v_~)A!T}nc8+-jpSEptA0u*t}Fz#gETzs=T9-98UL$y@X@ z(`}IWBV?~;{QflX)iG~7kIM_mA72sPw&*}edq&a>?P0lpdx<=t{jki}1jm@HQ08YM zE0IrYKO*xtkl^Ua@0>l7;dv>89nY+slc+%`5RsNj{+!^wRH_W6xWXvP79 z7~UE(&S}C>zcG@bo*x-7%y<>UT3KK62g=ymLtLCDk}jmvLzNdA4RrQ(et~rdGrVkP w3?9IAv08a?qhJ}G8u+|D(RaW;ZI03Y1~pd*f1cvx4gdfE07*qoM6N<$f_;v1j{pDw literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_keepgoeat_foreground.png b/app/src/main/res/mipmap-mdpi/ic_keepgoeat_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..bbee17502e64cfc601a2dcb1d1c3eb8b0e503d4f GIT binary patch literal 1884 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_keepgoeat_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_keepgoeat_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..8e52b21db17e84acd03e5ce9d6687b3e51aa0b95 GIT binary patch literal 4201 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_keepgoeat_round.png b/app/src/main/res/mipmap-xhdpi/ic_keepgoeat_round.png new file mode 100644 index 0000000000000000000000000000000000000000..078410628cb18a48393f0c8ea34bca27732a647b GIT binary patch literal 5891 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_keepgoeat.png b/app/src/main/res/mipmap-xxhdpi/ic_keepgoeat.png new file mode 100644 index 0000000000000000000000000000000000000000..a48f2f18c38f849e07739ba04b5dd772f2d8efdf GIT binary patch literal 5760 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_keepgoeat_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_keepgoeat_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..0b39a6c0e573ad7fece3aa16d100867b8eae4996 GIT binary patch literal 6761 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 CypNRt literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_keepgoeat_round.png b/app/src/main/res/mipmap-xxhdpi/ic_keepgoeat_round.png new file mode 100644 index 0000000000000000000000000000000000000000..4a6e5cd907539d7065f33b774edf8826e0dd760a GIT binary patch literal 9045 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 X`Wq4cI!}bZFEQ`p_H`zSo>C&Dq-Zxz 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
ib!b?>!iEa|( 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 Hu0mjfWE3Tr literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_keepgoeat.png b/app/src/main/res/mipmap-xxxhdpi/ic_keepgoeat.png new file mode 100644 index 0000000000000000000000000000000000000000..330f337008da24f589d5ca65a31b06c130d02ffc GIT binary patch literal 7781 zcmb7pcTiJZ*Ka}~)PPb$B1M{rlu$)Liu5KRy>|&skX{6WJoF~gdk?)MQUpQ^A{|5o z=_t~BuV0?`&O3AG`{&NxGv}Or&R+A|Ypt{PnpGk-Un)XKU?czl0HUlU_X_vK{Cg3B zarakqPJ{peBe$}gjE;}lPByU*wQg%zA#3TnNj5#hUok;_hV&K_E&Tfmw!|?}toVj6 zls<5yxa%L2um$6PW$f<2|5%GZgI9|B$`XyQ3Dm+6$fa!Gm+K4Asef?i-yvqItessY zo?Rq%ayNP;8LacyBfEUBq9OP2aAoQLdz5lSR38?m22I+Ue;0O+M+=t`_c%j?%;B3X z>PyP@t>UJ3lmCG82$0>JiC7we5Zm-WOQp=m;Z~~xA?oK?bMJxJOYLxXejahV{yBZB zYZAJJr=^IUj{f=*@dxh7W;5<{Ij_Cb*Y>+kn0xYC`u;#;kCCVw{gTS&(2pV6^;SoJMswNwJ{D~54;mW?m0Bo|7tTyF z#I>mG&H2j9lBCjl4l28eu5n4WG(?Bd^737JkEn%PSHExkz%e1h=uY#S-nU;Eft$?1 z=UC^Stk$Vu+VA?%1Z9!Up<_zvs3I>Rh_BU8ea}leHt$nDgD;~}LHBi)%-lZ3@R}%7 zjn)+AT~p%#51lNIOC*~$w}}w0pTWH z?Oo5i+XWaas0(RP-${hD6H+8twlzc%QtVu%%*orFkZ&41$(?+xoP5Q{eN^tMbUU$J z^L4iu6BKk1ULG|P&Ks^K^NnJtd8~`oWpW^VOaC;;d;b%U`n3>FmM0~|A2@cCZ}xbx zSIMu3iMgLQzmwaz zg)W$KjnIVfPOp(Dz6l}LyTuc^?<|kmt9UGKH}AoCHrZ-OQZ#O>1*q!H&MJx;Cua=m z?Y`!_&St{oq~uOLnw4UNIf=JqS`IpdT#k^Nr^?@HF4sMHo2X|GZiT`wnbcKKXd&nH z7E7nCoffX8xjEi00(%=l49&_Om!MFFX3kUi!qv8kAa&U(7L)rmh(1jDqod?>=BF^Cr84x#I8#O6Ef zZt&v@S&dvnrRNlKOewPtE5*t99NYxQB|+g-+DuFzI@2sry!9hBcE889#~WV{YZ?;T z90(@6OQI=aeI7MdvaPfH!tc5$`+lW_H{bcjfC*XYJnIVWGO-lIxQJ!NnK=ncmr3~Y zP%YS5ar&+*RgKsUA$p(#3GBglSNB_iLOd6NLWxE$j4d#jpt-OTjWY6DWW$GJ&2$)W z@dpe|eU=j#v4rK-b|>d1`3}Rj0xxsZHJqE`E;Jn~)6t(esZNMCH10&;xh;j0GifiN zfPhv}-`sfg#6bEDgTPmWt`_&N$cCmEJ@5yLNz}HDL)&T#>F}fHz7&nG%N;ZaIXlsZ ziisk>`XzpDn9SMwgNEiMqADa~RP(sL-<|8ItAY+`$3xQjOghBNT=bDu7e61>2yfPQ z61zuf%$fj_K_*vFN_g|X0{IKv_JSx1p?rN&d_ z&Pb`uwC@b~D@?4qK6}Ws%AEc*f*TmMte171G{3q*$2f26&{bv#JRWMXu|>7>rOYu* z-7JpHnw#ynG0wKVih@wJ0;@Zvtd;r&K);J37zV>cZ6YkQmaiVSb8aeGr2}tiHzpa3 z1e1YIk0vXpHf6FsKxEI`G=FnkKKqvtxT?VCOw9Kb^ZSvXwBu)ry~qV-ZRnCiCh$%3 zUh#*KR$zDh@I7;l)eUmBodGo_!#619`G7p(OrY90jZr?3axsoZN`0*(2z{EB24}%5 zLaR9fehrvdqI}y*NOF#PnnUJ#0rx*-R?;t3M?CU>;rN-rvkf>ah^&)YDHi}05&CX{ z4fe6r!G?j@Aw*0Ab?*h~T~_ERxOx0FK)Vs>0h;>?w%EiQ2Fy4Cumx!y_((@V=@MPm z_5gP}>iEYd%8sXO#5s6f%^{=*px)AJn&aNvGWIGKKYK9JRskf@;ZW(V6lnBz{lc^H znL95W^_G-wHJ6r(M6h(!_$~Vm%e!GaKs(8Ij(}S4>B`=fylWkmnP;&T(lN%INxFHM ztiI#11!DH$VFQ8{5rB4TS_cG!V~A1&U~T^s5L3MT7J!{_CB_)Qc!5yW9`^r!=DPQv z^-n~5$}9yGk!68wlwhr{`bZN3D;WJ4_#erZRLaYke70BJN|os^tyH-ppVPCEzhOPN z&D3#qf~Nvv!l~9|S-$1=ZYQv%D10!GitcUt!*=S-cCgEi-8;fH0rlKJ{!dIVM= zgeP9k+T>-T(gQiG1*opnA|kvO&ZnH;`C?^f`VW;U$xXm?Io~cy6@d0yl9c<}>U#{J zoD5Hz9(~HoR_C5fDVDRYSpFtPgc|)6)xmMTd~CVU?zToNW!(H;Z};VraMuYWXHEN^ za<7Cs%LYAVG&a$IXX|e!UEu&Ju$7k^nO}eFwmz%a!t?vp(AMkGdU9Jz5 z4C&ocRoXUGU8&-E2H1Vk3dL^8Cn$(2lCOQsKv$F+=Zx454F2PZN6&AG3WlXXbarkMx--&6&_h*27BZciX+aW#N1p z$~ZvwNB$r-#g%DlwP0$rQ1|X)B>9zE&6KK!YO?f_C}9%Uy^CP=&AG8KgKTLQXUfP6 z>#0fqj85&9YGMhxuOxXRZ{U|M2xhk|Q28TcTTh1`CtHQ%lhuvbCIU1sbhJIr5@Zm3 zi2%SbS7utKS(zV|E3>OxpZ}FoWO<8-EW6S9L|UBSwKw$k&gVIbrZgFNTFOW*#5+!e zwV;8eR;<{7p6LvCMnZHTb{^rIEKhSnl>bHi$3nLz&^_Bh`o-5Y*^pgT55g5_&YZYj zDVCihu~`jE{k;gHztS&ya z`uCJsf)FWT{=v8d2Dadaz)^KVIB(EyfpJ_G{q&Jkn-^hBJqfE_A|N$Ku=mKFjTnK` z1f%3e23monwd1i7!7QtF<>$u%o@STN3W65S)5E}|`Z3cJIi&z$(XcPq=M0er=1NJ_ ziJUwMNnHDP1%qsX7m;$yhQi?B8MN-a;?S;8j;gH%w&Y;X5%tM0m{y(nq1^ob!2PMz zK-Y?Y!8ZtnKbuMQucpW4+9O8-)_r(@WbrZ$qen@Y*dToxMBkZt1%V(GDTs#DOS)aR zee-#Y{STN5Km_HeV*?;7-&vGfIUJ44^$w#nRLOc)P1^hlCmb78aJ z<+UGyh`}SNMe)FDkvx*n)A*aS@2NoUNiZf*Fs&~lI&{EH^--cydMRzxke}X;**!r` z;gPKNuG|ND@TbCFAPbpq1F~_sZwXT+AKhm%xixh{xq%v0nbvM>Mk-hG2?jX>yel0Y z-+O{AitndPwzo>3%vyM{`H98tvA#V8QJM#$RY+FltD`8$OUq@PA+8=Z+}TlEK7kKly@%x94V6%VsgtKPdztSsM~U@ zA_Q4zy)#($JM@2&Ut}s5Gz>tSP%rZ0oc`x+`o0j-l(7j@{xv~>3gtURXNcysh4ao+ zbFmyn-JfuaE4TjDso+Ofp(eWDI@N+ofIEs}K)pCF-Lf7Z@s{Q*k29)O z2=Jq6MI6=!tS!a*%rTOMF%0TxxTO(f+T@$XZ$1PM)%KBqzs3ZWBpxYWcu$1@xqp!A z1Ovz5$45a$oE@61Nyw#T<qh&u{-$xvUcqJXoA5zTROl25__1=raA zK~CLChSyRRVzeo0dLY}M5t~E&l#4;y0ecxY-gUq^CxAq7trlgDO7pW)7i(DeaTnVP zo^mg_4qg|(M?8$r%{EWNL@Kux0qA|V`P}xEoxy&VwGj?{?Mz2E{%#r0?r~hO{BXso z5MCUPlhziXu}mOdW!NJKYjon=O1Qe`-qByVv0W(O9#+n1lXnJb@OIXB@9@q?asnFIH2ai<#yJp z-5k)bMALJkGa6#?3bdr`$!~6UjO^b-Zi4|nD&oeU%7~fT18m!hJIE~3aqbp^0t=Q) z{3ND-A%Lc+v;bsL1lnDjIAc8fIE+pgwavk`FNqNyo8SjyYcRr9UQRs`c|y_8`s5<+eR?ax1hH?ArRgW@`eVQVW!WiA^1;!_ zzIE!#`J*)wPpKW^U6@P>HhAYU^KpPe$1bR_Z z_%|+D|3EYua7^%cM%HwKaAm{RbnG{iAtp2EpN=Ve*%P;1#--$$nsiL0^oo> z63kC9tXP-;qHQgvuwT@V2Bft_9Z(WdU)v@p&9xZuyhCWD}Uw}mAZ&qXHSdILe@sr7E<>j!X(SJ(i)qb zqWoqU77*^|kWV=1-i^y^7Fa16vNMY7#0(GAlAk0bmcQGm3 zk5N61F6HM_q^VDNH62lP0pI%YetDr%r=&kL`2T@IP<243I;+tQ>uPlwg}XL>9{t+A z`|Fq9?wREy+Z$>@>;G(EQB+uEmuF9K>`gW&*lzPF1H2dLkZq ziGb)3GDDGj7NBNAI*7%kv)0@!7*ix@r{_OKs3!nONw-=nIXK(J$b)>;;20h-hM;_B zTi)B629(DWTD~e_ND_1%S7lfAezb)Io)@;%2N@C3*`lm~0g0;R`FOBVdir|w;;}Th9L;q9~ zG1)82DF!c8kMskykba|#zAlCt`6Msn*e?V2&$~NyU&g(UUnTQ9?%Xfh&2#jpDgM4! z4;_a%t5v`%odMXx+J8g(|108{s0DJ%QV5$ib8*dPmLyoWCs;gr|4g%{xIDn89M3c^ z?J^b;ROcy?!frK4Te&@9*CA5BH3F{1QywinAzfGX29udF%;ulI=zHV$D<#3lwqr9_ z1H#VlUo^~o>!3q7*b$bV1+o)9|nIt;Wf~7(_<2@O@R*sn?$ko&rPU zPV4B4O3GC3^8zcSCqA?aN~>emPmOEJUg1x1a~GQ2uR^2pGD3yF`E3OMNj>p#X~D0> zOJfb$A=2{fdi}*`e14fB?u9d_W)z0)N~HXmQCiM>?`PJ9mTHlhm$b8bQM)x}b-+q+ zH9V&gIfez7JCMNIOMl6}BNRy#tsm4Xf^;+5#<8|dJ+q|U%cOUZ(*3eYl1YP%Jy~|p zl8D(Y;+4PxoF@qVr82U09(>GIuoo}<3D^ZsQ=z3z8GhB~1xGs%9=yb_48fir{5&0( zDT0s<1y6utJ)!uszh z^SL;WT;F=e5b>BOcDVEAG87)Uox%DKe2mr&=C3r`DYhj1Vt|$PrkW^ z0H2a@IoffjuoxHjhP?u@2$4*(Wl43Il8qX_jNggow6`~=cHsiK!Z9FRd8>f+cz20m z$WI)!2gPz2rPq{hMiI}#2>L(!D!@^YF(qlx1LFr){FIw(KKVonxmqsa{F>@ryzVDD z4oL9QTL8MN>!vq~_gKx+w`gGmW`rr2N%9{3{(0js_CZbNr z1P_sdwN}A}L3QRUV6%)B&NNH8~;o(i+kjXT`g&qgP}PC!=I>^}^wFcVFC} zqTNTI6Nl1&@86DI5wC)6>}0m(`KT?c7&SbKgkYLO|5qNLJ_?xoH{pJRFNoU=)^!R_ z8wFd;$pwBPOaTaU4xZNp~#hi!=TIX>CKRzD>Xp>_j_gHG?Rue2umNgIW-T$y< z35H&bJH3@`t&x2V#Tx#o34AH7&1j2SY9Q@fex@OA6NW2>Os%uc z&>&Q%n8qf`(m}=2g9&!gr8X)k?fNE)XqHJOSL2TtU{wsR9rBp-$xI^IJ>vp+-rxXo zHfd;z87s^ye_FKMW?r;tQlO=L=f!8J)nqoB(tt(Jwhk5bQ82(v`SA#)uM@ zk7UwHs+&s16)b(BuDUSDyVnR>yp{E!5MZ}UidYnZk3{0KwH_|d3s{B%q> z6j*)gFjHT49m%rsL-D1WxK}7}1Uq597dCmzCKawGpeBD!y%5sDK)4Z`GXyb*oAR-k)T6-sA?Wnto{#w932L)yUQ<629hP*>flEV;JpCvPG|!Avas> z9@ui6u8IKN2~s((G(9ev*#k3Q=VkL668GImrO7XBuu3J&wi-|VtopoAYCpo}49Mzr zVVhp`Idcw5lDeCf0ea#fhx?V5!)NC5221))IYMx z`_GDHG8JC+$LoAjqzmeIuPYc#H`u&2f_}#>YTGL*C_*>jn@sqK{4p9gb; z66b#T*?;|U>e8Wsg z<{G3`oRrV*-<2Cak!i5HA$66%B+uO)ZGI8jkm1o*!Pp5X2$2zNPw*4SXLR?Sg)#Q z=z`n4^V2TC-4pvM{)==^Nf$ZI&O+sXl5b=#9v8%X>0{yat|J;UWXq9!Zhjtwkj3w$ z;lVnmv!R`!d{#d?n60K`CJnwwzAAEwpq-qK!f zZ$bSY@X=aCu;IXL`?L_?o2N`*zuj2p)0aizXu=LIVGpTBn@Q@~v@vMo>nLz7Ds39QXcTtrPevEWCxp^qUZzfzOD}zWG#I{cc|rXl*`e%}>pX zq!kP}o8vE6{pY)izxwqn@rr!KzVPy1FoQxP(YC}&5LjZ{bx3!Yap_iQFUfv^>Zkmb zy~G-qX9CB6H5ZkGYa$&OgyJ^_oqFA!%H|Uw@n%s9LRHd&|FV#jlJ^)nn4}T({CgUT z3*DGt$(J0wW~QFml$7o;zx^ZA^8JridMG+_;{616cz9O&Nyh7MeH1)0+USj|8g5s& z*{`+wEyQE4GNWVJX6xS$4;>x~`Y;WR{YJm05Ni2@Zu&@AQJ4-{-E)*REh3h9tnOX1 zWs~773|X@06VA7nwZ}IKex1kQe~?-Jx1_%IDKLsVW;TD1HpFHf+lsS{R5ww9Xsft7 z-Z4NUKwTO>M%0KmEG<6vp+CZ$VjjP=M)>3vt9NP7Lv2@Kf%8SPZ-2fbtWEQPNMHs^ zB=0_wAR`!O5b>0q0Y6i5#fqjk7}aNRd3ft5M4d8Wx*bgF^y~qyIhjX{1i^y!BzDWp z4Vgiw?05oU)!a6eeQ;?s{Z{^B(0|~zbI%$10;~%fM0q literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_keepgoeat_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_keepgoeat_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..bb67d4d5a8e4f9a69b0c42d15e3c1e9cd1e59ec1 GIT binary patch literal 9570 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_keepgoeat_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_keepgoeat_round.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb9983805266b5b1c42a2c4658da46fa654e258 GIT binary patch literal 13107 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 N002ovPDHLkV1j#K?(YBq literal 0 HcmV?d00001 From 075ee339acbc53c2fa5fd8fed08c05538b456d44 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Fri, 13 Jan 2023 23:26:41 +0900 Subject: [PATCH 316/745] =?UTF-8?q?=20[docs]=20#126=20=EB=A6=AC=EB=93=9C?= =?UTF-8?q?=EB=AF=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d5a2e700..cd409ac4 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,19 @@ # *🐌  Keep Go Eat - AOS 🐌* + + IN SOPT 31st APPJAM 킵고잇 Android 팀 레포입니다.
## 🥗 *****Project***** - **킵고잇(Keep-Go-Eat)** -계속 먹어도 괜찮아. -스트레스 받지 않고 스스로 조절하는 나만의 식습관을 찾아가는 길, 킵고잇 +image + + +좋은 음식은 더 먹고, 나쁜 음식은 덜 먹는 날을 늘려가도록 돕는 +즐거운 식습관 기록 서비스, 킵고잇
From beecd8624c4c1ca3bc327972abb1b904f9e7501f Mon Sep 17 00:00:00 2001 From: YuBeen-Park <74285061+YuBeen-Park@users.noreply.github.com> Date: Fri, 13 Jan 2023 23:52:42 +0900 Subject: [PATCH 317/745] =?UTF-8?q?[mod]=20README=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index cd409ac4..66b3acf2 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,15 @@ IN SOPT 31st APPJAM 킵고잇 Android 팀 레포입니다.
+## *****Screen***** +| | | | | +| :---: | :---: | :---: | :---: | +|`LoginView`|`HomeView`|`HomeView`|`GoalDetailView`| +| | | | +|`GoalDetailView`|`GoalSettingView`|`MyPageView`| + +
+ ## 👋 *****Contributors***** | [@YuBeen-Park](https://github.com/YuBeen-Park) | [@Dani43](https://github.com/Dan2dani) | [@youngjinc](https://github.com/youngjinc) | From ae34297d0677b05ce6b7ef5f16b9b6ffbc1e0523 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Fri, 13 Jan 2023 23:56:45 +0900 Subject: [PATCH 318/745] =?UTF-8?q?=20[docs]=20#126=20=EB=A6=AC=EB=93=9C?= =?UTF-8?q?=EB=AF=B8=20=EC=98=81=EC=83=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 66b3acf2..21a6f398 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ IN SOPT 31st APPJAM 킵고잇 Android 팀 레포입니다.
-## *****Screen***** +## 📷 *****Screen***** | | | | | | :---: | :---: | :---: | :---: | |`LoginView`|`HomeView`|`HomeView`|`GoalDetailView`| @@ -28,10 +28,10 @@ IN SOPT 31st APPJAM 킵고잇 Android 팀 레포입니다. ## 👋 *****Contributors***** -| [@YuBeen-Park](https://github.com/YuBeen-Park) | [@Dani43](https://github.com/Dan2dani) | [@youngjinc](https://github.com/youngjinc) | -| :---: | :---: | :---: | -|||| -|`HomeView`|`LoginView`, `OnBoardingView`|`GoalSettingView`, `GoalDetailView`| +| [@YuBeen-Park](https://github.com/YuBeen-Park) | [@Dani43](https://github.com/Dan2dani) | [@youngjinc](https://github.com/youngjinc) | +|:------------------------------------------------------------------------------------------------------------------------------:| :---: | :---: | +| ||| +| `HomeView`, `MyPageView` |`LoginView`, `OnBoardingView`|`GoalSettingView`, `GoalDetailView`|
From 4cab6fcadcb101f8c94cf75c5001cdeae20417d6 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Fri, 13 Jan 2023 23:59:51 +0900 Subject: [PATCH 319/745] =?UTF-8?q?=20[docs]=20#126=20=EB=A6=AC=EB=93=9C?= =?UTF-8?q?=EB=AF=B8=20=EC=98=81=EC=83=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 21a6f398..3245981b 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,10 @@ IN SOPT 31st APPJAM 킵고잇 Android 팀 레포입니다. ## 📷 *****Screen***** | | | | | -| :---: | :---: | :---: | :---: | -|`LoginView`|`HomeView`|`HomeView`|`GoalDetailView`| -| | | | -|`GoalDetailView`|`GoalSettingView`|`MyPageView`| +| :---: | :---: | :---: |:------------------------------------------------------------------------------------------------------------------------------:| +|`LoginView`|`HomeView`|`HomeView`| `GoalDetailView` | +| | | | +|`GoalDetailView`|`GoalSettingView`|`MyPageView`| |
From 1502b9ce23f2f211176db40d7e59a1da3b043754 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sat, 14 Jan 2023 00:38:26 +0900 Subject: [PATCH 320/745] =?UTF-8?q?=20[feat]=20#127=20=EC=9D=91=EC=9B=90?= =?UTF-8?q?=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=A4=84=EB=B0=94=EA=BF=88=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9=EB=90=98=EB=8F=84=EB=A1=9D=20=EA=B0=9C?= =?UTF-8?q?=ED=96=89=EB=AC=B8=EC=9E=90=EB=A5=BC=20"\\n"=20->=20"\n"=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/presentation/home/HomeViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 30dc2feb..2c2be9d2 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -58,7 +58,7 @@ class HomeViewModel @Inject constructor( private fun fetchGoalList() { viewModelScope.launch { goalRepository.fetchHomeEntireData()?.let { homeData -> - _cheeringMessage.value = homeData.cheeringMessage + _cheeringMessage.value = homeData.cheeringMessage.replace("\\n", "\n") _achievedState.value = false _goalList.value = homeData.toHomeGoal().toMutableList() _goalCount.value = homeData.goals.size From e58cc93c933afda0092668cb2fb7851d2711cba6 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sat, 14 Jan 2023 03:54:34 +0900 Subject: [PATCH 321/745] =?UTF-8?q?=20[fix]=20#129=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B2=84=ED=8A=BC=EC=9D=84=EC=9A=A9?= =?UTF-8?q?=EB=B9=A0=EB=A5=B4=EA=B2=8C=20=EC=97=B0=EC=86=8D=20=EB=91=90?= =?UTF-8?q?=EB=B2=88=20=ED=81=B4=EB=A6=AD=ED=95=98=EB=A9=B4=20=EB=8F=99?= =?UTF-8?q?=EC=9D=BC=ED=95=9C=20=EB=AA=A9=ED=91=9C=EA=B0=80=20=EB=91=90?= =?UTF-8?q?=EA=B0=9C=20=EC=B6=94=EA=B0=80=EB=90=98=EB=8A=94=20=EB=B2=84?= =?UTF-8?q?=EA=B7=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/setting/GoalSettingActivity.kt | 3 ++- .../java/org/keepgoeat/util/extension/ViewExt.kt | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt index 301fb183..34d36b3c 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt @@ -14,6 +14,7 @@ import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity import org.keepgoeat.util.extension.getParcelable +import org.keepgoeat.util.extension.setOnSingleClickListener import org.keepgoeat.util.extension.showKeyboard import org.keepgoeat.util.extension.showToast import org.keepgoeat.util.safeValueOf @@ -70,7 +71,7 @@ class GoalSettingActivity : binding.ivBack.setOnClickListener { finish() } - binding.btnComplete.setOnClickListener { + binding.btnComplete.setOnSingleClickListener { showKeyboard(it, false) viewModel.uploadGoal() } diff --git a/app/src/main/java/org/keepgoeat/util/extension/ViewExt.kt b/app/src/main/java/org/keepgoeat/util/extension/ViewExt.kt index 9c7c07ee..a4a6ede9 100644 --- a/app/src/main/java/org/keepgoeat/util/extension/ViewExt.kt +++ b/app/src/main/java/org/keepgoeat/util/extension/ViewExt.kt @@ -7,3 +7,17 @@ fun View.showSnackbar(message: String, isShort: Boolean = true) { val duration = if (isShort) Snackbar.LENGTH_SHORT else Snackbar.LENGTH_LONG Snackbar.make(this, message, duration).show() } + +inline fun View.setOnSingleClickListener( + delay: Long = 500L, + crossinline block: (View) -> Unit, +) { + var previousClickedTime = 0L + setOnClickListener { view -> + val clickedTime = System.currentTimeMillis() + if (clickedTime - previousClickedTime >= delay) { + block(view) + previousClickedTime = clickedTime + } + } +} From 47c8769fbea169d6291f0a1ef677dfa4a661baf9 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Sat, 21 Jan 2023 20:24:58 +0900 Subject: [PATCH 322/745] =?UTF-8?q?=20[fix]=20#110=20manifestPlaceholders?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20=EC=8B=9C=20KAKAO=5FNATIVE=5FKEY?= =?UTF-8?q?=EB=A5=BC=20=EC=B0=BE=EC=9D=84=20=EC=88=98=20=EC=97=86=EB=8A=94?= =?UTF-8?q?=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d40e7acf..d17fb359 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -31,10 +31,10 @@ android { buildTypes { debug { - manifestPlaceholders = [KAKAO_NATIVE_APP_KEY: properties["KAKAO_NATIVE_KEY"]] + manifestPlaceholders = [KAKAO_NATIVE_KEY: properties["KAKAO_NATIVE_KEY"]] } release { - manifestPlaceholders = [KAKAO_NATIVE_APP_KEY: properties["KAKAO_NATIVE_KEY"]] + manifestPlaceholders = [KAKAO_NATIVE_KEY: properties["KAKAO_NATIVE_KEY"]] minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } From 10b526b2425bf05fdeb791cf6c6470fd3de4d0e7 Mon Sep 17 00:00:00 2001 From: Daeun Date: Thu, 2 Feb 2023 22:10:22 +0900 Subject: [PATCH 323/745] =?UTF-8?q?[feat]=20#132=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B2=84=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 5 ++ .../data/service/NaverAuthService.kt | 54 +++++++++++++++++++ .../main/java/org/keepgoeat/di/SignModule.kt | 10 +++- .../presentation/sign/SignActivity.kt | 13 +++-- app/src/main/res/values/strings.xml | 3 +- 5 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt diff --git a/app/build.gradle b/app/build.gradle index d17fb359..8332134d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,6 +27,8 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" buildConfigField "String", "KGE_BASE_URL", properties["KGE_BASE_URL"] buildConfigField "String", "KAKAO_NATIVE_KEY", properties["KAKAO_NATIVE_KEY"] + buildConfigField "String", "NAVER_CLIENT_ID", properties["NAVER_CLIENT_ID"] + buildConfigField "String", "NAVER_CLIENT_SECRETE", properties["NAVER_CLIENT_SECRETE"] } buildTypes { @@ -95,6 +97,9 @@ dependencies { // KakaoSignIn implementation "com.kakao.sdk:v2-user:2.12.0" + // NaverSignIn + implementation 'com.navercorp.nid:oauth-jdk8:5.3.0' + testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.4' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' diff --git a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt new file mode 100644 index 00000000..abd52503 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt @@ -0,0 +1,54 @@ +package org.keepgoeat.data.service + +import android.content.Context +import com.navercorp.nid.NaverIdLoginSDK +import com.navercorp.nid.oauth.OAuthLoginCallback +import dagger.hilt.android.qualifiers.ActivityContext +import org.keepgoeat.BuildConfig +import org.keepgoeat.data.datasource.local.KGEDataSource +import org.keepgoeat.domain.repository.AuthRepository +import timber.log.Timber +import javax.inject.Inject + +class NaverAuthService @Inject constructor( + @ActivityContext private val context: Context, + private val authRepository: AuthRepository, + private val localStorage: KGEDataSource, +) { + init { + NaverIdLoginSDK.initialize( + context, BuildConfig.NAVER_CLIENT_ID, BuildConfig.NAVER_CLIENT_SECRETE, + CLIENT_NAME + ) + } + + fun loginNaver(loginListener: ((Boolean, Boolean) -> Unit)) { + val oauthLoginCallback = object : OAuthLoginCallback { + override fun onSuccess() { +// val naverToken = NaverIdLoginSDK.getAccessToken() +// var naverRefreshToken = NaverIdLoginSDK.getRefreshToken() +// var naverExpiresAt = NaverIdLoginSDK.getExpiresAt().toString() +// var naverTokenType = NaverIdLoginSDK.getTokenType() +// var naverState = NaverIdLoginSDK.getState().toString() +// +// NidOAuthLogin().callProfileApi(profileCallback) + } + + override fun onFailure(httpStatus: Int, message: String) { + Timber.i(NaverIdLoginSDK.getLastErrorCode().code) + Timber.i(NaverIdLoginSDK.getLastErrorDescription()) + } + + override fun onError(errorCode: Int, message: String) { + onFailure(errorCode, message) + } + } + NaverIdLoginSDK.authenticate( + context, oauthLoginCallback + ) + } + + companion object { + private const val CLIENT_NAME = "KeepGoEat" + } +} \ No newline at end of file diff --git a/app/src/main/java/org/keepgoeat/di/SignModule.kt b/app/src/main/java/org/keepgoeat/di/SignModule.kt index bedfcbfc..710ac40b 100644 --- a/app/src/main/java/org/keepgoeat/di/SignModule.kt +++ b/app/src/main/java/org/keepgoeat/di/SignModule.kt @@ -10,6 +10,7 @@ import dagger.hilt.android.qualifiers.ActivityContext import dagger.hilt.android.scopes.ActivityScoped import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.data.service.KakaoAuthService +import org.keepgoeat.data.service.NaverAuthService import org.keepgoeat.domain.repository.AuthRepository @Module @@ -20,10 +21,17 @@ object SignModule { fun provideUserApiClient(): UserApiClient = UserApiClient.instance @Provides - fun provideSignService( + fun provideKakaoSignService( @ActivityContext context: Context, client: UserApiClient, authRepository: AuthRepository, localStorage: KGEDataSource, ) = KakaoAuthService(context, client, authRepository, localStorage) + + @Provides + fun provideNaverSignService( + @ActivityContext context: Context, + authRepository: AuthRepository, + localStorage: KGEDataSource, + ) = NaverAuthService(context, authRepository, localStorage) } diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt index 631107bb..bd3a6844 100644 --- a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.data.service.KakaoAuthService +import org.keepgoeat.data.service.NaverAuthService import org.keepgoeat.databinding.ActivitySignBinding import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.onboarding.OnboardingActivity @@ -15,7 +16,10 @@ import javax.inject.Inject @AndroidEntryPoint class SignActivity : BindingActivity(R.layout.activity_sign) { @Inject - lateinit var signService: KakaoAuthService + lateinit var kakaoSignService: KakaoAuthService + + @Inject + lateinit var naverSignService: NaverAuthService override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -23,8 +27,11 @@ class SignActivity : BindingActivity(R.layout.activity_sign } private fun addListeners() { - binding.layoutSignIn.setOnClickListener { - signService.loginKakao(::moveToNext) + binding.layoutKakaoSignIn.setOnClickListener { + kakaoSignService.loginKakao(::moveToNext) + } + binding.layoutNaverSignIn.setOnClickListener { + naverSignService.loginNaver(::moveToNext) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d786280d..f12d1485 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,7 +12,8 @@ %s 덜 먹기 - 카카오톡 로그인 + 카카오톡 로그인 + 네이버 로그인 식습관 관리, 같이 천천히 시작해볼까요?\n먹는 재미는 언제나 소중하니까! 자동 로그인이 만료되었습니다. From c218775c4825b68b4ef4fb57a9253ca130ea9acd Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Thu, 2 Feb 2023 23:19:25 +0900 Subject: [PATCH 324/745] =?UTF-8?q?[chore]=20#131=20drawable=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EB=AA=85=20img->ic=20=EC=88=98=EC=A0=95,=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=A0=95=EB=A0=AC=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= =?UTF-8?q?(/>)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/presentation/home/HomeActivity.kt | 2 +- app/src/main/res/drawable/background_cheer_msg.xml | 8 ++++---- app/src/main/res/drawable/background_goal_info.xml | 7 ++++--- app/src/main/res/drawable/background_goal_list.xml | 7 ++++--- app/src/main/res/drawable/background_sign_box.xml | 6 +++--- .../{img_plate_gray_view.xml => ic_plate_gray.xml} | 0 ...l_orange_cheer.xml => ic_snail_orange_cheer_right.xml} | 0 ...snail_orange_hungry.xml => ic_snail_orange_hungry.xml} | 0 ...il_orange_spoon.xml => ic_snail_orange_spoon_left.xml} | 0 app/src/main/res/layout/activity_home.xml | 4 ++-- app/src/main/res/layout/dialog_bottom_home.xml | 2 +- 11 files changed, 19 insertions(+), 17 deletions(-) rename app/src/main/res/drawable/{img_plate_gray_view.xml => ic_plate_gray.xml} (100%) rename app/src/main/res/drawable/{img_snail_orange_cheer.xml => ic_snail_orange_cheer_right.xml} (100%) rename app/src/main/res/drawable/{img_snail_orange_hungry.xml => ic_snail_orange_hungry.xml} (100%) rename app/src/main/res/drawable/{ic_snail_orange_spoon.xml => ic_snail_orange_spoon_left.xml} (100%) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 3176c009..6981774e 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -53,7 +53,7 @@ class HomeActivity : BindingActivity(R.layout.activity_home } viewModel.goalCount.observe(this) { goalCount -> if (goalCount == 0) - binding.ivHomeSnail.setImageResource(R.drawable.img_snail_orange_hungry) + binding.ivHomeSnail.setImageResource(R.drawable.ic_snail_orange_hungry) } viewModel.achievedState.observe(this) { isAchieved -> if (isAchieved) { diff --git a/app/src/main/res/drawable/background_cheer_msg.xml b/app/src/main/res/drawable/background_cheer_msg.xml index 2febdc70..81af6f92 100644 --- a/app/src/main/res/drawable/background_cheer_msg.xml +++ b/app/src/main/res/drawable/background_cheer_msg.xml @@ -1,9 +1,9 @@ - - + \ No newline at end of file diff --git a/app/src/main/res/drawable/background_goal_info.xml b/app/src/main/res/drawable/background_goal_info.xml index f61c8636..887b7b5d 100644 --- a/app/src/main/res/drawable/background_goal_info.xml +++ b/app/src/main/res/drawable/background_goal_info.xml @@ -1,8 +1,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/background_goal_list.xml b/app/src/main/res/drawable/background_goal_list.xml index 09ac62ab..03c7e2ca 100644 --- a/app/src/main/res/drawable/background_goal_list.xml +++ b/app/src/main/res/drawable/background_goal_list.xml @@ -1,8 +1,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/background_sign_box.xml b/app/src/main/res/drawable/background_sign_box.xml index 32cd0265..26abb375 100644 --- a/app/src/main/res/drawable/background_sign_box.xml +++ b/app/src/main/res/drawable/background_sign_box.xml @@ -3,7 +3,7 @@ android:height="120dp" android:viewportWidth="288" android:viewportHeight="120"> - + diff --git a/app/src/main/res/drawable/img_plate_gray_view.xml b/app/src/main/res/drawable/ic_plate_gray.xml similarity index 100% rename from app/src/main/res/drawable/img_plate_gray_view.xml rename to app/src/main/res/drawable/ic_plate_gray.xml diff --git a/app/src/main/res/drawable/img_snail_orange_cheer.xml b/app/src/main/res/drawable/ic_snail_orange_cheer_right.xml similarity index 100% rename from app/src/main/res/drawable/img_snail_orange_cheer.xml rename to app/src/main/res/drawable/ic_snail_orange_cheer_right.xml diff --git a/app/src/main/res/drawable/img_snail_orange_hungry.xml b/app/src/main/res/drawable/ic_snail_orange_hungry.xml similarity index 100% rename from app/src/main/res/drawable/img_snail_orange_hungry.xml rename to app/src/main/res/drawable/ic_snail_orange_hungry.xml diff --git a/app/src/main/res/drawable/ic_snail_orange_spoon.xml b/app/src/main/res/drawable/ic_snail_orange_spoon_left.xml similarity index 100% rename from app/src/main/res/drawable/ic_snail_orange_spoon.xml rename to app/src/main/res/drawable/ic_snail_orange_spoon_left.xml diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 82f3e176..722e25c0 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -57,7 +57,7 @@ android:visibility="@{!viewModel.achievedState ? View.VISIBLE : View.INVISIBLE}" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/iv_my_page" - app:srcCompat="@drawable/img_snail_orange_cheer" /> + app:srcCompat="@drawable/ic_snail_orange_cheer_right" /> + app:srcCompat="@drawable/ic_plate_gray" /> From 721bbdf54ae2fbb781ddc319c96b8b15838230a2 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Thu, 2 Feb 2023 23:37:11 +0900 Subject: [PATCH 325/745] =?UTF-8?q?[chore]=20#131=20drawable=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EB=AA=85=20snake=5Fcase=EB=A1=9C=20=EC=88=98=EC=A0=95?= =?UTF-8?q?,=20dimen=20=EC=A0=81=EC=9A=A9,=20textAppearance=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ic_mypage_white.xml => ic_my_page_white.xml} | 0 ...ic_snail_green_ribon.xml => ic_snail_green_ribbon.xml} | 0 app/src/main/res/layout/activity_home.xml | 5 ++--- app/src/main/res/layout/dialog_bottom_goal_keep.xml | 8 ++++---- app/src/main/res/layout/dialog_bottom_home.xml | 2 +- app/src/main/res/layout/item_add_goal.xml | 8 ++++---- app/src/main/res/layout/item_home_goal.xml | 6 +++--- 7 files changed, 14 insertions(+), 15 deletions(-) rename app/src/main/res/drawable/{ic_mypage_white.xml => ic_my_page_white.xml} (100%) rename app/src/main/res/drawable/{ic_snail_green_ribon.xml => ic_snail_green_ribbon.xml} (100%) diff --git a/app/src/main/res/drawable/ic_mypage_white.xml b/app/src/main/res/drawable/ic_my_page_white.xml similarity index 100% rename from app/src/main/res/drawable/ic_mypage_white.xml rename to app/src/main/res/drawable/ic_my_page_white.xml diff --git a/app/src/main/res/drawable/ic_snail_green_ribon.xml b/app/src/main/res/drawable/ic_snail_green_ribbon.xml similarity index 100% rename from app/src/main/res/drawable/ic_snail_green_ribon.xml rename to app/src/main/res/drawable/ic_snail_green_ribbon.xml diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 722e25c0..d5f12ad9 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -79,7 +79,7 @@ android:layout_marginEnd="@dimen/spacing16" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" - app:srcCompat="@drawable/ic_mypage_white" /> + app:srcCompat="@drawable/ic_my_page_white" /> diff --git a/app/src/main/res/layout/dialog_bottom_goal_keep.xml b/app/src/main/res/layout/dialog_bottom_goal_keep.xml index e6849cb3..52a54726 100644 --- a/app/src/main/res/layout/dialog_bottom_goal_keep.xml +++ b/app/src/main/res/layout/dialog_bottom_goal_keep.xml @@ -20,7 +20,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:lineSpacingExtra="4dp" + android:lineSpacingExtra="@dimen/spacing4" android:text="@string/goal_keep_dialog_guide" android:textAlignment="center" android:textAppearance="@style/TextAppearance.System5" @@ -45,7 +45,7 @@ style="@style/Widget.FullButton.Basic" android:layout_width="match_parent" android:layout_marginHorizontal="@dimen/spacing16" - android:layout_marginTop="12dp" + android:layout_marginTop="@dimen/spacing12" android:backgroundTint="@{context.getColor(viewModel.goalDetail.eatingType.buttonBackgroundColor)}" android:onClick="@{() -> viewModel.keepGoal()}" android:text="@string/goal_keep" @@ -58,9 +58,9 @@ android:id="@+id/tv_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="12dp" + android:layout_marginTop="@dimen/spacing12" android:layout_marginBottom="30dp" - android:lineSpacingExtra="4dp" + android:lineSpacingExtra="@dimen/spacing4" android:text="@string/goal_keep_delete_guide" android:textAlignment="center" android:textAppearance="@style/TextAppearance.System6" diff --git a/app/src/main/res/layout/dialog_bottom_home.xml b/app/src/main/res/layout/dialog_bottom_home.xml index 7e74d422..7f3c9727 100644 --- a/app/src/main/res/layout/dialog_bottom_home.xml +++ b/app/src/main/res/layout/dialog_bottom_home.xml @@ -99,7 +99,7 @@ android:layout_marginTop="14dp" android:layout_marginEnd="20dp" android:layout_marginBottom="@dimen/spacing8" - android:src="@drawable/ic_snail_green_ribon" + android:src="@drawable/ic_snail_green_ribbon" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/item_add_goal.xml b/app/src/main/res/layout/item_add_goal.xml index e752f604..3bbc496f 100644 --- a/app/src/main/res/layout/item_add_goal.xml +++ b/app/src/main/res/layout/item_add_goal.xml @@ -13,8 +13,8 @@ android:id="@+id/tv_more_goal" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="16dp" - android:layout_marginTop="24dp" + android:layout_marginStart="@dimen/spacing16" + android:layout_marginTop="@dimen/spacing24" android:text="@string/home_more_goal" android:textAppearance="@style/TextAppearance.System5_Bold" android:textColor="@color/orange_600" @@ -25,7 +25,7 @@ android:id="@+id/tv_add_more_goal" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="16dp" + android:layout_marginStart="@dimen/spacing16" android:layout_marginTop="10dp" android:layout_marginBottom="20dp" android:text="@string/home_two_more_goal" @@ -39,7 +39,7 @@ android:id="@+id/btn_make_goal" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginEnd="16dp" + android:layout_marginEnd="@dimen/spacing16" android:background="@drawable/ic_right" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/item_home_goal.xml b/app/src/main/res/layout/item_home_goal.xml index 1f3ce314..03010596 100644 --- a/app/src/main/res/layout/item_home_goal.xml +++ b/app/src/main/res/layout/item_home_goal.xml @@ -35,9 +35,9 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing16" android:layout_marginTop="@dimen/spacing16" + app:eatingType="@{goalType}" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:eatingType="@{goalType}" /> + app:layout_constraintTop_toTopOf="parent" /> Date: Thu, 2 Feb 2023 23:40:13 +0900 Subject: [PATCH 326/745] =?UTF-8?q?[mod]=20#131=20=ED=99=88=20=EB=B7=B0=20?= =?UTF-8?q?=EC=9D=91=EC=9B=90=EB=A9=94=EC=8B=9C=EC=A7=80=203=EC=A4=84=20?= =?UTF-8?q?=EC=A0=9C=ED=95=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_home.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index d5f12ad9..8a1961b8 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -97,6 +97,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing12" + android:maxLines="3" android:text="@{viewModel.cheeringMessage}" android:textAppearance="@style/TextAppearance.System4_Bold" android:textColor="@color/gray_700" From a3fc2fbfe3dc11d6d475525c2aaf9e7905d74cb5 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sun, 5 Feb 2023 15:37:28 +0900 Subject: [PATCH 327/745] =?UTF-8?q?[mod]=20#131=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EB=8B=AC=EC=84=B1=20=EB=B2=84=ED=8A=BC=20=ED=81=B4=EB=A6=AD=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=EB=84=88=20setOnSingleClickListener=EB=A1=9C?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt | 3 ++- app/src/main/res/layout/item_home_goal.xml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt index ff8a68c5..8a2545fe 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt @@ -13,6 +13,7 @@ import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.presentation.type.HomeBtnType import org.keepgoeat.presentation.type.HomeGoalViewType import org.keepgoeat.util.ItemDiffCallback +import org.keepgoeat.util.extension.setOnSingleClickListener import org.keepgoeat.util.setVisibility class HomeGoalAdapter( @@ -55,7 +56,7 @@ class HomeGoalAdapter( binding.goalBtn = btnType with(binding) { - btnGoal.setOnClickListener { + btnGoalAchieved.setOnSingleClickListener { changeBtnColor(myGoal) } layoutHomeGoal.setOnClickListener { diff --git a/app/src/main/res/layout/item_home_goal.xml b/app/src/main/res/layout/item_home_goal.xml index 03010596..693e0276 100644 --- a/app/src/main/res/layout/item_home_goal.xml +++ b/app/src/main/res/layout/item_home_goal.xml @@ -91,7 +91,7 @@ Date: Sun, 5 Feb 2023 23:16:00 +0900 Subject: [PATCH 328/745] =?UTF-8?q?[add]=20#132=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B2=84=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=EC=97=90=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=9D=B4=EB=AF=B8=EC=A7=80=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 --- app/src/main/res/drawable/ic_kakao.xml | 10 +++++----- app/src/main/res/drawable/ic_naver.xml | 9 +++++++++ 2 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/drawable/ic_naver.xml diff --git a/app/src/main/res/drawable/ic_kakao.xml b/app/src/main/res/drawable/ic_kakao.xml index b09c6a84..e05d34a4 100644 --- a/app/src/main/res/drawable/ic_kakao.xml +++ b/app/src/main/res/drawable/ic_kakao.xml @@ -1,9 +1,9 @@ + android:width="32dp" + android:height="32dp" + android:viewportWidth="32" + android:viewportHeight="32"> diff --git a/app/src/main/res/drawable/ic_naver.xml b/app/src/main/res/drawable/ic_naver.xml new file mode 100644 index 00000000..defb2dfa --- /dev/null +++ b/app/src/main/res/drawable/ic_naver.xml @@ -0,0 +1,9 @@ + + + From 4769fcb783249bee687ee9cc730ae7cb269e2d0d Mon Sep 17 00:00:00 2001 From: Daeun Date: Sun, 5 Feb 2023 23:16:23 +0900 Subject: [PATCH 329/745] =?UTF-8?q?[feat]=20#132=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B2=84=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EB=94=94=EC=9E=90?= =?UTF-8?q?=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/service/NaverAuthService.kt | 2 +- app/src/main/res/layout/activity_sign.xml | 46 +++++++++++++++++-- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt index abd52503..93129e6d 100644 --- a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt @@ -51,4 +51,4 @@ class NaverAuthService @Inject constructor( companion object { private const val CLIENT_NAME = "KeepGoEat" } -} \ No newline at end of file +} diff --git a/app/src/main/res/layout/activity_sign.xml b/app/src/main/res/layout/activity_sign.xml index 22547b32..10df8fb2 100644 --- a/app/src/main/res/layout/activity_sign.xml +++ b/app/src/main/res/layout/activity_sign.xml @@ -13,7 +13,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="@dimen/spacing36" - app:layout_constraintBottom_toBottomOf="parent" + android:layout_marginTop="176dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> @@ -94,14 +94,49 @@ + + + + + + + + @@ -110,6 +145,7 @@ android:id="@+id/iv_kakao_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginVertical="@dimen/spacing8" android:layout_marginStart="20dp" android:src="@drawable/ic_kakao" app:layout_constraintBottom_toBottomOf="parent" @@ -119,7 +155,7 @@ Date: Mon, 6 Feb 2023 16:25:40 +0900 Subject: [PATCH 330/745] =?UTF-8?q?[chore]=20#112=20manifest=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EC=97=90=20package=20=EC=9D=B4=EB=A6=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 --- app/src/main/AndroidManifest.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 593e855c..6b0c2f3a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ + xmlns:tools="http://schemas.android.com/tools" + package="org.keepgoeat"> From 69afda87630b161a98b54ee83d21bffacaf253a2 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 6 Feb 2023 16:45:40 +0900 Subject: [PATCH 331/745] =?UTF-8?q?[feat]=20#112=20DispatcherModule=20(di)?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/di/DispatcherModule.kt | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 app/src/main/java/org/keepgoeat/di/DispatcherModule.kt diff --git a/app/src/main/java/org/keepgoeat/di/DispatcherModule.kt b/app/src/main/java/org/keepgoeat/di/DispatcherModule.kt new file mode 100644 index 00000000..24d8de15 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/di/DispatcherModule.kt @@ -0,0 +1,22 @@ +package org.keepgoeat.di + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers +import javax.inject.Qualifier + +@InstallIn(SingletonComponent::class) +@Module +object DispatcherModule { + @IoDispatcher + @Provides + fun providesIoDispatcher(): CoroutineDispatcher = Dispatchers.IO + +} + +@Retention(AnnotationRetention.BINARY) +@Qualifier +annotation class IoDispatcher From 5ef6f90d2d90cc97fb74e9ff9a88385ce1545cb4 Mon Sep 17 00:00:00 2001 From: Daeun Date: Mon, 6 Feb 2023 16:53:57 +0900 Subject: [PATCH 332/745] =?UTF-8?q?[mod]=20#132=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EB=94=94=EC=9E=90=EC=9D=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_sign.xml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/app/src/main/res/layout/activity_sign.xml b/app/src/main/res/layout/activity_sign.xml index 10df8fb2..ccefcaec 100644 --- a/app/src/main/res/layout/activity_sign.xml +++ b/app/src/main/res/layout/activity_sign.xml @@ -81,16 +81,6 @@ - - Date: Mon, 6 Feb 2023 17:06:26 +0900 Subject: [PATCH 333/745] =?UTF-8?q?[add]=20#132=20PR=20Builder=EC=97=90=20?= =?UTF-8?q?NAVER=5FCLIENT=5FID=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr_builder.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/pr_builder.yml b/.github/workflows/pr_builder.yml index 7579478f..afd9cb4e 100644 --- a/.github/workflows/pr_builder.yml +++ b/.github/workflows/pr_builder.yml @@ -52,6 +52,11 @@ jobs: env: HFM_BASE_URL: ${{ secrets.KGE_BASE_URL }} run: echo "KGE_BASE_URL=\"$KGE_BASE_URL\"" >> local.properties + + - name: Access NAVER_CLIENT_ID + env: + NAVER_CLIENT_ID: ${{ secrets.NAVER_CLIENT_ID }} + run: echo "NAVER_CLIENT_ID=\"$NAVER_CLIENT_ID\"" >> local.properties - name: Lint Check run: ./gradlew ktlintCheck From 6d91ca63dd58aecc281dfdf4489cd539bb974a37 Mon Sep 17 00:00:00 2001 From: Dani43 <77060011+Dan2dani@users.noreply.github.com> Date: Mon, 6 Feb 2023 17:09:09 +0900 Subject: [PATCH 334/745] =?UTF-8?q?[add]=20#132=20PR=20Builder=EC=97=90=20?= =?UTF-8?q?NAVER=5FCLIENT=5FSECRETE=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr_builder.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/pr_builder.yml b/.github/workflows/pr_builder.yml index afd9cb4e..374c996e 100644 --- a/.github/workflows/pr_builder.yml +++ b/.github/workflows/pr_builder.yml @@ -57,6 +57,11 @@ jobs: env: NAVER_CLIENT_ID: ${{ secrets.NAVER_CLIENT_ID }} run: echo "NAVER_CLIENT_ID=\"$NAVER_CLIENT_ID\"" >> local.properties + + - name: Access NAVER_CLIENT_SECRETE + env: + NAVER_CLIENT_SECRETE: ${{ secrets.NAVER_CLIENT_SECRETE }} + run: echo "NAVER_CLIENT_SECRETE=\"$NAVER_CLIENT_SECRETE\"" >> local.properties - name: Lint Check run: ./gradlew ktlintCheck From 588794832d4fe27cc6b36dc514e212296bbf9f5d Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 6 Feb 2023 17:16:27 +0900 Subject: [PATCH 335/745] =?UTF-8?q?[refactor]=20#112=20=ED=99=88=20?= =?UTF-8?q?=EB=B7=B0=20=EB=AA=A9=ED=91=9C=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B3=80=EC=88=98(goalList)=20LiveData=20->=20StateFlow=20?= =?UTF-8?q?=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 --- .../main/java/org/keepgoeat/data/ApiResult.kt | 16 ++++++ .../data/datasource/remote/GoalDataSource.kt | 10 +++- .../data/repository/GoalRepositoryImpl.kt | 19 ++----- .../domain/repository/GoalRepository.kt | 4 +- .../presentation/home/HomeActivity.kt | 9 ++-- .../presentation/home/HomeGoalAdapter.kt | 33 +++++++----- .../presentation/home/HomeViewModel.kt | 50 ++++++++++++++----- 7 files changed, 94 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/ApiResult.kt b/app/src/main/java/org/keepgoeat/data/ApiResult.kt index c814d057..5a4db7f9 100644 --- a/app/src/main/java/org/keepgoeat/data/ApiResult.kt +++ b/app/src/main/java/org/keepgoeat/data/ApiResult.kt @@ -1,7 +1,23 @@ package org.keepgoeat.data +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import retrofit2.HttpException + sealed class ApiResult { data class Success(val data: T) : ApiResult() data class GenericError(val code: Int?, val message: String?) : ApiResult() object NetworkError : ApiResult() } + +fun safeFlow(apiFunc: suspend () -> T): Flow> = flow { + try { + emit(ApiResult.Success(apiFunc.invoke())) + } catch (e: HttpException) { + emit(ApiResult.NetworkError) + } catch (e: Exception) { + emit(ApiResult.GenericError(e.hashCode(), e.message)) + } catch (e: Throwable) { + emit(ApiResult.GenericError(e.hashCode(), e.message)) + } +} diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index f67bdeff..89736f2e 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -1,19 +1,25 @@ package org.keepgoeat.data.datasource.remote +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOn import org.keepgoeat.data.ApiResult import org.keepgoeat.data.model.request.RequestGoalAchievement import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.request.RequestGoalContentTitle import org.keepgoeat.data.model.response.* +import org.keepgoeat.data.safeFlow import org.keepgoeat.data.service.GoalService +import org.keepgoeat.di.IoDispatcher import org.keepgoeat.util.safeApiCall import javax.inject.Inject class GoalDataSource @Inject constructor( private val goalService: GoalService, + @IoDispatcher private val ioDispatcher: CoroutineDispatcher ) { - suspend fun fetchHomeEntireData(): ApiResult = - safeApiCall { goalService.fetchHomeEntireData() } + suspend fun fetchHomeEntireData(): Flow> = + safeFlow { goalService.fetchHomeEntireData().body()?.data }.flowOn(ioDispatcher) suspend fun uploadGoalContent(requestGoalContent: RequestGoalContent): ApiResult = safeApiCall { goalService.uploadGoalContent(requestGoalContent) } diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index e2e5eca6..b8a1d7bb 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -1,5 +1,6 @@ package org.keepgoeat.data.repository +import kotlinx.coroutines.flow.Flow import org.keepgoeat.data.ApiResult import org.keepgoeat.data.datasource.remote.GoalDataSource import org.keepgoeat.data.model.request.RequestGoalAchievement @@ -13,22 +14,8 @@ import javax.inject.Inject class GoalRepositoryImpl @Inject constructor( private val goalDataSource: GoalDataSource, ) : GoalRepository { - override suspend fun fetchHomeEntireData(): ResponseHome.HomeData? { - val result = goalDataSource.fetchHomeEntireData() - return when (result) { - is ApiResult.Success -> { - result.data?.data - } - is ApiResult.NetworkError -> { - Timber.d("Network Error") - null - } - is ApiResult.GenericError -> { - Timber.d("(${result.code}): $(result.message}") - null - } - } - } + override suspend fun fetchHomeEntireData(): Flow> = + goalDataSource.fetchHomeEntireData() override suspend fun achieveGoal( goalId: Int, diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 6187f464..4e7ca07d 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -1,9 +1,10 @@ package org.keepgoeat.domain.repository +import kotlinx.coroutines.flow.Flow +import org.keepgoeat.data.ApiResult import org.keepgoeat.data.model.response.* interface GoalRepository { - suspend fun fetchHomeEntireData(): ResponseHome.HomeData? suspend fun achieveGoal( goalId: Int, isAchieved: Boolean @@ -19,6 +20,7 @@ interface GoalRepository { title: String ): ResponseGoalContent.ResponseGoalContentData? + suspend fun fetchHomeEntireData(): Flow> suspend fun fetchGoalDetail(goalId: Int): ResponseGoalDetail.ResponseGoalDetailData? suspend fun keepGoal(id: Int): ResponseGoalKeep.ResponseGoalKeepData? suspend fun deleteGoal(id: Int): ResponseGoalDeleted.ResponseGoalDeletedData? diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 3176c009..b4708926 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -3,6 +3,7 @@ package org.keepgoeat.presentation.home import android.content.Intent import android.os.Bundle import androidx.activity.viewModels +import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.ActivityHomeBinding @@ -48,8 +49,10 @@ class HomeActivity : BindingActivity(R.layout.activity_home } private fun addObservers() { - viewModel.goalList.observe(this) { goalList -> // EventObserver - goalAdapter.submitList(goalList.toMutableList()) + lifecycleScope.launchWhenStarted { + viewModel.goalList.collect { goalList -> + goalAdapter.submitList(goalList.toMutableList()) + } } viewModel.goalCount.observe(this) { goalCount -> if (goalCount == 0) @@ -80,6 +83,6 @@ class HomeActivity : BindingActivity(R.layout.activity_home } private fun changeGoalItemBtnColor(myGoal: HomeGoal) { - viewModel.changeGoalAchieved(myGoal) + viewModel.changeGoalAchieved(myGoal, goalAdapter) } } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt index ff8a68c5..830088b4 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt @@ -14,6 +14,7 @@ import org.keepgoeat.presentation.type.HomeBtnType import org.keepgoeat.presentation.type.HomeGoalViewType import org.keepgoeat.util.ItemDiffCallback import org.keepgoeat.util.setVisibility +import timber.log.Timber class HomeGoalAdapter( private val changeBtnColor: (HomeGoal) -> Unit, @@ -50,6 +51,7 @@ class HomeGoalAdapter( HomeBtnType.MINUS_NOT_ACHIEVED } } + Timber.d(myGoal.toString()) binding.goal = myGoal binding.goalType = eatingType binding.goalBtn = btnType @@ -130,19 +132,26 @@ class HomeGoalAdapter( override fun getItemViewType(position: Int): Int = currentList[position].type.ordinal override fun submitList(list: MutableList?) { - super.submitList( - list?.plus( - mutableListOf( - HomeGoal( - 0, - "", - false, - false, - 0, - HomeGoalViewType.ADD_GOAL_TYPE + if (list != null && list.isNotEmpty()) { + if (list.last().type == HomeGoalViewType.ADD_GOAL_TYPE) { + super.submitList(list) + } else { + super.submitList( + list.plus( + mutableListOf( + HomeGoal( + 0, + "", + false, + false, + 0, + HomeGoalViewType.ADD_GOAL_TYPE + ) + ) ) ) - ) - ) + } + } + Timber.d("submitList 완료") } } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 2c2be9d2..ddbca7b9 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -5,9 +5,13 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import org.keepgoeat.data.ApiResult import org.keepgoeat.domain.model.HomeGoal import org.keepgoeat.domain.repository.GoalRepository +import timber.log.Timber import java.time.LocalDateTime import javax.inject.Inject @@ -15,27 +19,29 @@ import javax.inject.Inject class HomeViewModel @Inject constructor( private val goalRepository: GoalRepository, ) : ViewModel() { - private var _goalList = MutableLiveData>() - val goalList: LiveData> get() = _goalList + + private var _goalList: MutableStateFlow> = + MutableStateFlow(mutableListOf()) + val goalList get() = _goalList private val _goalCount = MutableLiveData() val goalCount: LiveData get() = _goalCount private val _hour = MutableLiveData(LocalDateTime.now().hour) val hour: LiveData get() = _hour private val _cheeringMessage = MutableLiveData() val cheeringMessage: LiveData get() = _cheeringMessage - private val _achievedState = MutableLiveData() + private val _achievedState = MutableLiveData() // Lottie 변경을 위한 변수 val achievedState: LiveData get() = _achievedState init { fetchGoalList() } - fun changeGoalAchieved(goal: HomeGoal) { - val position = goalList.value?.indexOf(goal) ?: return + fun changeGoalAchieved(goal: HomeGoal, adapter: HomeGoalAdapter) { + val position = goalList.value.indexOf(goal) viewModelScope.launch { goalRepository.achieveGoal(goal.id, !goal.isAchieved)?.let { goalData -> with(goal) { - _goalList.value?.set( + _goalList.value.set( position, HomeGoal( id, @@ -50,19 +56,37 @@ class HomeViewModel @Inject constructor( if (goalData.updatedIsAchieved) _achievedState.value = true _goalList.value = - _goalList.value?.toMutableList() + _goalList.value.toMutableList() + Timber.d(goalList.value.toString()) + adapter.submitList(goalList.value.toMutableList()) } } } private fun fetchGoalList() { viewModelScope.launch { - goalRepository.fetchHomeEntireData()?.let { homeData -> - _cheeringMessage.value = homeData.cheeringMessage.replace("\\n", "\n") - _achievedState.value = false - _goalList.value = homeData.toHomeGoal().toMutableList() - _goalCount.value = homeData.goals.size - } + goalRepository.fetchHomeEntireData() + .collectLatest { result -> + val homeData = when (result) { + is ApiResult.Success -> { + result.data + } + is ApiResult.NetworkError -> { + Timber.d("Network Error") + null + } + is ApiResult.GenericError -> { + Timber.d("(${result.code}): $(result.message}") + null + } + } + if (homeData != null) { + _goalList.value = homeData.toHomeGoal().toMutableList() + _cheeringMessage.value = homeData.cheeringMessage.replace("\\n", "\n") + _achievedState.value = false + _goalCount.value = homeData.goals.size + } + } } } } From ade99efbf8e55e7359fdd1bff5b470ff51adb940 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 6 Feb 2023 17:29:07 +0900 Subject: [PATCH 336/745] =?UTF-8?q?[chore]=20#112=20=EC=BB=A8=EB=B2=A4?= =?UTF-8?q?=EC=85=98=20=EB=A7=9E=EA=B2=8C=20=EC=88=98=EC=A0=95=20(?= =?UTF-8?q?=EC=97=94=ED=84=B0=20=EC=82=AD=EC=A0=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/presentation/home/HomeViewModel.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index ddbca7b9..736d02a7 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -19,7 +19,6 @@ import javax.inject.Inject class HomeViewModel @Inject constructor( private val goalRepository: GoalRepository, ) : ViewModel() { - private var _goalList: MutableStateFlow> = MutableStateFlow(mutableListOf()) val goalList get() = _goalList From 5ef65a3954600ae638025c3a01b92584e45a00c3 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 6 Feb 2023 17:31:25 +0900 Subject: [PATCH 337/745] =?UTF-8?q?=20[fix]=20naver=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EA=B4=80=EB=A0=A8=20=ED=99=98=EA=B2=BD=EB=B3=80?= =?UTF-8?q?=EC=88=98=20job=EC=9D=98=20=EC=9E=98=EB=AA=BB=EB=90=9C=20?= =?UTF-8?q?=EB=93=A4=EC=97=AC=EC=93=B0=EA=B8=B0=EB=A1=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=95=9C=20ci=20=EC=97=90=EB=9F=AC=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr_builder.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/pr_builder.yml b/.github/workflows/pr_builder.yml index 374c996e..7b574ec1 100644 --- a/.github/workflows/pr_builder.yml +++ b/.github/workflows/pr_builder.yml @@ -47,22 +47,22 @@ jobs: env: KAKAO_NATIVE_KEY: ${{ secrets.KAKAO_NATIVE_KEY }} run: echo "KAKAO_NATIVE_KEY=\"$KAKAO_NATIVE_KEY\"" >> local.properties - - - name: Access KGE_BASE_URL - env: - HFM_BASE_URL: ${{ secrets.KGE_BASE_URL }} - run: echo "KGE_BASE_URL=\"$KGE_BASE_URL\"" >> local.properties - - name: Access NAVER_CLIENT_ID + - name: Access NAVER_CLIENT_ID env: NAVER_CLIENT_ID: ${{ secrets.NAVER_CLIENT_ID }} run: echo "NAVER_CLIENT_ID=\"$NAVER_CLIENT_ID\"" >> local.properties - - name: Access NAVER_CLIENT_SECRETE + - name: Access NAVER_CLIENT_SECRETE env: NAVER_CLIENT_SECRETE: ${{ secrets.NAVER_CLIENT_SECRETE }} run: echo "NAVER_CLIENT_SECRETE=\"$NAVER_CLIENT_SECRETE\"" >> local.properties + - name: Access KGE_BASE_URL + env: + HFM_BASE_URL: ${{ secrets.KGE_BASE_URL }} + run: echo "KGE_BASE_URL=\"$KGE_BASE_URL\"" >> local.properties + - name: Lint Check run: ./gradlew ktlintCheck From 0ab780228b9f049beaa01d7737fbed3f05525bac Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 6 Feb 2023 17:38:37 +0900 Subject: [PATCH 338/745] =?UTF-8?q?[chore]=20#112=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/keepgoeat/di/DispatcherModule.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/di/DispatcherModule.kt b/app/src/main/java/org/keepgoeat/di/DispatcherModule.kt index 24d8de15..c5d84369 100644 --- a/app/src/main/java/org/keepgoeat/di/DispatcherModule.kt +++ b/app/src/main/java/org/keepgoeat/di/DispatcherModule.kt @@ -14,7 +14,6 @@ object DispatcherModule { @IoDispatcher @Provides fun providesIoDispatcher(): CoroutineDispatcher = Dispatchers.IO - } @Retention(AnnotationRetention.BINARY) From f4f09cb91bb7f9d8c89827556e83e6d26fb8b769 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 6 Feb 2023 18:28:02 +0900 Subject: [PATCH 339/745] =?UTF-8?q?=20[refactor]=20#138=20=EB=94=94?= =?UTF-8?q?=ED=85=8C=EC=9D=BC=EB=B7=B0=20response=EB=A5=BC=20Result?= =?UTF-8?q?=EB=A1=9C=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/GoalDataSource.kt | 3 +-- .../data/repository/GoalRepositoryImpl.kt | 20 ++++--------------- .../org/keepgoeat/data/service/GoalService.kt | 2 +- .../domain/repository/GoalRepository.kt | 3 ++- 4 files changed, 8 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index f67bdeff..9bdf7683 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -24,8 +24,7 @@ class GoalDataSource @Inject constructor( ): ApiResult = safeApiCall { goalService.editGoalContent(id, title) } - suspend fun fetchGoalDetail(id: Int): ApiResult = - safeApiCall { goalService.fetchGoalDetail(id) } + suspend fun fetchGoalDetail(id: Int): ResponseGoalDetail = goalService.fetchGoalDetail(id) suspend fun keepGoal(id: Int): ApiResult = safeApiCall { goalService.keepGoal(id) } diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index e2e5eca6..eb34ae39 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -6,6 +6,7 @@ import org.keepgoeat.data.model.request.RequestGoalAchievement import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.request.RequestGoalContentTitle import org.keepgoeat.data.model.response.* +import org.keepgoeat.domain.model.GoalDetail import org.keepgoeat.domain.repository.GoalRepository import timber.log.Timber import javax.inject.Inject @@ -92,23 +93,10 @@ class GoalRepositoryImpl @Inject constructor( } } - override suspend fun fetchGoalDetail(goalId: Int): ResponseGoalDetail.ResponseGoalDetailData? { - val result = goalDataSource.fetchGoalDetail(goalId) - - return when (result) { - is ApiResult.Success -> { - result.data?.data - } - is ApiResult.NetworkError -> { - Timber.d("Network Error") - null - } - is ApiResult.GenericError -> { - Timber.d("(${result.code}): ${result.message}") - null - } + override suspend fun fetchGoalDetail(goalId: Int): Result = + runCatching { + goalDataSource.fetchGoalDetail(goalId).data.toGoalDetail() } - } override suspend fun keepGoal(id: Int): ResponseGoalKeep.ResponseGoalKeepData? { val result = goalDataSource.keepGoal(id) diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index d5a38302..6fa9b827 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -21,7 +21,7 @@ interface GoalService { ): Response @GET("history/{goalId}") - suspend fun fetchGoalDetail(@Path("goalId") goalId: Int): Response + suspend fun fetchGoalDetail(@Path("goalId") goalId: Int): ResponseGoalDetail @POST("goal/keep/{goalId}") suspend fun keepGoal(@Path("goalId") id: Int): Response diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 6187f464..efcd6ae1 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -1,6 +1,7 @@ package org.keepgoeat.domain.repository import org.keepgoeat.data.model.response.* +import org.keepgoeat.domain.model.GoalDetail interface GoalRepository { suspend fun fetchHomeEntireData(): ResponseHome.HomeData? @@ -19,7 +20,7 @@ interface GoalRepository { title: String ): ResponseGoalContent.ResponseGoalContentData? - suspend fun fetchGoalDetail(goalId: Int): ResponseGoalDetail.ResponseGoalDetailData? + suspend fun fetchGoalDetail(goalId: Int): Result suspend fun keepGoal(id: Int): ResponseGoalKeep.ResponseGoalKeepData? suspend fun deleteGoal(id: Int): ResponseGoalDeleted.ResponseGoalDeletedData? } From d2eb0d90f6bc788cf129591b8a34c39937848c23 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 6 Feb 2023 20:01:57 +0900 Subject: [PATCH 340/745] =?UTF-8?q?=20[refactor]=20#137=20=EB=94=94?= =?UTF-8?q?=ED=85=8C=EC=9D=BC=EB=B7=B0=20Livedata=20->=20Flow=EB=A1=9C=20?= =?UTF-8?q?=EB=A7=88=EC=9D=B4=EA=B7=B8=EB=A0=88=EC=9D=B4=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalDetailActivity.kt | 32 +++++++++++-------- .../detail/GoalDetailViewModel.kt | 17 ++++++---- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index d9641999..080e1059 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -4,7 +4,11 @@ import android.content.Intent import android.os.Bundle import androidx.activity.OnBackPressedCallback import androidx.activity.viewModels +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import org.keepgoeat.R import org.keepgoeat.databinding.ActivityGoalDetailBinding import org.keepgoeat.presentation.detail.GoalDetailViewModel.Companion.CELL_COUNT @@ -15,11 +19,13 @@ import org.keepgoeat.presentation.my.MyActivity.Companion.ARG_IS_ENTERED_FROM_KE import org.keepgoeat.presentation.setting.GoalSettingActivity import org.keepgoeat.presentation.setting.GoalSettingActivity.Companion.ARG_GOAL_CONTENT import org.keepgoeat.presentation.setting.GoalSettingActivity.Companion.ARG_IS_UPDATED +import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.presentation.type.RecyclerLayoutType import org.keepgoeat.util.ItemDecorationUtil import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity import org.keepgoeat.util.extension.showToast +import org.keepgoeat.util.safeValueOf @AndroidEntryPoint class GoalDetailActivity : @@ -39,6 +45,8 @@ class GoalDetailActivity : binding.lifecycleOwner = this intent.let { + val eatingType = safeValueOf(it.getStringExtra(ARG_EATING_TYPE)) ?: return + adapter = GoalStickerListAdapter(eatingType, CELL_COUNT) val goalId = it.getIntExtra(ARG_GOAL_ID, -1) viewModel.fetchGoalDetailInfo(goalId) isUpdated = it.getBooleanExtra(ARG_IS_UPDATED, false) @@ -47,7 +55,7 @@ class GoalDetailActivity : initLayout() addListeners() - addObservers() + collectData() } private fun initLayout() { @@ -60,6 +68,7 @@ class GoalDetailActivity : ) ) clipToOutline = true + adapter = this@GoalDetailActivity.adapter } } @@ -71,8 +80,12 @@ class GoalDetailActivity : binding.ivKeep.setOnClickListener { showGoalKeepDialog() } - binding.ivEdit.setOnClickListener { - viewModel.goalDetail.value?.let { detail -> + } + + private fun collectData() { + viewModel.goalDetail.flowWithLifecycle(lifecycle).onEach { detail -> + if (detail == null) return@onEach + binding.ivEdit.setOnClickListener { _ -> val content = GoalContent(detail.id, detail.goalTitle) Intent(this, GoalSettingActivity::class.java).apply { putExtra(ARG_GOAL_CONTENT, content) @@ -81,17 +94,10 @@ class GoalDetailActivity : startActivity(it) } } - } - } - - private fun addObservers() { - viewModel.goalDetail.observe(this) { detail -> // TODO 리팩토링 필요 - adapter = GoalStickerListAdapter(detail.eatingType, CELL_COUNT) - binding.rvGoalCard.adapter = adapter - } - viewModel.goalStickers.observe(this) { stickers -> + }.launchIn(lifecycleScope) + viewModel.goalStickers.flowWithLifecycle(lifecycle).onEach { stickers -> adapter.submitList(stickers) - } + }.launchIn(lifecycleScope) viewModel.keepState.observe(this) { keepState -> when (keepState) { is UiState.Success -> { diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt index 0fd75af7..89394acc 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt @@ -5,20 +5,23 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.keepgoeat.domain.model.GoalDetail import org.keepgoeat.domain.model.GoalSticker import org.keepgoeat.domain.repository.GoalRepository import org.keepgoeat.util.UiState +import timber.log.Timber import javax.inject.Inject @HiltViewModel class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRepository) : ViewModel() { - private val _goalStickers = MutableLiveData>() - val goalStickers: LiveData> get() = _goalStickers - private val _goalDetail = MutableLiveData() - val goalDetail: LiveData get() = _goalDetail + private val _goalStickers = MutableStateFlow>(emptyList()) + val goalStickers get() = _goalStickers.asStateFlow() + private val _goalDetail = MutableStateFlow(null) + val goalDetail get() = _goalDetail.asStateFlow() private val _goalId = MutableLiveData() val goalId: LiveData get() = _goalId private val _keepState = MutableLiveData>() @@ -29,11 +32,13 @@ class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRe fun fetchGoalDetailInfo(goalId: Int) { _goalId.value = goalId viewModelScope.launch { - goalRepository.fetchGoalDetail(goalId).let { detail -> - _goalDetail.value = detail?.toGoalDetail() ?: return@launch + goalRepository.fetchGoalDetail(goalId).onSuccess { detail -> + _goalDetail.value = detail _goalStickers.value = Array(CELL_COUNT) { idx -> GoalSticker(idx, idx < detail.thisMonthCount) }.toList() + }.onFailure { + Timber.e(it.message) } } } From d983791c853d1f884506afa62bdb7aaf7c57ed59 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 6 Feb 2023 21:33:09 +0900 Subject: [PATCH 341/745] =?UTF-8?q?=20[refactor]=20#137=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalDetailActivity.kt | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 080e1059..8f691825 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -80,12 +80,8 @@ class GoalDetailActivity : binding.ivKeep.setOnClickListener { showGoalKeepDialog() } - } - - private fun collectData() { - viewModel.goalDetail.flowWithLifecycle(lifecycle).onEach { detail -> - if (detail == null) return@onEach - binding.ivEdit.setOnClickListener { _ -> + binding.ivEdit.setOnClickListener { + viewModel.goalDetail.value?.let { detail -> val content = GoalContent(detail.id, detail.goalTitle) Intent(this, GoalSettingActivity::class.java).apply { putExtra(ARG_GOAL_CONTENT, content) @@ -94,7 +90,10 @@ class GoalDetailActivity : startActivity(it) } } - }.launchIn(lifecycleScope) + } + } + + private fun collectData() { viewModel.goalStickers.flowWithLifecycle(lifecycle).onEach { stickers -> adapter.submitList(stickers) }.launchIn(lifecycleScope) From 39f7cb8854cc78074044ee04075bba07f5e4c15c Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 6 Feb 2023 21:44:18 +0900 Subject: [PATCH 342/745] =?UTF-8?q?=20[fix]=20#137=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=99=84=EB=A3=8C=20=ED=9B=84=20=EB=94=94?= =?UTF-8?q?=ED=85=8C=EC=9D=BC=EB=B7=B0=20=EB=B3=B5=EA=B7=80=20=EC=8B=9C=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EB=90=9C=20=EB=AA=A9?= =?UTF-8?q?=ED=91=9C=20=EB=82=B4=EC=9A=A9=EC=9D=B4=20=EB=B3=B4=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt | 1 + .../org/keepgoeat/presentation/setting/GoalSettingActivity.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 8f691825..02a7f049 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -26,6 +26,7 @@ import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity import org.keepgoeat.util.extension.showToast import org.keepgoeat.util.safeValueOf +import timber.log.Timber @AndroidEntryPoint class GoalDetailActivity : diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt index 34d36b3c..c86fe593 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt @@ -87,6 +87,7 @@ class GoalSettingActivity : val intent = Intent(this, GoalDetailActivity::class.java).apply { putExtra(ARG_GOAL_ID, viewModel.goalId) putExtra(ARG_IS_UPDATED, true) + putExtra(ARG_EATING_TYPE, viewModel.eatingType.value?.name) } intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK startActivity(intent) From b9da7d16844d688231c99dffc03dda7a826d8332 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 6 Feb 2023 21:47:45 +0900 Subject: [PATCH 343/745] =?UTF-8?q?=20[chore]=20#137=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 02a7f049..8f691825 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -26,7 +26,6 @@ import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity import org.keepgoeat.util.extension.showToast import org.keepgoeat.util.safeValueOf -import timber.log.Timber @AndroidEntryPoint class GoalDetailActivity : From a45a4c79895831c86ff53ab2ae10dd4e142866eb Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 6 Feb 2023 22:24:16 +0900 Subject: [PATCH 344/745] =?UTF-8?q?=20[refactor]=20#140=20=EB=A7=88?= =?UTF-8?q?=EC=9D=B4=ED=8E=98=EC=9D=B4=EC=A7=80=EB=B7=B0=20response?= =?UTF-8?q?=EB=A5=BC=20Result=EB=A1=9C=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/MyDataSource.kt | 6 ++--- .../data/repository/MyRepositoryImpl.kt | 24 ++++--------------- .../org/keepgoeat/data/service/MyService.kt | 5 ++-- .../domain/repository/MyRepository.kt | 4 ++-- 4 files changed, 11 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/MyDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/MyDataSource.kt index b80c1408..2525bba8 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/MyDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/MyDataSource.kt @@ -1,14 +1,12 @@ package org.keepgoeat.data.datasource.remote -import org.keepgoeat.data.ApiResult import org.keepgoeat.data.model.response.ResponseMy import org.keepgoeat.data.service.MyService -import org.keepgoeat.util.safeApiCall import javax.inject.Inject class MyDataSource @Inject constructor( private val myService: MyService ) { - suspend fun fetchMyData(sortType: String): ApiResult = - safeApiCall { myService.fetchMyData(sortType) } + suspend fun fetchMyData(sortType: String): ResponseMy = + myService.fetchMyData(sortType) } diff --git a/app/src/main/java/org/keepgoeat/data/repository/MyRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/MyRepositoryImpl.kt index 2bd751bc..fc91afcd 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/MyRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/MyRepositoryImpl.kt @@ -1,29 +1,15 @@ package org.keepgoeat.data.repository -import org.keepgoeat.data.ApiResult import org.keepgoeat.data.datasource.remote.MyDataSource -import org.keepgoeat.data.model.response.ResponseMy +import org.keepgoeat.domain.model.MyGoal import org.keepgoeat.domain.repository.MyRepository -import timber.log.Timber import javax.inject.Inject class MyRepositoryImpl @Inject constructor( - private val myDataSource: MyDataSource + private val myDataSource: MyDataSource, ) : MyRepository { - override suspend fun fetchMyData(sortType: String): ResponseMy.MyData? { - val result = myDataSource.fetchMyData(sortType) - return when (result) { - is ApiResult.Success -> { - result.data?.data - } - is ApiResult.NetworkError -> { - Timber.d("Network Error") - null - } - is ApiResult.GenericError -> { - Timber.d("(${result.code}): $(result.message}") - null - } + override suspend fun fetchMyData(sortType: String): Result> = + runCatching { + myDataSource.fetchMyData(sortType).data.toMyGoal() } - } } diff --git a/app/src/main/java/org/keepgoeat/data/service/MyService.kt b/app/src/main/java/org/keepgoeat/data/service/MyService.kt index 77a077e5..952d8612 100644 --- a/app/src/main/java/org/keepgoeat/data/service/MyService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/MyService.kt @@ -1,13 +1,12 @@ package org.keepgoeat.data.service import org.keepgoeat.data.model.response.ResponseMy -import retrofit2.Response import retrofit2.http.GET import retrofit2.http.Query interface MyService { @GET("mypage") suspend fun fetchMyData( - @Query("sort") value: String - ): Response + @Query("sort") value: String, + ): ResponseMy } diff --git a/app/src/main/java/org/keepgoeat/domain/repository/MyRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/MyRepository.kt index cf1a4c9c..8ff3af0b 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/MyRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/MyRepository.kt @@ -1,7 +1,7 @@ package org.keepgoeat.domain.repository -import org.keepgoeat.data.model.response.ResponseMy +import org.keepgoeat.domain.model.MyGoal interface MyRepository { - suspend fun fetchMyData(sortType: String): ResponseMy.MyData? + suspend fun fetchMyData(sortType: String): Result> } From bc69115d09aff1cee669b7e9c76c1bb0ec40f0ad Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 6 Feb 2023 22:24:43 +0900 Subject: [PATCH 345/745] =?UTF-8?q?=20[refactor]=20#140=20=EB=A7=88?= =?UTF-8?q?=EC=9D=B4=ED=8E=98=EC=9D=B4=EC=A7=80=EB=B7=B0=20Livedata=20->?= =?UTF-8?q?=20Flow=EB=A1=9C=20=EB=A7=88=EC=9D=B4=EA=B7=B8=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/presentation/my/MyActivity.kt | 22 ++++++++++++++----- .../keepgoeat/presentation/my/MyViewModel.kt | 18 +++++++++------ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt index 48fe5226..5a7315b1 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt @@ -4,13 +4,18 @@ import android.content.Intent import android.os.Bundle import androidx.activity.OnBackPressedCallback import androidx.activity.viewModels +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.ConcatAdapter import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import org.keepgoeat.R import org.keepgoeat.databinding.ActivityMyBinding import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.presentation.type.SortType +import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity @AndroidEntryPoint @@ -36,7 +41,7 @@ class MyActivity : BindingActivity(R.layout.activity_my) { initLayout() addListeners() - addObservers() + collectData() } private fun initLayout() { @@ -61,10 +66,17 @@ class MyActivity : BindingActivity(R.layout.activity_my) { } } - private fun addObservers() { - viewModel.goalList.observe(this) { goals -> - goalAdapter.submitList(goals.toMutableList()) - } + private fun collectData() { + viewModel.goalList.flowWithLifecycle(lifecycle).onEach { + when (it) { + is UiState.Success -> { + goalAdapter.submitList(it.data.toMutableList()) + } + is UiState.Error -> {} // TODO state에 따른 ui 업데이트 필요시 작성 + is UiState.Loading -> {} + else -> {} + } + }.launchIn(lifecycleScope) } private fun moveToHome() { diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt index 357d9fb1..f9feb199 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt @@ -1,20 +1,21 @@ package org.keepgoeat.presentation.my -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.keepgoeat.domain.model.MyGoal import org.keepgoeat.domain.repository.MyRepository import org.keepgoeat.presentation.type.SortType +import org.keepgoeat.util.UiState import javax.inject.Inject @HiltViewModel class MyViewModel @Inject constructor(private val myRepository: MyRepository) : ViewModel() { - private val _goalList = MutableLiveData>() - val goalList: LiveData> get() = _goalList + private val _goalList = MutableStateFlow>>(UiState.Loading) + val goalList get() = _goalList.asStateFlow() init { fetchAchievedGoalBySort(SortType.ALL) @@ -22,9 +23,12 @@ class MyViewModel @Inject constructor(private val myRepository: MyRepository) : fun fetchAchievedGoalBySort(sortType: SortType) { viewModelScope.launch { - myRepository.fetchMyData(sortType.name.lowercase())?.let { MyData -> - _goalList.value = MyData.toMyGoal() - } + myRepository.fetchMyData(sortType.name.lowercase()) + .onSuccess { + _goalList.value = UiState.Success(it) + }.onFailure { + _goalList.value = UiState.Error(it.message) + } } } } From bd1750ebdffd456dbc73ddfa0ef144b512a177c6 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 6 Feb 2023 22:31:50 +0900 Subject: [PATCH 346/745] =?UTF-8?q?=20[chore]=20#140=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/presentation/my/MyActivity.kt | 2 +- .../java/org/keepgoeat/presentation/my/MyViewModel.kt | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt index 5a7315b1..a420ca38 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt @@ -67,7 +67,7 @@ class MyActivity : BindingActivity(R.layout.activity_my) { } private fun collectData() { - viewModel.goalList.flowWithLifecycle(lifecycle).onEach { + viewModel.achievedGoalUiState.flowWithLifecycle(lifecycle).onEach { when (it) { is UiState.Success -> { goalAdapter.submitList(it.data.toMutableList()) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt index f9feb199..c0a451ac 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt @@ -14,8 +14,8 @@ import javax.inject.Inject @HiltViewModel class MyViewModel @Inject constructor(private val myRepository: MyRepository) : ViewModel() { - private val _goalList = MutableStateFlow>>(UiState.Loading) - val goalList get() = _goalList.asStateFlow() + private val _achievedGoalUiState = MutableStateFlow>>(UiState.Loading) + val achievedGoalUiState get() = _achievedGoalUiState.asStateFlow() init { fetchAchievedGoalBySort(SortType.ALL) @@ -25,9 +25,9 @@ class MyViewModel @Inject constructor(private val myRepository: MyRepository) : viewModelScope.launch { myRepository.fetchMyData(sortType.name.lowercase()) .onSuccess { - _goalList.value = UiState.Success(it) + _achievedGoalUiState.value = UiState.Success(it) }.onFailure { - _goalList.value = UiState.Error(it.message) + _achievedGoalUiState.value = UiState.Error(it.message) } } } From 7ccfe816d3fd995b698fa3485f50c269cb1c05e5 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 7 Feb 2023 01:12:24 +0900 Subject: [PATCH 347/745] =?UTF-8?q?=20[refactor]=20#142=20=EB=AA=A9?= =?UTF-8?q?=ED=91=9C=20=EC=B6=94=EA=B0=80=EB=B7=B0=20response=EB=A5=BC=20R?= =?UTF-8?q?esult=EB=A1=9C=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/GoalDataSource.kt | 9 ++-- .../data/repository/GoalRepositoryImpl.kt | 41 ++++--------------- .../org/keepgoeat/data/service/GoalService.kt | 4 +- .../domain/repository/GoalRepository.kt | 4 +- 4 files changed, 15 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index 9bdf7683..3dd66ff9 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -15,14 +15,13 @@ class GoalDataSource @Inject constructor( suspend fun fetchHomeEntireData(): ApiResult = safeApiCall { goalService.fetchHomeEntireData() } - suspend fun uploadGoalContent(requestGoalContent: RequestGoalContent): ApiResult = - safeApiCall { goalService.uploadGoalContent(requestGoalContent) } + suspend fun uploadGoalContent(requestGoalContent: RequestGoalContent): ResponseGoalContent = + goalService.uploadGoalContent(requestGoalContent) suspend fun editGoalContent( id: Int, - title: RequestGoalContentTitle - ): ApiResult = - safeApiCall { goalService.editGoalContent(id, title) } + title: RequestGoalContentTitle, + ): ResponseGoalContent = goalService.editGoalContent(id, title) suspend fun fetchGoalDetail(id: Int): ResponseGoalDetail = goalService.fetchGoalDetail(id) diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index eb34ae39..b57b0f7f 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -53,44 +53,17 @@ class GoalRepositoryImpl @Inject constructor( override suspend fun uploadGoalContent( title: String, - isMore: Boolean - ): ResponseGoalContent.ResponseGoalContentData? { - val result = goalDataSource.uploadGoalContent(RequestGoalContent(title, isMore)) - - return when (result) { - is ApiResult.Success -> { - result.data?.data - } - is ApiResult.NetworkError -> { - Timber.d("Network Error") - null - } - is ApiResult.GenericError -> { - Timber.d("(${result.code}): ${result.message}") - null - } + isMore: Boolean, + ): Result = + runCatching { + goalDataSource.uploadGoalContent(RequestGoalContent(title, isMore)).data.id } - } override suspend fun editGoalContent( id: Int, - title: String - ): ResponseGoalContent.ResponseGoalContentData? { - val result = goalDataSource.editGoalContent(id, RequestGoalContentTitle(title)) - - return when (result) { - is ApiResult.Success -> { - result.data?.data - } - is ApiResult.NetworkError -> { - Timber.d("Network Error") - null - } - is ApiResult.GenericError -> { - Timber.d("(${result.code}): ${result.message}") - null - } - } + title: String, + ): Result = runCatching { + goalDataSource.editGoalContent(id, RequestGoalContentTitle(title)).data.id } override suspend fun fetchGoalDetail(goalId: Int): Result = diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index 6fa9b827..bfe6c59e 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -12,13 +12,13 @@ interface GoalService { suspend fun fetchHomeEntireData(): Response @POST("goal") - suspend fun uploadGoalContent(@Body request: RequestGoalContent): Response + suspend fun uploadGoalContent(@Body request: RequestGoalContent): ResponseGoalContent @POST("goal/{goalId}") suspend fun editGoalContent( @Path("goalId") id: Int, @Body goalContent: RequestGoalContentTitle - ): Response + ): ResponseGoalContent @GET("history/{goalId}") suspend fun fetchGoalDetail(@Path("goalId") goalId: Int): ResponseGoalDetail diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index efcd6ae1..111bfad7 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -13,12 +13,12 @@ interface GoalRepository { suspend fun uploadGoalContent( title: String, isMore: Boolean - ): ResponseGoalContent.ResponseGoalContentData? + ): Result suspend fun editGoalContent( id: Int, title: String - ): ResponseGoalContent.ResponseGoalContentData? + ): Result suspend fun fetchGoalDetail(goalId: Int): Result suspend fun keepGoal(id: Int): ResponseGoalKeep.ResponseGoalKeepData? From e2c3e1461f2e081de4a375beb93c2821b1e8d80a Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 7 Feb 2023 01:13:45 +0900 Subject: [PATCH 348/745] =?UTF-8?q?=20[refactor]=20#142=20=EB=AA=A9?= =?UTF-8?q?=ED=91=9C=20=EC=B6=94=EA=B0=80=EB=B7=B0=20=20Livedata=20->=20Fl?= =?UTF-8?q?ow=EB=A1=9C=20=EB=A7=88=EC=9D=B4=EA=B7=B8=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../setting/GoalSettingActivity.kt | 15 ++++-- .../setting/GoalSettingViewModel.kt | 46 ++++++++++++------- .../org/keepgoeat/util/extension/FlowExt.kt | 9 ++++ 3 files changed, 48 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/util/extension/FlowExt.kt diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt index c86fe593..7b3c8ca0 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt @@ -3,7 +3,11 @@ package org.keepgoeat.presentation.setting import android.content.Intent import android.os.Bundle import androidx.activity.viewModels +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import org.keepgoeat.R import org.keepgoeat.databinding.ActivityGoalSettingBinding import org.keepgoeat.presentation.detail.GoalDetailActivity @@ -43,12 +47,12 @@ class GoalSettingActivity : } addListeners() - addObservers() + collectData() } - private fun addObservers() { - viewModel.uploadState.observe(this) { state -> - when (state) { + private fun collectData() { + viewModel.uploadState.flowWithLifecycle(lifecycle).onEach { + when (it) { is UiState.Success -> { if (isEditMode) { showToast(getString(R.string.goal_setting_success_edit_toast_message)) @@ -58,9 +62,10 @@ class GoalSettingActivity : moveToHome() } } + is UiState.Error -> {} else -> {} } - } + }.launchIn(lifecycleScope) } private fun addListeners() { diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt index d077c003..ee808824 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt @@ -1,31 +1,38 @@ package org.keepgoeat.presentation.setting -import androidx.lifecycle.* +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import org.keepgoeat.domain.repository.GoalRepository import org.keepgoeat.presentation.model.GoalContent import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.UiState +import org.keepgoeat.util.extension.toStateFlow import org.keepgoeat.util.safeLet +import timber.log.Timber import javax.inject.Inject @HiltViewModel class GoalSettingViewModel @Inject constructor( private val goalRepository: GoalRepository, ) : ViewModel() { - val goalTitle = MutableLiveData() - private val _eatingType = MutableLiveData() - val eatingType: LiveData get() = _eatingType + val goalTitle = MutableStateFlow("") + private val _eatingType = MutableStateFlow(null) + val eatingType get() = _eatingType.asStateFlow() var goalId: Int? = null - val isValidTitle: LiveData - get() = Transformations.map(goalTitle) { title -> + val isValidTitle: StateFlow + get() = goalTitle.map { title -> title.length in 1..15 && title.isNotBlank() && title.matches(TITLE_PATTERN.toRegex()) - } + }.toStateFlow(viewModelScope, false) - private val _uploadState = MutableLiveData>(UiState.Loading) - val uploadState: LiveData> get() = _uploadState + private val _uploadState = MutableStateFlow>(UiState.Loading) + val uploadState: StateFlow> get() = _uploadState fun uploadGoal() { if (goalId == null) addGoal() @@ -35,11 +42,13 @@ class GoalSettingViewModel @Inject constructor( private fun addGoal() { viewModelScope.launch { goalRepository.uploadGoalContent( - goalTitle.value ?: return@launch, + goalTitle.value.trim(), eatingType.value == EatingType.MORE - ).let { result -> - _uploadState.value = - if (result?.id != null) UiState.Success(result.id) else UiState.Empty + ).onSuccess { + _uploadState.value = UiState.Success(it) + }.onFailure { + _uploadState.value = UiState.Error(it.message) + Timber.e(it.message) } } } @@ -47,10 +56,13 @@ class GoalSettingViewModel @Inject constructor( private fun editGoal() { viewModelScope.launch { safeLet(goalId, goalTitle.value) { id, title -> - goalRepository.editGoalContent(id, title).let { result -> - _uploadState.value = - if (result?.id != null) UiState.Success(result.id) else UiState.Empty - } + goalRepository.editGoalContent(id, title) + .onSuccess { + _uploadState.value = UiState.Success(it) + }.onFailure { + _uploadState.value = UiState.Error(it.message) + Timber.e(it.message) + } } } } diff --git a/app/src/main/java/org/keepgoeat/util/extension/FlowExt.kt b/app/src/main/java/org/keepgoeat/util/extension/FlowExt.kt new file mode 100644 index 00000000..11b9a03b --- /dev/null +++ b/app/src/main/java/org/keepgoeat/util/extension/FlowExt.kt @@ -0,0 +1,9 @@ +package org.keepgoeat.util.extension + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.stateIn + +fun Flow.toStateFlow(coroutineScope: CoroutineScope, initialValue: T) = + stateIn(coroutineScope, SharingStarted.Eagerly, initialValue) From 253c03a295ca5317484cab61609e769116c497c3 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 7 Feb 2023 15:13:42 +0900 Subject: [PATCH 349/745] =?UTF-8?q?[chore]=20#144=20shape,=20selector=20?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/default_dot.xml | 12 ------------ app/src/main/res/drawable/selected_dot.xml | 12 ------------ .../{tab_selector.xml => selector_tab_dot.xml} | 4 ++-- app/src/main/res/drawable/shape_default_dot.xml | 8 ++++++++ app/src/main/res/drawable/shape_selected_dot.xml | 8 ++++++++ app/src/main/res/layout/activity_onboarding.xml | 2 +- 6 files changed, 19 insertions(+), 27 deletions(-) delete mode 100644 app/src/main/res/drawable/default_dot.xml delete mode 100644 app/src/main/res/drawable/selected_dot.xml rename app/src/main/res/drawable/{tab_selector.xml => selector_tab_dot.xml} (58%) create mode 100644 app/src/main/res/drawable/shape_default_dot.xml create mode 100644 app/src/main/res/drawable/shape_selected_dot.xml diff --git a/app/src/main/res/drawable/default_dot.xml b/app/src/main/res/drawable/default_dot.xml deleted file mode 100644 index 0168094d..00000000 --- a/app/src/main/res/drawable/default_dot.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selected_dot.xml b/app/src/main/res/drawable/selected_dot.xml deleted file mode 100644 index a2e0f57e..00000000 --- a/app/src/main/res/drawable/selected_dot.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_selector.xml b/app/src/main/res/drawable/selector_tab_dot.xml similarity index 58% rename from app/src/main/res/drawable/tab_selector.xml rename to app/src/main/res/drawable/selector_tab_dot.xml index b7307674..59cd9d79 100644 --- a/app/src/main/res/drawable/tab_selector.xml +++ b/app/src/main/res/drawable/selector_tab_dot.xml @@ -1,8 +1,8 @@ - - + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_default_dot.xml b/app/src/main/res/drawable/shape_default_dot.xml new file mode 100644 index 00000000..91ac5e51 --- /dev/null +++ b/app/src/main/res/drawable/shape_default_dot.xml @@ -0,0 +1,8 @@ + + + + diff --git a/app/src/main/res/drawable/shape_selected_dot.xml b/app/src/main/res/drawable/shape_selected_dot.xml new file mode 100644 index 00000000..d002c89e --- /dev/null +++ b/app/src/main/res/drawable/shape_selected_dot.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_onboarding.xml b/app/src/main/res/layout/activity_onboarding.xml index 626aed75..6599315d 100644 --- a/app/src/main/res/layout/activity_onboarding.xml +++ b/app/src/main/res/layout/activity_onboarding.xml @@ -23,7 +23,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:tabBackground="@drawable/tab_selector" + app:tabBackground="@drawable/selector_tab_dot" app:tabIndicatorHeight="0dp" app:tabPaddingStart="32dp" /> From 60b2bee3aae36e7b3e8fbe20d78e1cd2d84d7fd2 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 7 Feb 2023 15:15:23 +0900 Subject: [PATCH 350/745] =?UTF-8?q?[refactor]=20#144=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=EB=B7=B0=20livedata=20->=20flow=EB=A1=9C=20=EB=A7=88?= =?UTF-8?q?=EC=9D=B4=EA=B7=B8=EB=A0=88=EC=9D=B4=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/onboarding/OnboardingActivity.kt | 14 +++++++++----- .../presentation/onboarding/OnboardingViewModel.kt | 9 ++++----- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt index 119561e6..44504416 100644 --- a/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingActivity.kt @@ -3,9 +3,13 @@ package org.keepgoeat.presentation.onboarding import android.content.Intent import android.os.Bundle import androidx.activity.viewModels +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.tabs.TabLayoutMediator import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import org.keepgoeat.R import org.keepgoeat.databinding.ActivityOnboardingBinding import org.keepgoeat.presentation.home.HomeActivity @@ -23,7 +27,7 @@ class OnboardingActivity : initLayout() addListeners() - addObservers() + collectData() } private fun initLayout() { @@ -55,14 +59,14 @@ class OnboardingActivity : } } - private fun addObservers() { - viewModel.position.observe(this) { - when (it) { + private fun collectData() { + viewModel.position.flowWithLifecycle(lifecycle).onEach { position -> + when (position) { 0 -> binding.btnNext.setText(R.string.onboarding1_button) 1 -> binding.btnNext.setText(R.string.onboarding2_button) 2 -> binding.btnNext.setText(R.string.onboarding3_button) } - } + }.launchIn(lifecycleScope) } private fun moveToHome() { diff --git a/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingViewModel.kt index 71ff58d8..52bd530f 100644 --- a/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/onboarding/OnboardingViewModel.kt @@ -1,18 +1,17 @@ package org.keepgoeat.presentation.onboarding -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import org.keepgoeat.data.datasource.local.KGEDataSource import javax.inject.Inject @HiltViewModel class OnboardingViewModel @Inject constructor(private val localStorage: KGEDataSource) : ViewModel() { - private val _position: MutableLiveData = MutableLiveData() - val position: LiveData - get() = _position + private val _position = MutableStateFlow(0) + val position get() = _position.asStateFlow() fun setPosition(position: Int) { _position.value = position From 7b9b737ee68682d3e7357e9c9fa91f18f6c42c04 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 7 Feb 2023 15:39:31 +0900 Subject: [PATCH 351/745] =?UTF-8?q?[chore]=20#144=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=EB=B7=B0=20default=20dot=20->=20unselected=20dot?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/selector_tab_dot.xml | 2 +- .../{shape_default_dot.xml => shape_unselected_dot.xml} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename app/src/main/res/drawable/{shape_default_dot.xml => shape_unselected_dot.xml} (100%) diff --git a/app/src/main/res/drawable/selector_tab_dot.xml b/app/src/main/res/drawable/selector_tab_dot.xml index 59cd9d79..6eb31cec 100644 --- a/app/src/main/res/drawable/selector_tab_dot.xml +++ b/app/src/main/res/drawable/selector_tab_dot.xml @@ -4,5 +4,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_default_dot.xml b/app/src/main/res/drawable/shape_unselected_dot.xml similarity index 100% rename from app/src/main/res/drawable/shape_default_dot.xml rename to app/src/main/res/drawable/shape_unselected_dot.xml From 42d4381852073001b214b08867bf58b3a8cd78ca Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 7 Feb 2023 18:27:17 +0900 Subject: [PATCH 352/745] =?UTF-8?q?[chore]=20#132=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B2=84=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20client=20name=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 --- .../org/keepgoeat/data/service/NaverAuthService.kt | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt index 93129e6d..44a14685 100644 --- a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt @@ -25,13 +25,7 @@ class NaverAuthService @Inject constructor( fun loginNaver(loginListener: ((Boolean, Boolean) -> Unit)) { val oauthLoginCallback = object : OAuthLoginCallback { override fun onSuccess() { -// val naverToken = NaverIdLoginSDK.getAccessToken() -// var naverRefreshToken = NaverIdLoginSDK.getRefreshToken() -// var naverExpiresAt = NaverIdLoginSDK.getExpiresAt().toString() -// var naverTokenType = NaverIdLoginSDK.getTokenType() -// var naverState = NaverIdLoginSDK.getState().toString() -// -// NidOAuthLogin().callProfileApi(profileCallback) + // TODO: 네이버 로그인 성공 시 로직 처리 } override fun onFailure(httpStatus: Int, message: String) { @@ -49,6 +43,6 @@ class NaverAuthService @Inject constructor( } companion object { - private const val CLIENT_NAME = "KeepGoEat" + private const val CLIENT_NAME = "킵고잇" } } From d6231fadb764a3f15719994bc729af36e48ff3cc Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 7 Feb 2023 23:22:49 +0900 Subject: [PATCH 353/745] =?UTF-8?q?[mod]=20#146=20=ED=86=A0=ED=81=B0=20?= =?UTF-8?q?=EC=9E=AC=EB=B0=9C=EA=B8=89=20api=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/keepgoeat/data/service/AuthService.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/AuthService.kt b/app/src/main/java/org/keepgoeat/data/service/AuthService.kt index d17f0161..a9b2e2b9 100644 --- a/app/src/main/java/org/keepgoeat/data/service/AuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/AuthService.kt @@ -5,12 +5,13 @@ import org.keepgoeat.data.model.response.ResponseAuth import org.keepgoeat.data.model.response.ResponseRefresh import retrofit2.Response import retrofit2.http.Body +import retrofit2.http.GET import retrofit2.http.POST interface AuthService { @POST("auth") suspend fun login(@Body request: RequestAuth): Response - @POST("auth/refresh") + @GET("auth/refresh") suspend fun refresh(): Response } From 29cb89d424478d48102e953aeba5589cc9663396 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 7 Feb 2023 23:23:23 +0900 Subject: [PATCH 354/745] =?UTF-8?q?[feat]=20#146=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B2=84=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=84=B1=EA=B3=B5?= =?UTF-8?q?=EC=8B=9C=20=EB=A1=9C=EC=A7=81=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/service/NaverAuthService.kt | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt index 44a14685..727daedc 100644 --- a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt @@ -4,8 +4,13 @@ import android.content.Context import com.navercorp.nid.NaverIdLoginSDK import com.navercorp.nid.oauth.OAuthLoginCallback import dagger.hilt.android.qualifiers.ActivityContext +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.keepgoeat.BuildConfig import org.keepgoeat.data.datasource.local.KGEDataSource +import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.domain.repository.AuthRepository import timber.log.Timber import javax.inject.Inject @@ -25,7 +30,24 @@ class NaverAuthService @Inject constructor( fun loginNaver(loginListener: ((Boolean, Boolean) -> Unit)) { val oauthLoginCallback = object : OAuthLoginCallback { override fun onSuccess() { - // TODO: 네이버 로그인 성공 시 로직 처리 + CoroutineScope(Dispatchers.Main).launch { + val result = withContext(Dispatchers.IO) { + NaverIdLoginSDK.getAccessToken()?.let { accessToken -> + RequestAuth( + accessToken, PLATFORM_NAVER + ) + }?.let { + authRepository.login( + it + ) + } + } + Timber.d(NaverIdLoginSDK.getAccessToken()) + loginListener( + result?.type == SIGN_UP, + localStorage.isClickedOnboardingButton + ) + } } override fun onFailure(httpStatus: Int, message: String) { @@ -44,5 +66,7 @@ class NaverAuthService @Inject constructor( companion object { private const val CLIENT_NAME = "킵고잇" + private const val PLATFORM_NAVER = "NAVER" + private const val SIGN_UP = "signup" } } From 7e97b6f19e2958aff8022a97a73ac89741cc06d5 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 7 Feb 2023 23:26:00 +0900 Subject: [PATCH 355/745] =?UTF-8?q?[refactor]=20#112=20=ED=99=88=20?= =?UTF-8?q?=EB=B7=B0=20goalList=20:=20LiveData->flow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/data/ApiResult.kt | 16 --------- .../data/datasource/remote/GoalDataSource.kt | 10 ++---- .../data/repository/GoalRepositoryImpl.kt | 11 +++--- .../org/keepgoeat/data/service/GoalService.kt | 2 +- .../domain/repository/GoalRepository.kt | 2 +- .../presentation/home/HomeActivity.kt | 13 ++++--- .../presentation/home/HomeViewModel.kt | 35 ++++++------------- 7 files changed, 27 insertions(+), 62 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/ApiResult.kt b/app/src/main/java/org/keepgoeat/data/ApiResult.kt index 5a4db7f9..c814d057 100644 --- a/app/src/main/java/org/keepgoeat/data/ApiResult.kt +++ b/app/src/main/java/org/keepgoeat/data/ApiResult.kt @@ -1,23 +1,7 @@ package org.keepgoeat.data -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flow -import retrofit2.HttpException - sealed class ApiResult { data class Success(val data: T) : ApiResult() data class GenericError(val code: Int?, val message: String?) : ApiResult() object NetworkError : ApiResult() } - -fun safeFlow(apiFunc: suspend () -> T): Flow> = flow { - try { - emit(ApiResult.Success(apiFunc.invoke())) - } catch (e: HttpException) { - emit(ApiResult.NetworkError) - } catch (e: Exception) { - emit(ApiResult.GenericError(e.hashCode(), e.message)) - } catch (e: Throwable) { - emit(ApiResult.GenericError(e.hashCode(), e.message)) - } -} diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index a721252f..d026edf0 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -1,25 +1,19 @@ package org.keepgoeat.data.datasource.remote -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flowOn import org.keepgoeat.data.ApiResult import org.keepgoeat.data.model.request.RequestGoalAchievement import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.request.RequestGoalContentTitle import org.keepgoeat.data.model.response.* -import org.keepgoeat.data.safeFlow import org.keepgoeat.data.service.GoalService -import org.keepgoeat.di.IoDispatcher import org.keepgoeat.util.safeApiCall import javax.inject.Inject class GoalDataSource @Inject constructor( private val goalService: GoalService, - @IoDispatcher private val ioDispatcher: CoroutineDispatcher ) { - suspend fun fetchHomeEntireData(): Flow> = - safeFlow { goalService.fetchHomeEntireData().body()?.data }.flowOn(ioDispatcher) + suspend fun fetchHomeEntireData(): ResponseHome = + goalService.fetchHomeEntireData() suspend fun uploadGoalContent(requestGoalContent: RequestGoalContent): ResponseGoalContent = goalService.uploadGoalContent(requestGoalContent) diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index 19aa835d..0bfcdd0f 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -1,12 +1,14 @@ package org.keepgoeat.data.repository -import kotlinx.coroutines.flow.Flow import org.keepgoeat.data.ApiResult import org.keepgoeat.data.datasource.remote.GoalDataSource import org.keepgoeat.data.model.request.RequestGoalAchievement import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.request.RequestGoalContentTitle -import org.keepgoeat.data.model.response.* +import org.keepgoeat.data.model.response.ResponseGoalAchievement +import org.keepgoeat.data.model.response.ResponseGoalDeleted +import org.keepgoeat.data.model.response.ResponseGoalKeep +import org.keepgoeat.data.model.response.ResponseHome import org.keepgoeat.domain.model.GoalDetail import org.keepgoeat.domain.repository.GoalRepository import timber.log.Timber @@ -15,8 +17,9 @@ import javax.inject.Inject class GoalRepositoryImpl @Inject constructor( private val goalDataSource: GoalDataSource, ) : GoalRepository { - override suspend fun fetchHomeEntireData(): Flow> = - goalDataSource.fetchHomeEntireData() + override suspend fun fetchHomeEntireData(): Result = runCatching { + goalDataSource.fetchHomeEntireData().data + } override suspend fun achieveGoal( goalId: Int, diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index bfe6c59e..2db87569 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -9,7 +9,7 @@ import retrofit2.http.* interface GoalService { @GET("home") - suspend fun fetchHomeEntireData(): Response + suspend fun fetchHomeEntireData(): ResponseHome @POST("goal") suspend fun uploadGoalContent(@Body request: RequestGoalContent): ResponseGoalContent diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 111bfad7..8b9bbd57 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -4,7 +4,6 @@ import org.keepgoeat.data.model.response.* import org.keepgoeat.domain.model.GoalDetail interface GoalRepository { - suspend fun fetchHomeEntireData(): ResponseHome.HomeData? suspend fun achieveGoal( goalId: Int, isAchieved: Boolean @@ -20,6 +19,7 @@ interface GoalRepository { title: String ): Result + suspend fun fetchHomeEntireData(): Result suspend fun fetchGoalDetail(goalId: Int): Result suspend fun keepGoal(id: Int): ResponseGoalKeep.ResponseGoalKeepData? suspend fun deleteGoal(id: Int): ResponseGoalDeleted.ResponseGoalDeletedData? diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index b4708926..1bd59b87 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -3,8 +3,9 @@ package org.keepgoeat.presentation.home import android.content.Intent import android.os.Bundle import androidx.activity.viewModels -import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.flowWithLifecycle import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.onEach import org.keepgoeat.R import org.keepgoeat.databinding.ActivityHomeBinding import org.keepgoeat.domain.model.HomeGoal @@ -25,7 +26,7 @@ class HomeActivity : BindingActivity(R.layout.activity_home initLayout() addListeners() - addObservers() + collectData() } private fun addListeners() { @@ -48,11 +49,9 @@ class HomeActivity : BindingActivity(R.layout.activity_home } } - private fun addObservers() { - lifecycleScope.launchWhenStarted { - viewModel.goalList.collect { goalList -> - goalAdapter.submitList(goalList.toMutableList()) - } + private fun collectData() { + viewModel.goalList.flowWithLifecycle(lifecycle).onEach { goalList -> + goalAdapter.submitList(goalList.toMutableList()) } viewModel.goalCount.observe(this) { goalCount -> if (goalCount == 0) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 736d02a7..82baf760 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -6,9 +6,8 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import org.keepgoeat.data.ApiResult import org.keepgoeat.domain.model.HomeGoal import org.keepgoeat.domain.repository.GoalRepository import timber.log.Timber @@ -21,7 +20,7 @@ class HomeViewModel @Inject constructor( ) : ViewModel() { private var _goalList: MutableStateFlow> = MutableStateFlow(mutableListOf()) - val goalList get() = _goalList + val goalList get() = _goalList.asStateFlow() private val _goalCount = MutableLiveData() val goalCount: LiveData get() = _goalCount private val _hour = MutableLiveData(LocalDateTime.now().hour) @@ -64,28 +63,14 @@ class HomeViewModel @Inject constructor( private fun fetchGoalList() { viewModelScope.launch { - goalRepository.fetchHomeEntireData() - .collectLatest { result -> - val homeData = when (result) { - is ApiResult.Success -> { - result.data - } - is ApiResult.NetworkError -> { - Timber.d("Network Error") - null - } - is ApiResult.GenericError -> { - Timber.d("(${result.code}): $(result.message}") - null - } - } - if (homeData != null) { - _goalList.value = homeData.toHomeGoal().toMutableList() - _cheeringMessage.value = homeData.cheeringMessage.replace("\\n", "\n") - _achievedState.value = false - _goalCount.value = homeData.goals.size - } - } + goalRepository.fetchHomeEntireData().onSuccess { homeData -> + _goalList.value = homeData.toHomeGoal().toMutableList() + _cheeringMessage.value = homeData.cheeringMessage.replace("\\n", "\n") + _achievedState.value = false + _goalCount.value = homeData.goals.size + }.onFailure { + Timber.e(it.message) + } } } } From 371bfcced1f0399c11957d24c0ea6949d9d5feef Mon Sep 17 00:00:00 2001 From: Daeun Date: Wed, 8 Feb 2023 20:55:31 +0900 Subject: [PATCH 356/745] =?UTF-8?q?[refactor]=20#148=20response=EB=A5=BC?= =?UTF-8?q?=20Result=EB=A1=9C=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/AuthDataSource.kt | 8 +-- .../data/repository/AuthRepositoryImpl.kt | 50 ++++--------------- .../org/keepgoeat/data/service/AuthService.kt | 5 +- .../data/service/KakaoAuthService.kt | 2 +- .../domain/repository/AuthRepository.kt | 4 +- 5 files changed, 18 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt index 64585ec1..f166fe17 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt @@ -1,19 +1,15 @@ package org.keepgoeat.data.datasource.remote -import org.keepgoeat.data.ApiResult import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.data.model.response.ResponseAuth import org.keepgoeat.data.model.response.ResponseRefresh import org.keepgoeat.data.service.AuthService -import org.keepgoeat.util.safeApiCall import javax.inject.Inject class AuthDataSource @Inject constructor( private val authService: AuthService ) { - suspend fun login(requestAuth: RequestAuth): ApiResult = - safeApiCall { authService.login(requestAuth) } + suspend fun login(requestAuth: RequestAuth): ResponseAuth = authService.login(requestAuth) - suspend fun refresh(): ApiResult = - safeApiCall { authService.refresh() } + suspend fun refresh(): ResponseRefresh = authService.refresh() } diff --git a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt index b197d162..aaa5caed 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt @@ -1,59 +1,31 @@ package org.keepgoeat.data.repository -import org.keepgoeat.data.ApiResult import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.data.datasource.remote.AuthDataSource import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.data.model.response.ResponseAuth import org.keepgoeat.data.model.response.ResponseRefresh import org.keepgoeat.domain.repository.AuthRepository -import timber.log.Timber import javax.inject.Inject class AuthRepositoryImpl @Inject constructor( private val authDataSource: AuthDataSource, private val localStorage: KGEDataSource ) : AuthRepository { - override suspend fun login(requestAuth: RequestAuth): ResponseAuth.ResponseAuthData? { - val result = authDataSource.login(requestAuth) - return when (result) { - is ApiResult.Success -> { - val response = result.data?.data - with(localStorage) { - isLogin = true - response?.let { - accessToken = it.accessToken - refreshToken = it.refreshToken - } + override suspend fun login(requestAuth: RequestAuth): Result = + kotlin.runCatching { + authDataSource.login(requestAuth).data + }.onSuccess { + with(localStorage) { + isLogin = true + it?.let { + accessToken = it.accessToken + refreshToken = it.refreshToken } - Timber.d(result.data?.message) - result.data?.data - } - is ApiResult.NetworkError -> { - Timber.d("Network Error") - null - } - is ApiResult.GenericError -> { - Timber.d("(${result.code}): ${result.message}") - null } } - } - override suspend fun refresh(): ResponseRefresh.ResponseToken? { - val result = authDataSource.refresh() - return when (result) { - is ApiResult.Success -> { - result.data?.data - } - is ApiResult.NetworkError -> { - Timber.d("Network Error") - null - } - is ApiResult.GenericError -> { - Timber.d("(${result.code}): ${result.message}") - null - } - } + override suspend fun refresh(): Result = runCatching { + authDataSource.refresh().data } } diff --git a/app/src/main/java/org/keepgoeat/data/service/AuthService.kt b/app/src/main/java/org/keepgoeat/data/service/AuthService.kt index d17f0161..b159f19b 100644 --- a/app/src/main/java/org/keepgoeat/data/service/AuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/AuthService.kt @@ -3,14 +3,13 @@ package org.keepgoeat.data.service import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.data.model.response.ResponseAuth import org.keepgoeat.data.model.response.ResponseRefresh -import retrofit2.Response import retrofit2.http.Body import retrofit2.http.POST interface AuthService { @POST("auth") - suspend fun login(@Body request: RequestAuth): Response + suspend fun login(@Body request: RequestAuth): ResponseAuth @POST("auth/refresh") - suspend fun refresh(): Response + suspend fun refresh(): ResponseRefresh } diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index 266d7f36..45150c73 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -48,7 +48,7 @@ class KakaoAuthService @Inject constructor( authRepository.login(RequestAuth(oAuthToken.accessToken, PLATFORM_KAKAO)) } Timber.d(oAuthToken.accessToken) - loginListener(result?.type == SIGN_UP, localStorage.isClickedOnboardingButton) + loginListener(result.isSuccess, localStorage.isClickedOnboardingButton) } } } diff --git a/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt index 065a2e32..6e9883ae 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt @@ -5,6 +5,6 @@ import org.keepgoeat.data.model.response.ResponseAuth import org.keepgoeat.data.model.response.ResponseRefresh interface AuthRepository { - suspend fun login(requestAuth: RequestAuth): ResponseAuth.ResponseAuthData? - suspend fun refresh(): ResponseRefresh.ResponseToken? + suspend fun login(requestAuth: RequestAuth): Result + suspend fun refresh(): Result } From 643e1f343bee2b1c236ab16eb562bba3fd219f52 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Wed, 8 Feb 2023 23:07:39 +0900 Subject: [PATCH 357/745] =?UTF-8?q?[refactor]=20#112=20=ED=99=88=20?= =?UTF-8?q?=EB=B7=B0=20liveData->flow=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 3 +- .../data/datasource/remote/GoalDataSource.kt | 4 +- .../model/response/ResponseGoalAchievement.kt | 2 +- .../data/repository/GoalRepositoryImpl.kt | 17 +---- .../org/keepgoeat/data/service/GoalService.kt | 2 +- .../domain/repository/GoalRepository.kt | 7 +- .../presentation/home/HomeActivity.kt | 22 ++++-- .../presentation/home/HomeViewModel.kt | 76 +++++++++---------- app/src/main/res/layout/activity_home.xml | 7 +- 9 files changed, 68 insertions(+), 72 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6b0c2f3a..593e855c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ + xmlns:tools="http://schemas.android.com/tools"> diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index d026edf0..47e1ff0c 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -31,8 +31,8 @@ class GoalDataSource @Inject constructor( suspend fun achievedGoal( id: Int, requestGoalAchievement: RequestGoalAchievement - ): ApiResult = - safeApiCall { goalService.achieveGoal(id, requestGoalAchievement) } + ): ResponseGoalAchievement = + goalService.achieveGoal(id, requestGoalAchievement) suspend fun deleteGoal( id: Int diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalAchievement.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalAchievement.kt index 366a3486..ff8aeced 100644 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalAchievement.kt +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalAchievement.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.Serializable @Serializable data class ResponseGoalAchievement( - val data: ResponseGoalAchievementData?, + val data: ResponseGoalAchievementData, val message: String, val status: Int, val success: Boolean diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index 0bfcdd0f..f9e570ac 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -24,21 +24,8 @@ class GoalRepositoryImpl @Inject constructor( override suspend fun achieveGoal( goalId: Int, isAchieved: Boolean - ): ResponseGoalAchievement.ResponseGoalAchievementData? { - val result = goalDataSource.achievedGoal(goalId, RequestGoalAchievement(isAchieved)) - return when (result) { - is ApiResult.Success -> { - result.data?.data - } - is ApiResult.NetworkError -> { - Timber.d("Network Error") - null - } - is ApiResult.GenericError -> { - Timber.d("(${result.code}): ${result.message}") - null - } - } + ): Result = runCatching { + goalDataSource.achievedGoal(goalId, RequestGoalAchievement(isAchieved)).data } override suspend fun uploadGoalContent( diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index 2db87569..2cb2ca94 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -30,7 +30,7 @@ interface GoalService { suspend fun achieveGoal( @Path("goalId") id: Int, @Body goalAchievement: RequestGoalAchievement - ): Response + ): ResponseGoalAchievement @DELETE("goal/{goalId}") suspend fun deleteGoal( diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 8b9bbd57..8bdae195 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -1,13 +1,16 @@ package org.keepgoeat.domain.repository -import org.keepgoeat.data.model.response.* +import org.keepgoeat.data.model.response.ResponseGoalAchievement +import org.keepgoeat.data.model.response.ResponseGoalDeleted +import org.keepgoeat.data.model.response.ResponseGoalKeep +import org.keepgoeat.data.model.response.ResponseHome import org.keepgoeat.domain.model.GoalDetail interface GoalRepository { suspend fun achieveGoal( goalId: Int, isAchieved: Boolean - ): ResponseGoalAchievement.ResponseGoalAchievementData? + ): Result suspend fun uploadGoalContent( title: String, diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 1bd59b87..d71a6b36 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -4,7 +4,9 @@ import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.keepgoeat.R import org.keepgoeat.databinding.ActivityHomeBinding @@ -13,6 +15,7 @@ import org.keepgoeat.presentation.detail.GoalDetailActivity import org.keepgoeat.presentation.my.MyActivity import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.binding.BindingActivity +import timber.log.Timber @AndroidEntryPoint class HomeActivity : BindingActivity(R.layout.activity_home) { @@ -51,18 +54,21 @@ class HomeActivity : BindingActivity(R.layout.activity_home private fun collectData() { viewModel.goalList.flowWithLifecycle(lifecycle).onEach { goalList -> + Timber.d("goalList collect 중 $goalList") goalAdapter.submitList(goalList.toMutableList()) - } - viewModel.goalCount.observe(this) { goalCount -> - if (goalCount == 0) - binding.ivHomeSnail.setImageResource(R.drawable.img_snail_orange_hungry) - } - viewModel.achievedState.observe(this) { isAchieved -> + }.launchIn(lifecycleScope) + viewModel.goalCount.flowWithLifecycle(lifecycle).onEach { goalCount -> + Timber.d("goalCount collect 중 $goalCount") + if (goalCount > 0) + binding.ivHomeSnail.setImageResource(R.drawable.img_snail_orange_cheer) + }.launchIn(lifecycleScope) + viewModel.achievedState.flowWithLifecycle(lifecycle).onEach { isAchieved -> + Timber.d("isAchieved collect 중 $isAchieved") if (isAchieved) { binding.lottieSnail.playAnimation() binding.lottieBackground.playAnimation() } - } + }.launchIn(lifecycleScope) } private fun showMakeGoalDialog() { @@ -82,6 +88,6 @@ class HomeActivity : BindingActivity(R.layout.activity_home } private fun changeGoalItemBtnColor(myGoal: HomeGoal) { - viewModel.changeGoalAchieved(myGoal, goalAdapter) + viewModel.changeGoalAchieved(myGoal) } } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 82baf760..2c6064d6 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -1,7 +1,5 @@ package org.keepgoeat.presentation.home -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel @@ -21,56 +19,58 @@ class HomeViewModel @Inject constructor( private var _goalList: MutableStateFlow> = MutableStateFlow(mutableListOf()) val goalList get() = _goalList.asStateFlow() - private val _goalCount = MutableLiveData() - val goalCount: LiveData get() = _goalCount - private val _hour = MutableLiveData(LocalDateTime.now().hour) - val hour: LiveData get() = _hour - private val _cheeringMessage = MutableLiveData() - val cheeringMessage: LiveData get() = _cheeringMessage - private val _achievedState = MutableLiveData() // Lottie 변경을 위한 변수 - val achievedState: LiveData get() = _achievedState + private val _goalCount = MutableStateFlow(0) + val goalCount = _goalCount.asStateFlow() + private val _hour = MutableStateFlow(LocalDateTime.now().hour) + val hour = _hour.asStateFlow() + private val _cheeringMessage = MutableStateFlow("") + val cheeringMessage = _cheeringMessage.asStateFlow() + private val _achievedState = MutableStateFlow(false) // Lottie 변경을 위한 변수 + val achievedState get() = _achievedState.asStateFlow() init { fetchGoalList() } - fun changeGoalAchieved(goal: HomeGoal, adapter: HomeGoalAdapter) { + fun changeGoalAchieved(goal: HomeGoal) { val position = goalList.value.indexOf(goal) viewModelScope.launch { - goalRepository.achieveGoal(goal.id, !goal.isAchieved)?.let { goalData -> - with(goal) { - _goalList.value.set( - position, - HomeGoal( - id, - goalTitle, - isMore, - goalData.updatedIsAchieved, - goalData.thisMonthCount, - type + goalRepository.achieveGoal(goal.id, !goal.isAchieved) + .onSuccess { goalData -> + val list = _goalList.value.toMutableList() + with(goal) { + list.set( + position, + HomeGoal( + id, + goalTitle, + isMore, + goalData.updatedIsAchieved, + goalData.thisMonthCount, + type + ) ) - ) + } + if (goalData.updatedIsAchieved) + _achievedState.value = true + _goalList.value = + list.toMutableList() } - if (goalData.updatedIsAchieved) - _achievedState.value = true - _goalList.value = - _goalList.value.toMutableList() - Timber.d(goalList.value.toString()) - adapter.submitList(goalList.value.toMutableList()) - } } } private fun fetchGoalList() { viewModelScope.launch { - goalRepository.fetchHomeEntireData().onSuccess { homeData -> - _goalList.value = homeData.toHomeGoal().toMutableList() - _cheeringMessage.value = homeData.cheeringMessage.replace("\\n", "\n") - _achievedState.value = false - _goalCount.value = homeData.goals.size - }.onFailure { - Timber.e(it.message) - } + goalRepository.fetchHomeEntireData() + .onSuccess { homeData -> + _goalList.value = homeData.toHomeGoal().toMutableList() + _cheeringMessage.value = homeData.cheeringMessage.replace("\\n", "\n") + _achievedState.value = false + _goalCount.value = homeData.goals.size + Timber.d("goalCount : " + goalCount.value) + }.onFailure { + Timber.e(it.message) + } } } } diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 82f3e176..e2ee5596 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -54,10 +54,10 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing16" android:layout_marginTop="32dp" + android:src="@drawable/img_snail_orange_hungry" android:visibility="@{!viewModel.achievedState ? View.VISIBLE : View.INVISIBLE}" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/iv_my_page" - app:srcCompat="@drawable/img_snail_orange_cheer" /> + app:layout_constraintTop_toBottomOf="@+id/iv_my_page" /> + app:visibility="@{viewModel.achievedState}" + tools:visibility="invisible" /> Date: Wed, 8 Feb 2023 23:31:02 +0900 Subject: [PATCH 358/745] =?UTF-8?q?[fix]=20#112=20flow=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=ED=9B=84=20=EB=A1=9C=ED=8B=B0=20=EB=8F=99?= =?UTF-8?q?=EC=9E=91=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/home/HomeActivity.kt | 7 ++++--- .../presentation/home/HomeViewModel.kt | 19 ++++++++++++++----- app/src/main/res/layout/activity_home.xml | 6 +++--- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index d71a6b36..216aebb6 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -62,11 +62,12 @@ class HomeActivity : BindingActivity(R.layout.activity_home if (goalCount > 0) binding.ivHomeSnail.setImageResource(R.drawable.img_snail_orange_cheer) }.launchIn(lifecycleScope) - viewModel.achievedState.flowWithLifecycle(lifecycle).onEach { isAchieved -> - Timber.d("isAchieved collect 중 $isAchieved") - if (isAchieved) { + viewModel.lottieState.flowWithLifecycle(lifecycle).onEach { lottieState -> + Timber.d("isAchieved collect 중 $lottieState") + if (lottieState) { binding.lottieSnail.playAnimation() binding.lottieBackground.playAnimation() + viewModel.changeLottieState(false) } }.launchIn(lifecycleScope) } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 2c6064d6..012f974b 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -25,8 +25,10 @@ class HomeViewModel @Inject constructor( val hour = _hour.asStateFlow() private val _cheeringMessage = MutableStateFlow("") val cheeringMessage = _cheeringMessage.asStateFlow() - private val _achievedState = MutableStateFlow(false) // Lottie 변경을 위한 변수 - val achievedState get() = _achievedState.asStateFlow() + private val _lottieState = MutableStateFlow(false) // Lottie 변경을 위한 변수 + val lottieState get() = _lottieState.asStateFlow() + private val _lottieVisibility = MutableStateFlow(false) + val lottieVisibility get() = _lottieVisibility.asStateFlow() init { fetchGoalList() @@ -51,8 +53,10 @@ class HomeViewModel @Inject constructor( ) ) } - if (goalData.updatedIsAchieved) - _achievedState.value = true + if (goalData.updatedIsAchieved) { + _lottieState.value = true + _lottieVisibility.value = true + } _goalList.value = list.toMutableList() } @@ -65,7 +69,8 @@ class HomeViewModel @Inject constructor( .onSuccess { homeData -> _goalList.value = homeData.toHomeGoal().toMutableList() _cheeringMessage.value = homeData.cheeringMessage.replace("\\n", "\n") - _achievedState.value = false + _lottieState.value = false + _lottieVisibility.value = false _goalCount.value = homeData.goals.size Timber.d("goalCount : " + goalCount.value) }.onFailure { @@ -73,4 +78,8 @@ class HomeViewModel @Inject constructor( } } } + + fun changeLottieState(state: Boolean) { + _lottieState.value = state + } } diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index e2ee5596..04fde81b 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -46,7 +46,7 @@ app:layout_constraintTop_toTopOf="parent" app:lottie_autoPlay="false" app:lottie_rawRes="@raw/home_background" - app:visibility="@{viewModel.achievedState}" /> + app:visibility="@{viewModel.lottieVisibility}" /> @@ -69,7 +69,7 @@ app:layout_constraintTop_toBottomOf="@+id/iv_my_page" app:lottie_autoPlay="false" app:lottie_rawRes="@raw/home_snail" - app:visibility="@{viewModel.achievedState}" + app:visibility="@{viewModel.lottieVisibility}" tools:visibility="invisible" /> Date: Wed, 8 Feb 2023 23:35:38 +0900 Subject: [PATCH 359/745] =?UTF-8?q?[chore]=20#112=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0,?= =?UTF-8?q?=20onFailure=20=EC=9D=BC=20=EB=95=8C=20Timber=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 --- .../presentation/home/HomeActivity.kt | 34 +++++++++---------- .../presentation/home/HomeGoalAdapter.kt | 3 -- .../presentation/home/HomeViewModel.kt | 6 ++-- 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 216aebb6..66f58384 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -15,7 +15,6 @@ import org.keepgoeat.presentation.detail.GoalDetailActivity import org.keepgoeat.presentation.my.MyActivity import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.binding.BindingActivity -import timber.log.Timber @AndroidEntryPoint class HomeActivity : BindingActivity(R.layout.activity_home) { @@ -53,23 +52,22 @@ class HomeActivity : BindingActivity(R.layout.activity_home } private fun collectData() { - viewModel.goalList.flowWithLifecycle(lifecycle).onEach { goalList -> - Timber.d("goalList collect 중 $goalList") - goalAdapter.submitList(goalList.toMutableList()) - }.launchIn(lifecycleScope) - viewModel.goalCount.flowWithLifecycle(lifecycle).onEach { goalCount -> - Timber.d("goalCount collect 중 $goalCount") - if (goalCount > 0) - binding.ivHomeSnail.setImageResource(R.drawable.img_snail_orange_cheer) - }.launchIn(lifecycleScope) - viewModel.lottieState.flowWithLifecycle(lifecycle).onEach { lottieState -> - Timber.d("isAchieved collect 중 $lottieState") - if (lottieState) { - binding.lottieSnail.playAnimation() - binding.lottieBackground.playAnimation() - viewModel.changeLottieState(false) - } - }.launchIn(lifecycleScope) + with(viewModel) { + goalList.flowWithLifecycle(lifecycle).onEach { goalList -> + goalAdapter.submitList(goalList.toMutableList()) + }.launchIn(lifecycleScope) + goalCount.flowWithLifecycle(lifecycle).onEach { goalCount -> + if (goalCount > 0) + binding.ivHomeSnail.setImageResource(R.drawable.img_snail_orange_cheer) + }.launchIn(lifecycleScope) + lottieState.flowWithLifecycle(lifecycle).onEach { lottieState -> + if (lottieState) { + binding.lottieSnail.playAnimation() + binding.lottieBackground.playAnimation() + viewModel.changeLottieState(false) + } + }.launchIn(lifecycleScope) + } } private fun showMakeGoalDialog() { diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt index 830088b4..4f3d2b07 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeGoalAdapter.kt @@ -14,7 +14,6 @@ import org.keepgoeat.presentation.type.HomeBtnType import org.keepgoeat.presentation.type.HomeGoalViewType import org.keepgoeat.util.ItemDiffCallback import org.keepgoeat.util.setVisibility -import timber.log.Timber class HomeGoalAdapter( private val changeBtnColor: (HomeGoal) -> Unit, @@ -51,7 +50,6 @@ class HomeGoalAdapter( HomeBtnType.MINUS_NOT_ACHIEVED } } - Timber.d(myGoal.toString()) binding.goal = myGoal binding.goalType = eatingType binding.goalBtn = btnType @@ -152,6 +150,5 @@ class HomeGoalAdapter( ) } } - Timber.d("submitList 완료") } } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 012f974b..93af13a1 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -25,7 +25,7 @@ class HomeViewModel @Inject constructor( val hour = _hour.asStateFlow() private val _cheeringMessage = MutableStateFlow("") val cheeringMessage = _cheeringMessage.asStateFlow() - private val _lottieState = MutableStateFlow(false) // Lottie 변경을 위한 변수 + private val _lottieState = MutableStateFlow(false) val lottieState get() = _lottieState.asStateFlow() private val _lottieVisibility = MutableStateFlow(false) val lottieVisibility get() = _lottieVisibility.asStateFlow() @@ -60,6 +60,9 @@ class HomeViewModel @Inject constructor( _goalList.value = list.toMutableList() } + .onFailure { + Timber.e(it.message) + } } } @@ -72,7 +75,6 @@ class HomeViewModel @Inject constructor( _lottieState.value = false _lottieVisibility.value = false _goalCount.value = homeData.goals.size - Timber.d("goalCount : " + goalCount.value) }.onFailure { Timber.e(it.message) } From 0401dd8eedac7e73ae8f619c7d3b58c9d511c9b9 Mon Sep 17 00:00:00 2001 From: Daeun Date: Thu, 9 Feb 2023 00:34:24 +0900 Subject: [PATCH 360/745] =?UTF-8?q?[mod]=20#148=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8,=20=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EA=B5=AC=EB=B6=84=ED=95=98=EA=B8=B0=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=EB=B9=84=EA=B5=90=EB=AC=B8=EC=9C=BC=EB=A1=9C=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 --- .../main/java/org/keepgoeat/data/service/KakaoAuthService.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index 45150c73..fb0820e5 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -48,7 +48,9 @@ class KakaoAuthService @Inject constructor( authRepository.login(RequestAuth(oAuthToken.accessToken, PLATFORM_KAKAO)) } Timber.d(oAuthToken.accessToken) - loginListener(result.isSuccess, localStorage.isClickedOnboardingButton) + result?.let { + loginListener(result.getOrThrow()?.type == SIGN_UP, localStorage.isClickedOnboardingButton) + } } } } From 1dfe3f76844ef732cd2a442787f965fc89a2fa4f Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Thu, 9 Feb 2023 00:36:01 +0900 Subject: [PATCH 361/745] =?UTF-8?q?[chore]=20#112=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EB=AA=A8=EB=93=88=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/di/DispatcherModule.kt | 21 ------------------- 1 file changed, 21 deletions(-) delete mode 100644 app/src/main/java/org/keepgoeat/di/DispatcherModule.kt diff --git a/app/src/main/java/org/keepgoeat/di/DispatcherModule.kt b/app/src/main/java/org/keepgoeat/di/DispatcherModule.kt deleted file mode 100644 index c5d84369..00000000 --- a/app/src/main/java/org/keepgoeat/di/DispatcherModule.kt +++ /dev/null @@ -1,21 +0,0 @@ -package org.keepgoeat.di - -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.Dispatchers -import javax.inject.Qualifier - -@InstallIn(SingletonComponent::class) -@Module -object DispatcherModule { - @IoDispatcher - @Provides - fun providesIoDispatcher(): CoroutineDispatcher = Dispatchers.IO -} - -@Retention(AnnotationRetention.BINARY) -@Qualifier -annotation class IoDispatcher From b44e7b54149e5b1cf1a5cb8a301c94590802d6dd Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Thu, 9 Feb 2023 00:53:04 +0900 Subject: [PATCH 362/745] =?UTF-8?q?[refactor]=20#150=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=20API=20response->result=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/GoalDataSource.kt | 3 +-- .../data/model/response/ResponseGoalKeep.kt | 2 +- .../data/repository/GoalRepositoryImpl.kt | 24 ++++++------------- .../org/keepgoeat/data/service/GoalService.kt | 2 +- .../domain/repository/GoalRepository.kt | 7 ++++-- 5 files changed, 15 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index 3dd66ff9..24787c94 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -25,8 +25,7 @@ class GoalDataSource @Inject constructor( suspend fun fetchGoalDetail(id: Int): ResponseGoalDetail = goalService.fetchGoalDetail(id) - suspend fun keepGoal(id: Int): ApiResult = - safeApiCall { goalService.keepGoal(id) } + suspend fun keepGoal(id: Int): ResponseGoalKeep = goalService.keepGoal(id) suspend fun achievedGoal( id: Int, diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalKeep.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalKeep.kt index cb720ac5..3d9dddea 100644 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalKeep.kt +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalKeep.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.Serializable @Serializable data class ResponseGoalKeep( - val data: ResponseGoalKeepData?, + val data: ResponseGoalKeepData, val message: String, val status: Int, val success: Boolean diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index b57b0f7f..d94fa322 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -5,7 +5,10 @@ import org.keepgoeat.data.datasource.remote.GoalDataSource import org.keepgoeat.data.model.request.RequestGoalAchievement import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.request.RequestGoalContentTitle -import org.keepgoeat.data.model.response.* +import org.keepgoeat.data.model.response.ResponseGoalAchievement +import org.keepgoeat.data.model.response.ResponseGoalDeleted +import org.keepgoeat.data.model.response.ResponseGoalKeep +import org.keepgoeat.data.model.response.ResponseHome import org.keepgoeat.domain.model.GoalDetail import org.keepgoeat.domain.repository.GoalRepository import timber.log.Timber @@ -71,23 +74,10 @@ class GoalRepositoryImpl @Inject constructor( goalDataSource.fetchGoalDetail(goalId).data.toGoalDetail() } - override suspend fun keepGoal(id: Int): ResponseGoalKeep.ResponseGoalKeepData? { - val result = goalDataSource.keepGoal(id) - - return when (result) { - is ApiResult.Success -> { - result.data?.data - } - is ApiResult.NetworkError -> { - Timber.d("Network Error") - null - } - is ApiResult.GenericError -> { - Timber.d("(${result.code}): ${result.message}") - null - } + override suspend fun keepGoal(id: Int): Result = + runCatching { + goalDataSource.keepGoal(id).data } - } override suspend fun deleteGoal(id: Int): ResponseGoalDeleted.ResponseGoalDeletedData? { val result = goalDataSource.deleteGoal(id) diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index bfe6c59e..1f51179d 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -24,7 +24,7 @@ interface GoalService { suspend fun fetchGoalDetail(@Path("goalId") goalId: Int): ResponseGoalDetail @POST("goal/keep/{goalId}") - suspend fun keepGoal(@Path("goalId") id: Int): Response + suspend fun keepGoal(@Path("goalId") id: Int): ResponseGoalKeep @POST("goal/achieve/{goalId}") suspend fun achieveGoal( diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 111bfad7..873bb152 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -1,6 +1,9 @@ package org.keepgoeat.domain.repository -import org.keepgoeat.data.model.response.* +import org.keepgoeat.data.model.response.ResponseGoalAchievement +import org.keepgoeat.data.model.response.ResponseGoalDeleted +import org.keepgoeat.data.model.response.ResponseGoalKeep +import org.keepgoeat.data.model.response.ResponseHome import org.keepgoeat.domain.model.GoalDetail interface GoalRepository { @@ -21,6 +24,6 @@ interface GoalRepository { ): Result suspend fun fetchGoalDetail(goalId: Int): Result - suspend fun keepGoal(id: Int): ResponseGoalKeep.ResponseGoalKeepData? + suspend fun keepGoal(id: Int): Result suspend fun deleteGoal(id: Int): ResponseGoalDeleted.ResponseGoalDeletedData? } From 81b480d77935ee60e167d500d6d9264425bbd3cf Mon Sep 17 00:00:00 2001 From: Daeun Date: Thu, 9 Feb 2023 01:00:07 +0900 Subject: [PATCH 363/745] =?UTF-8?q?[chore]=20#148=20klint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/data/service/KakaoAuthService.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index fb0820e5..d9cf5aa6 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -49,7 +49,10 @@ class KakaoAuthService @Inject constructor( } Timber.d(oAuthToken.accessToken) result?.let { - loginListener(result.getOrThrow()?.type == SIGN_UP, localStorage.isClickedOnboardingButton) + loginListener( + result.getOrThrow()?.type == SIGN_UP, + localStorage.isClickedOnboardingButton + ) } } } From c9b78b10ada74a928be9dd12b501dce46c3d8f4a Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Thu, 9 Feb 2023 01:10:11 +0900 Subject: [PATCH 364/745] =?UTF-8?q?[refactor]=20#150=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=20API=20liveData->Flow=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalDetailActivity.kt | 4 ++-- .../presentation/detail/GoalDetailViewModel.kt | 15 ++++++++------- .../detail/GoalKeepBottomDialogFragment.kt | 12 ++++++++---- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 8f691825..7eb5ab10 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -97,7 +97,7 @@ class GoalDetailActivity : viewModel.goalStickers.flowWithLifecycle(lifecycle).onEach { stickers -> adapter.submitList(stickers) }.launchIn(lifecycleScope) - viewModel.keepState.observe(this) { keepState -> + viewModel.keepState.flowWithLifecycle(lifecycle).onEach { keepState -> when (keepState) { is UiState.Success -> { showToast(getString(R.string.goal_detail_success_goal_keep_toast_message)) @@ -110,7 +110,7 @@ class GoalDetailActivity : } else -> {} } - } + }.launchIn(lifecycleScope) viewModel.deleteState.observe(this) { deleteState -> when (deleteState) { is UiState.Success -> { diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt index 89394acc..78f65c4f 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt @@ -22,10 +22,10 @@ class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRe val goalStickers get() = _goalStickers.asStateFlow() private val _goalDetail = MutableStateFlow(null) val goalDetail get() = _goalDetail.asStateFlow() - private val _goalId = MutableLiveData() - val goalId: LiveData get() = _goalId - private val _keepState = MutableLiveData>() - val keepState: LiveData> get() = _keepState + private val _goalId = MutableStateFlow(-1) + val goalId get() = _goalId.asStateFlow() + private val _keepState = MutableStateFlow>(UiState.Loading) + val keepState get() = _keepState.asStateFlow() private val _deleteState = MutableLiveData>() val deleteState: LiveData> get() = _deleteState @@ -46,9 +46,10 @@ class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRe fun keepGoal() { viewModelScope.launch { goalId.value?.let { id -> - goalRepository.keepGoal(id).let { keptData -> - keptData ?: return@launch - _keepState.value = UiState.Success(keptData.goalId) + goalRepository.keepGoal(id).onSuccess { goalData -> + _keepState.value = UiState.Success(goalData.goalId) + }.onFailure { + Timber.e(it.message) } } } diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt index d938caf3..4d64c225 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalKeepBottomDialogFragment.kt @@ -3,7 +3,11 @@ package org.keepgoeat.presentation.detail import android.os.Bundle import android.view.View import androidx.fragment.app.activityViewModels +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import org.keepgoeat.R import org.keepgoeat.databinding.DialogBottomGoalKeepBinding import org.keepgoeat.util.UiState @@ -19,7 +23,7 @@ class GoalKeepBottomDialogFragment : binding.viewModel = viewModel addListeners() - addObservers() + collectData() } private fun addListeners() { @@ -28,15 +32,15 @@ class GoalKeepBottomDialogFragment : } } - private fun addObservers() { - viewModel.keepState.observe(this) { keepState -> + private fun collectData() { + viewModel.keepState.flowWithLifecycle(lifecycle).onEach { keepState -> when (keepState) { is UiState.Success -> { dismiss() } else -> {} } - } + }.launchIn(lifecycleScope) } private fun showGoalDeleteDialog() { From 521bda6a31df7de94490c9a3a2a4cab9a4c134ee Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Thu, 9 Feb 2023 01:12:50 +0900 Subject: [PATCH 365/745] =?UTF-8?q?[refactor]=20#150=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?=20API=20response->result=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/GoalDataSource.kt | 3 +-- .../model/response/ResponseGoalDeleted.kt | 2 +- .../data/repository/GoalRepositoryImpl.kt | 19 +++---------------- .../org/keepgoeat/data/service/GoalService.kt | 2 +- .../domain/repository/GoalRepository.kt | 2 +- 5 files changed, 7 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index 24787c94..7ea6a887 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -35,6 +35,5 @@ class GoalDataSource @Inject constructor( suspend fun deleteGoal( id: Int - ): ApiResult = - safeApiCall { goalService.deleteGoal(id) } + ): ResponseGoalDeleted = goalService.deleteGoal(id) } diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDeleted.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDeleted.kt index 5fbf2ff9..7b1359b1 100644 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDeleted.kt +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDeleted.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.Serializable @Serializable data class ResponseGoalDeleted( - val data: ResponseGoalDeletedData?, + val data: ResponseGoalDeletedData, val message: String, val status: Int, val success: Boolean diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index d94fa322..4472fc81 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -79,21 +79,8 @@ class GoalRepositoryImpl @Inject constructor( goalDataSource.keepGoal(id).data } - override suspend fun deleteGoal(id: Int): ResponseGoalDeleted.ResponseGoalDeletedData? { - val result = goalDataSource.deleteGoal(id) - - return when (result) { - is ApiResult.Success -> { - result.data?.data - } - is ApiResult.NetworkError -> { - Timber.d("Network Error") - null - } - is ApiResult.GenericError -> { - Timber.d("(${result.code}): ${result.message}") - null - } + override suspend fun deleteGoal(id: Int): Result = + runCatching { + goalDataSource.deleteGoal(id).data } - } } diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index 1f51179d..52f85fba 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -35,5 +35,5 @@ interface GoalService { @DELETE("goal/{goalId}") suspend fun deleteGoal( @Path("goalId") id: Int - ): Response + ): ResponseGoalDeleted } diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 873bb152..c4a6130d 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -25,5 +25,5 @@ interface GoalRepository { suspend fun fetchGoalDetail(goalId: Int): Result suspend fun keepGoal(id: Int): Result - suspend fun deleteGoal(id: Int): ResponseGoalDeleted.ResponseGoalDeletedData? + suspend fun deleteGoal(id: Int): Result } From 035b985526ed74794b311fed66cc23b1e4931980 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Thu, 9 Feb 2023 01:18:45 +0900 Subject: [PATCH 366/745] =?UTF-8?q?[refactor]=20#150=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?=20API=20liveData->Flow=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/detail/GoalDetailActivity.kt | 4 ++-- .../presentation/detail/GoalDetailViewModel.kt | 15 +++++++-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 7eb5ab10..7c56a616 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -111,7 +111,7 @@ class GoalDetailActivity : else -> {} } }.launchIn(lifecycleScope) - viewModel.deleteState.observe(this) { deleteState -> + viewModel.deleteState.flowWithLifecycle(lifecycle).onEach { deleteState -> when (deleteState) { is UiState.Success -> { showToast(getString(R.string.goal_detail_success_goal_delete_toast_message)) @@ -120,7 +120,7 @@ class GoalDetailActivity : } else -> {} } - } + }.launchIn(lifecycleScope) } private fun showGoalKeepDialog() { diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt index 78f65c4f..93c05f0f 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailViewModel.kt @@ -1,7 +1,5 @@ package org.keepgoeat.presentation.detail -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel @@ -26,8 +24,8 @@ class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRe val goalId get() = _goalId.asStateFlow() private val _keepState = MutableStateFlow>(UiState.Loading) val keepState get() = _keepState.asStateFlow() - private val _deleteState = MutableLiveData>() - val deleteState: LiveData> get() = _deleteState + private val _deleteState = MutableStateFlow>(UiState.Loading) + val deleteState get() = _deleteState.asStateFlow() fun fetchGoalDetailInfo(goalId: Int) { _goalId.value = goalId @@ -45,7 +43,7 @@ class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRe fun keepGoal() { viewModelScope.launch { - goalId.value?.let { id -> + goalId.value.let { id -> goalRepository.keepGoal(id).onSuccess { goalData -> _keepState.value = UiState.Success(goalData.goalId) }.onFailure { @@ -57,10 +55,11 @@ class GoalDetailViewModel @Inject constructor(private val goalRepository: GoalRe fun deleteGoal() { viewModelScope.launch { - goalId.value?.let { id -> - goalRepository.deleteGoal(id).let { deletedData -> - deletedData ?: return@launch + goalId.value.let { id -> + goalRepository.deleteGoal(id).onSuccess { deletedData -> _deleteState.value = UiState.Success(deletedData.goalId) + }.onFailure { + Timber.e(it.message) } } } From 84dbc12c09ae4d8173353c994231cd24f0b556a0 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Thu, 9 Feb 2023 01:24:35 +0900 Subject: [PATCH 367/745] =?UTF-8?q?[chore]=20#150=20=ED=99=88=20=EB=B7=B0?= =?UTF-8?q?=20flow=20=EB=B3=80=EC=88=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/presentation/home/HomeViewModel.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 93af13a1..fee4c720 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -16,8 +16,7 @@ import javax.inject.Inject class HomeViewModel @Inject constructor( private val goalRepository: GoalRepository, ) : ViewModel() { - private var _goalList: MutableStateFlow> = - MutableStateFlow(mutableListOf()) + private var _goalList = MutableStateFlow>(mutableListOf()) val goalList get() = _goalList.asStateFlow() private val _goalCount = MutableStateFlow(0) val goalCount = _goalCount.asStateFlow() From 9d3af9a705daf9e0be26b28ec2660c9ec08724eb Mon Sep 17 00:00:00 2001 From: Daeun Date: Wed, 8 Feb 2023 20:55:31 +0900 Subject: [PATCH 368/745] =?UTF-8?q?[fix]=20#148=20=EB=A8=B8=EC=A7=80=20con?= =?UTF-8?q?flict=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/AuthDataSource.kt | 8 +-- .../data/repository/AuthRepositoryImpl.kt | 50 ++++--------------- .../data/service/KakaoAuthService.kt | 2 +- .../domain/repository/AuthRepository.kt | 4 +- 4 files changed, 16 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt index 64585ec1..f166fe17 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt @@ -1,19 +1,15 @@ package org.keepgoeat.data.datasource.remote -import org.keepgoeat.data.ApiResult import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.data.model.response.ResponseAuth import org.keepgoeat.data.model.response.ResponseRefresh import org.keepgoeat.data.service.AuthService -import org.keepgoeat.util.safeApiCall import javax.inject.Inject class AuthDataSource @Inject constructor( private val authService: AuthService ) { - suspend fun login(requestAuth: RequestAuth): ApiResult = - safeApiCall { authService.login(requestAuth) } + suspend fun login(requestAuth: RequestAuth): ResponseAuth = authService.login(requestAuth) - suspend fun refresh(): ApiResult = - safeApiCall { authService.refresh() } + suspend fun refresh(): ResponseRefresh = authService.refresh() } diff --git a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt index b197d162..aaa5caed 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt @@ -1,59 +1,31 @@ package org.keepgoeat.data.repository -import org.keepgoeat.data.ApiResult import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.data.datasource.remote.AuthDataSource import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.data.model.response.ResponseAuth import org.keepgoeat.data.model.response.ResponseRefresh import org.keepgoeat.domain.repository.AuthRepository -import timber.log.Timber import javax.inject.Inject class AuthRepositoryImpl @Inject constructor( private val authDataSource: AuthDataSource, private val localStorage: KGEDataSource ) : AuthRepository { - override suspend fun login(requestAuth: RequestAuth): ResponseAuth.ResponseAuthData? { - val result = authDataSource.login(requestAuth) - return when (result) { - is ApiResult.Success -> { - val response = result.data?.data - with(localStorage) { - isLogin = true - response?.let { - accessToken = it.accessToken - refreshToken = it.refreshToken - } + override suspend fun login(requestAuth: RequestAuth): Result = + kotlin.runCatching { + authDataSource.login(requestAuth).data + }.onSuccess { + with(localStorage) { + isLogin = true + it?.let { + accessToken = it.accessToken + refreshToken = it.refreshToken } - Timber.d(result.data?.message) - result.data?.data - } - is ApiResult.NetworkError -> { - Timber.d("Network Error") - null - } - is ApiResult.GenericError -> { - Timber.d("(${result.code}): ${result.message}") - null } } - } - override suspend fun refresh(): ResponseRefresh.ResponseToken? { - val result = authDataSource.refresh() - return when (result) { - is ApiResult.Success -> { - result.data?.data - } - is ApiResult.NetworkError -> { - Timber.d("Network Error") - null - } - is ApiResult.GenericError -> { - Timber.d("(${result.code}): ${result.message}") - null - } - } + override suspend fun refresh(): Result = runCatching { + authDataSource.refresh().data } } diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index 266d7f36..45150c73 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -48,7 +48,7 @@ class KakaoAuthService @Inject constructor( authRepository.login(RequestAuth(oAuthToken.accessToken, PLATFORM_KAKAO)) } Timber.d(oAuthToken.accessToken) - loginListener(result?.type == SIGN_UP, localStorage.isClickedOnboardingButton) + loginListener(result.isSuccess, localStorage.isClickedOnboardingButton) } } } diff --git a/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt index 065a2e32..6e9883ae 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt @@ -5,6 +5,6 @@ import org.keepgoeat.data.model.response.ResponseAuth import org.keepgoeat.data.model.response.ResponseRefresh interface AuthRepository { - suspend fun login(requestAuth: RequestAuth): ResponseAuth.ResponseAuthData? - suspend fun refresh(): ResponseRefresh.ResponseToken? + suspend fun login(requestAuth: RequestAuth): Result + suspend fun refresh(): Result } From 5326c853b5b39887d6363f2871e9aa4c7fbdb010 Mon Sep 17 00:00:00 2001 From: Daeun Date: Thu, 9 Feb 2023 00:34:24 +0900 Subject: [PATCH 369/745] =?UTF-8?q?[mod]=20#148=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8,=20=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EA=B5=AC=EB=B6=84=ED=95=98=EA=B8=B0=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=EB=B9=84=EA=B5=90=EB=AC=B8=EC=9C=BC=EB=A1=9C=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 --- .../main/java/org/keepgoeat/data/service/KakaoAuthService.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index 45150c73..fb0820e5 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -48,7 +48,9 @@ class KakaoAuthService @Inject constructor( authRepository.login(RequestAuth(oAuthToken.accessToken, PLATFORM_KAKAO)) } Timber.d(oAuthToken.accessToken) - loginListener(result.isSuccess, localStorage.isClickedOnboardingButton) + result?.let { + loginListener(result.getOrThrow()?.type == SIGN_UP, localStorage.isClickedOnboardingButton) + } } } } From d6e7a4a0d4f439781a36cb805e46994599319222 Mon Sep 17 00:00:00 2001 From: Daeun Date: Thu, 9 Feb 2023 01:00:07 +0900 Subject: [PATCH 370/745] =?UTF-8?q?[chore]=20#148=20klint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/data/service/KakaoAuthService.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index fb0820e5..d9cf5aa6 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -49,7 +49,10 @@ class KakaoAuthService @Inject constructor( } Timber.d(oAuthToken.accessToken) result?.let { - loginListener(result.getOrThrow()?.type == SIGN_UP, localStorage.isClickedOnboardingButton) + loginListener( + result.getOrThrow()?.type == SIGN_UP, + localStorage.isClickedOnboardingButton + ) } } } From 810fc926fb57c713a3fc6841c34aef1a75c25e38 Mon Sep 17 00:00:00 2001 From: Daeun Date: Thu, 9 Feb 2023 18:53:34 +0900 Subject: [PATCH 371/745] =?UTF-8?q?[mod]=20#148=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B2=84=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=84=B1=EA=B3=B5?= =?UTF-8?q?=ED=96=88=EC=9D=84=20=EB=95=8C=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/data/service/AuthService.kt | 5 ++--- .../data/service/NaverAuthService.kt | 21 ++++++------------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/AuthService.kt b/app/src/main/java/org/keepgoeat/data/service/AuthService.kt index a9b2e2b9..dbcc6c1d 100644 --- a/app/src/main/java/org/keepgoeat/data/service/AuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/AuthService.kt @@ -3,15 +3,14 @@ package org.keepgoeat.data.service import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.data.model.response.ResponseAuth import org.keepgoeat.data.model.response.ResponseRefresh -import retrofit2.Response import retrofit2.http.Body import retrofit2.http.GET import retrofit2.http.POST interface AuthService { @POST("auth") - suspend fun login(@Body request: RequestAuth): Response + suspend fun login(@Body request: RequestAuth): ResponseAuth @GET("auth/refresh") - suspend fun refresh(): Response + suspend fun refresh(): ResponseRefresh } diff --git a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt index 727daedc..67fb105c 100644 --- a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt @@ -30,26 +30,17 @@ class NaverAuthService @Inject constructor( fun loginNaver(loginListener: ((Boolean, Boolean) -> Unit)) { val oauthLoginCallback = object : OAuthLoginCallback { override fun onSuccess() { + val accessToken = requireNotNull(NaverIdLoginSDK.getAccessToken()) CoroutineScope(Dispatchers.Main).launch { val result = withContext(Dispatchers.IO) { - NaverIdLoginSDK.getAccessToken()?.let { accessToken -> - RequestAuth( - accessToken, PLATFORM_NAVER - ) - }?.let { - authRepository.login( - it - ) - } + authRepository.login( + RequestAuth(accessToken, PLATFORM_NAVER) + ) } - Timber.d(NaverIdLoginSDK.getAccessToken()) - loginListener( - result?.type == SIGN_UP, - localStorage.isClickedOnboardingButton - ) + Timber.d(accessToken) + loginListener(result.getOrThrow()?.type == SIGN_UP, localStorage.isClickedOnboardingButton) } } - override fun onFailure(httpStatus: Int, message: String) { Timber.i(NaverIdLoginSDK.getLastErrorCode().code) Timber.i(NaverIdLoginSDK.getLastErrorDescription()) From 08232242dc38b173779034441c4cd14aee07aa48 Mon Sep 17 00:00:00 2001 From: Daeun Date: Thu, 9 Feb 2023 19:24:57 +0900 Subject: [PATCH 372/745] =?UTF-8?q?[mod]=20#148=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=20=EC=8B=9C=20=EC=97=90=EB=9F=AC=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=20=EB=9D=84=EC=9A=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt index aaa5caed..4f7a79eb 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt @@ -6,6 +6,7 @@ import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.data.model.response.ResponseAuth import org.keepgoeat.data.model.response.ResponseRefresh import org.keepgoeat.domain.repository.AuthRepository +import timber.log.Timber import javax.inject.Inject class AuthRepositoryImpl @Inject constructor( @@ -23,6 +24,8 @@ class AuthRepositoryImpl @Inject constructor( refreshToken = it.refreshToken } } + }.onFailure { + Timber.e(it.message) } override suspend fun refresh(): Result = runCatching { From 7c3892ad325a0e4e9588650ea255216cd18b74e2 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 13 Feb 2023 17:04:36 +0900 Subject: [PATCH 373/745] =?UTF-8?q?[chore]=20#112=20=ED=99=88=20=EB=B7=B0?= =?UTF-8?q?=20Lottie=20=EB=B3=80=EC=88=98=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/home/HomeActivity.kt | 6 +++--- .../org/keepgoeat/presentation/home/HomeViewModel.kt | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 66f58384..85f92cb8 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -60,11 +60,11 @@ class HomeActivity : BindingActivity(R.layout.activity_home if (goalCount > 0) binding.ivHomeSnail.setImageResource(R.drawable.img_snail_orange_cheer) }.launchIn(lifecycleScope) - lottieState.flowWithLifecycle(lifecycle).onEach { lottieState -> - if (lottieState) { + isLottieMoving.flowWithLifecycle(lifecycle).onEach { isLottieMoving -> + if (isLottieMoving) { binding.lottieSnail.playAnimation() binding.lottieBackground.playAnimation() - viewModel.changeLottieState(false) + viewModel.makeLottieMove(false) } }.launchIn(lifecycleScope) } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index fee4c720..bc7e1b70 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -24,8 +24,8 @@ class HomeViewModel @Inject constructor( val hour = _hour.asStateFlow() private val _cheeringMessage = MutableStateFlow("") val cheeringMessage = _cheeringMessage.asStateFlow() - private val _lottieState = MutableStateFlow(false) - val lottieState get() = _lottieState.asStateFlow() + private val _isLottieMoving = MutableStateFlow(false) + val isLottieMoving get() = _isLottieMoving.asStateFlow() private val _lottieVisibility = MutableStateFlow(false) val lottieVisibility get() = _lottieVisibility.asStateFlow() @@ -53,7 +53,7 @@ class HomeViewModel @Inject constructor( ) } if (goalData.updatedIsAchieved) { - _lottieState.value = true + _isLottieMoving.value = true _lottieVisibility.value = true } _goalList.value = @@ -71,7 +71,7 @@ class HomeViewModel @Inject constructor( .onSuccess { homeData -> _goalList.value = homeData.toHomeGoal().toMutableList() _cheeringMessage.value = homeData.cheeringMessage.replace("\\n", "\n") - _lottieState.value = false + _isLottieMoving.value = false _lottieVisibility.value = false _goalCount.value = homeData.goals.size }.onFailure { @@ -80,7 +80,7 @@ class HomeViewModel @Inject constructor( } } - fun changeLottieState(state: Boolean) { - _lottieState.value = state + fun makeLottieMove(state: Boolean) { + _isLottieMoving.value = state } } From a4b9f2a4de4c62d3c6492c660b2ab7a3aefb899c Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 13 Feb 2023 17:08:04 +0900 Subject: [PATCH 374/745] =?UTF-8?q?[chore]=20#112=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt | 2 -- .../java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt | 2 -- app/src/main/java/org/keepgoeat/data/service/GoalService.kt | 1 - 3 files changed, 5 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index b9284f7f..e534d8f8 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -1,12 +1,10 @@ package org.keepgoeat.data.datasource.remote -import org.keepgoeat.data.ApiResult import org.keepgoeat.data.model.request.RequestGoalAchievement import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.request.RequestGoalContentTitle import org.keepgoeat.data.model.response.* import org.keepgoeat.data.service.GoalService -import org.keepgoeat.util.safeApiCall import javax.inject.Inject class GoalDataSource @Inject constructor( diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index 1480cf9b..21079e64 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -1,6 +1,5 @@ package org.keepgoeat.data.repository -import org.keepgoeat.data.ApiResult import org.keepgoeat.data.datasource.remote.GoalDataSource import org.keepgoeat.data.model.request.RequestGoalAchievement import org.keepgoeat.data.model.request.RequestGoalContent @@ -11,7 +10,6 @@ import org.keepgoeat.data.model.response.ResponseGoalKeep import org.keepgoeat.data.model.response.ResponseHome import org.keepgoeat.domain.model.GoalDetail import org.keepgoeat.domain.repository.GoalRepository -import timber.log.Timber import javax.inject.Inject class GoalRepositoryImpl @Inject constructor( diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index d5ad9fee..646f77ed 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -4,7 +4,6 @@ import org.keepgoeat.data.model.request.RequestGoalAchievement import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.request.RequestGoalContentTitle import org.keepgoeat.data.model.response.* -import retrofit2.Response import retrofit2.http.* interface GoalService { From a1ed444f4e9171faf181d937f0f9eccf703a5b54 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 14 Feb 2023 20:59:49 +0900 Subject: [PATCH 375/745] =?UTF-8?q?=20[feat]=20#152=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B2=84,=20=EC=B9=B4=EC=B9=B4=EC=98=A4=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=EB=B0=8F=20=EC=97=B0=EB=8F=99=20=ED=95=B4?= =?UTF-8?q?=EC=A0=9C=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/service/KakaoAuthService.kt | 22 +++++++++++++++++-- .../data/service/NaverAuthService.kt | 21 ++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index d9cf5aa6..4d4fb8fb 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -58,8 +58,26 @@ class KakaoAuthService @Inject constructor( } } - fun logout() { - client.logout(Timber::e) + fun logoutKakao() { + client.logout { error -> + if (error == null) { + Timber.i("로그아웃 성공. SDK에서 토큰 삭제됨") + // TODO 로컬 데이터 삭제 + } else { + Timber.e("로그아웃 실패. SDK에서 토큰 삭제됨($error)") + } + } + } + + fun unlinkKakao() { + client.unlink { error -> + if (error == null) { + Timber.d("연결 끊기 성공. SDK에서 토큰 삭제 됨") + // TODO 탈퇴 api 호출 및 로컬 데이터 삭제 + } else { + Timber.e("연결 끊기 실패($error)") + } + } } companion object { diff --git a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt index 67fb105c..66fbb135 100644 --- a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt @@ -2,6 +2,7 @@ package org.keepgoeat.data.service import android.content.Context import com.navercorp.nid.NaverIdLoginSDK +import com.navercorp.nid.oauth.NidOAuthLogin import com.navercorp.nid.oauth.OAuthLoginCallback import dagger.hilt.android.qualifiers.ActivityContext import kotlinx.coroutines.CoroutineScope @@ -55,6 +56,26 @@ class NaverAuthService @Inject constructor( ) } + fun logoutNaver() { + NaverIdLoginSDK.logout() + // TODO 로컬 데이터 삭제 + } + + fun unlinkNaver() { + NidOAuthLogin().callDeleteTokenApi(context, object : OAuthLoginCallback { + override fun onSuccess() { + // TODO 탈퇴 api 호출 및 로컬 데이터 삭제 + } + override fun onFailure(httpStatus: Int, message: String) { + Timber.d("errorCode: ${NaverIdLoginSDK.getLastErrorCode().code}") + Timber.d("errorDesc: ${NaverIdLoginSDK.getLastErrorDescription()}") + } + override fun onError(errorCode: Int, message: String) { + onFailure(errorCode, message) + } + }) + } + companion object { private const val CLIENT_NAME = "킵고잇" private const val PLATFORM_NAVER = "NAVER" From 894460da20b34f1e759dbab68f2411847e55c6b1 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 14 Feb 2023 21:02:01 +0900 Subject: [PATCH 376/745] =?UTF-8?q?=20[feat]=20#152=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B2=84,=20=EC=B9=B4=EC=B9=B4=EC=98=A4=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=EB=B0=8F=20=EC=97=B0=EB=8F=99=20=ED=95=B4?= =?UTF-8?q?=EC=A0=9C=20=EC=8B=9C=20=EB=A1=9C=EC=BB=AC=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=82=AD=EC=A0=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/data/service/KakaoAuthService.kt | 5 +++-- .../main/java/org/keepgoeat/data/service/NaverAuthService.kt | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index 4d4fb8fb..5e7a2045 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -62,7 +62,7 @@ class KakaoAuthService @Inject constructor( client.logout { error -> if (error == null) { Timber.i("로그아웃 성공. SDK에서 토큰 삭제됨") - // TODO 로컬 데이터 삭제 + localStorage.clear() } else { Timber.e("로그아웃 실패. SDK에서 토큰 삭제됨($error)") } @@ -73,7 +73,8 @@ class KakaoAuthService @Inject constructor( client.unlink { error -> if (error == null) { Timber.d("연결 끊기 성공. SDK에서 토큰 삭제 됨") - // TODO 탈퇴 api 호출 및 로컬 데이터 삭제 + // TODO 탈퇴 api 호출 + localStorage.clear() } else { Timber.e("연결 끊기 실패($error)") } diff --git a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt index 66fbb135..f46522a4 100644 --- a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt @@ -58,13 +58,14 @@ class NaverAuthService @Inject constructor( fun logoutNaver() { NaverIdLoginSDK.logout() - // TODO 로컬 데이터 삭제 + localStorage.clear() } fun unlinkNaver() { NidOAuthLogin().callDeleteTokenApi(context, object : OAuthLoginCallback { override fun onSuccess() { - // TODO 탈퇴 api 호출 및 로컬 데이터 삭제 + // TODO 탈퇴 api 호출 + localStorage.clear() } override fun onFailure(httpStatus: Int, message: String) { Timber.d("errorCode: ${NaverIdLoginSDK.getLastErrorCode().code}") From 972369e62dac843728b26a709689c0d79d2a4988 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 14 Feb 2023 21:05:54 +0900 Subject: [PATCH 377/745] =?UTF-8?q?=20[del]=20#152=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt index 4f7a79eb..4bea192c 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt @@ -14,7 +14,7 @@ class AuthRepositoryImpl @Inject constructor( private val localStorage: KGEDataSource ) : AuthRepository { override suspend fun login(requestAuth: RequestAuth): Result = - kotlin.runCatching { + runCatching { authDataSource.login(requestAuth).data }.onSuccess { with(localStorage) { From e0d74370e9f2ed2dfd0f7ea83b1a1e57ceac0d1f Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 14 Feb 2023 21:24:59 +0900 Subject: [PATCH 378/745] =?UTF-8?q?=20[feat]=20#152=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=ED=83=88=ED=87=B4=20api=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/AuthDataSource.kt | 5 ++++- .../data/model/response/ResponseWithdraw.kt | 10 ++++++++++ .../data/repository/AuthRepositoryImpl.kt | 15 ++++++++++++++- .../org/keepgoeat/data/service/AuthService.kt | 4 ++++ .../keepgoeat/domain/repository/AuthRepository.kt | 2 ++ 5 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/data/model/response/ResponseWithdraw.kt diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt index f166fe17..659fdc52 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/AuthDataSource.kt @@ -3,13 +3,16 @@ package org.keepgoeat.data.datasource.remote import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.data.model.response.ResponseAuth import org.keepgoeat.data.model.response.ResponseRefresh +import org.keepgoeat.data.model.response.ResponseWithdraw import org.keepgoeat.data.service.AuthService import javax.inject.Inject class AuthDataSource @Inject constructor( - private val authService: AuthService + private val authService: AuthService, ) { suspend fun login(requestAuth: RequestAuth): ResponseAuth = authService.login(requestAuth) suspend fun refresh(): ResponseRefresh = authService.refresh() + + suspend fun deleteAccount(): ResponseWithdraw = authService.deleteAccount() } diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseWithdraw.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseWithdraw.kt new file mode 100644 index 00000000..34186159 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseWithdraw.kt @@ -0,0 +1,10 @@ +package org.keepgoeat.data.model.response + +import kotlinx.serialization.Serializable + +@Serializable +data class ResponseWithdraw( + val message: String, + val status: Int, + val success: Boolean, +) diff --git a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt index 4bea192c..ca446399 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt @@ -5,13 +5,14 @@ import org.keepgoeat.data.datasource.remote.AuthDataSource import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.data.model.response.ResponseAuth import org.keepgoeat.data.model.response.ResponseRefresh +import org.keepgoeat.data.model.response.ResponseWithdraw import org.keepgoeat.domain.repository.AuthRepository import timber.log.Timber import javax.inject.Inject class AuthRepositoryImpl @Inject constructor( private val authDataSource: AuthDataSource, - private val localStorage: KGEDataSource + private val localStorage: KGEDataSource, ) : AuthRepository { override suspend fun login(requestAuth: RequestAuth): Result = runCatching { @@ -28,6 +29,18 @@ class AuthRepositoryImpl @Inject constructor( Timber.e(it.message) } + override suspend fun deleteAccount(): Result = + runCatching { + authDataSource.deleteAccount() + }.onSuccess { + Timber.d("회원 탈퇴 성공") + localStorage.clear() + }.onFailure { + Timber.e(it.message) + } + + + // TODO 코드 정리 필요 override suspend fun refresh(): Result = runCatching { authDataSource.refresh().data } diff --git a/app/src/main/java/org/keepgoeat/data/service/AuthService.kt b/app/src/main/java/org/keepgoeat/data/service/AuthService.kt index dbcc6c1d..f88fbd09 100644 --- a/app/src/main/java/org/keepgoeat/data/service/AuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/AuthService.kt @@ -3,6 +3,7 @@ package org.keepgoeat.data.service import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.data.model.response.ResponseAuth import org.keepgoeat.data.model.response.ResponseRefresh +import org.keepgoeat.data.model.response.ResponseWithdraw import retrofit2.http.Body import retrofit2.http.GET import retrofit2.http.POST @@ -13,4 +14,7 @@ interface AuthService { @GET("auth/refresh") suspend fun refresh(): ResponseRefresh + + @GET("auth/withdraw") + suspend fun deleteAccount(): ResponseWithdraw } diff --git a/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt index 6e9883ae..4427b5f0 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/AuthRepository.kt @@ -3,8 +3,10 @@ package org.keepgoeat.domain.repository import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.data.model.response.ResponseAuth import org.keepgoeat.data.model.response.ResponseRefresh +import org.keepgoeat.data.model.response.ResponseWithdraw interface AuthRepository { suspend fun login(requestAuth: RequestAuth): Result suspend fun refresh(): Result + suspend fun deleteAccount(): Result } From d2df2fb7a7d883b4a9024dfe8256dfd10861af18 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 14 Feb 2023 21:25:51 +0900 Subject: [PATCH 379/745] =?UTF-8?q?=20[chore]=20#152=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/data/repository/AuthRepositoryImpl.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt index ca446399..67a06bd6 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt @@ -39,9 +39,8 @@ class AuthRepositoryImpl @Inject constructor( Timber.e(it.message) } - - // TODO 코드 정리 필요 - override suspend fun refresh(): Result = runCatching { - authDataSource.refresh().data - } + override suspend fun refresh(): Result = + runCatching { + authDataSource.refresh().data + } } From 5c3c074fa0ace8fe1f8b592fa4d92e3a53a823f7 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 14 Feb 2023 21:41:05 +0900 Subject: [PATCH 380/745] =?UTF-8?q?=20[add]=20#152=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=EB=B0=8F=20=ED=9A=8C=EC=9B=90=20=ED=83=88?= =?UTF-8?q?=ED=87=B4=20=EB=8D=94=EB=AF=B8=EB=B7=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/presentation/my/MyActivity.kt | 6 ++++++ app/src/main/res/layout/activity_my.xml | 20 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt index a420ca38..b5b0cd44 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt @@ -64,6 +64,12 @@ class MyActivity : BindingActivity(R.layout.activity_my) { binding.ivBack.setOnClickListener { moveToPrevious() } + binding.tvLogout.setOnClickListener { + // TODO 로그아웃 로직 연결 + } + binding.tvDeleteAccount.setOnClickListener { + // TODO 회원탈퇴 로직 연결 + } } private fun collectData() { diff --git a/app/src/main/res/layout/activity_my.xml b/app/src/main/res/layout/activity_my.xml index a7132184..07d44a67 100644 --- a/app/src/main/res/layout/activity_my.xml +++ b/app/src/main/res/layout/activity_my.xml @@ -34,6 +34,26 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + + + Date: Tue, 14 Feb 2023 21:52:32 +0900 Subject: [PATCH 381/745] =?UTF-8?q?=20[feat]=20#152=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EC=8B=9C=20=EC=86=8C=EC=85=9C=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=ED=94=8C=EB=9E=AB=ED=8F=BC=20=EC=A2=85=EB=A5=98?= =?UTF-8?q?=EB=A5=BC=20=EB=A1=9C=EC=BB=AC=20=EB=94=94=EB=B9=84=EC=97=90=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/data/datasource/local/KGEDataSource.kt | 10 ++++++++++ .../org/keepgoeat/data/service/KakaoAuthService.kt | 2 ++ .../org/keepgoeat/data/service/NaverAuthService.kt | 8 +++++++- .../org/keepgoeat/presentation/type/SocialLoginType.kt | 5 +++++ 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/org/keepgoeat/presentation/type/SocialLoginType.kt diff --git a/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt index d0305f3a..b62000e5 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt @@ -7,6 +7,8 @@ import androidx.databinding.ktx.BuildConfig import androidx.security.crypto.EncryptedSharedPreferences import androidx.security.crypto.MasterKey import dagger.hilt.android.qualifiers.ApplicationContext +import org.keepgoeat.presentation.type.SocialLoginType +import org.keepgoeat.util.safeValueOf import javax.inject.Inject import javax.inject.Singleton @@ -49,6 +51,13 @@ class KGEDataSource @Inject constructor(@ApplicationContext context: Context) { set(value) = dataStore.edit { putBoolean(IS_CLICKED_ONBOARDING_BUTTON, value) } get() = dataStore.getBoolean(IS_CLICKED_ONBOARDING_BUTTON, false) + var loginPlatform: SocialLoginType + set(value) = dataStore.edit { putString(LOGIN_PLATFORM, value.name) } + get() = safeValueOf(dataStore.getString( + LOGIN_PLATFORM, + "" + )) ?: SocialLoginType.NONE + fun clear() { dataStore.edit { clear() @@ -61,5 +70,6 @@ class KGEDataSource @Inject constructor(@ApplicationContext context: Context) { const val IS_LOGIN = "isLogin" const val REFRESH_TOKEN = "refreshToken" const val IS_CLICKED_ONBOARDING_BUTTON = "isClickedOnboardingButton" + const val LOGIN_PLATFORM = "loginPlatform" } } diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index 5e7a2045..4e3e8dc1 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -11,6 +11,7 @@ import kotlinx.coroutines.withContext import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.domain.repository.AuthRepository +import org.keepgoeat.presentation.type.SocialLoginType import timber.log.Timber import javax.inject.Inject @@ -48,6 +49,7 @@ class KakaoAuthService @Inject constructor( authRepository.login(RequestAuth(oAuthToken.accessToken, PLATFORM_KAKAO)) } Timber.d(oAuthToken.accessToken) + localStorage.loginPlatform = SocialLoginType.KAKAO // TODO 리팩토링 필요 result?.let { loginListener( result.getOrThrow()?.type == SIGN_UP, diff --git a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt index f46522a4..bc878bc6 100644 --- a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt @@ -13,6 +13,7 @@ import org.keepgoeat.BuildConfig import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.data.model.request.RequestAuth import org.keepgoeat.domain.repository.AuthRepository +import org.keepgoeat.presentation.type.SocialLoginType import timber.log.Timber import javax.inject.Inject @@ -39,9 +40,12 @@ class NaverAuthService @Inject constructor( ) } Timber.d(accessToken) - loginListener(result.getOrThrow()?.type == SIGN_UP, localStorage.isClickedOnboardingButton) + localStorage.loginPlatform = SocialLoginType.NAVER // TODO 리팩토링 필요 + loginListener(result.getOrThrow()?.type == SIGN_UP, + localStorage.isClickedOnboardingButton) } } + override fun onFailure(httpStatus: Int, message: String) { Timber.i(NaverIdLoginSDK.getLastErrorCode().code) Timber.i(NaverIdLoginSDK.getLastErrorDescription()) @@ -67,10 +71,12 @@ class NaverAuthService @Inject constructor( // TODO 탈퇴 api 호출 localStorage.clear() } + override fun onFailure(httpStatus: Int, message: String) { Timber.d("errorCode: ${NaverIdLoginSDK.getLastErrorCode().code}") Timber.d("errorDesc: ${NaverIdLoginSDK.getLastErrorDescription()}") } + override fun onError(errorCode: Int, message: String) { onFailure(errorCode, message) } diff --git a/app/src/main/java/org/keepgoeat/presentation/type/SocialLoginType.kt b/app/src/main/java/org/keepgoeat/presentation/type/SocialLoginType.kt new file mode 100644 index 00000000..73cf2201 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/type/SocialLoginType.kt @@ -0,0 +1,5 @@ +package org.keepgoeat.presentation.type + +enum class SocialLoginType { + NAVER, KAKAO, NONE +} From 9869b65bad8ae41c2d7e40f0d9eecabe62037c02 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 14 Feb 2023 22:13:24 +0900 Subject: [PATCH 382/745] =?UTF-8?q?=20[feat]=20#152=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=ED=94=8C=EB=9E=AB=ED=8F=BC=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=A5=B8=20=EB=A1=9C=EA=B7=B8=EC=95=84=EC=9B=83=20=EB=B0=8F=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=20=ED=83=88=ED=87=B4=20=EB=B6=84=EA=B8=B0=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/presentation/my/MyActivity.kt | 21 +++++++++++++++++-- .../keepgoeat/presentation/my/MyViewModel.kt | 7 ++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt index b5b0cd44..936d8ac4 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt @@ -11,15 +11,24 @@ import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.keepgoeat.R +import org.keepgoeat.data.service.KakaoAuthService +import org.keepgoeat.data.service.NaverAuthService import org.keepgoeat.databinding.ActivityMyBinding import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.type.EatingType +import org.keepgoeat.presentation.type.SocialLoginType import org.keepgoeat.presentation.type.SortType import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity +import javax.inject.Inject @AndroidEntryPoint class MyActivity : BindingActivity(R.layout.activity_my) { + @Inject + lateinit var kakaoSignService: KakaoAuthService + + @Inject + lateinit var naverSignService: NaverAuthService private val viewModel: MyViewModel by viewModels() private val goalAdapter = MyGoalAdapter() private val headerAdapter = MyHeaderAdapter(::getFilteredGoalWithEatingType) @@ -65,10 +74,18 @@ class MyActivity : BindingActivity(R.layout.activity_my) { moveToPrevious() } binding.tvLogout.setOnClickListener { - // TODO 로그아웃 로직 연결 + when (viewModel.loginPlatForm) { + SocialLoginType.NAVER -> naverSignService.logoutNaver() + SocialLoginType.KAKAO -> kakaoSignService.logoutKakao() + else -> {} + } } binding.tvDeleteAccount.setOnClickListener { - // TODO 회원탈퇴 로직 연결 + when (viewModel.loginPlatForm) { + SocialLoginType.NAVER -> naverSignService.unlinkNaver() // TODO 회원 탈퇴 성공 시 api 호출 + SocialLoginType.KAKAO -> kakaoSignService.unlinkKakao() + else -> {} + } } } diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt index c0a451ac..c65c0e25 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt @@ -6,6 +6,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.domain.model.MyGoal import org.keepgoeat.domain.repository.MyRepository import org.keepgoeat.presentation.type.SortType @@ -13,9 +14,13 @@ import org.keepgoeat.util.UiState import javax.inject.Inject @HiltViewModel -class MyViewModel @Inject constructor(private val myRepository: MyRepository) : ViewModel() { +class MyViewModel @Inject constructor( + private val myRepository: MyRepository, + private val localStorage: KGEDataSource, +) : ViewModel() { private val _achievedGoalUiState = MutableStateFlow>>(UiState.Loading) val achievedGoalUiState get() = _achievedGoalUiState.asStateFlow() + val loginPlatForm = localStorage.loginPlatform init { fetchAchievedGoalBySort(SortType.ALL) From 3b852b83e6dca750bd58ae54444f6fab1191344f Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 14 Feb 2023 22:34:05 +0900 Subject: [PATCH 383/745] =?UTF-8?q?=20[feat]=20#152=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=20=ED=83=88=ED=87=B4=20=EC=84=B1=EA=B3=B5=20=EC=97=AC=EB=B6=80?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=A5=B8=20ui=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/data/service/KakaoAuthService.kt | 6 +++--- .../keepgoeat/data/service/NaverAuthService.kt | 7 ++++--- .../keepgoeat/presentation/my/MyActivity.kt | 18 ++++++++++++++++-- .../keepgoeat/presentation/my/MyViewModel.kt | 15 +++++++++++++++ 4 files changed, 38 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index 4e3e8dc1..823f3138 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -71,12 +71,12 @@ class KakaoAuthService @Inject constructor( } } - fun unlinkKakao() { + // TODO 함수명 변경 + fun unlinkKakao(deleteAccountListener: (() -> Unit)) { client.unlink { error -> if (error == null) { Timber.d("연결 끊기 성공. SDK에서 토큰 삭제 됨") - // TODO 탈퇴 api 호출 - localStorage.clear() + deleteAccountListener() } else { Timber.e("연결 끊기 실패($error)") } diff --git a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt index bc878bc6..8d36250b 100644 --- a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt @@ -65,11 +65,12 @@ class NaverAuthService @Inject constructor( localStorage.clear() } - fun unlinkNaver() { + // TODO 함수명 변경 + fun unlinkNaver(deleteAccountListener: (() -> Unit)) { NidOAuthLogin().callDeleteTokenApi(context, object : OAuthLoginCallback { override fun onSuccess() { - // TODO 탈퇴 api 호출 - localStorage.clear() + Timber.d("연결 끊기 성공. SDK에서 토큰 삭제 됨") + deleteAccountListener() } override fun onFailure(httpStatus: Int, message: String) { diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt index 936d8ac4..b7526736 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt @@ -15,6 +15,7 @@ import org.keepgoeat.data.service.KakaoAuthService import org.keepgoeat.data.service.NaverAuthService import org.keepgoeat.databinding.ActivityMyBinding import org.keepgoeat.presentation.home.HomeActivity +import org.keepgoeat.presentation.sign.SignActivity import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.presentation.type.SocialLoginType import org.keepgoeat.presentation.type.SortType @@ -82,8 +83,8 @@ class MyActivity : BindingActivity(R.layout.activity_my) { } binding.tvDeleteAccount.setOnClickListener { when (viewModel.loginPlatForm) { - SocialLoginType.NAVER -> naverSignService.unlinkNaver() // TODO 회원 탈퇴 성공 시 api 호출 - SocialLoginType.KAKAO -> kakaoSignService.unlinkKakao() + SocialLoginType.NAVER -> naverSignService.unlinkNaver(viewModel::deleteAccount) // TODO 회원 탈퇴 성공 시 api 호출 + SocialLoginType.KAKAO -> kakaoSignService.unlinkKakao(viewModel::deleteAccount) else -> {} } } @@ -100,6 +101,19 @@ class MyActivity : BindingActivity(R.layout.activity_my) { else -> {} } }.launchIn(lifecycleScope) + + viewModel.isSuccessDeleteAccount.flowWithLifecycle(lifecycle).onEach { + when (it) { + is UiState.Success -> { + startActivity(Intent(this, SignActivity::class.java)) + finish() + } + is UiState.Error -> { + // TODO 회원 탈퇴 실패 시 예외 처리 + } + else -> {} + } + }.launchIn(lifecycleScope) } private fun moveToHome() { diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt index c65c0e25..25a9dc8e 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.domain.model.MyGoal +import org.keepgoeat.domain.repository.AuthRepository import org.keepgoeat.domain.repository.MyRepository import org.keepgoeat.presentation.type.SortType import org.keepgoeat.util.UiState @@ -16,10 +17,13 @@ import javax.inject.Inject @HiltViewModel class MyViewModel @Inject constructor( private val myRepository: MyRepository, + private val authRepository: AuthRepository, private val localStorage: KGEDataSource, ) : ViewModel() { private val _achievedGoalUiState = MutableStateFlow>>(UiState.Loading) val achievedGoalUiState get() = _achievedGoalUiState.asStateFlow() + private val _isSuccessDeleteAccount = MutableStateFlow>(UiState.Loading) + val isSuccessDeleteAccount get() = _isSuccessDeleteAccount.asStateFlow() val loginPlatForm = localStorage.loginPlatform init { @@ -36,4 +40,15 @@ class MyViewModel @Inject constructor( } } } + + fun deleteAccount() { + viewModelScope.launch { + authRepository.deleteAccount() + .onSuccess { + _isSuccessDeleteAccount.value = UiState.Success(true) + }.onFailure { + _isSuccessDeleteAccount.value = UiState.Error(it.message) + } + } + } } From 1bb7b3bc71832acd40a0897c8cfc94fe1251f9d3 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 14 Feb 2023 22:43:01 +0900 Subject: [PATCH 384/745] =?UTF-8?q?=20[feat]=20#152=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=EC=84=B1=EA=B3=B5=20=EC=97=AC=EB=B6=80?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=A5=B8=20ui=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/service/KakaoAuthService.kt | 4 ++-- .../data/service/NaverAuthService.kt | 4 ++-- .../keepgoeat/presentation/my/MyActivity.kt | 19 ++++++++++++++++--- .../keepgoeat/presentation/my/MyViewModel.kt | 12 ++++++++++-- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index 823f3138..a8a7d7bf 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -60,11 +60,11 @@ class KakaoAuthService @Inject constructor( } } - fun logoutKakao() { + fun logoutKakao(logoutListener: (() -> Unit)) { client.logout { error -> if (error == null) { Timber.i("로그아웃 성공. SDK에서 토큰 삭제됨") - localStorage.clear() + logoutListener() } else { Timber.e("로그아웃 실패. SDK에서 토큰 삭제됨($error)") } diff --git a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt index 8d36250b..ea384708 100644 --- a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt @@ -60,9 +60,9 @@ class NaverAuthService @Inject constructor( ) } - fun logoutNaver() { + fun logoutNaver(logoutListener: (() -> Unit)) { NaverIdLoginSDK.logout() - localStorage.clear() + logoutListener() } // TODO 함수명 변경 diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt index b7526736..686bc7b0 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt @@ -76,14 +76,14 @@ class MyActivity : BindingActivity(R.layout.activity_my) { } binding.tvLogout.setOnClickListener { when (viewModel.loginPlatForm) { - SocialLoginType.NAVER -> naverSignService.logoutNaver() - SocialLoginType.KAKAO -> kakaoSignService.logoutKakao() + SocialLoginType.NAVER -> naverSignService.logoutNaver(viewModel::logout) + SocialLoginType.KAKAO -> kakaoSignService.logoutKakao(viewModel::logout) else -> {} } } binding.tvDeleteAccount.setOnClickListener { when (viewModel.loginPlatForm) { - SocialLoginType.NAVER -> naverSignService.unlinkNaver(viewModel::deleteAccount) // TODO 회원 탈퇴 성공 시 api 호출 + SocialLoginType.NAVER -> naverSignService.unlinkNaver(viewModel::deleteAccount) SocialLoginType.KAKAO -> kakaoSignService.unlinkKakao(viewModel::deleteAccount) else -> {} } @@ -102,6 +102,19 @@ class MyActivity : BindingActivity(R.layout.activity_my) { } }.launchIn(lifecycleScope) + viewModel.logoutUiState.flowWithLifecycle(lifecycle).onEach { + when (it) { + is UiState.Success -> { + startActivity(Intent(this, SignActivity::class.java)) + finish() + } + is UiState.Error -> { + // TODO 로그아웃 실패 시 예외 처리 + } + else -> {} + } + }.launchIn(lifecycleScope) + viewModel.isSuccessDeleteAccount.flowWithLifecycle(lifecycle).onEach { when (it) { is UiState.Success -> { diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt index 25a9dc8e..84401b23 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt @@ -22,7 +22,10 @@ class MyViewModel @Inject constructor( ) : ViewModel() { private val _achievedGoalUiState = MutableStateFlow>>(UiState.Loading) val achievedGoalUiState get() = _achievedGoalUiState.asStateFlow() - private val _isSuccessDeleteAccount = MutableStateFlow>(UiState.Loading) + private val _logoutUiState = MutableStateFlow>(UiState.Loading) + val logoutUiState get() = _isSuccessDeleteAccount.asStateFlow() + private val _isSuccessDeleteAccount = + MutableStateFlow>(UiState.Loading) // TODO 변수명 수정 val isSuccessDeleteAccount get() = _isSuccessDeleteAccount.asStateFlow() val loginPlatForm = localStorage.loginPlatform @@ -36,11 +39,16 @@ class MyViewModel @Inject constructor( .onSuccess { _achievedGoalUiState.value = UiState.Success(it) }.onFailure { - _achievedGoalUiState.value = UiState.Error(it.message) + _achievedGoalUiState.value = UiState.Error(null) } } } + fun logout() { + localStorage.clear() + _logoutUiState.value = UiState.Success(true) + } + fun deleteAccount() { viewModelScope.launch { authRepository.deleteAccount() From 51724fe7796dc797229085fd7aaf554ca638a35a Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 14 Feb 2023 22:47:48 +0900 Subject: [PATCH 385/745] =?UTF-8?q?=20[chore]=20#152=20=EB=B3=80=EC=88=98?= =?UTF-8?q?=EB=AA=85=20=EB=B0=8F=20=ED=95=A8=EC=88=98=EB=AA=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/data/service/KakaoAuthService.kt | 3 +-- .../org/keepgoeat/data/service/NaverAuthService.kt | 3 +-- .../java/org/keepgoeat/presentation/my/MyActivity.kt | 6 +++--- .../org/keepgoeat/presentation/my/MyViewModel.kt | 12 ++++++------ 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index a8a7d7bf..a7afde59 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -71,8 +71,7 @@ class KakaoAuthService @Inject constructor( } } - // TODO 함수명 변경 - fun unlinkKakao(deleteAccountListener: (() -> Unit)) { + fun deleteAccountKakao(deleteAccountListener: (() -> Unit)) { client.unlink { error -> if (error == null) { Timber.d("연결 끊기 성공. SDK에서 토큰 삭제 됨") diff --git a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt index ea384708..13655d85 100644 --- a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt @@ -65,8 +65,7 @@ class NaverAuthService @Inject constructor( logoutListener() } - // TODO 함수명 변경 - fun unlinkNaver(deleteAccountListener: (() -> Unit)) { + fun deleteAccountNaver(deleteAccountListener: (() -> Unit)) { NidOAuthLogin().callDeleteTokenApi(context, object : OAuthLoginCallback { override fun onSuccess() { Timber.d("연결 끊기 성공. SDK에서 토큰 삭제 됨") diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt index 686bc7b0..9da709a3 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt @@ -83,8 +83,8 @@ class MyActivity : BindingActivity(R.layout.activity_my) { } binding.tvDeleteAccount.setOnClickListener { when (viewModel.loginPlatForm) { - SocialLoginType.NAVER -> naverSignService.unlinkNaver(viewModel::deleteAccount) - SocialLoginType.KAKAO -> kakaoSignService.unlinkKakao(viewModel::deleteAccount) + SocialLoginType.NAVER -> naverSignService.deleteAccountNaver(viewModel::deleteAccount) + SocialLoginType.KAKAO -> kakaoSignService.deleteAccountKakao(viewModel::deleteAccount) else -> {} } } @@ -115,7 +115,7 @@ class MyActivity : BindingActivity(R.layout.activity_my) { } }.launchIn(lifecycleScope) - viewModel.isSuccessDeleteAccount.flowWithLifecycle(lifecycle).onEach { + viewModel.deleteAccountUiState.flowWithLifecycle(lifecycle).onEach { when (it) { is UiState.Success -> { startActivity(Intent(this, SignActivity::class.java)) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt index 84401b23..68ea816c 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt @@ -23,10 +23,10 @@ class MyViewModel @Inject constructor( private val _achievedGoalUiState = MutableStateFlow>>(UiState.Loading) val achievedGoalUiState get() = _achievedGoalUiState.asStateFlow() private val _logoutUiState = MutableStateFlow>(UiState.Loading) - val logoutUiState get() = _isSuccessDeleteAccount.asStateFlow() - private val _isSuccessDeleteAccount = - MutableStateFlow>(UiState.Loading) // TODO 변수명 수정 - val isSuccessDeleteAccount get() = _isSuccessDeleteAccount.asStateFlow() + val logoutUiState get() = _deleteAccountUiState.asStateFlow() + private val _deleteAccountUiState = + MutableStateFlow>(UiState.Loading) + val deleteAccountUiState get() = _deleteAccountUiState.asStateFlow() val loginPlatForm = localStorage.loginPlatform init { @@ -53,9 +53,9 @@ class MyViewModel @Inject constructor( viewModelScope.launch { authRepository.deleteAccount() .onSuccess { - _isSuccessDeleteAccount.value = UiState.Success(true) + _deleteAccountUiState.value = UiState.Success(true) }.onFailure { - _isSuccessDeleteAccount.value = UiState.Error(it.message) + _deleteAccountUiState.value = UiState.Error(it.message) } } } From e3fd03c1948c540d1871243802461d1f5b616837 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Tue, 14 Feb 2023 23:30:07 +0900 Subject: [PATCH 386/745] =?UTF-8?q?=20[refactor]=20#152=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/service/KakaoAuthService.kt | 35 +++------------- .../data/service/NaverAuthService.kt | 26 ++---------- .../main/java/org/keepgoeat/di/SignModule.kt | 10 +---- .../presentation/sign/SignActivity.kt | 33 ++++++++++++--- .../presentation/sign/SignViewModel.kt | 42 +++++++++++++++++++ 5 files changed, 79 insertions(+), 67 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index a7afde59..1f98ca7a 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -4,13 +4,6 @@ import android.content.Context import com.kakao.sdk.auth.model.OAuthToken import com.kakao.sdk.user.UserApiClient import dagger.hilt.android.qualifiers.ActivityContext -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext -import org.keepgoeat.data.datasource.local.KGEDataSource -import org.keepgoeat.data.model.request.RequestAuth -import org.keepgoeat.domain.repository.AuthRepository import org.keepgoeat.presentation.type.SocialLoginType import timber.log.Timber import javax.inject.Inject @@ -18,13 +11,11 @@ import javax.inject.Inject class KakaoAuthService @Inject constructor( @ActivityContext private val context: Context, private val client: UserApiClient, - private val authRepository: AuthRepository, - private val localStorage: KGEDataSource, ) { private val isKakaoTalkLoginAvailable: Boolean get() = client.isKakaoTalkLoginAvailable(context) - fun loginKakao(loginListener: ((Boolean, Boolean) -> Unit)) { + fun loginKakao(loginListener: ((SocialLoginType, String) -> Unit)) { val callback: (OAuthToken?, Throwable?) -> Unit = { token, error -> if (error != null) handleLoginError(error) else if (token != null) handleLoginSuccess(token, loginListener) @@ -41,22 +32,11 @@ class KakaoAuthService @Inject constructor( private fun handleLoginSuccess( oAuthToken: OAuthToken, - loginListener: ((Boolean, Boolean) -> Unit), + loginListener: ((SocialLoginType, String) -> Unit), ) { - client.me { user, _ -> - CoroutineScope(Dispatchers.Main).launch { - val result = withContext(Dispatchers.IO) { - authRepository.login(RequestAuth(oAuthToken.accessToken, PLATFORM_KAKAO)) - } - Timber.d(oAuthToken.accessToken) - localStorage.loginPlatform = SocialLoginType.KAKAO // TODO 리팩토링 필요 - result?.let { - loginListener( - result.getOrThrow()?.type == SIGN_UP, - localStorage.isClickedOnboardingButton - ) - } - } + client.me { _, _ -> + Timber.d(oAuthToken.accessToken) + loginListener(SocialLoginType.KAKAO, oAuthToken.accessToken) } } @@ -81,9 +61,4 @@ class KakaoAuthService @Inject constructor( } } } - - companion object { - private const val PLATFORM_KAKAO = "KAKAO" - private const val SIGN_UP = "signup" - } } diff --git a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt index 13655d85..bd2b66b2 100644 --- a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt @@ -5,22 +5,13 @@ import com.navercorp.nid.NaverIdLoginSDK import com.navercorp.nid.oauth.NidOAuthLogin import com.navercorp.nid.oauth.OAuthLoginCallback import dagger.hilt.android.qualifiers.ActivityContext -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.keepgoeat.BuildConfig -import org.keepgoeat.data.datasource.local.KGEDataSource -import org.keepgoeat.data.model.request.RequestAuth -import org.keepgoeat.domain.repository.AuthRepository import org.keepgoeat.presentation.type.SocialLoginType import timber.log.Timber import javax.inject.Inject class NaverAuthService @Inject constructor( @ActivityContext private val context: Context, - private val authRepository: AuthRepository, - private val localStorage: KGEDataSource, ) { init { NaverIdLoginSDK.initialize( @@ -29,21 +20,12 @@ class NaverAuthService @Inject constructor( ) } - fun loginNaver(loginListener: ((Boolean, Boolean) -> Unit)) { + fun loginNaver(loginListener: ((SocialLoginType, String) -> Unit)) { val oauthLoginCallback = object : OAuthLoginCallback { override fun onSuccess() { val accessToken = requireNotNull(NaverIdLoginSDK.getAccessToken()) - CoroutineScope(Dispatchers.Main).launch { - val result = withContext(Dispatchers.IO) { - authRepository.login( - RequestAuth(accessToken, PLATFORM_NAVER) - ) - } - Timber.d(accessToken) - localStorage.loginPlatform = SocialLoginType.NAVER // TODO 리팩토링 필요 - loginListener(result.getOrThrow()?.type == SIGN_UP, - localStorage.isClickedOnboardingButton) - } + Timber.d(accessToken) + loginListener(SocialLoginType.NAVER, accessToken) } override fun onFailure(httpStatus: Int, message: String) { @@ -85,7 +67,5 @@ class NaverAuthService @Inject constructor( companion object { private const val CLIENT_NAME = "킵고잇" - private const val PLATFORM_NAVER = "NAVER" - private const val SIGN_UP = "signup" } } diff --git a/app/src/main/java/org/keepgoeat/di/SignModule.kt b/app/src/main/java/org/keepgoeat/di/SignModule.kt index 710ac40b..dd87c9a6 100644 --- a/app/src/main/java/org/keepgoeat/di/SignModule.kt +++ b/app/src/main/java/org/keepgoeat/di/SignModule.kt @@ -8,10 +8,8 @@ import dagger.hilt.InstallIn import dagger.hilt.android.components.ActivityComponent import dagger.hilt.android.qualifiers.ActivityContext import dagger.hilt.android.scopes.ActivityScoped -import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.data.service.KakaoAuthService import org.keepgoeat.data.service.NaverAuthService -import org.keepgoeat.domain.repository.AuthRepository @Module @InstallIn(ActivityComponent::class) @@ -24,14 +22,10 @@ object SignModule { fun provideKakaoSignService( @ActivityContext context: Context, client: UserApiClient, - authRepository: AuthRepository, - localStorage: KGEDataSource, - ) = KakaoAuthService(context, client, authRepository, localStorage) + ) = KakaoAuthService(context, client) @Provides fun provideNaverSignService( @ActivityContext context: Context, - authRepository: AuthRepository, - localStorage: KGEDataSource, - ) = NaverAuthService(context, authRepository, localStorage) + ) = NaverAuthService(context) } diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt index bd3a6844..cd812fae 100644 --- a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt @@ -2,15 +2,20 @@ package org.keepgoeat.presentation.sign import android.content.Intent import android.os.Bundle +import androidx.activity.viewModels +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import org.keepgoeat.R import org.keepgoeat.data.service.KakaoAuthService import org.keepgoeat.data.service.NaverAuthService import org.keepgoeat.databinding.ActivitySignBinding import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.onboarding.OnboardingActivity +import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity -import timber.log.Timber import javax.inject.Inject @AndroidEntryPoint @@ -20,25 +25,41 @@ class SignActivity : BindingActivity(R.layout.activity_sign @Inject lateinit var naverSignService: NaverAuthService + private val viewModel: SignViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + addListeners() + collectData() } private fun addListeners() { binding.layoutKakaoSignIn.setOnClickListener { - kakaoSignService.loginKakao(::moveToNext) + kakaoSignService.loginKakao(viewModel::login) } binding.layoutNaverSignIn.setOnClickListener { - naverSignService.loginNaver(::moveToNext) + naverSignService.loginNaver(viewModel::login) } } - private fun moveToNext(isFirst: Boolean, isClicked: Boolean) { - Timber.d("isFirst : $isFirst !isClicked : ${!isClicked}") + private fun collectData() { + viewModel.loginUiState.flowWithLifecycle(lifecycle).onEach { + when (it) { + is UiState.Success -> { + moveToNext(it.data) + } + is UiState.Error -> {} + else -> {} + } + }.launchIn(lifecycleScope) + } + + /** 가입자가 온보딩 모두 확인(생략 포함)하지 않은 경우 온보딩 화면으로 그 외의 경우(가입자가 온보딩에서 중간 이탈 + 로그인한 사용자)는 홈화면으로 이동 */ + /** @param onboardingFlag : first는 가입자 여부(true: 가입한 사용자, false: 로그인한 사용자), second는 온보딩 완료 버튼을 클릭했는지 여부 */ + private fun moveToNext(onboardingFlag: Pair) { val nextScreen = - if (isFirst && !isClicked) OnboardingActivity::class.java + if (onboardingFlag.first && !onboardingFlag.second) OnboardingActivity::class.java else HomeActivity::class.java startActivity(Intent(this, nextScreen)) finish() diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt new file mode 100644 index 00000000..5ba90055 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt @@ -0,0 +1,42 @@ +package org.keepgoeat.presentation.sign + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import org.keepgoeat.data.datasource.local.KGEDataSource +import org.keepgoeat.data.model.request.RequestAuth +import org.keepgoeat.domain.repository.AuthRepository +import org.keepgoeat.presentation.type.SocialLoginType +import org.keepgoeat.util.UiState +import javax.inject.Inject + +@HiltViewModel +class SignViewModel @Inject constructor( + private val authRepository: AuthRepository, + private val localStorage: KGEDataSource, +) : + ViewModel() { + private var _loginUiState = MutableStateFlow>>(UiState.Loading) + val loginUiState get() = _loginUiState.asStateFlow() + + fun login(loginPlatForm: SocialLoginType, accessToken: String) { + localStorage.loginPlatform = loginPlatForm + viewModelScope.launch { + authRepository.login( + RequestAuth(accessToken, loginPlatForm.name) + ).onSuccess { + _loginUiState.value = UiState.Success(Pair(it?.type == SIGN_UP, + localStorage.isClickedOnboardingButton)) + }.onFailure { + _loginUiState.value = UiState.Error(it.message) + } + } + } + + companion object { + private const val SIGN_UP = "signup" + } +} From e0f3026cbe670e00f34b8ae6d7dc6b430a265cfc Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 15 Feb 2023 00:24:23 +0900 Subject: [PATCH 387/745] =?UTF-8?q?=20[chore]=20#152=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/local/KGEDataSource.kt | 6 ++--- .../data/service/NaverAuthService.kt | 27 ++++++++++--------- .../presentation/sign/SignViewModel.kt | 5 ++-- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt index b62000e5..fd80fbf7 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt @@ -53,10 +53,8 @@ class KGEDataSource @Inject constructor(@ApplicationContext context: Context) { var loginPlatform: SocialLoginType set(value) = dataStore.edit { putString(LOGIN_PLATFORM, value.name) } - get() = safeValueOf(dataStore.getString( - LOGIN_PLATFORM, - "" - )) ?: SocialLoginType.NONE + get() = safeValueOf(dataStore.getString(LOGIN_PLATFORM, "")) + ?: SocialLoginType.NONE fun clear() { dataStore.edit { diff --git a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt index bd2b66b2..a44909ae 100644 --- a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt @@ -48,21 +48,24 @@ class NaverAuthService @Inject constructor( } fun deleteAccountNaver(deleteAccountListener: (() -> Unit)) { - NidOAuthLogin().callDeleteTokenApi(context, object : OAuthLoginCallback { - override fun onSuccess() { - Timber.d("연결 끊기 성공. SDK에서 토큰 삭제 됨") - deleteAccountListener() - } + NidOAuthLogin().callDeleteTokenApi( + context, + object : OAuthLoginCallback { + override fun onSuccess() { + Timber.d("연결 끊기 성공. SDK에서 토큰 삭제 됨") + deleteAccountListener() + } - override fun onFailure(httpStatus: Int, message: String) { - Timber.d("errorCode: ${NaverIdLoginSDK.getLastErrorCode().code}") - Timber.d("errorDesc: ${NaverIdLoginSDK.getLastErrorDescription()}") - } + override fun onFailure(httpStatus: Int, message: String) { + Timber.d("errorCode: ${NaverIdLoginSDK.getLastErrorCode().code}") + Timber.d("errorDesc: ${NaverIdLoginSDK.getLastErrorDescription()}") + } - override fun onError(errorCode: Int, message: String) { - onFailure(errorCode, message) + override fun onError(errorCode: Int, message: String) { + onFailure(errorCode, message) + } } - }) + ) } companion object { diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt index 5ba90055..4bd346ea 100644 --- a/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt @@ -28,8 +28,9 @@ class SignViewModel @Inject constructor( authRepository.login( RequestAuth(accessToken, loginPlatForm.name) ).onSuccess { - _loginUiState.value = UiState.Success(Pair(it?.type == SIGN_UP, - localStorage.isClickedOnboardingButton)) + _loginUiState.value = UiState.Success( + Pair(it?.type == SIGN_UP, localStorage.isClickedOnboardingButton) + ) }.onFailure { _loginUiState.value = UiState.Error(it.message) } From b67b1d9626b1538aa2f7e6d3f6ceb36c99f97fb2 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 15 Feb 2023 00:35:51 +0900 Subject: [PATCH 388/745] =?UTF-8?q?=20[fix]=20#152=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=EC=84=B1=EA=B3=B5=20=EC=8B=9C=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=ED=99=94=EB=A9=B4=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20?= =?UTF-8?q?=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt index 68ea816c..b8f1118c 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt @@ -23,7 +23,7 @@ class MyViewModel @Inject constructor( private val _achievedGoalUiState = MutableStateFlow>>(UiState.Loading) val achievedGoalUiState get() = _achievedGoalUiState.asStateFlow() private val _logoutUiState = MutableStateFlow>(UiState.Loading) - val logoutUiState get() = _deleteAccountUiState.asStateFlow() + val logoutUiState get() = _logoutUiState.asStateFlow() private val _deleteAccountUiState = MutableStateFlow>(UiState.Loading) val deleteAccountUiState get() = _deleteAccountUiState.asStateFlow() From 6e878fec309233ab58deb4da9735371cdb605cde Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 15 Feb 2023 01:21:51 +0900 Subject: [PATCH 389/745] =?UTF-8?q?=20[add]=20#152=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EA=B2=BD=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 --- app/src/main/java/org/keepgoeat/util/extension/ActivityExt.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/org/keepgoeat/util/extension/ActivityExt.kt b/app/src/main/java/org/keepgoeat/util/extension/ActivityExt.kt index bb386067..6cc418ec 100644 --- a/app/src/main/java/org/keepgoeat/util/extension/ActivityExt.kt +++ b/app/src/main/java/org/keepgoeat/util/extension/ActivityExt.kt @@ -1,3 +1,5 @@ +package org.keepgoeat.util.extension + import androidx.annotation.IdRes import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment From 5d8c3919131dd3a34dbf008fbf6b20bbdf4fe6b9 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 15 Feb 2023 14:33:20 +0900 Subject: [PATCH 390/745] =?UTF-8?q?=20[add]=20#152=20=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=A7=81=20=EB=A6=AC=EC=86=8C=EC=8A=A4=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_my.xml | 4 ++-- app/src/main/res/values/strings.xml | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/layout/activity_my.xml b/app/src/main/res/layout/activity_my.xml index 07d44a67..3605e463 100644 --- a/app/src/main/res/layout/activity_my.xml +++ b/app/src/main/res/layout/activity_my.xml @@ -40,7 +40,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/spacingBase" - android:text="로그아웃" + android:text="@string/my_logout" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/tv_delete_account" app:layout_constraintTop_toTopOf="parent" /> @@ -49,7 +49,7 @@ android:id="@+id/tv_delete_account" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="탈퇴" + android:text="@string/my_delete_account" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f12d1485..4dabcfb0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -86,8 +86,7 @@ 총 달성일 진행기간 %s. %s. %s ~ %s. %s. %s - 네, 삭제할래요 - 목표가 수정되었습니다. - 목표가 추가되었습니다. + 로그아웃 + 탈퇴하기 \ No newline at end of file From d0b95c826429493a0954aa3b59740d604277797f Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 15 Feb 2023 14:34:07 +0900 Subject: [PATCH 391/745] =?UTF-8?q?=20[chore]=20#152=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/values/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4dabcfb0..de4d88da 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -27,6 +27,7 @@ 참은 목표가 삭제되었습니다. 목표가 보관되었습니다. + 네, 삭제할래요 오늘 식습관 목표 @@ -67,6 +68,8 @@ 목표는 최소 1글자 이상 입력해주세요. 한글, 영문, 숫자만 입력 가능합니다. (%d/15) + 목표가 수정되었습니다. + 목표가 추가되었습니다. 차근차근 식습관 목표를 세워보세요. From 013af5381fcce19421d77f30099aaa2b02e835ae Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 15 Feb 2023 15:07:23 +0900 Subject: [PATCH 392/745] =?UTF-8?q?=20[chore]=20#154=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 2 +- .../presentation/detail/GoalDetailActivity.kt | 6 +++--- .../presentation/home/HomeActivity.kt | 4 ++-- ...{MyActivity.kt => AchievedGoalActivity.kt} | 8 +++---- ...yGoalAdapter.kt => AchievedGoalAdapter.kt} | 12 +++++------ ...dapter.kt => AchievedGoalHeaderAdapter.kt} | 21 ++++++++++++------- ...vity_my.xml => activity_achieved_goal.xml} | 4 ++-- ...tem_my_goal.xml => item_achieved_goal.xml} | 0 ...er.xml => layout_achieved_goal_header.xml} | 0 9 files changed, 32 insertions(+), 25 deletions(-) rename app/src/main/java/org/keepgoeat/presentation/my/{MyActivity.kt => AchievedGoalActivity.kt} (94%) rename app/src/main/java/org/keepgoeat/presentation/my/{MyGoalAdapter.kt => AchievedGoalAdapter.kt} (78%) rename app/src/main/java/org/keepgoeat/presentation/my/{MyHeaderAdapter.kt => AchievedGoalHeaderAdapter.kt} (72%) rename app/src/main/res/layout/{activity_my.xml => activity_achieved_goal.xml} (96%) rename app/src/main/res/layout/{item_my_goal.xml => item_achieved_goal.xml} (100%) rename app/src/main/res/layout/{layout_my_header.xml => layout_achieved_goal_header.xml} (100%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 593e855c..04b5c8d7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -54,7 +54,7 @@ android:windowSoftInputMode="adjustResize" tools:ignore="LockedOrientationActivity" /> diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 7c56a616..118349ae 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -14,8 +14,8 @@ import org.keepgoeat.databinding.ActivityGoalDetailBinding import org.keepgoeat.presentation.detail.GoalDetailViewModel.Companion.CELL_COUNT import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.model.GoalContent -import org.keepgoeat.presentation.my.MyActivity -import org.keepgoeat.presentation.my.MyActivity.Companion.ARG_IS_ENTERED_FROM_KEEP +import org.keepgoeat.presentation.my.AchievedGoalActivity +import org.keepgoeat.presentation.my.AchievedGoalActivity.Companion.ARG_IS_ENTERED_FROM_KEEP import org.keepgoeat.presentation.setting.GoalSettingActivity import org.keepgoeat.presentation.setting.GoalSettingActivity.Companion.ARG_GOAL_CONTENT import org.keepgoeat.presentation.setting.GoalSettingActivity.Companion.ARG_IS_UPDATED @@ -101,7 +101,7 @@ class GoalDetailActivity : when (keepState) { is UiState.Success -> { showToast(getString(R.string.goal_detail_success_goal_keep_toast_message)) - Intent(this, MyActivity::class.java).apply { + Intent(this, AchievedGoalActivity::class.java).apply { putExtra(ARG_IS_ENTERED_FROM_KEEP, true) }.also { startActivity(it) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 6981774e..40d624f0 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -8,7 +8,7 @@ import org.keepgoeat.R import org.keepgoeat.databinding.ActivityHomeBinding import org.keepgoeat.domain.model.HomeGoal import org.keepgoeat.presentation.detail.GoalDetailActivity -import org.keepgoeat.presentation.my.MyActivity +import org.keepgoeat.presentation.my.AchievedGoalActivity import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.binding.BindingActivity @@ -75,7 +75,7 @@ class HomeActivity : BindingActivity(R.layout.activity_home } private fun moveToMy() { - val intent = Intent(this@HomeActivity, MyActivity::class.java) + val intent = Intent(this@HomeActivity, AchievedGoalActivity::class.java) startActivity(intent) } diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt similarity index 94% rename from app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt rename to app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt index 9da709a3..b675bda3 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt @@ -13,7 +13,7 @@ import kotlinx.coroutines.flow.onEach import org.keepgoeat.R import org.keepgoeat.data.service.KakaoAuthService import org.keepgoeat.data.service.NaverAuthService -import org.keepgoeat.databinding.ActivityMyBinding +import org.keepgoeat.databinding.ActivityAchievedGoalBinding import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.sign.SignActivity import org.keepgoeat.presentation.type.EatingType @@ -24,15 +24,15 @@ import org.keepgoeat.util.binding.BindingActivity import javax.inject.Inject @AndroidEntryPoint -class MyActivity : BindingActivity(R.layout.activity_my) { +class AchievedGoalActivity : BindingActivity(R.layout.activity_achieved_goal) { @Inject lateinit var kakaoSignService: KakaoAuthService @Inject lateinit var naverSignService: NaverAuthService private val viewModel: MyViewModel by viewModels() - private val goalAdapter = MyGoalAdapter() - private val headerAdapter = MyHeaderAdapter(::getFilteredGoalWithEatingType) + private val goalAdapter = AchievedGoalAdapter() + private val headerAdapter = AchievedGoalHeaderAdapter(::getFilteredGoalWithEatingType) private val goalConcatAdapter = ConcatAdapter(headerAdapter, goalAdapter) private var isEnteredFromKeep: Boolean = false diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt similarity index 78% rename from app/src/main/java/org/keepgoeat/presentation/my/MyGoalAdapter.kt rename to app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt index bc7e9a50..e47908b9 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt @@ -4,13 +4,13 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView -import org.keepgoeat.databinding.ItemMyGoalBinding +import org.keepgoeat.databinding.ItemAchievedGoalBinding import org.keepgoeat.domain.model.MyGoal import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.ItemDiffCallback -class MyGoalAdapter : - ListAdapter( +class AchievedGoalAdapter : + ListAdapter( ItemDiffCallback( onContentsTheSame = { old, new -> old == new }, onItemsTheSame = { old, new -> old.id == new.id } @@ -18,11 +18,11 @@ class MyGoalAdapter : ) { private lateinit var inflater: LayoutInflater - class MyGoalViewHolder(private val binding: ItemMyGoalBinding) : + class MyGoalViewHolder(private val binding: ItemAchievedGoalBinding) : RecyclerView.ViewHolder(binding.root) { fun onBind( data: MyGoal, - eatingType: EatingType + eatingType: EatingType, ) { binding.goal = data binding.eatingType = eatingType @@ -33,7 +33,7 @@ class MyGoalAdapter : if (!::inflater.isInitialized) inflater = LayoutInflater.from(parent.context) - return MyGoalViewHolder(ItemMyGoalBinding.inflate(inflater, parent, false)) + return MyGoalViewHolder(ItemAchievedGoalBinding.inflate(inflater, parent, false)) } override fun onBindViewHolder(holder: MyGoalViewHolder, position: Int) { diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyHeaderAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalHeaderAdapter.kt similarity index 72% rename from app/src/main/java/org/keepgoeat/presentation/my/MyHeaderAdapter.kt rename to app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalHeaderAdapter.kt index 495cf594..e49369a4 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyHeaderAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalHeaderAdapter.kt @@ -5,11 +5,11 @@ import android.view.ViewGroup import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import org.keepgoeat.R -import org.keepgoeat.databinding.LayoutMyHeaderBinding +import org.keepgoeat.databinding.LayoutAchievedGoalHeaderBinding import org.keepgoeat.presentation.type.EatingType -class MyHeaderAdapter(private val eatingTypeClickListener: ((EatingType?) -> Unit)) : - RecyclerView.Adapter() { +class AchievedGoalHeaderAdapter(private val eatingTypeClickListener: ((EatingType?) -> Unit)) : + RecyclerView.Adapter() { private lateinit var inflater: LayoutInflater override fun onCreateViewHolder( @@ -19,7 +19,7 @@ class MyHeaderAdapter(private val eatingTypeClickListener: ((EatingType?) -> Uni if (!::inflater.isInitialized) inflater = LayoutInflater.from(parent.context) - return MyHeaderViewHolder(LayoutMyHeaderBinding.inflate(inflater, parent, false)) + return MyHeaderViewHolder(LayoutAchievedGoalHeaderBinding.inflate(inflater, parent, false)) } override fun onBindViewHolder(holder: MyHeaderViewHolder, position: Int) { @@ -28,7 +28,11 @@ class MyHeaderAdapter(private val eatingTypeClickListener: ((EatingType?) -> Uni override fun getItemCount() = 1 - private fun changeTextAppearance(clickedView: TextView, unclickedView1: TextView, unclickedView2: TextView) { + private fun changeTextAppearance( + clickedView: TextView, + unclickedView1: TextView, + unclickedView2: TextView, + ) { clickedView.setTextAppearance(R.style.TextAppearance_System5_Bold) unclickedView1.setTextAppearance(R.style.TextAppearance_System5) unclickedView2.setTextAppearance(R.style.TextAppearance_System5) @@ -38,9 +42,12 @@ class MyHeaderAdapter(private val eatingTypeClickListener: ((EatingType?) -> Uni } class MyHeaderViewHolder( - private val binding: LayoutMyHeaderBinding, + private val binding: LayoutAchievedGoalHeaderBinding, ) : RecyclerView.ViewHolder(binding.root) { - fun onBind(eatingTypeClickListener: ((EatingType?) -> Unit), changeTextAppearance: (TextView, TextView, TextView) -> Unit) { + fun onBind( + eatingTypeClickListener: ((EatingType?) -> Unit), + changeTextAppearance: (TextView, TextView, TextView) -> Unit, + ) { with(binding) { tvAll.setOnClickListener { eatingTypeClickListener(null) diff --git a/app/src/main/res/layout/activity_my.xml b/app/src/main/res/layout/activity_achieved_goal.xml similarity index 96% rename from app/src/main/res/layout/activity_my.xml rename to app/src/main/res/layout/activity_achieved_goal.xml index 3605e463..6257c207 100644 --- a/app/src/main/res/layout/activity_my.xml +++ b/app/src/main/res/layout/activity_achieved_goal.xml @@ -13,7 +13,7 @@ + tools:context=".presentation.my.AchievedGoalActivity"> + tools:listitem="@layout/item_achieved_goal" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_my_goal.xml b/app/src/main/res/layout/item_achieved_goal.xml similarity index 100% rename from app/src/main/res/layout/item_my_goal.xml rename to app/src/main/res/layout/item_achieved_goal.xml diff --git a/app/src/main/res/layout/layout_my_header.xml b/app/src/main/res/layout/layout_achieved_goal_header.xml similarity index 100% rename from app/src/main/res/layout/layout_my_header.xml rename to app/src/main/res/layout/layout_achieved_goal_header.xml From e8695828bdaa2dec36900705ba32fc5bd7d197c2 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 15 Feb 2023 15:24:38 +0900 Subject: [PATCH 393/745] =?UTF-8?q?=20[feat]=20#154=20=ED=88=B4=EB=B0=94?= =?UTF-8?q?=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/view_toolbar.xml | 40 ++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 app/src/main/res/layout/view_toolbar.xml diff --git a/app/src/main/res/layout/view_toolbar.xml b/app/src/main/res/layout/view_toolbar.xml new file mode 100644 index 00000000..4c4de785 --- /dev/null +++ b/app/src/main/res/layout/view_toolbar.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + \ No newline at end of file From 139cb155f9e099e171f1ba901947ff1db5d12bac Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 15 Feb 2023 17:04:31 +0900 Subject: [PATCH 394/745] =?UTF-8?q?=20[feat]=20#154=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=A0=88=EC=9D=B4=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 5 + .../keepgoeat/presentation/my/MyActivity.kt | 35 +++ app/src/main/res/drawable/ic_detail.xml | 10 + app/src/main/res/layout/activity_my.xml | 215 ++++++++++++++++++ app/src/main/res/values/strings.xml | 11 + app/src/main/res/values/themes.xml | 24 ++ 6 files changed, 300 insertions(+) create mode 100644 app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt create mode 100644 app/src/main/res/drawable/ic_detail.xml create mode 100644 app/src/main/res/layout/activity_my.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 04b5c8d7..b02507e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -53,6 +53,11 @@ android:screenOrientation="portrait" android:windowSoftInputMode="adjustResize" tools:ignore="LockedOrientationActivity" /> + (R.layout.activity_my) { + private val viewModel: MyViewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding.viewModel = viewModel + binding.lifecycleOwner = this + + initLayout() + addListeners() + collectData() + } + + private fun initLayout() { + + } + + private fun addListeners() { + + } + + private fun collectData() { + + } +} diff --git a/app/src/main/res/drawable/ic_detail.xml b/app/src/main/res/drawable/ic_detail.xml new file mode 100644 index 00000000..ad33042d --- /dev/null +++ b/app/src/main/res/drawable/ic_detail.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/activity_my.xml b/app/src/main/res/layout/activity_my.xml new file mode 100644 index 00000000..7ad227ca --- /dev/null +++ b/app/src/main/res/layout/activity_my.xml @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index de4d88da..0f21069a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,6 +1,7 @@ KeepGoEat upload + 1.0.0 킵고잇 @@ -85,11 +86,21 @@ 전체 + 마이페이지 보관한 목표 총 달성일 진행기간 %s. %s. %s ~ %s. %s. %s 로그아웃 탈퇴하기 + 문의 및 피드백 + 문의하기 + 리뷰 남기기 + 앱 정보 + 서비스 소개 + 버전 정보 + 약관 및 정책 + 서비스 이용약관 + 개인정보처리방침 \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 8e833921..937dfb58 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -118,6 +118,13 @@ 8dp + + + + + + + + + \ No newline at end of file From 120fb335ce8ca31a134880e6ee00b44aeb3ef572 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 15 Feb 2023 17:13:22 +0900 Subject: [PATCH 395/745] =?UTF-8?q?=20[feat]=20#154=20=ED=99=88=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=A7=88=EC=9D=B4=ED=8E=98=EC=9D=B4=EC=A7=80?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/presentation/home/HomeActivity.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 40d624f0..31423611 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -9,6 +9,7 @@ import org.keepgoeat.databinding.ActivityHomeBinding import org.keepgoeat.domain.model.HomeGoal import org.keepgoeat.presentation.detail.GoalDetailActivity import org.keepgoeat.presentation.my.AchievedGoalActivity +import org.keepgoeat.presentation.my.MyActivity import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.binding.BindingActivity @@ -75,7 +76,7 @@ class HomeActivity : BindingActivity(R.layout.activity_home } private fun moveToMy() { - val intent = Intent(this@HomeActivity, AchievedGoalActivity::class.java) + val intent = Intent(this@HomeActivity, MyActivity::class.java) startActivity(intent) } From 2dbc8e64875b15ccb48da897b4f552eda2f01082 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 15 Feb 2023 17:18:14 +0900 Subject: [PATCH 396/745] =?UTF-8?q?=20[feat]=20#154=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=EC=84=9C=20=EB=B3=B4?= =?UTF-8?q?=EA=B4=80=ED=95=9C=20=EB=AA=A9=ED=91=9C=20=EB=B7=B0=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/my/MyActivity.kt | 13 +++++++++++++ app/src/main/res/layout/activity_my.xml | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt index 2e2c86d7..0878f759 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt @@ -1,5 +1,6 @@ package org.keepgoeat.presentation.my +import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import dagger.hilt.android.AndroidEntryPoint @@ -26,7 +27,19 @@ class MyActivity : BindingActivity(R.layout.activity_my) { } private fun addListeners() { + binding.tvAchievedGoal.setOnClickListener { + moveToAchievedGoalDetail() + } + binding.tvAchievedGoalCount.setOnClickListener { + moveToAchievedGoalDetail() + } + binding.ivAchievedGoalDetail.setOnClickListener { + moveToAchievedGoalDetail() + } + } + private fun moveToAchievedGoalDetail() { + startActivity(Intent(this, AchievedGoalActivity::class.java)) } private fun collectData() { diff --git a/app/src/main/res/layout/activity_my.xml b/app/src/main/res/layout/activity_my.xml index 7ad227ca..f6ba6cbc 100644 --- a/app/src/main/res/layout/activity_my.xml +++ b/app/src/main/res/layout/activity_my.xml @@ -59,7 +59,6 @@ tools:text="keepgoeat@kakao.com" /> Date: Wed, 15 Feb 2023 17:20:34 +0900 Subject: [PATCH 397/745] =?UTF-8?q?=20[del]=20#154=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_my.xml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/layout/activity_my.xml b/app/src/main/res/layout/activity_my.xml index f6ba6cbc..7c3b9849 100644 --- a/app/src/main/res/layout/activity_my.xml +++ b/app/src/main/res/layout/activity_my.xml @@ -106,8 +106,7 @@ android:id="@+id/view_divider_achieved_goal" style="@style/Widget.Divider" android:layout_width="match_parent" - android:layout_marginTop="@dimen/spacing12" - app:layout_constraintTop_toBottomOf="@id/layout_achieved_goal" /> + android:layout_marginTop="@dimen/spacing12" /> + android:layout_marginTop="@dimen/spacing16" /> + android:layout_marginTop="@dimen/spacing16" /> Date: Wed, 15 Feb 2023 17:22:47 +0900 Subject: [PATCH 398/745] =?UTF-8?q?=20[feat]=20#154=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=B0=B1=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=ED=81=B4=EB=A6=AD=20=EC=8B=9C=20=EC=9D=B4=EC=A0=84=ED=99=94?= =?UTF-8?q?=EB=A9=B4=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EB=8F=99=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt index 0878f759..8896b8c8 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt @@ -27,6 +27,9 @@ class MyActivity : BindingActivity(R.layout.activity_my) { } private fun addListeners() { + binding.viewToolbar.ivBack.setOnClickListener { + finish() + } binding.tvAchievedGoal.setOnClickListener { moveToAchievedGoalDetail() } From d2b840b44d80eb016a7b8595bf2363aa318533dd Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 15 Feb 2023 17:24:30 +0900 Subject: [PATCH 399/745] =?UTF-8?q?=20[chore]=20#154=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/presentation/home/HomeActivity.kt | 1 - .../main/java/org/keepgoeat/presentation/my/MyActivity.kt | 7 +------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 31423611..6981774e 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -8,7 +8,6 @@ import org.keepgoeat.R import org.keepgoeat.databinding.ActivityHomeBinding import org.keepgoeat.domain.model.HomeGoal import org.keepgoeat.presentation.detail.GoalDetailActivity -import org.keepgoeat.presentation.my.AchievedGoalActivity import org.keepgoeat.presentation.my.MyActivity import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.binding.BindingActivity diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt index 8896b8c8..3db8ec2d 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt @@ -17,15 +17,10 @@ class MyActivity : BindingActivity(R.layout.activity_my) { binding.viewModel = viewModel binding.lifecycleOwner = this - initLayout() addListeners() collectData() } - private fun initLayout() { - - } - private fun addListeners() { binding.viewToolbar.ivBack.setOnClickListener { finish() @@ -46,6 +41,6 @@ class MyActivity : BindingActivity(R.layout.activity_my) { } private fun collectData() { - + // TODO 보관한 목표 갯수 불러오기 } } From c7277684a9ce7fde0b72e5b5af760c6e3795c3ff Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 15 Feb 2023 17:35:53 +0900 Subject: [PATCH 400/745] =?UTF-8?q?=20[feat]=20#154=20=EA=B3=84=EC=A0=95?= =?UTF-8?q?=20=EC=83=81=EC=84=B8=20=EB=B7=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 5 ++ .../presentation/my/AccountInfoActivity.kt | 27 +++++++ .../main/res/layout/activity_account_info.xml | 73 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 4 files changed, 106 insertions(+) create mode 100644 app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt create mode 100644 app/src/main/res/layout/activity_account_info.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b02507e4..c26b9e9b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -58,6 +58,11 @@ android:exported="false" android:screenOrientation="portrait" tools:ignore="LockedOrientationActivity" /> + (R.layout.activity_account_info) { + private val viewModel: MyViewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding.viewModel = viewModel + binding.lifecycleOwner = this + + addListeners() + } + + private fun addListeners() { + binding.viewToolbar.ivBack.setOnClickListener { + finish() + } + } +} diff --git a/app/src/main/res/layout/activity_account_info.xml b/app/src/main/res/layout/activity_account_info.xml new file mode 100644 index 00000000..8336c4b3 --- /dev/null +++ b/app/src/main/res/layout/activity_account_info.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0f21069a..924abc56 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -103,4 +103,5 @@ 서비스 이용약관 개인정보처리방침 + 계정 정보 \ No newline at end of file From 902393207cd65b5570f22c8a3b0364529f142de8 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 15 Feb 2023 17:37:32 +0900 Subject: [PATCH 401/745] =?UTF-8?q?=20[feat]=20#154=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=EC=84=9C=20=EA=B3=84?= =?UTF-8?q?=EC=A0=95=EC=A0=95=EB=B3=B4=20=EB=B7=B0=20=EC=9D=B4=EB=8F=99=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 --- app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt index 3db8ec2d..5c5c3619 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyActivity.kt @@ -25,6 +25,9 @@ class MyActivity : BindingActivity(R.layout.activity_my) { binding.viewToolbar.ivBack.setOnClickListener { finish() } + binding.tvUserName.setOnClickListener { + startActivity(Intent(this, AccountInfoActivity::class.java)) + } binding.tvAchievedGoal.setOnClickListener { moveToAchievedGoalDetail() } From a808a32bafd358b1d6e5d4918b84be240e3e3d0c Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 15 Feb 2023 17:47:36 +0900 Subject: [PATCH 402/745] =?UTF-8?q?=20[del]=20#154=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=ED=95=9C=20=EB=AA=A9=ED=91=9C=EB=B7=B0=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=8D=94=EB=AF=B8=20=EB=B7=B0=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/my/AchievedGoalActivity.kt | 50 ------------------- .../res/layout/activity_achieved_goal.xml | 20 -------- 2 files changed, 70 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt index b675bda3..21431a46 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt @@ -11,25 +11,15 @@ import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.keepgoeat.R -import org.keepgoeat.data.service.KakaoAuthService -import org.keepgoeat.data.service.NaverAuthService import org.keepgoeat.databinding.ActivityAchievedGoalBinding import org.keepgoeat.presentation.home.HomeActivity -import org.keepgoeat.presentation.sign.SignActivity import org.keepgoeat.presentation.type.EatingType -import org.keepgoeat.presentation.type.SocialLoginType import org.keepgoeat.presentation.type.SortType import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity -import javax.inject.Inject @AndroidEntryPoint class AchievedGoalActivity : BindingActivity(R.layout.activity_achieved_goal) { - @Inject - lateinit var kakaoSignService: KakaoAuthService - - @Inject - lateinit var naverSignService: NaverAuthService private val viewModel: MyViewModel by viewModels() private val goalAdapter = AchievedGoalAdapter() private val headerAdapter = AchievedGoalHeaderAdapter(::getFilteredGoalWithEatingType) @@ -74,20 +64,6 @@ class AchievedGoalActivity : BindingActivity(R.layo binding.ivBack.setOnClickListener { moveToPrevious() } - binding.tvLogout.setOnClickListener { - when (viewModel.loginPlatForm) { - SocialLoginType.NAVER -> naverSignService.logoutNaver(viewModel::logout) - SocialLoginType.KAKAO -> kakaoSignService.logoutKakao(viewModel::logout) - else -> {} - } - } - binding.tvDeleteAccount.setOnClickListener { - when (viewModel.loginPlatForm) { - SocialLoginType.NAVER -> naverSignService.deleteAccountNaver(viewModel::deleteAccount) - SocialLoginType.KAKAO -> kakaoSignService.deleteAccountKakao(viewModel::deleteAccount) - else -> {} - } - } } private fun collectData() { @@ -101,32 +77,6 @@ class AchievedGoalActivity : BindingActivity(R.layo else -> {} } }.launchIn(lifecycleScope) - - viewModel.logoutUiState.flowWithLifecycle(lifecycle).onEach { - when (it) { - is UiState.Success -> { - startActivity(Intent(this, SignActivity::class.java)) - finish() - } - is UiState.Error -> { - // TODO 로그아웃 실패 시 예외 처리 - } - else -> {} - } - }.launchIn(lifecycleScope) - - viewModel.deleteAccountUiState.flowWithLifecycle(lifecycle).onEach { - when (it) { - is UiState.Success -> { - startActivity(Intent(this, SignActivity::class.java)) - finish() - } - is UiState.Error -> { - // TODO 회원 탈퇴 실패 시 예외 처리 - } - else -> {} - } - }.launchIn(lifecycleScope) } private fun moveToHome() { diff --git a/app/src/main/res/layout/activity_achieved_goal.xml b/app/src/main/res/layout/activity_achieved_goal.xml index 6257c207..6d32f93a 100644 --- a/app/src/main/res/layout/activity_achieved_goal.xml +++ b/app/src/main/res/layout/activity_achieved_goal.xml @@ -34,26 +34,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - - - - - Date: Wed, 15 Feb 2023 17:48:04 +0900 Subject: [PATCH 403/745] =?UTF-8?q?=20[chore]=20#154=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=ED=95=9C=20=EB=AA=A9=ED=91=9C=20=EB=B6=88=EB=9F=AC=EC=98=A4?= =?UTF-8?q?=EA=B8=B0=20=ED=95=A8=EC=88=98=20=ED=98=B8=EC=B6=9C=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/my/AchievedGoalActivity.kt | 1 + .../main/java/org/keepgoeat/presentation/my/MyViewModel.kt | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt index 21431a46..81466ab8 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt @@ -38,6 +38,7 @@ class AchievedGoalActivity : BindingActivity(R.layo binding.lifecycleOwner = this isEnteredFromKeep = intent.getBooleanExtra(ARG_IS_ENTERED_FROM_KEEP, false) + viewModel.fetchAchievedGoalBySort(SortType.ALL) initLayout() addListeners() diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt index b8f1118c..8b32b687 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt @@ -29,10 +29,6 @@ class MyViewModel @Inject constructor( val deleteAccountUiState get() = _deleteAccountUiState.asStateFlow() val loginPlatForm = localStorage.loginPlatform - init { - fetchAchievedGoalBySort(SortType.ALL) - } - fun fetchAchievedGoalBySort(sortType: SortType) { viewModelScope.launch { myRepository.fetchMyData(sortType.name.lowercase()) From 9c3856003b598fc18c4fe629be3e0910c47c1d04 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 15 Feb 2023 18:46:24 +0900 Subject: [PATCH 404/745] =?UTF-8?q?=20[feat]=20#154=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=EB=8B=A4=EC=9D=B4=EC=96=BC=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/my/LogoutDialogFragment.kt | 47 ++++++++++ .../util/binding/BindingDialogFragment.kt | 40 +++++++++ app/src/main/res/layout/dialog_logout.xml | 89 +++++++++++++++++++ app/src/main/res/values/strings.xml | 4 + app/src/main/res/values/themes.xml | 7 ++ 5 files changed, 187 insertions(+) create mode 100644 app/src/main/java/org/keepgoeat/presentation/my/LogoutDialogFragment.kt create mode 100644 app/src/main/java/org/keepgoeat/util/binding/BindingDialogFragment.kt create mode 100644 app/src/main/res/layout/dialog_logout.xml diff --git a/app/src/main/java/org/keepgoeat/presentation/my/LogoutDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/my/LogoutDialogFragment.kt new file mode 100644 index 00000000..1a556a26 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/my/LogoutDialogFragment.kt @@ -0,0 +1,47 @@ +package org.keepgoeat.presentation.my + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.activityViewModels +import dagger.hilt.android.AndroidEntryPoint +import org.keepgoeat.R +import org.keepgoeat.data.service.KakaoAuthService +import org.keepgoeat.data.service.NaverAuthService +import org.keepgoeat.databinding.DialogLogoutBinding +import org.keepgoeat.presentation.type.SocialLoginType +import org.keepgoeat.util.binding.BindingDialogFragment +import javax.inject.Inject + +@AndroidEntryPoint +class LogoutDialogFragment : BindingDialogFragment(R.layout.dialog_logout) { + @Inject + lateinit var kakaoSignService: KakaoAuthService + + @Inject + lateinit var naverSignService: NaverAuthService + + private val viewModel: MyViewModel by activityViewModels() + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.viewModel = viewModel + binding.lifecycleOwner = viewLifecycleOwner + + addListeners() + addListeners() + } + + private fun addListeners() { + binding.yes.setOnClickListener { + when (viewModel.loginPlatForm) { + SocialLoginType.NAVER -> naverSignService.logoutNaver(viewModel::logout) + SocialLoginType.KAKAO -> kakaoSignService.logoutKakao(viewModel::logout) + else -> {} + } + dismiss() + } + binding.no.setOnClickListener { + dismiss() + } + } +} diff --git a/app/src/main/java/org/keepgoeat/util/binding/BindingDialogFragment.kt b/app/src/main/java/org/keepgoeat/util/binding/BindingDialogFragment.kt new file mode 100644 index 00000000..ca9b98e0 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/util/binding/BindingDialogFragment.kt @@ -0,0 +1,40 @@ +package org.keepgoeat.util.binding + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import androidx.annotation.LayoutRes +import androidx.databinding.DataBindingUtil +import androidx.databinding.ViewDataBinding +import androidx.fragment.app.DialogFragment + +abstract class BindingDialogFragment(@LayoutRes private val layoutResId: Int) : + DialogFragment() { + private var _binding: B? = null + val binding get() = requireNotNull(_binding!!) { "${this::class.java.simpleName}에서 에러가 발생했습니다." } + + override fun onStart() { + super.onStart() + dialog?.window?.setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.WRAP_CONTENT + ) + dialog?.window?.setBackgroundDrawableResource(android.R.color.transparent) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View { + _binding = DataBindingUtil.inflate(inflater, layoutResId, container, false) + return binding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} diff --git a/app/src/main/res/layout/dialog_logout.xml b/app/src/main/res/layout/dialog_logout.xml new file mode 100644 index 00000000..d5f8ea23 --- /dev/null +++ b/app/src/main/res/layout/dialog_logout.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 924abc56..79308a1f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -11,6 +11,8 @@ 아니오 %s 더 먹기 %s 덜 먹기 + 취소 + 카카오톡 로그인 @@ -104,4 +106,6 @@ 개인정보처리방침 계정 정보 + 로그아웃 하시겠어요? + 그동안의 기록은 사라지지 않으니\n안심하고 다녀오세요. \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 937dfb58..29e2672e 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -153,4 +153,11 @@ @style/TextAppearance.System4 @color/gray_800 + + \ No newline at end of file From 00eaa0401444f7af71efc6f9b74ce44871fe6e90 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Wed, 15 Feb 2023 18:46:55 +0900 Subject: [PATCH 405/745] =?UTF-8?q?=20[feat]=20#154=20=EA=B3=84=EC=A0=95?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=EB=B7=B0=EC=97=90=EC=84=9C=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=95=84=EC=9B=83=20=EB=B0=8F=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=ED=83=88=ED=87=B4=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/my/AccountInfoActivity.kt | 59 ++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt index 733944a5..e3c05430 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt @@ -1,14 +1,31 @@ package org.keepgoeat.presentation.my +import android.content.Intent import android.os.Bundle import androidx.activity.viewModels +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import org.keepgoeat.R +import org.keepgoeat.data.service.KakaoAuthService +import org.keepgoeat.data.service.NaverAuthService import org.keepgoeat.databinding.ActivityAccountInfoBinding +import org.keepgoeat.presentation.sign.SignActivity +import org.keepgoeat.presentation.type.SocialLoginType +import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity +import javax.inject.Inject @AndroidEntryPoint -class AccountInfoActivity : BindingActivity(R.layout.activity_account_info) { +class AccountInfoActivity : + BindingActivity(R.layout.activity_account_info) { + @Inject + lateinit var kakaoSignService: KakaoAuthService + + @Inject + lateinit var naverSignService: NaverAuthService private val viewModel: MyViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { @@ -17,11 +34,51 @@ class AccountInfoActivity : BindingActivity(R.layout binding.lifecycleOwner = this addListeners() + collectData() } private fun addListeners() { binding.viewToolbar.ivBack.setOnClickListener { finish() } + binding.tvLogout.setOnClickListener { + LogoutDialogFragment().show(supportFragmentManager, "LogoutDialog") + } + binding.tvDeleteAccount.setOnClickListener { + // TODO 탈퇴 화면으로 이동 + when (viewModel.loginPlatForm) { + SocialLoginType.NAVER -> naverSignService.deleteAccountNaver(viewModel::deleteAccount) + SocialLoginType.KAKAO -> kakaoSignService.deleteAccountKakao(viewModel::deleteAccount) + else -> {} + } + } + } + + private fun collectData() { + viewModel.logoutUiState.flowWithLifecycle(lifecycle).onEach { + when (it) { + is UiState.Success -> { + startActivity(Intent(this, SignActivity::class.java)) + finish() + } + is UiState.Error -> { + // TODO 로그아웃 실패 시 예외 처리 + } + else -> {} + } + }.launchIn(lifecycleScope) + + viewModel.deleteAccountUiState.flowWithLifecycle(lifecycle).onEach { + when (it) { + is UiState.Success -> { + startActivity(Intent(this, SignActivity::class.java)) + finish() + } + is UiState.Error -> { + // TODO 회원 탈퇴 실패 시 예외 처리 + } + else -> {} + } + }.launchIn(lifecycleScope) } } From d2fd60458917ba642bfeab996fecf7b5eb3ea9cf Mon Sep 17 00:00:00 2001 From: youngjinc Date: Thu, 16 Feb 2023 09:43:21 +0900 Subject: [PATCH 406/745] =?UTF-8?q?=20[fix]=20#154=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=EB=B0=8F=20=ED=9A=8C=EC=9B=90=20=ED=83=88?= =?UTF-8?q?=ED=87=B4=20=ED=9B=84=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EB=8F=99=ED=96=88?= =?UTF-8?q?=EC=9D=84=20=EB=95=8C=20=EB=B0=B1=EB=B2=84=ED=8A=BC=EC=9D=84=20?= =?UTF-8?q?=EB=88=84=EB=A5=B4=EB=A9=B4=20=EC=95=B1=EC=9D=B4=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=EB=90=98=20=EC=95=8A=EA=B3=A0=20=EC=9D=B4=EC=A0=84=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=EC=9D=B4=20=EB=B3=B4=EC=9D=B4=EB=8A=94=20?= =?UTF-8?q?=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/home/HomeActivity.kt | 12 ++++++++++++ .../presentation/my/AccountInfoActivity.kt | 18 +++++++++++++----- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 6981774e..b356e872 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -9,6 +9,7 @@ import org.keepgoeat.databinding.ActivityHomeBinding import org.keepgoeat.domain.model.HomeGoal import org.keepgoeat.presentation.detail.GoalDetailActivity import org.keepgoeat.presentation.my.MyActivity +import org.keepgoeat.presentation.sign.SignActivity import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.binding.BindingActivity @@ -22,6 +23,8 @@ class HomeActivity : BindingActivity(R.layout.activity_home binding.viewModel = viewModel binding.lifecycleOwner = this + if (intent.getBooleanExtra(KILL_HOME_AND_GO_TO_SIGN, false)) moveToSign() + initLayout() addListeners() addObservers() @@ -82,4 +85,13 @@ class HomeActivity : BindingActivity(R.layout.activity_home private fun changeGoalItemBtnColor(myGoal: HomeGoal) { viewModel.changeGoalAchieved(myGoal) } + + private fun moveToSign() { + startActivity(Intent(this, SignActivity::class.java)) + finish() + } + + companion object { + const val KILL_HOME_AND_GO_TO_SIGN = "killHomeAndGoToSign" + } } diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt index e3c05430..d98d076c 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt @@ -12,7 +12,8 @@ import org.keepgoeat.R import org.keepgoeat.data.service.KakaoAuthService import org.keepgoeat.data.service.NaverAuthService import org.keepgoeat.databinding.ActivityAccountInfoBinding -import org.keepgoeat.presentation.sign.SignActivity +import org.keepgoeat.presentation.home.HomeActivity +import org.keepgoeat.presentation.home.HomeActivity.Companion.KILL_HOME_AND_GO_TO_SIGN import org.keepgoeat.presentation.type.SocialLoginType import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity @@ -58,8 +59,7 @@ class AccountInfoActivity : viewModel.logoutUiState.flowWithLifecycle(lifecycle).onEach { when (it) { is UiState.Success -> { - startActivity(Intent(this, SignActivity::class.java)) - finish() + moveToSign() } is UiState.Error -> { // TODO 로그아웃 실패 시 예외 처리 @@ -71,8 +71,7 @@ class AccountInfoActivity : viewModel.deleteAccountUiState.flowWithLifecycle(lifecycle).onEach { when (it) { is UiState.Success -> { - startActivity(Intent(this, SignActivity::class.java)) - finish() + moveToSign() } is UiState.Error -> { // TODO 회원 탈퇴 실패 시 예외 처리 @@ -81,4 +80,13 @@ class AccountInfoActivity : } }.launchIn(lifecycleScope) } + + private fun moveToSign() { + Intent(this, HomeActivity::class.java).apply { + flags = Intent.FLAG_ACTIVITY_CLEAR_TOP + putExtra(KILL_HOME_AND_GO_TO_SIGN, true) + }.also { + startActivity(it) + } + } } From 9b2de21cbd17284d59a92acef1dd883a4ad4ade5 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Thu, 16 Feb 2023 10:09:59 +0900 Subject: [PATCH 407/745] =?UTF-8?q?=20[fix]=20#154=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=ED=9B=84=20=EC=9E=AC=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EC=8B=9C=20=EC=98=A8=EB=B3=B4=EB=94=A9=EC=9D=B4=20?= =?UTF-8?q?=EB=8B=A4=EC=8B=9C=20=EB=9C=A8=EB=8A=94=20=EB=B2=84=EA=B7=B8=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 --- .../data/datasource/local/KGEDataSource.kt | 14 +++++++++++--- .../data/repository/AuthRepositoryImpl.kt | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt index fd80fbf7..ee50d285 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt @@ -56,17 +56,25 @@ class KGEDataSource @Inject constructor(@ApplicationContext context: Context) { get() = safeValueOf(dataStore.getString(LOGIN_PLATFORM, "")) ?: SocialLoginType.NONE - fun clear() { + /** 로그아웃 및 회원 탈퇴 시 유저의 데이터를 삭제하는 함수 (단, 로그아웃의 경우 IS_CLICKED_ONBOARDING_BUTTON은 제외하고 삭제한다. 재로그인 시 온보딩 띄우기를 방지하기 위함)*/ + fun clear(isWithdrawal: Boolean = false) { dataStore.edit { - clear() + if (isWithdrawal) { + clear() + } else { + remove(ACCESS_TOKEN) + remove(REFRESH_TOKEN) + remove(IS_LOGIN) + remove(LOGIN_PLATFORM) + } } } companion object { const val FILE_NAME = "signSharedPreferences" const val ACCESS_TOKEN = "accessToken" - const val IS_LOGIN = "isLogin" const val REFRESH_TOKEN = "refreshToken" + const val IS_LOGIN = "isLogin" const val IS_CLICKED_ONBOARDING_BUTTON = "isClickedOnboardingButton" const val LOGIN_PLATFORM = "loginPlatform" } diff --git a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt index 67a06bd6..b41f375d 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/AuthRepositoryImpl.kt @@ -34,7 +34,7 @@ class AuthRepositoryImpl @Inject constructor( authDataSource.deleteAccount() }.onSuccess { Timber.d("회원 탈퇴 성공") - localStorage.clear() + localStorage.clear(true) }.onFailure { Timber.e(it.message) } From 838e82a6b82c0d4dbd3354ac437274e0d6cf5683 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Thu, 16 Feb 2023 10:15:44 +0900 Subject: [PATCH 408/745] =?UTF-8?q?=20[chore]=20#154=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_account_info.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/res/layout/activity_account_info.xml b/app/src/main/res/layout/activity_account_info.xml index 8336c4b3..09de14e2 100644 --- a/app/src/main/res/layout/activity_account_info.xml +++ b/app/src/main/res/layout/activity_account_info.xml @@ -23,7 +23,6 @@ layout="@layout/view_toolbar" app:title="@{context.getString(R.string.my_account_info)}" /> - Date: Thu, 16 Feb 2023 10:21:30 +0900 Subject: [PATCH 409/745] =?UTF-8?q?=20[chore]=20#154=20=EB=B3=80=EC=88=98?= =?UTF-8?q?=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/presentation/home/HomeActivity.kt | 4 ++-- .../java/org/keepgoeat/presentation/my/AccountInfoActivity.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index b356e872..48afeba2 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -23,7 +23,7 @@ class HomeActivity : BindingActivity(R.layout.activity_home binding.viewModel = viewModel binding.lifecycleOwner = this - if (intent.getBooleanExtra(KILL_HOME_AND_GO_TO_SIGN, false)) moveToSign() + if (intent.getBooleanExtra(ARG_KILL_HOME_AND_GO_TO_SIGN, false)) moveToSign() initLayout() addListeners() @@ -92,6 +92,6 @@ class HomeActivity : BindingActivity(R.layout.activity_home } companion object { - const val KILL_HOME_AND_GO_TO_SIGN = "killHomeAndGoToSign" + const val ARG_KILL_HOME_AND_GO_TO_SIGN = "killHomeAndGoToSign" } } diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt index d98d076c..32630726 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt @@ -13,7 +13,7 @@ import org.keepgoeat.data.service.KakaoAuthService import org.keepgoeat.data.service.NaverAuthService import org.keepgoeat.databinding.ActivityAccountInfoBinding import org.keepgoeat.presentation.home.HomeActivity -import org.keepgoeat.presentation.home.HomeActivity.Companion.KILL_HOME_AND_GO_TO_SIGN +import org.keepgoeat.presentation.home.HomeActivity.Companion.ARG_KILL_HOME_AND_GO_TO_SIGN import org.keepgoeat.presentation.type.SocialLoginType import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity @@ -84,7 +84,7 @@ class AccountInfoActivity : private fun moveToSign() { Intent(this, HomeActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_CLEAR_TOP - putExtra(KILL_HOME_AND_GO_TO_SIGN, true) + putExtra(ARG_KILL_HOME_AND_GO_TO_SIGN, true) }.also { startActivity(it) } From f98025de677bd76aa8ef5c0cb3653375267966d8 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Thu, 16 Feb 2023 11:31:17 +0900 Subject: [PATCH 410/745] =?UTF-8?q?=20[refactor]=20#156=20=ED=88=B4?= =?UTF-8?q?=EB=B0=94=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20=EC=9E=AC?= =?UTF-8?q?=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/my/AchievedGoalActivity.kt | 2 +- .../setting/GoalSettingActivity.kt | 2 +- .../res/layout/activity_achieved_goal.xml | 25 +++----------- .../main/res/layout/activity_goal_setting.xml | 33 +++---------------- 4 files changed, 11 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt index 81466ab8..50bcef95 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt @@ -62,7 +62,7 @@ class AchievedGoalActivity : BindingActivity(R.layo } private fun addListeners() { - binding.ivBack.setOnClickListener { + binding.viewToolbar.ivBack.setOnClickListener { moveToPrevious() } } diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt index 7b3c8ca0..4722e355 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt @@ -73,7 +73,7 @@ class GoalSettingActivity : showKeyboard(it, false) binding.etGoal.clearFocus() } - binding.ivBack.setOnClickListener { + binding.viewToolbar.ivBack.setOnClickListener { finish() } binding.btnComplete.setOnSingleClickListener { diff --git a/app/src/main/res/layout/activity_achieved_goal.xml b/app/src/main/res/layout/activity_achieved_goal.xml index 6d32f93a..816d4565 100644 --- a/app/src/main/res/layout/activity_achieved_goal.xml +++ b/app/src/main/res/layout/activity_achieved_goal.xml @@ -15,26 +15,9 @@ android:layout_height="match_parent" tools:context=".presentation.my.AchievedGoalActivity"> - - - - - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_goal_setting.xml b/app/src/main/res/layout/activity_goal_setting.xml index 0e01ca7b..10eb0959 100644 --- a/app/src/main/res/layout/activity_goal_setting.xml +++ b/app/src/main/res/layout/activity_goal_setting.xml @@ -19,33 +19,10 @@ android:layout_height="match_parent" tools:context=".presentation.setting.GoalSettingActivity"> - - - - - - + + app:layout_constraintTop_toBottomOf="@id/view_toolbar" /> Date: Thu, 16 Feb 2023 16:37:40 +0900 Subject: [PATCH 411/745] =?UTF-8?q?[chore]=20#112=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=EB=90=9C=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/presentation/home/HomeActivity.kt | 2 +- app/src/main/res/layout/activity_home.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index a07d6ba4..84f5a015 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -61,7 +61,7 @@ class HomeActivity : BindingActivity(R.layout.activity_home }.launchIn(lifecycleScope) goalCount.flowWithLifecycle(lifecycle).onEach { goalCount -> if (goalCount > 0) - binding.ivHomeSnail.setImageResource(R.drawable.img_snail_orange_cheer) + binding.ivHomeSnail.setImageResource(R.drawable.ic_snail_orange_cheer_right) }.launchIn(lifecycleScope) isLottieMoving.flowWithLifecycle(lifecycle).onEach { isLottieMoving -> if (isLottieMoving) { diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 4ba3c432..7d261b48 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -54,10 +54,10 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing16" android:layout_marginTop="32dp" + android:src="@drawable/ic_snail_orange_cheer_right" android:visibility="@{!viewModel.lottieVisibility ? View.VISIBLE : View.INVISIBLE}" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/iv_my_page" - app:src="@drawable/ic_snail_orange_cheer_right" /> + app:layout_constraintTop_toBottomOf="@+id/iv_my_page" /> Date: Thu, 16 Feb 2023 17:16:05 +0900 Subject: [PATCH 412/745] =?UTF-8?q?[mod]=20#112=20=EB=A1=9C=ED=8B=B0=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EB=B3=80=EC=88=98=20lottieState=20?= =?UTF-8?q?=EB=A1=9C=20=ED=95=A9=EC=B9=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/presentation/home/HomeActivity.kt | 14 +++++++++----- .../keepgoeat/presentation/home/HomeViewModel.kt | 16 ++++++---------- .../keepgoeat/presentation/home/ProcessState.kt | 5 +++++ app/src/main/res/layout/activity_home.xml | 10 +++++++--- 4 files changed, 27 insertions(+), 18 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/presentation/home/ProcessState.kt diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index 84f5a015..cd2dde38 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -63,11 +63,15 @@ class HomeActivity : BindingActivity(R.layout.activity_home if (goalCount > 0) binding.ivHomeSnail.setImageResource(R.drawable.ic_snail_orange_cheer_right) }.launchIn(lifecycleScope) - isLottieMoving.flowWithLifecycle(lifecycle).onEach { isLottieMoving -> - if (isLottieMoving) { - binding.lottieSnail.playAnimation() - binding.lottieBackground.playAnimation() - viewModel.makeLottieMove(false) + lottieState.flowWithLifecycle(lifecycle).onEach { lottieState -> + when (lottieState) { + ProcessState.IN_PROGRESS -> { + binding.lottieSnail.playAnimation() + binding.lottieBackground.playAnimation() + viewModel.changeLottieState(ProcessState.DONE) + } + ProcessState.IDLE -> {} + ProcessState.DONE -> {} } }.launchIn(lifecycleScope) } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index bc7e1b70..44498ca2 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -24,10 +24,8 @@ class HomeViewModel @Inject constructor( val hour = _hour.asStateFlow() private val _cheeringMessage = MutableStateFlow("") val cheeringMessage = _cheeringMessage.asStateFlow() - private val _isLottieMoving = MutableStateFlow(false) - val isLottieMoving get() = _isLottieMoving.asStateFlow() - private val _lottieVisibility = MutableStateFlow(false) - val lottieVisibility get() = _lottieVisibility.asStateFlow() + private val _lottieState = MutableStateFlow(ProcessState.IDLE) + val lottieState get() = _lottieState.asStateFlow() init { fetchGoalList() @@ -53,8 +51,7 @@ class HomeViewModel @Inject constructor( ) } if (goalData.updatedIsAchieved) { - _isLottieMoving.value = true - _lottieVisibility.value = true + _lottieState.value = ProcessState.IN_PROGRESS } _goalList.value = list.toMutableList() @@ -71,8 +68,7 @@ class HomeViewModel @Inject constructor( .onSuccess { homeData -> _goalList.value = homeData.toHomeGoal().toMutableList() _cheeringMessage.value = homeData.cheeringMessage.replace("\\n", "\n") - _isLottieMoving.value = false - _lottieVisibility.value = false + _lottieState.value = ProcessState.IDLE _goalCount.value = homeData.goals.size }.onFailure { Timber.e(it.message) @@ -80,7 +76,7 @@ class HomeViewModel @Inject constructor( } } - fun makeLottieMove(state: Boolean) { - _isLottieMoving.value = state + fun changeLottieState(state: ProcessState) { + _lottieState.value = state } } diff --git a/app/src/main/java/org/keepgoeat/presentation/home/ProcessState.kt b/app/src/main/java/org/keepgoeat/presentation/home/ProcessState.kt new file mode 100644 index 00000000..d86f4878 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/home/ProcessState.kt @@ -0,0 +1,5 @@ +package org.keepgoeat.presentation.home + +enum class ProcessState { + IDLE, IN_PROGRESS, DONE +} diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 7d261b48..47be9d18 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -7,6 +7,10 @@ + + @@ -46,7 +50,7 @@ app:layout_constraintTop_toTopOf="parent" app:lottie_autoPlay="false" app:lottie_rawRes="@raw/home_background" - app:visibility="@{viewModel.lottieVisibility}" /> + app:visibility="@{viewModel.lottieState != processState.IDLE}" /> @@ -69,7 +73,7 @@ app:layout_constraintTop_toBottomOf="@+id/iv_my_page" app:lottie_autoPlay="false" app:lottie_rawRes="@raw/home_snail" - app:visibility="@{viewModel.lottieVisibility}" + app:visibility="@{viewModel.lottieState != processState.IDLE}" tools:visibility="invisible" /> Date: Thu, 16 Feb 2023 17:51:40 +0900 Subject: [PATCH 413/745] =?UTF-8?q?[chore]=20#112=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC,=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/home/HomeActivity.kt | 37 +++++++++---------- .../presentation/home/HomeViewModel.kt | 1 + .../{home => type}/ProcessState.kt | 2 +- app/src/main/res/layout/activity_home.xml | 2 +- 4 files changed, 21 insertions(+), 21 deletions(-) rename app/src/main/java/org/keepgoeat/presentation/{home => type}/ProcessState.kt (58%) diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt index cd2dde38..2ca160f3 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeActivity.kt @@ -15,6 +15,7 @@ import org.keepgoeat.presentation.detail.GoalDetailActivity import org.keepgoeat.presentation.my.MyActivity import org.keepgoeat.presentation.sign.SignActivity import org.keepgoeat.presentation.type.EatingType +import org.keepgoeat.presentation.type.ProcessState import org.keepgoeat.util.binding.BindingActivity @AndroidEntryPoint @@ -55,26 +56,24 @@ class HomeActivity : BindingActivity(R.layout.activity_home } private fun collectData() { - with(viewModel) { - goalList.flowWithLifecycle(lifecycle).onEach { goalList -> - goalAdapter.submitList(goalList.toMutableList()) - }.launchIn(lifecycleScope) - goalCount.flowWithLifecycle(lifecycle).onEach { goalCount -> - if (goalCount > 0) - binding.ivHomeSnail.setImageResource(R.drawable.ic_snail_orange_cheer_right) - }.launchIn(lifecycleScope) - lottieState.flowWithLifecycle(lifecycle).onEach { lottieState -> - when (lottieState) { - ProcessState.IN_PROGRESS -> { - binding.lottieSnail.playAnimation() - binding.lottieBackground.playAnimation() - viewModel.changeLottieState(ProcessState.DONE) - } - ProcessState.IDLE -> {} - ProcessState.DONE -> {} + viewModel.goalList.flowWithLifecycle(lifecycle).onEach { goalList -> + goalAdapter.submitList(goalList.toMutableList()) + }.launchIn(lifecycleScope) + viewModel.goalCount.flowWithLifecycle(lifecycle).onEach { goalCount -> + if (goalCount > 0) + binding.ivHomeSnail.setImageResource(R.drawable.ic_snail_orange_cheer_right) + }.launchIn(lifecycleScope) + viewModel.lottieState.flowWithLifecycle(lifecycle).onEach { lottieState -> + when (lottieState) { + ProcessState.IN_PROGRESS -> { + binding.lottieSnail.playAnimation() + binding.lottieBackground.playAnimation() + viewModel.changeLottieState(ProcessState.DONE) } - }.launchIn(lifecycleScope) - } + ProcessState.IDLE -> {} + ProcessState.DONE -> {} + } + }.launchIn(lifecycleScope) } private fun showMakeGoalDialog() { diff --git a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt index 44498ca2..c0ced071 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/home/HomeViewModel.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.keepgoeat.domain.model.HomeGoal import org.keepgoeat.domain.repository.GoalRepository +import org.keepgoeat.presentation.type.ProcessState import timber.log.Timber import java.time.LocalDateTime import javax.inject.Inject diff --git a/app/src/main/java/org/keepgoeat/presentation/home/ProcessState.kt b/app/src/main/java/org/keepgoeat/presentation/type/ProcessState.kt similarity index 58% rename from app/src/main/java/org/keepgoeat/presentation/home/ProcessState.kt rename to app/src/main/java/org/keepgoeat/presentation/type/ProcessState.kt index d86f4878..bd4fad56 100644 --- a/app/src/main/java/org/keepgoeat/presentation/home/ProcessState.kt +++ b/app/src/main/java/org/keepgoeat/presentation/type/ProcessState.kt @@ -1,4 +1,4 @@ -package org.keepgoeat.presentation.home +package org.keepgoeat.presentation.type enum class ProcessState { IDLE, IN_PROGRESS, DONE diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 47be9d18..edfab33b 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -9,7 +9,7 @@ + type="org.keepgoeat.presentation.type.ProcessState" /> Date: Sat, 18 Feb 2023 21:41:49 +0900 Subject: [PATCH 414/745] =?UTF-8?q?[feat]=20#158=20=EB=8D=9C=20=EB=A8=B9?= =?UTF-8?q?=EA=B8=B0=20=EB=AA=A9=ED=91=9C=20=EC=84=A4=EC=A0=95=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=20=EB=B2=84=ED=8A=BC=20selector=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/color/selector_less_complete_button_color.xml | 5 +++++ ...ton_color.xml => selector_more_complete_button_color.xml} | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/color/selector_less_complete_button_color.xml rename app/src/main/res/color/{selector_complete_button_color.xml => selector_more_complete_button_color.xml} (95%) diff --git a/app/src/main/res/color/selector_less_complete_button_color.xml b/app/src/main/res/color/selector_less_complete_button_color.xml new file mode 100644 index 00000000..d198bc8c --- /dev/null +++ b/app/src/main/res/color/selector_less_complete_button_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_complete_button_color.xml b/app/src/main/res/color/selector_more_complete_button_color.xml similarity index 95% rename from app/src/main/res/color/selector_complete_button_color.xml rename to app/src/main/res/color/selector_more_complete_button_color.xml index 9f969702..34b8b6fb 100644 --- a/app/src/main/res/color/selector_complete_button_color.xml +++ b/app/src/main/res/color/selector_more_complete_button_color.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file From 5bcdcc692ae5ebff6e7342fdf925e03881711c5b Mon Sep 17 00:00:00 2001 From: Daeun Date: Sat, 18 Feb 2023 21:43:26 +0900 Subject: [PATCH 415/745] =?UTF-8?q?[feat]=20#158=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=A0=9C=EB=AA=A9=20=EB=94=94=EC=9E=90=EC=9D=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EB=AA=A9=ED=91=9C=20=EB=8B=AC=EC=84=B1?= =?UTF-8?q?=20=EA=B8=B0=EC=A4=80=20=EC=B6=94=EA=B0=80=20=EB=94=94=EC=9E=90?= =?UTF-8?q?=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 2 +- .../setting/GoalSettingViewModel.kt | 6 + .../main/res/layout/activity_goal_setting.xml | 169 ++++++++++++++---- app/src/main/res/values/strings.xml | 9 +- 4 files changed, 147 insertions(+), 39 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c26b9e9b..01ec9e1b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -51,7 +51,7 @@ android:name=".presentation.setting.GoalSettingActivity" android:exported="false" android:screenOrientation="portrait" - android:windowSoftInputMode="adjustResize" + android:windowSoftInputMode="adjustPan|stateVisible" tools:ignore="LockedOrientationActivity" /> ("") + val goalCriterion = MutableStateFlow("") private val _eatingType = MutableStateFlow(null) val eatingType get() = _eatingType.asStateFlow() var goalId: Int? = null @@ -31,6 +32,11 @@ class GoalSettingViewModel @Inject constructor( title.length in 1..15 && title.isNotBlank() && title.matches(TITLE_PATTERN.toRegex()) }.toStateFlow(viewModelScope, false) + val isValidCriterion: StateFlow + get() = goalCriterion.map { criterion -> + criterion.length in 1..20 && criterion.isNotBlank() && criterion.matches(TITLE_PATTERN.toRegex()) + }.toStateFlow(viewModelScope, false) + private val _uploadState = MutableStateFlow>(UiState.Loading) val uploadState: StateFlow> get() = _uploadState diff --git a/app/src/main/res/layout/activity_goal_setting.xml b/app/src/main/res/layout/activity_goal_setting.xml index 10eb0959..bb8d94d8 100644 --- a/app/src/main/res/layout/activity_goal_setting.xml +++ b/app/src/main/res/layout/activity_goal_setting.xml @@ -29,14 +29,14 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" - app:layout_constraintGuide_begin="@dimen/spacingBase" /> + app:layout_constraintGuide_begin="@dimen/spacing16" /> + app:layout_constraintGuide_end="@dimen/spacing16" /> - + + + + + + + + + + + + + + - - + app:layout_constraintTop_toBottomOf="@+id/layout_goal" + tools:text="@string/goal_setting_title_length_guide" /> + + + + + app:layout_constraintStart_toStartOf="@+id/gl_start" + app:layout_constraintTop_toBottomOf="@id/tv_goal_criterion_description"> + + + + app:layout_constraintStart_toStartOf="@id/gl_start" + tools:backgroundTint="@color/selector_more_complete_button_color" /> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 79308a1f..6681f8b7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -66,11 +66,16 @@ 목표 입력 나의 목표를 입력해 볼까요? - ex) 하루 1끼 이상 야채 - ex) 라면 + ex) 물 + ex) 커피 목표는 최소 1글자 이상 입력해주세요. 한글, 영문, 숫자만 입력 가능합니다. (%d/15) + 목표 달성 기준을 세워볼까요? + 나에게 맞는 달성 기준을 세워요. + ex) 하루에 2L씩 마시기 + ex) 아침에 딱 1잔만 마시기 + (%d/20) 목표가 수정되었습니다. 목표가 추가되었습니다. From 902edffe798e7b785712df9194c05c54fd9ba090 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sun, 19 Feb 2023 18:14:03 +0900 Subject: [PATCH 416/745] =?UTF-8?q?[feat]=20#160=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=A0=95=EB=B3=B4=20=EB=B0=9B?= =?UTF-8?q?=EC=95=84=EC=98=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/local/KGEDataSource.kt | 12 ++++++++++++ .../keepgoeat/data/service/KakaoAuthService.kt | 18 ++++++++++++++---- .../org/keepgoeat/domain/model/UserInfo.kt | 6 ++++++ 3 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/domain/model/UserInfo.kt diff --git a/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt index ee50d285..0ef17ff3 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/local/KGEDataSource.kt @@ -56,6 +56,14 @@ class KGEDataSource @Inject constructor(@ApplicationContext context: Context) { get() = safeValueOf(dataStore.getString(LOGIN_PLATFORM, "")) ?: SocialLoginType.NONE + var userEmail: String + set(value) = dataStore.edit { putString(USER_EMAIL, value) } + get() = dataStore.getString(USER_EMAIL, "") ?: "" + + var userName: String + set(value) = dataStore.edit { putString(USER_NAME, value) } + get() = dataStore.getString(USER_NAME, "") ?: "" + /** 로그아웃 및 회원 탈퇴 시 유저의 데이터를 삭제하는 함수 (단, 로그아웃의 경우 IS_CLICKED_ONBOARDING_BUTTON은 제외하고 삭제한다. 재로그인 시 온보딩 띄우기를 방지하기 위함)*/ fun clear(isWithdrawal: Boolean = false) { dataStore.edit { @@ -66,6 +74,8 @@ class KGEDataSource @Inject constructor(@ApplicationContext context: Context) { remove(REFRESH_TOKEN) remove(IS_LOGIN) remove(LOGIN_PLATFORM) + remove(USER_NAME) + remove(USER_EMAIL) } } } @@ -77,5 +87,7 @@ class KGEDataSource @Inject constructor(@ApplicationContext context: Context) { const val IS_LOGIN = "isLogin" const val IS_CLICKED_ONBOARDING_BUTTON = "isClickedOnboardingButton" const val LOGIN_PLATFORM = "loginPlatform" + const val USER_EMAIL = "userEmail" + const val USER_NAME = "userName" } } diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index 1f98ca7a..30240ab8 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -4,6 +4,7 @@ import android.content.Context import com.kakao.sdk.auth.model.OAuthToken import com.kakao.sdk.user.UserApiClient import dagger.hilt.android.qualifiers.ActivityContext +import org.keepgoeat.domain.model.UserInfo import org.keepgoeat.presentation.type.SocialLoginType import timber.log.Timber import javax.inject.Inject @@ -15,7 +16,7 @@ class KakaoAuthService @Inject constructor( private val isKakaoTalkLoginAvailable: Boolean get() = client.isKakaoTalkLoginAvailable(context) - fun loginKakao(loginListener: ((SocialLoginType, String) -> Unit)) { + fun loginKakao(loginListener: ((SocialLoginType, String, UserInfo) -> Unit)) { val callback: (OAuthToken?, Throwable?) -> Unit = { token, error -> if (error != null) handleLoginError(error) else if (token != null) handleLoginSuccess(token, loginListener) @@ -32,11 +33,20 @@ class KakaoAuthService @Inject constructor( private fun handleLoginSuccess( oAuthToken: OAuthToken, - loginListener: ((SocialLoginType, String) -> Unit), + loginListener: ((SocialLoginType, String, UserInfo) -> Unit), ) { - client.me { _, _ -> + client.me { user, error -> Timber.d(oAuthToken.accessToken) - loginListener(SocialLoginType.KAKAO, oAuthToken.accessToken) + if (error != null) { + Timber.e("kakao 사용자 정보 요청 실패 ${error}") + } else if (user != null) { + Timber.d("kakao 사용자 정보 요청 성공\n이메일 : ${user.kakaoAccount?.email}\n이름 : ${user.kakaoAccount?.name}") + loginListener( + SocialLoginType.KAKAO, + oAuthToken.accessToken, + UserInfo(user.kakaoAccount?.name ?: "", user.kakaoAccount?.email ?: "") + ) + } } } diff --git a/app/src/main/java/org/keepgoeat/domain/model/UserInfo.kt b/app/src/main/java/org/keepgoeat/domain/model/UserInfo.kt new file mode 100644 index 00000000..28b1a4ff --- /dev/null +++ b/app/src/main/java/org/keepgoeat/domain/model/UserInfo.kt @@ -0,0 +1,6 @@ +package org.keepgoeat.domain.model + +data class UserInfo( + val name: String, + val email: String, +) From 65eb692c6cef56bd37362a77cba6328629886720 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sun, 19 Feb 2023 18:50:04 +0900 Subject: [PATCH 417/745] =?UTF-8?q?[feat]=20#160=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B2=84=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=A0=95=EB=B3=B4=20=EB=B0=9B?= =?UTF-8?q?=EC=95=84=EC=98=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/service/NaverAuthService.kt | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt index a44909ae..beaefccd 100644 --- a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt @@ -4,8 +4,11 @@ import android.content.Context import com.navercorp.nid.NaverIdLoginSDK import com.navercorp.nid.oauth.NidOAuthLogin import com.navercorp.nid.oauth.OAuthLoginCallback +import com.navercorp.nid.profile.NidProfileCallback +import com.navercorp.nid.profile.data.NidProfileResponse import dagger.hilt.android.qualifiers.ActivityContext import org.keepgoeat.BuildConfig +import org.keepgoeat.domain.model.AccountInfo import org.keepgoeat.presentation.type.SocialLoginType import timber.log.Timber import javax.inject.Inject @@ -20,12 +23,12 @@ class NaverAuthService @Inject constructor( ) } - fun loginNaver(loginListener: ((SocialLoginType, String) -> Unit)) { + fun loginNaver(loginListener: ((SocialLoginType, String, AccountInfo) -> Unit)) { val oauthLoginCallback = object : OAuthLoginCallback { override fun onSuccess() { val accessToken = requireNotNull(NaverIdLoginSDK.getAccessToken()) Timber.d(accessToken) - loginListener(SocialLoginType.NAVER, accessToken) + getAccountInfo(accessToken, loginListener) } override fun onFailure(httpStatus: Int, message: String) { @@ -42,6 +45,29 @@ class NaverAuthService @Inject constructor( ) } + fun getAccountInfo( + accessToken: String, + loginListener: ((SocialLoginType, String, AccountInfo) -> Unit) + ) { + NidOAuthLogin().callProfileApi(object : NidProfileCallback { + override fun onSuccess(result: NidProfileResponse) { + loginListener( + SocialLoginType.NAVER, + accessToken, + AccountInfo(result.profile?.name ?: "", result.profile?.email ?: "") + ) + } + + override fun onFailure(httpStatus: Int, message: String) { + Timber.i("Error : ${httpStatus}, message : $message") + } + + override fun onError(errorCode: Int, message: String) { + onFailure(errorCode, message) + } + }) + } + fun logoutNaver(logoutListener: (() -> Unit)) { NaverIdLoginSDK.logout() logoutListener() From 8dbdc36e4d6bfca94f06c6bbdb80c1185e308987 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sun, 19 Feb 2023 18:50:29 +0900 Subject: [PATCH 418/745] =?UTF-8?q?[chore]=20#160=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/data/service/KakaoAuthService.kt | 8 ++++---- .../domain/model/{UserInfo.kt => AccountInfo.kt} | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) rename app/src/main/java/org/keepgoeat/domain/model/{UserInfo.kt => AccountInfo.kt} (77%) diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index 30240ab8..c3a66e5a 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -4,7 +4,7 @@ import android.content.Context import com.kakao.sdk.auth.model.OAuthToken import com.kakao.sdk.user.UserApiClient import dagger.hilt.android.qualifiers.ActivityContext -import org.keepgoeat.domain.model.UserInfo +import org.keepgoeat.domain.model.AccountInfo import org.keepgoeat.presentation.type.SocialLoginType import timber.log.Timber import javax.inject.Inject @@ -16,7 +16,7 @@ class KakaoAuthService @Inject constructor( private val isKakaoTalkLoginAvailable: Boolean get() = client.isKakaoTalkLoginAvailable(context) - fun loginKakao(loginListener: ((SocialLoginType, String, UserInfo) -> Unit)) { + fun loginKakao(loginListener: ((SocialLoginType, String, AccountInfo) -> Unit)) { val callback: (OAuthToken?, Throwable?) -> Unit = { token, error -> if (error != null) handleLoginError(error) else if (token != null) handleLoginSuccess(token, loginListener) @@ -33,7 +33,7 @@ class KakaoAuthService @Inject constructor( private fun handleLoginSuccess( oAuthToken: OAuthToken, - loginListener: ((SocialLoginType, String, UserInfo) -> Unit), + loginListener: ((SocialLoginType, String, AccountInfo) -> Unit), ) { client.me { user, error -> Timber.d(oAuthToken.accessToken) @@ -44,7 +44,7 @@ class KakaoAuthService @Inject constructor( loginListener( SocialLoginType.KAKAO, oAuthToken.accessToken, - UserInfo(user.kakaoAccount?.name ?: "", user.kakaoAccount?.email ?: "") + AccountInfo(user.kakaoAccount?.name ?: "", user.kakaoAccount?.email ?: "") ) } } diff --git a/app/src/main/java/org/keepgoeat/domain/model/UserInfo.kt b/app/src/main/java/org/keepgoeat/domain/model/AccountInfo.kt similarity index 77% rename from app/src/main/java/org/keepgoeat/domain/model/UserInfo.kt rename to app/src/main/java/org/keepgoeat/domain/model/AccountInfo.kt index 28b1a4ff..692d59c0 100644 --- a/app/src/main/java/org/keepgoeat/domain/model/UserInfo.kt +++ b/app/src/main/java/org/keepgoeat/domain/model/AccountInfo.kt @@ -1,6 +1,6 @@ package org.keepgoeat.domain.model -data class UserInfo( +data class AccountInfo( val name: String, val email: String, ) From 8a30b7642178030e576d9df79499174d952b794f Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sun, 19 Feb 2023 18:51:08 +0900 Subject: [PATCH 419/745] =?UTF-8?q?[mod]=20#160=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B3=84=EC=A0=95=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=B0=94=EC=9D=B8?= =?UTF-8?q?=EB=94=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/presentation/my/MyViewModel.kt | 2 ++ .../java/org/keepgoeat/presentation/sign/SignViewModel.kt | 5 ++++- app/src/main/res/layout/activity_my.xml | 5 ++--- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt index 8b32b687..b80b7025 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt @@ -28,6 +28,8 @@ class MyViewModel @Inject constructor( MutableStateFlow>(UiState.Loading) val deleteAccountUiState get() = _deleteAccountUiState.asStateFlow() val loginPlatForm = localStorage.loginPlatform + val userName = localStorage.userName + val userEmail = localStorage.userEmail fun fetchAchievedGoalBySort(sortType: SortType) { viewModelScope.launch { diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt index 4bd346ea..8355e187 100644 --- a/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.data.model.request.RequestAuth +import org.keepgoeat.domain.model.AccountInfo import org.keepgoeat.domain.repository.AuthRepository import org.keepgoeat.presentation.type.SocialLoginType import org.keepgoeat.util.UiState @@ -22,8 +23,10 @@ class SignViewModel @Inject constructor( private var _loginUiState = MutableStateFlow>>(UiState.Loading) val loginUiState get() = _loginUiState.asStateFlow() - fun login(loginPlatForm: SocialLoginType, accessToken: String) { + fun login(loginPlatForm: SocialLoginType, accessToken: String, accountInfo: AccountInfo) { localStorage.loginPlatform = loginPlatForm + localStorage.userName = accountInfo.name + localStorage.userEmail = accountInfo.email viewModelScope.launch { authRepository.login( RequestAuth(accessToken, loginPlatForm.name) diff --git a/app/src/main/res/layout/activity_my.xml b/app/src/main/res/layout/activity_my.xml index 7c3b9849..76443303 100644 --- a/app/src/main/res/layout/activity_my.xml +++ b/app/src/main/res/layout/activity_my.xml @@ -33,7 +33,6 @@ android:layout_height="wrap_content" android:orientation="vertical"> - From 4d2e648a1b7f55f94aa1420fbe07a1de1f00ed3f Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sun, 19 Feb 2023 18:59:49 +0900 Subject: [PATCH 420/745] =?UTF-8?q?[chore]=20#160=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/keepgoeat/data/service/KakaoAuthService.kt | 2 +- .../main/java/org/keepgoeat/data/service/NaverAuthService.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index c3a66e5a..5edc4295 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -38,7 +38,7 @@ class KakaoAuthService @Inject constructor( client.me { user, error -> Timber.d(oAuthToken.accessToken) if (error != null) { - Timber.e("kakao 사용자 정보 요청 실패 ${error}") + Timber.e("kakao 사용자 정보 요청 실패 $error") } else if (user != null) { Timber.d("kakao 사용자 정보 요청 성공\n이메일 : ${user.kakaoAccount?.email}\n이름 : ${user.kakaoAccount?.name}") loginListener( diff --git a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt index beaefccd..86538c39 100644 --- a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt @@ -59,7 +59,7 @@ class NaverAuthService @Inject constructor( } override fun onFailure(httpStatus: Int, message: String) { - Timber.i("Error : ${httpStatus}, message : $message") + Timber.i("Error : $httpStatus, message : $message") } override fun onError(errorCode: Int, message: String) { From 10fdb41467340be7785e91be974d4ec22b5b76c5 Mon Sep 17 00:00:00 2001 From: Daeun Date: Mon, 20 Feb 2023 00:07:49 +0900 Subject: [PATCH 421/745] =?UTF-8?q?[feat]=20#158=20flow=EC=9D=98=20combine?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9=ED=95=B4=20=EB=91=90=20stateflow=20?= =?UTF-8?q?=EA=B2=B0=ED=95=A9=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/setting/GoalSettingViewModel.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt index 373d2138..e34056d4 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt @@ -3,10 +3,7 @@ package org.keepgoeat.presentation.setting import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import org.keepgoeat.domain.repository.GoalRepository import org.keepgoeat.presentation.model.GoalContent @@ -37,6 +34,10 @@ class GoalSettingViewModel @Inject constructor( criterion.length in 1..20 && criterion.isNotBlank() && criterion.matches(TITLE_PATTERN.toRegex()) }.toStateFlow(viewModelScope, false) + val isEnabledCompleteButton: StateFlow = combine(isValidTitle, isValidCriterion) { title, criterion -> + title && criterion + }.toStateFlow(viewModelScope, false) + private val _uploadState = MutableStateFlow>(UiState.Loading) val uploadState: StateFlow> get() = _uploadState From 56d6863a66fb04607450fd7fc78717fbdce8ffb4 Mon Sep 17 00:00:00 2001 From: Daeun Date: Mon, 20 Feb 2023 00:08:52 +0900 Subject: [PATCH 422/745] =?UTF-8?q?[mod]=20#158=20=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=20=EB=B2=84=ED=8A=BC=20=EB=B9=84=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94,=20=ED=99=9C=EC=84=B1=ED=99=94=20=EB=90=98=EB=8F=84?= =?UTF-8?q?=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 --- .../main/res/layout/activity_goal_setting.xml | 126 ++++++++---------- 1 file changed, 53 insertions(+), 73 deletions(-) diff --git a/app/src/main/res/layout/activity_goal_setting.xml b/app/src/main/res/layout/activity_goal_setting.xml index bb8d94d8..10b2899e 100644 --- a/app/src/main/res/layout/activity_goal_setting.xml +++ b/app/src/main/res/layout/activity_goal_setting.xml @@ -60,49 +60,40 @@ app:layout_constraintStart_toEndOf="@id/tv_goal_title" app:layout_constraintTop_toTopOf="@+id/tv_goal_title" /> - - - - - - - - - + app:layout_constraintStart_toStartOf="@id/gl_start" + app:layout_constraintTop_toBottomOf="@id/tv_goal_title" + tools:hint="@string/goal_setting_title_hint_for_more"> + + + + + - - - - + app:layout_constraintStart_toStartOf="@id/gl_start" + app:layout_constraintTop_toBottomOf="@id/tv_goal_criterion_description" + tools:hint="@string/goal_setting_criterion_title_hint_for_more" /> Date: Mon, 20 Feb 2023 00:23:01 +0900 Subject: [PATCH 423/745] =?UTF-8?q?[chore]=20#158=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_goal_setting.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/res/layout/activity_goal_setting.xml b/app/src/main/res/layout/activity_goal_setting.xml index 10b2899e..73a5bdf1 100644 --- a/app/src/main/res/layout/activity_goal_setting.xml +++ b/app/src/main/res/layout/activity_goal_setting.xml @@ -57,8 +57,7 @@ android:textAppearance="@style/TextAppearance.System2_Bold" android:textColor="@color/orange_600" app:layout_constraintBottom_toBottomOf="@+id/tv_goal_title" - app:layout_constraintStart_toEndOf="@id/tv_goal_title" - app:layout_constraintTop_toTopOf="@+id/tv_goal_title" /> + app:layout_constraintStart_toEndOf="@id/tv_goal_title" /> Date: Wed, 22 Feb 2023 23:47:38 +0900 Subject: [PATCH 424/745] =?UTF-8?q?[mod]=20#160=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B2=84,=20=EC=B9=B4=EC=B9=B4=EC=98=A4=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=A0=95=EB=B3=B4=20=EC=A0=80=EC=9E=A5=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/service/KakaoAuthService.kt | 25 +++++++++++-------- .../data/service/NaverAuthService.kt | 22 ++++++++-------- .../presentation/sign/SignActivity.kt | 4 +-- .../presentation/sign/SignViewModel.kt | 9 ++++--- 4 files changed, 35 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index 5edc4295..08432d36 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -16,10 +16,13 @@ class KakaoAuthService @Inject constructor( private val isKakaoTalkLoginAvailable: Boolean get() = client.isKakaoTalkLoginAvailable(context) - fun loginKakao(loginListener: ((SocialLoginType, String, AccountInfo) -> Unit)) { + fun loginKakao( + loginListener: ((SocialLoginType, String) -> Unit), + accountListener: ((AccountInfo) -> Unit) + ) { val callback: (OAuthToken?, Throwable?) -> Unit = { token, error -> if (error != null) handleLoginError(error) - else if (token != null) handleLoginSuccess(token, loginListener) + else if (token != null) handleLoginSuccess(token, loginListener, accountListener) } if (isKakaoTalkLoginAvailable) client.loginWithKakaoTalk(context, callback = callback) @@ -33,18 +36,20 @@ class KakaoAuthService @Inject constructor( private fun handleLoginSuccess( oAuthToken: OAuthToken, - loginListener: ((SocialLoginType, String, AccountInfo) -> Unit), + loginListener: ((SocialLoginType, String) -> Unit), + accountListener: ((AccountInfo) -> Unit), ) { client.me { user, error -> Timber.d(oAuthToken.accessToken) - if (error != null) { - Timber.e("kakao 사용자 정보 요청 실패 $error") - } else if (user != null) { + loginListener(SocialLoginType.KAKAO, oAuthToken.accessToken) + if (error != null) Timber.e("kakao 사용자 정보 요청 실패 $error") + else if (user != null) { Timber.d("kakao 사용자 정보 요청 성공\n이메일 : ${user.kakaoAccount?.email}\n이름 : ${user.kakaoAccount?.name}") - loginListener( - SocialLoginType.KAKAO, - oAuthToken.accessToken, - AccountInfo(user.kakaoAccount?.name ?: "", user.kakaoAccount?.email ?: "") + accountListener( + AccountInfo( + user.kakaoAccount?.name ?: "", + user.kakaoAccount?.email ?: "" + ) ) } } diff --git a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt index 86538c39..103a10dd 100644 --- a/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/NaverAuthService.kt @@ -23,12 +23,16 @@ class NaverAuthService @Inject constructor( ) } - fun loginNaver(loginListener: ((SocialLoginType, String, AccountInfo) -> Unit)) { + fun loginNaver( + loginListener: ((SocialLoginType, String) -> Unit), + accountListener: (AccountInfo) -> Unit + ) { val oauthLoginCallback = object : OAuthLoginCallback { override fun onSuccess() { val accessToken = requireNotNull(NaverIdLoginSDK.getAccessToken()) Timber.d(accessToken) - getAccountInfo(accessToken, loginListener) + loginListener(SocialLoginType.NAVER, accessToken) + getAccountInfo(accountListener) } override fun onFailure(httpStatus: Int, message: String) { @@ -45,16 +49,14 @@ class NaverAuthService @Inject constructor( ) } - fun getAccountInfo( - accessToken: String, - loginListener: ((SocialLoginType, String, AccountInfo) -> Unit) - ) { + fun getAccountInfo(accountListener: (AccountInfo) -> Unit) { NidOAuthLogin().callProfileApi(object : NidProfileCallback { override fun onSuccess(result: NidProfileResponse) { - loginListener( - SocialLoginType.NAVER, - accessToken, - AccountInfo(result.profile?.name ?: "", result.profile?.email ?: "") + accountListener( + AccountInfo( + result.profile?.name ?: "", + result.profile?.email ?: "" + ) ) } diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt index cd812fae..450cc9f1 100644 --- a/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/sign/SignActivity.kt @@ -36,10 +36,10 @@ class SignActivity : BindingActivity(R.layout.activity_sign private fun addListeners() { binding.layoutKakaoSignIn.setOnClickListener { - kakaoSignService.loginKakao(viewModel::login) + kakaoSignService.loginKakao(viewModel::login, viewModel::saveAccount) } binding.layoutNaverSignIn.setOnClickListener { - naverSignService.loginNaver(viewModel::login) + naverSignService.loginNaver(viewModel::login, viewModel::saveAccount) } } diff --git a/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt index 8355e187..3c576dd4 100644 --- a/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/sign/SignViewModel.kt @@ -23,10 +23,8 @@ class SignViewModel @Inject constructor( private var _loginUiState = MutableStateFlow>>(UiState.Loading) val loginUiState get() = _loginUiState.asStateFlow() - fun login(loginPlatForm: SocialLoginType, accessToken: String, accountInfo: AccountInfo) { + fun login(loginPlatForm: SocialLoginType, accessToken: String) { localStorage.loginPlatform = loginPlatForm - localStorage.userName = accountInfo.name - localStorage.userEmail = accountInfo.email viewModelScope.launch { authRepository.login( RequestAuth(accessToken, loginPlatForm.name) @@ -40,6 +38,11 @@ class SignViewModel @Inject constructor( } } + fun saveAccount(accountInfo: AccountInfo) { + localStorage.userName = accountInfo.name + localStorage.userEmail = accountInfo.email + } + companion object { private const val SIGN_UP = "signup" } From 730c2de3991ea497ed6629d6693e1514373c622f Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Thu, 23 Feb 2023 00:01:35 +0900 Subject: [PATCH 425/745] =?UTF-8?q?[mod]=20#162=20=ED=99=88=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EC=A1=B0=ED=9A=8C=20API=20:=20goalContent=20->=20f?= =?UTF-8?q?ood,=20criterion=20=EC=9C=BC=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 --- .../java/org/keepgoeat/data/model/response/ResponseHome.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseHome.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseHome.kt index 1e2a8ded..fe38c92f 100644 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseHome.kt +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseHome.kt @@ -20,7 +20,8 @@ data class ResponseHome( ) { @Serializable data class Goal( - val goalContent: String, + val food: String, + val criterion: String, val goalId: Int, val isAchieved: Boolean, val isMore: Boolean, @@ -35,7 +36,7 @@ data class ResponseHome( fun toHomeGoal() = goals.map { goal -> HomeGoal( goal.goalId, - goal.goalContent, + goal.food + " " + goal.criterion, goal.isMore, goal.isAchieved, goal.thisMonthCount, From 81b02cadbdc782931c845abe7fc3326369ce1bae Mon Sep 17 00:00:00 2001 From: Daeun Date: Thu, 23 Feb 2023 13:08:36 +0900 Subject: [PATCH 426/745] =?UTF-8?q?[mod]=20#164=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20Request=20Body=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/data/model/request/RequestGoalContent.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalContent.kt b/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalContent.kt index 0581f0d2..c6a8f44b 100644 --- a/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalContent.kt +++ b/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalContent.kt @@ -4,6 +4,7 @@ import kotlinx.serialization.Serializable @Serializable data class RequestGoalContent( - val goalContent: String, + val food: String, + val criterion: String, val isMore: Boolean, ) From 82515afebd41de98577dbbea75ea70f6691cda88 Mon Sep 17 00:00:00 2001 From: Daeun Date: Thu, 23 Feb 2023 13:11:50 +0900 Subject: [PATCH 427/745] =?UTF-8?q?[feat]=20#164=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=EC=9D=98=20=EA=B8=B0=EC=A4=80=20api=20?= =?UTF-8?q?=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/presentation/setting/GoalSettingViewModel.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt index e34056d4..221284d0 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt @@ -50,6 +50,7 @@ class GoalSettingViewModel @Inject constructor( viewModelScope.launch { goalRepository.uploadGoalContent( goalTitle.value.trim(), + goalCriterion.value.trim(), eatingType.value == EatingType.MORE ).onSuccess { _uploadState.value = UiState.Success(it) @@ -80,7 +81,8 @@ class GoalSettingViewModel @Inject constructor( fun setGoalContent(goal: GoalContent) { goalId = goal.id - goalTitle.value = goal.goalTitle + goalTitle.value = goal.food + goalCriterion.value = goal.criterion } companion object { From 69395ef26f2c2a1ccf4b5ce9ee0a220dd0398280 Mon Sep 17 00:00:00 2001 From: Daeun Date: Thu, 23 Feb 2023 13:14:52 +0900 Subject: [PATCH 428/745] =?UTF-8?q?[feat]=20#164=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20Response=20Body=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/data/model/response/ResponseGoalDetail.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDetail.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDetail.kt index e5cb93e3..89ae7c92 100644 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDetail.kt +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseGoalDetail.kt @@ -19,16 +19,18 @@ data class ResponseGoalDetail( val isMore: Boolean, val thisMonthCount: Int, val lastMonthCount: Int, - val goalContent: String, val blankBoxCount: Int, val emptyBoxCount: Int, + val food: String, + val criterion: String ) { fun toGoalDetail() = GoalDetail( id = id, eatingType = if (isMore) EatingType.MORE else EatingType.LESS, thisMonthCount = thisMonthCount, lastMonthCount = lastMonthCount, - goalTitle = goalContent + food = food, + criterion = criterion ) } } From e0dd6314e5d7e3e2af66c4c1b3e908e9419c537c Mon Sep 17 00:00:00 2001 From: Daeun Date: Thu, 23 Feb 2023 13:15:40 +0900 Subject: [PATCH 429/745] =?UTF-8?q?[mod]=20#164=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20data=20=EA=B5=AC=EC=A1=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/keepgoeat/domain/model/GoalDetail.kt | 3 ++- app/src/main/res/layout/activity_goal_detail.xml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/domain/model/GoalDetail.kt b/app/src/main/java/org/keepgoeat/domain/model/GoalDetail.kt index 6e6a45a3..2007fe39 100644 --- a/app/src/main/java/org/keepgoeat/domain/model/GoalDetail.kt +++ b/app/src/main/java/org/keepgoeat/domain/model/GoalDetail.kt @@ -7,5 +7,6 @@ data class GoalDetail( val eatingType: EatingType, val thisMonthCount: Int, val lastMonthCount: Int, - val goalTitle: String, + val food: String, + val criterion: String ) diff --git a/app/src/main/res/layout/activity_goal_detail.xml b/app/src/main/res/layout/activity_goal_detail.xml index eaf0c731..b7361c16 100644 --- a/app/src/main/res/layout/activity_goal_detail.xml +++ b/app/src/main/res/layout/activity_goal_detail.xml @@ -93,7 +93,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing8" - android:text="@{@string/goal_detail_title(viewModel.goalDetail.goalTitle, viewModel.goalDetail == null ? `` : context.getString(viewModel.goalDetail.eatingType.strRes))}" + android:text="@{@string/goal_detail_title(viewModel.goalDetail.food, viewModel.goalDetail == null ? `` : context.getString(viewModel.goalDetail.eatingType.strRes))}" android:textAppearance="@style/TextAppearance.System2_Bold" android:textColor="@color/gray_800" app:layout_constraintEnd_toEndOf="@id/gl_end" From 35e000007f99b3017a6ede1490c81de6d46677cf Mon Sep 17 00:00:00 2001 From: Daeun Date: Thu, 23 Feb 2023 13:17:17 +0900 Subject: [PATCH 430/745] =?UTF-8?q?[mod]=20#164=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20Request=20Body=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/data/model/request/RequestGoalContentTitle.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalContentTitle.kt b/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalContentTitle.kt index 5acd6727..643a017c 100644 --- a/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalContentTitle.kt +++ b/app/src/main/java/org/keepgoeat/data/model/request/RequestGoalContentTitle.kt @@ -4,5 +4,6 @@ import kotlinx.serialization.Serializable @Serializable data class RequestGoalContentTitle( - val goalContent: String, + val food: String, + val criterion: String ) From 0a4d74b02a7372e65c826e56bb045964552dc8e8 Mon Sep 17 00:00:00 2001 From: Daeun Date: Thu, 23 Feb 2023 13:18:20 +0900 Subject: [PATCH 431/745] =?UTF-8?q?[mod]=20#164=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=83=81=EC=84=B8,=20=EB=AA=A9=ED=91=9C=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20=EB=B0=94=EB=80=90=20data=20=EA=B5=AC=EC=A1=B0=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/data/repository/GoalRepositoryImpl.kt | 10 ++++++---- .../org/keepgoeat/domain/repository/GoalRepository.kt | 6 ++++-- .../presentation/detail/GoalDetailActivity.kt | 2 +- .../org/keepgoeat/presentation/model/GoalContent.kt | 3 ++- .../presentation/setting/GoalSettingViewModel.kt | 4 ++-- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index 21079e64..f8c551b6 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -27,18 +27,20 @@ class GoalRepositoryImpl @Inject constructor( } override suspend fun uploadGoalContent( - title: String, + food: String, + criterion: String, isMore: Boolean, ): Result = runCatching { - goalDataSource.uploadGoalContent(RequestGoalContent(title, isMore)).data.id + goalDataSource.uploadGoalContent(RequestGoalContent(food, criterion, isMore)).data.id } override suspend fun editGoalContent( id: Int, - title: String, + food: String, + criterion: String ): Result = runCatching { - goalDataSource.editGoalContent(id, RequestGoalContentTitle(title)).data.id + goalDataSource.editGoalContent(id, RequestGoalContentTitle(food, criterion)).data.id } override suspend fun fetchGoalDetail(goalId: Int): Result = diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 09ac2abe..57563887 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -13,13 +13,15 @@ interface GoalRepository { ): Result suspend fun uploadGoalContent( - title: String, + food: String, + criterion: String, isMore: Boolean ): Result suspend fun editGoalContent( id: Int, - title: String + food: String, + criterion: String ): Result suspend fun fetchHomeEntireData(): Result diff --git a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt index 118349ae..fec4514d 100644 --- a/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/detail/GoalDetailActivity.kt @@ -82,7 +82,7 @@ class GoalDetailActivity : } binding.ivEdit.setOnClickListener { viewModel.goalDetail.value?.let { detail -> - val content = GoalContent(detail.id, detail.goalTitle) + val content = GoalContent(detail.id, detail.food, detail.criterion) Intent(this, GoalSettingActivity::class.java).apply { putExtra(ARG_GOAL_CONTENT, content) putExtra(ARG_EATING_TYPE, detail.eatingType.name) diff --git a/app/src/main/java/org/keepgoeat/presentation/model/GoalContent.kt b/app/src/main/java/org/keepgoeat/presentation/model/GoalContent.kt index 8ceae8f9..d83670c8 100644 --- a/app/src/main/java/org/keepgoeat/presentation/model/GoalContent.kt +++ b/app/src/main/java/org/keepgoeat/presentation/model/GoalContent.kt @@ -6,5 +6,6 @@ import kotlinx.parcelize.Parcelize @Parcelize data class GoalContent( val id: Int, - val goalTitle: String, + val food: String, + val criterion: String ) : Parcelable diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt index 221284d0..58980c07 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt @@ -63,8 +63,8 @@ class GoalSettingViewModel @Inject constructor( private fun editGoal() { viewModelScope.launch { - safeLet(goalId, goalTitle.value) { id, title -> - goalRepository.editGoalContent(id, title) + safeLet(goalId, goalTitle.value, goalCriterion.value) { id, food, criterion -> + goalRepository.editGoalContent(id, food, criterion) .onSuccess { _uploadState.value = UiState.Success(it) }.onFailure { From e152ab55158aef9c9fca9b9d6e952a114420f462 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Thu, 23 Feb 2023 17:04:55 +0900 Subject: [PATCH 432/745] =?UTF-8?q?=20[mod]=20#166=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=EB=90=9C=20=EB=AA=A9=ED=91=9C(=EA=B8=B0=EC=A1=B4=20=EB=A7=88?= =?UTF-8?q?=EC=9D=B4=ED=8E=98=EC=9D=B4=EC=A7=80)=20api=20response=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/data/model/response/ResponseMy.kt | 11 ++++++----- .../main/java/org/keepgoeat/data/service/MyService.kt | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseMy.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseMy.kt index 886a5bda..03b8b63b 100644 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseMy.kt +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseMy.kt @@ -8,30 +8,31 @@ data class ResponseMy( val status: Int, val success: Boolean, val message: String, - val data: MyData + val data: MyData, ) { @Serializable data class MyData( val goals: List, - val goalCount: Int + val goalCount: Int, ) { @Serializable data class GoalInfo( val goalId: Int, - val goalContent: String, + val food: String, + val criterion: String, val isMore: Boolean, val isOngoing: Boolean, val writerId: Int, val totalCount: Int, val startedAt: String, val keptAt: String?, - val isAchieved: Boolean + val isAchieved: Boolean, ) fun toMyGoal() = goals.map { goal -> MyGoal( goal.goalId, - goal.goalContent, + "${goal.food} ${goal.criterion}", goal.isMore, goal.startedAt, goal.keptAt, diff --git a/app/src/main/java/org/keepgoeat/data/service/MyService.kt b/app/src/main/java/org/keepgoeat/data/service/MyService.kt index 952d8612..88df9b2c 100644 --- a/app/src/main/java/org/keepgoeat/data/service/MyService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/MyService.kt @@ -5,7 +5,7 @@ import retrofit2.http.GET import retrofit2.http.Query interface MyService { - @GET("mypage") + @GET("goal/kept") suspend fun fetchMyData( @Query("sort") value: String, ): ResponseMy From 94a2d7dd80ae339bc558db1671118da93d5933f1 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Thu, 23 Feb 2023 17:05:42 +0900 Subject: [PATCH 433/745] =?UTF-8?q?=20[feat]=20#166=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=EB=90=9C=20=EB=AA=A9=ED=91=9C=20=EC=88=98=20=EB=B6=88=EB=9F=AC?= =?UTF-8?q?=EC=98=A4=EA=B8=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/my/AchievedGoalActivity.kt | 1 - .../main/java/org/keepgoeat/presentation/my/MyViewModel.kt | 7 +++++++ app/src/main/res/layout/activity_my.xml | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt index 50bcef95..162fe1de 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt @@ -38,7 +38,6 @@ class AchievedGoalActivity : BindingActivity(R.layo binding.lifecycleOwner = this isEnteredFromKeep = intent.getBooleanExtra(ARG_IS_ENTERED_FROM_KEEP, false) - viewModel.fetchAchievedGoalBySort(SortType.ALL) initLayout() addListeners() diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt index b80b7025..810b71ef 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt @@ -24,6 +24,8 @@ class MyViewModel @Inject constructor( val achievedGoalUiState get() = _achievedGoalUiState.asStateFlow() private val _logoutUiState = MutableStateFlow>(UiState.Loading) val logoutUiState get() = _logoutUiState.asStateFlow() + private val _achievedGoalCount = MutableStateFlow(0) + val achievedGoalCount get() = _achievedGoalCount.asStateFlow() private val _deleteAccountUiState = MutableStateFlow>(UiState.Loading) val deleteAccountUiState get() = _deleteAccountUiState.asStateFlow() @@ -31,11 +33,16 @@ class MyViewModel @Inject constructor( val userName = localStorage.userName val userEmail = localStorage.userEmail + init { + fetchAchievedGoalBySort(SortType.ALL) + } + fun fetchAchievedGoalBySort(sortType: SortType) { viewModelScope.launch { myRepository.fetchMyData(sortType.name.lowercase()) .onSuccess { _achievedGoalUiState.value = UiState.Success(it) + _achievedGoalCount.value = it.size }.onFailure { _achievedGoalUiState.value = UiState.Error(null) } diff --git a/app/src/main/res/layout/activity_my.xml b/app/src/main/res/layout/activity_my.xml index 76443303..0ca9a34d 100644 --- a/app/src/main/res/layout/activity_my.xml +++ b/app/src/main/res/layout/activity_my.xml @@ -84,7 +84,7 @@ android:paddingVertical="@dimen/spacing4" android:paddingStart="@dimen/spacing4" android:paddingEnd="9dp" - android:text="3" + android:text="@{viewModel.achievedGoalCount.toString()}" android:textAppearance="@style/TextAppearance.System4_Bold" android:textColor="@color/orange_600" app:layout_constraintBottom_toBottomOf="parent" From 000a90221d4012da237022240ba29c3b29e1cd1c Mon Sep 17 00:00:00 2001 From: youngjinc Date: Thu, 23 Feb 2023 17:19:56 +0900 Subject: [PATCH 434/745] =?UTF-8?q?=20[chore]=20#166=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=EB=90=9C=20=EB=AA=A9=ED=91=9C=20=EB=B6=88=EB=9F=AC=EC=98=A4?= =?UTF-8?q?=EA=B8=B0=20=EA=B4=80=EB=A0=A8=20=ED=95=A8=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20My=20->=20Goal=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=8C=8C=EC=9D=BC=EB=A1=9C=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/GoalDataSource.kt | 7 +++++-- .../keepgoeat/data/repository/GoalRepositoryImpl.kt | 13 ++++++++----- .../java/org/keepgoeat/data/service/GoalService.kt | 5 +++++ .../keepgoeat/domain/repository/GoalRepository.kt | 7 +++---- .../org/keepgoeat/presentation/my/MyViewModel.kt | 6 +++--- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index e534d8f8..102c1106 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -13,6 +13,11 @@ class GoalDataSource @Inject constructor( suspend fun fetchHomeEntireData(): ResponseHome = goalService.fetchHomeEntireData() + suspend fun fetchGoalDetail(id: Int): ResponseGoalDetail = goalService.fetchGoalDetail(id) + + suspend fun fetchAchievedGoal(sortType: String): ResponseMy = + goalService.fetchAchievedGoal(sortType) + suspend fun uploadGoalContent(requestGoalContent: RequestGoalContent): ResponseGoalContent = goalService.uploadGoalContent(requestGoalContent) @@ -21,8 +26,6 @@ class GoalDataSource @Inject constructor( title: RequestGoalContentTitle, ): ResponseGoalContent = goalService.editGoalContent(id, title) - suspend fun fetchGoalDetail(id: Int): ResponseGoalDetail = goalService.fetchGoalDetail(id) - suspend fun keepGoal(id: Int): ResponseGoalKeep = goalService.keepGoal(id) suspend fun achievedGoal( diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index 21079e64..09365aa1 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -4,11 +4,9 @@ import org.keepgoeat.data.datasource.remote.GoalDataSource import org.keepgoeat.data.model.request.RequestGoalAchievement import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.request.RequestGoalContentTitle -import org.keepgoeat.data.model.response.ResponseGoalAchievement -import org.keepgoeat.data.model.response.ResponseGoalDeleted -import org.keepgoeat.data.model.response.ResponseGoalKeep -import org.keepgoeat.data.model.response.ResponseHome +import org.keepgoeat.data.model.response.* import org.keepgoeat.domain.model.GoalDetail +import org.keepgoeat.domain.model.MyGoal import org.keepgoeat.domain.repository.GoalRepository import javax.inject.Inject @@ -21,7 +19,7 @@ class GoalRepositoryImpl @Inject constructor( override suspend fun achieveGoal( goalId: Int, - isAchieved: Boolean + isAchieved: Boolean, ): Result = runCatching { goalDataSource.achievedGoal(goalId, RequestGoalAchievement(isAchieved)).data } @@ -46,6 +44,11 @@ class GoalRepositoryImpl @Inject constructor( goalDataSource.fetchGoalDetail(goalId).data.toGoalDetail() } + override suspend fun fetchAchievedGoal(sortType: String): Result> = + runCatching { + goalDataSource.fetchAchievedGoal(sortType).data.toMyGoal() + } + override suspend fun keepGoal(id: Int): Result = runCatching { goalDataSource.keepGoal(id).data diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index 646f77ed..810b8fa9 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -22,6 +22,11 @@ interface GoalService { @GET("history/{goalId}") suspend fun fetchGoalDetail(@Path("goalId") goalId: Int): ResponseGoalDetail + @GET("goal/kept") + suspend fun fetchAchievedGoal( + @Query("sort") value: String, + ): ResponseMy + @POST("goal/keep/{goalId}") suspend fun keepGoal(@Path("goalId") id: Int): ResponseGoalKeep diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 09ac2abe..1803dbaa 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -1,10 +1,8 @@ package org.keepgoeat.domain.repository -import org.keepgoeat.data.model.response.ResponseGoalAchievement -import org.keepgoeat.data.model.response.ResponseGoalDeleted -import org.keepgoeat.data.model.response.ResponseGoalKeep -import org.keepgoeat.data.model.response.ResponseHome +import org.keepgoeat.data.model.response.* import org.keepgoeat.domain.model.GoalDetail +import org.keepgoeat.domain.model.MyGoal interface GoalRepository { suspend fun achieveGoal( @@ -24,6 +22,7 @@ interface GoalRepository { suspend fun fetchHomeEntireData(): Result suspend fun fetchGoalDetail(goalId: Int): Result + suspend fun fetchAchievedGoal(sortType: String): Result> suspend fun keepGoal(id: Int): Result suspend fun deleteGoal(id: Int): Result } diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt index 810b71ef..cac29322 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt @@ -9,15 +9,15 @@ import kotlinx.coroutines.launch import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.domain.model.MyGoal import org.keepgoeat.domain.repository.AuthRepository -import org.keepgoeat.domain.repository.MyRepository +import org.keepgoeat.domain.repository.GoalRepository import org.keepgoeat.presentation.type.SortType import org.keepgoeat.util.UiState import javax.inject.Inject @HiltViewModel class MyViewModel @Inject constructor( - private val myRepository: MyRepository, private val authRepository: AuthRepository, + private val goalRepository: GoalRepository, private val localStorage: KGEDataSource, ) : ViewModel() { private val _achievedGoalUiState = MutableStateFlow>>(UiState.Loading) @@ -39,7 +39,7 @@ class MyViewModel @Inject constructor( fun fetchAchievedGoalBySort(sortType: SortType) { viewModelScope.launch { - myRepository.fetchMyData(sortType.name.lowercase()) + goalRepository.fetchAchievedGoal(sortType.name.lowercase()) .onSuccess { _achievedGoalUiState.value = UiState.Success(it) _achievedGoalCount.value = it.size From d0d2c016859c8bffd8acac4da39e77f544d531c8 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Thu, 23 Feb 2023 17:22:49 +0900 Subject: [PATCH 435/745] =?UTF-8?q?=20[del]=20#166=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/MyDataSource.kt | 12 ------------ .../keepgoeat/data/repository/MyRepositoryImpl.kt | 15 --------------- .../java/org/keepgoeat/data/service/MyService.kt | 12 ------------ .../java/org/keepgoeat/di/RepositoryModule.kt | 8 -------- .../main/java/org/keepgoeat/di/ServiceModule.kt | 6 ------ .../keepgoeat/domain/repository/MyRepository.kt | 7 ------- 6 files changed, 60 deletions(-) delete mode 100644 app/src/main/java/org/keepgoeat/data/datasource/remote/MyDataSource.kt delete mode 100644 app/src/main/java/org/keepgoeat/data/repository/MyRepositoryImpl.kt delete mode 100644 app/src/main/java/org/keepgoeat/data/service/MyService.kt delete mode 100644 app/src/main/java/org/keepgoeat/domain/repository/MyRepository.kt diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/MyDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/MyDataSource.kt deleted file mode 100644 index 2525bba8..00000000 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/MyDataSource.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.keepgoeat.data.datasource.remote - -import org.keepgoeat.data.model.response.ResponseMy -import org.keepgoeat.data.service.MyService -import javax.inject.Inject - -class MyDataSource @Inject constructor( - private val myService: MyService -) { - suspend fun fetchMyData(sortType: String): ResponseMy = - myService.fetchMyData(sortType) -} diff --git a/app/src/main/java/org/keepgoeat/data/repository/MyRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/MyRepositoryImpl.kt deleted file mode 100644 index fc91afcd..00000000 --- a/app/src/main/java/org/keepgoeat/data/repository/MyRepositoryImpl.kt +++ /dev/null @@ -1,15 +0,0 @@ -package org.keepgoeat.data.repository - -import org.keepgoeat.data.datasource.remote.MyDataSource -import org.keepgoeat.domain.model.MyGoal -import org.keepgoeat.domain.repository.MyRepository -import javax.inject.Inject - -class MyRepositoryImpl @Inject constructor( - private val myDataSource: MyDataSource, -) : MyRepository { - override suspend fun fetchMyData(sortType: String): Result> = - runCatching { - myDataSource.fetchMyData(sortType).data.toMyGoal() - } -} diff --git a/app/src/main/java/org/keepgoeat/data/service/MyService.kt b/app/src/main/java/org/keepgoeat/data/service/MyService.kt deleted file mode 100644 index 88df9b2c..00000000 --- a/app/src/main/java/org/keepgoeat/data/service/MyService.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.keepgoeat.data.service - -import org.keepgoeat.data.model.response.ResponseMy -import retrofit2.http.GET -import retrofit2.http.Query - -interface MyService { - @GET("goal/kept") - suspend fun fetchMyData( - @Query("sort") value: String, - ): ResponseMy -} diff --git a/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt b/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt index 0dfb5fce..5274777c 100644 --- a/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt +++ b/app/src/main/java/org/keepgoeat/di/RepositoryModule.kt @@ -6,10 +6,8 @@ import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import org.keepgoeat.data.repository.AuthRepositoryImpl import org.keepgoeat.data.repository.GoalRepositoryImpl -import org.keepgoeat.data.repository.MyRepositoryImpl import org.keepgoeat.domain.repository.AuthRepository import org.keepgoeat.domain.repository.GoalRepository -import org.keepgoeat.domain.repository.MyRepository import javax.inject.Singleton @Module @@ -21,12 +19,6 @@ interface RepositoryModule { goalRepositoryImpl: GoalRepositoryImpl, ): GoalRepository - @Binds - @Singleton - fun bindMyRepository( - myRepositoryImRepositoryImpl: MyRepositoryImpl, - ): MyRepository - @Binds @Singleton fun bindAuthRepository( diff --git a/app/src/main/java/org/keepgoeat/di/ServiceModule.kt b/app/src/main/java/org/keepgoeat/di/ServiceModule.kt index 3b435bb1..d753278a 100644 --- a/app/src/main/java/org/keepgoeat/di/ServiceModule.kt +++ b/app/src/main/java/org/keepgoeat/di/ServiceModule.kt @@ -6,7 +6,6 @@ import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import org.keepgoeat.data.service.AuthService import org.keepgoeat.data.service.GoalService -import org.keepgoeat.data.service.MyService import retrofit2.Retrofit import javax.inject.Singleton @@ -18,11 +17,6 @@ object ServiceModule { fun provideGoalService(retrofit: Retrofit): GoalService = retrofit.create(GoalService::class.java) - @Singleton - @Provides - fun provideMyService(retrofit: Retrofit): MyService = - retrofit.create(MyService::class.java) - @Singleton @Provides fun provideAuthService(retrofit: Retrofit): AuthService = diff --git a/app/src/main/java/org/keepgoeat/domain/repository/MyRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/MyRepository.kt deleted file mode 100644 index 8ff3af0b..00000000 --- a/app/src/main/java/org/keepgoeat/domain/repository/MyRepository.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.keepgoeat.domain.repository - -import org.keepgoeat.domain.model.MyGoal - -interface MyRepository { - suspend fun fetchMyData(sortType: String): Result> -} From 92fcddf39c4c2947207a40aa0142714539c16553 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Thu, 23 Feb 2023 17:29:53 +0900 Subject: [PATCH 436/745] =?UTF-8?q?=20[chore]=20#166=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=AA=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasource/remote/GoalDataSource.kt | 2 +- .../{ResponseMy.kt => ResponseAchievedGoal.kt} | 10 +++++----- .../keepgoeat/data/repository/GoalRepositoryImpl.kt | 4 ++-- .../java/org/keepgoeat/data/service/GoalService.kt | 2 +- .../java/org/keepgoeat/domain/model/AchievedGoal.kt | 13 +++++-------- .../main/java/org/keepgoeat/domain/model/MyGoal.kt | 10 ---------- .../keepgoeat/domain/repository/GoalRepository.kt | 4 ++-- .../presentation/my/AchievedGoalAdapter.kt | 8 ++++---- .../org/keepgoeat/presentation/my/MyViewModel.kt | 4 ++-- app/src/main/res/layout/item_achieved_goal.xml | 2 +- 10 files changed, 23 insertions(+), 36 deletions(-) rename app/src/main/java/org/keepgoeat/data/model/response/{ResponseMy.kt => ResponseAchievedGoal.kt} (83%) delete mode 100644 app/src/main/java/org/keepgoeat/domain/model/MyGoal.kt diff --git a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt index 102c1106..a14c2390 100644 --- a/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt +++ b/app/src/main/java/org/keepgoeat/data/datasource/remote/GoalDataSource.kt @@ -15,7 +15,7 @@ class GoalDataSource @Inject constructor( suspend fun fetchGoalDetail(id: Int): ResponseGoalDetail = goalService.fetchGoalDetail(id) - suspend fun fetchAchievedGoal(sortType: String): ResponseMy = + suspend fun fetchAchievedGoal(sortType: String): ResponseAchievedGoal = goalService.fetchAchievedGoal(sortType) suspend fun uploadGoalContent(requestGoalContent: RequestGoalContent): ResponseGoalContent = diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseMy.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseAchievedGoal.kt similarity index 83% rename from app/src/main/java/org/keepgoeat/data/model/response/ResponseMy.kt rename to app/src/main/java/org/keepgoeat/data/model/response/ResponseAchievedGoal.kt index 03b8b63b..f8f0ee0d 100644 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseMy.kt +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseAchievedGoal.kt @@ -1,17 +1,17 @@ package org.keepgoeat.data.model.response import kotlinx.serialization.Serializable -import org.keepgoeat.domain.model.MyGoal +import org.keepgoeat.domain.model.AchievedGoal @Serializable -data class ResponseMy( +data class ResponseAchievedGoal( val status: Int, val success: Boolean, val message: String, - val data: MyData, + val data: ResponseAchievedGoalData, ) { @Serializable - data class MyData( + data class ResponseAchievedGoalData( val goals: List, val goalCount: Int, ) { @@ -30,7 +30,7 @@ data class ResponseMy( ) fun toMyGoal() = goals.map { goal -> - MyGoal( + AchievedGoal( goal.goalId, "${goal.food} ${goal.criterion}", goal.isMore, diff --git a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt index 09365aa1..779d0fa1 100644 --- a/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt +++ b/app/src/main/java/org/keepgoeat/data/repository/GoalRepositoryImpl.kt @@ -6,7 +6,7 @@ import org.keepgoeat.data.model.request.RequestGoalContent import org.keepgoeat.data.model.request.RequestGoalContentTitle import org.keepgoeat.data.model.response.* import org.keepgoeat.domain.model.GoalDetail -import org.keepgoeat.domain.model.MyGoal +import org.keepgoeat.domain.model.AchievedGoal import org.keepgoeat.domain.repository.GoalRepository import javax.inject.Inject @@ -44,7 +44,7 @@ class GoalRepositoryImpl @Inject constructor( goalDataSource.fetchGoalDetail(goalId).data.toGoalDetail() } - override suspend fun fetchAchievedGoal(sortType: String): Result> = + override suspend fun fetchAchievedGoal(sortType: String): Result> = runCatching { goalDataSource.fetchAchievedGoal(sortType).data.toMyGoal() } diff --git a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt index 810b8fa9..c72bd509 100644 --- a/app/src/main/java/org/keepgoeat/data/service/GoalService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/GoalService.kt @@ -25,7 +25,7 @@ interface GoalService { @GET("goal/kept") suspend fun fetchAchievedGoal( @Query("sort") value: String, - ): ResponseMy + ): ResponseAchievedGoal @POST("goal/keep/{goalId}") suspend fun keepGoal(@Path("goalId") id: Int): ResponseGoalKeep diff --git a/app/src/main/java/org/keepgoeat/domain/model/AchievedGoal.kt b/app/src/main/java/org/keepgoeat/domain/model/AchievedGoal.kt index 5786cc70..0f298e85 100644 --- a/app/src/main/java/org/keepgoeat/domain/model/AchievedGoal.kt +++ b/app/src/main/java/org/keepgoeat/domain/model/AchievedGoal.kt @@ -1,13 +1,10 @@ package org.keepgoeat.domain.model -import org.keepgoeat.presentation.type.EatingType -import java.time.LocalDate - data class AchievedGoal( val id: Int, - val eatingType: EatingType, - val goalTitle: String, - val totalAchievementDays: Int, - val startAt: LocalDate, - val endAt: LocalDate, + val goalContent: String, + val isMore: Boolean, + val startedAt: String, + val keptAt: String?, + val totalCount: Int, ) diff --git a/app/src/main/java/org/keepgoeat/domain/model/MyGoal.kt b/app/src/main/java/org/keepgoeat/domain/model/MyGoal.kt deleted file mode 100644 index 3cd48a60..00000000 --- a/app/src/main/java/org/keepgoeat/domain/model/MyGoal.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.keepgoeat.domain.model - -data class MyGoal( - val id: Int, - val goalContent: String, - val isMore: Boolean, - val startedAt: String, - val keptAt: String?, - val totalCount: Int -) diff --git a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt index 1803dbaa..5323fbbd 100644 --- a/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt +++ b/app/src/main/java/org/keepgoeat/domain/repository/GoalRepository.kt @@ -2,7 +2,7 @@ package org.keepgoeat.domain.repository import org.keepgoeat.data.model.response.* import org.keepgoeat.domain.model.GoalDetail -import org.keepgoeat.domain.model.MyGoal +import org.keepgoeat.domain.model.AchievedGoal interface GoalRepository { suspend fun achieveGoal( @@ -22,7 +22,7 @@ interface GoalRepository { suspend fun fetchHomeEntireData(): Result suspend fun fetchGoalDetail(goalId: Int): Result - suspend fun fetchAchievedGoal(sortType: String): Result> + suspend fun fetchAchievedGoal(sortType: String): Result> suspend fun keepGoal(id: Int): Result suspend fun deleteGoal(id: Int): Result } diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt index e47908b9..33fd871c 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt @@ -5,13 +5,13 @@ import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import org.keepgoeat.databinding.ItemAchievedGoalBinding -import org.keepgoeat.domain.model.MyGoal +import org.keepgoeat.domain.model.AchievedGoal import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.ItemDiffCallback class AchievedGoalAdapter : - ListAdapter( - ItemDiffCallback( + ListAdapter( + ItemDiffCallback( onContentsTheSame = { old, new -> old == new }, onItemsTheSame = { old, new -> old.id == new.id } ) @@ -21,7 +21,7 @@ class AchievedGoalAdapter : class MyGoalViewHolder(private val binding: ItemAchievedGoalBinding) : RecyclerView.ViewHolder(binding.root) { fun onBind( - data: MyGoal, + data: AchievedGoal, eatingType: EatingType, ) { binding.goal = data diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt index cac29322..77ee21ff 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt @@ -7,7 +7,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.keepgoeat.data.datasource.local.KGEDataSource -import org.keepgoeat.domain.model.MyGoal +import org.keepgoeat.domain.model.AchievedGoal import org.keepgoeat.domain.repository.AuthRepository import org.keepgoeat.domain.repository.GoalRepository import org.keepgoeat.presentation.type.SortType @@ -20,7 +20,7 @@ class MyViewModel @Inject constructor( private val goalRepository: GoalRepository, private val localStorage: KGEDataSource, ) : ViewModel() { - private val _achievedGoalUiState = MutableStateFlow>>(UiState.Loading) + private val _achievedGoalUiState = MutableStateFlow>>(UiState.Loading) val achievedGoalUiState get() = _achievedGoalUiState.asStateFlow() private val _logoutUiState = MutableStateFlow>(UiState.Loading) val logoutUiState get() = _logoutUiState.asStateFlow() diff --git a/app/src/main/res/layout/item_achieved_goal.xml b/app/src/main/res/layout/item_achieved_goal.xml index d7312d84..b4388ffe 100644 --- a/app/src/main/res/layout/item_achieved_goal.xml +++ b/app/src/main/res/layout/item_achieved_goal.xml @@ -11,7 +11,7 @@ + type="org.keepgoeat.domain.model.AchievedGoal" /> Date: Thu, 23 Feb 2023 17:34:48 +0900 Subject: [PATCH 437/745] =?UTF-8?q?=20[chore]=20#166=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=8D=BC=ED=8B=B0=20=EC=9D=B4=EB=A6=84=20=EB=B0=8F=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=ED=83=80=EC=9E=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/model/response/ResponseAchievedGoal.kt | 3 ++- .../org/keepgoeat/domain/model/AchievedGoal.kt | 4 +++- .../presentation/my/AchievedGoalAdapter.kt | 13 ++----------- app/src/main/res/layout/item_achieved_goal.xml | 16 ++++++---------- 4 files changed, 13 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/model/response/ResponseAchievedGoal.kt b/app/src/main/java/org/keepgoeat/data/model/response/ResponseAchievedGoal.kt index f8f0ee0d..62b97098 100644 --- a/app/src/main/java/org/keepgoeat/data/model/response/ResponseAchievedGoal.kt +++ b/app/src/main/java/org/keepgoeat/data/model/response/ResponseAchievedGoal.kt @@ -2,6 +2,7 @@ package org.keepgoeat.data.model.response import kotlinx.serialization.Serializable import org.keepgoeat.domain.model.AchievedGoal +import org.keepgoeat.presentation.type.EatingType @Serializable data class ResponseAchievedGoal( @@ -33,7 +34,7 @@ data class ResponseAchievedGoal( AchievedGoal( goal.goalId, "${goal.food} ${goal.criterion}", - goal.isMore, + if (goal.isMore) EatingType.MORE else EatingType.LESS, goal.startedAt, goal.keptAt, goal.totalCount diff --git a/app/src/main/java/org/keepgoeat/domain/model/AchievedGoal.kt b/app/src/main/java/org/keepgoeat/domain/model/AchievedGoal.kt index 0f298e85..a23276b5 100644 --- a/app/src/main/java/org/keepgoeat/domain/model/AchievedGoal.kt +++ b/app/src/main/java/org/keepgoeat/domain/model/AchievedGoal.kt @@ -1,9 +1,11 @@ package org.keepgoeat.domain.model +import org.keepgoeat.presentation.type.EatingType + data class AchievedGoal( val id: Int, val goalContent: String, - val isMore: Boolean, + val eatingType: EatingType, val startedAt: String, val keptAt: String?, val totalCount: Int, diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt index 33fd871c..d7caa2d1 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt @@ -6,7 +6,6 @@ import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import org.keepgoeat.databinding.ItemAchievedGoalBinding import org.keepgoeat.domain.model.AchievedGoal -import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.util.ItemDiffCallback class AchievedGoalAdapter : @@ -20,12 +19,8 @@ class AchievedGoalAdapter : class MyGoalViewHolder(private val binding: ItemAchievedGoalBinding) : RecyclerView.ViewHolder(binding.root) { - fun onBind( - data: AchievedGoal, - eatingType: EatingType, - ) { + fun onBind(data: AchievedGoal) { binding.goal = data - binding.eatingType = eatingType } } @@ -37,10 +32,6 @@ class AchievedGoalAdapter : } override fun onBindViewHolder(holder: MyGoalViewHolder, position: Int) { - if (currentList[position].isMore) { - holder.onBind(currentList[position], EatingType.MORE) - } else { - holder.onBind(currentList[position], EatingType.LESS) - } + holder.onBind(currentList[position]) } } diff --git a/app/src/main/res/layout/item_achieved_goal.xml b/app/src/main/res/layout/item_achieved_goal.xml index b4388ffe..376acc40 100644 --- a/app/src/main/res/layout/item_achieved_goal.xml +++ b/app/src/main/res/layout/item_achieved_goal.xml @@ -5,10 +5,6 @@ - - @@ -32,19 +28,19 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing24" - app:layout_constraintStart_toStartOf="parent" - app:eatingType="@{eatingType}" /> + app:eatingType="@{goal.eatingType}" + app:layout_constraintStart_toStartOf="parent" /> Date: Thu, 23 Feb 2023 17:38:48 +0900 Subject: [PATCH 438/745] =?UTF-8?q?=20[chore]=20#166=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/presentation/my/AchievedGoalAdapter.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt index d7caa2d1..45c76e31 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt @@ -9,7 +9,7 @@ import org.keepgoeat.domain.model.AchievedGoal import org.keepgoeat.util.ItemDiffCallback class AchievedGoalAdapter : - ListAdapter( + ListAdapter( ItemDiffCallback( onContentsTheSame = { old, new -> old == new }, onItemsTheSame = { old, new -> old.id == new.id } @@ -17,21 +17,21 @@ class AchievedGoalAdapter : ) { private lateinit var inflater: LayoutInflater - class MyGoalViewHolder(private val binding: ItemAchievedGoalBinding) : + class AchievedGoalViewHolder(private val binding: ItemAchievedGoalBinding) : RecyclerView.ViewHolder(binding.root) { fun onBind(data: AchievedGoal) { binding.goal = data } } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyGoalViewHolder { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AchievedGoalViewHolder { if (!::inflater.isInitialized) inflater = LayoutInflater.from(parent.context) - return MyGoalViewHolder(ItemAchievedGoalBinding.inflate(inflater, parent, false)) + return AchievedGoalViewHolder(ItemAchievedGoalBinding.inflate(inflater, parent, false)) } - override fun onBindViewHolder(holder: MyGoalViewHolder, position: Int) { + override fun onBindViewHolder(holder: AchievedGoalViewHolder, position: Int) { holder.onBind(currentList[position]) } } From e2646e1aa6eeb59d334a0cda2ade1035fd23df52 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Thu, 23 Feb 2023 19:00:03 +0900 Subject: [PATCH 439/745] =?UTF-8?q?[mod]=20#160=20=EA=B3=84=EC=A0=95=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=EB=B7=B0=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=97=B0=EA=B2=B0=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_account_info.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/activity_account_info.xml b/app/src/main/res/layout/activity_account_info.xml index 09de14e2..76b6dcb1 100644 --- a/app/src/main/res/layout/activity_account_info.xml +++ b/app/src/main/res/layout/activity_account_info.xml @@ -23,7 +23,6 @@ layout="@layout/view_toolbar" app:title="@{context.getString(R.string.my_account_info)}" /> - @@ -42,7 +41,7 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing16" android:layout_marginTop="@dimen/spacing4" - android:text="keepgoeat@kakao.com" + android:text="@{viewModel.userEmail}" android:textAppearance="@style/TextAppearance.System5" android:textColor="@color/gray_600" tools:text="keepgoeat@kakao.com" /> From 39bb65503d8c948f4f0d8b7cc7edb17b0bf7e1e5 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Thu, 23 Feb 2023 19:00:45 +0900 Subject: [PATCH 440/745] =?UTF-8?q?[mod]=20#160=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20->=20=EB=8B=89=EB=84=A4=EC=9E=84=20?= =?UTF-8?q?=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8A=94=20=EA=B2=83=EC=9C=BC?= =?UTF-8?q?=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 --- .../main/java/org/keepgoeat/data/service/KakaoAuthService.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index 08432d36..5f1471b6 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -44,10 +44,10 @@ class KakaoAuthService @Inject constructor( loginListener(SocialLoginType.KAKAO, oAuthToken.accessToken) if (error != null) Timber.e("kakao 사용자 정보 요청 실패 $error") else if (user != null) { - Timber.d("kakao 사용자 정보 요청 성공\n이메일 : ${user.kakaoAccount?.email}\n이름 : ${user.kakaoAccount?.name}") + Timber.d("kakao 사용자 정보 요청 성공\n이메일 : ${user.kakaoAccount?.email}\n이름 : ${user.kakaoAccount?.profile?.nickname}") accountListener( AccountInfo( - user.kakaoAccount?.name ?: "", + user.kakaoAccount?.profile?.nickname ?: "", user.kakaoAccount?.email ?: "" ) ) From a3e2535efabb19725c852860f4582b1f26890180 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Fri, 24 Feb 2023 21:34:51 +0900 Subject: [PATCH 441/745] =?UTF-8?q?=20[feat]=20#169=20=EB=84=A4=ED=8A=B8?= =?UTF-8?q?=EC=9B=8C=ED=81=AC=20=EC=97=B0=EA=B2=B0=20=EB=81=8A=EC=96=B4?= =?UTF-8?q?=EC=A7=84=20=EC=83=81=ED=83=9C=EC=9D=BC=20=EB=95=8C=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=EB=A9=94=EC=84=B8=EC=A7=80=20=EB=B3=B4=EC=97=AC?= =?UTF-8?q?=EC=A3=BC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 + .../org/keepgoeat/util/ConnectedCompat.kt | 21 +++++++++ .../java/org/keepgoeat/util/NetworkMonitor.kt | 47 +++++++++++++++++++ .../keepgoeat/util/binding/BindingActivity.kt | 18 +++++++ 4 files changed, 87 insertions(+) create mode 100644 app/src/main/java/org/keepgoeat/util/ConnectedCompat.kt create mode 100644 app/src/main/java/org/keepgoeat/util/NetworkMonitor.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 01ec9e1b..a073ad8e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools"> + = callbackFlow { + val callback = object : ConnectivityManager.NetworkCallback() { + override fun onAvailable(network: Network) { + super.onAvailable(network) + trySend(true) + } + + override fun onLost(network: Network) { + trySend(false) + super.onLost(network) + } + } + + trySend(ConnectedCompat.isConnected(connectivityManager)) + connectivityManager.registerNetworkCallback(request, callback) + + awaitClose { + connectivityManager.unregisterNetworkCallback(callback) + } + }.toStateFlow(coroutineScope, false) +} diff --git a/app/src/main/java/org/keepgoeat/util/binding/BindingActivity.kt b/app/src/main/java/org/keepgoeat/util/binding/BindingActivity.kt index e22a0d83..dbd70a29 100644 --- a/app/src/main/java/org/keepgoeat/util/binding/BindingActivity.kt +++ b/app/src/main/java/org/keepgoeat/util/binding/BindingActivity.kt @@ -5,13 +5,31 @@ import androidx.annotation.LayoutRes import androidx.appcompat.app.AppCompatActivity import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope +import com.google.android.material.snackbar.Snackbar +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import org.keepgoeat.util.NetworkMonitor abstract class BindingActivity(@LayoutRes private val layoutRes: Int) : AppCompatActivity() { lateinit var binding: B + private var snackbar: Snackbar? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, layoutRes) + snackbar = Snackbar.make(binding.root, "네트워크를 연결해 주세요", Snackbar.LENGTH_INDEFINITE) + + collectNetworkState() + } + + private fun collectNetworkState() { + NetworkMonitor(this, lifecycleScope).isConnected.flowWithLifecycle(lifecycle) + .onEach { isConnected -> + if (isConnected) snackbar?.dismiss() + else snackbar?.show() + }.launchIn(lifecycleScope) } } From b41b43914f973c289c7a24886a25cf026d74488a Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Fri, 24 Feb 2023 21:36:27 +0900 Subject: [PATCH 442/745] =?UTF-8?q?[chore]=20#160=20timber=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt index 5f1471b6..d0574f6a 100644 --- a/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt +++ b/app/src/main/java/org/keepgoeat/data/service/KakaoAuthService.kt @@ -44,7 +44,6 @@ class KakaoAuthService @Inject constructor( loginListener(SocialLoginType.KAKAO, oAuthToken.accessToken) if (error != null) Timber.e("kakao 사용자 정보 요청 실패 $error") else if (user != null) { - Timber.d("kakao 사용자 정보 요청 성공\n이메일 : ${user.kakaoAccount?.email}\n이름 : ${user.kakaoAccount?.profile?.nickname}") accountListener( AccountInfo( user.kakaoAccount?.profile?.nickname ?: "", From d7e1871ebb05bbdbff9bf2c4ca72da7c12d1c7c0 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sat, 25 Feb 2023 23:35:32 +0900 Subject: [PATCH 443/745] =?UTF-8?q?[feat]=20#172=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=B7=B0=20toolbar,=20=ED=83=80=EC=9D=B4=ED=8B=80=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/withdraw/WithdrawActivity.kt | 18 +++++ .../withdraw/WithdrawViewModel.kt | 6 ++ app/src/main/res/layout/activity_withdraw.xml | 72 +++++++++++++++++++ app/src/main/res/values/strings.xml | 5 ++ 4 files changed, 101 insertions(+) create mode 100644 app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt create mode 100644 app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt create mode 100644 app/src/main/res/layout/activity_withdraw.xml diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt new file mode 100644 index 00000000..c3e3902d --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt @@ -0,0 +1,18 @@ +package org.keepgoeat.presentation.withdraw + +import android.os.Bundle +import androidx.activity.viewModels +import org.keepgoeat.R +import org.keepgoeat.databinding.ActivityWithdrawBinding +import org.keepgoeat.util.binding.BindingActivity + +class WithdrawActivity : BindingActivity(R.layout.activity_withdraw) { + private val viewModel: WithdrawViewModel by viewModels() + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + //binding.viewModel = viewModel + binding.lifecycleOwner = this + + + } +} \ No newline at end of file diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt new file mode 100644 index 00000000..525903e7 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt @@ -0,0 +1,6 @@ +package org.keepgoeat.presentation.withdraw + +import androidx.lifecycle.ViewModel + +class WithdrawViewModel() : ViewModel() { +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_withdraw.xml b/app/src/main/res/layout/activity_withdraw.xml new file mode 100644 index 00000000..657e567a --- /dev/null +++ b/app/src/main/res/layout/activity_withdraw.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6681f8b7..5df01c9d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -113,4 +113,9 @@ 계정 정보 로그아웃 하시겠어요? 그동안의 기록은 사라지지 않으니\n안심하고 다녀오세요. + + + 탈퇴하기 + 그동안 함께 해서 기뻤어요. + 떠났던 이유를 모두 알려주시면 더 나은 킵고잇이 될게요. \ No newline at end of file From 1c2f69a68968f191a915fc3952a6c5b7ecc4d11e Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sun, 26 Feb 2023 23:01:38 +0900 Subject: [PATCH 444/745] =?UTF-8?q?[feat]=20#172=20=ED=83=88=ED=87=B4=20?= =?UTF-8?q?=EB=B7=B0=20=EA=B5=AC=ED=98=84,=20=EC=A7=81=EC=A0=91=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EA=B4=80=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 5 ++ .../presentation/type/WithdrawCheckType.kt | 19 +++++ .../presentation/withdraw/WithdrawActivity.kt | 38 +++++++++- .../withdraw/WithdrawViewModel.kt | 3 +- .../main/res/drawable/ic_checkbox_checked.xml | 10 +++ .../main/res/drawable/ic_checkbox_default.xml | 10 +++ .../drawable/selector_edittext_withdraw.xml | 17 +++++ app/src/main/res/drawable/shape_cursor.xml | 5 ++ app/src/main/res/layout/activity_withdraw.xml | 69 ++++++++++++++++++- app/src/main/res/values/strings.xml | 4 ++ 10 files changed, 176 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/presentation/type/WithdrawCheckType.kt create mode 100644 app/src/main/res/drawable/ic_checkbox_checked.xml create mode 100644 app/src/main/res/drawable/ic_checkbox_default.xml create mode 100644 app/src/main/res/drawable/selector_edittext_withdraw.xml create mode 100644 app/src/main/res/drawable/shape_cursor.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 01ec9e1b..b5f89ac6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -68,6 +68,11 @@ android:exported="false" android:screenOrientation="portrait" tools:ignore="LockedOrientationActivity" /> + diff --git a/app/src/main/java/org/keepgoeat/presentation/type/WithdrawCheckType.kt b/app/src/main/java/org/keepgoeat/presentation/type/WithdrawCheckType.kt new file mode 100644 index 00000000..c6028d3d --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/type/WithdrawCheckType.kt @@ -0,0 +1,19 @@ +package org.keepgoeat.presentation.type + +import androidx.annotation.ColorRes +import androidx.annotation.DrawableRes +import org.keepgoeat.R + +enum class WithdrawCheckType( + @DrawableRes val checkBox: Int, + @ColorRes val descriptionTextColor: Int, +) { + CLICKED( + R.drawable.ic_checkbox_checked, + R.color.orange_600, + ), + DEFAULT( + R.drawable.ic_checkbox_default, + R.color.gray_700, + ) +} diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt index c3e3902d..a8071596 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt @@ -4,15 +4,49 @@ import android.os.Bundle import androidx.activity.viewModels import org.keepgoeat.R import org.keepgoeat.databinding.ActivityWithdrawBinding +import org.keepgoeat.presentation.type.WithdrawCheckType import org.keepgoeat.util.binding.BindingActivity +import org.keepgoeat.util.extension.showKeyboard class WithdrawActivity : BindingActivity(R.layout.activity_withdraw) { private val viewModel: WithdrawViewModel by viewModels() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - //binding.viewModel = viewModel + binding.viewModel = viewModel binding.lifecycleOwner = this + initLayout() + addListeners() + } + + private fun initLayout() { + binding.clickType = WithdrawCheckType.DEFAULT + } + private fun addListeners() { + binding.layoutOtherReason.setOnClickListener { + when (binding.clickType) { + WithdrawCheckType.CLICKED -> { + binding.clickType = WithdrawCheckType.DEFAULT + binding.etOtherReason.clearFocus() + showKeyboard(binding.etOtherReason, false) + } + WithdrawCheckType.DEFAULT -> { + binding.clickType = WithdrawCheckType.CLICKED + binding.etOtherReason.requestFocus() + showKeyboard(binding.etOtherReason, true) + } + else -> {} + } + } + binding.etOtherReason.setOnFocusChangeListener { _, focused -> + if (binding.clickType == WithdrawCheckType.DEFAULT && focused) + binding.clickType = WithdrawCheckType.CLICKED + } + binding.layoutWithdraw.setOnClickListener { + showKeyboard(binding.etOtherReason, false) + binding.etOtherReason.clearFocus() + } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt index 525903e7..ae4fcbb6 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt @@ -3,4 +3,5 @@ package org.keepgoeat.presentation.withdraw import androidx.lifecycle.ViewModel class WithdrawViewModel() : ViewModel() { -} \ No newline at end of file + +} diff --git a/app/src/main/res/drawable/ic_checkbox_checked.xml b/app/src/main/res/drawable/ic_checkbox_checked.xml new file mode 100644 index 00000000..069a7240 --- /dev/null +++ b/app/src/main/res/drawable/ic_checkbox_checked.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_checkbox_default.xml b/app/src/main/res/drawable/ic_checkbox_default.xml new file mode 100644 index 00000000..c83d0044 --- /dev/null +++ b/app/src/main/res/drawable/ic_checkbox_default.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/selector_edittext_withdraw.xml b/app/src/main/res/drawable/selector_edittext_withdraw.xml new file mode 100644 index 00000000..5d639d0a --- /dev/null +++ b/app/src/main/res/drawable/selector_edittext_withdraw.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_cursor.xml b/app/src/main/res/drawable/shape_cursor.xml new file mode 100644 index 00000000..52cda949 --- /dev/null +++ b/app/src/main/res/drawable/shape_cursor.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/activity_withdraw.xml b/app/src/main/res/layout/activity_withdraw.xml index 657e567a..5b487e15 100644 --- a/app/src/main/res/layout/activity_withdraw.xml +++ b/app/src/main/res/layout/activity_withdraw.xml @@ -1,13 +1,23 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + + + + @@ -40,7 +50,64 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/tv_withdraw_title" /> + + + + + + + + + + 탈퇴하기 그동안 함께 해서 기뻤어요. 떠났던 이유를 모두 알려주시면 더 나은 킵고잇이 될게요. + + 식습관 관리를 그만 뒀어요. + 직접 입력 + 다른 이유가 있다면 알려주세요. \ No newline at end of file From 83d832e75a45dd4b7bdc40bf056c9cfb244c86c3 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 27 Feb 2023 00:23:46 +0900 Subject: [PATCH 445/745] =?UTF-8?q?[feat]=20#172=20RecyclerView=20?= =?UTF-8?q?=EC=9D=B4=EC=9A=A9=ED=95=B4=EC=84=9C=20=EB=96=A0=EB=82=98?= =?UTF-8?q?=EB=8A=94=20=EC=9D=B4=EC=9C=A0=204=EA=B0=80=EC=A7=80=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 --- .../keepgoeat/domain/model/WithdrawReason.kt | 8 +++ .../presentation/type/WithdrawCheckType.kt | 4 ++ .../presentation/withdraw/WithdrawActivity.kt | 31 +++++++++-- .../withdraw/WithdrawReasonAdapter.kt | 51 +++++++++++++++++++ app/src/main/res/layout/activity_withdraw.xml | 20 +++++--- app/src/main/res/layout/item_withdraw.xml | 45 ++++++++++++++++ app/src/main/res/values/strings.xml | 4 ++ 7 files changed, 153 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/domain/model/WithdrawReason.kt create mode 100644 app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawReasonAdapter.kt create mode 100644 app/src/main/res/layout/item_withdraw.xml diff --git a/app/src/main/java/org/keepgoeat/domain/model/WithdrawReason.kt b/app/src/main/java/org/keepgoeat/domain/model/WithdrawReason.kt new file mode 100644 index 00000000..1590a215 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/domain/model/WithdrawReason.kt @@ -0,0 +1,8 @@ +package org.keepgoeat.domain.model + +import org.keepgoeat.presentation.type.WithdrawCheckType + +data class WithdrawReason( + val reason: String, + var isClicked: WithdrawCheckType, +) diff --git a/app/src/main/java/org/keepgoeat/presentation/type/WithdrawCheckType.kt b/app/src/main/java/org/keepgoeat/presentation/type/WithdrawCheckType.kt index c6028d3d..177a25b2 100644 --- a/app/src/main/java/org/keepgoeat/presentation/type/WithdrawCheckType.kt +++ b/app/src/main/java/org/keepgoeat/presentation/type/WithdrawCheckType.kt @@ -2,18 +2,22 @@ package org.keepgoeat.presentation.type import androidx.annotation.ColorRes import androidx.annotation.DrawableRes +import androidx.annotation.StyleRes import org.keepgoeat.R enum class WithdrawCheckType( @DrawableRes val checkBox: Int, @ColorRes val descriptionTextColor: Int, + @StyleRes val textStyle: Int, ) { CLICKED( R.drawable.ic_checkbox_checked, R.color.orange_600, + R.style.TextAppearance_System4_Bold, ), DEFAULT( R.drawable.ic_checkbox_default, R.color.gray_700, + R.style.TextAppearance_System4, ) } diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt index a8071596..87c86773 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt @@ -1,15 +1,18 @@ package org.keepgoeat.presentation.withdraw import android.os.Bundle +import android.view.View import androidx.activity.viewModels import org.keepgoeat.R import org.keepgoeat.databinding.ActivityWithdrawBinding +import org.keepgoeat.domain.model.WithdrawReason import org.keepgoeat.presentation.type.WithdrawCheckType import org.keepgoeat.util.binding.BindingActivity import org.keepgoeat.util.extension.showKeyboard class WithdrawActivity : BindingActivity(R.layout.activity_withdraw) { private val viewModel: WithdrawViewModel by viewModels() + private var withdrawAdapter = WithdrawReasonAdapter() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -21,6 +24,18 @@ class WithdrawActivity : BindingActivity(R.layout.activ } private fun initLayout() { + binding.rvWithdraw.apply { + itemAnimator = null + adapter = withdrawAdapter + } + withdrawAdapter.submitList( + listOf( + WithdrawReason(getString(R.string.withdraw_reason1), WithdrawCheckType.DEFAULT), + WithdrawReason(getString(R.string.withdraw_reason2), WithdrawCheckType.DEFAULT), + WithdrawReason(getString(R.string.withdraw_reason3), WithdrawCheckType.DEFAULT), + WithdrawReason(getString(R.string.withdraw_reason4), WithdrawCheckType.DEFAULT) + ) + ) binding.clickType = WithdrawCheckType.DEFAULT } @@ -28,11 +43,13 @@ class WithdrawActivity : BindingActivity(R.layout.activ binding.layoutOtherReason.setOnClickListener { when (binding.clickType) { WithdrawCheckType.CLICKED -> { + binding.rvWithdraw.visibility = View.VISIBLE binding.clickType = WithdrawCheckType.DEFAULT binding.etOtherReason.clearFocus() showKeyboard(binding.etOtherReason, false) } WithdrawCheckType.DEFAULT -> { + binding.rvWithdraw.visibility = View.GONE binding.clickType = WithdrawCheckType.CLICKED binding.etOtherReason.requestFocus() showKeyboard(binding.etOtherReason, true) @@ -41,12 +58,20 @@ class WithdrawActivity : BindingActivity(R.layout.activ } } binding.etOtherReason.setOnFocusChangeListener { _, focused -> - if (binding.clickType == WithdrawCheckType.DEFAULT && focused) - binding.clickType = WithdrawCheckType.CLICKED + if (focused) { // 직접 입력 editText가 focus 상태일 때 + binding.rvWithdraw.visibility = View.GONE + if (binding.clickType == WithdrawCheckType.DEFAULT) + binding.clickType = WithdrawCheckType.CLICKED + } + } - binding.layoutWithdraw.setOnClickListener { + binding.layoutWithdraw.setOnClickListener { // 외부 영역 클릭 했을 때 showKeyboard(binding.etOtherReason, false) binding.etOtherReason.clearFocus() + binding.rvWithdraw.visibility = View.VISIBLE + } + binding.btnWithdraw.setOnClickListener { + // TODO } } } diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawReasonAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawReasonAdapter.kt new file mode 100644 index 00000000..0f4ed93c --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawReasonAdapter.kt @@ -0,0 +1,51 @@ +package org.keepgoeat.presentation.withdraw + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import org.keepgoeat.databinding.ItemWithdrawBinding +import org.keepgoeat.domain.model.WithdrawReason +import org.keepgoeat.presentation.type.WithdrawCheckType +import org.keepgoeat.util.ItemDiffCallback + +class WithdrawReasonAdapter : ListAdapter( + ItemDiffCallback( + onContentsTheSame = { old, new -> old == new }, + onItemsTheSame = { old, new -> old.reason == new.reason } + ) +) { + private lateinit var inflater: LayoutInflater + + class WithdrawViewHolder( + private val binding: ItemWithdrawBinding, + ) : RecyclerView.ViewHolder(binding.root) { + fun bind( + reason: WithdrawReason, + ) { + binding.tvWithdrawReason.text = reason.reason + binding.clickType = reason.isClicked + binding.layoutWithdrawReason.setOnClickListener { + binding.clickType = when (binding.clickType) { + WithdrawCheckType.CLICKED -> WithdrawCheckType.DEFAULT + WithdrawCheckType.DEFAULT -> WithdrawCheckType.CLICKED + else -> WithdrawCheckType.DEFAULT + } + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + if (!::inflater.isInitialized) + inflater = LayoutInflater.from(parent.context) + return WithdrawViewHolder(ItemWithdrawBinding.inflate(inflater, parent, false)) + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is WithdrawViewHolder -> { + holder.bind(currentList[position]) + } + } + } +} diff --git a/app/src/main/res/layout/activity_withdraw.xml b/app/src/main/res/layout/activity_withdraw.xml index 5b487e15..62c2ff41 100644 --- a/app/src/main/res/layout/activity_withdraw.xml +++ b/app/src/main/res/layout/activity_withdraw.xml @@ -50,10 +50,15 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/tv_withdraw_title" /> - @@ -63,9 +68,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing16" - android:layout_marginTop="@dimen/spacing24" + android:layout_marginTop="@dimen/spacing12" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/vp_withdraw"> + app:layout_constraintTop_toBottomOf="@+id/rv_withdraw"> diff --git a/app/src/main/res/layout/item_withdraw.xml b/app/src/main/res/layout/item_withdraw.xml new file mode 100644 index 00000000..7af5e16e --- /dev/null +++ b/app/src/main/res/layout/item_withdraw.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 362431d9..1ad062bb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -120,6 +120,10 @@ 떠났던 이유를 모두 알려주시면 더 나은 킵고잇이 될게요. 식습관 관리를 그만 뒀어요. + 자주 사용하지 않아요. + 앱 오류가 있어요. + 콘텐츠가 만족스럽지 않아요. + 직접 입력 다른 이유가 있다면 알려주세요. \ No newline at end of file From 4a772a0a9751d635177eced0e1bf32ab814b16bc Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 27 Feb 2023 12:30:37 +0900 Subject: [PATCH 446/745] =?UTF-8?q?[feat]=20#172=20AccountInfoActivity?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=ED=83=88=ED=87=B4=EB=B7=B0=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/presentation/my/AccountInfoActivity.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt index 32630726..0376d616 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt @@ -15,6 +15,7 @@ import org.keepgoeat.databinding.ActivityAccountInfoBinding import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.home.HomeActivity.Companion.ARG_KILL_HOME_AND_GO_TO_SIGN import org.keepgoeat.presentation.type.SocialLoginType +import org.keepgoeat.presentation.withdraw.WithdrawActivity import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity import javax.inject.Inject @@ -46,12 +47,13 @@ class AccountInfoActivity : LogoutDialogFragment().show(supportFragmentManager, "LogoutDialog") } binding.tvDeleteAccount.setOnClickListener { - // TODO 탈퇴 화면으로 이동 when (viewModel.loginPlatForm) { SocialLoginType.NAVER -> naverSignService.deleteAccountNaver(viewModel::deleteAccount) SocialLoginType.KAKAO -> kakaoSignService.deleteAccountKakao(viewModel::deleteAccount) else -> {} } + val intent = Intent(this, WithdrawActivity::class.java) + startActivity(intent) } } From 3d9a92b8e832ffaa6acb3b6cd30c0d97bdce01ec Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 27 Feb 2023 12:34:10 +0900 Subject: [PATCH 447/745] =?UTF-8?q?[feat]=20#172=20edittext=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EB=A9=94=EC=8B=9C=EC=A7=80,=20=ED=83=88=ED=87=B4?= =?UTF-8?q?=20=EB=8B=A4=EC=9D=B4=EC=96=BC=EB=A1=9C=EA=B7=B8=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/withdraw/WithdrawActivity.kt | 36 ++++++--- .../withdraw/WithdrawDialogFragment.kt | 25 ++++++ app/src/main/res/layout/activity_withdraw.xml | 13 ++++ app/src/main/res/layout/dialog_withdraw.xml | 77 +++++++++++++++++++ app/src/main/res/values/strings.xml | 6 ++ 5 files changed, 145 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawDialogFragment.kt create mode 100644 app/src/main/res/layout/dialog_withdraw.xml diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt index 87c86773..999ba477 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt @@ -14,6 +14,7 @@ class WithdrawActivity : BindingActivity(R.layout.activ private val viewModel: WithdrawViewModel by viewModels() private var withdrawAdapter = WithdrawReasonAdapter() + // TODO 키보드 자판에서 키보드 내리는 경우 recyclerView visibility 조정해주기 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.viewModel = viewModel @@ -43,35 +44,46 @@ class WithdrawActivity : BindingActivity(R.layout.activ binding.layoutOtherReason.setOnClickListener { when (binding.clickType) { WithdrawCheckType.CLICKED -> { - binding.rvWithdraw.visibility = View.VISIBLE + clearFocus() binding.clickType = WithdrawCheckType.DEFAULT - binding.etOtherReason.clearFocus() - showKeyboard(binding.etOtherReason, false) + binding.tvWithdrawEdittextError.visibility = View.GONE } WithdrawCheckType.DEFAULT -> { - binding.rvWithdraw.visibility = View.GONE + requestFocus() binding.clickType = WithdrawCheckType.CLICKED - binding.etOtherReason.requestFocus() - showKeyboard(binding.etOtherReason, true) } else -> {} } } binding.etOtherReason.setOnFocusChangeListener { _, focused -> - if (focused) { // 직접 입력 editText가 focus 상태일 때 + if (focused) { // '직접 입력' editText가 focus 상태일 때 binding.rvWithdraw.visibility = View.GONE if (binding.clickType == WithdrawCheckType.DEFAULT) binding.clickType = WithdrawCheckType.CLICKED } - } binding.layoutWithdraw.setOnClickListener { // 외부 영역 클릭 했을 때 - showKeyboard(binding.etOtherReason, false) - binding.etOtherReason.clearFocus() - binding.rvWithdraw.visibility = View.VISIBLE + clearFocus() } binding.btnWithdraw.setOnClickListener { - // TODO + if (binding.etOtherReason.text.isNullOrBlank() && binding.clickType == WithdrawCheckType.CLICKED) + binding.tvWithdrawEdittextError.visibility = View.VISIBLE + else { + binding.tvWithdrawEdittextError.visibility = View.GONE + WithdrawDialogFragment().show(supportFragmentManager, "withDrawDialog") + } } } + + private fun clearFocus() { + binding.etOtherReason.clearFocus() + binding.rvWithdraw.visibility = View.VISIBLE + showKeyboard(binding.etOtherReason, false) + } + + private fun requestFocus() { + binding.etOtherReason.requestFocus() + binding.rvWithdraw.visibility = View.GONE + showKeyboard(binding.etOtherReason, true) + } } diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawDialogFragment.kt new file mode 100644 index 00000000..5e60e725 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawDialogFragment.kt @@ -0,0 +1,25 @@ +package org.keepgoeat.presentation.withdraw + +import android.os.Bundle +import android.view.View +import org.keepgoeat.R +import org.keepgoeat.databinding.DialogWithdrawBinding +import org.keepgoeat.util.binding.BindingDialogFragment + +class WithdrawDialogFragment : + BindingDialogFragment(R.layout.dialog_withdraw) { + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + addListeners() + } + + private fun addListeners() { + binding.tvCancel.setOnClickListener { + dismiss() + } + binding.tvWithdraw.setOnClickListener { + // TODO 탈퇴하기 + } + } +} diff --git a/app/src/main/res/layout/activity_withdraw.xml b/app/src/main/res/layout/activity_withdraw.xml index 62c2ff41..86852de5 100644 --- a/app/src/main/res/layout/activity_withdraw.xml +++ b/app/src/main/res/layout/activity_withdraw.xml @@ -115,6 +115,19 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/layout_other_reason" /> + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1ad062bb..76e0fcb6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -126,4 +126,10 @@ 직접 입력 다른 이유가 있다면 알려주세요. + 탈퇴 이유를 작성해주세요. + + 탈퇴는 되돌릴 수 없어요. + 이 계정에서 만든 목표와\n활동 기록이 모두 사라져요. + 탈퇴 + 취소 \ No newline at end of file From 20285b219d426c880e2b44cae682b63266b47b8a Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 27 Feb 2023 13:02:21 +0900 Subject: [PATCH 448/745] =?UTF-8?q?[chore]=20#172=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt index ae4fcbb6..cab64ca8 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt @@ -2,6 +2,5 @@ package org.keepgoeat.presentation.withdraw import androidx.lifecycle.ViewModel -class WithdrawViewModel() : ViewModel() { - +class WithdrawViewModel : ViewModel() { } From 09a6f4afee6e01ea163493110066b93245087866 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 27 Feb 2023 13:02:21 +0900 Subject: [PATCH 449/745] =?UTF-8?q?[chore]=20#172=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt index ae4fcbb6..24da8c3b 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt @@ -2,6 +2,4 @@ package org.keepgoeat.presentation.withdraw import androidx.lifecycle.ViewModel -class WithdrawViewModel() : ViewModel() { - -} +class WithdrawViewModel : ViewModel() From 05e1ef41dde1ff837ac0a919f3c999c8fb19d7c1 Mon Sep 17 00:00:00 2001 From: Daeun Date: Mon, 27 Feb 2023 22:13:29 +0900 Subject: [PATCH 450/745] =?UTF-8?q?[add]=20#175=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=ED=95=A8=20=EB=AA=A9=ED=91=9C=20=EC=82=AD=EC=A0=9C=EB=A5=BC=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EB=A6=AC?= =?UTF-8?q?=EC=86=8C=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/drawable/background_keep_delete.xml | 5 +++++ app/src/main/res/drawable/ic_keep_detail.xml | 15 +++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 app/src/main/res/drawable/background_keep_delete.xml create mode 100644 app/src/main/res/drawable/ic_keep_detail.xml diff --git a/app/src/main/res/drawable/background_keep_delete.xml b/app/src/main/res/drawable/background_keep_delete.xml new file mode 100644 index 00000000..c9928fb3 --- /dev/null +++ b/app/src/main/res/drawable/background_keep_delete.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_keep_detail.xml b/app/src/main/res/drawable/ic_keep_detail.xml new file mode 100644 index 00000000..94832da4 --- /dev/null +++ b/app/src/main/res/drawable/ic_keep_detail.xml @@ -0,0 +1,15 @@ + + + + + From fd3ce090db68c90eacef275e2c957422ef3452ac Mon Sep 17 00:00:00 2001 From: Daeun Date: Mon, 27 Feb 2023 22:14:09 +0900 Subject: [PATCH 451/745] =?UTF-8?q?[feat]=20#175=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=ED=95=A8=20=EB=AA=A9=ED=91=9C=20=EC=82=AD=EC=A0=9C=20ui=20?= =?UTF-8?q?=EB=94=94=EC=9E=90=EC=9D=B8=20=EB=B0=8F=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=ED=95=A8=20=EB=AA=A9=ED=91=9C=20=EB=B7=B0=20ui=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/layout/item_achieved_goal.xml | 43 +++++++++++++++---- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/layout/item_achieved_goal.xml b/app/src/main/res/layout/item_achieved_goal.xml index 376acc40..766785d9 100644 --- a/app/src/main/res/layout/item_achieved_goal.xml +++ b/app/src/main/res/layout/item_achieved_goal.xml @@ -19,8 +19,8 @@ android:background="@drawable/background_goal_list" android:backgroundTint="@color/white" android:elevation="2dp" - android:paddingHorizontal="@dimen/spacingBase" - android:paddingVertical="@dimen/spacing16"> + android:paddingStart="@dimen/spacingBase" + android:paddingBottom="@dimen/spacing16"> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_goneMarginTop="18dp" /> + + + + Date: Mon, 27 Feb 2023 22:14:37 +0900 Subject: [PATCH 452/745] =?UTF-8?q?[feat]=20#175=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=ED=95=A8=20=EB=AA=A9=ED=91=9C=20=EC=82=AD=EC=A0=9C=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20visibility=20=EC=A1=B0=EC=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/my/AchievedGoalAdapter.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt index 45c76e31..2f56a4ce 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt @@ -1,6 +1,7 @@ package org.keepgoeat.presentation.my import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView @@ -21,6 +22,12 @@ class AchievedGoalAdapter : RecyclerView.ViewHolder(binding.root) { fun onBind(data: AchievedGoal) { binding.goal = data + binding.ivAchievedGoalDetail.setOnClickListener { + if (binding.btnAchievedGoalDelete.visibility == View.GONE) + binding.btnAchievedGoalDelete.visibility = View.VISIBLE + else + binding.btnAchievedGoalDelete.visibility = View.GONE + } } } From 504aa35be1ef0bc6ed29b802f98407794679a5ca Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 00:16:05 +0900 Subject: [PATCH 453/745] =?UTF-8?q?[chore]=20#175=20=EB=8D=94=EB=B3=B4?= =?UTF-8?q?=EA=B8=B0=20=EC=9D=B4=EB=AF=B8=EC=A7=80=EB=AA=85=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/{ic_keep_detail.xml => ic_more.xml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/src/main/res/drawable/{ic_keep_detail.xml => ic_more.xml} (100%) diff --git a/app/src/main/res/drawable/ic_keep_detail.xml b/app/src/main/res/drawable/ic_more.xml similarity index 100% rename from app/src/main/res/drawable/ic_keep_detail.xml rename to app/src/main/res/drawable/ic_more.xml From 3cb00c49ce187d7924b3a41c31a3f2aad0eecfe7 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 00:20:04 +0900 Subject: [PATCH 454/745] =?UTF-8?q?[feat]=20#175=20AppCompatButton=20->=20?= =?UTF-8?q?MaterialButton=EC=9C=BC=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 --- app/src/main/res/layout/item_achieved_goal.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/layout/item_achieved_goal.xml b/app/src/main/res/layout/item_achieved_goal.xml index 766785d9..9ed0a6de 100644 --- a/app/src/main/res/layout/item_achieved_goal.xml +++ b/app/src/main/res/layout/item_achieved_goal.xml @@ -39,7 +39,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing12" android:layout_marginEnd="15dp" - android:src="@drawable/ic_keep_detail" + android:src="@drawable/ic_more" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -57,19 +57,19 @@ app:layout_constraintTop_toBottomOf="@+id/view_eating_tag" tools:text="하루 1끼 이상 야채 더 먹기" /> - From 1e0f5664ab4f7a4083bafb86bbc898412ef2f988 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 13:57:00 +0900 Subject: [PATCH 455/745] =?UTF-8?q?[feat]=20#177=20=EA=B8=B0=EC=A4=80=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=EC=8B=9C=20=EB=9C=A8=EB=8A=94=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_goal_setting.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_goal_setting.xml b/app/src/main/res/layout/activity_goal_setting.xml index 73a5bdf1..35c3b3f9 100644 --- a/app/src/main/res/layout/activity_goal_setting.xml +++ b/app/src/main/res/layout/activity_goal_setting.xml @@ -175,7 +175,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing8" - android:text="@{viewModel.goalCriterion.length() == 0 || viewModel.goalCriterion.blank ? context.getString(R.string.goal_setting_title_length_guide) : viewModel.isValidCriterion() == false ? context.getString(R.string.goal_setting_title_language_guide) : ``}" + android:text="@{viewModel.isValidCriterion() == false ? context.getString(R.string.goal_setting_title_language_guide) : ``}" android:textAppearance="@style/TextAppearance.System6" android:textColor="@color/orange_400" app:layout_constraintStart_toStartOf="@id/gl_start" From 108c2f3cfd23e0d2c87d56c4f9901a34f2d98326 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 13:57:36 +0900 Subject: [PATCH 456/745] =?UTF-8?q?[feat]=20#177=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EA=B8=B0=EC=A4=80=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/setting/GoalSettingViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt index 58980c07..56597325 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt @@ -31,7 +31,7 @@ class GoalSettingViewModel @Inject constructor( val isValidCriterion: StateFlow get() = goalCriterion.map { criterion -> - criterion.length in 1..20 && criterion.isNotBlank() && criterion.matches(TITLE_PATTERN.toRegex()) + criterion.length in 0..20 && criterion.matches(TITLE_PATTERN.toRegex()) }.toStateFlow(viewModelScope, false) val isEnabledCompleteButton: StateFlow = combine(isValidTitle, isValidCriterion) { title, criterion -> From ff4eca74c760d4c03ee8b9fe10f53dd39a0a7c62 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 13:58:15 +0900 Subject: [PATCH 457/745] =?UTF-8?q?[feat]=20#177=20=ED=8F=AC=EC=BB=A4?= =?UTF-8?q?=EC=8B=B1=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20visibility=20=EC=A1=B0=EC=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/presentation/setting/GoalSettingActivity.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt index 4722e355..792d2c29 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt @@ -2,6 +2,7 @@ package org.keepgoeat.presentation.setting import android.content.Intent import android.os.Bundle +import android.view.View import androidx.activity.viewModels import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope @@ -72,6 +73,7 @@ class GoalSettingActivity : binding.root.setOnClickListener { showKeyboard(it, false) binding.etGoal.clearFocus() + binding.etGoalCriterion.clearFocus() } binding.viewToolbar.ivBack.setOnClickListener { finish() @@ -80,6 +82,12 @@ class GoalSettingActivity : showKeyboard(it, false) viewModel.uploadGoal() } + binding.etGoal.setOnFocusChangeListener { _, hasFocus -> + if (!hasFocus && viewModel.isValidTitle.value) + binding.tvGoalTitleLengthGuide.visibility = View.GONE + else + binding.tvGoalTitleLengthGuide.visibility = View.VISIBLE + } } private fun moveToHome() { From a3655ca008b26f0a937e3463c2d16454ffe73f46 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 15:34:50 +0900 Subject: [PATCH 458/745] =?UTF-8?q?[mod]=20#175=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EC=B4=88=EA=B8=B0=20?= =?UTF-8?q?visibility=20Gone=EC=9C=BC=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 --- app/src/main/res/layout/item_achieved_goal.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/item_achieved_goal.xml b/app/src/main/res/layout/item_achieved_goal.xml index 9ed0a6de..7cc90039 100644 --- a/app/src/main/res/layout/item_achieved_goal.xml +++ b/app/src/main/res/layout/item_achieved_goal.xml @@ -69,6 +69,7 @@ android:text="삭제하기" android:textAppearance="@style/TextAppearance.System4" android:textColor="@color/gray_600" + android:visibility="gone" app:cornerRadius="@dimen/spacing4" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/iv_achieved_goal_detail" /> From 06aef98906e8371bd12cbf57bbdcf2ae25c6448f Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 16:05:34 +0900 Subject: [PATCH 459/745] =?UTF-8?q?[mod]=20#168=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=EB=B7=B0=20ui=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EB=B0=8F=20=EB=AA=A9=ED=91=9C=20=EA=B8=B0=EC=A4=80=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 --- .../main/res/layout/activity_goal_detail.xml | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/layout/activity_goal_detail.xml b/app/src/main/res/layout/activity_goal_detail.xml index b7361c16..8f8f11c0 100644 --- a/app/src/main/res/layout/activity_goal_detail.xml +++ b/app/src/main/res/layout/activity_goal_detail.xml @@ -69,14 +69,14 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" - app:layout_constraintGuide_begin="@dimen/spacingBase" /> + app:layout_constraintGuide_begin="@dimen/spacing16" /> + app:layout_constraintGuide_end="@dimen/spacing16" /> + tools:text="물 더 먹기" /> + + + app:layout_constraintTop_toBottomOf="@id/tv_goal_criterion"> Date: Tue, 28 Feb 2023 17:30:11 +0900 Subject: [PATCH 460/745] =?UTF-8?q?[mod]=20#172=20=ED=83=88=ED=87=B4=20?= =?UTF-8?q?=EB=8B=A4=EC=9D=B4=EC=96=BC=EB=A1=9C=EA=B7=B8=20ui=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/dialog_withdraw.xml | 25 ++++++++++++--------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/layout/dialog_withdraw.xml b/app/src/main/res/layout/dialog_withdraw.xml index 83716da8..44c81d73 100644 --- a/app/src/main/res/layout/dialog_withdraw.xml +++ b/app/src/main/res/layout/dialog_withdraw.xml @@ -7,8 +7,9 @@ android:layout_height="match_parent"> @@ -56,22 +58,23 @@ android:id="@+id/view_divider" android:layout_width="1dp" android:layout_height="16dp" - android:layout_marginVertical="@dimen/spacing12" android:background="@color/gray_300" - app:layout_constraintStart_toEndOf="@+id/tv_cancel" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/tv_cancel" /> - From 6c3473f86d159af69e1bbda89c47fb0720afdfeb Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 28 Feb 2023 18:24:42 +0900 Subject: [PATCH 461/745] =?UTF-8?q?[mod]=20#172=20=EA=B2=BD=EA=B3=A0=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=83=9D=EC=84=B1=20=ED=9B=84=20?= =?UTF-8?q?text=20=EC=9E=85=EB=A0=A5=EC=8B=9C=20=EA=B2=BD=EA=B3=A0=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=82=AC=EB=9D=BC=EC=A7=80?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/withdraw/WithdrawActivity.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt index 999ba477..e7902da4 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt @@ -1,6 +1,8 @@ package org.keepgoeat.presentation.withdraw import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher import android.view.View import androidx.activity.viewModels import org.keepgoeat.R @@ -62,6 +64,14 @@ class WithdrawActivity : BindingActivity(R.layout.activ binding.clickType = WithdrawCheckType.CLICKED } } + binding.etOtherReason.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} + override fun afterTextChanged(p0: Editable?) {} + override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { + if (!binding.etOtherReason.text.isNullOrBlank()) + binding.tvWithdrawEdittextError.visibility = View.GONE + } + }) binding.layoutWithdraw.setOnClickListener { // 외부 영역 클릭 했을 때 clearFocus() } From 5d52ee28b831110f3a7d6b8e6a06f1d119717d4d Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Tue, 28 Feb 2023 18:52:46 +0900 Subject: [PATCH 462/745] =?UTF-8?q?[mod]=20#172=20=EC=86=8C=EC=85=9C?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=ED=83=88=ED=87=B4=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=82=B4=20=EA=B3=84=EC=A0=95=EB=B7=B0=20->=20?= =?UTF-8?q?=ED=83=88=ED=87=B4=20=EB=B7=B0=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/my/AccountInfoActivity.kt | 19 +------ .../keepgoeat/presentation/my/MyViewModel.kt | 19 +------ .../presentation/withdraw/WithdrawActivity.kt | 2 + .../withdraw/WithdrawDialogFragment.kt | 53 ++++++++++++++++++- .../withdraw/WithdrawViewModel.kt | 31 ++++++++++- 5 files changed, 87 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt index 0376d616..1612acf3 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt @@ -14,7 +14,6 @@ import org.keepgoeat.data.service.NaverAuthService import org.keepgoeat.databinding.ActivityAccountInfoBinding import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.home.HomeActivity.Companion.ARG_KILL_HOME_AND_GO_TO_SIGN -import org.keepgoeat.presentation.type.SocialLoginType import org.keepgoeat.presentation.withdraw.WithdrawActivity import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity @@ -47,12 +46,8 @@ class AccountInfoActivity : LogoutDialogFragment().show(supportFragmentManager, "LogoutDialog") } binding.tvDeleteAccount.setOnClickListener { - when (viewModel.loginPlatForm) { - SocialLoginType.NAVER -> naverSignService.deleteAccountNaver(viewModel::deleteAccount) - SocialLoginType.KAKAO -> kakaoSignService.deleteAccountKakao(viewModel::deleteAccount) - else -> {} - } val intent = Intent(this, WithdrawActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP startActivity(intent) } } @@ -69,18 +64,6 @@ class AccountInfoActivity : else -> {} } }.launchIn(lifecycleScope) - - viewModel.deleteAccountUiState.flowWithLifecycle(lifecycle).onEach { - when (it) { - is UiState.Success -> { - moveToSign() - } - is UiState.Error -> { - // TODO 회원 탈퇴 실패 시 예외 처리 - } - else -> {} - } - }.launchIn(lifecycleScope) } private fun moveToSign() { diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt index 77ee21ff..e538c136 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt @@ -8,7 +8,6 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.domain.model.AchievedGoal -import org.keepgoeat.domain.repository.AuthRepository import org.keepgoeat.domain.repository.GoalRepository import org.keepgoeat.presentation.type.SortType import org.keepgoeat.util.UiState @@ -16,19 +15,16 @@ import javax.inject.Inject @HiltViewModel class MyViewModel @Inject constructor( - private val authRepository: AuthRepository, private val goalRepository: GoalRepository, private val localStorage: KGEDataSource, ) : ViewModel() { - private val _achievedGoalUiState = MutableStateFlow>>(UiState.Loading) + private val _achievedGoalUiState = + MutableStateFlow>>(UiState.Loading) val achievedGoalUiState get() = _achievedGoalUiState.asStateFlow() private val _logoutUiState = MutableStateFlow>(UiState.Loading) val logoutUiState get() = _logoutUiState.asStateFlow() private val _achievedGoalCount = MutableStateFlow(0) val achievedGoalCount get() = _achievedGoalCount.asStateFlow() - private val _deleteAccountUiState = - MutableStateFlow>(UiState.Loading) - val deleteAccountUiState get() = _deleteAccountUiState.asStateFlow() val loginPlatForm = localStorage.loginPlatform val userName = localStorage.userName val userEmail = localStorage.userEmail @@ -53,15 +49,4 @@ class MyViewModel @Inject constructor( localStorage.clear() _logoutUiState.value = UiState.Success(true) } - - fun deleteAccount() { - viewModelScope.launch { - authRepository.deleteAccount() - .onSuccess { - _deleteAccountUiState.value = UiState.Success(true) - }.onFailure { - _deleteAccountUiState.value = UiState.Error(it.message) - } - } - } } diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt index e7902da4..039e23b5 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt @@ -5,6 +5,7 @@ import android.text.Editable import android.text.TextWatcher import android.view.View import androidx.activity.viewModels +import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.ActivityWithdrawBinding import org.keepgoeat.domain.model.WithdrawReason @@ -12,6 +13,7 @@ import org.keepgoeat.presentation.type.WithdrawCheckType import org.keepgoeat.util.binding.BindingActivity import org.keepgoeat.util.extension.showKeyboard +@AndroidEntryPoint class WithdrawActivity : BindingActivity(R.layout.activity_withdraw) { private val viewModel: WithdrawViewModel by viewModels() private var withdrawAdapter = WithdrawReasonAdapter() diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawDialogFragment.kt index 5e60e725..8380e2e3 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawDialogFragment.kt @@ -1,17 +1,40 @@ package org.keepgoeat.presentation.withdraw +import android.content.Intent import android.os.Bundle import android.view.View +import androidx.fragment.app.activityViewModels +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import org.keepgoeat.R +import org.keepgoeat.data.service.KakaoAuthService +import org.keepgoeat.data.service.NaverAuthService import org.keepgoeat.databinding.DialogWithdrawBinding +import org.keepgoeat.presentation.home.HomeActivity +import org.keepgoeat.presentation.sign.SignActivity +import org.keepgoeat.presentation.type.SocialLoginType +import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingDialogFragment +import javax.inject.Inject +@AndroidEntryPoint class WithdrawDialogFragment : BindingDialogFragment(R.layout.dialog_withdraw) { + @Inject + lateinit var kakaoSignService: KakaoAuthService + + @Inject + lateinit var naverSignService: NaverAuthService + + private val viewModel: WithdrawViewModel by activityViewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) addListeners() + collectData() } private fun addListeners() { @@ -19,7 +42,35 @@ class WithdrawDialogFragment : dismiss() } binding.tvWithdraw.setOnClickListener { - // TODO 탈퇴하기 + when (viewModel.loginPlatForm) { + SocialLoginType.NAVER -> naverSignService.deleteAccountNaver(viewModel::deleteAccount) + SocialLoginType.KAKAO -> kakaoSignService.deleteAccountKakao(viewModel::deleteAccount) + else -> {} + } + dismiss() + } + } + + private fun collectData() { + viewModel.deleteAccountUiState.flowWithLifecycle(lifecycle).onEach { + when (it) { + is UiState.Success -> { + moveToSign() + } + is UiState.Error -> { + // TODO 회원 탈퇴 실패 시 예외 처리 + } + else -> {} + } + }.launchIn(lifecycleScope) + } + + private fun moveToSign() { + Intent(context, SignActivity::class.java).apply { + flags = Intent.FLAG_ACTIVITY_CLEAR_TOP + putExtra(HomeActivity.ARG_KILL_HOME_AND_GO_TO_SIGN, true) + }.also { + startActivity(it) } } } diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt index 24da8c3b..aa3f8352 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt @@ -1,5 +1,34 @@ package org.keepgoeat.presentation.withdraw import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import org.keepgoeat.data.datasource.local.KGEDataSource +import org.keepgoeat.domain.repository.AuthRepository +import org.keepgoeat.util.UiState +import javax.inject.Inject -class WithdrawViewModel : ViewModel() +@HiltViewModel +class WithdrawViewModel @Inject constructor( + private val authRepository: AuthRepository, + private val localStorage: KGEDataSource, +) : ViewModel() { + val loginPlatForm = localStorage.loginPlatform + private val _deleteAccountUiState = + MutableStateFlow>(UiState.Loading) + val deleteAccountUiState get() = _deleteAccountUiState.asStateFlow() + + fun deleteAccount() { + viewModelScope.launch { + authRepository.deleteAccount() + .onSuccess { + _deleteAccountUiState.value = UiState.Success(true) + }.onFailure { + _deleteAccountUiState.value = UiState.Error(it.message) + } + } + } +} From a4e1ea118a84f86a9eeb45b97e929c161a61e1d6 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 20:48:33 +0900 Subject: [PATCH 463/745] =?UTF-8?q?[feat]=20#175=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EB=B3=B4=EA=B4=80=20=EC=97=A0=ED=8B=B0=EB=B7=B0=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../res/layout/activity_achieved_goal.xml | 72 ++++++++++++++++++- 1 file changed, 69 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/activity_achieved_goal.xml b/app/src/main/res/layout/activity_achieved_goal.xml index 816d4565..61566e96 100644 --- a/app/src/main/res/layout/activity_achieved_goal.xml +++ b/app/src/main/res/layout/activity_achieved_goal.xml @@ -17,7 +17,74 @@ + layout="@layout/view_toolbar" + tools:layout_editor_absoluteX="200dp" + tools:layout_editor_absoluteY="144dp" /> + + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@id/view_toolbar" /> \ No newline at end of file From 167d6744f31b4784651f2cae1022e34e1624da3d Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 23:03:24 +0900 Subject: [PATCH 464/745] =?UTF-8?q?[feat]=20#175=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=ED=95=A8=20=EB=AA=A9=ED=91=9C=20=EC=82=AD=EC=A0=9C=20=EB=8B=A4?= =?UTF-8?q?=EC=9D=B4=EC=96=BC=EB=A1=9C=EA=B7=B8=20=EB=94=94=EC=9E=90?= =?UTF-8?q?=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/layout/dialog_keep_delete.xml | 85 +++++++++++++++++++ app/src/main/res/values/strings.xml | 3 + 2 files changed, 88 insertions(+) create mode 100644 app/src/main/res/layout/dialog_keep_delete.xml diff --git a/app/src/main/res/layout/dialog_keep_delete.xml b/app/src/main/res/layout/dialog_keep_delete.xml new file mode 100644 index 00000000..45edd473 --- /dev/null +++ b/app/src/main/res/layout/dialog_keep_delete.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6681f8b7..eaf16518 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -113,4 +113,7 @@ 계정 정보 로그아웃 하시겠어요? 그동안의 기록은 사라지지 않으니\n안심하고 다녀오세요. + + 삭제 하시겠어요? + 삭제된 목표와 달성 기록은\n다시 복구할 수 없어요. \ No newline at end of file From aeda9d062766a2db29f557897b1816088542a7e4 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 23:05:16 +0900 Subject: [PATCH 465/745] =?UTF-8?q?[feat]=20#175=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=ED=95=A8=20=EB=AA=A9=ED=91=9C=20=EC=82=AD=EC=A0=9C=20=EB=8B=A4?= =?UTF-8?q?=EC=9D=B4=EC=96=BC=EB=A1=9C=EA=B7=B8=20=EB=9D=84=EC=9A=B0?= =?UTF-8?q?=EB=8A=94=EA=B1=B0=EA=B9=8C=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 --- .../presentation/my/AchievedGoalActivity.kt | 2 +- .../presentation/my/AchievedGoalAdapter.kt | 10 +++++--- .../my/KeepDeleteDialogFragment.kt | 24 +++++++++++++++++++ 3 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt index 162fe1de..ec148239 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt @@ -21,7 +21,7 @@ import org.keepgoeat.util.binding.BindingActivity @AndroidEntryPoint class AchievedGoalActivity : BindingActivity(R.layout.activity_achieved_goal) { private val viewModel: MyViewModel by viewModels() - private val goalAdapter = AchievedGoalAdapter() + private val goalAdapter = AchievedGoalAdapter(this) private val headerAdapter = AchievedGoalHeaderAdapter(::getFilteredGoalWithEatingType) private val goalConcatAdapter = ConcatAdapter(headerAdapter, goalAdapter) private var isEnteredFromKeep: Boolean = false diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt index 2f56a4ce..9e1d08b5 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt @@ -1,5 +1,6 @@ package org.keepgoeat.presentation.my +import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -9,7 +10,7 @@ import org.keepgoeat.databinding.ItemAchievedGoalBinding import org.keepgoeat.domain.model.AchievedGoal import org.keepgoeat.util.ItemDiffCallback -class AchievedGoalAdapter : +class AchievedGoalAdapter(val context: Context) : ListAdapter( ItemDiffCallback( onContentsTheSame = { old, new -> old == new }, @@ -20,7 +21,7 @@ class AchievedGoalAdapter : class AchievedGoalViewHolder(private val binding: ItemAchievedGoalBinding) : RecyclerView.ViewHolder(binding.root) { - fun onBind(data: AchievedGoal) { + fun onBind(data: AchievedGoal, context: Context) { binding.goal = data binding.ivAchievedGoalDetail.setOnClickListener { if (binding.btnAchievedGoalDelete.visibility == View.GONE) @@ -28,6 +29,9 @@ class AchievedGoalAdapter : else binding.btnAchievedGoalDelete.visibility = View.GONE } + binding.btnAchievedGoalDelete.setOnClickListener { + KeepDeleteDialogFragment().show((context as AchievedGoalActivity).supportFragmentManager, "KeepDeleteDialog") + } } } @@ -39,6 +43,6 @@ class AchievedGoalAdapter : } override fun onBindViewHolder(holder: AchievedGoalViewHolder, position: Int) { - holder.onBind(currentList[position]) + holder.onBind(currentList[position], context) } } diff --git a/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt new file mode 100644 index 00000000..ca2c9199 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt @@ -0,0 +1,24 @@ +package org.keepgoeat.presentation.my + +import android.os.Bundle +import android.view.View +import org.keepgoeat.R +import org.keepgoeat.databinding.DialogKeepDeleteBinding +import org.keepgoeat.util.binding.BindingDialogFragment + +class KeepDeleteDialogFragment : + BindingDialogFragment(R.layout.dialog_keep_delete) { + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + addListeners() + } + + private fun addListeners() { + binding.yes.setOnClickListener { + //TODO 목표 삭제 api 연동 + } + binding.no.setOnClickListener { + dismiss() + } + } +} \ No newline at end of file From a990bced387fb921e32a5e4fd1288a33fd82cc28 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 23:08:49 +0900 Subject: [PATCH 466/745] =?UTF-8?q?[chore]=20#175=20klint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt index ca2c9199..4e096420 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt @@ -15,10 +15,10 @@ class KeepDeleteDialogFragment : private fun addListeners() { binding.yes.setOnClickListener { - //TODO 목표 삭제 api 연동 + // TODO 목표 삭제 api 연동 } binding.no.setOnClickListener { dismiss() } } -} \ No newline at end of file +} From ee89f1c13ca2c3f6c2ec1d80f55bd5b1dc4f1b49 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 23:28:00 +0900 Subject: [PATCH 467/745] =?UTF-8?q?[chore]=20#177=20context.getString=20->?= =?UTF-8?q?=20@String=EC=9C=BC=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 --- app/src/main/res/layout/activity_goal_setting.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/activity_goal_setting.xml b/app/src/main/res/layout/activity_goal_setting.xml index 35c3b3f9..3e05e76f 100644 --- a/app/src/main/res/layout/activity_goal_setting.xml +++ b/app/src/main/res/layout/activity_goal_setting.xml @@ -175,12 +175,12 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing8" - android:text="@{viewModel.isValidCriterion() == false ? context.getString(R.string.goal_setting_title_language_guide) : ``}" + android:text="@{viewModel.isValidCriterion() == false ? @string/goal_setting_title_language_guide : ``}" android:textAppearance="@style/TextAppearance.System6" android:textColor="@color/orange_400" app:layout_constraintStart_toStartOf="@id/gl_start" app:layout_constraintTop_toBottomOf="@+id/et_goal_criterion" - tools:text="@string/goal_setting_title_length_guide" /> + tools:text="@string/goal_setting_title_language_guide" /> Date: Tue, 28 Feb 2023 13:57:00 +0900 Subject: [PATCH 468/745] =?UTF-8?q?[feat]=20#177=20=EA=B8=B0=EC=A4=80=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=EC=8B=9C=20=EB=9C=A8=EB=8A=94=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_goal_setting.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_goal_setting.xml b/app/src/main/res/layout/activity_goal_setting.xml index 73a5bdf1..35c3b3f9 100644 --- a/app/src/main/res/layout/activity_goal_setting.xml +++ b/app/src/main/res/layout/activity_goal_setting.xml @@ -175,7 +175,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing8" - android:text="@{viewModel.goalCriterion.length() == 0 || viewModel.goalCriterion.blank ? context.getString(R.string.goal_setting_title_length_guide) : viewModel.isValidCriterion() == false ? context.getString(R.string.goal_setting_title_language_guide) : ``}" + android:text="@{viewModel.isValidCriterion() == false ? context.getString(R.string.goal_setting_title_language_guide) : ``}" android:textAppearance="@style/TextAppearance.System6" android:textColor="@color/orange_400" app:layout_constraintStart_toStartOf="@id/gl_start" From 354030dcbceee933dcabafb62e21e197104ced63 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 13:57:36 +0900 Subject: [PATCH 469/745] =?UTF-8?q?[feat]=20#177=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EA=B8=B0=EC=A4=80=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/setting/GoalSettingViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt index 58980c07..56597325 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingViewModel.kt @@ -31,7 +31,7 @@ class GoalSettingViewModel @Inject constructor( val isValidCriterion: StateFlow get() = goalCriterion.map { criterion -> - criterion.length in 1..20 && criterion.isNotBlank() && criterion.matches(TITLE_PATTERN.toRegex()) + criterion.length in 0..20 && criterion.matches(TITLE_PATTERN.toRegex()) }.toStateFlow(viewModelScope, false) val isEnabledCompleteButton: StateFlow = combine(isValidTitle, isValidCriterion) { title, criterion -> From 0b25c4b43b4210d688d7f86790a594e0e4a9d74e Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 13:58:15 +0900 Subject: [PATCH 470/745] =?UTF-8?q?[feat]=20#177=20=ED=8F=AC=EC=BB=A4?= =?UTF-8?q?=EC=8B=B1=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20visibility=20=EC=A1=B0=EC=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/presentation/setting/GoalSettingActivity.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt index 4722e355..792d2c29 100644 --- a/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/setting/GoalSettingActivity.kt @@ -2,6 +2,7 @@ package org.keepgoeat.presentation.setting import android.content.Intent import android.os.Bundle +import android.view.View import androidx.activity.viewModels import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope @@ -72,6 +73,7 @@ class GoalSettingActivity : binding.root.setOnClickListener { showKeyboard(it, false) binding.etGoal.clearFocus() + binding.etGoalCriterion.clearFocus() } binding.viewToolbar.ivBack.setOnClickListener { finish() @@ -80,6 +82,12 @@ class GoalSettingActivity : showKeyboard(it, false) viewModel.uploadGoal() } + binding.etGoal.setOnFocusChangeListener { _, hasFocus -> + if (!hasFocus && viewModel.isValidTitle.value) + binding.tvGoalTitleLengthGuide.visibility = View.GONE + else + binding.tvGoalTitleLengthGuide.visibility = View.VISIBLE + } } private fun moveToHome() { From fe0161740c4e6fda6f6501039c30fe1514fd811a Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 23:28:00 +0900 Subject: [PATCH 471/745] =?UTF-8?q?[chore]=20#177=20context.getString=20->?= =?UTF-8?q?=20@String=EC=9C=BC=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 --- app/src/main/res/layout/activity_goal_setting.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/activity_goal_setting.xml b/app/src/main/res/layout/activity_goal_setting.xml index 35c3b3f9..3e05e76f 100644 --- a/app/src/main/res/layout/activity_goal_setting.xml +++ b/app/src/main/res/layout/activity_goal_setting.xml @@ -175,12 +175,12 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing8" - android:text="@{viewModel.isValidCriterion() == false ? context.getString(R.string.goal_setting_title_language_guide) : ``}" + android:text="@{viewModel.isValidCriterion() == false ? @string/goal_setting_title_language_guide : ``}" android:textAppearance="@style/TextAppearance.System6" android:textColor="@color/orange_400" app:layout_constraintStart_toStartOf="@id/gl_start" app:layout_constraintTop_toBottomOf="@+id/et_goal_criterion" - tools:text="@string/goal_setting_title_length_guide" /> + tools:text="@string/goal_setting_title_language_guide" /> Date: Mon, 27 Feb 2023 22:13:29 +0900 Subject: [PATCH 472/745] =?UTF-8?q?[add]=20#175=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=ED=95=A8=20=EB=AA=A9=ED=91=9C=20=EC=82=AD=EC=A0=9C=EB=A5=BC=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EB=A6=AC?= =?UTF-8?q?=EC=86=8C=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/drawable/background_keep_delete.xml | 5 +++++ app/src/main/res/drawable/ic_keep_detail.xml | 15 +++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 app/src/main/res/drawable/background_keep_delete.xml create mode 100644 app/src/main/res/drawable/ic_keep_detail.xml diff --git a/app/src/main/res/drawable/background_keep_delete.xml b/app/src/main/res/drawable/background_keep_delete.xml new file mode 100644 index 00000000..c9928fb3 --- /dev/null +++ b/app/src/main/res/drawable/background_keep_delete.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_keep_detail.xml b/app/src/main/res/drawable/ic_keep_detail.xml new file mode 100644 index 00000000..94832da4 --- /dev/null +++ b/app/src/main/res/drawable/ic_keep_detail.xml @@ -0,0 +1,15 @@ + + + + + From f5212ca1b5fde289f42495c5a23e548f7b8768e5 Mon Sep 17 00:00:00 2001 From: Daeun Date: Mon, 27 Feb 2023 22:14:09 +0900 Subject: [PATCH 473/745] =?UTF-8?q?[feat]=20#175=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=ED=95=A8=20=EB=AA=A9=ED=91=9C=20=EC=82=AD=EC=A0=9C=20ui=20?= =?UTF-8?q?=EB=94=94=EC=9E=90=EC=9D=B8=20=EB=B0=8F=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=ED=95=A8=20=EB=AA=A9=ED=91=9C=20=EB=B7=B0=20ui=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/layout/item_achieved_goal.xml | 43 +++++++++++++++---- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/layout/item_achieved_goal.xml b/app/src/main/res/layout/item_achieved_goal.xml index 376acc40..766785d9 100644 --- a/app/src/main/res/layout/item_achieved_goal.xml +++ b/app/src/main/res/layout/item_achieved_goal.xml @@ -19,8 +19,8 @@ android:background="@drawable/background_goal_list" android:backgroundTint="@color/white" android:elevation="2dp" - android:paddingHorizontal="@dimen/spacingBase" - android:paddingVertical="@dimen/spacing16"> + android:paddingStart="@dimen/spacingBase" + android:paddingBottom="@dimen/spacing16"> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_goneMarginTop="18dp" /> + + + + Date: Mon, 27 Feb 2023 22:14:37 +0900 Subject: [PATCH 474/745] =?UTF-8?q?[feat]=20#175=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=ED=95=A8=20=EB=AA=A9=ED=91=9C=20=EC=82=AD=EC=A0=9C=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20visibility=20=EC=A1=B0=EC=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/my/AchievedGoalAdapter.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt index 45c76e31..2f56a4ce 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt @@ -1,6 +1,7 @@ package org.keepgoeat.presentation.my import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView @@ -21,6 +22,12 @@ class AchievedGoalAdapter : RecyclerView.ViewHolder(binding.root) { fun onBind(data: AchievedGoal) { binding.goal = data + binding.ivAchievedGoalDetail.setOnClickListener { + if (binding.btnAchievedGoalDelete.visibility == View.GONE) + binding.btnAchievedGoalDelete.visibility = View.VISIBLE + else + binding.btnAchievedGoalDelete.visibility = View.GONE + } } } From f41aed364bd16f5d1219d8ad272e8b8440f65100 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 00:16:05 +0900 Subject: [PATCH 475/745] =?UTF-8?q?[chore]=20#175=20=EB=8D=94=EB=B3=B4?= =?UTF-8?q?=EA=B8=B0=20=EC=9D=B4=EB=AF=B8=EC=A7=80=EB=AA=85=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/{ic_keep_detail.xml => ic_more.xml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/src/main/res/drawable/{ic_keep_detail.xml => ic_more.xml} (100%) diff --git a/app/src/main/res/drawable/ic_keep_detail.xml b/app/src/main/res/drawable/ic_more.xml similarity index 100% rename from app/src/main/res/drawable/ic_keep_detail.xml rename to app/src/main/res/drawable/ic_more.xml From d98d6eb40ff6254d778be589b81004898582c0db Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 00:20:04 +0900 Subject: [PATCH 476/745] =?UTF-8?q?[feat]=20#175=20AppCompatButton=20->=20?= =?UTF-8?q?MaterialButton=EC=9C=BC=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 --- app/src/main/res/layout/item_achieved_goal.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/layout/item_achieved_goal.xml b/app/src/main/res/layout/item_achieved_goal.xml index 766785d9..9ed0a6de 100644 --- a/app/src/main/res/layout/item_achieved_goal.xml +++ b/app/src/main/res/layout/item_achieved_goal.xml @@ -39,7 +39,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing12" android:layout_marginEnd="15dp" - android:src="@drawable/ic_keep_detail" + android:src="@drawable/ic_more" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -57,19 +57,19 @@ app:layout_constraintTop_toBottomOf="@+id/view_eating_tag" tools:text="하루 1끼 이상 야채 더 먹기" /> - From 50593ba42c5551791ddb6aac907e1b1936e96e72 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 15:34:50 +0900 Subject: [PATCH 477/745] =?UTF-8?q?[mod]=20#175=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EC=B4=88=EA=B8=B0=20?= =?UTF-8?q?visibility=20Gone=EC=9C=BC=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 --- app/src/main/res/layout/item_achieved_goal.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/item_achieved_goal.xml b/app/src/main/res/layout/item_achieved_goal.xml index 9ed0a6de..7cc90039 100644 --- a/app/src/main/res/layout/item_achieved_goal.xml +++ b/app/src/main/res/layout/item_achieved_goal.xml @@ -69,6 +69,7 @@ android:text="삭제하기" android:textAppearance="@style/TextAppearance.System4" android:textColor="@color/gray_600" + android:visibility="gone" app:cornerRadius="@dimen/spacing4" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/iv_achieved_goal_detail" /> From a394c7d4575ceebe76a44ef455097760e26abc9e Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 20:48:33 +0900 Subject: [PATCH 478/745] =?UTF-8?q?[feat]=20#175=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EB=B3=B4=EA=B4=80=20=EC=97=A0=ED=8B=B0=EB=B7=B0=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../res/layout/activity_achieved_goal.xml | 72 ++++++++++++++++++- 1 file changed, 69 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/activity_achieved_goal.xml b/app/src/main/res/layout/activity_achieved_goal.xml index 816d4565..61566e96 100644 --- a/app/src/main/res/layout/activity_achieved_goal.xml +++ b/app/src/main/res/layout/activity_achieved_goal.xml @@ -17,7 +17,74 @@ + layout="@layout/view_toolbar" + tools:layout_editor_absoluteX="200dp" + tools:layout_editor_absoluteY="144dp" /> + + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@id/view_toolbar" /> \ No newline at end of file From b854c623738f840f61f2eb9b06a71f1137f3626a Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 23:03:24 +0900 Subject: [PATCH 479/745] =?UTF-8?q?[feat]=20#175=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=ED=95=A8=20=EB=AA=A9=ED=91=9C=20=EC=82=AD=EC=A0=9C=20=EB=8B=A4?= =?UTF-8?q?=EC=9D=B4=EC=96=BC=EB=A1=9C=EA=B7=B8=20=EB=94=94=EC=9E=90?= =?UTF-8?q?=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/layout/dialog_keep_delete.xml | 85 +++++++++++++++++++ app/src/main/res/values/strings.xml | 3 + 2 files changed, 88 insertions(+) create mode 100644 app/src/main/res/layout/dialog_keep_delete.xml diff --git a/app/src/main/res/layout/dialog_keep_delete.xml b/app/src/main/res/layout/dialog_keep_delete.xml new file mode 100644 index 00000000..45edd473 --- /dev/null +++ b/app/src/main/res/layout/dialog_keep_delete.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6681f8b7..eaf16518 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -113,4 +113,7 @@ 계정 정보 로그아웃 하시겠어요? 그동안의 기록은 사라지지 않으니\n안심하고 다녀오세요. + + 삭제 하시겠어요? + 삭제된 목표와 달성 기록은\n다시 복구할 수 없어요. \ No newline at end of file From 99912e0e33b3346e7aef2b8035e89d5fed826906 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 23:05:16 +0900 Subject: [PATCH 480/745] =?UTF-8?q?[feat]=20#175=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=ED=95=A8=20=EB=AA=A9=ED=91=9C=20=EC=82=AD=EC=A0=9C=20=EB=8B=A4?= =?UTF-8?q?=EC=9D=B4=EC=96=BC=EB=A1=9C=EA=B7=B8=20=EB=9D=84=EC=9A=B0?= =?UTF-8?q?=EB=8A=94=EA=B1=B0=EA=B9=8C=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 --- .../presentation/my/AchievedGoalActivity.kt | 2 +- .../presentation/my/AchievedGoalAdapter.kt | 10 +++++--- .../my/KeepDeleteDialogFragment.kt | 24 +++++++++++++++++++ 3 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt index 162fe1de..ec148239 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt @@ -21,7 +21,7 @@ import org.keepgoeat.util.binding.BindingActivity @AndroidEntryPoint class AchievedGoalActivity : BindingActivity(R.layout.activity_achieved_goal) { private val viewModel: MyViewModel by viewModels() - private val goalAdapter = AchievedGoalAdapter() + private val goalAdapter = AchievedGoalAdapter(this) private val headerAdapter = AchievedGoalHeaderAdapter(::getFilteredGoalWithEatingType) private val goalConcatAdapter = ConcatAdapter(headerAdapter, goalAdapter) private var isEnteredFromKeep: Boolean = false diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt index 2f56a4ce..9e1d08b5 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt @@ -1,5 +1,6 @@ package org.keepgoeat.presentation.my +import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -9,7 +10,7 @@ import org.keepgoeat.databinding.ItemAchievedGoalBinding import org.keepgoeat.domain.model.AchievedGoal import org.keepgoeat.util.ItemDiffCallback -class AchievedGoalAdapter : +class AchievedGoalAdapter(val context: Context) : ListAdapter( ItemDiffCallback( onContentsTheSame = { old, new -> old == new }, @@ -20,7 +21,7 @@ class AchievedGoalAdapter : class AchievedGoalViewHolder(private val binding: ItemAchievedGoalBinding) : RecyclerView.ViewHolder(binding.root) { - fun onBind(data: AchievedGoal) { + fun onBind(data: AchievedGoal, context: Context) { binding.goal = data binding.ivAchievedGoalDetail.setOnClickListener { if (binding.btnAchievedGoalDelete.visibility == View.GONE) @@ -28,6 +29,9 @@ class AchievedGoalAdapter : else binding.btnAchievedGoalDelete.visibility = View.GONE } + binding.btnAchievedGoalDelete.setOnClickListener { + KeepDeleteDialogFragment().show((context as AchievedGoalActivity).supportFragmentManager, "KeepDeleteDialog") + } } } @@ -39,6 +43,6 @@ class AchievedGoalAdapter : } override fun onBindViewHolder(holder: AchievedGoalViewHolder, position: Int) { - holder.onBind(currentList[position]) + holder.onBind(currentList[position], context) } } diff --git a/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt new file mode 100644 index 00000000..ca2c9199 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt @@ -0,0 +1,24 @@ +package org.keepgoeat.presentation.my + +import android.os.Bundle +import android.view.View +import org.keepgoeat.R +import org.keepgoeat.databinding.DialogKeepDeleteBinding +import org.keepgoeat.util.binding.BindingDialogFragment + +class KeepDeleteDialogFragment : + BindingDialogFragment(R.layout.dialog_keep_delete) { + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + addListeners() + } + + private fun addListeners() { + binding.yes.setOnClickListener { + //TODO 목표 삭제 api 연동 + } + binding.no.setOnClickListener { + dismiss() + } + } +} \ No newline at end of file From 2181039b6a1c6ce584bbee9dabbf9ffff8ada914 Mon Sep 17 00:00:00 2001 From: Daeun Date: Tue, 28 Feb 2023 23:08:49 +0900 Subject: [PATCH 481/745] =?UTF-8?q?[chore]=20#175=20klint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt index ca2c9199..4e096420 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt @@ -15,10 +15,10 @@ class KeepDeleteDialogFragment : private fun addListeners() { binding.yes.setOnClickListener { - //TODO 목표 삭제 api 연동 + // TODO 목표 삭제 api 연동 } binding.no.setOnClickListener { dismiss() } } -} \ No newline at end of file +} From d589e7e4dd00a7c7bf0a25589fd8f8cf89b6c3fd Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sat, 4 Mar 2023 17:53:26 +0900 Subject: [PATCH 482/745] =?UTF-8?q?[mod]=20#172=20=EC=86=8C=EC=85=9C?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=ED=83=88=ED=87=B4=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=82=B4=20=EA=B3=84=EC=A0=95=EB=B7=B0=20->=20?= =?UTF-8?q?=ED=83=88=ED=87=B4=20=EB=B7=B0=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/my/AccountInfoActivity.kt | 19 +------ .../presentation/withdraw/WithdrawActivity.kt | 5 +- .../withdraw/WithdrawDialogFragment.kt | 53 ++++++++++++++++++- .../withdraw/WithdrawViewModel.kt | 5 -- app/src/main/res/layout/activity_withdraw.xml | 2 +- 5 files changed, 58 insertions(+), 26 deletions(-) delete mode 100644 app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt index 0376d616..1612acf3 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AccountInfoActivity.kt @@ -14,7 +14,6 @@ import org.keepgoeat.data.service.NaverAuthService import org.keepgoeat.databinding.ActivityAccountInfoBinding import org.keepgoeat.presentation.home.HomeActivity import org.keepgoeat.presentation.home.HomeActivity.Companion.ARG_KILL_HOME_AND_GO_TO_SIGN -import org.keepgoeat.presentation.type.SocialLoginType import org.keepgoeat.presentation.withdraw.WithdrawActivity import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity @@ -47,12 +46,8 @@ class AccountInfoActivity : LogoutDialogFragment().show(supportFragmentManager, "LogoutDialog") } binding.tvDeleteAccount.setOnClickListener { - when (viewModel.loginPlatForm) { - SocialLoginType.NAVER -> naverSignService.deleteAccountNaver(viewModel::deleteAccount) - SocialLoginType.KAKAO -> kakaoSignService.deleteAccountKakao(viewModel::deleteAccount) - else -> {} - } val intent = Intent(this, WithdrawActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP startActivity(intent) } } @@ -69,18 +64,6 @@ class AccountInfoActivity : else -> {} } }.launchIn(lifecycleScope) - - viewModel.deleteAccountUiState.flowWithLifecycle(lifecycle).onEach { - when (it) { - is UiState.Success -> { - moveToSign() - } - is UiState.Error -> { - // TODO 회원 탈퇴 실패 시 예외 처리 - } - else -> {} - } - }.launchIn(lifecycleScope) } private fun moveToSign() { diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt index e7902da4..14b15905 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt @@ -5,15 +5,18 @@ import android.text.Editable import android.text.TextWatcher import android.view.View import androidx.activity.viewModels +import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.ActivityWithdrawBinding import org.keepgoeat.domain.model.WithdrawReason +import org.keepgoeat.presentation.my.MyViewModel import org.keepgoeat.presentation.type.WithdrawCheckType import org.keepgoeat.util.binding.BindingActivity import org.keepgoeat.util.extension.showKeyboard +@AndroidEntryPoint class WithdrawActivity : BindingActivity(R.layout.activity_withdraw) { - private val viewModel: WithdrawViewModel by viewModels() + private val viewModel: MyViewModel by viewModels() private var withdrawAdapter = WithdrawReasonAdapter() // TODO 키보드 자판에서 키보드 내리는 경우 recyclerView visibility 조정해주기 diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawDialogFragment.kt index 5e60e725..81108c8f 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawDialogFragment.kt @@ -1,17 +1,40 @@ package org.keepgoeat.presentation.withdraw +import android.content.Intent import android.os.Bundle import android.view.View +import androidx.fragment.app.viewModels +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import org.keepgoeat.R +import org.keepgoeat.data.service.KakaoAuthService +import org.keepgoeat.data.service.NaverAuthService import org.keepgoeat.databinding.DialogWithdrawBinding +import org.keepgoeat.presentation.home.HomeActivity +import org.keepgoeat.presentation.my.MyViewModel +import org.keepgoeat.presentation.sign.SignActivity +import org.keepgoeat.presentation.type.SocialLoginType +import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingDialogFragment +import javax.inject.Inject +@AndroidEntryPoint class WithdrawDialogFragment : BindingDialogFragment(R.layout.dialog_withdraw) { + @Inject + lateinit var kakaoSignService: KakaoAuthService + + @Inject + lateinit var naverSignService: NaverAuthService + private val viewModel: MyViewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) addListeners() + collectData() } private fun addListeners() { @@ -19,7 +42,35 @@ class WithdrawDialogFragment : dismiss() } binding.tvWithdraw.setOnClickListener { - // TODO 탈퇴하기 + when (viewModel.loginPlatForm) { + SocialLoginType.NAVER -> naverSignService.deleteAccountNaver(viewModel::deleteAccount) + SocialLoginType.KAKAO -> kakaoSignService.deleteAccountKakao(viewModel::deleteAccount) + else -> {} + } + } + } + + private fun collectData() { + viewModel.deleteAccountUiState.flowWithLifecycle(lifecycle).onEach { + when (it) { + is UiState.Success -> { + moveToSign() + } + is UiState.Error -> { + // TODO 회원 탈퇴 실패 시 예외 처리 + } + else -> {} + } + }.launchIn(lifecycleScope) + } + + private fun moveToSign() { + Intent(context, SignActivity::class.java).apply { + flags = Intent.FLAG_ACTIVITY_CLEAR_TOP + putExtra(HomeActivity.ARG_KILL_HOME_AND_GO_TO_SIGN, true) + }.also { + startActivity(it) + dismiss() } } } diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt deleted file mode 100644 index 24da8c3b..00000000 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawViewModel.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.keepgoeat.presentation.withdraw - -import androidx.lifecycle.ViewModel - -class WithdrawViewModel : ViewModel() diff --git a/app/src/main/res/layout/activity_withdraw.xml b/app/src/main/res/layout/activity_withdraw.xml index 86852de5..6b026adf 100644 --- a/app/src/main/res/layout/activity_withdraw.xml +++ b/app/src/main/res/layout/activity_withdraw.xml @@ -13,7 +13,7 @@ + type="org.keepgoeat.presentation.my.MyViewModel" /> Date: Sun, 5 Mar 2023 14:51:40 +0900 Subject: [PATCH 483/745] =?UTF-8?q?[mod]=20#172=20WithdrawReasonAdapter=20?= =?UTF-8?q?=EB=82=B4=EB=B6=80=EC=97=90=EC=84=9C=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EA=B0=80=EC=A7=80=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/withdraw/WithdrawActivity.kt | 12 +-------- .../withdraw/WithdrawReasonAdapter.kt | 25 ++++++++++++++----- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt index 14b15905..90dfdb00 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt @@ -8,7 +8,6 @@ import androidx.activity.viewModels import dagger.hilt.android.AndroidEntryPoint import org.keepgoeat.R import org.keepgoeat.databinding.ActivityWithdrawBinding -import org.keepgoeat.domain.model.WithdrawReason import org.keepgoeat.presentation.my.MyViewModel import org.keepgoeat.presentation.type.WithdrawCheckType import org.keepgoeat.util.binding.BindingActivity @@ -17,7 +16,6 @@ import org.keepgoeat.util.extension.showKeyboard @AndroidEntryPoint class WithdrawActivity : BindingActivity(R.layout.activity_withdraw) { private val viewModel: MyViewModel by viewModels() - private var withdrawAdapter = WithdrawReasonAdapter() // TODO 키보드 자판에서 키보드 내리는 경우 recyclerView visibility 조정해주기 override fun onCreate(savedInstanceState: Bundle?) { @@ -32,16 +30,8 @@ class WithdrawActivity : BindingActivity(R.layout.activ private fun initLayout() { binding.rvWithdraw.apply { itemAnimator = null - adapter = withdrawAdapter + adapter = WithdrawReasonAdapter(context) } - withdrawAdapter.submitList( - listOf( - WithdrawReason(getString(R.string.withdraw_reason1), WithdrawCheckType.DEFAULT), - WithdrawReason(getString(R.string.withdraw_reason2), WithdrawCheckType.DEFAULT), - WithdrawReason(getString(R.string.withdraw_reason3), WithdrawCheckType.DEFAULT), - WithdrawReason(getString(R.string.withdraw_reason4), WithdrawCheckType.DEFAULT) - ) - ) binding.clickType = WithdrawCheckType.DEFAULT } diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawReasonAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawReasonAdapter.kt index 0f4ed93c..4305bc74 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawReasonAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawReasonAdapter.kt @@ -1,22 +1,35 @@ package org.keepgoeat.presentation.withdraw +import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import org.keepgoeat.R import org.keepgoeat.databinding.ItemWithdrawBinding import org.keepgoeat.domain.model.WithdrawReason import org.keepgoeat.presentation.type.WithdrawCheckType import org.keepgoeat.util.ItemDiffCallback -class WithdrawReasonAdapter : ListAdapter( - ItemDiffCallback( - onContentsTheSame = { old, new -> old == new }, - onItemsTheSame = { old, new -> old.reason == new.reason } - ) -) { +class WithdrawReasonAdapter(context: Context) : + ListAdapter( + ItemDiffCallback( + onContentsTheSame = { old, new -> old == new }, + onItemsTheSame = { old, new -> old.reason == new.reason } + ) + ) { private lateinit var inflater: LayoutInflater + init { + val reasons = mutableListOf( + WithdrawReason(context.getString(R.string.withdraw_reason1), WithdrawCheckType.DEFAULT), + WithdrawReason(context.getString(R.string.withdraw_reason2), WithdrawCheckType.DEFAULT), + WithdrawReason(context.getString(R.string.withdraw_reason3), WithdrawCheckType.DEFAULT), + WithdrawReason(context.getString(R.string.withdraw_reason4), WithdrawCheckType.DEFAULT), + ) + submitList(reasons) + } + class WithdrawViewHolder( private val binding: ItemWithdrawBinding, ) : RecyclerView.ViewHolder(binding.root) { From 0fcedb50511ee1d4609012a93d4b632e2bcd9fe4 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sun, 5 Mar 2023 17:52:58 +0900 Subject: [PATCH 484/745] =?UTF-8?q?[mod]=20#172=20=EC=A7=81=EC=A0=91?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20EditText=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EB=B0=94=EC=9D=B8=EB=94=A9=EC=9C=BC=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/presentation/my/MyViewModel.kt | 11 ++++++++++- .../presentation/withdraw/WithdrawActivity.kt | 10 ---------- app/src/main/res/layout/activity_withdraw.xml | 2 ++ 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt index 77ee21ff..787b073a 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt @@ -4,7 +4,9 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import org.keepgoeat.data.datasource.local.KGEDataSource import org.keepgoeat.domain.model.AchievedGoal @@ -12,6 +14,7 @@ import org.keepgoeat.domain.repository.AuthRepository import org.keepgoeat.domain.repository.GoalRepository import org.keepgoeat.presentation.type.SortType import org.keepgoeat.util.UiState +import org.keepgoeat.util.extension.toStateFlow import javax.inject.Inject @HiltViewModel @@ -20,7 +23,8 @@ class MyViewModel @Inject constructor( private val goalRepository: GoalRepository, private val localStorage: KGEDataSource, ) : ViewModel() { - private val _achievedGoalUiState = MutableStateFlow>>(UiState.Loading) + private val _achievedGoalUiState = + MutableStateFlow>>(UiState.Loading) val achievedGoalUiState get() = _achievedGoalUiState.asStateFlow() private val _logoutUiState = MutableStateFlow>(UiState.Loading) val logoutUiState get() = _logoutUiState.asStateFlow() @@ -29,6 +33,11 @@ class MyViewModel @Inject constructor( private val _deleteAccountUiState = MutableStateFlow>(UiState.Loading) val deleteAccountUiState get() = _deleteAccountUiState.asStateFlow() + val otherReason = MutableStateFlow("") + val isValidOtherReason: StateFlow + get() = otherReason.map { reason -> + reason.isNullOrBlank() + }.toStateFlow(viewModelScope, false) val loginPlatForm = localStorage.loginPlatform val userName = localStorage.userName val userEmail = localStorage.userEmail diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt index 90dfdb00..92a03503 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt @@ -1,8 +1,6 @@ package org.keepgoeat.presentation.withdraw import android.os.Bundle -import android.text.Editable -import android.text.TextWatcher import android.view.View import androidx.activity.viewModels import dagger.hilt.android.AndroidEntryPoint @@ -57,14 +55,6 @@ class WithdrawActivity : BindingActivity(R.layout.activ binding.clickType = WithdrawCheckType.CLICKED } } - binding.etOtherReason.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} - override fun afterTextChanged(p0: Editable?) {} - override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { - if (!binding.etOtherReason.text.isNullOrBlank()) - binding.tvWithdrawEdittextError.visibility = View.GONE - } - }) binding.layoutWithdraw.setOnClickListener { // 외부 영역 클릭 했을 때 clearFocus() } diff --git a/app/src/main/res/layout/activity_withdraw.xml b/app/src/main/res/layout/activity_withdraw.xml index 103859de..986f3c5a 100644 --- a/app/src/main/res/layout/activity_withdraw.xml +++ b/app/src/main/res/layout/activity_withdraw.xml @@ -108,6 +108,7 @@ android:gravity="top|start" android:hint="@string/withdraw_other_reason_description" android:inputType="textMultiLine|textNoSuggestions" + android:text="@={viewModel.otherReason}" android:textAppearance="@style/TextAppearance.System5" android:textColor="@color/gray_800" android:textCursorDrawable="@drawable/shape_cursor" @@ -125,6 +126,7 @@ android:textAppearance="@style/TextAppearance.System6" android:textColor="@color/orange_400" android:visibility="gone" + app:visibility="@{viewModel.isValidOtherReason}" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/et_other_reason" /> From dc4bc1496b822af87828791a8c2df2cdec50cfc4 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Sun, 5 Mar 2023 17:57:13 +0900 Subject: [PATCH 485/745] =?UTF-8?q?[chore]=20#172=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=9D=B4=EB=8F=99,=20=EB=B3=80=EC=88=98=EB=AA=85?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{domain => presentation}/model/WithdrawReason.kt | 2 +- .../org/keepgoeat/presentation/withdraw/WithdrawActivity.kt | 6 +++--- .../presentation/withdraw/WithdrawReasonAdapter.kt | 2 +- app/src/main/res/layout/activity_withdraw.xml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) rename app/src/main/java/org/keepgoeat/{domain => presentation}/model/WithdrawReason.kt (78%) diff --git a/app/src/main/java/org/keepgoeat/domain/model/WithdrawReason.kt b/app/src/main/java/org/keepgoeat/presentation/model/WithdrawReason.kt similarity index 78% rename from app/src/main/java/org/keepgoeat/domain/model/WithdrawReason.kt rename to app/src/main/java/org/keepgoeat/presentation/model/WithdrawReason.kt index 1590a215..5cc59ea5 100644 --- a/app/src/main/java/org/keepgoeat/domain/model/WithdrawReason.kt +++ b/app/src/main/java/org/keepgoeat/presentation/model/WithdrawReason.kt @@ -1,4 +1,4 @@ -package org.keepgoeat.domain.model +package org.keepgoeat.presentation.model import org.keepgoeat.presentation.type.WithdrawCheckType diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt index 92a03503..3b8cb5c9 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt @@ -39,7 +39,7 @@ class WithdrawActivity : BindingActivity(R.layout.activ WithdrawCheckType.CLICKED -> { clearFocus() binding.clickType = WithdrawCheckType.DEFAULT - binding.tvWithdrawEdittextError.visibility = View.GONE + binding.tvOtherReasonErrorMsg.visibility = View.GONE } WithdrawCheckType.DEFAULT -> { requestFocus() @@ -60,9 +60,9 @@ class WithdrawActivity : BindingActivity(R.layout.activ } binding.btnWithdraw.setOnClickListener { if (binding.etOtherReason.text.isNullOrBlank() && binding.clickType == WithdrawCheckType.CLICKED) - binding.tvWithdrawEdittextError.visibility = View.VISIBLE + binding.tvOtherReasonErrorMsg.visibility = View.VISIBLE else { - binding.tvWithdrawEdittextError.visibility = View.GONE + binding.tvOtherReasonErrorMsg.visibility = View.GONE WithdrawDialogFragment().show(supportFragmentManager, "withDrawDialog") } } diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawReasonAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawReasonAdapter.kt index 4305bc74..31e54f46 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawReasonAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawReasonAdapter.kt @@ -7,7 +7,7 @@ import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import org.keepgoeat.R import org.keepgoeat.databinding.ItemWithdrawBinding -import org.keepgoeat.domain.model.WithdrawReason +import org.keepgoeat.presentation.model.WithdrawReason import org.keepgoeat.presentation.type.WithdrawCheckType import org.keepgoeat.util.ItemDiffCallback diff --git a/app/src/main/res/layout/activity_withdraw.xml b/app/src/main/res/layout/activity_withdraw.xml index 986f3c5a..ce78d8ac 100644 --- a/app/src/main/res/layout/activity_withdraw.xml +++ b/app/src/main/res/layout/activity_withdraw.xml @@ -117,7 +117,7 @@ app:layout_constraintTop_toBottomOf="@+id/layout_other_reason" /> Date: Sun, 5 Mar 2023 18:41:24 +0900 Subject: [PATCH 486/745] =?UTF-8?q?[feat]=20#172=20=ED=88=B4=EB=B0=94=20?= =?UTF-8?q?=EB=92=A4=EB=A1=9C=EA=B0=80=EA=B8=B0=20=EB=B2=84=ED=8A=BC=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 --- .../org/keepgoeat/presentation/withdraw/WithdrawActivity.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt index 3b8cb5c9..31da2fff 100644 --- a/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/withdraw/WithdrawActivity.kt @@ -39,7 +39,7 @@ class WithdrawActivity : BindingActivity(R.layout.activ WithdrawCheckType.CLICKED -> { clearFocus() binding.clickType = WithdrawCheckType.DEFAULT - binding.tvOtherReasonErrorMsg.visibility = View.GONE + //binding.tvOtherReasonErrorMsg.setVisibility(false) } WithdrawCheckType.DEFAULT -> { requestFocus() @@ -66,6 +66,9 @@ class WithdrawActivity : BindingActivity(R.layout.activ WithdrawDialogFragment().show(supportFragmentManager, "withDrawDialog") } } + binding.viewWithdrawToolbar.ivBack.setOnClickListener{ + finish() + } } private fun clearFocus() { From 763cb1b17d36cba90e071c97c4cb00811a91e36c Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 6 Mar 2023 08:25:08 +0900 Subject: [PATCH 487/745] =?UTF-8?q?=20[feat]=20#169=20=EB=84=A4=ED=8A=B8?= =?UTF-8?q?=EC=9B=8C=ED=81=AC=20=EC=97=B0=EA=B2=B0=20=ED=95=B4=EC=A0=9C?= =?UTF-8?q?=EB=B7=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/view_kge_snackbar.xml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 app/src/main/res/layout/view_kge_snackbar.xml diff --git a/app/src/main/res/layout/view_kge_snackbar.xml b/app/src/main/res/layout/view_kge_snackbar.xml new file mode 100644 index 00000000..09124917 --- /dev/null +++ b/app/src/main/res/layout/view_kge_snackbar.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file From 44bb0b4830beded55475a6122cfe1f79eb3001f3 Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 6 Mar 2023 08:26:07 +0900 Subject: [PATCH 488/745] =?UTF-8?q?=20[feat]=20#169=20=EC=BB=A4=EC=8A=A4?= =?UTF-8?q?=ED=85=80=20=EC=8A=A4=EB=82=B5=EB=B0=94=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/util/KGESnackbar.kt | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 app/src/main/java/org/keepgoeat/util/KGESnackbar.kt diff --git a/app/src/main/java/org/keepgoeat/util/KGESnackbar.kt b/app/src/main/java/org/keepgoeat/util/KGESnackbar.kt new file mode 100644 index 00000000..66f79cf1 --- /dev/null +++ b/app/src/main/java/org/keepgoeat/util/KGESnackbar.kt @@ -0,0 +1,59 @@ +package org.keepgoeat.util + +import android.annotation.SuppressLint +import android.graphics.Color +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.widget.LinearLayout +import androidx.databinding.DataBindingUtil +import com.google.android.material.snackbar.BaseTransientBottomBar.ANIMATION_MODE_FADE +import com.google.android.material.snackbar.Snackbar +import org.keepgoeat.R +import org.keepgoeat.databinding.ViewKgeSnackbarBinding + +class KGESnackbar( + private val view: View, + private val message: String, + private val duration: Int, + private val isTop: Boolean, +) { + private val context = view.context + private val snackbar = Snackbar.make(view, "", duration) + private val snackbarLayout = snackbar.view as Snackbar.SnackbarLayout + private val snackbarBinding: ViewKgeSnackbarBinding = + DataBindingUtil.inflate(LayoutInflater.from(context), + R.layout.view_kge_snackbar, + null, + false).apply { + tvMessage.text = message + } + private val layoutParams = LinearLayout.LayoutParams(snackbar.view.layoutParams) + + init { + initializeView() + } + + @SuppressLint("RestrictedApi") + private fun initializeView() { + with(snackbarLayout) { + removeAllViews() + if (isTop) { + this@KGESnackbar.layoutParams.gravity = Gravity.TOP + layoutParams = this@KGESnackbar.layoutParams + snackbar.animationMode = ANIMATION_MODE_FADE + } + setBackgroundColor(Color.TRANSPARENT) + setPadding(0, 0, 0, 0) + addView(snackbarBinding.root, 0) + } + } + + fun show() { + snackbar.show() + } + + fun dismiss() { + if (duration == Snackbar.LENGTH_INDEFINITE) snackbar.dismiss() + } +} \ No newline at end of file From 0f7946171d963ed20794d065f12382c2971c0d3c Mon Sep 17 00:00:00 2001 From: youngjinc Date: Mon, 6 Mar 2023 08:27:01 +0900 Subject: [PATCH 489/745] =?UTF-8?q?=20[feat]=20#169=20=EC=BB=A4=EC=8A=A4?= =?UTF-8?q?=ED=85=80=20=EC=8A=A4=EB=82=B5=EB=B0=94=EB=A5=BC=20=EC=9D=B4?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EC=97=AC=20=EB=84=A4=ED=8A=B8=EC=9B=8C?= =?UTF-8?q?=ED=81=AC=20=EC=97=B0=EA=B2=B0=20=ED=95=B4=EC=A0=9C=EB=B7=B0=20?= =?UTF-8?q?=EB=B3=B4=EC=97=AC=EC=A3=BC=EA=B8=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/keepgoeat/util/binding/BindingActivity.kt | 10 +++++++--- app/src/main/res/values/strings.xml | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/util/binding/BindingActivity.kt b/app/src/main/java/org/keepgoeat/util/binding/BindingActivity.kt index dbd70a29..4bdc48d3 100644 --- a/app/src/main/java/org/keepgoeat/util/binding/BindingActivity.kt +++ b/app/src/main/java/org/keepgoeat/util/binding/BindingActivity.kt @@ -10,18 +10,22 @@ import androidx.lifecycle.lifecycleScope import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import org.keepgoeat.R +import org.keepgoeat.util.KGESnackbar import org.keepgoeat.util.NetworkMonitor abstract class BindingActivity(@LayoutRes private val layoutRes: Int) : AppCompatActivity() { lateinit var binding: B - private var snackbar: Snackbar? = null + private var snackbar: KGESnackbar? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, layoutRes) - snackbar = Snackbar.make(binding.root, "네트워크를 연결해 주세요", Snackbar.LENGTH_INDEFINITE) - + snackbar = KGESnackbar(binding.root, + getString(R.string.network_error_snackbar_message), + Snackbar.LENGTH_INDEFINITE, + true) collectNetworkState() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6681f8b7..d9760f3f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -13,6 +13,7 @@ %s 덜 먹기 취소 + 네트워크 연결을 확인해주세요 카카오톡 로그인 From 99c15850741e4a6e15c2a5359660fa74094bd1c2 Mon Sep 17 00:00:00 2001 From: Daeun Date: Mon, 6 Mar 2023 15:30:29 +0900 Subject: [PATCH 490/745] =?UTF-8?q?[feat]=20#175=20goalId=EB=A5=BC=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=EB=84=88=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/my/AchievedGoalAdapter.kt | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt index 9e1d08b5..a6faf103 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalAdapter.kt @@ -10,7 +10,11 @@ import org.keepgoeat.databinding.ItemAchievedGoalBinding import org.keepgoeat.domain.model.AchievedGoal import org.keepgoeat.util.ItemDiffCallback -class AchievedGoalAdapter(val context: Context) : + +class AchievedGoalAdapter( + private val context: Context, + private val listener: updateGoalIdListener +) : ListAdapter( ItemDiffCallback( onContentsTheSame = { old, new -> old == new }, @@ -19,18 +23,21 @@ class AchievedGoalAdapter(val context: Context) : ) { private lateinit var inflater: LayoutInflater - class AchievedGoalViewHolder(private val binding: ItemAchievedGoalBinding) : + interface updateGoalIdListener { + fun updateGoalId(data: AchievedGoal) + } + + inner class AchievedGoalViewHolder(private val binding: ItemAchievedGoalBinding) : RecyclerView.ViewHolder(binding.root) { fun onBind(data: AchievedGoal, context: Context) { binding.goal = data binding.ivAchievedGoalDetail.setOnClickListener { if (binding.btnAchievedGoalDelete.visibility == View.GONE) binding.btnAchievedGoalDelete.visibility = View.VISIBLE - else - binding.btnAchievedGoalDelete.visibility = View.GONE } binding.btnAchievedGoalDelete.setOnClickListener { KeepDeleteDialogFragment().show((context as AchievedGoalActivity).supportFragmentManager, "KeepDeleteDialog") + listener.updateGoalId(data) } } } From 4267b97b3d37bec7ce19553a6b5fc670d24861f4 Mon Sep 17 00:00:00 2001 From: Daeun Date: Mon, 6 Mar 2023 15:31:10 +0900 Subject: [PATCH 491/745] =?UTF-8?q?[feat]=20#175=20goalId=EB=A5=BC=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=EC=99=80=20=EB=AA=A9=ED=91=9C=EB=A5=BC=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=ED=95=98=EB=8A=94=20=ED=95=A8=EC=88=98=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 --- .../keepgoeat/presentation/my/MyViewModel.kt | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt index 77ee21ff..12715b31 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/MyViewModel.kt @@ -12,6 +12,7 @@ import org.keepgoeat.domain.repository.AuthRepository import org.keepgoeat.domain.repository.GoalRepository import org.keepgoeat.presentation.type.SortType import org.keepgoeat.util.UiState +import timber.log.Timber import javax.inject.Inject @HiltViewModel @@ -19,12 +20,17 @@ class MyViewModel @Inject constructor( private val authRepository: AuthRepository, private val goalRepository: GoalRepository, private val localStorage: KGEDataSource, -) : ViewModel() { - private val _achievedGoalUiState = MutableStateFlow>>(UiState.Loading) +) : ViewModel(), AchievedGoalAdapter.updateGoalIdListener { + private val _goalId = MutableStateFlow(-1) + val goalId get() = _goalId.asStateFlow() + private val _achievedGoalUiState = + MutableStateFlow>>(UiState.Loading) val achievedGoalUiState get() = _achievedGoalUiState.asStateFlow() private val _logoutUiState = MutableStateFlow>(UiState.Loading) val logoutUiState get() = _logoutUiState.asStateFlow() private val _achievedGoalCount = MutableStateFlow(0) + private val _deleteState = MutableStateFlow>(UiState.Loading) + val deleteState get() = _deleteState.asStateFlow() val achievedGoalCount get() = _achievedGoalCount.asStateFlow() private val _deleteAccountUiState = MutableStateFlow>(UiState.Loading) @@ -37,6 +43,10 @@ class MyViewModel @Inject constructor( fetchAchievedGoalBySort(SortType.ALL) } + override fun updateGoalId(data: AchievedGoal) { + _goalId.value = data.id + } + fun fetchAchievedGoalBySort(sortType: SortType) { viewModelScope.launch { goalRepository.fetchAchievedGoal(sortType.name.lowercase()) @@ -49,6 +59,18 @@ class MyViewModel @Inject constructor( } } + fun deleteGoal() { + viewModelScope.launch { + goalId.value.let { id -> + goalRepository.deleteGoal(id).onSuccess { deletedData -> + _deleteState.value = UiState.Success(deletedData.goalId) + }.onFailure { + Timber.e(it.message) + } + } + } + } + fun logout() { localStorage.clear() _logoutUiState.value = UiState.Success(true) From bda32705abe5f4e8ad0044114f28d04029241fd4 Mon Sep 17 00:00:00 2001 From: Daeun Date: Mon, 6 Mar 2023 15:32:07 +0900 Subject: [PATCH 492/745] =?UTF-8?q?[feat]=20#175=20=EC=82=AD=EC=A0=9C=20di?= =?UTF-8?q?alog=EC=99=80=20viewModel=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../keepgoeat/presentation/my/KeepDeleteDialogFragment.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt b/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt index 4e096420..996b5530 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/KeepDeleteDialogFragment.kt @@ -2,21 +2,22 @@ package org.keepgoeat.presentation.my import android.os.Bundle import android.view.View +import androidx.fragment.app.activityViewModels import org.keepgoeat.R import org.keepgoeat.databinding.DialogKeepDeleteBinding import org.keepgoeat.util.binding.BindingDialogFragment class KeepDeleteDialogFragment : BindingDialogFragment(R.layout.dialog_keep_delete) { + private val viewModel: MyViewModel by activityViewModels() + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + binding.viewModel = viewModel addListeners() } private fun addListeners() { - binding.yes.setOnClickListener { - // TODO 목표 삭제 api 연동 - } binding.no.setOnClickListener { dismiss() } From 6eae4570476af36bbbb769851fb802d50cac7636 Mon Sep 17 00:00:00 2001 From: Daeun Date: Mon, 6 Mar 2023 15:32:49 +0900 Subject: [PATCH 493/745] =?UTF-8?q?[feat]=20#175=20viewModel=EC=9D=98=20de?= =?UTF-8?q?leteState=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/my/AchievedGoalActivity.kt | 44 +++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt index ec148239..143d235b 100644 --- a/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt +++ b/app/src/main/java/org/keepgoeat/presentation/my/AchievedGoalActivity.kt @@ -2,6 +2,9 @@ package org.keepgoeat.presentation.my import android.content.Intent import android.os.Bundle +import android.view.MotionEvent +import android.view.View +import android.widget.Button import androidx.activity.OnBackPressedCallback import androidx.activity.viewModels import androidx.lifecycle.flowWithLifecycle @@ -17,13 +20,14 @@ import org.keepgoeat.presentation.type.EatingType import org.keepgoeat.presentation.type.SortType import org.keepgoeat.util.UiState import org.keepgoeat.util.binding.BindingActivity +import org.keepgoeat.util.extension.showToast @AndroidEntryPoint -class AchievedGoalActivity : BindingActivity(R.layout.activity_achieved_goal) { +class AchievedGoalActivity : BindingActivity(R.layout.activity_achieved_goal){ private val viewModel: MyViewModel by viewModels() - private val goalAdapter = AchievedGoalAdapter(this) + lateinit var goalAdapter : AchievedGoalAdapter private val headerAdapter = AchievedGoalHeaderAdapter(::getFilteredGoalWithEatingType) - private val goalConcatAdapter = ConcatAdapter(headerAdapter, goalAdapter) + lateinit var goalConcatAdapter : ConcatAdapter private var isEnteredFromKeep: Boolean = false private val callback = object : OnBackPressedCallback(true) { @@ -37,6 +41,8 @@ class AchievedGoalActivity : BindingActivity(R.layo binding.viewModel = viewModel binding.lifecycleOwner = this + goalAdapter = AchievedGoalAdapter(this, viewModel) + goalConcatAdapter = ConcatAdapter(headerAdapter, goalAdapter) isEnteredFromKeep = intent.getBooleanExtra(ARG_IS_ENTERED_FROM_KEEP, false) initLayout() @@ -44,6 +50,16 @@ class AchievedGoalActivity : BindingActivity(R.layo collectData() } + override fun onTouchEvent(ev: MotionEvent?): Boolean { + for (i in 1..goalAdapter.itemCount) { + val deleteBtn = binding.rvGoalList.findViewHolderForAdapterPosition(i)?.let { + it.itemView.findViewById