Skip to content

Commit 950be40

Browse files
committed
36 - Migrate AddRecordActivity to ViewBinding
1 parent 357e674 commit 950be40

File tree

3 files changed

+248
-244
lines changed

3 files changed

+248
-244
lines changed

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

Lines changed: 89 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.app.Activity
55
import android.app.DatePickerDialog
66
import android.app.TimePickerDialog
77
import android.content.res.ColorStateList
8+
import android.os.Bundle
89
import androidx.core.content.ContextCompat
910
import android.text.InputFilter
1011
import android.text.Spanned
@@ -23,6 +24,7 @@ import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController
2324
import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController
2425
import com.blogspot.e_kanivets.moneytracker.controller.data.CategoryController
2526
import com.blogspot.e_kanivets.moneytracker.controller.data.RecordController
27+
import com.blogspot.e_kanivets.moneytracker.databinding.ActivityAddRecordBinding
2628
import com.blogspot.e_kanivets.moneytracker.entity.data.Account
2729
import com.blogspot.e_kanivets.moneytracker.entity.data.Category
2830
import com.blogspot.e_kanivets.moneytracker.entity.data.Record
@@ -31,8 +33,6 @@ import com.blogspot.e_kanivets.moneytracker.util.CategoryAutoCompleter
3133
import com.blogspot.e_kanivets.moneytracker.util.CrashlyticsProxy
3234
import com.blogspot.e_kanivets.moneytracker.util.validator.IValidator
3335
import com.blogspot.e_kanivets.moneytracker.util.validator.RecordValidator
34-
import kotlinx.android.synthetic.main.activity_add_record.*
35-
import kotlinx.android.synthetic.main.content_add_record.*
3636
import java.util.*
3737
import javax.inject.Inject
3838

