Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEAT] 메인화면 보호자 #16

Merged
merged 4 commits into from
May 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ plugins {
android {
namespace 'com.polzzak_android'
compileSdk 33

defaultConfig {
applicationId "com.polzzak_android"
minSdk 26
Expand Down Expand Up @@ -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"

Expand Down
Original file line number Diff line number Diff line change
@@ -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<FragmentMainBinding>() {
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?) {
}

})
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.polzzak_android.presentation.main

import androidx.lifecycle.ViewModel

class StampViewModel: ViewModel() {

}
Original file line number Diff line number Diff line change
@@ -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<FragmentCompletedBinding>() {
override val layoutResId: Int = R.layout.fragment_completed
}
Original file line number Diff line number Diff line change
@@ -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
)
Original file line number Diff line number Diff line change
@@ -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<StampBoardSummary>
)
Original file line number Diff line number Diff line change
@@ -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
)
Original file line number Diff line number Diff line change
@@ -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<StampBoardSummary>,
private val interaction: ProgressInteraction
) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {

private var stampList = dummy
//private var stampList: listOf<StampBoardSummary>() = 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<StampBoardSummary>) {
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)
}
}
}

}
Original file line number Diff line number Diff line change
@@ -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<FragmentProgressBinding>(), 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>(
StampBoard(
type = 2,
Partner(
kid = false,
memberId = 2,
memberType = "ECT",
nickname = " 연동o도장판o",
profileUrl = ""
),
listOf<StampBoardSummary>(
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<StampBoardSummary>(

),
),
StampBoard(
type = 1,
Partner(
kid = false,
memberId = 3,
memberType = "ECT",
nickname = "연동o도장판x22",
profileUrl = ""
),
listOf<StampBoardSummary>(

),
)
)

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<StampBoardSummary>) {
// 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)
}
}
Original file line number Diff line number Diff line change
@@ -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<StampBoardSummary>)

fun onStampPagerClicked(stampBoardItem: StampBoardSummary)

fun setProgressAnim(view: SemiCircleProgressView)
}
Loading