diff --git a/app/build.gradle b/app/build.gradle index b3a139d..d418be2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,20 +1,21 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' android { - compileSdkVersion 31 - buildToolsVersion '30.0.3' + namespace = "com.blogspot.e_kanivets.moneytracker" + + compileSdkVersion 34 defaultConfig { applicationId 'com.blogspot.e_kanivets.moneytracker' minSdkVersion 21 - targetSdkVersion 31 + targetSdkVersion 34 - versionCode 37 - versionName '2.1.5' + versionCode 38 + versionName '2.2.0' } + signingConfigs { releaseConfig { storeFile file('mt_keystore.jks') @@ -23,6 +24,7 @@ android { keyPassword 'moneytracker' } } + buildTypes { release { debuggable false @@ -47,19 +49,19 @@ android { } } - lintOptions { - checkReleaseBuilds false + lint { abortOnError false - } - dexOptions { - preDexLibraries = false - } - productFlavors { + checkReleaseBuilds false } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 + } + + buildFeatures { + viewBinding true + buildConfig true } } @@ -67,9 +69,7 @@ dependencies { implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'com.google.android.material:material:1.4.0' - implementation 'com.jakewharton:butterknife:10.2.3' // View annotation bindings - annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3' // ButterKnife compiler - implementation 'com.google.dagger:dagger:2.35.1' // Dependency injection tool + implementation 'com.google.dagger:dagger:2.51.1' // Dependency injection tool implementation 'com.github.PhilJay:MPAndroidChart:v2.2.4' // Charts implementation 'com.jakewharton.timber:timber:4.7.1' // Advanced logging tool implementation 'androidx.constraintlayout:constraintlayout:2.1.1' @@ -80,7 +80,7 @@ dependencies { androidTestImplementation 'com.crittercism.dexmaker:dexmaker:1.4' androidTestImplementation 'com.crittercism.dexmaker:dexmaker-dx:1.4' androidTestImplementation 'com.crittercism.dexmaker:dexmaker-mockito:1.4' - annotationProcessor 'com.google.dagger:dagger-compiler:2.35.1' + annotationProcessor 'com.google.dagger:dagger-compiler:2.51.1' compileOnly 'org.glassfish:javax.annotation:10.0-b28' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.cardview:cardview:1.0.0' diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.java deleted file mode 100644 index 59c0960..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.activity; - -import android.text.method.LinkMovementMethod; -import android.widget.TextView; - -import com.blogspot.e_kanivets.moneytracker.R; -import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity; - -import butterknife.BindView; - -public class AboutActivity extends BaseBackActivity { - @BindView(R.id.tv_about) - TextView tvAbout; - - @Override - protected int getContentViewId() { - return R.layout.activity_about; - } - - @Override - protected void initViews() { - super.initViews(); - tvAbout.setMovementMethod(LinkMovementMethod.getInstance()); - } -} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.kt new file mode 100644 index 0000000..882d958 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.kt @@ -0,0 +1,25 @@ +package com.blogspot.e_kanivets.moneytracker.activity + +import android.text.method.LinkMovementMethod +import android.os.Bundle +import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityAboutBinding + +class AboutActivity : BaseBackActivity() { + + private lateinit var binding: ActivityAboutBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + binding = ActivityAboutBinding.inflate(layoutInflater) + setContentView(binding.root) + + initToolbar() + initViews() + } + + private fun initViews() { + binding.tvAbout.movementMethod = LinkMovementMethod.getInstance() + } +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.kt index a8cc845..1aafc71 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.kt @@ -1,5 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.activity +import android.os.Bundle import android.view.View import android.widget.AdapterView import android.widget.ArrayAdapter @@ -11,13 +12,13 @@ import com.blogspot.e_kanivets.moneytracker.controller.CurrencyController import com.blogspot.e_kanivets.moneytracker.controller.FormatController import com.blogspot.e_kanivets.moneytracker.controller.data.ExchangeRateController import com.blogspot.e_kanivets.moneytracker.controller.data.RecordController +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityReportBinding import com.blogspot.e_kanivets.moneytracker.entity.Period import com.blogspot.e_kanivets.moneytracker.entity.RecordReportItem import com.blogspot.e_kanivets.moneytracker.entity.data.Record import com.blogspot.e_kanivets.moneytracker.report.ReportMaker import com.blogspot.e_kanivets.moneytracker.report.record.IRecordReport import com.blogspot.e_kanivets.moneytracker.ui.presenter.ShortSummaryPresenter -import kotlinx.android.synthetic.main.activity_report.* import java.util.* import javax.inject.Inject @@ -37,10 +38,20 @@ class ReportActivity : BaseBackActivity() { private lateinit var shortSummaryPresenter: ShortSummaryPresenter - override fun getContentViewId() = R.layout.activity_report + private lateinit var binding: ActivityReportBinding - override fun initData(): Boolean { - super.initData() + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + binding = ActivityReportBinding.inflate(layoutInflater) + setContentView(binding.root) + + initData() + initToolbar() + initViews() + } + + private fun initData(): Boolean { appComponent.inject(this) period = intent.getParcelableExtra(KEY_PERIOD) @@ -54,13 +65,11 @@ class ReportActivity : BaseBackActivity() { return true } - override fun initViews() { - super.initViews() - + private fun initViews() { initSpinnerCurrency() adapter.setSummaryView(shortSummaryPresenter.create(false, null)) - recyclerView.adapter = adapter + binding.recyclerView.adapter = adapter } private fun update(currency: String) { @@ -74,17 +83,17 @@ class ReportActivity : BaseBackActivity() { private fun initSpinnerCurrency() { val currencyList = currencyController.readAll() - spinnerCurrency.adapter = ArrayAdapter(this, R.layout.view_spinner_item, currencyList) - spinnerCurrency.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + binding.spinnerCurrency.adapter = ArrayAdapter(this, R.layout.view_spinner_item, currencyList) + binding.spinnerCurrency.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) = - update(spinnerCurrency.selectedItem.toString()) + update(binding.spinnerCurrency.selectedItem.toString()) override fun onNothingSelected(p0: AdapterView<*>?) {} } val currency = currencyController.readDefaultCurrency() - spinnerCurrency.setSelection(currencyList.indexOf(currency)) + binding.spinnerCurrency.setSelection(currencyList.indexOf(currency)) } class RecordReportConverter { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/SettingsActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/SettingsActivity.java deleted file mode 100644 index ee71bfc..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/SettingsActivity.java +++ /dev/null @@ -1,166 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.activity; - -import android.os.Build; -import android.os.Bundle; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.PreferenceFragment; - -import com.blogspot.e_kanivets.moneytracker.BuildConfig; -import com.blogspot.e_kanivets.moneytracker.MtApp; -import com.blogspot.e_kanivets.moneytracker.R; -import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity; -import com.blogspot.e_kanivets.moneytracker.controller.FormatController; -import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController; -import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController; -import com.blogspot.e_kanivets.moneytracker.controller.CurrencyController; -import com.blogspot.e_kanivets.moneytracker.entity.data.Account; - -import java.util.ArrayList; -import java.util.List; - -import javax.inject.Inject; - -public class SettingsActivity extends BaseBackActivity { - @SuppressWarnings("unused") private static final String TAG = "SettingsActivity"; - - @Override protected int getContentViewId() { - return R.layout.activity_settings; - } - - @Override protected void initViews() { - super.initViews(); - - // Display the fragment as the main content. - getFragmentManager().beginTransaction().replace(R.id.contentView, new SettingsFragment()).commit(); - } - - public static class SettingsFragment extends PreferenceFragment { - @Inject AccountController accountController; - @Inject CurrencyController currencyController; - @Inject PreferenceController preferenceController; - - @Override public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - MtApp.get().getAppComponent().inject(SettingsFragment.this); - - // Load the preferences from an XML resource - addPreferencesFromResource(R.xml.preferences); - - setupDefaultAccountPref(); - setupDefaultCurrencyPref(); - setupNonSubstitutionCurrencyPref(); - setupDisplayPrecision(); - setupAboutPref(); - } - - private void setupDefaultAccountPref() { - ListPreference defaultAccountPref = - (ListPreference) findPreference(getString(R.string.pref_default_account)); - defaultAccountPref.setOnPreferenceChangeListener(preferenceChangeListener); - - List accountList = accountController.readActiveAccounts(); - defaultAccountPref.setEntries(getEntries(accountList)); - defaultAccountPref.setEntryValues(getEntryValues(accountList)); - - Account defaultAccount = accountController.readDefaultAccount(); - if (defaultAccount == null) { - defaultAccountPref.setDefaultValue(""); - defaultAccountPref.setSummary(""); - } else { - defaultAccountPref.setDefaultValue(defaultAccount.getTitle()); - defaultAccountPref.setSummary(defaultAccount.getTitle()); - } - } - - @SuppressWarnings("ToArrayCallWithZeroLengthArrayArgument") private void setupDefaultCurrencyPref() { - ListPreference defaultCurrencyPref = - (ListPreference) findPreference(getString(R.string.pref_default_currency)); - defaultCurrencyPref.setOnPreferenceChangeListener(preferenceChangeListener); - - List currencyList = currencyController.readAll(); - defaultCurrencyPref.setEntries(currencyList.toArray(new String[0])); - defaultCurrencyPref.setEntryValues(currencyList.toArray(new String[0])); - - String defaultCurrency = currencyController.readDefaultCurrency(); - defaultCurrencyPref.setDefaultValue(defaultCurrency); - defaultCurrencyPref.setSummary(defaultCurrency); - } - - @SuppressWarnings("ToArrayCallWithZeroLengthArrayArgument") private void setupNonSubstitutionCurrencyPref() { - ListPreference nonSubstitutionCurrencyPref = - (ListPreference) findPreference(getString(R.string.pref_non_substitution_currency)); - nonSubstitutionCurrencyPref.setOnPreferenceChangeListener(preferenceChangeListener); - - List currencyList = currencyController.readAll(); - nonSubstitutionCurrencyPref.setEntries(currencyList.toArray(new String[0])); - nonSubstitutionCurrencyPref.setEntryValues(currencyList.toArray(new String[0])); - - String nonSubstitutionCurrency = preferenceController.readNonSubstitutionCurrency(); - nonSubstitutionCurrencyPref.setDefaultValue(nonSubstitutionCurrency); - nonSubstitutionCurrencyPref.setSummary(nonSubstitutionCurrency); - } - - @SuppressWarnings("ToArrayCallWithZeroLengthArrayArgument") private void setupDisplayPrecision() { - ListPreference displayPrecisionPref = - (ListPreference) findPreference(getString(R.string.pref_display_precision)); - displayPrecisionPref.setOnPreferenceChangeListener(preferenceChangeListener); - - List precisionListValues = new ArrayList<>(); - precisionListValues.add(FormatController.PRECISION_MATH); - precisionListValues.add(FormatController.PRECISION_INT); - precisionListValues.add(FormatController.PRECISION_NONE); - displayPrecisionPref.setEntryValues(precisionListValues.toArray(new String[0])); - - List precisionList = new ArrayList<>(); - precisionList.add(getString(R.string.precision_math)); - precisionList.add(getString(R.string.precision_int)); - precisionList.add(getString(R.string.precision_none)); - displayPrecisionPref.setEntries(precisionList.toArray(new String[0])); - - if (FormatController.PRECISION_MATH.equals(preferenceController.readDisplayPrecision())) { - displayPrecisionPref.setDefaultValue(getString(R.string.precision_math)); - displayPrecisionPref.setSummary(getString(R.string.precision_math)); - } - } - - private void setupAboutPref() { - Preference preference = findPreference(getString(R.string.pref_about)); - preference.setSummary(getString(R.string.about_summary, BuildConfig.VERSION_NAME, Build.VERSION.RELEASE)); - } - - @SuppressWarnings("ToArrayCallWithZeroLengthArrayArgument") - private String[] getEntries(List accountList) { - List result = new ArrayList<>(); - - for (Account account : accountList) { - result.add(account.getTitle()); - } - - return result.toArray(new String[0]); - } - - @SuppressWarnings("ToArrayCallWithZeroLengthArrayArgument") - private String[] getEntryValues(List accountList) { - List result = new ArrayList<>(); - - for (Account account : accountList) { - result.add(Long.toString(account.getId())); - } - - return result.toArray(new String[0]); - } - - private Preference.OnPreferenceChangeListener preferenceChangeListener = - new Preference.OnPreferenceChangeListener() { - @Override public boolean onPreferenceChange(Preference preference, Object newValue) { - // Previously we could set summary to default value, - // but now it's needed to display selected entry - preference.setSummary("%s"); - getActivity().setResult(RESULT_OK); - return true; - } - }; - } -} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/SettingsActivity.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/SettingsActivity.kt new file mode 100644 index 0000000..7e9ca5c --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/SettingsActivity.kt @@ -0,0 +1,177 @@ +package com.blogspot.e_kanivets.moneytracker.activity + +import android.os.Build +import android.os.Bundle +import android.preference.ListPreference +import android.preference.Preference.OnPreferenceChangeListener +import android.preference.PreferenceFragment +import com.blogspot.e_kanivets.moneytracker.BuildConfig +import com.blogspot.e_kanivets.moneytracker.MtApp +import com.blogspot.e_kanivets.moneytracker.R +import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity +import com.blogspot.e_kanivets.moneytracker.controller.CurrencyController +import com.blogspot.e_kanivets.moneytracker.controller.FormatController +import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController +import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController +import com.blogspot.e_kanivets.moneytracker.databinding.ActivitySettingsBinding +import com.blogspot.e_kanivets.moneytracker.entity.data.Account +import javax.inject.Inject + +class SettingsActivity : BaseBackActivity() { + + private lateinit var binding: ActivitySettingsBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + binding = ActivitySettingsBinding.inflate(layoutInflater) + setContentView(binding.root) + + initToolbar() + initViews() + } + + private fun initViews() { + // Display the fragment as the main content. + fragmentManager.beginTransaction().replace(binding.contentView.id, SettingsFragment()).commit() + } + + class SettingsFragment : PreferenceFragment() { + + @JvmField @Inject + var accountController: AccountController? = null + + @JvmField @Inject + var currencyController: CurrencyController? = null + + @JvmField @Inject + var preferenceController: PreferenceController? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + MtApp.get().appComponent.inject(this@SettingsFragment) + + // Load the preferences from an XML resource + addPreferencesFromResource(R.xml.preferences) + + setupDefaultAccountPref() + setupDefaultCurrencyPref() + setupNonSubstitutionCurrencyPref() + setupDisplayPrecision() + setupAboutPref() + } + + private fun setupDefaultAccountPref() { + val defaultAccountPref = + findPreference(getString(R.string.pref_default_account)) as ListPreference + defaultAccountPref.onPreferenceChangeListener = preferenceChangeListener + + val accountList = accountController!!.readActiveAccounts() + defaultAccountPref.entries = getEntries(accountList) + defaultAccountPref.entryValues = getEntryValues(accountList) + + val defaultAccount = accountController!!.readDefaultAccount() + if (defaultAccount == null) { + defaultAccountPref.setDefaultValue("") + defaultAccountPref.summary = "" + } else { + defaultAccountPref.setDefaultValue(defaultAccount.title) + defaultAccountPref.summary = defaultAccount.title + } + } + + private fun setupDefaultCurrencyPref() { + val defaultCurrencyPref = + findPreference(getString(R.string.pref_default_currency)) as ListPreference + defaultCurrencyPref.onPreferenceChangeListener = preferenceChangeListener + + val currencyList = currencyController!!.readAll() + defaultCurrencyPref.entries = currencyList.toTypedArray() + defaultCurrencyPref.entryValues = currencyList.toTypedArray() + + val defaultCurrency = currencyController!!.readDefaultCurrency() + defaultCurrencyPref.setDefaultValue(defaultCurrency) + defaultCurrencyPref.summary = defaultCurrency + } + + private fun setupNonSubstitutionCurrencyPref() { + val nonSubstitutionCurrencyPref = + findPreference(getString(R.string.pref_non_substitution_currency)) as ListPreference + nonSubstitutionCurrencyPref.onPreferenceChangeListener = preferenceChangeListener + + val currencyList = currencyController!!.readAll() + nonSubstitutionCurrencyPref.entries = currencyList.toTypedArray() + nonSubstitutionCurrencyPref.entryValues = currencyList.toTypedArray() + + val nonSubstitutionCurrency = preferenceController!!.readNonSubstitutionCurrency() + nonSubstitutionCurrencyPref.setDefaultValue(nonSubstitutionCurrency) + nonSubstitutionCurrencyPref.summary = nonSubstitutionCurrency + } + + private fun setupDisplayPrecision() { + val displayPrecisionPref = + findPreference(getString(R.string.pref_display_precision)) as ListPreference + displayPrecisionPref.onPreferenceChangeListener = preferenceChangeListener + + val precisionListValues: MutableList = ArrayList() + precisionListValues.add(FormatController.PRECISION_MATH) + precisionListValues.add(FormatController.PRECISION_INT) + precisionListValues.add(FormatController.PRECISION_NONE) + displayPrecisionPref.entryValues = precisionListValues.toTypedArray() + + val precisionList: MutableList = ArrayList() + precisionList.add(getString(R.string.precision_math)) + precisionList.add(getString(R.string.precision_int)) + precisionList.add(getString(R.string.precision_none)) + displayPrecisionPref.entries = precisionList.toTypedArray() + + if (FormatController.PRECISION_MATH == preferenceController!!.readDisplayPrecision()) { + displayPrecisionPref.setDefaultValue(getString(R.string.precision_math)) + displayPrecisionPref.summary = getString(R.string.precision_math) + } + } + + private fun setupAboutPref() { + val preference = findPreference(getString(R.string.pref_about)) + preference.summary = getString( + R.string.about_summary, + BuildConfig.VERSION_NAME, + Build.VERSION.RELEASE + ) + } + + private fun getEntries(accountList: List): Array { + val result: MutableList = ArrayList() + + for (account in accountList) { + result.add(account.title) + } + + return result.toTypedArray() + } + + private fun getEntryValues(accountList: List): Array { + val result: MutableList = ArrayList() + + for (account in accountList) { + result.add(account.id.toString()) + } + + return result.toTypedArray() + } + + private val preferenceChangeListener = + OnPreferenceChangeListener { preference, newValue -> // Previously we could set summary to default value, + // but now it's needed to display selected entry + preference.summary = "%s" + activity.setResult(RESULT_OK) + true + } + } + + companion object { + @Suppress("unused") + private const val TAG = "SettingsActivity" + } +} 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 bc1b08c..b76b89f 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 @@ -1,26 +1,26 @@ package com.blogspot.e_kanivets.moneytracker.activity.account; import android.content.Intent; + +import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; + +import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; -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; +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityAccountsBinding; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; import com.blogspot.e_kanivets.moneytracker.ui.presenter.AccountsSummaryPresenter; import com.blogspot.e_kanivets.moneytracker.util.CrashlyticsProxy; import javax.inject.Inject; -import butterknife.BindView; -import butterknife.OnClick; -import butterknife.OnItemClick; - public class AccountsActivity extends BaseBackActivity { @SuppressWarnings("unused") private static final String TAG = "AccountsActivity"; @@ -34,29 +34,32 @@ public class AccountsActivity extends BaseBackActivity { private AccountsSummaryPresenter summaryPresenter; - @BindView(R.id.listView) - ListView listView; + private ActivityAccountsBinding binding; @Override - protected int getContentViewId() { - return R.layout.activity_accounts; + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = ActivityAccountsBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + initData(); + initToolbar(); + initViews(); } - @Override - protected boolean initData() { - boolean result = super.initData(); + private boolean initData() { getAppComponent().inject(AccountsActivity.this); summaryPresenter = new AccountsSummaryPresenter(AccountsActivity.this); - return result; + return true; } - @Override - protected void initViews() { - super.initViews(); - - listView.addHeaderView(summaryPresenter.create()); + private void initViews() { + binding.listView.addHeaderView(summaryPresenter.create()); + binding.listView.setOnItemClickListener((adapterView, view, i, l) -> onAccountClick(i)); + binding.btnAddAccount.setOnClickListener(view -> addAccount()); - registerForContextMenu(listView); + registerForContextMenu(binding.listView); update(); } @@ -75,7 +78,6 @@ public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } - @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); @@ -86,7 +88,6 @@ public void makeTransfer() { startActivityForResult(new Intent(AccountsActivity.this, TransferActivity.class), REQUEST_TRANSFER); } - @OnClick(R.id.btn_add_account) public void addAccount() { CrashlyticsProxy.get().logButton("Add Account"); Intent intent = new Intent(AccountsActivity.this, AddAccountActivity.class); @@ -117,7 +118,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { } private void update() { - listView.setAdapter(new AccountAdapter(AccountsActivity.this, accountController.readAll())); + binding.listView.setAdapter(new AccountAdapter(AccountsActivity.this, accountController.readAll())); summaryPresenter.update(); } } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AddAccountActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AddAccountActivity.java index e30836b..bbede12 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AddAccountActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AddAccountActivity.java @@ -1,16 +1,17 @@ package com.blogspot.e_kanivets.moneytracker.activity.account; -import androidx.appcompat.widget.AppCompatSpinner; +import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; -import android.view.View; import android.widget.ArrayAdapter; -import android.widget.EditText; + +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity; import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController; import com.blogspot.e_kanivets.moneytracker.controller.CurrencyController; +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityAddAccountBinding; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; import com.blogspot.e_kanivets.moneytracker.util.CrashlyticsProxy; import com.blogspot.e_kanivets.moneytracker.util.validator.AccountValidator; @@ -20,8 +21,6 @@ import javax.inject.Inject; -import butterknife.BindView; - public class AddAccountActivity extends BaseBackActivity { @SuppressWarnings("unused") private static final String TAG = "AddAccountActivity"; @@ -33,33 +32,28 @@ public class AddAccountActivity extends BaseBackActivity { private IValidator accountValidator; - @BindView(R.id.contentView) - View contentView; - @BindView(R.id.etTitle) - EditText etTitle; - @BindView(R.id.et_init_sum) - EditText etInitSum; - @BindView(R.id.spinner) - AppCompatSpinner spinner; + private ActivityAddAccountBinding binding; @Override - protected int getContentViewId() { - return R.layout.activity_add_account; + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = ActivityAddAccountBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + initData(); + initToolbar(); + initViews(); } - @Override - protected boolean initData() { - boolean result = super.initData(); + private boolean initData() { getAppComponent().inject(AddAccountActivity.this); - return result; + return true; } - @Override - protected void initViews() { - super.initViews(); - - accountValidator = new AccountValidator(AddAccountActivity.this, contentView); - spinner.setAdapter(new ArrayAdapter<>(AddAccountActivity.this, + private void initViews() { + accountValidator = new AccountValidator(AddAccountActivity.this, binding); + binding.spinner.setAdapter(new ArrayAdapter<>(AddAccountActivity.this, R.layout.view_spinner_item, new ArrayList<>(currencyController.readAll()))); } @@ -72,14 +66,11 @@ public boolean onCreateOptionsMenu(Menu menu) { @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.action_done: - tryAddAccount(); - return true; - - default: - return super.onOptionsItemSelected(item); + if (item.getItemId() == R.id.action_done) { + tryAddAccount(); + return true; } + return super.onOptionsItemSelected(item); } private void tryAddAccount() { @@ -94,9 +85,9 @@ private void tryAddAccount() { @SuppressWarnings("SimplifiableIfStatement") private boolean addAccount() { if (accountValidator.validate()) { - String title = etTitle.getText().toString().trim(); - double initSum = Double.parseDouble(etInitSum.getText().toString().trim()); - String currency = (String) spinner.getSelectedItem(); + String title = binding.etTitle.getText().toString().trim(); + double initSum = Double.parseDouble(binding.etInitSum.getText().toString().trim()); + String currency = (String) binding.spinner.getSelectedItem(); double goal = 0; int color = 0; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/TransferActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/TransferActivity.java index 9ee11f9..6e60e43 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/TransferActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/TransferActivity.java @@ -1,16 +1,17 @@ package com.blogspot.e_kanivets.moneytracker.activity.account; -import androidx.appcompat.widget.AppCompatSpinner; +import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; -import android.view.View; import android.widget.ArrayAdapter; -import android.widget.EditText; + +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity; import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController; import com.blogspot.e_kanivets.moneytracker.controller.data.TransferController; +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityTransferBinding; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; import com.blogspot.e_kanivets.moneytracker.entity.data.Transfer; import com.blogspot.e_kanivets.moneytracker.util.CrashlyticsProxy; @@ -22,8 +23,6 @@ import javax.inject.Inject; -import butterknife.BindView; - public class TransferActivity extends BaseBackActivity { @SuppressWarnings("unused") private static final String TAG = "TransferActivity"; @@ -37,51 +36,44 @@ public class TransferActivity extends BaseBackActivity { private List accountList; - @BindView(R.id.contentView) - View contentView; - @BindView(R.id.spinner_from) - AppCompatSpinner spinnerFrom; - @BindView(R.id.spinner_to) - AppCompatSpinner spinnerTo; - @BindView(R.id.et_from_amount) - EditText etFromAmount; - @BindView(R.id.et_to_amount) - EditText etToAmount; + private ActivityTransferBinding binding; @Override - protected int getContentViewId() { - return R.layout.activity_transfer; + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = ActivityTransferBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + initData(); + initToolbar(); + initViews(); } - @Override - protected boolean initData() { - boolean result = super.initData(); + private boolean initData() { getAppComponent().inject(TransferActivity.this); accountList = accountController.readActiveAccounts(); - return result; + return true; } - @Override - protected void initViews() { - super.initViews(); - + private void initViews() { List accounts = new ArrayList<>(); for (Account account : accountList) { accounts.add(account.getTitle()); } - transferValidator = new TransferValidator(TransferActivity.this, contentView); + transferValidator = new TransferValidator(TransferActivity.this, binding); if (accounts.size() == 0) { accounts.add(getString(R.string.none)); - spinnerFrom.setEnabled(false); - spinnerTo.setEnabled(false); + binding.spinnerFrom.setEnabled(false); + binding.spinnerTo.setEnabled(false); } - spinnerFrom.setAdapter(new ArrayAdapter<>(TransferActivity.this, + binding.spinnerFrom.setAdapter(new ArrayAdapter<>(TransferActivity.this, R.layout.view_spinner_item, accounts)); - spinnerTo.setAdapter(new ArrayAdapter<>(TransferActivity.this, + binding.spinnerTo.setAdapter(new ArrayAdapter<>(TransferActivity.this, R.layout.view_spinner_item, accounts)); } @@ -93,14 +85,11 @@ public boolean onCreateOptionsMenu(Menu menu) { @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.action_done: - tryTransfer(); - return true; - - default: - return super.onOptionsItemSelected(item); + if (item.getItemId() == R.id.action_done) { + tryTransfer(); + return true; } + return super.onOptionsItemSelected(item); } private void tryTransfer() { @@ -115,10 +104,10 @@ private void tryTransfer() { @SuppressWarnings("SimplifiableIfStatement") private boolean doTransfer() { if (transferValidator.validate()) { - Account fromAccount = accountList.get(spinnerFrom.getSelectedItemPosition()); - Account toAccount = accountList.get(spinnerTo.getSelectedItemPosition()); - double fromAmount = Double.parseDouble(etFromAmount.getText().toString()); - double toAmount = Double.parseDouble(etToAmount.getText().toString()); + Account fromAccount = accountList.get(binding.spinnerFrom.getSelectedItemPosition()); + Account toAccount = accountList.get(binding.spinnerTo.getSelectedItemPosition()); + double fromAmount = Double.parseDouble(binding.etFromAmount.getText().toString()); + double toAmount = Double.parseDouble(binding.etToAmount.getText().toString()); return transferController.create(new Transfer(System.currentTimeMillis(), fromAccount.getId(), toAccount.getId(), fromAmount, toAmount)) != null; 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 7168d97..fc472f4 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 @@ -4,10 +4,12 @@ import android.app.Activity import android.app.AlertDialog import android.content.Context import android.content.Intent +import android.os.Bundle import androidx.viewpager.widget.ViewPager.OnPageChangeListener import android.view.Menu import android.view.MenuItem import android.view.View +import android.view.inputmethod.InputMethodManager 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 @@ -15,12 +17,8 @@ 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.fabDone -import kotlinx.android.synthetic.main.activity_edit_account.tabLayout -import kotlinx.android.synthetic.main.activity_edit_account.viewPager +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityEditAccountBinding import javax.inject.Inject -import android.view.inputmethod.InputMethodManager -import kotlinx.android.synthetic.main.fragment_edit_account.* class EditAccountActivity : BaseBackActivity() { @@ -28,41 +26,49 @@ class EditAccountActivity : BaseBackActivity() { internal lateinit var accountController: AccountController private lateinit var account: Account + private lateinit var binding: ActivityEditAccountBinding - override fun getContentViewId(): Int = R.layout.activity_edit_account + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) - override fun initData(): Boolean { + binding = ActivityEditAccountBinding.inflate(layoutInflater) + setContentView(binding.root) + + initData() + initToolbar() + initViews() + } + + private fun initData(): Boolean { appComponent.inject(this@EditAccountActivity) val accountFromParcel: Account? = intent.getParcelableExtra(KEY_ACCOUNT) return if (accountFromParcel == null) false else { account = accountFromParcel - super.initData() + true } } - override fun initViews() { - super.initViews() - - tabLayout.setupWithViewPager(viewPager) + private fun initViews() { + binding.tabLayout.setupWithViewPager(binding.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 + binding.viewPager.adapter = adapter - viewPager.addOnPageChangeListener(object : OnPageChangeListener { + binding.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() + binding.fabDone.show() showKeyboard() } else { - fabDone.hide() + binding.fabDone.hide() hideKeyboard() } } @@ -79,7 +85,7 @@ class EditAccountActivity : BaseBackActivity() { private fun showKeyboard() { val imm = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager - imm.showSoftInput(etTitle, 0) + imm.showSoftInput(binding.root.findViewById(R.id.etTitle), 0) } override fun onCreateOptionsMenu(menu: Menu): Boolean { @@ -141,5 +147,4 @@ class EditAccountActivity : BaseBackActivity() { return intent } } - } 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 0b549d3..22fced8 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 @@ -1,45 +1,66 @@ package com.blogspot.e_kanivets.moneytracker.activity.account.edit.fragment import android.os.Bundle +import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.blogspot.e_kanivets.moneytracker.MtApp 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 +import com.blogspot.e_kanivets.moneytracker.databinding.FragmentAccountOperationsBinding import com.blogspot.e_kanivets.moneytracker.entity.RecordItem 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 com.blogspot.e_kanivets.moneytracker.util.RecordItemsBuilder -import kotlinx.android.synthetic.main.fragment_account_operations.* import javax.inject.Inject -class AccountOperationsFragment : BaseFragment() { +class AccountOperationsFragment : Fragment() { @Inject internal lateinit var accountController: AccountController + @Inject internal lateinit var recordController: RecordController + @Inject internal lateinit var transferController: TransferController + @Inject internal lateinit var formatController: FormatController private lateinit var account: Account - override val contentViewId: Int = R.layout.fragment_account_operations + private lateinit var binding: FragmentAccountOperationsBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + initData() + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + binding = FragmentAccountOperationsBinding.inflate(inflater) + return binding.root + } - override fun initData() { - appComponent.inject(this@AccountOperationsFragment) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initViews() + } + + private fun initData() { + MtApp.get().appComponent.inject(this@AccountOperationsFragment) arguments?.let { arguments -> account = arguments.getParcelable(KEY_ACCOUNT)!! } } - override fun initViews(view: View) { - recyclerView.adapter = RecordAdapter(requireContext(), getRecordItems(), false) + private fun initViews() { + binding.recyclerView.adapter = RecordAdapter(requireContext(), getRecordItems(), false) } private fun getRecordItems(): List { @@ -89,5 +110,4 @@ class AccountOperationsFragment : BaseFragment() { } } - } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/EditAccountFragment.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/EditAccountFragment.kt index 7820378..3ec8624 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/EditAccountFragment.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/EditAccountFragment.kt @@ -2,54 +2,71 @@ package com.blogspot.e_kanivets.moneytracker.activity.account.edit.fragment import android.app.Activity import android.os.Bundle -import com.google.android.material.floatingactionbutton.FloatingActionButton +import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.blogspot.e_kanivets.moneytracker.MtApp +import com.google.android.material.floatingactionbutton.FloatingActionButton 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.FormatController import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController +import com.blogspot.e_kanivets.moneytracker.databinding.FragmentEditAccountBinding import com.blogspot.e_kanivets.moneytracker.entity.data.Account import com.blogspot.e_kanivets.moneytracker.util.CrashlyticsProxy import com.blogspot.e_kanivets.moneytracker.util.validator.EditAccountValidator import com.blogspot.e_kanivets.moneytracker.util.validator.IValidator -import kotlinx.android.synthetic.main.fragment_edit_account.* import javax.inject.Inject -class EditAccountFragment : BaseFragment() { +class EditAccountFragment : Fragment() { @Inject internal lateinit var accountController: AccountController + @Inject internal lateinit var formatController: FormatController private lateinit var accountValidator: IValidator - private lateinit var account: Account - override val contentViewId: Int = layout.fragment_edit_account + private lateinit var binding: FragmentEditAccountBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + initData() + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + binding = FragmentEditAccountBinding.inflate(inflater) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initViews(view) + } - override fun initData() { - appComponent.inject(this@EditAccountFragment) + private fun initData() { + MtApp.get().appComponent.inject(this@EditAccountFragment) arguments?.let { arguments -> account = arguments.getParcelable(KEY_ACCOUNT)!! } } - override fun initViews(view: View) { - etTitle.setText(account.title) - etGoal.setText(formatController.formatPrecisionNone(account.goal)) - viewColor.setBackgroundColor(account.color) + private fun initViews(view: View) { + binding.etTitle.setText(account.title) + binding.etGoal.setText(formatController.formatPrecisionNone(account.goal)) + binding.viewColor.setBackgroundColor(account.color) val fabDone = view.rootView.findViewById(R.id.fabDone) fabDone.setOnClickListener { done() } - accountValidator = EditAccountValidator(requireContext(), view) + accountValidator = EditAccountValidator(requireContext(), binding) } private fun done() { CrashlyticsProxy.get().logButton("Edit Account") if (accountValidator.validate()) { - val title = etTitle.text.toString().trim { it <= ' ' } - val goal = etGoal.text.toString().toDouble() + val title = binding.etTitle.text.toString().trim { it <= ' ' } + val goal = binding.etGoal.text.toString().toDouble() val newAccount = Account( account.id, title, account.curSum.toDouble(), @@ -75,7 +92,5 @@ class EditAccountFragment : BaseFragment() { fragment.arguments = arguments return fragment } - } - } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseActivity.java index e48d7cb..1e58171 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseActivity.java @@ -1,8 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.activity.base; import android.app.ProgressDialog; -import android.os.Bundle; -import androidx.annotation.LayoutRes; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.appcompat.app.AlertDialog; @@ -13,15 +11,6 @@ import com.blogspot.e_kanivets.moneytracker.MtApp; import com.blogspot.e_kanivets.moneytracker.di.AppComponent; -import butterknife.ButterKnife; - -/** - * Base implementation of {@link androidx.appcompat.app.AppCompatActivity} to describe some common - * methods. - * Created on 1/26/16. - * - * @author Evgenii Kanivets - */ public abstract class BaseActivity extends AppCompatActivity { @SuppressWarnings("unused") private static final String TAG = "BaseActivity"; @@ -29,31 +18,10 @@ public abstract class BaseActivity extends AppCompatActivity { private Toolbar toolbar; protected ProgressDialog progressDialog; - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(getContentViewId()); - - if (initData()) initViews(); - else finish(); - } - - @LayoutRes - protected abstract int getContentViewId(); - protected AppComponent getAppComponent() { return MtApp.get().getAppComponent(); } - protected boolean initData() { - return true; - } - - protected void initViews() { - ButterKnife.bind(BaseActivity.this); - toolbar = initToolbar(); - } - public Toolbar getToolbar() { return toolbar; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseBackActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseBackActivity.java index b47246c..726dff6 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseBackActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseBackActivity.java @@ -1,32 +1,19 @@ package com.blogspot.e_kanivets.moneytracker.activity.base; import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; + import android.view.MenuItem; import com.blogspot.e_kanivets.moneytracker.R; -/** - * Base implementation of {@link AppCompatActivity} to describe some common - * methods. - * Created on 1/26/16. - * - * @author Evgenii Kanivets - */ public abstract class BaseBackActivity extends BaseActivity { - @SuppressWarnings("unused") - private static final String TAG = "BaseBackActivity"; @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - onBackPressed(); - return true; - - default: - break; + if (item.getItemId() == android.R.id.home) { + onBackPressed(); + return true; } return super.onOptionsItemSelected(item); diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseDrawerActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseDrawerActivity.java index a0137c5..b39fe2b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseDrawerActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseDrawerActivity.java @@ -3,10 +3,14 @@ import android.content.Intent; import androidx.annotation.NonNull; import com.google.android.material.navigation.NavigationView; + +import androidx.annotation.Nullable; import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.widget.Toolbar; + +import android.os.Bundle; import android.view.MenuItem; import com.blogspot.e_kanivets.moneytracker.R; @@ -18,26 +22,16 @@ import com.blogspot.e_kanivets.moneytracker.activity.exchange_rate.ExchangeRatesActivity; import com.blogspot.e_kanivets.moneytracker.util.CrashlyticsProxy; -import butterknife.BindView; - -/** - * Base implementation of {@link androidx.appcompat.app.AppCompatActivity} to encapsulate Navigation - * Drawer logic. - * Created on 3/16/16. - * - * @author Evgenii Kanivets - */ public abstract class BaseDrawerActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener { + private static final int REQUEST_ACCOUNTS = 1; private static final int REQUEST_RATES = 2; private static final int REQUEST_SETTINGS = 3; private static final int REQUEST_IMPORT_EXPORT = 4; protected static final int REQUEST_BACKUP = 5; - @BindView(R.id.drawer_layout) - DrawerLayout drawer; - @BindView(R.id.nav_view) + protected DrawerLayout drawer; protected NavigationView navigationView; protected abstract void update(); @@ -64,12 +58,6 @@ protected Toolbar initToolbar() { return toolbar; } - @Override - protected void initViews() { - super.initViews(); - navigationView.setNavigationItemSelectedListener(this); - } - @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseFragment.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseFragment.kt deleted file mode 100644 index 269baee..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseFragment.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.activity.base - -import android.os.Bundle -import androidx.fragment.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) - } -} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/ChartsActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/ChartsActivity.java index f05c109..a5d0b65 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/ChartsActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/ChartsActivity.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.activity.charts; -import com.google.android.material.tabs.TabLayout; +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityChartsBinding; import androidx.fragment.app.Fragment; import androidx.viewpager.widget.ViewPager; @@ -20,32 +20,34 @@ import javax.inject.Inject; -import butterknife.BindView; - public class ChartsActivity extends BaseBackActivity { @Inject RecordController recordController; @Inject ExchangeRateController exchangeRateController; @Inject CurrencyController currencyController; - @BindView(R.id.tabs) TabLayout tabLayout; - @BindView(R.id.view_pager) ViewPager viewPager; + private ActivityChartsBinding binding; + + @Override + protected void onCreate(android.os.Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = ActivityChartsBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); - @Override protected int getContentViewId() { - return R.layout.activity_charts; + initData(); + initToolbar(); + initViews(); } - @Override protected boolean initData() { - boolean result = super.initData(); + private boolean initData() { getAppComponent().inject(ChartsActivity.this); - return result; + return true; } - @Override protected void initViews() { - super.initViews(); - - setupViewPager(viewPager); - tabLayout.setupWithViewPager(viewPager); + private void initViews() { + setupViewPager(binding.viewPager); + binding.tabs.setupWithViewPager(binding.viewPager); } protected String createRatesNeededList(String currency, List ratesNeeded) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/GraphFragment.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/GraphFragment.java index 0a50836..027563d 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/GraphFragment.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/GraphFragment.java @@ -8,20 +8,11 @@ import android.view.View; import android.view.ViewGroup; -import com.blogspot.e_kanivets.moneytracker.R; +import com.blogspot.e_kanivets.moneytracker.databinding.FragmentGraphBinding; import com.blogspot.e_kanivets.moneytracker.report.chart.BarChartConverter; import com.blogspot.e_kanivets.moneytracker.report.chart.IMonthReport; -import com.github.mikephil.charting.charts.BarChart; import com.github.mikephil.charting.data.BarData; -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * A simple {@link Fragment} subclass. - * Use the {@link GraphFragment#newInstance} factory method to - * create an instance of this fragment. - */ public class GraphFragment extends Fragment { private static final String ARG_MONTH_REPORT = "arg_month_report"; private static final String ARG_NO_DATA_TEXT = "arg_no_data_text"; @@ -31,8 +22,7 @@ public class GraphFragment extends Fragment { @Nullable private String noDataText; - @BindView(R.id.bar_chart) - BarChart barChart; + private FragmentGraphBinding binding; public GraphFragment() { // Required empty public constructor @@ -80,17 +70,16 @@ public void onCreate(Bundle savedInstanceState) { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_graph, container, false); - initViews(rootView); - return rootView; + binding = FragmentGraphBinding.inflate(inflater, container, false); + return binding.getRoot(); } - private void initViews(@Nullable View rootView) { - if (rootView == null) return; - ButterKnife.bind(this, rootView); - + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (monthReport == null) { - barChart.setNoDataText(noDataText); + binding.barChart.setNoDataText(noDataText); } else { BarChartConverter barChartConverter = new BarChartConverter(getActivity(), monthReport); @@ -98,13 +87,13 @@ private void initViews(@Nullable View rootView) { barChartConverter.getBarDataSetList()); barData.setDrawValues(false); - barChart.setData(barData); - barChart.setDescription(null); - barChart.setVisibleXRangeMinimum(8); - barChart.setScaleYEnabled(false); - barChart.setVisibleXRangeMaximum(34); - barChart.setHighlightPerDragEnabled(false); - barChart.setHighlightPerTapEnabled(false); + binding.barChart.setData(barData); + binding.barChart.setDescription(null); + binding.barChart.setVisibleXRangeMinimum(8); + binding.barChart.setScaleYEnabled(false); + binding.barChart.setVisibleXRangeMaximum(34); + binding.barChart.setHighlightPerDragEnabled(false); + binding.barChart.setHighlightPerTapEnabled(false); } } } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/SummaryFragment.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/SummaryFragment.java index 425806f..c48de34 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/SummaryFragment.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/SummaryFragment.java @@ -6,28 +6,19 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ListView; import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.adapter.MonthSummaryAdapter; +import com.blogspot.e_kanivets.moneytracker.databinding.FragmentSummaryBinding; import com.blogspot.e_kanivets.moneytracker.report.chart.IMonthReport; -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * A simple {@link Fragment} subclass. - * Use the {@link SummaryFragment#newInstance} factory method to - * create an instance of this fragment. - */ public class SummaryFragment extends Fragment { private static final String ARG_MONTH_REPORT = "arg_month_report"; @Nullable private IMonthReport monthReport; - @BindView(R.id.listView) - ListView listView; + private FragmentSummaryBinding binding; public SummaryFragment() { // Required empty public constructor @@ -59,17 +50,15 @@ public void onCreate(Bundle savedInstanceState) { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_summary, container, false); - initViews(rootView); - return rootView; + binding = FragmentSummaryBinding.inflate(inflater, container, false); + return binding.getRoot(); } - private void initViews(@Nullable View rootView) { - if (rootView == null) return; - ButterKnife.bind(this, rootView); - + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); if (monthReport != null) { - listView.setAdapter(new MonthSummaryAdapter(getActivity(), monthReport)); + binding.listView.setAdapter(new MonthSummaryAdapter(getActivity(), monthReport)); } } } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/AddExchangeRateActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/AddExchangeRateActivity.java index 3342274..c6ff13b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/AddExchangeRateActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/AddExchangeRateActivity.java @@ -1,18 +1,18 @@ package com.blogspot.e_kanivets.moneytracker.activity.exchange_rate; import androidx.annotation.Nullable; -import androidx.appcompat.widget.AppCompatSpinner; + +import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; -import android.view.View; import android.widget.ArrayAdapter; -import android.widget.EditText; import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity; import com.blogspot.e_kanivets.moneytracker.controller.CurrencyController; import com.blogspot.e_kanivets.moneytracker.controller.FormatController; import com.blogspot.e_kanivets.moneytracker.controller.data.ExchangeRateController; +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityAddExchangeRateBinding; import com.blogspot.e_kanivets.moneytracker.entity.ExchangeRatePair; import com.blogspot.e_kanivets.moneytracker.util.CrashlyticsProxy; import com.blogspot.e_kanivets.moneytracker.util.validator.ExchangeRatePairValidator; @@ -23,8 +23,6 @@ import javax.inject.Inject; -import butterknife.BindView; - public class AddExchangeRateActivity extends BaseBackActivity { @SuppressWarnings("unused") private static final String TAG = "AddExchangeRateActivity"; @@ -44,50 +42,41 @@ public class AddExchangeRateActivity extends BaseBackActivity { @Nullable private ExchangeRatePair exchangeRatePair; - @BindView(R.id.contentView) - View contentView; - @BindView(R.id.spinner_from_currency) - AppCompatSpinner spinnerFromCurrency; - @BindView(R.id.spinner_to_currency) - AppCompatSpinner spinnerToCurrency; - @BindView(R.id.et_buy) - EditText etBuy; - @BindView(R.id.et_sell) - EditText etSell; + private ActivityAddExchangeRateBinding binding; @Override - protected int getContentViewId() { - return R.layout.activity_add_exchange_rate; + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = ActivityAddExchangeRateBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + initData(); + initToolbar(); + initViews(); } - @Override - protected boolean initData() { - boolean result = super.initData(); + private boolean initData() { getAppComponent().inject(AddExchangeRateActivity.this); - exchangeRatePair = getIntent().getParcelableExtra(KEY_EXCHANGE_RATE); - - return result; + return true; } - @Override - protected void initViews() { - super.initViews(); - - exchangeRatePairValidator = new ExchangeRatePairValidator(AddExchangeRateActivity.this, contentView); + private void initViews() { + exchangeRatePairValidator = new ExchangeRatePairValidator(AddExchangeRateActivity.this, binding); List currencyList = currencyController.readAll(); if (currencyList.size() == 0) { currencyList.add(getString(R.string.none)); - spinnerFromCurrency.setEnabled(false); - spinnerToCurrency.setEnabled(false); + binding.spinnerFromCurrency.setEnabled(false); + binding.spinnerToCurrency.setEnabled(false); } - spinnerFromCurrency.setAdapter(new ArrayAdapter<>(AddExchangeRateActivity.this, + binding.spinnerFromCurrency.setAdapter(new ArrayAdapter<>(AddExchangeRateActivity.this, R.layout.view_spinner_item, new ArrayList<>(currencyList))); - spinnerToCurrency.setAdapter(new ArrayAdapter<>(AddExchangeRateActivity.this, + binding.spinnerToCurrency.setAdapter(new ArrayAdapter<>(AddExchangeRateActivity.this, R.layout.view_spinner_item, new ArrayList<>(currencyList))); @@ -95,15 +84,15 @@ protected void initViews() { if (exchangeRatePair != null) { for (int i = 0; i < currencyList.size(); i++) { if (currencyList.get(i).equals(exchangeRatePair.getFromCurrency())) { - spinnerFromCurrency.setSelection(i); + binding.spinnerFromCurrency.setSelection(i); } if (currencyList.get(i).equals(exchangeRatePair.getToCurrency())) { - spinnerToCurrency.setSelection(i); + binding.spinnerToCurrency.setSelection(i); } } - etBuy.setText(formatController.formatPrecisionNone(exchangeRatePair.getAmountBuy())); - etSell.setText(formatController.formatPrecisionNone(exchangeRatePair.getAmountSell())); + binding.etBuy.setText(formatController.formatPrecisionNone(exchangeRatePair.getAmountBuy())); + binding.etSell.setText(formatController.formatPrecisionNone(exchangeRatePair.getAmountSell())); } } @@ -115,14 +104,11 @@ public boolean onCreateOptionsMenu(Menu menu) { @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.action_done: - tryAddExchangeRate(); - return true; - - default: - return super.onOptionsItemSelected(item); + if (item.getItemId() == R.id.action_done) { + tryAddExchangeRate(); + return true; } + return super.onOptionsItemSelected(item); } private void tryAddExchangeRate() { @@ -137,10 +123,10 @@ private void tryAddExchangeRate() { @SuppressWarnings("SimplifiableIfStatement") private boolean addExchangeRate() { if (exchangeRatePairValidator.validate()) { - String fromCurrency = (String) spinnerFromCurrency.getSelectedItem(); - String toCurrency = (String) spinnerToCurrency.getSelectedItem(); - double amountBuy = Double.parseDouble(etBuy.getText().toString().trim()); - double amountSell = Double.parseDouble(etSell.getText().toString().trim()); + String fromCurrency = (String) binding.spinnerFromCurrency.getSelectedItem(); + String toCurrency = (String) binding.spinnerToCurrency.getSelectedItem(); + double amountBuy = Double.parseDouble(binding.etBuy.getText().toString().trim()); + double amountSell = Double.parseDouble(binding.etSell.getText().toString().trim()); return exchangeRateController.createExchangeRatePair( new ExchangeRatePair(fromCurrency, toCurrency, amountBuy, amountSell)) != null; 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 addb503..e599f2c 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 @@ -1,18 +1,22 @@ package com.blogspot.e_kanivets.moneytracker.activity.exchange_rate; import android.content.Intent; + +import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; + +import android.os.Bundle; import android.view.ContextMenu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.BaseAdapter; -import android.widget.ListView; import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity; import com.blogspot.e_kanivets.moneytracker.adapter.ExchangeRateAdapter; import com.blogspot.e_kanivets.moneytracker.controller.data.ExchangeRateController; +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityExchangeRatesBinding; import com.blogspot.e_kanivets.moneytracker.entity.ExchangeRatePair; import com.blogspot.e_kanivets.moneytracker.util.CrashlyticsProxy; import com.blogspot.e_kanivets.moneytracker.util.ExchangeRatesSummarizer; @@ -22,10 +26,6 @@ import javax.inject.Inject; -import butterknife.BindView; -import butterknife.OnClick; -import butterknife.OnItemClick; - public class ExchangeRatesActivity extends BaseBackActivity { @SuppressWarnings("unused") private static final String TAG = "ExchangeRatesActivity"; @@ -37,26 +37,30 @@ public class ExchangeRatesActivity extends BaseBackActivity { private List exchangeRateList; - @BindView(R.id.listView) - ListView listView; + private ActivityExchangeRatesBinding binding; @Override - protected int getContentViewId() { - return R.layout.activity_exchange_rates; + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = ActivityExchangeRatesBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + initData(); + initToolbar(); + initViews(); } - @Override - protected boolean initData() { - boolean result = super.initData(); + private boolean initData() { getAppComponent().inject(ExchangeRatesActivity.this); - return result; + return true; } - @Override - protected void initViews() { - super.initViews(); + private void initViews() { + registerForContextMenu(binding.listView); + binding.btnAddExchangeRate.setOnClickListener(view -> addExchangeRate()); + binding.listView.setOnItemClickListener((adapterView, view, i, l) -> addExchangeRateOnBaseOfExisted(i)); - registerForContextMenu(listView); update(); } @@ -70,13 +74,12 @@ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMen public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); - switch (item.getItemId()) { - case R.id.delete: - deleteExchangeRate(info.position); - return true; - default: - return super.onContextItemSelected(item); + if (item.getItemId() == R.id.delete) { + deleteExchangeRate(info.position); + return true; } + + return super.onContextItemSelected(item); } public void deleteExchangeRate(int position) { @@ -86,14 +89,12 @@ public void deleteExchangeRate(int position) { setResult(RESULT_OK); } - @OnClick(R.id.btn_add_exchange_rate) public void addExchangeRate() { CrashlyticsProxy.get().logButton("Add Exchange Rate"); Intent intent = new Intent(ExchangeRatesActivity.this, AddExchangeRateActivity.class); startActivityForResult(intent, REQUEST_ADD_EXCHANGE_RATE); } - @OnItemClick(R.id.listView) public void addExchangeRateOnBaseOfExisted(int position) { CrashlyticsProxy.get().logButton("Edit Exchange Rate"); if (position < 0 || position >= exchangeRateList.size()) return; @@ -123,7 +124,7 @@ private void update() { exchangeRateList = new ExchangeRatesSummarizer(rateController.readAll()).getPairedSummaryList(); Collections.reverse(exchangeRateList); - listView.setAdapter(new ExchangeRateAdapter(ExchangeRatesActivity.this, exchangeRateList)); - ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged(); + binding.listView.setAdapter(new ExchangeRateAdapter(ExchangeRatesActivity.this, exchangeRateList)); + ((BaseAdapter) binding.listView.getAdapter()).notifyDataSetChanged(); } } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/BackupActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/BackupActivity.java index 2a377da..9c30128 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/BackupActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/BackupActivity.java @@ -1,10 +1,10 @@ package com.blogspot.e_kanivets.moneytracker.activity.external; import android.content.DialogInterface; +import android.os.Bundle; + import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; -import android.view.View; -import android.widget.ListView; import com.blogspot.e_kanivets.moneytracker.MtApp; import com.blogspot.e_kanivets.moneytracker.R; @@ -12,6 +12,7 @@ import com.blogspot.e_kanivets.moneytracker.adapter.BackupAdapter; import com.blogspot.e_kanivets.moneytracker.controller.backup.BackupController; import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController; +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityBackupBinding; import com.blogspot.e_kanivets.moneytracker.util.CrashlyticsProxy; import com.dropbox.core.DbxRequestConfig; import com.dropbox.core.android.Auth; @@ -21,9 +22,6 @@ import javax.inject.Inject; -import butterknife.BindView; -import butterknife.OnClick; -import butterknife.OnItemClick; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import timber.log.Timber; @@ -37,14 +35,21 @@ public class BackupActivity extends BaseBackActivity private DbxClientV2 dbClient; - @BindView(R.id.btn_backup_now) View btnBackupNow; - @BindView(R.id.listView) ListView listView; + private ActivityBackupBinding binding; + + @Override + protected void onCreate(@androidx.annotation.Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = ActivityBackupBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); - @Override protected int getContentViewId() { - return R.layout.activity_backup; + initData(); + initToolbar(); + initViews(); } - @Override protected boolean initData() { + private boolean initData() { getAppComponent().inject(BackupActivity.this); String accessToken = preferenceController.readDropboxAccessToken(); @@ -57,12 +62,13 @@ public class BackupActivity extends BaseBackActivity fetchBackups(); } - return super.initData(); + return true; } - @Override protected void initViews() { - super.initViews(); - btnBackupNow.setEnabled(preferenceController.readDropboxAccessToken() != null); + private void initViews() { + binding.btnBackupNow.setEnabled(preferenceController.readDropboxAccessToken() != null); + binding.btnBackupNow.setOnClickListener(view -> backupNow()); + binding.listView.setOnItemClickListener((adapterView, view, i, l) -> restoreBackupClicked(i)); } @Override protected void onResume() { @@ -71,7 +77,7 @@ public class BackupActivity extends BaseBackActivity if (Auth.getOAuth2Token() != null) { try { preferenceController.writeDropboxAccessToken(Auth.getOAuth2Token()); - btnBackupNow.setEnabled(true); + binding.btnBackupNow.setEnabled(true); DbxRequestConfig config = new DbxRequestConfig("open_money_tracker"); dbClient = new DbxClientV2(config, Auth.getOAuth2Token()); fetchBackups(); @@ -101,7 +107,7 @@ public class BackupActivity extends BaseBackActivity BackupAdapter backupAdapter = new BackupAdapter(BackupActivity.this, backupList); backupAdapter.setOnBackupListener(BackupActivity.this); - listView.setAdapter(backupAdapter); + binding.listView.setAdapter(backupAdapter); } @Override public void onBackupSuccess() { @@ -174,15 +180,15 @@ public class BackupActivity extends BaseBackActivity showToast(reason); } - @OnClick(R.id.btn_backup_now) public void backupNow() { + public void backupNow() { CrashlyticsProxy.get().logButton("Make Backup"); startProgress(getString(R.string.making_backup)); backupController.makeBackup(dbClient); } - @OnItemClick(R.id.listView) public void restoreBackupClicked(int position) { + public void restoreBackupClicked(int position) { CrashlyticsProxy.get().logButton("Restore backup"); - final String backupName = listView.getAdapter().getItem(position).toString(); + final String backupName = binding.listView.getAdapter().getItem(position).toString(); AlertDialog.Builder builder = new AlertDialog.Builder(BackupActivity.this); builder.setTitle(getString(R.string.warning)); @@ -214,6 +220,6 @@ private void removeBackup(String backupName) { private void logout() { preferenceController.writeDropboxAccessToken(null); Auth.startOAuth2Authentication(BackupActivity.this, APP_KEY); - btnBackupNow.setEnabled(false); + binding.btnBackupNow.setEnabled(false); } } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/ImportExportActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/ImportExportActivity.java index dc9ad47..59b01ec 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/ImportExportActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/ImportExportActivity.java @@ -3,17 +3,21 @@ import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; + import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.core.content.FileProvider; import androidx.appcompat.app.AlertDialog; + +import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; -import android.widget.EditText; import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity; import com.blogspot.e_kanivets.moneytracker.controller.external.ExportController; import com.blogspot.e_kanivets.moneytracker.controller.external.ImportController; +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityImportExportBinding; import com.blogspot.e_kanivets.moneytracker.entity.data.Record; import com.blogspot.e_kanivets.moneytracker.util.CrashlyticsProxy; @@ -24,8 +28,6 @@ import javax.inject.Inject; -import butterknife.BindView; -import butterknife.OnClick; import timber.log.Timber; public class ImportExportActivity extends BaseBackActivity { @@ -36,19 +38,28 @@ public class ImportExportActivity extends BaseBackActivity { @Inject ExportController exportController; - @BindView(R.id.et_import_data) - EditText etImportData; + private ActivityImportExportBinding binding; @Override - protected int getContentViewId() { - return R.layout.activity_import_export; + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = ActivityImportExportBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + initData(); + initToolbar(); + initViews(); } - @Override - protected boolean initData() { - boolean result = super.initData(); + private void initViews() { + binding.btnImport.setOnClickListener(view -> importRecords()); + binding.btnExport.setOnClickListener(view -> exportRecords()); + } + + private boolean initData() { getAppComponent().inject(ImportExportActivity.this); - return result; + return true; } @Override @@ -59,14 +70,11 @@ public boolean onCreateOptionsMenu(Menu menu) { @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.action_help: - showHelp(); - return true; - - default: - return super.onOptionsItemSelected(item); + if (item.getItemId() == R.id.action_help) { + showHelp(); + return true; } + return super.onOptionsItemSelected(item); } public void showHelp() { @@ -78,10 +86,9 @@ public void showHelp() { .show(); } - @OnClick(R.id.btn_import) public void importRecords() { CrashlyticsProxy.get().logButton("Import Records"); - final String data = etImportData.getText().toString().trim(); + final String data = binding.etImportData.getText().toString().trim(); AsyncTask importTask = new AsyncTask() { @Override @@ -107,7 +114,6 @@ protected void onPostExecute(Integer recordCount) { importTask.execute(); } - @OnClick(R.id.btn_export) public void exportRecords() { CrashlyticsProxy.get().logButton("Export Records"); List records = exportController.getRecordsForExport(0, Long.MAX_VALUE); diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/AddRecordActivity.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/AddRecordActivity.kt index a3b7d2d..e49928d 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/AddRecordActivity.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/AddRecordActivity.kt @@ -5,6 +5,7 @@ import android.app.Activity import android.app.DatePickerDialog import android.app.TimePickerDialog import android.content.res.ColorStateList +import android.os.Bundle import androidx.core.content.ContextCompat import android.text.InputFilter import android.text.Spanned @@ -23,6 +24,7 @@ import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController import com.blogspot.e_kanivets.moneytracker.controller.data.CategoryController import com.blogspot.e_kanivets.moneytracker.controller.data.RecordController +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityAddRecordBinding 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 @@ -31,8 +33,6 @@ import com.blogspot.e_kanivets.moneytracker.util.CategoryAutoCompleter import com.blogspot.e_kanivets.moneytracker.util.CrashlyticsProxy import com.blogspot.e_kanivets.moneytracker.util.validator.IValidator import com.blogspot.e_kanivets.moneytracker.util.validator.RecordValidator -import kotlinx.android.synthetic.main.activity_add_record.* -import kotlinx.android.synthetic.main.content_add_record.* import java.util.* import javax.inject.Inject @@ -47,12 +47,16 @@ class AddRecordActivity : BaseBackActivity() { @Inject lateinit var categoryController: CategoryController + @Inject lateinit var recordController: RecordController + @Inject lateinit var accountController: AccountController + @Inject lateinit var formatController: FormatController + @Inject lateinit var preferenceController: PreferenceController @@ -60,11 +64,20 @@ class AddRecordActivity : BaseBackActivity() { private lateinit var uiDecorator: AddRecordUiDecorator private lateinit var autoCompleter: CategoryAutoCompleter - override fun getContentViewId() = R.layout.activity_add_record + private lateinit var binding: ActivityAddRecordBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityAddRecordBinding.inflate(layoutInflater) + setContentView(binding.root) - override fun initData(): Boolean { - super.initData() + initData() + initToolbar() + initViews() + } + + private fun initData(): Boolean { appComponent.inject(this) record = intent.getParcelableExtra(KEY_RECORD) @@ -75,14 +88,12 @@ class AddRecordActivity : BaseBackActivity() { timestamp = record?.time ?: Date().time return (mode != null && (type == Record.TYPE_INCOME || type == Record.TYPE_EXPENSE) - && ((mode == Mode.MODE_EDIT && record != null) || (mode == Mode.MODE_ADD && record == null))) + && ((mode == Mode.MODE_EDIT && record != null) || (mode == Mode.MODE_ADD && record == null))) } @SuppressLint("SetTextI18n") - override fun initViews() { - super.initViews() - - recordValidator = RecordValidator(this, contentView) + private fun initViews() { + recordValidator = RecordValidator(this, binding) autoCompleter = CategoryAutoCompleter(categoryController, preferenceController) uiDecorator = AddRecordUiDecorator(this) @@ -90,10 +101,10 @@ class AddRecordActivity : BaseBackActivity() { if (mode == Mode.MODE_EDIT) { record?.let { record -> - etTitle.setText(record.title) - etCategory.setText(record.category?.name.orEmpty()) - etNotes.setText(record.notes) - etPrice.setText(formatController.formatPrecisionNone(record.fullPrice)) + binding.etTitle.setText(record.title) + binding.etCategory.setText(record.category?.name.orEmpty()) + binding.etNotes.setText(record.notes) + binding.etPrice.setText(formatController.formatPrecisionNone(record.fullPrice)) } } @@ -101,46 +112,41 @@ class AddRecordActivity : BaseBackActivity() { presentSpinnerAccount() // Restrict ';' for input, because it's used as delimiter when exporting - etTitle.filters = arrayOf(SemicolonInputFilter()) - etCategory.filters = arrayOf(SemicolonInputFilter()) - etNotes.filters = arrayOf(SemicolonInputFilter()) + binding.etTitle.filters = arrayOf(SemicolonInputFilter()) + binding.etCategory.filters = arrayOf(SemicolonInputFilter()) + binding.etNotes.filters = arrayOf(SemicolonInputFilter()) - tvDate.setOnClickListener { selectDate() } - tvTime.setOnClickListener { selectTime() } + binding.tvDate.setOnClickListener { selectDate() } + binding.tvTime.setOnClickListener { selectTime() } - if (type == Record.TYPE_EXPENSE) { - fabDone.backgroundTintList = (getColorForFab(R.color.red_light)) - } else { - fabDone.backgroundTintList = (getColorForFab(R.color.green_light)) - } - - fabDone.setOnClickListener { tryRecord() } + binding.fabDone.backgroundTintList = ColorStateList.valueOf( + ContextCompat.getColor(this, if (type == Record.TYPE_EXPENSE) R.color.red_light else R.color.green_light) + ) + binding.fabDone.setOnClickListener { tryRecord() } updateDateAndTime() } - private fun getColorForFab(color: Int): ColorStateList { - return ColorStateList.valueOf(ContextCompat.getColor(this, color)) - } - private fun initCategoryAutocomplete() { val categoryAutoCompleteAdapter = CategoryAutoCompleteAdapter( - this, R.layout.view_category_item, autoCompleter) - etCategory.setAdapter(categoryAutoCompleteAdapter) - etCategory.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id -> - etCategory.setText(parent.adapter.getItem(position) as String) - etCategory.setSelection(etCategory.text.length) - } - etCategory.setOnEditorActionListener { v, actionId, event -> + this, R.layout.view_category_item, autoCompleter + ) + binding.etCategory.setAdapter(categoryAutoCompleteAdapter) + binding.etCategory.onItemClickListener = + AdapterView.OnItemClickListener { parent, _, position, _ -> + binding.etCategory.setText(parent.adapter.getItem(position) as String) + binding.etCategory.setSelection(binding.etCategory.text.length) + } + binding.etCategory.setOnEditorActionListener { _, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_DONE) tryRecord() false } - etCategory.onFocusChangeListener = View.OnFocusChangeListener { view, hasFocus -> - if (hasFocus && etCategory.text.toString().trim().isEmpty()) { - val title = etTitle.text.toString().trim() + binding.etCategory.onFocusChangeListener = View.OnFocusChangeListener { view, hasFocus -> + if (hasFocus && binding.etCategory.text.toString().trim().isEmpty()) { + val title = binding.etTitle.text.toString().trim() autoCompleter.completeByRecordTitle(title)?.let { prediction -> - etCategory.setText(prediction) - etCategory.selectAll() + binding.etCategory.setText(prediction) + binding.etCategory.selectAll() } } } @@ -180,21 +186,22 @@ class AddRecordActivity : BaseBackActivity() { val calendar = Calendar.getInstance() calendar.timeInMillis = timestamp val dialog = DatePickerDialog(this, uiDecorator.getTheme(type), - DatePickerDialog.OnDateSetListener { view, year, monthOfYear, dayOfMonth -> - val newCalendar = Calendar.getInstance() - newCalendar.timeInMillis = timestamp - newCalendar.set(Calendar.YEAR, year) - newCalendar.set(Calendar.MONTH, monthOfYear) - newCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth) - - if (newCalendar.timeInMillis < Date().time) { - timestamp = newCalendar.timeInMillis - updateDateAndTime() - } else { - showToast(R.string.record_in_future) - } - }, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), - calendar.get(Calendar.DAY_OF_MONTH)) + { view, year, monthOfYear, dayOfMonth -> + val newCalendar = Calendar.getInstance() + newCalendar.timeInMillis = timestamp + newCalendar.set(Calendar.YEAR, year) + newCalendar.set(Calendar.MONTH, monthOfYear) + newCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth) + + if (newCalendar.timeInMillis < Date().time) { + timestamp = newCalendar.timeInMillis + updateDateAndTime() + } else { + showToast(R.string.record_in_future) + } + }, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), + calendar.get(Calendar.DAY_OF_MONTH) + ) dialog.show() } @@ -203,20 +210,21 @@ class AddRecordActivity : BaseBackActivity() { val calendar = Calendar.getInstance() calendar.timeInMillis = timestamp val dialog = TimePickerDialog(this, uiDecorator.getTheme(type), - TimePickerDialog.OnTimeSetListener { view, hourOfDay, minute -> - val newCalendar = Calendar.getInstance() - newCalendar.timeInMillis = timestamp - newCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay) - newCalendar.set(Calendar.MINUTE, minute) - - if (newCalendar.timeInMillis < Date().time) { - timestamp = newCalendar.timeInMillis - updateDateAndTime() - } else { - showToast(R.string.record_in_future) - } - }, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), - DateFormat.is24HourFormat(this)) + { view, hourOfDay, minute -> + val newCalendar = Calendar.getInstance() + newCalendar.timeInMillis = timestamp + newCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay) + newCalendar.set(Calendar.MINUTE, minute) + + if (newCalendar.timeInMillis < Date().time) { + timestamp = newCalendar.timeInMillis + updateDateAndTime() + } else { + showToast(R.string.record_in_future) + } + }, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), + DateFormat.is24HourFormat(this) + ) dialog.show() } @@ -235,14 +243,14 @@ class AddRecordActivity : BaseBackActivity() { } if (selectedAccountIndex == -1) { - spinnerAccount.isEnabled = false + binding.spinnerAccount.isEnabled = false accounts.clear() accounts.add(getString(R.string.account_removed)) } - spinnerAccount.adapter = ArrayAdapter(this, R.layout.view_spinner_item, accounts) - spinnerAccount.setSelection(selectedAccountIndex) + binding.spinnerAccount.adapter = ArrayAdapter(this, R.layout.view_spinner_item, accounts) + binding.spinnerAccount.setSelection(selectedAccountIndex) } private fun tryRecord() { @@ -262,11 +270,11 @@ class AddRecordActivity : BaseBackActivity() { return false } - var title = etTitle.text.toString().trim() - val category = etCategory.text.toString().trim() - val notes = etNotes.text.toString().trim() - val price = etPrice.text.toString().toDouble() - val account = accountList[spinnerAccount.selectedItemPosition] + var title = binding.etTitle.text.toString().trim() + val category = binding.etCategory.text.toString().trim() + val notes = binding.etNotes.text.toString().trim() + val price = binding.etPrice.text.toString().toDouble() + val account = accountList[binding.spinnerAccount.selectedItemPosition] if (title.isEmpty()) { title = category @@ -288,8 +296,8 @@ class AddRecordActivity : BaseBackActivity() { } private fun updateDateAndTime() { - tvDate.text = formatController.formatDateToNumber(timestamp) - tvTime.text = formatController.formatTime(timestamp) + binding.tvDate.text = formatController.formatDateToNumber(timestamp) + binding.tvTime.text = formatController.formatTime(timestamp) } enum class Mode { MODE_ADD, MODE_EDIT } 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 2c605d3..de008d2 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 @@ -1,9 +1,10 @@ package com.blogspot.e_kanivets.moneytracker.activity.record import android.content.Intent +import android.os.Bundle +import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.RecyclerView -import android.widget.TextView import com.blogspot.e_kanivets.moneytracker.R import com.blogspot.e_kanivets.moneytracker.activity.ReportActivity import com.blogspot.e_kanivets.moneytracker.activity.base.BaseDrawerActivity @@ -15,6 +16,7 @@ import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController import com.blogspot.e_kanivets.moneytracker.controller.data.ExchangeRateController import com.blogspot.e_kanivets.moneytracker.controller.data.RecordController +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityMainBinding import com.blogspot.e_kanivets.moneytracker.entity.Period import com.blogspot.e_kanivets.moneytracker.entity.RecordItem import com.blogspot.e_kanivets.moneytracker.entity.data.Record @@ -23,8 +25,6 @@ import com.blogspot.e_kanivets.moneytracker.ui.AppRateDialog import com.blogspot.e_kanivets.moneytracker.ui.presenter.ShortSummaryPresenter import com.blogspot.e_kanivets.moneytracker.util.CrashlyticsProxy import com.blogspot.e_kanivets.moneytracker.util.RecordItemsBuilder -import kotlinx.android.synthetic.main.activity_main.* -import kotlinx.android.synthetic.main.content_main.* import javax.inject.Inject class MainActivity : BaseDrawerActivity() { @@ -36,42 +36,59 @@ class MainActivity : BaseDrawerActivity() { @Inject lateinit var recordController: RecordController + @Inject lateinit var rateController: ExchangeRateController + @Inject lateinit var accountController: AccountController + @Inject lateinit var currencyController: CurrencyController + @Inject lateinit var preferenceController: PreferenceController + @Inject lateinit var periodController: PeriodController + @Inject lateinit var formatController: FormatController + private lateinit var summaryPresenter: ShortSummaryPresenter + + private lateinit var binding: ActivityMainBinding private lateinit var tvDefaultAccountTitle: TextView private lateinit var tvDefaultAccountSum: TextView private lateinit var tvCurrency: TextView - private lateinit var summaryPresenter: ShortSummaryPresenter - override fun getContentViewId(): Int = R.layout.activity_main + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) - override fun initData(): Boolean { - super.initData() - appComponent.inject(this) - - preferenceController.addLaunchCount() + binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) - return super.initData() + initData() + initToolbar() + initViews() } - override fun initViews() { - super.initViews() + private fun initData(): Boolean { + appComponent.inject(this) + preferenceController.addLaunchCount() + return true + } + private fun initViews() { setTitle(R.string.title_records) if (preferenceController.checkRateDialog()) showAppRateDialog() + drawer = binding.drawerLayout + navigationView = binding.navView + + navigationView.setNavigationItemSelectedListener(this) + tvDefaultAccountTitle = navigationView.getHeaderView(0).findViewById(R.id.tvDefaultAccountTitle) tvDefaultAccountSum = navigationView.getHeaderView(0).findViewById(R.id.tvDefaultAccountSum) tvCurrency = navigationView.getHeaderView(0).findViewById(R.id.tvCurrency) @@ -83,27 +100,25 @@ class MainActivity : BaseDrawerActivity() { val summaryViewHolder = summaryPresenter.create(true) { showReport() }.tag as RecyclerView.ViewHolder recordAdapter.summaryViewHolder = summaryViewHolder - recyclerView.adapter = recordAdapter + binding.recyclerView.adapter = recordAdapter - spinner.setPeriodSelectedListener { period -> + binding.spinner.setPeriodSelectedListener { period -> this.period = period periodController.writeLastUsedPeriod(period) update() } - spinner.setPeriod(periodController.readLastUsedPeriod()) + binding.spinner.setPeriod(periodController.readLastUsedPeriod()) - btnAddExpense.setOnClickListener { addExpense() } - btnAddIncome.setOnClickListener { addIncome() } + binding.btnAddExpense.setOnClickListener { addExpense() } + binding.btnAddIncome.setOnClickListener { addIncome() } } private fun getPositionWithoutSummary(position: Int) = position - 1 private fun editRecord(position: Int) { - CrashlyticsProxy.get().logButton("Edit Record") val record = recordList[getRecordPosition(position)] - startAddRecordActivity(record, AddRecordActivity.Mode.MODE_EDIT, record.type) } @@ -124,27 +139,22 @@ class MainActivity : BaseDrawerActivity() { startActivity(intent) } - public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (resultCode == AppCompatActivity.RESULT_OK) { when (requestCode) { REQUEST_ACTION_RECORD -> update() - REQUEST_BACKUP -> { appComponent.inject(this) update() } - - else -> { - } } } } override fun update() { - recordList = recordController.getRecordsForPeriod(period) - recordList = recordList.reversed() + recordList = recordController.getRecordsForPeriod(period).reversed() recordItems = RecordItemsBuilder().getRecordItems(recordList) val currency = currencyController.readDefaultCurrency() @@ -160,7 +170,6 @@ class MainActivity : BaseDrawerActivity() { private fun getRecordPosition(position: Int): Int { var recordPosition = 0 - for (indexOfItem in 0 until position) { if (recordItems[indexOfItem] is RecordItem.Record) { recordPosition++ @@ -186,8 +195,7 @@ class MainActivity : BaseDrawerActivity() { private fun fillDefaultAccount() { val defaultAccount = accountController.readDefaultAccount() ?: return - - tvDefaultAccountSum.text = defaultAccount.title + tvDefaultAccountTitle.text = defaultAccount.title tvDefaultAccountSum.text = formatController.formatAmount(defaultAccount.fullSum) tvCurrency.text = defaultAccount.currency } @@ -195,5 +203,4 @@ class MainActivity : BaseDrawerActivity() { companion object { 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 5015d6d..2f329c8 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 @@ -6,26 +6,17 @@ 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.databinding.ViewAccountBinding; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; import java.util.List; import javax.inject.Inject; -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Custom adapter class for Account entity. - * Created on 6/3/15. - * - * @author Evgenii Kanivets - */ public class AccountAdapter extends BaseAdapter { @Inject FormatController formatController; @@ -71,16 +62,18 @@ public long getItemId(int position) { @SuppressLint("SetTextI18n") @Override public View getView(final int position, View convertView, ViewGroup parent) { - ViewHolder viewHolder; + ViewAccountBinding binding; if (convertView == null) { LayoutInflater layoutInflater = LayoutInflater.from(context); - convertView = layoutInflater.inflate(R.layout.view_account, parent, false); - viewHolder = new ViewHolder(convertView); + binding = ViewAccountBinding.inflate(layoutInflater, parent, false); + convertView = binding.getRoot(); - convertView.setTag(viewHolder); - } else viewHolder = (ViewHolder) convertView.getTag(); + convertView.setTag(binding); + } else { + binding = (ViewAccountBinding) convertView.getTag(); + } Account account = accounts.get(position); @@ -90,26 +83,13 @@ public View getView(final int position, View convertView, ViewGroup parent) { convertView.setBackgroundColor(account.getFullSum() >= 0.0 ? whiteGreen : whiteRed); } - viewHolder.tvCurSum.setTextColor(account.getFullSum() >= 0.0 ? green : red); - viewHolder.tvCurrency.setTextColor(account.getFullSum() >= 0.0 ? green : red); + binding.tvCurSum.setTextColor(account.getFullSum() >= 0.0 ? green : red); + binding.tvCurrency.setTextColor(account.getFullSum() >= 0.0 ? green : red); - viewHolder.tvTitle.setText(account.getTitle()); - viewHolder.tvCurSum.setText(formatController.formatSignedAmount(account.getFullSum())); - viewHolder.tvCurrency.setText(account.getCurrency()); + binding.tvTitle.setText(account.getTitle()); + binding.tvCurSum.setText(formatController.formatSignedAmount(account.getFullSum())); + binding.tvCurrency.setText(account.getCurrency()); return convertView; } - - public static class ViewHolder { - @BindView(R.id.tvTitle) - TextView tvTitle; - @BindView(R.id.tv_cur_sum) - TextView tvCurSum; - @BindView(R.id.tvCurrency) - TextView tvCurrency; - - public ViewHolder(View view) { - ButterKnife.bind(this, view); - } - } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/BackupAdapter.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/BackupAdapter.kt index 1b8e85d..68cf142 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/BackupAdapter.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/BackupAdapter.kt @@ -5,35 +5,36 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter -import com.blogspot.e_kanivets.moneytracker.R -import kotlinx.android.synthetic.main.view_backup_item.view.ivDelete -import kotlinx.android.synthetic.main.view_backup_item.view.tvTitle +import com.blogspot.e_kanivets.moneytracker.databinding.ViewBackupItemBinding -class BackupAdapter(private val context: Context, private val backups: List) : BaseAdapter() { +class BackupAdapter( + private val context: Context, + private val backups: List, +) : BaseAdapter() { var onBackupListener: OnBackupListener? = null override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val binding: ViewBackupItemBinding var view = convertView - val viewHolder: ViewHolder? if (view == null) { val layoutInflater = LayoutInflater.from(context) - view = layoutInflater.inflate(R.layout.view_backup_item, parent, false) - viewHolder = ViewHolder(view) + binding = ViewBackupItemBinding.inflate(layoutInflater, parent, false) + view = binding.root - view.tag = viewHolder + view.tag = binding } else { - viewHolder = view.tag as ViewHolder + binding = view.tag as ViewBackupItemBinding } val backupItem = getItem(position) - viewHolder.view.tvTitle.text = backupItem - viewHolder.view.ivDelete.setOnClickListener { onBackupListener?.onBackupDelete(backupItem) } + binding.tvTitle.text = backupItem + binding.ivDelete.setOnClickListener { onBackupListener?.onBackupDelete(backupItem) } - return view!! + return view } override fun getItem(position: Int): String = backups[position] @@ -42,10 +43,7 @@ class BackupAdapter(private val context: Context, private val backups: List implements Filterable { + private final CategoryAutoCompleter autoCompleter; public CategoryAutoCompleteAdapter(Context context, int resource, CategoryAutoCompleter autoCompleter) { @@ -36,24 +27,23 @@ public CategoryAutoCompleteAdapter(Context context, int resource, CategoryAutoCo @Override public View getView(int position, View convertView, @NotNull ViewGroup parent) { - ViewHolder viewHolder; + ViewCategoryItemBinding binding; if (convertView == null) { - convertView = LayoutInflater.from(getContext()).inflate(R.layout.view_category_item, parent, false); - viewHolder = new ViewHolder(convertView); - convertView.setTag(viewHolder); - } else viewHolder = (ViewHolder) convertView.getTag(); + binding = ViewCategoryItemBinding.inflate(LayoutInflater.from(getContext()), parent, false); + convertView = binding.getRoot(); + convertView.setTag(binding); + } else { + binding = (ViewCategoryItemBinding) convertView.getTag(); + } final String category = getItem(position); - viewHolder.tvCategory.setText(category); - viewHolder.ivCancel.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - autoCompleter.removeFromAutoComplete(category); - remove(category); - notifyDataSetChanged(); - } + binding.tvCategory.setText(category); + binding.ivCancel.setOnClickListener(v -> { + autoCompleter.removeFromAutoComplete(category); + remove(category); + notifyDataSetChanged(); }); return convertView; @@ -92,15 +82,4 @@ protected void publishResults(CharSequence constraint, FilterResults results) { } }; } - - public static class ViewHolder { - @BindView(R.id.tvCategory) - TextView tvCategory; - @BindView(R.id.iv_cancel) - View ivCancel; - - public ViewHolder(View view) { - ButterKnife.bind(this, view); - } - } } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/ExchangeRateAdapter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/ExchangeRateAdapter.java index ff1ef4d..57c0271 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/ExchangeRateAdapter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/ExchangeRateAdapter.java @@ -6,26 +6,16 @@ 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.databinding.ViewExchangeRateBinding; import com.blogspot.e_kanivets.moneytracker.entity.ExchangeRatePair; import java.util.List; import javax.inject.Inject; -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Custom adapter class for Exchange rate entity. - * Created on 23/2/16. - * - * @author Evgenii Kanivets - */ public class ExchangeRateAdapter extends BaseAdapter { @Inject FormatController formatController; @@ -57,39 +47,26 @@ public long getItemId(int position) { @SuppressLint("SetTextI18n") @Override public View getView(final int position, View convertView, ViewGroup parent) { - ViewHolder viewHolder; + ViewExchangeRateBinding binding; if (convertView == null) { LayoutInflater layoutInflater = LayoutInflater.from(context); - convertView = layoutInflater.inflate(R.layout.view_exchange_rate, parent, false); - viewHolder = new ViewHolder(convertView); + binding = ViewExchangeRateBinding.inflate(layoutInflater, parent, false); + convertView = binding.getRoot(); - convertView.setTag(viewHolder); - } else viewHolder = (ViewHolder) convertView.getTag(); + convertView.setTag(binding); + } else { + binding = (ViewExchangeRateBinding) convertView.getTag(); + } ExchangeRatePair rate = getItem(position); - viewHolder.tvFromCurrency.setText(rate.getFromCurrency()); - viewHolder.tvToCurrency.setText(rate.getToCurrency()); - viewHolder.tvAmountBuy.setText(formatController.formatPrecisionNone(rate.getAmountBuy())); - viewHolder.tvAmountSell.setText(formatController.formatPrecisionNone(rate.getAmountSell())); + binding.tvFromCurrency.setText(rate.getFromCurrency()); + binding.tvToCurrency.setText(rate.getToCurrency()); + binding.tvAmountBuy.setText(formatController.formatPrecisionNone(rate.getAmountBuy())); + binding.tvAmountSell.setText(formatController.formatPrecisionNone(rate.getAmountSell())); return convertView; } - - public static class ViewHolder { - @BindView(R.id.tv_from_currency) - TextView tvFromCurrency; - @BindView(R.id.tv_to_currency) - TextView tvToCurrency; - @BindView(R.id.tv_amount_buy) - TextView tvAmountBuy; - @BindView(R.id.tv_amount_sell) - TextView tvAmountSell; - - public ViewHolder(View view) { - ButterKnife.bind(this, 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 81afb5c..ac4b391 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 @@ -7,27 +7,16 @@ 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.databinding.ViewMonthSummaryBinding; import com.blogspot.e_kanivets.moneytracker.report.chart.IMonthReport; import java.text.SimpleDateFormat; import javax.inject.Inject; -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Adapter to display a report grouped by months. - * Created on 1/13/17. - * - * @author Evgenii Kanivets - */ - @SuppressWarnings("WeakerAccess") public class MonthSummaryAdapter extends BaseAdapter { @@ -73,16 +62,18 @@ public long getItemId(int position) { @Override public View getView(int position, View convertView, ViewGroup parent) { - ViewHolder viewHolder; + ViewMonthSummaryBinding binding; if (convertView == null) { LayoutInflater layoutInflater = LayoutInflater.from(context); - convertView = layoutInflater.inflate(R.layout.view_month_summary, parent, false); - viewHolder = new ViewHolder(convertView); + binding = ViewMonthSummaryBinding.inflate(layoutInflater, parent, false); + convertView = binding.getRoot(); - convertView.setTag(viewHolder); - } else viewHolder = (ViewHolder) convertView.getTag(); + convertView.setTag(binding); + } else { + binding = (ViewMonthSummaryBinding) convertView.getTag(); + } // Reverse a report int index = monthReport.getMonthList().size() - position - 1; @@ -91,23 +82,10 @@ public View getView(int position, View convertView, ViewGroup parent) { double totalIncome = monthReport.getIncomeList().get(index); double totalExpense = monthReport.getExpenseList().get(index); - viewHolder.tvMonth.setText(month); - viewHolder.tvTotalIncome.setText(formatController.formatSignedAmount(totalIncome)); - viewHolder.tvTotalExpense.setText(formatController.formatSignedAmount(-totalExpense)); + binding.tvMonth.setText(month); + binding.tvTotalIncome.setText(formatController.formatSignedAmount(totalIncome)); + binding.tvTotalExpense.setText(formatController.formatSignedAmount(-totalExpense)); return convertView; } - - public static class ViewHolder { - @BindView(R.id.tvMonth) - TextView tvMonth; - @BindView(R.id.tvTotalIncome) - TextView tvTotalIncome; - @BindView(R.id.tvTotalExpense) - TextView tvTotalExpense; - - 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 index 5d107fd..718d501 100644 --- 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 @@ -4,15 +4,14 @@ import android.content.Context import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup 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.databinding.ViewHeaderDateBinding +import com.blogspot.e_kanivets.moneytracker.databinding.ViewRecordBinding import com.blogspot.e_kanivets.moneytracker.entity.RecordItem -import kotlinx.android.synthetic.main.view_header_date.view.* -import kotlinx.android.synthetic.main.view_record.view.* import javax.inject.Inject class RecordAdapter : RecyclerView.Adapter { @@ -57,12 +56,18 @@ class RecordAdapter : RecyclerView.Adapter { TYPE_RECORD } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder = - when (viewType) { - TYPE_RECORD -> RecordViewHolder(LayoutInflater.from(context).inflate(R.layout.view_record, parent, false), itemClickListener) - TYPE_HEADER -> HeaderViewHolder(LayoutInflater.from(context).inflate(R.layout.view_header_date, parent, false)) - else -> summaryViewHolder - } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = when (viewType) { + TYPE_RECORD -> RecordViewHolder( + ViewRecordBinding.inflate(LayoutInflater.from(context), parent, false), + itemClickListener + ) + + TYPE_HEADER -> HeaderViewHolder( + ViewHeaderDateBinding.inflate(LayoutInflater.from(context), parent, false) + ) + + else -> summaryViewHolder + } override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) { if (position == 0 && isSummaryViewNeeded) { @@ -95,27 +100,25 @@ class RecordAdapter : RecyclerView.Adapter { notifyDataSetChanged() } - class RecordViewHolder : RecyclerView.ViewHolder { - - var tvPrice: TextView - var tvTitle: TextView - var tvCategory: TextView - var tvCurrency: TextView + class RecordViewHolder( + binding: ViewRecordBinding, + itemClickListener: ((Int) -> Unit)?, + ) : RecyclerView.ViewHolder(binding.root) { - constructor(view: View, itemClickListener: ((Int) -> Unit)?) : super(view) { - tvPrice = view.tvPrice - tvTitle = view.tvTitle - tvCategory = view.tvCategory - tvCurrency = view.tvCurrency + var tvPrice: TextView = binding.tvPrice + var tvTitle: TextView = binding.tvTitle + var tvCategory: TextView = binding.tvCategory + var tvCurrency: TextView = binding.tvCurrency - view.setOnClickListener { + init { + binding.root.setOnClickListener { itemClickListener?.invoke(adapterPosition) } } } - class HeaderViewHolder(view: View) : RecyclerView.ViewHolder(view) { - val tvDate: TextView = view.tvDate + class HeaderViewHolder(binding: ViewHeaderDateBinding) : RecyclerView.ViewHolder(binding.root) { + val tvDate: TextView = binding.tvDate } companion object { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordReportAdapter.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordReportAdapter.kt index c3bec57..9ae42ae 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordReportAdapter.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordReportAdapter.kt @@ -8,13 +8,14 @@ import android.view.View import android.view.ViewGroup import android.widget.TextView import com.blogspot.e_kanivets.moneytracker.R +import com.blogspot.e_kanivets.moneytracker.databinding.ViewReportItemBinding +import com.blogspot.e_kanivets.moneytracker.databinding.ViewReportItemExpBinding import com.blogspot.e_kanivets.moneytracker.entity.RecordReportItem -import kotlinx.android.synthetic.main.view_report_item_exp.view.* class RecordReportAdapter( - private var items: MutableList, - private var data: HashMap>, - private val context: Context + private var items: MutableList, + private var data: HashMap>, + private val context: Context ) : RecyclerView.Adapter() { private var red: Int = ContextCompat.getColor(context, R.color.red) @@ -31,8 +32,16 @@ class RecordReportAdapter( } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = when (viewType) { - TYPE_PARENT -> ParentViewHolder(LayoutInflater.from(context).inflate(R.layout.view_report_item_exp, parent, false), ::changeItems, context) - TYPE_CHILD -> ChildViewHolder(LayoutInflater.from(context).inflate(R.layout.view_report_item, parent, false)) + TYPE_PARENT -> ParentViewHolder( + ViewReportItemExpBinding.inflate(LayoutInflater.from(context), parent, false), + ::changeItems, + context + ) + + TYPE_CHILD -> ChildViewHolder( + ViewReportItemBinding.inflate(LayoutInflater.from(context), parent, false) + ) + else -> summaryViewHolder } @@ -47,6 +56,7 @@ class RecordReportAdapter( holder.tvTotal.text = row.amount holder.tvTotal.setTextColor(if (row.amount.first() != '-') green else red) } + is ParentViewHolder -> { val row = items[posWithoutSummary] as RecordReportItem.ParentRow holder.tvCategory.text = row.category @@ -56,7 +66,10 @@ class RecordReportAdapter( } } - fun setData(items: MutableList, data: HashMap>) { + fun setData( + items: MutableList, + data: HashMap> + ) { this.items = items this.data = data notifyDataSetChanged() @@ -81,7 +94,7 @@ class RecordReportAdapter( private fun closeParentRow(parentRow: RecordReportItem.ParentRow, position: Int) { val item = items.filterIndexed { index, _ -> index > position } - .find { it is RecordReportItem.ParentRow } + .find { it is RecordReportItem.ParentRow } val lastChildInd = if (item != null) items.indexOf(item) else items.size @@ -109,21 +122,35 @@ class RecordReportAdapter( private fun getPositionWithoutSummary(position: Int) = position - 1 - class ParentViewHolder(view: View, changeItems: ((Int) -> Unit), context: Context) : RecyclerView.ViewHolder(view) { + class ParentViewHolder( + binding: ViewReportItemExpBinding, + changeItems: ((Int) -> Unit), + context: Context, + ) : RecyclerView.ViewHolder(binding.root) { - var tvCategory: TextView = view.tvCategory - var tvTotal: TextView = view.tvTotal + var tvCategory: TextView = binding.tvCategory + var tvTotal: TextView = binding.tvTotal private var isOpen: Boolean = false init { - view.setOnClickListener { + binding.root.setOnClickListener { if (isOpen) { - view.lowerDivider.visibility = View.GONE - view.ivArrow.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_arrow_downward_outline)) + binding.lowerDivider.visibility = View.GONE + binding.ivArrow.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.ic_arrow_downward_outline + ) + ) } else { - view.lowerDivider.visibility = View.VISIBLE - view.ivArrow.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_arrow_upward_outline)) + binding.lowerDivider.visibility = View.VISIBLE + binding.ivArrow.setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.ic_arrow_upward_outline + ) + ) } isOpen = !isOpen changeItems(adapterPosition) @@ -131,9 +158,9 @@ class RecordReportAdapter( } } - class ChildViewHolder(view: View) : RecyclerView.ViewHolder(view) { - val tvCategory: TextView = view.tvCategory - val tvTotal: TextView = view.tvTotal + class ChildViewHolder(binding: ViewReportItemBinding) : RecyclerView.ViewHolder(binding.root) { + val tvCategory: TextView = binding.tvCategory + val tvTotal: TextView = binding.tvTotal } companion object { @@ -142,5 +169,4 @@ class RecordReportAdapter( private const val TYPE_PARENT = 1 private const val TYPE_CHILD = 2 } - } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/AppRateDialog.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/AppRateDialog.java index 74b4181..1eed6a2 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/AppRateDialog.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/AppRateDialog.java @@ -6,19 +6,19 @@ import android.net.Uri; import android.os.Bundle; +import androidx.annotation.Nullable; + import com.blogspot.e_kanivets.moneytracker.MtApp; -import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController; +import com.blogspot.e_kanivets.moneytracker.databinding.DialogRateBinding; import javax.inject.Inject; -import butterknife.ButterKnife; -import butterknife.OnClick; - public class AppRateDialog extends AlertDialog { private static final String GP_MARKET = "market://details?id="; private Context context; + private DialogRateBinding binding; @Inject PreferenceController preferenceController; @@ -30,25 +30,23 @@ public AppRateDialog(Context context) { } @Override - protected void onCreate(Bundle savedInstanceState) { + protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.dialog_rate); - ButterKnife.bind(AppRateDialog.this); + + binding = DialogRateBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + binding.yesButton.setOnClickListener(view -> yes()); + binding.maybeButton.setOnClickListener(view -> dismiss()); + binding.thanksButton.setOnClickListener(view -> thanks()); } - @OnClick(R.id.yes_button) public void yes() { context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(GP_MARKET + context.getPackageName()))); preferenceController.appRated(); dismiss(); } - @OnClick(R.id.maybeButton) - public void maybe() { - dismiss(); - } - - @OnClick(R.id.thanksButton) public void thanks() { preferenceController.appRated(); dismiss(); @@ -62,4 +60,4 @@ public void dismiss() { e.printStackTrace(); } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/ChangeDateDialog.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/ChangeDateDialog.java index eb11fb0..1d5976b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/ChangeDateDialog.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/ChangeDateDialog.java @@ -3,29 +3,20 @@ import android.app.AlertDialog; import android.content.Context; import android.os.Bundle; -import android.widget.DatePicker; -import com.blogspot.e_kanivets.moneytracker.R; +import androidx.annotation.Nullable; + +import com.blogspot.e_kanivets.moneytracker.databinding.DialogChangeDateBinding; import java.util.Calendar; import java.util.Date; -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnClick; - -/** - * Created on 10/09/14. - * - * @author Evgenii Kanivets - */ -public class ChangeDateDialog extends AlertDialog{ +public class ChangeDateDialog extends AlertDialog { private Date date; private OnDateChangedListener listener; - @BindView(R.id.datePicker) - DatePicker datePicker; + private DialogChangeDateBinding binding; public ChangeDateDialog(Context context, Date date, OnDateChangedListener listener) { super(context); @@ -34,34 +25,31 @@ public ChangeDateDialog(Context context, Date date, OnDateChangedListener listen } @Override - protected void onCreate(Bundle savedInstanceState) { + protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.dialog_change_date); - ButterKnife.bind(ChangeDateDialog.this); + + binding = DialogChangeDateBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); Calendar cal = Calendar.getInstance(); cal.setTime(date); - datePicker.init(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), null); + binding.datePicker.init(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), null); + binding.bOk.setOnClickListener(view -> ok()); + binding.bCancel.setOnClickListener(view -> dismiss()); } - @OnClick(R.id.b_ok) public void ok() { Calendar cal = Calendar.getInstance(); - cal.set(Calendar.YEAR, datePicker.getYear()); - cal.set(Calendar.MONTH, datePicker.getMonth()); - cal.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth()); + cal.set(Calendar.YEAR, binding.datePicker.getYear()); + cal.set(Calendar.MONTH, binding.datePicker.getMonth()); + cal.set(Calendar.DAY_OF_MONTH, binding.datePicker.getDayOfMonth()); listener.OnDataChanged(cal.getTime()); dismiss(); } - @OnClick(R.id.b_cancel) - public void cancel() { - dismiss(); - } - public interface OnDateChangedListener { void OnDataChanged(Date date); } -} \ No newline at end of file +} 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 d914cef..61a1297 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 @@ -1,12 +1,10 @@ package com.blogspot.e_kanivets.moneytracker.ui.presenter; import android.content.Context; -import androidx.appcompat.widget.AppCompatSpinner; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; -import android.widget.TextView; import com.blogspot.e_kanivets.moneytracker.controller.CurrencyController; import com.blogspot.e_kanivets.moneytracker.MtApp; @@ -14,6 +12,7 @@ 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.ExchangeRateController; +import com.blogspot.e_kanivets.moneytracker.databinding.ViewSummaryAccountsBinding; import com.blogspot.e_kanivets.moneytracker.report.ReportMaker; import com.blogspot.e_kanivets.moneytracker.report.account.IAccountsReport; import com.blogspot.e_kanivets.moneytracker.ui.presenter.base.BaseSummaryPresenter; @@ -22,15 +21,6 @@ import javax.inject.Inject; -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Util class to create and manage summary header view for . - * Created on 2/26/16. - * - * @author Evgenii Kanivets - */ public class AccountsSummaryPresenter extends BaseSummaryPresenter { @Inject @@ -60,14 +50,13 @@ public AccountsSummaryPresenter(Context context) { } public View create() { - view = layoutInflater.inflate(R.layout.view_summary_accounts, null); - - final ViewHolder viewHolder = new ViewHolder(view); - view.setTag(viewHolder); + ViewSummaryAccountsBinding binding = ViewSummaryAccountsBinding.inflate(layoutInflater); + view = binding.getRoot(); + view.setTag(binding); List currencyList = currencyController.readAll(); - viewHolder.spinnerCurrency.setAdapter(new ArrayAdapter<>(context, + binding.spinnerCurrency.setAdapter(new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, currencyList)); String currency = currencyController.readDefaultCurrency(); @@ -76,12 +65,12 @@ public View create() { String item = currencyList.get(i); if (item.equals(currency)) { - viewHolder.spinnerCurrency.setSelection(i); + binding.spinnerCurrency.setSelection(i); break; } } - viewHolder.spinnerCurrency.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + binding.spinnerCurrency.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { update(); @@ -97,34 +86,21 @@ public void onNothingSelected(AdapterView parent) { } public void update() { - ViewHolder viewHolder = (ViewHolder) view.getTag(); + ViewSummaryAccountsBinding binding = (ViewSummaryAccountsBinding) view.getTag(); - String currency = (String) viewHolder.spinnerCurrency.getSelectedItem(); + String currency = (String) binding.spinnerCurrency.getSelectedItem(); IAccountsReport report = reportMaker.getAccountsReport(currency, accountController.readAll()); if (report == null) { - viewHolder.tvTotal.setTextColor(red); - viewHolder.tvTotal.setText(createRatesNeededList(currency, + binding.tvTotal.setTextColor(red); + binding.tvTotal.setText(createRatesNeededList(currency, reportMaker.currencyNeededAccounts(currency, accountController.readAll()))); - viewHolder.tvCurrency.setText(""); + binding.tvCurrency.setText(""); } else { - viewHolder.tvTotal.setTextColor(report.getTotal() >= 0 ? green : red); - viewHolder.tvTotal.setText(formatController.formatSignedAmount(report.getTotal())); - viewHolder.tvCurrency.setTextColor(report.getTotal() >= 0 ? green : red); - viewHolder.tvCurrency.setText(report.getCurrency()); - } - } - - public static class ViewHolder { - @BindView(R.id.spinnerCurrency) - AppCompatSpinner spinnerCurrency; - @BindView(R.id.tvTotal) - TextView tvTotal; - @BindView(R.id.tvCurrency) - TextView tvCurrency; - - public ViewHolder(View view) { - ButterKnife.bind(this, view); + binding.tvTotal.setTextColor(report.getTotal() >= 0 ? green : red); + binding.tvTotal.setText(formatController.formatSignedAmount(report.getTotal())); + binding.tvCurrency.setTextColor(report.getTotal() >= 0 ? green : red); + binding.tvCurrency.setText(report.getCurrency()); } } } 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 9a6a539..848e42d 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 @@ -9,6 +9,7 @@ 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.databinding.ViewSummaryRecordsBinding; import com.blogspot.e_kanivets.moneytracker.entity.Period; import com.blogspot.e_kanivets.moneytracker.report.record.IRecordReport; import com.blogspot.e_kanivets.moneytracker.ui.presenter.base.BaseSummaryPresenter; @@ -18,15 +19,6 @@ import javax.inject.Inject; -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Util class to create and manage summary header view for . - * Created on 2/26/16. - * - * @author Evgenii Kanivets - */ public class ShortSummaryPresenter extends BaseSummaryPresenter { @Inject @@ -34,7 +26,7 @@ public class ShortSummaryPresenter extends BaseSummaryPresenter { private int red; private int green; - private View view; + private ViewSummaryRecordsBinding binding; public ShortSummaryPresenter(Context context) { this.context = context; @@ -50,18 +42,21 @@ public interface ItemClickListener { } public View create(boolean shortSummary, ItemClickListener itemClickListener) { - view = layoutInflater.inflate(R.layout.view_summary_records, null); - view.findViewById(R.id.iv_more).setVisibility(shortSummary ? View.VISIBLE : View.INVISIBLE); + binding = ViewSummaryRecordsBinding.inflate(layoutInflater); + + binding.ivMore.setVisibility(shortSummary ? View.VISIBLE : View.INVISIBLE); + binding.lvSummary.setClickable(false); + binding.cvSummary.setClickable(true); + + View view = binding.getRoot(); view.setEnabled(false); - view.findViewById(R.id.lvSummary).setClickable(false); - view.findViewById(R.id.cvSummary).setClickable(true); - view.setTag(new ViewHolder(view, itemClickListener)); + view.setTag(new ViewHolder(binding, itemClickListener)); return view; } public void update(IRecordReport report, String currency, List ratesNeeded) { - ViewHolder viewHolder = (ViewHolder) view.getTag(); + ViewHolder viewHolder = (ViewHolder) binding.getRoot().getTag(); if (report == null) { viewHolder.tvTotalIncome.setText(""); viewHolder.tvTotalExpense.setText(""); @@ -107,24 +102,22 @@ private String formatPeriod(Period period) { public static class ViewHolder extends RecyclerView.ViewHolder { - @BindView(R.id.tvPeriod) TextView tvPeriod; - @BindView(R.id.tvTotalIncome) TextView tvTotalIncome; - @BindView(R.id.tvTotalExpense) TextView tvTotalExpense; - @BindView(R.id.tvTotal) TextView tvTotal; - public ViewHolder(View view, final ItemClickListener itemClickListener) { - super(view); - ButterKnife.bind(this, view); - view.findViewById(R.id.cvSummary).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (itemClickListener != null) - itemClickListener.invoke(); - } + public ViewHolder(ViewSummaryRecordsBinding binding, final ItemClickListener itemClickListener) { + super(binding.getRoot()); + + this.tvPeriod = binding.tvPeriod; + this.tvTotalIncome = binding.tvTotalIncome; + this.tvTotalExpense = binding.tvTotalExpense; + this.tvTotal = binding.tvTotal; + + binding.getRoot().findViewById(R.id.cvSummary).setOnClickListener(v -> { + if (itemClickListener != null) + itemClickListener.invoke(); }); } } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/AccountValidator.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/AccountValidator.java index 6d39cc9..46f1e1b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/AccountValidator.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/AccountValidator.java @@ -2,53 +2,35 @@ import android.content.Context; import androidx.annotation.NonNull; -import com.google.android.material.textfield.TextInputLayout; -import androidx.appcompat.widget.AppCompatSpinner; -import android.view.View; -import android.widget.EditText; + +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityAddAccountBinding; import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Util class for Account validation. - * Created on 06.12.2016. - * - * @author Evgenii Kanivets - */ - public class AccountValidator implements IValidator { @NonNull private final Context context; - @BindView(R.id.til_title) - TextInputLayout tilTitle; - @BindView(R.id.etTitle) - EditText etTitle; - @BindView(R.id.til_init_sum) - TextInputLayout tilInitSum; - @BindView(R.id.et_init_sum) - EditText etInitSum; - @BindView(R.id.spinner) - AppCompatSpinner spinner; + private ActivityAddAccountBinding binding; - public AccountValidator(@NonNull Context context, @NonNull View view) { + public AccountValidator( + @NonNull Context context, + @NonNull ActivityAddAccountBinding binding + ) { this.context = context; - ButterKnife.bind(this, view); + this.binding = binding; initTextWatchers(); } @Override public boolean validate() { - String title = etTitle.getText().toString().trim(); + String title = binding.etTitle.getText().toString().trim(); double initSum = Double.MAX_VALUE; try { - initSum = Double.parseDouble(etInitSum.getText().toString().trim()); + initSum = Double.parseDouble(binding.etInitSum.getText().toString().trim()); } catch (NumberFormatException e) { e.printStackTrace(); } @@ -56,18 +38,18 @@ public boolean validate() { boolean valid = true; if (title.isEmpty()) { - tilTitle.setError(context.getString(R.string.field_cant_be_empty)); + binding.tilTitle.setError(context.getString(R.string.field_cant_be_empty)); valid = false; } if (initSum == Double.MAX_VALUE) { - tilInitSum.setError(context.getString(R.string.field_cant_be_empty)); + binding.tilInitSum.setError(context.getString(R.string.field_cant_be_empty)); initSum = 0; valid = false; } if (Math.abs(initSum) > MAX_ABS_VALUE) { - tilInitSum.setError(context.getString(R.string.too_rich_or_poor)); + binding.tilInitSum.setError(context.getString(R.string.too_rich_or_poor)); valid = false; } @@ -75,7 +57,7 @@ public boolean validate() { } private void initTextWatchers() { - etTitle.addTextChangedListener(new ClearErrorTextWatcher(tilTitle)); - etInitSum.addTextChangedListener(new ClearErrorTextWatcher(tilInitSum)); + binding.etTitle.addTextChangedListener(new ClearErrorTextWatcher(binding.tilTitle)); + binding.etInitSum.addTextChangedListener(new ClearErrorTextWatcher(binding.tilInitSum)); } } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/EditAccountValidator.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/EditAccountValidator.java index 1dc325d..7fb2077 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/EditAccountValidator.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/EditAccountValidator.java @@ -1,43 +1,35 @@ package com.blogspot.e_kanivets.moneytracker.util.validator; import android.content.Context; + import androidx.annotation.NonNull; -import com.google.android.material.textfield.TextInputLayout; -import android.view.View; -import android.widget.EditText; -import butterknife.BindView; -import butterknife.ButterKnife; + import com.blogspot.e_kanivets.moneytracker.R; +import com.blogspot.e_kanivets.moneytracker.databinding.FragmentEditAccountBinding; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; -/** - * Util class for EditAccount validation. - * Created on 16.09.2018. - * - * @author Evgenii Kanivets - */ - public class EditAccountValidator implements IValidator { - @NonNull private final Context context; - - @BindView(R.id.tilTitle) TextInputLayout tilTitle; - @BindView(R.id.etTitle) EditText etTitle; - @BindView(R.id.tilGoal) TextInputLayout tilGoal; - @BindView(R.id.etGoal) EditText etGoal; + @NonNull + private final Context context; + private final FragmentEditAccountBinding binding; - public EditAccountValidator(@NonNull Context context, @NonNull View view) { + public EditAccountValidator( + @NonNull Context context, + @NonNull FragmentEditAccountBinding binding + ) { this.context = context; - ButterKnife.bind(this, view); + this.binding = binding; initTextWatchers(); } - @Override public boolean validate() { - String title = etTitle.getText().toString().trim(); + @Override + public boolean validate() { + String title = binding.etTitle.getText().toString().trim(); double goal = Double.MAX_VALUE; try { - goal = Double.parseDouble(etGoal.getText().toString().trim()); + goal = Double.parseDouble(binding.etGoal.getText().toString().trim()); } catch (NumberFormatException e) { e.printStackTrace(); } @@ -45,18 +37,18 @@ public EditAccountValidator(@NonNull Context context, @NonNull View view) { boolean valid = true; if (title.isEmpty()) { - tilTitle.setError(context.getString(R.string.field_cant_be_empty)); + binding.tilTitle.setError(context.getString(R.string.field_cant_be_empty)); valid = false; } if (goal == Double.MAX_VALUE) { - tilGoal.setError(context.getString(R.string.field_cant_be_empty)); + binding.tilGoal.setError(context.getString(R.string.field_cant_be_empty)); goal = 0; valid = false; } if (Math.abs(goal) > MAX_ABS_VALUE) { - tilGoal.setError(context.getString(R.string.too_rich_or_poor)); + binding.tilGoal.setError(context.getString(R.string.too_rich_or_poor)); valid = false; } @@ -64,7 +56,7 @@ public EditAccountValidator(@NonNull Context context, @NonNull View view) { } private void initTextWatchers() { - etTitle.addTextChangedListener(new ClearErrorTextWatcher(tilTitle)); - etGoal.addTextChangedListener(new ClearErrorTextWatcher(tilGoal)); + binding.etTitle.addTextChangedListener(new ClearErrorTextWatcher(binding.tilTitle)); + binding.etGoal.addTextChangedListener(new ClearErrorTextWatcher(binding.tilGoal)); } } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/ExchangeRatePairValidator.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/ExchangeRatePairValidator.java index 9bd1617..be5c90a 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/ExchangeRatePairValidator.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/ExchangeRatePairValidator.java @@ -2,47 +2,26 @@ import android.content.Context; import androidx.annotation.NonNull; -import com.google.android.material.textfield.TextInputLayout; -import androidx.appcompat.widget.AppCompatSpinner; -import android.view.View; -import android.widget.EditText; import android.widget.Toast; import com.blogspot.e_kanivets.moneytracker.R; +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityAddExchangeRateBinding; import com.blogspot.e_kanivets.moneytracker.entity.ExchangeRatePair; -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Util class for Transfer validation. - * Created on 13.12.2016. - * - * @author Evgenii Kanivets - */ - @SuppressWarnings("WeakerAccess") public class ExchangeRatePairValidator implements IValidator { @NonNull private final Context context; - @BindView(R.id.spinner_from_currency) - AppCompatSpinner spinnerFromCurrency; - @BindView(R.id.spinner_to_currency) - AppCompatSpinner spinnerToCurrency; - @BindView(R.id.til_buy) - TextInputLayout tilBuy; - @BindView(R.id.et_buy) - EditText etBuy; - @BindView(R.id.til_sell) - TextInputLayout tilSell; - @BindView(R.id.et_sell) - EditText etSell; - - public ExchangeRatePairValidator(@NonNull Context context, @NonNull View view) { + private ActivityAddExchangeRateBinding binding; + + public ExchangeRatePairValidator( + @NonNull Context context, + @NonNull ActivityAddExchangeRateBinding binding + ) { this.context = context; - ButterKnife.bind(this, view); + this.binding = binding; initTextWatchers(); } @@ -51,15 +30,15 @@ public boolean validate() { boolean valid = true; String fromCurrency = null; - if (spinnerFromCurrency.isEnabled()) { - fromCurrency = (String) spinnerFromCurrency.getSelectedItem(); + if (binding.spinnerFromCurrency.isEnabled()) { + fromCurrency = (String) binding.spinnerFromCurrency.getSelectedItem(); } else { valid = false; } String toCurrency = null; - if (spinnerToCurrency.isEnabled()) { - toCurrency = (String) spinnerToCurrency.getSelectedItem(); + if (binding.spinnerToCurrency.isEnabled()) { + toCurrency = (String) binding.spinnerToCurrency.getSelectedItem(); } else { valid = false; } @@ -71,37 +50,37 @@ public boolean validate() { double amountBuy = Double.MAX_VALUE; try { - amountBuy = Double.parseDouble(etBuy.getText().toString().trim()); + amountBuy = Double.parseDouble(binding.etBuy.getText().toString().trim()); } catch (Exception e) { e.printStackTrace(); } if (amountBuy == Double.MAX_VALUE) { - tilBuy.setError(context.getString(R.string.field_cant_be_empty)); + binding.tilBuy.setError(context.getString(R.string.field_cant_be_empty)); amountBuy = 0; valid = false; } if (amountBuy > MAX_ABS_VALUE) { - tilBuy.setError(context.getString(R.string.too_much_for_exchange)); + binding.tilBuy.setError(context.getString(R.string.too_much_for_exchange)); valid = false; } double amountSell = Double.MAX_VALUE; try { - amountSell = Double.parseDouble(etSell.getText().toString().trim()); + amountSell = Double.parseDouble(binding.etSell.getText().toString().trim()); } catch (Exception e) { e.printStackTrace(); } if (amountSell == Double.MAX_VALUE) { - tilSell.setError(context.getString(R.string.field_cant_be_empty)); + binding.tilSell.setError(context.getString(R.string.field_cant_be_empty)); amountSell = 0; valid = false; } if (amountSell > MAX_ABS_VALUE) { - tilSell.setError(context.getString(R.string.too_much_for_exchange)); + binding.tilSell.setError(context.getString(R.string.too_much_for_exchange)); valid = false; } @@ -109,7 +88,7 @@ public boolean validate() { } private void initTextWatchers() { - etBuy.addTextChangedListener(new ClearErrorTextWatcher(tilBuy)); - etSell.addTextChangedListener(new ClearErrorTextWatcher(tilSell)); + binding.etBuy.addTextChangedListener(new ClearErrorTextWatcher(binding.tilBuy)); + binding.etSell.addTextChangedListener(new ClearErrorTextWatcher(binding.tilSell)); } } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/RecordValidator.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/RecordValidator.java index 7afbc7a..9910436 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/RecordValidator.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/RecordValidator.java @@ -2,49 +2,26 @@ import android.content.Context; import androidx.annotation.NonNull; -import com.google.android.material.textfield.TextInputLayout; -import androidx.appcompat.widget.AppCompatSpinner; -import android.view.View; -import android.widget.EditText; import android.widget.Toast; import com.blogspot.e_kanivets.moneytracker.R; +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityAddRecordBinding; import com.blogspot.e_kanivets.moneytracker.entity.data.Record; -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Util class for Account validation. - * Created on 06.12.2016. - * - * @author Evgenii Kanivets - */ - public class RecordValidator implements IValidator { @NonNull private final Context context; - @BindView(R.id.til_title) - TextInputLayout tilTitle; - @BindView(R.id.etTitle) - EditText etTitle; - @BindView(R.id.til_category) - TextInputLayout tilCategory; - @BindView(R.id.etCategory) - EditText etCategory; - @BindView(R.id.til_price) - TextInputLayout tilPrice; - @BindView(R.id.etPrice) - EditText etPrice; - @BindView(R.id.spinnerAccount) - AppCompatSpinner spinnerAccount; - - public RecordValidator(@NonNull Context context, @NonNull View view) { + private final ActivityAddRecordBinding binding; + + public RecordValidator( + @NonNull Context context, + @NonNull ActivityAddRecordBinding binding + ) { this.context = context; + this.binding = binding; - ButterKnife.bind(this, view); initTextWatchers(); } @@ -52,33 +29,33 @@ public RecordValidator(@NonNull Context context, @NonNull View view) { public boolean validate() { boolean valid = true; - String category = etCategory.getText().toString().trim(); + String category = binding.etCategory.getText().toString().trim(); if (category.isEmpty()) { - tilCategory.setError(context.getString(R.string.field_cant_be_empty)); + binding.tilCategory.setError(context.getString(R.string.field_cant_be_empty)); valid = false; } //Check if price is valid double price = Double.MAX_VALUE; try { - price = Double.parseDouble(etPrice.getText().toString()); + price = Double.parseDouble(binding.etPrice.getText().toString()); } catch (NumberFormatException e) { e.printStackTrace(); } if (price == Double.MAX_VALUE) { - tilPrice.setError(context.getString(R.string.field_cant_be_empty)); + binding.tilPrice.setError(context.getString(R.string.field_cant_be_empty)); price = 0; valid = false; } if (price > MAX_ABS_VALUE) { - tilPrice.setError(context.getString(R.string.too_rich)); + binding.tilPrice.setError(context.getString(R.string.too_rich)); valid = false; } - if (!spinnerAccount.isEnabled()) { + if (!binding.spinnerAccount.isEnabled()) { Toast.makeText(context, R.string.one_account_needed, Toast.LENGTH_SHORT).show(); valid = false; } @@ -87,8 +64,8 @@ public boolean validate() { } private void initTextWatchers() { - etPrice.addTextChangedListener(new ClearErrorTextWatcher(tilPrice)); - etTitle.addTextChangedListener(new ClearErrorTextWatcher(tilTitle)); - etCategory.addTextChangedListener(new ClearErrorTextWatcher(tilCategory)); + binding.etPrice.addTextChangedListener(new ClearErrorTextWatcher(binding.tilPrice)); + binding.etTitle.addTextChangedListener(new ClearErrorTextWatcher(binding.tilTitle)); + binding.etCategory.addTextChangedListener(new ClearErrorTextWatcher(binding.tilCategory)); } } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/TransferValidator.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/TransferValidator.java index 0dbe89d..e982e70 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/TransferValidator.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/TransferValidator.java @@ -2,47 +2,26 @@ import android.content.Context; import androidx.annotation.NonNull; -import com.google.android.material.textfield.TextInputLayout; -import androidx.appcompat.widget.AppCompatSpinner; -import android.view.View; -import android.widget.EditText; import android.widget.Toast; import com.blogspot.e_kanivets.moneytracker.R; +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityTransferBinding; import com.blogspot.e_kanivets.moneytracker.entity.data.Transfer; -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Util class for Transfer validation. - * Created on 07.12.2016. - * - * @author Evgenii Kanivets - */ - @SuppressWarnings("WeakerAccess") public class TransferValidator implements IValidator { @NonNull private final Context context; - @BindView(R.id.spinner_from) - AppCompatSpinner spinnerFrom; - @BindView(R.id.spinner_to) - AppCompatSpinner spinnerTo; - @BindView(R.id.til_from_amount) - TextInputLayout tilFromAmount; - @BindView(R.id.et_from_amount) - EditText etFromAmount; - @BindView(R.id.til_to_amount) - TextInputLayout tilToAmount; - @BindView(R.id.et_to_amount) - EditText etToAmount; - - public TransferValidator(@NonNull Context context, @NonNull View view) { + private ActivityTransferBinding binding; + + public TransferValidator( + @NonNull Context context, + @NonNull ActivityTransferBinding binding + ) { this.context = context; - ButterKnife.bind(this, view); + this.binding = binding; initTextWatchers(); } @@ -50,48 +29,48 @@ public TransferValidator(@NonNull Context context, @NonNull View view) { public boolean validate() { boolean valid = true; - if (!spinnerFrom.isEnabled()) { + if (!binding.spinnerFrom.isEnabled()) { valid = false; } - if (!spinnerTo.isEnabled()) { + if (!binding.spinnerTo.isEnabled()) { Toast.makeText(context, R.string.one_account_needed, Toast.LENGTH_SHORT).show(); valid = false; } double fromAmount = Double.MAX_VALUE; try { - fromAmount = Double.parseDouble(etFromAmount.getText().toString()); + fromAmount = Double.parseDouble(binding.etFromAmount.getText().toString()); } catch (NumberFormatException e) { e.printStackTrace(); } if (fromAmount == Double.MAX_VALUE) { - tilFromAmount.setError(context.getString(R.string.field_cant_be_empty)); + binding.tilFromAmount.setError(context.getString(R.string.field_cant_be_empty)); fromAmount = 0; valid = false; } if (fromAmount > MAX_ABS_VALUE) { - tilFromAmount.setError(context.getString(R.string.too_much_for_transfer)); + binding.tilFromAmount.setError(context.getString(R.string.too_much_for_transfer)); valid = false; } double toAmount = Double.MAX_VALUE; try { - toAmount = Double.parseDouble(etToAmount.getText().toString()); + toAmount = Double.parseDouble(binding.etToAmount.getText().toString()); } catch (NumberFormatException e) { e.printStackTrace(); } if (toAmount == Double.MAX_VALUE) { - tilToAmount.setError(context.getString(R.string.field_cant_be_empty)); + binding.tilToAmount.setError(context.getString(R.string.field_cant_be_empty)); toAmount = 0; valid = false; } if (toAmount > MAX_ABS_VALUE) { - tilToAmount.setError(context.getString(R.string.too_much_for_transfer)); + binding.tilToAmount.setError(context.getString(R.string.too_much_for_transfer)); valid = false; } @@ -99,7 +78,7 @@ public boolean validate() { } private void initTextWatchers() { - etFromAmount.addTextChangedListener(new ClearErrorTextWatcher(tilFromAmount)); - etToAmount.addTextChangedListener(new ClearErrorTextWatcher(tilToAmount)); + binding.etFromAmount.addTextChangedListener(new ClearErrorTextWatcher(binding.tilFromAmount)); + binding.etToAmount.addTextChangedListener(new ClearErrorTextWatcher(binding.tilToAmount)); } } diff --git a/app/src/main/res/layout/activity_accounts.xml b/app/src/main/res/layout/activity_accounts.xml index 0bcafff..4475d8b 100644 --- a/app/src/main/res/layout/activity_accounts.xml +++ b/app/src/main/res/layout/activity_accounts.xml @@ -1,26 +1,58 @@ + + + + + + + + - + - + - +