@@ -47,24 +47,37 @@ class AddRecordActivity : BaseBackActivity() {
4747

4848
@Inject
4949
lateinit var categoryController: CategoryController
50+
5051
@Inject
5152
lateinit var recordController: RecordController
53+
5254
@Inject
5355
lateinit var accountController: AccountController
56+
5457
@Inject
5558
lateinit var formatController: FormatController
59+
5660
@Inject
5761
lateinit var preferenceController: PreferenceController
5862

5963
private lateinit var recordValidator: IValidator<Record>
6064
private lateinit var uiDecorator: AddRecordUiDecorator
6165
private lateinit var autoCompleter: CategoryAutoCompleter
6266

63-
override fun getContentViewId() = R.layout.activity_add_record
67+
private lateinit var binding: ActivityAddRecordBinding
68+
69+
override fun onCreate(savedInstanceState: Bundle?) {
70+
super.onCreate(savedInstanceState)
6471

72+
binding = ActivityAddRecordBinding.inflate(layoutInflater)
73+
setContentView(binding.root)
6574

66-
override fun initData(): Boolean {
67-
super.initData()
75+
initData()
76+
initToolbar()
77+
initViews()
78+
}
79+
80+
private fun initData(): Boolean {
6881
appComponent.inject(this)
6982

7083
record = intent.getParcelableExtra(KEY_RECORD)
@@ -75,72 +88,65 @@ class AddRecordActivity : BaseBackActivity() {
7588
timestamp = record?.time ?: Date().time
7689

7790
return (mode != null && (type == Record.TYPE_INCOME || type == Record.TYPE_EXPENSE)
78-
&& ((mode == Mode.MODE_EDIT && record != null) || (mode == Mode.MODE_ADD && record == null)))
91+
&& ((mode == Mode.MODE_EDIT && record != null) || (mode == Mode.MODE_ADD && record == null)))
7992
}
8093

8194
@SuppressLint("SetTextI18n")
82-
override fun initViews() {
83-
super.initViews()
84-
85-
recordValidator = RecordValidator(this, contentView)
95+
private fun initViews() {
96+
recordValidator = RecordValidator(this, binding)
8697
autoCompleter = CategoryAutoCompleter(categoryController, preferenceController)
8798
uiDecorator = AddRecordUiDecorator(this)
8899

89100
uiDecorator.decorateActionBar(supportActionBar, mode, type)
90101

91102
if (mode == Mode.MODE_EDIT) {
92103
record?.let { record ->
93-
etTitle.setText(record.title)
94-
etCategory.setText(record.category?.name.orEmpty())
95-
etNotes.setText(record.notes)
96-
etPrice.setText(formatController.formatPrecisionNone(record.fullPrice))
104+
binding.etTitle.setText(record.title)
105+
binding.etCategory.setText(record.category?.name.orEmpty())
106+
binding.etNotes.setText(record.notes)
107+
binding.etPrice.setText(formatController.formatPrecisionNone(record.fullPrice))
97108
}
98109
}
99110

100111
initCategoryAutocomplete()
101112
presentSpinnerAccount()
102113

103114
// Restrict ';' for input, because it's used as delimiter when exporting
104-
etTitle.filters = arrayOf<InputFilter>(SemicolonInputFilter())
105-
etCategory.filters = arrayOf<InputFilter>(SemicolonInputFilter())
106-
etNotes.filters = arrayOf<InputFilter>(SemicolonInputFilter())
115+
binding.etTitle.filters = arrayOf<InputFilter>(SemicolonInputFilter())
116+
binding.etCategory.filters = arrayOf<InputFilter>(SemicolonInputFilter())
117+
binding.etNotes.filters = arrayOf<InputFilter>(SemicolonInputFilter())
107118

108-
tvDate.setOnClickListener { selectDate() }
109-
tvTime.setOnClickListener { selectTime() }
119+
binding.tvDate.setOnClickListener { selectDate() }
120+
binding.tvTime.setOnClickListener { selectTime() }
110121

111-
if (type == Record.TYPE_EXPENSE) {
112-
fabDone.backgroundTintList = (getColorForFab(R.color.red_light))
113-
} else {
114-
fabDone.backgroundTintList = (getColorForFab(R.color.green_light))
115-
}
116-
117-
fabDone.setOnClickListener { tryRecord() }
122+
binding.fabDone.backgroundTintList = ColorStateList.valueOf(
123+
ContextCompat.getColor(this, if (type == Record.TYPE_EXPENSE) R.color.red_light else R.color.green_light)
124+
)
125+
binding.fabDone.setOnClickListener { tryRecord() }
118126

119127
updateDateAndTime()
120128
}
121129

122-
private fun getColorForFab(color: Int): ColorStateList {
123-
return ColorStateList.valueOf(ContextCompat.getColor(this, color))
124-
}
125-
126130
private fun initCategoryAutocomplete() {
127131
val categoryAutoCompleteAdapter = CategoryAutoCompleteAdapter(
128-
this, R.layout.view_category_item, autoCompleter)
129-
etCategory.setAdapter(categoryAutoCompleteAdapter)
130-
etCategory.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id ->
131-
etCategory.setText(parent.adapter.getItem(position) as String)
132-
etCategory.setSelection(etCategory.text.length)
133-
}
134-
etCategory.setOnEditorActionListener { v, actionId, event ->
132+
this, R.layout.view_category_item, autoCompleter
133+
)
134+
binding.etCategory.setAdapter(categoryAutoCompleteAdapter)
135+
binding.etCategory.onItemClickListener =
136+
AdapterView.OnItemClickListener { parent, _, position, _ ->
137+
binding.etCategory.setText(parent.adapter.getItem(position) as String)
138+
binding.etCategory.setSelection(binding.etCategory.text.length)
139+
}
140+
binding.etCategory.setOnEditorActionListener { _, actionId, _ ->
135141
if (actionId == EditorInfo.IME_ACTION_DONE) tryRecord()
136142
false
137143
}
138-
etCategory.onFocusChangeListener = View.OnFocusChangeListener { view, hasFocus ->
139-
if (hasFocus && etCategory.text.toString().trim().isEmpty()) {
140-
val title = etTitle.text.toString().trim()
144+
binding.etCategory.onFocusChangeListener = View.OnFocusChangeListener { view, hasFocus ->
145+
if (hasFocus && binding.etCategory.text.toString().trim().isEmpty()) {
146+
val title = binding.etTitle.text.toString().trim()
141147
autoCompleter.completeByRecordTitle(title)?.let { prediction ->
142-
etCategory.setText(prediction)
143-
etCategory.selectAll()
148+
binding.etCategory.setText(prediction)
149+
binding.etCategory.selectAll()
144150
}
145151
}
146152
}
@@ -180,21 +186,22 @@ class AddRecordActivity : BaseBackActivity() {
180186
val calendar = Calendar.getInstance()
181187
calendar.timeInMillis = timestamp
182188
val dialog = DatePickerDialog(this, uiDecorator.getTheme(type),
183-
DatePickerDialog.OnDateSetListener { view, year, monthOfYear, dayOfMonth ->
184-
val newCalendar = Calendar.getInstance()
185-
newCalendar.timeInMillis = timestamp
186-
newCalendar.set(Calendar.YEAR, year)
187-
newCalendar.set(Calendar.MONTH, monthOfYear)
188-
newCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth)
189-
190-
if (newCalendar.timeInMillis < Date().time) {
191-
timestamp = newCalendar.timeInMillis
192-
updateDateAndTime()
193-
} else {
194-
showToast(R.string.record_in_future)
195-
}
196-
}, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
197-
calendar.get(Calendar.DAY_OF_MONTH))
189+
{ view, year, monthOfYear, dayOfMonth ->
190+
val newCalendar = Calendar.getInstance()
191+
newCalendar.timeInMillis = timestamp
192+
newCalendar.set(Calendar.YEAR, year)
193+
newCalendar.set(Calendar.MONTH, monthOfYear)
194+
newCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth)
195+
196+
if (newCalendar.timeInMillis < Date().time) {
197+
timestamp = newCalendar.timeInMillis
198+
updateDateAndTime()
199+
} else {
200+
showToast(R.string.record_in_future)
201+
}
202+
}, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
203+
calendar.get(Calendar.DAY_OF_MONTH)
204+
)
198205
dialog.show()
199206
}
200207

@@ -203,20 +210,21 @@ class AddRecordActivity : BaseBackActivity() {
203210
val calendar = Calendar.getInstance()
204211
calendar.timeInMillis = timestamp
205212
val dialog = TimePickerDialog(this, uiDecorator.getTheme(type),
206-
TimePickerDialog.OnTimeSetListener { view, hourOfDay, minute ->
207-
val newCalendar = Calendar.getInstance()
208-
newCalendar.timeInMillis = timestamp
209-
newCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay)
210-
newCalendar.set(Calendar.MINUTE, minute)
211-
212-
if (newCalendar.timeInMillis < Date().time) {
213-
timestamp = newCalendar.timeInMillis
214-
updateDateAndTime()
215-
} else {
216-
showToast(R.string.record_in_future)
217-
}
218-
}, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE),
219-
DateFormat.is24HourFormat(this))
213+
{ view, hourOfDay, minute ->
214+
val newCalendar = Calendar.getInstance()
215+
newCalendar.timeInMillis = timestamp
216+
newCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay)
217+
newCalendar.set(Calendar.MINUTE, minute)
218+
219+
if (newCalendar.timeInMillis < Date().time) {
220+
timestamp = newCalendar.timeInMillis
221+
updateDateAndTime()
222+
} else {
223+
showToast(R.string.record_in_future)
224+
}
225+
}, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE),
226+
DateFormat.is24HourFormat(this)
227+
)
220228
dialog.show()
221229
}
222230

