Skip to content
This repository was archived by the owner on Jun 27, 2020. It is now read-only.

Commit ff70798

Browse files
#179. Redesign ReportActivity.
1 parent 5072258 commit ff70798

File tree

12 files changed

+227
-272
lines changed

12 files changed

+227
-272
lines changed

app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.kt

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,18 @@ import android.widget.AdapterView
55
import android.widget.ArrayAdapter
66
import com.blogspot.e_kanivets.moneytracker.R
77
import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity
8-
import com.blogspot.e_kanivets.moneytracker.adapter.ExpandableListReportAdapter
8+
import com.blogspot.e_kanivets.moneytracker.adapter.RecordReportAdapter
99
import com.blogspot.e_kanivets.moneytracker.controller.CurrencyController
10+
import com.blogspot.e_kanivets.moneytracker.controller.FormatController
1011
import com.blogspot.e_kanivets.moneytracker.controller.data.ExchangeRateController
1112
import com.blogspot.e_kanivets.moneytracker.controller.data.RecordController
1213
import com.blogspot.e_kanivets.moneytracker.entity.Period
14+
import com.blogspot.e_kanivets.moneytracker.entity.RecordReportItem
1315
import com.blogspot.e_kanivets.moneytracker.entity.data.Record
1416
import com.blogspot.e_kanivets.moneytracker.report.ReportMaker
15-
import com.blogspot.e_kanivets.moneytracker.report.record.RecordReportConverter
1617
import com.blogspot.e_kanivets.moneytracker.ui.presenter.ShortSummaryPresenter
1718
import kotlinx.android.synthetic.main.activity_report.*
18-
import java.util.ArrayList
19-
import java.util.HashMap
19+
import java.util.*
2020
import javax.inject.Inject
2121

