Skip to content

Commit 6c701b5

Browse files
committed
feature:
- 년도별 데이터 시각화 완성
1 parent 695bb1b commit 6c701b5

8 files changed

Lines changed: 201 additions & 48 deletions

File tree

app/src/main/java/com/seok/gfd/retrofit/domain/YearContributionDto.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.seok.gfd.retrofit.domain
22

3+
import com.seok.gfd.retrofit.domain.resopnse.CommitsResponseDto
34
import lombok.AllArgsConstructor
45
import lombok.Getter
56
import lombok.NoArgsConstructor
@@ -12,12 +13,18 @@ import lombok.Setter
1213
class YearContributionDto {
1314
var year: String? = null
1415

15-
var contributions: List<Contribution>? = null
16+
var contributions: ArrayList<Contribution>? = null
17+
18+
constructor() {
19+
this.contributions = ArrayList()
20+
}
1621

1722
class Contribution{
1823
var date : String = ""
1924
var count : Int = 0
2025
var color : String = ""
2126
var intensity : Int = 0
2227
}
28+
29+
2330
}

app/src/main/java/com/seok/gfd/retrofit/domain/resopnse/CommitsResponseDto.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,18 @@ import lombok.Setter
1111
@AllArgsConstructor
1212
class CommitsResponseDto {
1313

14+
var year : String? = null
15+
1416
var years: List<Year>? = null
1517

1618
var contributions: List<Contribution>? = null
1719

20+
constructor(year: String?) {
21+
this.year = year
22+
this.contributions = ArrayList()
23+
}
24+
25+
1826
class Year{
1927
var year: String = ""
2028
var total: Int = 0
@@ -32,4 +40,6 @@ class CommitsResponseDto {
3240
var color : String = ""
3341
var intensity : Int = 0
3442
}
43+
44+
3545
}

app/src/main/java/com/seok/gfd/views/Main2Fragment.kt

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ import com.ogaclejapan.smarttablayout.utils.v4.FragmentPagerItemAdapter
1414
import com.ogaclejapan.smarttablayout.utils.v4.FragmentPagerItems
1515
import com.seok.gfd.R
1616
import com.seok.gfd.retrofit.domain.User
17-
import com.seok.gfd.retrofit.domain.YearContributionDto
18-
import com.seok.gfd.retrofit.domain.resopnse.CommitResponseDto
1917
import com.seok.gfd.retrofit.domain.resopnse.CommitsResponseDto
2018
import com.seok.gfd.utils.CommonUtils
2119
import com.seok.gfd.utils.SharedPreference
@@ -53,17 +51,19 @@ class Main2Fragment : Fragment() {
5351
githubContributionViewModel =
5452
ViewModelProviders.of(this).get(GithubContributionViewModel::class.java)
5553
githubContributionViewModel.getContributionData(user.login)
56-
57-
5854
}
5955

6056
private fun initViewModelFun() {
6157
githubContributionViewModel.commits.observe(this, Observer {
6258
val fragmentPagerItems = FragmentPagerItems.with(activity)
63-
for(element in it.years!!){
64-
fragmentPagerItems.add(element.year +"(" + element.total + ")", MainSub::class.java, MainSub.arguments(it))
59+
for (element in it.years!!) {
60+
val commitResponseDto = getYearContributionData(element.year, it)
61+
fragmentPagerItems.add(element.year + "(" + element.total + ")", MainSub::class.java, MainSub.arguments(commitResponseDto))
6562
}
66-
val adapter = FragmentPagerItemAdapter(activity?.supportFragmentManager, fragmentPagerItems.create())
63+
val adapter = FragmentPagerItemAdapter(
64+
activity?.supportFragmentManager,
65+
fragmentPagerItems.create()
66+
)
6767
main_view_pager.adapter = adapter
6868
main_tab_smart_layout.setViewPager(main_view_pager)
6969
})
@@ -75,20 +75,20 @@ class Main2Fragment : Fragment() {
7575
main_top_scalable_layout.scaleHeight = commonUtils.getScreenHeight()
7676

7777
main_tv_user_name.text = user.login
78-
Glide.with(this).load(user.avatar_url).apply(RequestOptions.circleCropTransform()).into(main_image_profile)
78+
Glide.with(this).load(user.avatar_url).apply(RequestOptions.circleCropTransform())
79+
.into(main_image_profile)
7980
main_tv_user_bio.text = user.bio
8081
}
8182

82-
private fun getYearContributionData(commitsResponseDto: CommitsResponseDto): ArrayList<YearContributionDto>{
83-
var result = YearContributionDto()
84-
var yearContributionDtoItem = null
85-
for (year in commitsResponseDto.years!!){
86-
for (element in commitsResponseDto.contributions!!){
87-
if(element.date.contains(year.toString())){
88-
// 데이터 찾아서 넣기
89-
}
83+
private fun getYearContributionData(year: String, commitsResponseDto: CommitsResponseDto): CommitsResponseDto {
84+
var yearContributionDtoItem = CommitsResponseDto(year)
85+
var resultList = yearContributionDtoItem.contributions as ArrayList
86+
for (element in commitsResponseDto.contributions!!) {
87+
if (element.date.contains(year)) {
88+
resultList.add(element)
9089
}
9190
}
92-
91+
yearContributionDtoItem.contributions = resultList
92+
return yearContributionDtoItem
9393
}
9494
}
Lines changed: 106 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,38 @@
11
package com.seok.gfd.views
22

3+
import android.graphics.Color
34
import android.os.Bundle
45
import android.view.LayoutInflater
56
import android.view.View
67
import android.view.ViewGroup
8+
import android.widget.LinearLayout
9+
import android.widget.TextView
10+
import android.widget.Toast
711
import androidx.fragment.app.Fragment
812
import com.ogaclejapan.smarttablayout.utils.v4.Bundler
913
import com.seok.gfd.R
1014
import com.seok.gfd.retrofit.domain.resopnse.CommitsResponseDto
1115
import com.seok.gfd.utils.CommonUtils
16+
import kotlinx.android.synthetic.main.fragment_main.*
17+
import kotlinx.android.synthetic.main.fragment_main_sub.*
18+
import org.jetbrains.anko.backgroundColor
19+
import org.jetbrains.anko.backgroundColorResource
20+
import org.jetbrains.anko.textColor
21+
import java.time.DayOfWeek
22+
import java.time.LocalDate
23+
import java.time.Month
24+
import java.time.format.DateTimeFormatter
25+
import kotlin.math.ceil
26+
import kotlin.math.roundToInt
1227

1328
class MainSub : Fragment() {
1429

15-
companion object{
16-
fun arguments(param : CommitsResponseDto) : Bundle{
30+
private lateinit var commitResponse: CommitsResponseDto
31+
32+
companion object {
33+
fun arguments(param: CommitsResponseDto): Bundle {
1734
val str = CommonUtils.gson.toJson(param)
18-
return Bundler().putString("key", str).get()
35+
return Bundler().putString("year", str).get()
1936
}
2037
}
2138

@@ -24,18 +41,99 @@ class MainSub : Fragment() {
2441
container: ViewGroup?,
2542
savedInstanceState: Bundle?
2643
): View? {
27-
return inflater.inflate(R.layout.fragment_main_sub1, container, false)
44+
return inflater.inflate(R.layout.fragment_main_sub, container, false)
2845
}
2946

3047
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
3148
super.onViewCreated(view, savedInstanceState)
49+
50+
initUI()
51+
3252
}
3353

3454

3555
override fun onCreate(savedInstanceState: Bundle?) {
3656
super.onCreate(savedInstanceState)
37-
val t = arguments?.getString("key")
38-
val user = CommonUtils.gson.fromJson(t, CommitsResponseDto::class.java)
39-
user
57+
init()
58+
}
59+
60+
private fun init() {
61+
val yearContribution = arguments?.getString("year")
62+
commitResponse = CommonUtils.gson.fromJson(yearContribution, CommitsResponseDto::class.java)
63+
}
64+
65+
private fun initUI() {
66+
67+
val date = commitResponse.contributions!![commitResponse.contributions!!.size - 1].date
68+
val localDate = LocalDate.parse(date, DateTimeFormatter.ISO_DATE)
69+
val startDay = getDayStartCount(localDate.dayOfWeek)
70+
71+
72+
var weekText = TextView(activity)
73+
var weekTop = 23f
74+
for (index in 1 .. ceil(commitResponse.contributions!!.size.toDouble() / 7).toInt() step 2){
75+
weekText = TextView(activity)
76+
weekText.textColor = activity!!.getColor(R.color.userRankPos)
77+
weekText.text = index.toString() + "W"
78+
main_sub_scalable_layout.addView(weekText, 20f, weekTop, 100f, 50f)
79+
main_sub_scalable_layout.setScale_TextSize(weekText, 40f)
80+
weekTop += 55f
81+
}
82+
weekTop = 23f
83+
for (index in 2 .. commitResponse.contributions!!.size / 7 step 2){
84+
weekText = TextView(activity)
85+
weekText.textColor = activity!!.getColor(R.color.userRankPos)
86+
weekText.text = index.toString() + "W"
87+
main_sub_scalable_layout.addView(weekText, 570f, weekTop, 100f, 50f)
88+
main_sub_scalable_layout.setScale_TextSize(weekText, 40f)
89+
weekTop += 55f
90+
}
91+
92+
var layoutSize = 45f
93+
var layoutPScaleTop = 30f
94+
var layoutPScaleLeft = 110f
95+
var layoutPScaleWidth = layoutSize
96+
var layoutPScaleHeight = layoutSize
97+
var lineChange = 0
98+
99+
for (index in 0 until startDay) {
100+
lineChange++
101+
layoutPScaleLeft += 55f
102+
}
103+
for (index in commitResponse.contributions?.size!! - 1 downTo 0) {
104+
val linearLayout = LinearLayout(activity)
105+
main_sub_scalable_layout.addView(
106+
linearLayout,
107+
layoutPScaleLeft,
108+
layoutPScaleTop,
109+
layoutPScaleWidth,
110+
layoutPScaleHeight
111+
)
112+
linearLayout.backgroundColor =
113+
Color.parseColor(commitResponse.contributions!![index].color)
114+
layoutPScaleLeft += 55f
115+
lineChange++
116+
if (lineChange % 7 == 0) {
117+
layoutPScaleLeft += 170f
118+
}
119+
if (lineChange % 14 == 0) {
120+
layoutPScaleTop += 55f
121+
layoutPScaleLeft = 110f
122+
}
123+
linearLayout.setOnClickListener {
124+
//존Toast
125+
}
126+
}
127+
}
128+
129+
private fun getDayStartCount(dayOfWeek: DayOfWeek): Int = when (dayOfWeek) {
130+
DayOfWeek.MONDAY -> 0
131+
DayOfWeek.TUESDAY -> 1
132+
DayOfWeek.WEDNESDAY -> 2
133+
DayOfWeek.THURSDAY -> 3
134+
DayOfWeek.FRIDAY -> 4
135+
DayOfWeek.SATURDAY -> 5
136+
DayOfWeek.SUNDAY -> 6
137+
else -> 0
40138
}
41-
}
139+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<shape xmlns:android="http://schemas.android.com/apk/res/android">
3+
<solid android:color="#cc444444" />
4+
<padding android:left="0dip" android:top="0dip" android:right="0dip" android:bottom="0dip" />
5+
</shape>

app/src/main/res/layout/fragment_main2.xml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,13 @@
7676
app:scale_top="135"
7777
app:scale_width="610" />
7878

79-
79+
</com.ssomai.android.scalablelayout.ScalableLayout>
80+
<com.ssomai.android.scalablelayout.ScalableLayout
81+
android:layout_width="match_parent"
82+
android:layout_height="wrap_content"
83+
app:scale_base_height="1920"
84+
app:scale_base_width="1080"
85+
tools:ignore="MissingPrefix">
8086
<com.ogaclejapan.smarttablayout.SmartTabLayout
8187
android:id="@+id/main_tab_smart_layout"
8288
android:layout_width="match_parent"
@@ -115,10 +121,8 @@
115121
android:layout_width="match_parent"
116122
android:layout_height="match_parent"
117123
android:layout_below="@id/main_tab_smart_layout"
118-
app:scale_height="1300"
124+
app:scale_height="1520"
119125
app:scale_top="400"
120126
app:scale_width="1080"/>
121-
122127
</com.ssomai.android.scalablelayout.ScalableLayout>
123-
124128
</FrameLayout>
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools"
5+
android:layout_width="match_parent"
6+
android:layout_height="match_parent"
7+
tools:context=".views.MainSub">
8+
9+
10+
<ScrollView
11+
android:layout_width="match_parent"
12+
android:layout_height="match_parent">
13+
14+
<LinearLayout
15+
android:layout_width="match_parent"
16+
android:layout_height="wrap_content"
17+
android:orientation="vertical">
18+
19+
<com.ssomai.android.scalablelayout.ScalableLayout
20+
android:id="@+id/main_sub_scalable_layout"
21+
android:layout_width="match_parent"
22+
android:layout_height="match_parent"
23+
app:scale_base_height="1520"
24+
app:scale_base_width="1080"
25+
tools:ignore="MissingPrefix">
26+
27+
<LinearLayout
28+
android:layout_width="match_parent"
29+
android:layout_height="match_parent"
30+
android:background="@drawable/rounding_trans_background"
31+
android:orientation="vertical"
32+
app:scale_height="1520"
33+
app:scale_width="1080">
34+
35+
</LinearLayout>
36+
</com.ssomai.android.scalablelayout.ScalableLayout>
37+
38+
<ImageView
39+
android:layout_width="wrap_content"
40+
android:layout_height="wrap_content"
41+
android:layout_gravity="center"
42+
android:src="@drawable/gfd_launcher"/>
43+
</LinearLayout>
44+
45+
46+
</ScrollView>
47+
</FrameLayout>

app/src/main/res/layout/fragment_main_sub1.xml

Lines changed: 0 additions & 18 deletions
This file was deleted.

0 commit comments

Comments
 (0)