From 15724055f621cb221174761eda2b91ee755b7613 Mon Sep 17 00:00:00 2001 From: Bogdan Evtushenko Date: Wed, 17 Jul 2019 16:15:13 +0300 Subject: [PATCH 1/7] #168. Migrate ListView to RecyclerView in MainActivity. --- .../e_kanivets/moneytracker/MtApp.java | 1 - .../moneytracker/activity/ReportActivity.java | 2 +- .../activity/account/AccountsActivity.java | 44 +++-- .../account/edit/EditAccountActivity.kt | 25 ++- .../fragment/AccountOperationsFragment.kt | 7 +- .../exchange_rate/ExchangeRatesActivity.java | 11 +- .../activity/record/MainActivity.kt | 29 ++- .../moneytracker/adapter/AccountAdapter.java | 2 +- .../adapter/CategoryAutoCompleteAdapter.java | 2 +- .../adapter/ExpandableListReportAdapter.java | 4 +- .../adapter/MonthSummaryAdapter.java | 6 +- .../moneytracker/adapter/RecordAdapter.java | 116 ------------ .../moneytracker/adapter/RecordAdapter.kt | 158 ++++++++++++++++ .../report/record/RecordReportConverter.java | 4 +- .../presenter/AccountsSummaryPresenter.java | 2 +- .../ui/presenter/ShortSummaryPresenter.java | 109 +++++++++--- app/src/main/res/layout/content_main.xml | 7 +- .../main/res/layout/dialog_change_date.xml | 30 ++-- .../layout/fragment_account_operations.xml | 14 +- app/src/main/res/layout/view_account.xml | 10 +- .../main/res/layout/view_category_item.xml | 6 +- .../main/res/layout/view_month_summary.xml | 12 +- app/src/main/res/layout/view_record.xml | 168 ++++++++---------- app/src/main/res/layout/view_report_item.xml | 10 +- .../main/res/layout/view_report_item_exp.xml | 12 +- .../main/res/layout/view_summary_accounts.xml | 8 +- .../main/res/layout/view_summary_records.xml | 12 +- 27 files changed, 458 insertions(+), 353 deletions(-) delete mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordAdapter.java create mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordAdapter.kt diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/MtApp.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/MtApp.java index 522cc61..c73f3e5 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/MtApp.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/MtApp.java @@ -6,7 +6,6 @@ import com.blogspot.e_kanivets.moneytracker.di.DaggerAppComponent; import com.blogspot.e_kanivets.moneytracker.di.module.ControllerModule; import com.blogspot.e_kanivets.moneytracker.di.module.repo.CachedRepoModule; - import com.blogspot.e_kanivets.moneytracker.util.AnswersProxy; import com.crashlytics.android.Crashlytics; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.java index 3332d6a..667806e 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.java @@ -74,7 +74,7 @@ protected void initViews() { initSpinnerCurrency(); shortSummaryPresenter = new ShortSummaryPresenter(ReportActivity.this); - expandableListView.addHeaderView(shortSummaryPresenter.create(false)); + expandableListView.addHeaderView(shortSummaryPresenter.create(false, null)); } private void update(String currency) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AccountsActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AccountsActivity.java index e46f78d..fba501b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AccountsActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AccountsActivity.java @@ -22,30 +22,36 @@ import butterknife.OnItemClick; public class AccountsActivity extends BaseBackActivity { - @SuppressWarnings("unused") private static final String TAG = "AccountsActivity"; + @SuppressWarnings("unused") + private static final String TAG = "AccountsActivity"; private static final int REQUEST_ADD_ACCOUNT = 1; private static final int REQUEST_TRANSFER = 2; private static final int REQUEST_EDIT_ACCOUNT = 3; - @Inject AccountController accountController; + @Inject + AccountController accountController; private AccountsSummaryPresenter summaryPresenter; - @BindView(R.id.listView) ListView listView; + @BindView(R.id.listView) + ListView listView; - @Override protected int getContentViewId() { + @Override + protected int getContentViewId() { return R.layout.activity_accounts; } - @Override protected boolean initData() { + @Override + protected boolean initData() { boolean result = super.initData(); getAppComponent().inject(AccountsActivity.this); summaryPresenter = new AccountsSummaryPresenter(AccountsActivity.this); return result; } - @Override protected void initViews() { + @Override + protected void initViews() { super.initViews(); listView.addHeaderView(summaryPresenter.create()); @@ -54,23 +60,23 @@ public class AccountsActivity extends BaseBackActivity { update(); } - @Override public boolean onCreateOptionsMenu(Menu menu) { + @Override + public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_accounts, menu); return true; } - @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.action_transfer: - makeTransfer(); - return true; - - default: - return super.onOptionsItemSelected(item); + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == R.id.action_transfer) { + makeTransfer(); + return true; } + return super.onOptionsItemSelected(item); } - @OnItemClick(R.id.listView) public void onAccountClick(int position) { + @OnItemClick(R.id.listView) + public void onAccountClick(int position) { Account account = accountController.readAll().get(position - 1); startActivityForResult(EditAccountActivity.Companion.newIntent(this, account), REQUEST_EDIT_ACCOUNT); } @@ -80,13 +86,15 @@ public void makeTransfer() { startActivityForResult(new Intent(AccountsActivity.this, TransferActivity.class), REQUEST_TRANSFER); } - @OnClick(R.id.btn_add_account) public void addAccount() { + @OnClick(R.id.btn_add_account) + public void addAccount() { AnswersProxy.get().logButton("Add Account"); Intent intent = new Intent(AccountsActivity.this, AddAccountActivity.class); startActivityForResult(intent, REQUEST_ADD_ACCOUNT); } - @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == AppCompatActivity.RESULT_OK) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/EditAccountActivity.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/EditAccountActivity.kt index 3f10199..444a9c1 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/EditAccountActivity.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/EditAccountActivity.kt @@ -7,6 +7,7 @@ import android.content.Intent import android.support.v4.view.ViewPager.OnPageChangeListener import android.view.Menu import android.view.MenuItem +import android.view.View 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 @@ -18,6 +19,9 @@ 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 +import android.view.inputmethod.InputMethodManager +import kotlinx.android.synthetic.main.fragment_edit_account.* + class EditAccountActivity : BaseBackActivity() { @@ -55,12 +59,29 @@ class EditAccountActivity : BaseBackActivity() { override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} override fun onPageSelected(position: Int) { - if (position == 0) fabDone.show() else fabDone.hide() + if (position == 0) { + fabDone.show() + showOrHideKeyboard(true) + } else { + fabDone.hide() + showOrHideKeyboard(false) + } } - }) } + private fun showOrHideKeyboard(showKeyboard: Boolean) { + val view: View? = currentFocus + if (view != null) { + val imm = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager + if (showKeyboard) + imm.showSoftInput(etTitle, 0) + else + imm.hideSoftInputFromWindow(view.windowToken, 0) + } + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(if (account.isArchived) R.menu.menu_archived_account else R.menu.menu_account, menu) return true diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/AccountOperationsFragment.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/AccountOperationsFragment.kt index 2d189d7..faa21e8 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/AccountOperationsFragment.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/AccountOperationsFragment.kt @@ -5,6 +5,7 @@ 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.FormatController 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 @@ -23,6 +24,8 @@ class AccountOperationsFragment : BaseFragment() { internal lateinit var recordController: RecordController @Inject internal lateinit var transferController: TransferController + @Inject + internal lateinit var formatController: FormatController private lateinit var account: Account @@ -30,11 +33,11 @@ class AccountOperationsFragment : BaseFragment() { override fun initData() { appComponent.inject(this@AccountOperationsFragment) - arguments?.let { arguments -> account = arguments.getParcelable(AccountOperationsFragment.KEY_ACCOUNT) } + arguments?.let { arguments -> account = arguments.getParcelable(KEY_ACCOUNT) } } override fun initViews(view: View) { - listView.adapter = RecordAdapter(activity, getRecords()) + recyclerView.adapter = RecordAdapter(requireContext(), getRecords(), formatController, false) } private fun getRecords(): List { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/ExchangeRatesActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/ExchangeRatesActivity.java index b5d7233..2fe0853 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/ExchangeRatesActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/ExchangeRatesActivity.java @@ -107,14 +107,9 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == AppCompatActivity.RESULT_OK) { - switch (requestCode) { - case REQUEST_ADD_EXCHANGE_RATE: - update(); - setResult(RESULT_OK); - break; - - default: - break; + if (requestCode == REQUEST_ADD_EXCHANGE_RATE) { + update(); + setResult(RESULT_OK); } } } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/MainActivity.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/MainActivity.kt index 3668967..39c3257 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/MainActivity.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/MainActivity.kt @@ -2,6 +2,7 @@ package com.blogspot.e_kanivets.moneytracker.activity.record import android.content.Intent import android.support.v7.app.AppCompatActivity +import android.widget.AdapterView import android.widget.TextView import com.blogspot.e_kanivets.moneytracker.R import com.blogspot.e_kanivets.moneytracker.activity.ReportActivity @@ -18,7 +19,6 @@ import com.blogspot.e_kanivets.moneytracker.entity.Period import com.blogspot.e_kanivets.moneytracker.entity.data.Record import com.blogspot.e_kanivets.moneytracker.report.ReportMaker import com.blogspot.e_kanivets.moneytracker.ui.AppRateDialog -import com.blogspot.e_kanivets.moneytracker.ui.presenter.ShortSummaryPresenter import com.blogspot.e_kanivets.moneytracker.util.AnswersProxy import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.content_main.* @@ -28,6 +28,7 @@ class MainActivity : BaseDrawerActivity() { private lateinit var recordList: List private lateinit var period: Period + private lateinit var recordAdapter: RecordAdapter @Inject lateinit var recordController: RecordController @@ -44,8 +45,6 @@ class MainActivity : BaseDrawerActivity() { @Inject lateinit var formatController: FormatController - private lateinit var summaryPresenter: ShortSummaryPresenter - private lateinit var tvDefaultAccountTitle: TextView private lateinit var tvDefaultAccountSum: TextView private lateinit var tvCurrency: TextView @@ -57,7 +56,6 @@ class MainActivity : BaseDrawerActivity() { appComponent.inject(this) preferenceController.addLaunchCount() - summaryPresenter = ShortSummaryPresenter(this) return super.initData() } @@ -73,9 +71,12 @@ class MainActivity : BaseDrawerActivity() { tvDefaultAccountSum = navigationView.getHeaderView(0).findViewById(R.id.tvDefaultAccountSum) tvCurrency = navigationView.getHeaderView(0).findViewById(R.id.tvCurrency) - val summaryView = summaryPresenter.create(true) - listView.addHeaderView(summaryView) - summaryView.setOnClickListener { showReport() } + recordAdapter = RecordAdapter(this, listOf(), formatController, true) + recordAdapter.setOnItemClickListener(AdapterView.OnItemClickListener { _, _, position, _ -> + if (position == 0) showReport() + else editRecord(position) + }) + recyclerView.adapter = recordAdapter spinner.setPeriodSelectedListener { period -> this.period = period @@ -85,17 +86,13 @@ class MainActivity : BaseDrawerActivity() { spinner.setPeriod(periodController.readLastUsedPeriod()) - listView.setOnItemClickListener { _, _, position, _ -> - editRecord(position) - } - btnAddExpense.setOnClickListener { addExpense() } btnAddIncome.setOnClickListener { addIncome() } } private fun editRecord(position: Int) { AnswersProxy.get().logButton("Edit Record") - // Minus one because of list view's header view + val record = recordList[position - 1] startAddRecordActivity(record, AddRecordActivity.Mode.MODE_EDIT, record.type) } @@ -125,7 +122,7 @@ class MainActivity : BaseDrawerActivity() { REQUEST_ACTION_RECORD -> update() REQUEST_BACKUP -> { - appComponent.inject(this@MainActivity) + appComponent.inject(this) update() } @@ -139,13 +136,12 @@ class MainActivity : BaseDrawerActivity() { recordList = recordController.getRecordsForPeriod(period) recordList = recordList.reversed() - listView.adapter = RecordAdapter(this, recordList) - val currency = currencyController.readDefaultCurrency() val reportMaker = ReportMaker(rateController) val report = reportMaker.getRecordReport(currency, period, recordList) - summaryPresenter.update(report, currency, reportMaker.currencyNeeded(currency, recordList)) + + recordAdapter.setRecords(recordList, report, currency, reportMaker.currencyNeeded(currency, recordList)) fillDefaultAccount() } @@ -174,7 +170,6 @@ class MainActivity : BaseDrawerActivity() { } companion object { - private const val TAG = "MainActivity" private const val REQUEST_ACTION_RECORD = 6 } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/AccountAdapter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/AccountAdapter.java index a993a0b..5015d6d 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/AccountAdapter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/AccountAdapter.java @@ -101,7 +101,7 @@ public View getView(final int position, View convertView, ViewGroup parent) { } public static class ViewHolder { - @BindView(R.id.tv_title) + @BindView(R.id.tvTitle) TextView tvTitle; @BindView(R.id.tv_cur_sum) TextView tvCurSum; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/CategoryAutoCompleteAdapter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/CategoryAutoCompleteAdapter.java index d0b0e11..a7d0673 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/CategoryAutoCompleteAdapter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/CategoryAutoCompleteAdapter.java @@ -98,7 +98,7 @@ protected void publishResults(CharSequence constraint, FilterResults results) { } public static class ViewHolder { - @BindView(R.id.tv_category) + @BindView(R.id.tvCategory) TextView tvCategory; @BindView(R.id.iv_cancel) View ivCancel; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/ExpandableListReportAdapter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/ExpandableListReportAdapter.java index 2961e15..be2caaf 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/ExpandableListReportAdapter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/ExpandableListReportAdapter.java @@ -95,9 +95,9 @@ private void customizeView(View view, Map values, boolean groupV } public static class ViewHolder { - @BindView(R.id.tv_category) + @BindView(R.id.tvCategory) TextView tvCategory; - @BindView(R.id.tv_total) + @BindView(R.id.tvTotal) TextView tvTotal; public ViewHolder(View view) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/MonthSummaryAdapter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/MonthSummaryAdapter.java index a156d05..5a6f740 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/MonthSummaryAdapter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/MonthSummaryAdapter.java @@ -99,11 +99,11 @@ public View getView(int position, View convertView, ViewGroup parent) { } public static class ViewHolder { - @BindView(R.id.tv_month) + @BindView(R.id.tvMonth) TextView tvMonth; - @BindView(R.id.tv_total_income) + @BindView(R.id.tvTotalIncome) TextView tvTotalIncome; - @BindView(R.id.tv_total_expense) + @BindView(R.id.tvTotalExpense) TextView tvTotalExpense; public ViewHolder(View view) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordAdapter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordAdapter.java deleted file mode 100644 index 57fd78b..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordAdapter.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.adapter; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.TextView; - -import com.blogspot.e_kanivets.moneytracker.MtApp; -import com.blogspot.e_kanivets.moneytracker.R; -import com.blogspot.e_kanivets.moneytracker.controller.FormatController; -import com.blogspot.e_kanivets.moneytracker.entity.data.Record; - -import java.util.List; - -import javax.inject.Inject; - -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Custom adapter class for {@link Record} entity. - * Created on 01/09/14. - * - * @author Evgenii Kanivets - */ -public class RecordAdapter extends BaseAdapter { - @Inject - FormatController formatController; - - private Context context; - private List records; - - private int whiteRed; - private int whiteGreen; - private int red; - private int green; - - @SuppressWarnings("deprecation") - public RecordAdapter(Context context, List records) { - MtApp.get().getAppComponent().inject(RecordAdapter.this); - - this.context = context; - this.records = records; - - whiteRed = context.getResources().getColor(R.color.white_red); - whiteGreen = context.getResources().getColor(R.color.white_green); - red = context.getResources().getColor(R.color.red); - green = context.getResources().getColor(R.color.green); - } - - @Override - public int getCount() { - return records.size(); - } - - @Override - public Record getItem(int position) { - return records.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @SuppressLint("SetTextI18n") - @Override - public View getView(final int position, View convertView, ViewGroup parent) { - ViewHolder viewHolder; - - if (convertView == null) { - LayoutInflater layoutInflater = LayoutInflater.from(context); - - convertView = layoutInflater.inflate(R.layout.view_record, parent, false); - viewHolder = new ViewHolder(convertView); - - convertView.setTag(viewHolder); - } else viewHolder = (ViewHolder) convertView.getTag(); - - Record record = getItem(position); - viewHolder.container.setBackgroundColor(record.isIncome() ? whiteGreen : whiteRed); - viewHolder.tvPrice.setTextColor(record.isIncome() ? green : red); - - viewHolder.tvDateAndTime.setText(formatController.formatDateAndTime(record.getTime())); - viewHolder.tvPrice.setText(formatController.formatSignedAmount( - (record.isIncome() ? 1 : -1) * record.getFullPrice())); - viewHolder.tvTitle.setText(record.getTitle()); - if (record.getCategory() != null) - viewHolder.tvCategory.setText(record.getCategory().getName()); - viewHolder.tvCurrency.setText(record.getCurrency()); - - return convertView; - } - - public static class ViewHolder { - @BindView(R.id.container) - View container; - @BindView(R.id.tv_date_and_time) - TextView tvDateAndTime; - @BindView(R.id.tv_price) - TextView tvPrice; - @BindView(R.id.tv_title) - TextView tvTitle; - @BindView(R.id.tv_category) - TextView tvCategory; - @BindView(R.id.tvCurrency) - TextView tvCurrency; - - public ViewHolder(View view) { - ButterKnife.bind(this, view); - } - } -} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordAdapter.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordAdapter.kt new file mode 100644 index 0000000..de72f05 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordAdapter.kt @@ -0,0 +1,158 @@ +package com.blogspot.e_kanivets.moneytracker.adapter + +import android.content.Context +import android.support.v4.content.ContextCompat +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.LinearLayout +import android.widget.TextView +import com.blogspot.e_kanivets.moneytracker.MtApp +import com.blogspot.e_kanivets.moneytracker.R +import com.blogspot.e_kanivets.moneytracker.controller.FormatController +import com.blogspot.e_kanivets.moneytracker.entity.data.Record +import com.blogspot.e_kanivets.moneytracker.report.record.IRecordReport +import com.blogspot.e_kanivets.moneytracker.ui.presenter.ShortSummaryPresenter +import kotlinx.android.synthetic.main.view_record.view.* +import kotlinx.android.synthetic.main.view_summary_records.view.* + +class RecordAdapter : RecyclerView.Adapter { + + private var formatController: FormatController + + private var itemClickListener: AdapterView.OnItemClickListener? = null + + private var whiteRed: Int + private var whiteGreen: Int + private var red: Int + private var green: Int + + private var records: List + private var context: Context + + private var summaryPresenter: ShortSummaryPresenter + private var needHeaderView: Boolean = false + private lateinit var headerViewHolder: HeaderViewHolder + + constructor(context: Context, records: List, formatController: FormatController, needHeaderView: Boolean) { + this.context = context + this.records = records + + MtApp.get().appComponent.inject(this) + + whiteRed = ContextCompat.getColor(context, R.color.white_red) + whiteGreen = ContextCompat.getColor(context, R.color.white_green) + red = ContextCompat.getColor(context, R.color.red) + green = ContextCompat.getColor(context, R.color.green) + + summaryPresenter = ShortSummaryPresenter(context) + + if (needHeaderView) { + val summaryView = summaryPresenter.create(true, HeaderViewHolder(LayoutInflater.from(context).inflate(R.layout.view_summary_records, null))) + headerViewHolder = summaryView.tag as HeaderViewHolder + } + + this.needHeaderView = needHeaderView + this.formatController = formatController + } + + override fun getItemCount() = records.size + + override fun getItemViewType(position: Int): Int = if (position == 0 && needHeaderView) { + TYPE_HEADER + } else { + TYPE_ITEM + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder = + if (viewType == TYPE_HEADER) { + headerViewHolder + } else { + ViewHolder(LayoutInflater.from(context).inflate(R.layout.view_record, parent, false)) + } + + override fun onBindViewHolder(rvViewHolder: RecyclerView.ViewHolder, position: Int) { + if (position == 0 && needHeaderView) { + //adapter already bound to view + return + } + + val viewHolder = rvViewHolder as ViewHolder + val record: Record = records[position - if (needHeaderView) 1 else 0] + viewHolder.container.setBackgroundColor(if (record.isIncome) whiteGreen else whiteRed) + viewHolder.tvPrice.setTextColor(if (record.isIncome) green else red) + + viewHolder.tvDateAndTime.text = formatController.formatDateAndTime(record.time) + viewHolder.tvPrice.text = formatController.formatSignedAmount( + (if (record.isIncome) 1 else -1) * record.fullPrice) + viewHolder.tvTitle.text = record.title + viewHolder.tvCategory.text = record.category?.name + viewHolder.tvCurrency.text = record.currency + } + + fun setRecords(recordsList: List, report: IRecordReport?, currency: String, ratesNeeded: List) { + records = recordsList + summaryPresenter.update(report, currency, ratesNeeded) + notifyDataSetChanged() + } + + fun setOnItemClickListener(itemClickListener: AdapterView.OnItemClickListener) { + this.itemClickListener = itemClickListener + } + + inner class ViewHolder : RecyclerView.ViewHolder { + + var container: LinearLayout + var tvDateAndTime: TextView + var tvPrice: TextView + var tvTitle: TextView + var tvCategory: TextView + var tvCurrency: TextView + + constructor(view: View) : super(view) { + container = view.container + tvDateAndTime = view.tvDateAndTime + tvPrice = view.tvPrice + tvTitle = view.tvTitle + tvCategory = view.tvCategory + tvCurrency = view.tvCurrency + + view.setOnClickListener { + itemClickListener?.onItemClick(null, null, adapterPosition, 0L) + } + } + + } + + inner class HeaderViewHolder : RecyclerView.ViewHolder { + + var tvPeriod: TextView + var tvTotalIncome: TextView + var tvTotalExpense: TextView + var tvTotal: TextView + + constructor(view: View) : super(view) { + + tvPeriod = view.tvPeriod + tvTotalIncome = view.tvTotalIncome + tvTotalExpense = view.tvTotalExpense + tvTotal = view.tvTotal + + view.setOnClickListener { + itemClickListener?.onItemClick(null, null, 0, 0L) + } + + } + + } + + companion object { + + private const val TYPE_HEADER = 0 + private const val TYPE_ITEM = 1 + + } + +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReportConverter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReportConverter.java index 3f302f7..02acc31 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReportConverter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReportConverter.java @@ -54,7 +54,7 @@ public String[] getGroupFrom() { @NonNull public int[] getGroupTo() { - return new int[]{R.id.tv_category, R.id.tv_total}; + return new int[]{R.id.tvCategory, R.id.tvTotal}; } @NonNull @@ -89,7 +89,7 @@ public String[] getChildFrom() { @NonNull public int[] getChildTo() { - return new int[]{R.id.tv_category, R.id.tv_total}; + return new int[]{R.id.tvCategory, R.id.tvTotal}; } private String getTitle(@NonNull SummaryRecord record) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/presenter/AccountsSummaryPresenter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/presenter/AccountsSummaryPresenter.java index a28675f..9417fe5 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/presenter/AccountsSummaryPresenter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/presenter/AccountsSummaryPresenter.java @@ -118,7 +118,7 @@ public void update() { public static class ViewHolder { @BindView(R.id.spinner_currency) AppCompatSpinner spinnerCurrency; - @BindView(R.id.tv_total) + @BindView(R.id.tvTotal) TextView tvTotal; @BindView(R.id.tvCurrency) TextView tvCurrency; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/presenter/ShortSummaryPresenter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/presenter/ShortSummaryPresenter.java index e93d86d..4ecb323 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/presenter/ShortSummaryPresenter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/presenter/ShortSummaryPresenter.java @@ -1,12 +1,14 @@ package com.blogspot.e_kanivets.moneytracker.ui.presenter; import android.content.Context; +import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; import com.blogspot.e_kanivets.moneytracker.MtApp; import com.blogspot.e_kanivets.moneytracker.R; +import com.blogspot.e_kanivets.moneytracker.adapter.RecordAdapter; import com.blogspot.e_kanivets.moneytracker.controller.FormatController; import com.blogspot.e_kanivets.moneytracker.entity.Period; import com.blogspot.e_kanivets.moneytracker.report.record.IRecordReport; @@ -20,6 +22,8 @@ import butterknife.BindView; import butterknife.ButterKnife; +import static android.icu.lang.UCharacter.GraphemeClusterBreak.T; + /** * Util class to create and manage summary header view for . * Created on 2/26/16. @@ -45,40 +49,67 @@ public ShortSummaryPresenter(Context context) { green = context.getResources().getColor(R.color.green); } - public View create(boolean shortSummary) { + public View create(boolean shortSummary, RecordAdapter.HeaderViewHolder mainViewHolder) { view = layoutInflater.inflate(R.layout.view_summary_records, null); view.findViewById(R.id.iv_more).setVisibility(shortSummary ? View.VISIBLE : View.INVISIBLE); - ViewHolder viewHolder = new ViewHolder(view); - view.setTag(viewHolder); + if (mainViewHolder == null) + view.setTag(new ViewHolder(view)); + else + view.setTag(mainViewHolder); return view; } public void update(IRecordReport report, String currency, List ratesNeeded) { - ViewHolder viewHolder = (ViewHolder) view.getTag(); - - if (report == null) { - viewHolder.tvTotalIncome.setText(""); - viewHolder.tvTotalExpense.setText(""); - - viewHolder.tvTotal.setTextColor(red); - viewHolder.tvTotal.setText(createRatesNeededList(currency, ratesNeeded)); + if (view.getTag() instanceof RecordAdapter.HeaderViewHolder) { + RecordAdapter.HeaderViewHolder viewHolder = (RecordAdapter.HeaderViewHolder) view.getTag(); + if (report == null) { + viewHolder.getTvTotalIncome().setText(""); + viewHolder.getTvTotalExpense().setText(""); + + viewHolder.getTvTotal().setTextColor(red); + viewHolder.getTvTotal().setText(createRatesNeededList(currency, ratesNeeded)); + } else { + viewHolder.getTvPeriod().setText(formatPeriod(report.getPeriod())); + + viewHolder.getTvTotalIncome().setTextColor(report.getTotalIncome() >= 0 ? green : red); + viewHolder.getTvTotalIncome().setText(formatController.formatIncome(report.getTotalIncome(), + report.getCurrency())); + + viewHolder.getTvTotalExpense().setTextColor(report.getTotalExpense() > 0 ? green : red); + viewHolder.getTvTotalExpense().setText(formatController.formatExpense(report.getTotalExpense(), + report.getCurrency())); + + viewHolder.getTvTotal().setTextColor(report.getTotal() >= 0 ? green : red); + viewHolder.getTvTotal().setText(formatController.formatIncome(report.getTotal(), + report.getCurrency())); + } } else { - viewHolder.tvPeriod.setText(formatPeriod(report.getPeriod())); - - viewHolder.tvTotalIncome.setTextColor(report.getTotalIncome() >= 0 ? green : red); - viewHolder.tvTotalIncome.setText(formatController.formatIncome(report.getTotalIncome(), - report.getCurrency())); - - viewHolder.tvTotalExpense.setTextColor(report.getTotalExpense() > 0 ? green : red); - viewHolder.tvTotalExpense.setText(formatController.formatExpense(report.getTotalExpense(), - report.getCurrency())); - - viewHolder.tvTotal.setTextColor(report.getTotal() >= 0 ? green : red); - viewHolder.tvTotal.setText(formatController.formatIncome(report.getTotal(), - report.getCurrency())); + ViewHolder viewHolder = (ViewHolder) view.getTag(); + if (report == null) { + viewHolder.getTvTotalIncome().setText(""); + viewHolder.getTvTotalExpense().setText(""); + + viewHolder.getTvTotal().setTextColor(red); + viewHolder.getTvTotal().setText(createRatesNeededList(currency, ratesNeeded)); + } else { + viewHolder.getTvPeriod().setText(formatPeriod(report.getPeriod())); + + viewHolder.getTvTotalIncome().setTextColor(report.getTotalIncome() >= 0 ? green : red); + viewHolder.getTvTotalIncome().setText(formatController.formatIncome(report.getTotalIncome(), + report.getCurrency())); + + viewHolder.getTvTotalExpense().setTextColor(report.getTotalExpense() > 0 ? green : red); + viewHolder.getTvTotalExpense().setText(formatController.formatExpense(report.getTotalExpense(), + report.getCurrency())); + + viewHolder.getTvTotal().setTextColor(report.getTotal() >= 0 ? green : red); + viewHolder.getTvTotal().setText(formatController.formatIncome(report.getTotal(), + report.getCurrency())); + } } + } private String formatPeriod(Period period) { @@ -102,17 +133,37 @@ private String formatPeriod(Period period) { } public static class ViewHolder { - @BindView(R.id.tv_period) + + @BindView(R.id.tvPeriod) TextView tvPeriod; - @BindView(R.id.tv_total_income) + + public TextView getTvPeriod() { + return tvPeriod; + } + + @BindView(R.id.tvTotalIncome) TextView tvTotalIncome; - @BindView(R.id.tv_total_expense) + + public TextView getTvTotalIncome() { + return tvTotalIncome; + } + + @BindView(R.id.tvTotalExpense) TextView tvTotalExpense; - @BindView(R.id.tv_total) + + public TextView getTvTotalExpense() { + return tvTotalExpense; + } + + @BindView(R.id.tvTotal) TextView tvTotal; + public TextView getTvTotal() { + return tvTotal; + } + public ViewHolder(View view) { ButterKnife.bind(this, view); } } -} +} \ No newline at end of file diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml index a84fb9e..337223d 100644 --- a/app/src/main/res/layout/content_main.xml +++ b/app/src/main/res/layout/content_main.xml @@ -7,14 +7,15 @@ app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:showIn="@layout/activity_main"> - + android:drawSelectorOnTop="true" + app:layoutManager="android.support.v7.widget.LinearLayoutManager" /> + android:orientation="vertical"> + android:text="@string/change_date" + android:textAppearance="?android:attr/textAppearanceLarge" + android:textColor="@color/white" /> + android:layout_height="fill_parent" + android:orientation="horizontal">