diff --git a/app/build.gradle b/app/build.gradle index 31bf917b..26eb7cd7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ plugins { android { namespace 'com.polzzak_android' compileSdk 33 - + defaultConfig { applicationId "com.polzzak_android" minSdk 26 @@ -74,6 +74,12 @@ dependencies { implementation "androidx.navigation:navigation-fragment-ktx:2.5.3" implementation "androidx.navigation:navigation-ui-ktx:2.5.3" + // viewPager2 + implementation "androidx.viewpager2:viewpager2:1.0.0" + + // swipe refresh layout + implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" + //kakao login implementation "com.kakao.sdk:v2-user:2.13.0" diff --git a/app/src/main/java/com/polzzak_android/presentation/main/MainFragment.kt b/app/src/main/java/com/polzzak_android/presentation/main/MainFragment.kt index aa66b82b..92de68fc 100644 --- a/app/src/main/java/com/polzzak_android/presentation/main/MainFragment.kt +++ b/app/src/main/java/com/polzzak_android/presentation/main/MainFragment.kt @@ -1,10 +1,52 @@ package com.polzzak_android.presentation.main +import androidx.fragment.app.Fragment +import com.google.android.material.tabs.TabLayout import com.polzzak_android.R import com.polzzak_android.common.base.BaseFragment import com.polzzak_android.databinding.FragmentMainBinding +import com.polzzak_android.presentation.main.completed.CompletedFragment +import com.polzzak_android.presentation.main.progress.ProgressFragment class MainFragment : BaseFragment() { override val layoutResId: Int = R.layout.fragment_main + private val progressFragment = ProgressFragment() + private val completedFragment = CompletedFragment() + + override fun initView() { + super.initView() + + childFragmentManager.beginTransaction().replace(binding.fragmentContainer.id, progressFragment).commit() + tabListener() + } + + private fun tabListener() { + binding.tabContainer.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener{ + override fun onTabSelected(tab: TabLayout.Tab?) { + val position = tab!!.position + var selectedFragment: Fragment? = null + + when (position) { + 0 -> { + selectedFragment = progressFragment + } + 1 -> { + selectedFragment = completedFragment + } + } + + if (selectedFragment != null) { + childFragmentManager.beginTransaction().replace(binding.fragmentContainer.id, selectedFragment).commit() + } + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + } + + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/polzzak_android/presentation/main/StampViewModel.kt b/app/src/main/java/com/polzzak_android/presentation/main/StampViewModel.kt new file mode 100644 index 00000000..80f068eb --- /dev/null +++ b/app/src/main/java/com/polzzak_android/presentation/main/StampViewModel.kt @@ -0,0 +1,7 @@ +package com.polzzak_android.presentation.main + +import androidx.lifecycle.ViewModel + +class StampViewModel: ViewModel() { + +} \ No newline at end of file diff --git a/app/src/main/java/com/polzzak_android/presentation/main/completed/CompletedFragment.kt b/app/src/main/java/com/polzzak_android/presentation/main/completed/CompletedFragment.kt new file mode 100644 index 00000000..1ee40d42 --- /dev/null +++ b/app/src/main/java/com/polzzak_android/presentation/main/completed/CompletedFragment.kt @@ -0,0 +1,9 @@ +package com.polzzak_android.presentation.main.completed + +import com.polzzak_android.R +import com.polzzak_android.common.base.BaseFragment +import com.polzzak_android.databinding.FragmentCompletedBinding + +class CompletedFragment : BaseFragment() { + override val layoutResId: Int = R.layout.fragment_completed +} \ No newline at end of file diff --git a/app/src/main/java/com/polzzak_android/presentation/main/model/Partner.kt b/app/src/main/java/com/polzzak_android/presentation/main/model/Partner.kt new file mode 100644 index 00000000..e5e60c8c --- /dev/null +++ b/app/src/main/java/com/polzzak_android/presentation/main/model/Partner.kt @@ -0,0 +1,9 @@ +package com.polzzak_android.presentation.main.model + +data class Partner( + val kid: Boolean, + val memberId: Int, + val memberType: String, + val nickname: String, + val profileUrl: String +) \ No newline at end of file diff --git a/app/src/main/java/com/polzzak_android/presentation/main/model/StampBoard.kt b/app/src/main/java/com/polzzak_android/presentation/main/model/StampBoard.kt new file mode 100644 index 00000000..9c4679ab --- /dev/null +++ b/app/src/main/java/com/polzzak_android/presentation/main/model/StampBoard.kt @@ -0,0 +1,7 @@ +package com.polzzak_android.presentation.main.model + +data class StampBoard( + val type: Int, // 1 non 2 yes + val partner: Partner, + val stampBoardSummaries: List +) \ No newline at end of file diff --git a/app/src/main/java/com/polzzak_android/presentation/main/model/StampBoardSummary.kt b/app/src/main/java/com/polzzak_android/presentation/main/model/StampBoardSummary.kt new file mode 100644 index 00000000..d573b7d6 --- /dev/null +++ b/app/src/main/java/com/polzzak_android/presentation/main/model/StampBoardSummary.kt @@ -0,0 +1,11 @@ +package com.polzzak_android.presentation.main.model + +data class StampBoardSummary( + val currentStampCount: Int, + val goalStampCount: Int, + val isRewarded: Boolean, + val missionCompleteCount: Int, + val name: String, + val reward: String, + val stampBoardId: Int +) \ No newline at end of file diff --git a/app/src/main/java/com/polzzak_android/presentation/main/progress/PagerAdapter.kt b/app/src/main/java/com/polzzak_android/presentation/main/progress/PagerAdapter.kt new file mode 100644 index 00000000..e0430ed9 --- /dev/null +++ b/app/src/main/java/com/polzzak_android/presentation/main/progress/PagerAdapter.kt @@ -0,0 +1,63 @@ +package com.polzzak_android.presentation.main.progress + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.polzzak_android.databinding.ItemStampProgressBinding +import com.polzzak_android.presentation.main.model.StampBoardSummary + +class PagerAdapter( + private val dummy: List, + private val interaction: ProgressInteraction +) : + RecyclerView.Adapter() { + + private var stampList = dummy + //private var stampList: listOf() = null + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val view = ItemStampProgressBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return ViewHolder(view, interaction) + } + + override fun getItemCount(): Int { + return stampList.size + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val curItem = stampList[position] + + (holder as ViewHolder).bind(curItem) + } + + fun setStampList(newList: List) { + stampList = newList + notifyDataSetChanged() + } + + inner class ViewHolder(binding: ItemStampProgressBinding, interaction: ProgressInteraction) : + RecyclerView.ViewHolder(binding.root) { + private val container = binding.stampContainer + + private val userHeaderTxt = binding.stampNickName + private val progressView = binding.stampProgress + private val curCnt = binding.stampCurCnt + private val totalCnt = binding.stampTotalCnt + private val reward = binding.rawardContent + + fun bind(item: StampBoardSummary) { + userHeaderTxt.text = item.name + curCnt.text = item.currentStampCount.toString() + totalCnt.text = item.goalStampCount.toString() + reward.text = item.reward + + interaction.setProgressAnim(progressView) + + container.setOnClickListener { + interaction.onStampPagerClicked(item) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/polzzak_android/presentation/main/progress/ProgressFragment.kt b/app/src/main/java/com/polzzak_android/presentation/main/progress/ProgressFragment.kt new file mode 100644 index 00000000..79b8d504 --- /dev/null +++ b/app/src/main/java/com/polzzak_android/presentation/main/progress/ProgressFragment.kt @@ -0,0 +1,161 @@ +package com.polzzak_android.presentation.main.progress + +import android.graphics.Rect +import android.view.View +import android.widget.TextView +import android.widget.Toast +import androidx.fragment.app.activityViewModels +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.viewpager2.widget.ViewPager2 +import com.polzzak_android.R +import com.polzzak_android.common.base.BaseFragment +import com.polzzak_android.databinding.FragmentProgressBinding +import com.polzzak_android.presentation.main.StampViewModel +import com.polzzak_android.presentation.main.model.Partner +import com.polzzak_android.presentation.main.model.StampBoard +import com.polzzak_android.presentation.main.model.StampBoardSummary +import com.polzzak_android.presentation.widget.SelectUserFilterFragment +import com.polzzak_android.presentation.widget.SemiCircleProgressView + +class ProgressFragment : BaseFragment(), ProgressInteraction { + override val layoutResId: Int = R.layout.fragment_progress + + private lateinit var rvAdapter: StampAdapter + private lateinit var vpAdapter: PagerAdapter + private val stampViewModel: StampViewModel by activityViewModels() + + override fun initView() { + super.initView() + + binding.lifecycleOwner = this + binding.stampViewModel = stampViewModel + + setAdapter() + + // Todo: 선택 바텀 시트 의논 사항-> 네비게이션으로 관리할지, 인스턴스 새롭게 생성할지? + binding.selectTxt.text = "전체" + binding.selectContainer.setOnClickListener { + val sheet = SelectUserFilterFragment.newInstance() + sheet.show(childFragmentManager, "selectUserSheet") + } + + binding.stampListRefresh.setOnRefreshListener { + rvAdapter.notifyDataSetChanged() + binding.stampListRefresh.isRefreshing = false + } + } + + private fun setAdapter() { + // Todo: dummy data 변경 + val dummy = listOf( + StampBoard( + type = 2, + Partner( + kid = false, + memberId = 2, + memberType = "ECT", + nickname = " 연동o도장판o", + profileUrl = "" + ), + listOf( + StampBoardSummary( + currentStampCount = 10, + goalStampCount = 20, + isRewarded = false, + missionCompleteCount = 3, + name = "도장판 이름1", + reward = "보상1", + stampBoardId = 1 + ), + StampBoardSummary( + currentStampCount = 10, + goalStampCount = 20, + isRewarded = false, + missionCompleteCount = 3, + name = "도장판 이름2", + reward = "보상2", + stampBoardId = 2 + ), + ), + ), + StampBoard( + type = 1, + Partner( + kid = false, + memberId = 1, + memberType = "ECT", + nickname = "연동o도장판x11", + profileUrl = "" + ), + listOf( + + ), + ), + StampBoard( + type = 1, + Partner( + kid = false, + memberId = 3, + memberType = "ECT", + nickname = "연동o도장판x22", + profileUrl = "" + ), + listOf( + + ), + ) + ) + + rvAdapter = StampAdapter(dummy, this) + binding.stampListRc.adapter = rvAdapter + binding.stampListRc.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + } + + override fun setViewPager(view: ViewPager2, curInd: TextView, totalInd: TextView, stampList: List) { + // adapter + vpAdapter = PagerAdapter(stampList, this) + view.adapter = vpAdapter + + // indicator + // Todo: 임시 + curInd.text = "1" + totalInd.text = resources.getString(R.string.viewpager_indicator, stampList.size) + view.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + super.onPageSelected(position) + curInd.text = position.plus(1).toString() + curInd.invalidate() + } + }) + + // transform + val currentVisibleItemPx = 50 + + view.addItemDecoration(object: RecyclerView.ItemDecoration() { + override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { + outRect.right = currentVisibleItemPx + outRect.left = currentVisibleItemPx + } + }) + + val nextVisibleItemPx = 20 + val pageTranslationX = nextVisibleItemPx + currentVisibleItemPx + + view.offscreenPageLimit = 1 + + view.setPageTransformer { page, position -> + page.translationX = -pageTranslationX * (position) + } + } + + override fun onStampPagerClicked(stampBoardItem: StampBoardSummary) { + // Todo: 임시 + Toast.makeText(context, "${stampBoardItem.name} 클릭", Toast.LENGTH_SHORT).show() + } + + override fun setProgressAnim(view: SemiCircleProgressView) { + // Todo: 계산 로직 추가 + view.setAnimation(260f) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/polzzak_android/presentation/main/progress/ProgressInteraction.kt b/app/src/main/java/com/polzzak_android/presentation/main/progress/ProgressInteraction.kt new file mode 100644 index 00000000..60888082 --- /dev/null +++ b/app/src/main/java/com/polzzak_android/presentation/main/progress/ProgressInteraction.kt @@ -0,0 +1,14 @@ +package com.polzzak_android.presentation.main.progress + +import android.widget.TextView +import androidx.viewpager2.widget.ViewPager2 +import com.polzzak_android.presentation.main.model.StampBoardSummary +import com.polzzak_android.presentation.widget.SemiCircleProgressView + +interface ProgressInteraction { + fun setViewPager(view: ViewPager2, curInd: TextView, totalInd: TextView, stampList: List) + + fun onStampPagerClicked(stampBoardItem: StampBoardSummary) + + fun setProgressAnim(view: SemiCircleProgressView) +} \ No newline at end of file diff --git a/app/src/main/java/com/polzzak_android/presentation/main/progress/SelectUserAdapter.kt b/app/src/main/java/com/polzzak_android/presentation/main/progress/SelectUserAdapter.kt new file mode 100644 index 00000000..09ae874e --- /dev/null +++ b/app/src/main/java/com/polzzak_android/presentation/main/progress/SelectUserAdapter.kt @@ -0,0 +1,56 @@ +package com.polzzak_android.presentation.main.progress + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.polzzak_android.databinding.ItemSelectUserFilterBinding + +class SelectUserAdapter( + private val dummy: List, + private val interaction: SelectUserInteraction +) : + RecyclerView.Adapter() { + + private var stampList = dummy + //private var stampList: listOf() = null + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val view = ItemSelectUserFilterBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return ViewHolder(view, interaction) + } + + override fun getItemCount(): Int { + return stampList.size + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val curItem = stampList[position] + + (holder as ViewHolder).bind(curItem) + } + + fun setStampList(newList: List) { + stampList = newList + notifyDataSetChanged() + } + + inner class ViewHolder(binding: ItemSelectUserFilterBinding, interaction: SelectUserInteraction) : + RecyclerView.ViewHolder(binding.root) { + private val container = binding.userFilterContainer + private val userName = binding.userFilterName + + init { + container.setOnClickListener { + val position = adapterPosition + if (position != RecyclerView.NO_POSITION) { + val item = stampList[position] + interaction.onUserClicked(item) + } + } + } + + fun bind(item: String) { + userName.text = item + } + } +} diff --git a/app/src/main/java/com/polzzak_android/presentation/main/progress/SelectUserInteraction.kt b/app/src/main/java/com/polzzak_android/presentation/main/progress/SelectUserInteraction.kt new file mode 100644 index 00000000..3e1b17db --- /dev/null +++ b/app/src/main/java/com/polzzak_android/presentation/main/progress/SelectUserInteraction.kt @@ -0,0 +1,6 @@ +package com.polzzak_android.presentation.main.progress + + +interface SelectUserInteraction { + fun onUserClicked(userItem: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/polzzak_android/presentation/main/progress/StampAdapter.kt b/app/src/main/java/com/polzzak_android/presentation/main/progress/StampAdapter.kt new file mode 100644 index 00000000..2daf1f0e --- /dev/null +++ b/app/src/main/java/com/polzzak_android/presentation/main/progress/StampAdapter.kt @@ -0,0 +1,101 @@ +package com.polzzak_android.presentation.main.progress + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.polzzak_android.databinding.ItemStampNonBinding +import com.polzzak_android.databinding.ItemStampYesBinding +import com.polzzak_android.presentation.main.model.StampBoard + +class StampAdapter(private val dummy: List, private val interaction: ProgressInteraction) : + ListAdapter(DiffCallback) { + + private var stampList = dummy + //private var stampList: listOf() = null + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): RecyclerView.ViewHolder { + return when (viewType) { + 1 -> { + val view = + ItemStampNonBinding.inflate(LayoutInflater.from(parent.context), parent, false) + NonViewHolder(view) + } + else -> { + val view = + ItemStampYesBinding.inflate(LayoutInflater.from(parent.context), parent, false) + YesViewHolder(view, interaction) + } + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val curItem = stampList[position] + + when (curItem.type) { + 1 -> { + (holder as NonViewHolder).bind(curItem) + } + + else -> { + (holder as YesViewHolder).bind(curItem) + } + } + } + + override fun getItemCount(): Int { + return stampList.size + } + + override fun getItemViewType(position: Int): Int { + return stampList[position].type + } + + fun setStampList(newList: List) { + stampList = newList + notifyDataSetChanged() + } + + inner class NonViewHolder(binding: ItemStampNonBinding) : + RecyclerView.ViewHolder(binding.root) { + private val userHeaderTxt = binding.userNickNameHeader + private val userContentTxt = binding.userNickNameContent + + fun bind(item: StampBoard) { + userHeaderTxt.text = item.partner.nickname + userContentTxt.text = item.partner.nickname + } + } + + inner class YesViewHolder(binding: ItemStampYesBinding, interaction: ProgressInteraction) : + RecyclerView.ViewHolder(binding.root) { + private val userHeaderTxt = binding.userNickName + private val stampPager = binding.stampPager + private val curInd = binding.curPage + private val totalInd = binding.totalPage + + fun bind(item: StampBoard) { + userHeaderTxt.text = item.partner.nickname + + interaction.setViewPager(stampPager, curInd, totalInd, item.stampBoardSummaries) + } + } + + companion object { + private val DiffCallback = object : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: StampBoard, newItem: StampBoard): Boolean { + return oldItem.partner.memberId == newItem.partner.memberId + } + + override fun areContentsTheSame(oldItem: StampBoard, newItem: StampBoard): Boolean { + return oldItem == newItem + } + } + } + + +} diff --git a/app/src/main/java/com/polzzak_android/presentation/widget/SelectUserFilterFragment.kt b/app/src/main/java/com/polzzak_android/presentation/widget/SelectUserFilterFragment.kt new file mode 100644 index 00000000..88c192aa --- /dev/null +++ b/app/src/main/java/com/polzzak_android/presentation/widget/SelectUserFilterFragment.kt @@ -0,0 +1,64 @@ +package com.polzzak_android.presentation.widget + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.recyclerview.widget.LinearLayoutManager +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import com.polzzak_android.databinding.FragmentSelectUserFilterBinding +import com.polzzak_android.presentation.main.progress.SelectUserAdapter +import com.polzzak_android.presentation.main.progress.SelectUserInteraction +import com.polzzak_android.presentation.main.progress.StampAdapter + +class SelectUserFilterFragment : BottomSheetDialogFragment(), SelectUserInteraction { + + // Todo: base 필요? + private var _binding: FragmentSelectUserFilterBinding? = null + private val binding get() = _binding!! + + private lateinit var rvAdapter: SelectUserAdapter + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentSelectUserFilterBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + val dummy = listOf( + "전체", + "쿼카", + "멜론수박", + "아이유", + "test1" + ) + + rvAdapter = SelectUserAdapter(dummy, this) + binding.userSelectModalRc.adapter = rvAdapter + binding.userSelectModalRc.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + companion object { + fun newInstance(): SelectUserFilterFragment { + return SelectUserFilterFragment() + } + } + + override fun onUserClicked(userItem: String) { + Toast.makeText(context, "$userItem 클릭", Toast.LENGTH_SHORT).show() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/polzzak_android/presentation/widget/SemiCircleProgressView.kt b/app/src/main/java/com/polzzak_android/presentation/widget/SemiCircleProgressView.kt new file mode 100644 index 00000000..0584c4cb --- /dev/null +++ b/app/src/main/java/com/polzzak_android/presentation/widget/SemiCircleProgressView.kt @@ -0,0 +1,79 @@ +package com.polzzak_android.presentation.widget + +import android.animation.ValueAnimator +import android.content.Context +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.graphics.RectF +import android.util.AttributeSet +import android.view.View +import com.polzzak_android.R + +class SemiCircleProgressView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyle: Int = 0 +) : View(context, attrs, defStyle) { + + private val rectF = RectF() + private val progressPaint = Paint() + private val fullProgressPaint = Paint() + + private val arcStartAngle = -220f // 시작 각도 + private var arcSweepAngle = 0f // 유저 진행도 + private val arcEndAngle = 260f // 끝 각도 + + private var radius = 1f + private val strokeWidth = 60f // + + init { + progressPaint.style = Paint.Style.STROKE + progressPaint.strokeJoin = Paint.Join.ROUND + progressPaint.strokeCap = Paint.Cap.ROUND + + fullProgressPaint.style = Paint.Style.STROKE + fullProgressPaint.strokeJoin = Paint.Join.ROUND + fullProgressPaint.strokeCap = Paint.Cap.ROUND + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + + // set arc + val centerX = width.toFloat() / 2 + val centerY = height.toFloat() / 2 + radius = (Math.min(width, height) / 2).toFloat() + + // draw arc + rectF.set(centerX - radius, centerY - radius, centerX + radius, centerY + radius) + + // draw stroke + progressPaint.strokeWidth = strokeWidth + progressPaint.color = resources.getColor(R.color.primary) + fullProgressPaint.strokeWidth = strokeWidth + fullProgressPaint.color = resources.getColor(R.color.primary_100) + rectF.set( + centerX - radius + strokeWidth / 2, + centerY - radius + strokeWidth / 2, + centerX + radius - strokeWidth / 2, + centerY + radius - strokeWidth / 2 + ) + canvas.drawArc(rectF, arcStartAngle, arcEndAngle, false, fullProgressPaint) + canvas.drawArc(rectF, arcStartAngle, arcSweepAngle, false, progressPaint) + } + + fun setAnimation(endValue: Float) { + val startValue = arcSweepAngle + + ValueAnimator.ofFloat(startValue, endValue).apply { + this.duration = 1000L + addUpdateListener { animation -> + arcSweepAngle = animation.animatedValue as Float + invalidate() + } + start() + } + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_sheet_modal.xml b/app/src/main/res/drawable/bottom_sheet_modal.xml new file mode 100644 index 00000000..e494c6ca --- /dev/null +++ b/app/src/main/res/drawable/bottom_sheet_modal.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/round_background.xml b/app/src/main/res/drawable/round_background.xml new file mode 100644 index 00000000..ec85a2fb --- /dev/null +++ b/app/src/main/res/drawable/round_background.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/round_dashed_background.xml b/app/src/main/res/drawable/round_dashed_background.xml new file mode 100644 index 00000000..bb287906 --- /dev/null +++ b/app/src/main/res/drawable/round_dashed_background.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/round_semi_background.xml b/app/src/main/res/drawable/round_semi_background.xml new file mode 100644 index 00000000..3022f62b --- /dev/null +++ b/app/src/main/res/drawable/round_semi_background.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/round_stroke_background.xml b/app/src/main/res/drawable/round_stroke_background.xml new file mode 100644 index 00000000..d5ff49d9 --- /dev/null +++ b/app/src/main/res/drawable/round_stroke_background.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/select_user_background.xml b/app/src/main/res/drawable/select_user_background.xml new file mode 100644 index 00000000..90658403 --- /dev/null +++ b/app/src/main/res/drawable/select_user_background.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/white_gradient.xml b/app/src/main/res/drawable/white_gradient.xml new file mode 100644 index 00000000..882c97d0 --- /dev/null +++ b/app/src/main/res/drawable/white_gradient.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_completed.xml b/app/src/main/res/layout/fragment_completed.xml new file mode 100644 index 00000000..81014d3e --- /dev/null +++ b/app/src/main/res/layout/fragment_completed.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index cd27fc95..bff80c3e 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -1,11 +1,42 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> - - + android:layout_height="match_parent"> + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_progress.xml b/app/src/main/res/layout/fragment_progress.xml new file mode 100644 index 00000000..2e2ad2ed --- /dev/null +++ b/app/src/main/res/layout/fragment_progress.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_select_user_filter.xml b/app/src/main/res/layout/fragment_select_user_filter.xml new file mode 100644 index 00000000..f22a7433 --- /dev/null +++ b/app/src/main/res/layout/fragment_select_user_filter.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_select_user_filter.xml b/app/src/main/res/layout/item_select_user_filter.xml new file mode 100644 index 00000000..35468815 --- /dev/null +++ b/app/src/main/res/layout/item_select_user_filter.xml @@ -0,0 +1,24 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/item_stamp_non.xml b/app/src/main/res/layout/item_stamp_non.xml new file mode 100644 index 00000000..bc9b7b69 --- /dev/null +++ b/app/src/main/res/layout/item_stamp_non.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_stamp_progress.xml b/app/src/main/res/layout/item_stamp_progress.xml new file mode 100644 index 00000000..a309be46 --- /dev/null +++ b/app/src/main/res/layout/item_stamp_progress.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_stamp_yes.xml b/app/src/main/res/layout/item_stamp_yes.xml new file mode 100644 index 00000000..5639a44e --- /dev/null +++ b/app/src/main/res/layout/item_stamp_yes.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index ec666856..f27fc79d 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -9,7 +9,8 @@ android:id="@+id/mainFragment" android:name="com.polzzak_android.presentation.main.MainFragment" android:label="fragment_main" - tools:layout="@layout/fragment_main" /> + tools:layout="@layout/fragment_main" > + + \ 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 6b4eed06..ebc15ed9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,4 +6,7 @@ 쿠폰 알림 마이페이지 + + + / %1$d \ No newline at end of file diff --git a/app/src/main/res/values/style.xml b/app/src/main/res/values/style.xml index c26f5e0e..a22246bd 100644 --- a/app/src/main/res/values/style.xml +++ b/app/src/main/res/values/style.xml @@ -1,5 +1,6 @@ + - - + + + + + \ 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 be7317f7..74beab2f 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -12,6 +12,8 @@ ?attr/colorPrimaryVariant + @font/pretendard_regular + @style/AppBottomSheetDialogTheme