@@ -5,6 +5,7 @@ import android.app.Activity
55import android.app.DatePickerDialog
66import android.app.TimePickerDialog
77import android.content.res.ColorStateList
8+ import android.os.Bundle
89import androidx.core.content.ContextCompat
910import android.text.InputFilter
1011import android.text.Spanned
@@ -23,6 +24,7 @@ import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController
2324import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController
2425import com.blogspot.e_kanivets.moneytracker.controller.data.CategoryController
2526import com.blogspot.e_kanivets.moneytracker.controller.data.RecordController
27+ import com.blogspot.e_kanivets.moneytracker.databinding.ActivityAddRecordBinding
2628import com.blogspot.e_kanivets.moneytracker.entity.data.Account
2729import com.blogspot.e_kanivets.moneytracker.entity.data.Category
2830import com.blogspot.e_kanivets.moneytracker.entity.data.Record
@@ -31,8 +33,6 @@ import com.blogspot.e_kanivets.moneytracker.util.CategoryAutoCompleter
3133import com.blogspot.e_kanivets.moneytracker.util.CrashlyticsProxy
3234import com.blogspot.e_kanivets.moneytracker.util.validator.IValidator
3335import 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.*
3636import java.util.*
3737import 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