@@ -235,14 +243,14 @@ class AddRecordActivity : BaseBackActivity() {
235243
}
236244

237245
if (selectedAccountIndex == -1) {
238-
spinnerAccount.isEnabled = false
246+
binding.spinnerAccount.isEnabled = false
239247

240248
accounts.clear()
241249
accounts.add(getString(R.string.account_removed))
242250
}
243251

244-
spinnerAccount.adapter = ArrayAdapter(this, R.layout.view_spinner_item, accounts)
245-
spinnerAccount.setSelection(selectedAccountIndex)
252+
binding.spinnerAccount.adapter = ArrayAdapter(this, R.layout.view_spinner_item, accounts)
253+
binding.spinnerAccount.setSelection(selectedAccountIndex)
246254
}
247255

248256
private fun tryRecord() {
@@ -262,11 +270,11 @@ class AddRecordActivity : BaseBackActivity() {
262270
return false
263271
}
264272

265-
var title = etTitle.text.toString().trim()
266-
val category = etCategory.text.toString().trim()
267-
val notes = etNotes.text.toString().trim()
268-
val price = etPrice.text.toString().toDouble()
269-
val account = accountList[spinnerAccount.selectedItemPosition]
273+
var title = binding.etTitle.text.toString().trim()
274+
val category = binding.etCategory.text.toString().trim()
275+
val notes = binding.etNotes.text.toString().trim()
276+
val price = binding.etPrice.text.toString().toDouble()
277+
val account = accountList[binding.spinnerAccount.selectedItemPosition]
270278

271279
if (title.isEmpty()) {
272280
title = category
@@ -288,8 +296,8 @@ class AddRecordActivity : BaseBackActivity() {
288296
}
289297

290298
private fun updateDateAndTime() {
291-
tvDate.text = formatController.formatDateToNumber(timestamp)
292-
tvTime.text = formatController.formatTime(timestamp)
299+
binding.tvDate.text = formatController.formatDateToNumber(timestamp)
300+
binding.tvTime.text = formatController.formatTime(timestamp)
293301
}
294302

295303
enum class Mode { MODE_ADD, MODE_EDIT }

0 commit comments

Comments
 (0)