2222
class ReportActivity : BaseBackActivity() {
@@ -27,9 +27,12 @@ class ReportActivity : BaseBackActivity() {
2727
lateinit var rateController: ExchangeRateController
2828
@Inject
2929
lateinit var currencyController: CurrencyController
30+
@Inject
31+
lateinit var formatController: FormatController
3032

3133
private var recordList: List<Record> = listOf()
3234
private var period: Period? = null
35+
private lateinit var adapter: RecordReportAdapter
3336

3437
private lateinit var shortSummaryPresenter: ShortSummaryPresenter
3538

@@ -44,6 +47,7 @@ class ReportActivity : BaseBackActivity() {
4447

4548
recordList = recordController.getRecordsForPeriod(period)
4649
shortSummaryPresenter = ShortSummaryPresenter(this)
50+
adapter = RecordReportAdapter(mutableListOf(), hashMapOf(), this)
4751

4852
return true
4953
}
@@ -53,36 +57,35 @@ class ReportActivity : BaseBackActivity() {
5357

5458
initSpinnerCurrency()
5559

56-
expListView.addHeaderView(shortSummaryPresenter.create(false, null))
60+
adapter.addSummaryView(shortSummaryPresenter.create(false, null))
61+
recyclerView.adapter = adapter
5762
}
5863

5964
private fun update(currency: String) {
6065
val reportMaker = ReportMaker(rateController)
6166
val report = reportMaker.getRecordReport(currency, period, recordList)
6267

63-
var adapter: ExpandableListReportAdapter? = null
64-
65-
//val childData = ArrayList<List<Map<String, String>>>()
68+
val data: HashMap<RecordReportItem.ParentRow, List<RecordReportItem.ChildRow>> = hashMapOf()
69+
val items: MutableList<RecordReportItem> = mutableListOf()
6670

6771
if (report != null) {
68-
/*for (categoryRecord in report.summary) {
69-
val childDataItem = ArrayList<Map<String, String>>()
70-
for (summaryRecord in categoryRecord.summaryRecordList) {
71-
val m = HashMap<String, String>()
72-
//m[TITLE_PARAM_NAME] = summaryRecord.title
73-
//m[PRICE_PARAM_NAME] = java.lang.Double.toString(summaryRecord.amount)
72+
for (categoryRecord in report.summary) {
7473

75-
childDataItem.add(m)
76-
}
74+
val parentRow = RecordReportItem.ParentRow(categoryRecord.title, formatController.formatSignedAmount(categoryRecord.amount), false)
75+
items.add(parentRow)
7776

78-
childData.add(childDataItem)
79-
}*/
77+
val childRows: MutableList<RecordReportItem.ChildRow> = mutableListOf()
78+
79+
for (summaryRecord in categoryRecord.summaryRecordList) {
80+
val childRow = RecordReportItem.ChildRow(summaryRecord.title, formatController.formatSignedAmount(summaryRecord.amount))
81+
childRows.add(childRow)
82+
}
8083

81-
val recordReportConverter = RecordReportConverter(report)
82-
adapter = ExpandableListReportAdapter(this, recordReportConverter)
84+
data[parentRow] = childRows
85+
}
8386
}
8487

85-
expListView.setAdapter(adapter)
88+
adapter.setData(items, data)
8689
shortSummaryPresenter.update(report, currency, reportMaker.currencyNeeded(currency, recordList))
8790
}
8891

app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/ExpandableListReportAdapter.java

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

app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordReportAdapter.kt

Lines changed: 116 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,147 @@
11
package com.blogspot.e_kanivets.moneytracker.adapter
22

33
import android.content.Context
4+
import android.support.v4.content.ContextCompat
45
import android.support.v7.widget.RecyclerView
56
import android.view.LayoutInflater
67
import android.view.View
78
import android.view.ViewGroup
9+
import android.widget.TextView
810
import com.blogspot.e_kanivets.moneytracker.R
911
import com.blogspot.e_kanivets.moneytracker.entity.RecordReportItem
12+
import kotlinx.android.synthetic.main.view_report_item_exp.view.*
1013

11-
class RecordReportAdapter(private var items: List<RecordReportItem>, private val ctx: Context) : RecyclerView.Adapter<RecordReportAdapter.ViewHolder>() {
14+
class RecordReportAdapter(
15+
private var items: MutableList<RecordReportItem>,
16+
private var data: HashMap<RecordReportItem.ParentRow, List<RecordReportItem.ChildRow>>,
17+
private val ctx: Context
18+
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
19+
20+
private var red: Int = 0
21+
private var green: Int = 0
22+
23+
init {
24+
red = ContextCompat.getColor(ctx, R.color.red)
25+
green = ContextCompat.getColor(ctx, R.color.green)
26+
}
27+
28+
private lateinit var summaryViewHolder: RecyclerView.ViewHolder
1229

1330
override fun getItemCount(): Int {
1431
return items.size + 1
1532
}
1633

1734
override fun getItemViewType(position: Int): Int = when {
1835
position == 0 -> TYPE_SUMMARY
19-
items[position - 1] is RecordReportItem.ChildRow -> TYPE_PARENT
20-
else -> TYPE_CHILD
36+
items[getPosWithoutSummary(position)] is RecordReportItem.ChildRow -> TYPE_CHILD
37+
else -> TYPE_PARENT
2138
}
2239

2340
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
2441
when (viewType) {
25-
TYPE_PARENT -> ViewHolder(LayoutInflater.from(ctx).inflate(R.layout.view_report_item_exp, parent, false))
26-
TYPE_CHILD -> ViewHolder(LayoutInflater.from(ctx).inflate(R.layout.view_report_item, parent, false))
27-
else -> ViewHolder(LayoutInflater.from(ctx).inflate(R.layout.view_report_item, parent, false))
42+
TYPE_PARENT -> ParentViewHolder(LayoutInflater.from(ctx).inflate(R.layout.view_report_item_exp, parent, false))
43+
TYPE_CHILD -> ChildViewHolder(LayoutInflater.from(ctx).inflate(R.layout.view_report_item, parent, false))
44+
else -> summaryViewHolder
2845
}
2946

30-
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
47+
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
48+
val posWithoutSummary = getPosWithoutSummary(position)
49+
if (posWithoutSummary < 0) return
50+
51+
if (holder is ChildViewHolder) {
52+
val row = items[posWithoutSummary] as RecordReportItem.ChildRow
53+
holder.tvCategory.text = row.title
54+
holder.tvTotal.text = row.amount
55+
holder.tvTotal.setTextColor(if (row.amount.first() != '-') green else red)
56+
} else {
57+
val parentViewHolder = holder as ParentViewHolder
58+
val row = items[posWithoutSummary] as RecordReportItem.ParentRow
59+
parentViewHolder.tvCategory.text = row.category
60+
parentViewHolder.tvTotal.text = row.totalAmount
61+
holder.tvTotal.setTextColor(if (row.totalAmount.first() != '-') green else red)
62+
}
63+
}
64+
65+
fun setData(items: MutableList<RecordReportItem>, data: HashMap<RecordReportItem.ParentRow, List<RecordReportItem.ChildRow>>) {
66+
this.items = items
67+
this.data = data
68+
notifyDataSetChanged()
69+
}
3170

71+
fun addSummaryView(summaryView: View) {
72+
this.summaryViewHolder = summaryView.tag as RecyclerView.ViewHolder
3273
}
3374

34-
class ViewHolder(view: View) : RecyclerView.ViewHolder(view)
75+
private fun changeItems(position: Int) {
76+
if (items[position] is RecordReportItem.ParentRow) {
77+
val parentRow: RecordReportItem.ParentRow = items[position] as RecordReportItem.ParentRow
78+
79+
if (parentRow.isOpen) {
80+
val item = items.filterIndexed { index, _ -> index > position }
81+
.find { recordReportItem -> recordReportItem is RecordReportItem.ParentRow }
82+
83+
val lastChildInd = if (item != null) items.indexOf(item) else items.size
84+
85+
items.subList(position + 1, lastChildInd).clear()
86+
val itemCount = lastChildInd - position - 1
87+
notifyItemRangeRemoved(getPosWithSummary(position + 1), itemCount)
88+
89+
parentRow.isOpen = false
90+
} else {
91+
data[parentRow]?.let { childRows ->
92+
var lastChildInd = position + 1
93+
for (childRow in childRows) {
94+
items.add(lastChildInd, childRow)
95+
lastChildInd++
96+
}
97+
notifyItemRangeInserted(getPosWithSummary(position + 1), childRows.size)
98+
}
99+
100+
parentRow.isOpen = true
101+
}
102+
}
103+
}
104+
105+
private fun getPosWithSummary(position: Int): Int {
106+
return position + 1
107+
}
108+
109+
private fun getPosWithoutSummary(position: Int): Int {
110+
return position - 1
111+
}
112+
113+
inner class ParentViewHolder : RecyclerView.ViewHolder {
114+
115+
var tvCategory: TextView
116+
var tvTotal: TextView
117+
118+
constructor(view: View) : super(view) {
119+
tvCategory = view.tvCategory
120+
tvTotal = view.tvTotal
121+
122+
view.setOnClickListener {
123+
if (view.lowerDivider.visibility == View.VISIBLE) {
124+
view.lowerDivider.visibility = View.GONE
125+
view.ivArrow.setImageDrawable(ContextCompat.getDrawable(ctx, R.drawable.ic_arrow_downward_outline))
126+
} else {
127+
view.lowerDivider.visibility = View.VISIBLE
128+
view.ivArrow.setImageDrawable(ContextCompat.getDrawable(ctx, R.drawable.ic_arrow_upward_outline))
129+
}
130+
131+
changeItems(getPosWithoutSummary(adapterPosition))
132+
}
133+
}
134+
}
135+
136+
class ChildViewHolder(view: View) : RecyclerView.ViewHolder(view) {
137+
138+
val tvCategory: TextView = view.tvCategory
139+
val tvTotal: TextView = view.tvTotal
140+
141+
}
35142

36143
companion object {
144+
37145
private const val TYPE_SUMMARY = 0
38146
private const val TYPE_PARENT = 1
39147
private const val TYPE_CHILD = 2

app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/AppComponent.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import com.blogspot.e_kanivets.moneytracker.activity.record.MainActivity;
1818
import com.blogspot.e_kanivets.moneytracker.adapter.AccountAdapter;
1919
import com.blogspot.e_kanivets.moneytracker.adapter.ExchangeRateAdapter;
20-
import com.blogspot.e_kanivets.moneytracker.adapter.ExpandableListReportAdapter;
2120
import com.blogspot.e_kanivets.moneytracker.adapter.MonthSummaryAdapter;
2221
import com.blogspot.e_kanivets.moneytracker.adapter.RecordAdapter;
2322
import com.blogspot.e_kanivets.moneytracker.di.module.repo.CachedRepoModule;
@@ -75,8 +74,6 @@ public interface AppComponent {
7574

7675
void inject(AccountAdapter accountAdapter);
7776

78-
void inject(ExpandableListReportAdapter expandableListReportAdapter);
79-
8077
void inject(ShortSummaryPresenter shortSummaryPresenter);
8178

8279
void inject(ExchangeRateAdapter exchangeRateAdapter);

app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/RecordReportItem.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ package com.blogspot.e_kanivets.moneytracker.entity
22

33
sealed class RecordReportItem {
44

5-
data class ChildRow(val title: String, val amount: Long) : RecordReportItem()
5+
data class ChildRow(val title: String, val amount: String) : RecordReportItem()
66

7-
data class ParentRow(val category: String, val totalAmount: Long, val isOpen: Boolean) : RecordReportItem()
7+
data class ParentRow(val category: String, val totalAmount: String, var isOpen: Boolean) : RecordReportItem()
88

99
}

0 commit comments

Comments
 (0)