Skip to content
This repository was archived by the owner on Jun 27, 2020. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@ jdk: oraclejdk8
android:
components:
# The BuildTools version used by your project
- build-tools-26.0.2
- build-tools-27.0.3

# The SDK version used to compile your project
- android-21
- android-26
- android-27

# Additional components
- extra-google-google_play_services
- extra-google-m2repository
- extra-android-m2repository
- addon-google_apis-google-26
- addon-google_apis-google-27

# Specify at least one system image,
# if you need to run emulator(s) during your tests
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@
android:screenOrientation="portrait"
android:theme="@style/Theme.Default" />
<activity
android:name=".activity.account.EditAccountActivity"
android:name=".activity.account.edit.EditAccountActivity"
android:label="@string/title_activity_edit_account"
android:screenOrientation="portrait"
android:theme="@style/Theme.Default"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import android.widget.ListView;

import com.blogspot.e_kanivets.moneytracker.R;
import com.blogspot.e_kanivets.moneytracker.activity.account.edit.EditAccountActivity;
import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity;
import com.blogspot.e_kanivets.moneytracker.adapter.AccountAdapter;
import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
package com.blogspot.e_kanivets.moneytracker.activity.account
package com.blogspot.e_kanivets.moneytracker.activity.account.edit

import android.app.Activity
import android.app.AlertDialog
import android.content.Context
import android.content.Intent
import android.support.v4.view.ViewPager.OnPageChangeListener
import android.view.Menu
import android.view.MenuItem

import com.blogspot.e_kanivets.moneytracker.R
import com.blogspot.e_kanivets.moneytracker.activity.account.edit.fragment.AccountOperationsFragment
import com.blogspot.e_kanivets.moneytracker.activity.account.edit.fragment.EditAccountFragment
import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity
import com.blogspot.e_kanivets.moneytracker.adapter.GeneralViewPagerAdapter
import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController
import com.blogspot.e_kanivets.moneytracker.entity.data.Account
import kotlinx.android.synthetic.main.activity_edit_account.*

import kotlinx.android.synthetic.main.activity_edit_account.fabDone
import kotlinx.android.synthetic.main.activity_edit_account.tabLayout
import kotlinx.android.synthetic.main.activity_edit_account.viewPager
import javax.inject.Inject

