Skip to content

Commit

Permalink
Merge pull request #43 from kimhyebeen/master
Browse files Browse the repository at this point in the history
통계 화면 구현 Pull Request
  • Loading branch information
kimhyebeen authored Nov 24, 2020
2 parents a53b0ef + 2b48823 commit ee89f45
Show file tree
Hide file tree
Showing 35 changed files with 957 additions and 3 deletions.
6 changes: 5 additions & 1 deletion Picon/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ android {

defaultConfig {
applicationId "com.yapp.picon"
minSdkVersion 21
minSdkVersion 22
targetSdkVersion 29
versionCode 1
versionName "1.0"
Expand Down Expand Up @@ -92,6 +92,10 @@ dependencies {
//https://github.com/ParkSangGwon/TedPermission
implementation 'gun0912.ted:tedpermission:2.2.3'

// linear graph view
// https://github.com/swapnil1104/LinearGraphView?utm_source=android-arsenal.com&utm_medium=referral&utm_campaign=7928
implementation 'com.github.swapnil1104:LinearGraphView:0.0.1'

// Koin
// https://github.com/InsertKoinIO/koin
// Koin for Kotlin
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ class MapActivity : BaseMapActivity<MapActivityBinding, MapViewModel>(
when (item.itemId) {
R.id.map_nav_customize_emotion_name -> startNavActivity(NavTypeStringSet.CustomEmotion.type)
R.id.map_nav_setting -> startNavActivity(NavTypeStringSet.Setting.type)
R.id.map_nav_view_travel_statistic -> startNavActivity(NavTypeStringSet.Statistic.type)
}
return true
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.yapp.picon.presentation.model

data class ListItemForPlaceGraph (
var color: String,
var count: Int
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.yapp.picon.presentation.model

data class StatisticDate (
var selected: Boolean,
var year: Int,
var month: Int
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.yapp.picon.presentation.model

data class StatisticEmotionGraphItem (
var color: String,
var count: Int
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.yapp.picon.presentation.model

data class StatisticPlaceGraphItem (
var place: String,
var graphItems: List<ListItemForPlaceGraph>,
var total: Int
)
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import com.yapp.picon.R
import com.yapp.picon.databinding.DialogCustomFinishBinding
import com.yapp.picon.databinding.NavCustomEmotionFragmentBinding
import com.yapp.picon.presentation.base.BaseFragment
import com.yapp.picon.presentation.nav.adapter.CustomEmotionAdapter

class CustomEmotionFragment: BaseFragment<NavCustomEmotionFragmentBinding, NavViewModel>(
R.layout.nav_custom_emotion_fragment
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ class NavActivity : BaseActivity<NavActivityBinding, NavViewModel>(
return when (type) {
NavTypeStringSet.CustomEmotion.type -> CustomEmotionFragment()
NavTypeStringSet.Setting.type -> SettingFragment()
NavTypeStringSet.Statistic.type -> StatisticFragment()
else -> null
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ enum class NavTypeStringSet(val type: String) {
CustomEmotion("custom"),
ShowPhoto("photo"),
ShareMap("share"),
ShowGraph("graph"),
Statistic("statistic"),
Setting("setting")
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@ import androidx.lifecycle.MutableLiveData
import com.yapp.picon.presentation.base.BaseViewModel
import com.yapp.picon.presentation.nav.repository.CustomEmotionRepository
import com.yapp.picon.presentation.nav.repository.SettingRepository
import com.yapp.picon.presentation.nav.repository.StatisticRepository

class NavViewModel: BaseViewModel() {
val settingRepository = SettingRepository()
val customRepository = CustomEmotionRepository()
val statisticRepository = StatisticRepository()

private val _finishFlag = MutableLiveData<Boolean>()

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package com.yapp.picon.presentation.nav

import android.annotation.SuppressLint
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import com.yapp.picon.BR
import com.yapp.picon.R
import com.yapp.picon.databinding.NavStatisticContentViewBinding
import com.yapp.picon.presentation.base.BaseFragment
import com.yapp.picon.presentation.nav.adapter.EmotionGraphAdapter
import com.yapp.picon.presentation.nav.adapter.PlaceGraphAdapter

class StatisticContentViewFragment: BaseFragment<NavStatisticContentViewBinding, NavViewModel>(
R.layout.nav_statistic_content_view
) {
private lateinit var placeAdapter: PlaceGraphAdapter
private lateinit var emotionAdapter: EmotionGraphAdapter
private lateinit var colorList: List<String>

@Suppress("UNCHECKED_CAST")
override val vm: NavViewModel by activityViewModels {
object : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T =
NavViewModel() as T
}
}

override fun initBinding() {
}

@SuppressLint("ResourceType")
override fun onStart() {
super.onStart()
colorList = listOf(
getString(R.color.soft_blue),
getString(R.color.cornflower),
getString(R.color.bluegrey),
getString(R.color.very_light_brown),
getString(R.color.warm_grey)
)

setEmotionAdapter()
setPlaceAdapter()
observeGraphData()
}

private fun setEmotionAdapter() {
emotionAdapter = EmotionGraphAdapter(
colorList,
R.layout.emotion_graph_item,
BR.emotionItem
)
binding.navStatisticEmotionGraphRv.apply {
adapter = emotionAdapter
layoutManager = LinearLayoutManager(context)
setHasFixedSize(true)
}
}

private fun setPlaceAdapter() {
placeAdapter = PlaceGraphAdapter(
colorList,
R.layout.place_graph_item,
BR.placeItem
)
binding.navStatisticPlaceGraphRv.apply {
adapter = placeAdapter
layoutManager = LinearLayoutManager(context)
setHasFixedSize(true)
}
}

@SuppressLint("SetTextI18n")
private fun observeGraphData() {
vm.statisticRepository.placeList.observe(this, {
placeAdapter.setItems(it)
})
vm.statisticRepository.emotionList.observe(this, {
emotionAdapter.setItems(it)
var max = 0
it.map { item ->
if (max < item.count) max = item.count
}
emotionAdapter.setMaxCount(max)

var sum = 0
it.map { item ->
sum += item.count
}
binding.navStatisticPinNumberTv.text = "$sum"
})
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package com.yapp.picon.presentation.nav

import android.annotation.SuppressLint
import android.view.View
import android.view.animation.Animation
import android.view.animation.AnimationUtils
import androidx.core.view.isVisible
import androidx.fragment.app.FragmentTransaction
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import com.yapp.picon.BR
import com.yapp.picon.R
import com.yapp.picon.databinding.NavStatisticFragmentBinding
import com.yapp.picon.presentation.base.BaseFragment
import com.yapp.picon.presentation.nav.adapter.MonthListAdapter

class StatisticFragment: BaseFragment<NavStatisticFragmentBinding, NavViewModel>(
R.layout.nav_statistic_fragment
) {
private lateinit var transaction: FragmentTransaction
private lateinit var transrateUp: Animation
private lateinit var transrateDown: Animation
private lateinit var monthAdapter: MonthListAdapter

@Suppress("UNCHECKED_CAST")
override val vm: NavViewModel by activityViewModels {
object : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T =
NavViewModel() as T
}
}

override fun initBinding() {
}

override fun onStart() {
super.onStart()
// childFragmentManager를 사용해서 nav_statistic_content_view 붙이기
transaction = childFragmentManager.beginTransaction()
transaction.replace(R.id.nav_statistic_frame, StatisticContentViewFragment()).addToBackStack(null).commit()

setTransrateUpDownAnimation()

setMonthAdapter()
binding.navStatisticMonthRecycler.apply {
adapter = monthAdapter
layoutManager = LinearLayoutManager(context)
setHasFixedSize(true)
}

setAnimationToMonthList()
observeVM()
}

private fun setTransrateUpDownAnimation() {
transrateUp = AnimationUtils.loadAnimation(context, R.anim.translate_up)
transrateDown = AnimationUtils.loadAnimation(context, R.anim.translate_down)

transrateUp.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationStart(animation: Animation?) { }
override fun onAnimationEnd(animation: Animation?) {
binding.navStatisticMonthRecycler.visibility = View.INVISIBLE
}
override fun onAnimationRepeat(animation: Animation?) { }
})
}

@SuppressLint("ResourceType")
private fun setMonthAdapter() {
monthAdapter = MonthListAdapter(
listOf(getString(R.color.cornflower), getString(R.color.very_light_pink_two)),
{ str -> vm.statisticRepository.setTitle(str) },
{ pre, cur ->
vm.statisticRepository.changeSelected(pre)
vm.statisticRepository.changeSelected(cur)
},
{ monthListClickEvent() },
R.layout.month_list_item,
BR.monthItem
)
}

private fun setAnimationToMonthList() {
binding.navStatisticAppBar.navStatisticTitleLinearLayout.setOnClickListener {
monthListClickEvent()
}
}

private fun monthListClickEvent() {
binding.navStatisticMonthRecycler.let { monthList ->
if (monthList.isVisible) monthList.startAnimation(transrateUp)
else {
monthList.apply {
visibility = View.VISIBLE
startAnimation(transrateDown)
}
}
}
}

private fun observeVM() {
vm.statisticRepository.monthList.observe(this, {
monthAdapter.setItems(it)
// todo - 감정별, 지역별 그래프 데이터도 바꿔주기
})
vm.statisticRepository.title.observe(this, {
binding.navStatisticAppBar.navStatisticTitleTv.text = it
})
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.yapp.picon.presentation.nav
package com.yapp.picon.presentation.nav.adapter

import android.app.AlertDialog
import android.app.Dialog
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.yapp.picon.presentation.nav.adapter

import androidx.annotation.LayoutRes
import com.broooapps.lineargraphview2.DataModel
import com.yapp.picon.R
import com.yapp.picon.databinding.EmotionGraphItemBinding
import com.yapp.picon.databinding.PlaceGraphItemBinding
import com.yapp.picon.presentation.base.BaseRecyclerView
import com.yapp.picon.presentation.model.StatisticEmotionGraphItem
import com.yapp.picon.presentation.model.StatisticPlaceGraphItem
import kotlinx.android.synthetic.main.emotion_graph_item.view.*
import kotlinx.android.synthetic.main.place_graph_item.view.*

class EmotionGraphAdapter(
private val colorList: List<String>,
@LayoutRes private val layoutRes: Int,
bindingVariabledId: Int
) : BaseRecyclerView.BaseAdapter<StatisticEmotionGraphItem, EmotionGraphItemBinding>(
layoutRes,
bindingVariabledId
) {
private var maxCount = 0

fun setMaxCount(value: Int) {
maxCount = value
}

override fun onBindViewHolder(
baseViewHolder: BaseRecyclerView.BaseViewHolder<EmotionGraphItemBinding>,
position: Int
) {
super.onBindViewHolder(baseViewHolder, position)

baseViewHolder.itemView.emotion_graph_view
.setData(
listOf(
DataModel(
items[position].color,
colorList[position],
items[position].count
)
),
maxCount.toFloat()
)
}
}
Loading

0 comments on commit ee89f45

Please sign in to comment.