class EditAccountActivity : BaseBackActivity() {
Expand All @@ -22,9 +26,7 @@ class EditAccountActivity : BaseBackActivity() {

private lateinit var account: Account

override fun getContentViewId(): Int {
return R.layout.activity_edit_account
}
override fun getContentViewId(): Int = R.layout.activity_edit_account

override fun initData(): Boolean {
appComponent.inject(this@EditAccountActivity)
Expand All @@ -40,19 +42,27 @@ class EditAccountActivity : BaseBackActivity() {
override fun initViews() {
super.initViews()

etTitle.setText(account.title)
etGoal.setText(account.goal.toString())
viewColor.setBackgroundColor(account.color)
tabLayout.setupWithViewPager(viewPager)

val adapter = GeneralViewPagerAdapter(supportFragmentManager)
adapter.addFragment(EditAccountFragment.newInstance(account), getString(R.string.information))
adapter.addFragment(AccountOperationsFragment.newInstance(account), getString(R.string.operations))
viewPager.adapter = adapter

viewPager.addOnPageChangeListener(object : OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {}

override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}

override fun onPageSelected(position: Int) {
if (position == 0) fabDone.show() else fabDone.hide()
}

fabDone.setOnClickListener { done() }
})
}

override fun onCreateOptionsMenu(menu: Menu): Boolean {
if (account.isArchived) {
menuInflater.inflate(R.menu.menu_archived_account, menu)
} else {
menuInflater.inflate(R.menu.menu_account, menu)
}
menuInflater.inflate(if (account.isArchived) R.menu.menu_archived_account else R.menu.menu_account, menu)
return true
}

Expand All @@ -65,24 +75,6 @@ class EditAccountActivity : BaseBackActivity() {
}
}

private fun done() {
val title = etTitle.text.toString().trim { it <= ' ' }

if (title.isEmpty()) {
tilTitle.error = getString(R.string.field_cant_be_empty)
} else {
val newAccount = Account(
account.id, title, account.curSum.toDouble(),
account.currency, account.goal, account.isArchived, account.color
)
val updated = accountController.update(newAccount) != null
if (updated) {
setResult(Activity.RESULT_OK)
finish()
}
}
}

private fun archive(): Boolean {
if (account == accountController.readDefaultAccount()) {
showToast(R.string.cant_archive_default_account)
Expand Down Expand Up @@ -120,7 +112,7 @@ class EditAccountActivity : BaseBackActivity() {

companion object {

const val KEY_ACCOUNT = "key_account"
private const val KEY_ACCOUNT = "key_account"

fun newIntent(context: Context, account: Account): Intent {
val intent = Intent(context, EditAccountActivity::class.java)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package com.blogspot.e_kanivets.moneytracker.activity.account.edit.fragment

import android.os.Bundle
import android.view.View
import com.blogspot.e_kanivets.moneytracker.R
import com.blogspot.e_kanivets.moneytracker.activity.base.BaseFragment
import com.blogspot.e_kanivets.moneytracker.adapter.RecordAdapter
import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController
import com.blogspot.e_kanivets.moneytracker.controller.data.RecordController
import com.blogspot.e_kanivets.moneytracker.controller.data.TransferController
import com.blogspot.e_kanivets.moneytracker.entity.data.Account
import com.blogspot.e_kanivets.moneytracker.entity.data.Category
import com.blogspot.e_kanivets.moneytracker.entity.data.Record
import com.blogspot.e_kanivets.moneytracker.entity.data.Transfer
import kotlinx.android.synthetic.main.fragment_account_operations.*
import javax.inject.Inject

class AccountOperationsFragment : BaseFragment() {

@Inject
internal lateinit var accountController: AccountController
@Inject
internal lateinit var recordController: RecordController
@Inject
internal lateinit var transferController: TransferController

private lateinit var account: Account

override val contentViewId: Int = R.layout.fragment_account_operations

override fun initData() {
appComponent.inject(this@AccountOperationsFragment)
arguments?.let { arguments -> account = arguments.getParcelable(AccountOperationsFragment.KEY_ACCOUNT) }
}

override fun initViews(view: View) {
listView.adapter = RecordAdapter(activity, getRecords())
}

private fun getRecords(): List<Record> {
val accountRecords = recordController.getRecordsForAccount(account)
val accountTransfers = transferController.getTransfersForAccount(account)

accountRecords += obtainRecordsFromTransfers(accountTransfers)
accountRecords.sortByDescending { it.time }

return accountRecords
}

private fun obtainRecordsFromTransfers(transfers: List<Transfer>): List<Record> {
val records = mutableListOf<Record>()

transfers.forEach {
val type = if (it.fromAccountId == account.id) Record.TYPE_EXPENSE else Record.TYPE_INCOME
val title = constructRecordTitle(type, it)
val category = Category(getString(R.string.transfer).toLowerCase())
val price = if (type == Record.TYPE_EXPENSE) it.fromAmount else it.toAmount
val decimals = if (type == Record.TYPE_EXPENSE) it.fromDecimals else it.toDecimals

records += Record(it.id, it.time, type, title, category, price, account, account.currency, decimals)
}

return records.toList()
}

private fun constructRecordTitle(type: Int, transfer: Transfer): String {
val titlePrefix = getString(if (type == Record.TYPE_EXPENSE) R.string.to else R.string.from)
val oppositeAccountId = if (type == Record.TYPE_EXPENSE) transfer.toAccountId else transfer.fromAccountId
val oppositeAccountTitle = "$titlePrefix ${accountController.read(oppositeAccountId)?.title}"
return "${getString(R.string.transfer)} $oppositeAccountTitle".toLowerCase()
}

companion object {

private const val KEY_ACCOUNT = "key_account"

fun newInstance(account: Account): AccountOperationsFragment {
val fragment = AccountOperationsFragment()
val arguments = Bundle()
arguments.putParcelable(KEY_ACCOUNT, account)
fragment.arguments = arguments
return fragment
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.blogspot.e_kanivets.moneytracker.activity.account.edit.fragment

import android.app.Activity
import android.os.Bundle
import android.support.design.widget.FloatingActionButton
import android.view.View
import com.blogspot.e_kanivets.moneytracker.R
import com.blogspot.e_kanivets.moneytracker.R.layout
import com.blogspot.e_kanivets.moneytracker.activity.base.BaseFragment
import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController
import com.blogspot.e_kanivets.moneytracker.entity.data.Account
import kotlinx.android.synthetic.main.fragment_edit_account.*
import javax.inject.Inject

class EditAccountFragment : BaseFragment() {

@Inject
internal lateinit var accountController: AccountController

private lateinit var account: Account

override val contentViewId: Int = layout.fragment_edit_account

override fun initData() {
appComponent.inject(this@EditAccountFragment)
arguments?.let { arguments -> account = arguments.getParcelable(KEY_ACCOUNT) }
}

override fun initViews(view: View) {
etTitle.setText(account.title)
etGoal.setText(account.goal.toString())
viewColor.setBackgroundColor(account.color)

val fabDone = view.rootView.findViewById<FloatingActionButton>(R.id.fabDone)
fabDone.setOnClickListener { done() }
}

private fun done() {
val title = etTitle.text.toString().trim { it <= ' ' }

if (title.isEmpty()) {
tilTitle.error = getString(R.string.field_cant_be_empty)
} else {
val newAccount = Account(
account.id, title, account.curSum.toDouble(),
account.currency, account.goal, account.isArchived, account.color
)
val updated = accountController.update(newAccount) != null
if (updated) {
activity?.setResult(Activity.RESULT_OK)
activity?.finish()
}
}
}

companion object {

private const val KEY_ACCOUNT = "key_account"

fun newInstance(account: Account): EditAccountFragment {
val fragment = EditAccountFragment()
val arguments = Bundle()
arguments.putParcelable(KEY_ACCOUNT, account)
fragment.arguments = arguments
return fragment
}

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.blogspot.e_kanivets.moneytracker.activity.base

import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.blogspot.e_kanivets.moneytracker.MtApp
import com.blogspot.e_kanivets.moneytracker.di.AppComponent

abstract class BaseFragment : Fragment() {

protected val appComponent: AppComponent = MtApp.get().appComponent

protected abstract val contentViewId: Int

protected abstract fun initData()

protected abstract fun initViews(view: View)

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initData()
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
inflater.inflate(contentViewId, container, false)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initViews(view)
}
}
Loading