diff --git a/app/.gitignore b/app/.gitignore index e0fccc9..7c61bf7 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1,3 +1,3 @@ /build - -*._.DS_Store \ No newline at end of file +google-services.json +*._.DS_Store diff --git a/app/build.gradle b/app/build.gradle index b78476b..d418be2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,33 +1,21 @@ -buildscript { - repositories { - maven { url 'https://maven.fabric.io/public' } - } - - dependencies { - classpath 'io.fabric.tools:gradle:1.+' - } -} apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' -apply plugin: 'io.fabric' - -repositories { - maven { url 'https://maven.fabric.io/public' } - mavenCentral() -} +apply plugin: 'com.google.gms.google-services' +apply plugin: 'com.google.firebase.crashlytics' android { - compileSdkVersion 29 - buildToolsVersion '27.0.3' + namespace = "com.blogspot.e_kanivets.moneytracker" + + compileSdkVersion 34 defaultConfig { applicationId 'com.blogspot.e_kanivets.moneytracker' minSdkVersion 21 - targetSdkVersion 29 + targetSdkVersion 34 - versionCode 33 - versionName '2.1.1' + versionCode 38 + versionName '2.2.0' } + signingConfigs { releaseConfig { storeFile file('mt_keystore.jks') @@ -36,6 +24,7 @@ android { keyPassword 'moneytracker' } } + buildTypes { release { debuggable false @@ -60,44 +49,42 @@ android { } } - lintOptions { - checkReleaseBuilds false + lint { abortOnError false + checkReleaseBuilds false } - dexOptions { - preDexLibraries = false + + compileOptions { + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 } - productFlavors { + + buildFeatures { + viewBinding true + buildConfig true } } -apply plugin: 'com.getkeepsafe.dexcount' - dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - - proprietaryCompile('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') { - transitive = true - } + 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.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' + implementation 'com.dropbox.core:dropbox-core-sdk:4.0.0' // Dropbox Core API - compile 'com.android.support:support-v4:27.1.1' - compile 'com.android.support:appcompat-v7:27.1.1' - compile 'com.android.support:design:27.1.1' - compile 'com.jakewharton:butterknife:8.5.1' // View annotation bindings - annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1' // ButterKnife compiler - compile 'com.google.dagger:dagger:2.11' // Dependency injection tool - compile 'com.github.PhilJay:MPAndroidChart:v2.2.4' // Charts - compile 'com.jakewharton.timber:timber:4.1.2' // Advanced logging tool - compile 'com.android.support.constraint:constraint-layout:1.1.3' - compile 'com.dropbox.core:dropbox-core-sdk:3.0.5' // Dropbox Core API + testImplementation 'junit:junit:4.13.2' + testImplementation 'org.mockito:mockito-core:3.5.13' + 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.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' - testCompile 'junit:junit:4.12' - testCompile 'org.mockito:mockito-core:2.8.9' - androidTestCompile 'com.crittercism.dexmaker:dexmaker:1.4' - androidTestCompile 'com.crittercism.dexmaker:dexmaker-dx:1.4' - androidTestCompile 'com.crittercism.dexmaker:dexmaker-mockito:1.4' - annotationProcessor 'com.google.dagger:dagger-compiler:2.11' - provided 'org.glassfish:javax.annotation:10.0-b28' - compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'com.android.support:cardview-v7:27.1.1' + implementation 'com.google.firebase:firebase-analytics:19.0.2' + implementation 'com.google.firebase:firebase-crashlytics:18.2.3' } diff --git a/app/fabric.properties b/app/fabric.properties deleted file mode 100644 index 055320f..0000000 --- a/app/fabric.properties +++ /dev/null @@ -1,3 +0,0 @@ -#Contains API Secret used to validate your application. Commit to internal source control; avoid making secret public. -#Wed Dec 14 10:33:29 EET 2016 -apiSecret=82d758bae86a87ef822afbfc6f3c016c28c0b43f1d46862ebf37405141fa3414 diff --git a/app/src/free/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java b/app/src/free/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java index df51466..ec7085b 100644 --- a/app/src/free/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java +++ b/app/src/free/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.util; import android.content.Context; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; /** diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 26d811e..beec760 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,6 +11,7 @@ android:theme="@style/Theme.Default"> @@ -29,7 +30,7 @@ android:name=".activity.record.AddRecordActivity" android:screenOrientation="portrait" android:theme="@style/Theme.Default" - android:windowSoftInputMode="adjustResize" /> + android:windowSoftInputMode="adjustPan" /> @@ -100,6 +102,7 @@ + @@ -109,7 +112,7 @@ android:value="955ae4864ae2a833aeda5b62631512524288adf8" /> @@ -122,4 +125,4 @@ - \ No newline at end of file + diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..8411551 Binary files /dev/null and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png deleted file mode 100644 index d46e2c3..0000000 Binary files a/app/src/main/ic_launcher-web.png and /dev/null differ 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 index 59c0960..05293a3 100644 --- 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 @@ -1,25 +1,26 @@ 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; +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityAboutBinding; public class AboutActivity extends BaseBackActivity { - @BindView(R.id.tv_about) - TextView tvAbout; + + private ActivityAboutBinding binding; @Override - protected int getContentViewId() { - return R.layout.activity_about; + protected void onCreate(android.os.Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = ActivityAboutBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + initToolbar(); + initViews(); } - @Override - protected void initViews() { - super.initViews(); - tvAbout.setMovementMethod(LinkMovementMethod.getInstance()); + private void initViews() { + binding.tvAbout.setMovementMethod(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 index ee71bfc..9655bc4 100644 --- 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 @@ -6,6 +6,8 @@ import android.preference.Preference; import android.preference.PreferenceFragment; +import androidx.annotation.Nullable; + import com.blogspot.e_kanivets.moneytracker.BuildConfig; import com.blogspot.e_kanivets.moneytracker.MtApp; import com.blogspot.e_kanivets.moneytracker.R; @@ -14,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.CurrencyController; +import com.blogspot.e_kanivets.moneytracker.databinding.ActivitySettingsBinding; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; import java.util.ArrayList; @@ -24,15 +27,22 @@ public class SettingsActivity extends BaseBackActivity { @SuppressWarnings("unused") private static final String TAG = "SettingsActivity"; - @Override protected int getContentViewId() { - return R.layout.activity_settings; - } + private ActivitySettingsBinding binding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); - @Override protected void initViews() { - super.initViews(); + binding = ActivitySettingsBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + initToolbar(); + initViews(); + } + private void initViews() { // Display the fragment as the main content. - getFragmentManager().beginTransaction().replace(R.id.contentView, new SettingsFragment()).commit(); + getFragmentManager().beginTransaction().replace(binding.contentView.getId(), new SettingsFragment()).commit(); } public static class SettingsFragment extends PreferenceFragment { 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 aa8c50f..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 android.support.v7.app.AppCompatActivity; + +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 706be80..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 android.support.v7.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 8ccf29e..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 android.support.v7.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 d3cd883..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.support.v4.view.ViewPager.OnPageChangeListener +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 0de51ed..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) - arguments?.let { arguments -> account = arguments.getParcelable(KEY_ACCOUNT) } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initViews() } - override fun initViews(view: View) { - recyclerView.adapter = RecordAdapter(requireContext(), getRecordItems(), false) + private fun initData() { + MtApp.get().appComponent.inject(this@AccountOperationsFragment) + arguments?.let { arguments -> account = arguments.getParcelable(KEY_ACCOUNT)!! } + } + + private fun initViews() { + binding.recyclerView.adapter = RecordAdapter(requireContext(), getRecordItems(), false) } private fun getRecordItems(): List { @@ -59,10 +80,11 @@ class AccountOperationsFragment : BaseFragment() { val type = if (it.fromAccountId == account.id) Record.TYPE_EXPENSE else Record.TYPE_INCOME val title = constructRecordTitle(type, it) val category = Category(getString(R.string.transfer).toLowerCase()) + val notes = getString(R.string.account_transfer) val price = if (type == Record.TYPE_EXPENSE) it.fromAmount else it.toAmount val decimals = if (type == Record.TYPE_EXPENSE) it.fromDecimals else it.toDecimals - records += Record(it.id, it.time, type, title, category, price, account, account.currency, decimals) + records += Record(it.id, it.time, type, title, category, notes, price, account, account.currency, decimals) } return records.toList() @@ -88,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 f61a226..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 android.support.design.widget.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) - arguments?.let { arguments -> account = arguments.getParcelable(KEY_ACCOUNT) } + 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(context!!, 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 208e505..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,27 +1,16 @@ package com.blogspot.e_kanivets.moneytracker.activity.base; import android.app.ProgressDialog; -import android.os.Bundle; -import android.support.annotation.LayoutRes; -import android.support.annotation.Nullable; -import android.support.annotation.StringRes; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import android.widget.Toast; import com.blogspot.e_kanivets.moneytracker.MtApp; import com.blogspot.e_kanivets.moneytracker.di.AppComponent; -import butterknife.ButterKnife; - -/** - * Base implementation of {@link android.support.v7.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 6d57430..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 android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; +import androidx.appcompat.app.ActionBar; +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 a9a5f36..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 @@ -1,12 +1,16 @@ package com.blogspot.e_kanivets.moneytracker.activity.base; import android.content.Intent; -import android.support.annotation.NonNull; -import android.support.design.widget.NavigationView; -import android.support.v4.view.GravityCompat; -import android.support.v4.widget.DrawerLayout; -import android.support.v7.app.ActionBarDrawerToggle; -import android.support.v7.widget.Toolbar; +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 android.support.v7.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 d3d5a73..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 android.support.v4.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.blogspot.e_kanivets.moneytracker.MtApp -import com.blogspot.e_kanivets.moneytracker.di.AppComponent - -abstract class BaseFragment : Fragment() { - - protected val appComponent: AppComponent = MtApp.get().appComponent - - protected abstract val contentViewId: Int - - protected abstract fun initData() - - protected abstract fun initViews(view: View) - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - initData() - } - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = - inflater.inflate(contentViewId, container, false) - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - initViews(view) - } -} 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 16b6136..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,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.activity.charts; -import android.support.design.widget.TabLayout; -import android.support.v4.app.Fragment; -import android.support.v4.view.ViewPager; +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityChartsBinding; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity; @@ -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 f9222ec..dfea78d 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 @@ -1,27 +1,18 @@ package com.blogspot.e_kanivets.moneytracker.activity.charts.fragment; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import android.view.LayoutInflater; 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,22 @@ 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); + + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initViews(); } - private void initViews(@Nullable View rootView) { - if (rootView == null) return; - ButterKnife.bind(this, rootView); + private void initViews() { + binding = FragmentGraphBinding.inflate(getLayoutInflater()); if (monthReport == null) { - barChart.setNoDataText(noDataText); + binding.barChart.setNoDataText(noDataText); } else { BarChartConverter barChartConverter = new BarChartConverter(getActivity(), monthReport); @@ -98,13 +93,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 d71f919..36480c4 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 @@ -1,33 +1,24 @@ package com.blogspot.e_kanivets.moneytracker.activity.charts.fragment; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; 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 @@ -66,10 +57,11 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, private void initViews(@Nullable View rootView) { if (rootView == null) return; - ButterKnife.bind(this, rootView); + + binding = FragmentSummaryBinding.inflate(getLayoutInflater()); 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 bad88bc..81b1ece 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 android.support.annotation.Nullable; -import android.support.v7.widget.AppCompatSpinner; +import androidx.annotation.Nullable; + +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,40 @@ 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; - - @Override - protected int getContentViewId() { - return R.layout.activity_add_exchange_rate; - } + private ActivityAddExchangeRateBinding binding; @Override - protected boolean initData() { - boolean result = super.initData(); - getAppComponent().inject(AddExchangeRateActivity.this); + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); - exchangeRatePair = getIntent().getParcelableExtra(KEY_EXCHANGE_RATE); + binding = ActivityAddExchangeRateBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); - return result; + initData(); + initToolbar(); + initViews(); } - @Override - protected void initViews() { - super.initViews(); + private boolean initData() { + getAppComponent().inject(AddExchangeRateActivity.this); + return true; + } - 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 +83,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 +103,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 +122,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 d0a4ba3..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 android.support.v7.app.AppCompatActivity; + +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 3c5c29d..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.support.annotation.NonNull; -import android.support.v7.app.AlertDialog; -import android.view.View; -import android.widget.ListView; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; 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 fb2f979..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 android.support.annotation.NonNull; -import android.support.v4.content.FileProvider; -import android.support.v7.app.AlertDialog; + +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 39b87f4..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,7 +5,8 @@ import android.app.Activity import android.app.DatePickerDialog import android.app.TimePickerDialog import android.content.res.ColorStateList -import android.support.v4.content.ContextCompat +import android.os.Bundle +import androidx.core.content.ContextCompat import android.text.InputFilter import android.text.Spanned import android.text.format.DateFormat @@ -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,9 +101,10 @@ class AddRecordActivity : BaseBackActivity() { if (mode == Mode.MODE_EDIT) { record?.let { record -> - etTitle.setText(record.title) - etCategory.setText(record.category?.name.orEmpty()) - 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)) } } @@ -100,45 +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()) + 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() } } } @@ -178,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() } @@ -201,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() } @@ -233,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() { @@ -260,10 +270,11 @@ class AddRecordActivity : BaseBackActivity() { return false } - var title = etTitle.text.toString().trim() - val category = etCategory.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 @@ -271,10 +282,10 @@ class AddRecordActivity : BaseBackActivity() { if (mode == Mode.MODE_ADD) { recordController.create(Record(timestamp, type, title, - Category(category), price, account, account.currency)) + Category(category), notes, price, account, account.currency)) } else if (mode == Mode.MODE_EDIT) { recordController.update(Record(record?.id ?: -1, - timestamp, type, title, Category(category), price, account, account.currency)) + timestamp, type, title, Category(category), notes, price, account, account.currency)) } autoCompleter.addRecordTitleCategoryPair(title, category) @@ -285,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 242dbd2..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.support.v7.app.AppCompatActivity -import android.support.v7.widget.RecyclerView +import android.os.Bundle import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.RecyclerView 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 initData(): Boolean { - super.initData() - appComponent.inject(this) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) - 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 } - -} \ No newline at end of file +} 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/GeneralViewPagerAdapter.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/GeneralViewPagerAdapter.kt index 68325c7..d128a34 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/GeneralViewPagerAdapter.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/GeneralViewPagerAdapter.kt @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.adapter -import android.support.v4.app.Fragment -import android.support.v4.app.FragmentManager -import android.support.v4.app.FragmentPagerAdapter +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter import java.util.ArrayList class GeneralViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager) { 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 5a6f740..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 @@ -2,32 +2,21 @@ import android.annotation.SuppressLint; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; -import android.widget.TextView; import com.blogspot.e_kanivets.moneytracker.MtApp; -import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.controller.FormatController; +import com.blogspot.e_kanivets.moneytracker.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 86781ae..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 @@ -1,18 +1,17 @@ package com.blogspot.e_kanivets.moneytracker.adapter import android.content.Context -import android.support.v4.content.ContextCompat -import android.support.v7.widget.RecyclerView +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 cc3f034..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 @@ -1,20 +1,21 @@ package com.blogspot.e_kanivets.moneytracker.adapter import android.content.Context -import android.support.v4.content.ContextCompat -import android.support.v7.widget.RecyclerView +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.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 } - -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CurrencyController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CurrencyController.java index 706d2e8..ec74ae4 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CurrencyController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CurrencyController.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.controller; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/PreferenceController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/PreferenceController.java index 16d9d14..4458c6a 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/PreferenceController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/PreferenceController.java @@ -3,8 +3,8 @@ import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.R; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxBackupAsyncTask.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxBackupAsyncTask.java index 9174807..895961f 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxBackupAsyncTask.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxBackupAsyncTask.java @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.controller.backup.tasks; import android.os.AsyncTask; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.backup.BackupController; import com.dropbox.core.DbxException; import com.dropbox.core.v2.DbxClientV2; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxFetchBackupListAsyncTask.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxFetchBackupListAsyncTask.java index 1d35451..40ff182 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxFetchBackupListAsyncTask.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxFetchBackupListAsyncTask.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.controller.backup.tasks; import android.os.AsyncTask; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.backup.BackupController; import com.dropbox.core.DbxException; import com.dropbox.core.v2.DbxClientV2; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxRemoveBackupAsyncTask.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxRemoveBackupAsyncTask.java index db42e7a..6bbe7e0 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxRemoveBackupAsyncTask.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxRemoveBackupAsyncTask.java @@ -1,18 +1,11 @@ package com.blogspot.e_kanivets.moneytracker.controller.backup.tasks; import android.os.AsyncTask; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.backup.BackupController; import com.dropbox.core.DbxException; import com.dropbox.core.v2.DbxClientV2; -import com.dropbox.core.v2.files.DeleteResult; -import com.dropbox.core.v2.files.FileMetadata; import com.dropbox.core.v2.files.Metadata; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; public class DropboxRemoveBackupAsyncTask extends AsyncTask { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxRestoreBackupAsyncTask.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxRestoreBackupAsyncTask.java index c0c5f3b..87048fd 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxRestoreBackupAsyncTask.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxRestoreBackupAsyncTask.java @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.controller.backup.tasks; import android.os.AsyncTask; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.backup.BackupController; import com.dropbox.core.DbxException; import com.dropbox.core.v2.DbxClientV2; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/base/BaseController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/base/BaseController.java index fde34f4..a8b4c8b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/base/BaseController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/base/BaseController.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.controller.base; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.repo.base.IRepo; @@ -55,4 +55,4 @@ public List readAll() { public List readWithCondition(String condition, String[] args) { return repo.readWithCondition(condition, args); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/AccountController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/AccountController.java index e633460..f1f398b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/AccountController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/AccountController.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.controller.data; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController; import com.blogspot.e_kanivets.moneytracker.controller.base.BaseController; @@ -207,4 +207,4 @@ private Account substituteCurrency(Account account) { account.getDecimals(), account.getGoal(), account.isArchived(), account.getColor()); } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryController.java index dd8bbca..1173cd5 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryController.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.controller.data; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/ExchangeRateController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/ExchangeRateController.java index 9154915..ab61e21 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/ExchangeRateController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/ExchangeRateController.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.controller.data; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.base.BaseController; import com.blogspot.e_kanivets.moneytracker.entity.ExchangeRatePair; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java index c15d524..1bd2b70 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.controller.data; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; @@ -115,7 +115,7 @@ record = validateRecord(record); completedRecordList.add( new Record(record.getId(), record.getTime(), record.getType(), record.getTitle(), category, - record.getPrice(), account, currency, record.getDecimals())); + record.getNotes(), record.getPrice(), account, currency, record.getDecimals())); } return completedRecordList; @@ -143,6 +143,6 @@ private Record validateRecord(@NonNull Record record) { Category category = categoryController.readOrCreate(record.getCategory().getName()); return new Record(record.getId(), record.getTime(), record.getType(), record.getTitle(), category, - record.getPrice(), record.getAccount(), record.getCurrency(), record.getDecimals()); + record.getNotes(), record.getPrice(), record.getAccount(), record.getCurrency(), record.getDecimals()); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ExportController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ExportController.java index 8493275..034a8a3 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ExportController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ExportController.java @@ -31,8 +31,10 @@ public List getRecordsForExport(long fromDate, long toDate) { @SuppressWarnings("StringBufferReplaceableByString") StringBuilder sb = new StringBuilder(); sb.append(Head.TIME).append(Head.DELIMITER); + sb.append(Head.ACCOUNT_ID).append(Head.DELIMITER); sb.append(Head.TITLE).append(Head.DELIMITER); sb.append(Head.CATEGORY).append(Head.DELIMITER); + sb.append(Head.NOTES).append(Head.DELIMITER); sb.append(Head.PRICE).append(Head.DELIMITER); sb.append(Head.CURRENCY); @@ -46,6 +48,12 @@ public List getRecordsForExport(long fromDate, long toDate) { for (Record record : recordList) { sb = new StringBuilder(); sb.append(record.getTime()).append(Head.DELIMITER); + + long account_id = -1; + if (record.getAccount() != null) + account_id = record.getAccount().getId(); + + sb.append(account_id).append(Head.DELIMITER); sb.append(record.getTitle()).append(Head.DELIMITER); Category category = null; @@ -53,6 +61,7 @@ public List getRecordsForExport(long fromDate, long toDate) { category = categoryController.read(record.getCategory().getId()); sb.append(category == null ? "NONE" : category.getName()).append(Head.DELIMITER); + sb.append(record.getNotes()).append(Head.DELIMITER); sb.append(record.getType() == 0 ? record.getFullPrice() : -record.getFullPrice()).append(Head.DELIMITER); sb.append(record.getCurrency() == null ? DbHelper.DEFAULT_ACCOUNT_CURRENCY diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/Head.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/Head.java index 396c9a3..cba383f 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/Head.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/Head.java @@ -8,10 +8,12 @@ */ public interface Head { String TIME = "time"; + String ACCOUNT_ID = "account_id"; String TITLE = "title"; String CATEGORY = "category"; + String NOTES = "notes"; String PRICE = "price"; String CURRENCY = "currency"; String DELIMITER = ";"; - int COLUMN_COUNT = 5; + int COLUMN_COUNT = 7; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java index d21bb0d..f3a0771 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.controller.external; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.data.RecordController; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; @@ -35,15 +35,20 @@ public List importRecordsFromCsv(@Nullable String csv) { if (words.length != Head.COLUMN_COUNT) continue; String timeCol = words[0]; - String titleCol = words[1]; - String categoryCol = words[2]; - String priceCol = words[3]; - String currencyCol = words[4]; + String accountIdCol = words[1]; + String titleCol = words[2]; + String categoryCol = words[3]; + String notesCol = words[4]; + String priceCol = words[5]; + String currencyCol = words[6]; + try { long time = Long.parseLong(timeCol); + long accountId = Long.parseLong(accountIdCol); String title = titleCol.trim(); String categoryName = categoryCol.trim(); + String notes = notesCol.trim(); double price = Double.parseDouble(priceCol); String currency = currencyCol.trim(); @@ -55,9 +60,9 @@ public List importRecordsFromCsv(@Nullable String csv) { else type = Record.TYPE_INCOME; Category category = new Category(categoryName); - Account account = new Account(-1, "MOCK", -1, currency, 0, -1, false, 0); + Account account = new Account(accountId, "MOCK", -1, currency, 0, -1, false, 0); - Record record = new Record(time, type, title, category, Math.abs(price), account, currency); + Record record = new Record(time, type, title, category, notes, Math.abs(price), account, currency); Record createdRecord = recordController.create(record); if (createdRecord != null) recordList.add(createdRecord); } catch (Exception e) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/ControllerModule.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/ControllerModule.java index 05297ff..4229889 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/ControllerModule.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/ControllerModule.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.di.module; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.controller.backup.BackupController; import com.blogspot.e_kanivets.moneytracker.controller.external.ExportController; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/CachedRepoModule.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/CachedRepoModule.java index 76d7bec..d17a3e5 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/CachedRepoModule.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/CachedRepoModule.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.di.module.repo; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; import com.blogspot.e_kanivets.moneytracker.entity.data.Category; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/RepoModule.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/RepoModule.java index a6da065..34bf86c 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/RepoModule.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/RepoModule.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.di.module.repo; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/ExchangeRatePair.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/ExchangeRatePair.java index 302e91c..9c868c0 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/ExchangeRatePair.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/ExchangeRatePair.java @@ -2,7 +2,7 @@ import android.os.Parcel; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.entity.data.ExchangeRate; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/RecordItem.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/RecordItem.kt index 9a4f625..bd9bc42 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/RecordItem.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/RecordItem.kt @@ -4,7 +4,7 @@ sealed class RecordItem { data class Header(val date: String) : RecordItem() - data class Record(val title: String, val categoryName: String, val fullPrice: Double, val currency: String, val isIncome: Boolean) : RecordItem() { - constructor(record: com.blogspot.e_kanivets.moneytracker.entity.data.Record) : this(record.title, record.category?.name?.toString().orEmpty(), record.fullPrice, record.currency, record.isIncome) + data class Record(val title: String, val categoryName: String, val notes: String, val fullPrice: Double, val currency: String, val isIncome: Boolean) : RecordItem() { + constructor(record: com.blogspot.e_kanivets.moneytracker.entity.data.Record) : this(record.title, record.category?.name?.toString().orEmpty(), record.notes, record.fullPrice, record.currency, record.isIncome) } } \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/data/Record.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/data/Record.java index 47e8d09..8bdafbd 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/data/Record.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/data/Record.java @@ -2,7 +2,7 @@ import android.os.Parcel; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; import com.blogspot.e_kanivets.moneytracker.entity.base.BaseEntity; @@ -19,57 +19,62 @@ public class Record extends BaseEntity implements Parcelable { private final int type; private final String title; private final Category category; + private final String notes; private final long price; private final Account account; private final String currency; private final long decimals; - public Record(long id, long time, int type, String title, long categoryId, long price, - long accountId, String currency, long decimals) { + public Record(long id, long time, int type, String title, long categoryId, String notes, + long price, long accountId, String currency, long decimals) { this.id = id; this.time = time; this.type = type; this.title = title; this.category = new Category(categoryId, null); + this.notes = notes; this.price = price; this.account = new Account(accountId, null, -1, null, 0, -1, false, -1); this.currency = currency; this.decimals = decimals; } - public Record(long id, long time, int type, String title, Category category, long price, - Account account, String currency, long decimals) { + public Record(long id, long time, int type, String title, Category category, String notes, + long price, Account account, String currency, long decimals) { this.id = id; this.time = time; this.type = type; this.title = title; this.category = category; + this.notes = notes; this.price = price; this.account = account; this.currency = currency; this.decimals = decimals; } - public Record(long id, long time, int type, String title, Category category, double price, - Account account, String currency) { + public Record(long id, long time, int type, String title, Category category, String notes, + double price, Account account, String currency) { this.id = id; this.time = time; this.type = type; this.title = title; this.category = category; + this.notes = notes; this.account = account; this.currency = currency; this.price = getLong(price); this.decimals = getDecimal(price); } - public Record(long time, int type, String title, Category category, double price, Account account, - String currency) { + public Record(long time, int type, String title, Category category, String notes, double price, + Account account, String currency) { this.id = -1; this.time = time; this.type = type; this.title = title; this.category = category; + this.notes = notes; this.account = account; this.currency = currency; this.price = getLong(price); @@ -82,6 +87,7 @@ protected Record(Parcel in) { type = in.readInt(); title = in.readString(); category = in.readParcelable(Category.class.getClassLoader()); + notes = in.readString(); price = in.readLong(); account = in.readParcelable(Account.class.getClassLoader()); currency = in.readString(); @@ -118,6 +124,9 @@ public Category getCategory() { return category; } + + public String getNotes() { return notes; } + public long getPrice() { return price; } @@ -173,6 +182,7 @@ public String toString() { sb.append("time = ").append(time).append(", "); sb.append("category = ").append(category).append(", "); + sb.append("notes = ").append(notes).append(", "); sb.append("price = ").append(price).append(", "); sb.append("account = ").append(account).append(", "); sb.append("currency = ").append(currency).append(", "); @@ -191,6 +201,7 @@ public boolean equals(Object o) { && this.type == record.getType() && equals(this.title, record.getTitle()) && this.category.equals(record.getCategory()) + && equals(this.notes, record.getNotes()) && this.price == record.getPrice() && this.account.equals(record.getAccount()) && equals(this.currency, record.getCurrency()) @@ -210,9 +221,10 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeInt(type); dest.writeString(title); dest.writeParcelable(category, 0); + dest.writeString(notes); dest.writeLong(price); dest.writeParcelable(account, 0); dest.writeString(currency); dest.writeLong(decimals); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/DbHelper.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/DbHelper.java index 8c6a38a..0806bd5 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/DbHelper.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/DbHelper.java @@ -15,7 +15,7 @@ public class DbHelper extends SQLiteOpenHelper { /* DB_VERSION = 1 */ public static final String DB_NAME = "database"; - public static final int DB_VERSION = 5; + public static final int DB_VERSION = 6; public static final String TABLE_RECORDS = "records"; public static final String TABLE_CATEGORIES = "categories"; @@ -59,6 +59,9 @@ public class DbHelper extends SQLiteOpenHelper { public static final String ARCHIVED_COLUMN = "archived"; public static final String COLOR_COLUMN = "color"; + /* DB_VERSION = 6 */ + public static final String NOTES_COLUMN = "notes"; + public DbHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @@ -69,7 +72,8 @@ public void onCreate(SQLiteDatabase db) { //createDbVersion2(db); //createDbVersion3(db); //createDbVersion4(db); - createDbVersion5(db); + //createDbVersion5(db); + createDbVersion6(db); } @Override @@ -158,6 +162,22 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.setTransactionSuccessful(); db.endTransaction(); } + + if (oldVersion < 6) { + db.beginTransaction(); + + /* Add notes column to the records table */ + db.execSQL("ALTER TABLE " + TABLE_RECORDS + " ADD COLUMN " + + NOTES_COLUMN + " TEXT;"); + + /* Set the notes as empty string for all the record*/ + ContentValues contentValues = new ContentValues(); + contentValues.put(NOTES_COLUMN, ""); + db.update(DbHelper.TABLE_RECORDS, contentValues, null, null); + + db.setTransactionSuccessful(); + db.endTransaction(); + } } @SuppressWarnings("unused") @@ -325,6 +345,49 @@ private void createDbVersion5(SQLiteDatabase db) { insertDefaultAccount(db); } + private void createDbVersion6(SQLiteDatabase db) { + db.execSQL("CREATE TABLE " + TABLE_RECORDS + "(" + + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," + + TIME_COLUMN + " INTEGER," + + TYPE_COLUMN + " INTEGER," + + TITLE_COLUMN + " TEXT," + + CATEGORY_ID_COLUMN + " INTEGER," + + NOTES_COLUMN + " TEXT," + + PRICE_COLUMN + " INTEGER," + + ACCOUNT_ID_COLUMN + " INTEGER," + + CURRENCY_COLUMN + " TEXT," + + DECIMALS_COLUMN + " INTEGER);"); + + db.execSQL("CREATE TABLE " + TABLE_CATEGORIES + "(" + + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," + + NAME_COLUMN + " TEXT" + ");"); + + db.execSQL("CREATE TABLE " + TABLE_ACCOUNTS + "(" + + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," + + CREATED_AT_COLUMN + " INTEGER," + + TITLE_COLUMN + " TEXT," + + CUR_SUM_COLUMN + " INTEGER," + + CURRENCY_COLUMN + " TEXT," + + DECIMALS_COLUMN + " INTEGER," + + GOAL_COLUMN + " REAL," + + ARCHIVED_COLUMN + " INTEGER," + + COLOR_COLUMN + " INTEGER);"); + + db.execSQL("CREATE TABLE " + TABLE_TRANSFERS + "(" + + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," + + TIME_COLUMN + " INTEGER," + + FROM_ACCOUNT_ID_COLUMN + " INTEGER," + + TO_ACCOUNT_ID_COLUMN + " INTEGER," + + FROM_AMOUNT_COLUMN + " INTEGER," + + TO_AMOUNT_COLUMN + " INTEGER," + + DECIMALS_FROM_COLUMN + " INTEGER," + + DECIMALS_TO_COLUMN + " INTEGER);"); + + createRatesTable(db); + + insertDefaultAccount(db); + } + private void createRatesTable(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_RATES + "(" + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/base/BaseRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/base/BaseRepo.java index 349d407..d68f7ab 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/base/BaseRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/base/BaseRepo.java @@ -3,8 +3,8 @@ import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; import com.blogspot.e_kanivets.moneytracker.entity.base.IEntity; @@ -116,4 +116,4 @@ public List readWithCondition(@Nullable String condition, @Nullable String[] return recordList; } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/base/IRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/base/IRepo.java index 18e2740..dbb2b4b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/base/IRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/base/IRepo.java @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.repo.base; import android.database.sqlite.SQLiteOpenHelper; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import java.util.List; @@ -66,4 +66,4 @@ public interface IRepo { */ @NonNull List readWithCondition(@Nullable String condition, @Nullable String[] args); -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/cache/BaseCache.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/cache/BaseCache.java index be0a879..af12c77 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/cache/BaseCache.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/cache/BaseCache.java @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.repo.cache; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.util.LruCache; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.collection.LruCache; import com.blogspot.e_kanivets.moneytracker.entity.base.IEntity; import com.blogspot.e_kanivets.moneytracker.repo.base.IRepo; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/AccountRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/AccountRepo.java index d657525..803c79e 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/AccountRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/AccountRepo.java @@ -2,8 +2,8 @@ import android.content.ContentValues; import android.database.Cursor; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/CategoryRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/CategoryRepo.java index 5a9d479..db47baa 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/CategoryRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/CategoryRepo.java @@ -2,8 +2,8 @@ import android.content.ContentValues; import android.database.Cursor; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.entity.data.Category; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; @@ -66,4 +66,4 @@ protected List getListFromCursor(@Nullable Cursor cursor) { return categoryList; } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/ExchangeRateRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/ExchangeRateRepo.java index 233ab2b..94c9de6 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/ExchangeRateRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/ExchangeRateRepo.java @@ -2,8 +2,8 @@ import android.content.ContentValues; import android.database.Cursor; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.entity.data.ExchangeRate; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; @@ -75,4 +75,4 @@ protected List getListFromCursor(@Nullable Cursor cursor) { return exchangeRateList; } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/RecordRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/RecordRepo.java index d462d2b..c9096ac 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/RecordRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/RecordRepo.java @@ -2,8 +2,8 @@ import android.content.ContentValues; import android.database.Cursor; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.entity.data.Record; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; @@ -44,6 +44,7 @@ protected ContentValues contentValues(@Nullable Record record) { contentValues.put(DbHelper.TYPE_COLUMN, record.getType()); contentValues.put(DbHelper.TITLE_COLUMN, record.getTitle()); contentValues.put(DbHelper.CATEGORY_ID_COLUMN, record.getCategory().getId()); + contentValues.put(DbHelper.NOTES_COLUMN, record.getNotes()); contentValues.put(DbHelper.PRICE_COLUMN, record.getPrice()); contentValues.put(DbHelper.ACCOUNT_ID_COLUMN, record.getAccount().getId()); contentValues.put(DbHelper.CURRENCY_COLUMN, record.getCurrency()); @@ -64,6 +65,7 @@ protected List getListFromCursor(Cursor cursor) { int typeColIndex = cursor.getColumnIndex(DbHelper.TYPE_COLUMN); int titleColIndex = cursor.getColumnIndex(DbHelper.TITLE_COLUMN); int categoryColIndex = cursor.getColumnIndex(DbHelper.CATEGORY_ID_COLUMN); + int notesColIndex = cursor.getColumnIndex(DbHelper.NOTES_COLUMN); int priceColIndex = cursor.getColumnIndex(DbHelper.PRICE_COLUMN); int accountIdColIndex = cursor.getColumnIndex(DbHelper.ACCOUNT_ID_COLUMN); int currencyColIndex = cursor.getColumnIndex(DbHelper.CURRENCY_COLUMN); @@ -75,6 +77,7 @@ protected List getListFromCursor(Cursor cursor) { cursor.getInt(typeColIndex), cursor.getString(titleColIndex), cursor.getLong(categoryColIndex), + cursor.getString(notesColIndex), cursor.getLong(priceColIndex), cursor.getLong(accountIdColIndex), cursor.getString(currencyColIndex), diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/TransferRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/TransferRepo.java index bd96329..e189f77 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/TransferRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/TransferRepo.java @@ -2,8 +2,8 @@ import android.content.ContentValues; import android.database.Cursor; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.entity.data.Transfer; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; @@ -84,4 +84,4 @@ protected List getListFromCursor(@Nullable Cursor cursor) { return accountList; } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/ExchangeRateProvider.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/ExchangeRateProvider.java index a1bda5d..4df278c 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/ExchangeRateProvider.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/ExchangeRateProvider.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.report; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.data.ExchangeRateController; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; @@ -78,4 +78,4 @@ public int compare(ExchangeRate lhs, ExchangeRate rhs) { return rateMap; } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/ReportMaker.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/ReportMaker.java index 261cacf..14ec88f 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/ReportMaker.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/ReportMaker.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.report; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.data.ExchangeRateController; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; @@ -91,4 +91,4 @@ public List currencyNeededAccounts(String currency, List accoun return new ArrayList<>(currencies); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/account/AccountsReport.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/account/AccountsReport.java index 626cbbc..bd5410b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/account/AccountsReport.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/account/AccountsReport.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.report.account; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; import com.blogspot.e_kanivets.moneytracker.entity.data.ExchangeRate; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/account/IAccountsReport.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/account/IAccountsReport.java index e046e61..c1b7b5a 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/account/IAccountsReport.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/account/IAccountsReport.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.report.account; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; /** * Interface that represents a contract of access to accounts report data. diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/base/IExchangeRateProvider.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/base/IExchangeRateProvider.java index 7183c9a..a174c15 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/base/IExchangeRateProvider.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/base/IExchangeRateProvider.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.report.base; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; import com.blogspot.e_kanivets.moneytracker.entity.data.ExchangeRate; @@ -30,4 +30,4 @@ public interface IExchangeRateProvider { */ @Nullable ExchangeRate getRate(@Nullable Account account); -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/BarChartConverter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/BarChartConverter.java index 8855acb..1052553 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/BarChartConverter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/BarChartConverter.java @@ -2,7 +2,7 @@ import android.annotation.SuppressLint; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.R; import com.github.mikephil.charting.data.BarDataSet; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/IMonthReport.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/IMonthReport.java index e083604..a97ea40 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/IMonthReport.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/IMonthReport.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.report.chart; import android.os.Parcelable; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import java.util.List; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/MonthReport.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/MonthReport.java index af15e03..31b31cd 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/MonthReport.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/MonthReport.java @@ -2,7 +2,7 @@ import android.os.Parcel; import android.os.Parcelable; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.entity.data.ExchangeRate; import com.blogspot.e_kanivets.moneytracker.entity.data.Record; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/IRecordReport.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/IRecordReport.java index 90d8e72..3a17591 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/IRecordReport.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/IRecordReport.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.report.record; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.entity.Period; import com.blogspot.e_kanivets.moneytracker.report.record.model.CategoryRecord; @@ -43,4 +43,4 @@ public interface IRecordReport { * @return summary list */ @NonNull List getSummary(); -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReport.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReport.java index 1e7dc8a..e276aa7 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReport.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReport.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.report.record; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.entity.data.ExchangeRate; import com.blogspot.e_kanivets.moneytracker.entity.Period; @@ -141,8 +141,8 @@ private List convertRecordList(List recordList) { int decConvertedPrice = (int) Math.round(convertedPrice * 100 - intConvertedPrice * 100); Record convertedRecord = new Record(record.getId(), record.getTime(), record.getType(), - record.getTitle(), record.getCategory(), intConvertedPrice, record.getAccount(), - currency, decConvertedPrice); + record.getTitle(), record.getCategory(), record.getNotes(), intConvertedPrice, + record.getAccount(), currency, decConvertedPrice); convertedRecordList.add(convertedRecord); } @@ -211,4 +211,4 @@ private int compareDoubles(double lhs, double rhs) { else if (lhs < 0 && rhs > 0) return 1; else return -1 * Double.compare(Math.abs(lhs), Math.abs(rhs)); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/model/CategoryRecord.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/model/CategoryRecord.java index 3563c06..c92258b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/model/CategoryRecord.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/model/CategoryRecord.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.report.record.model; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import java.util.ArrayList; import java.util.List; @@ -54,4 +54,4 @@ public boolean equals(Object o) { && this.summaryRecordList.equals(categoryRecord.getSummaryRecordList()); } else return false; } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/AddRecordUiDecorator.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/AddRecordUiDecorator.java index 5a855f0..3d19ee4 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/AddRecordUiDecorator.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/AddRecordUiDecorator.java @@ -4,10 +4,10 @@ import android.content.res.Resources; import android.graphics.drawable.ColorDrawable; import android.os.Build; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.annotation.StyleRes; -import android.support.v7.app.ActionBar; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StyleRes; +import androidx.appcompat.app.ActionBar; import android.view.Window; import android.view.WindowManager; 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/PeriodSpinner.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/PeriodSpinner.java index 2f276bc..857ee5d 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/PeriodSpinner.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/PeriodSpinner.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.ui; import android.content.Context; -import android.support.v7.widget.AppCompatSpinner; +import androidx.appcompat.widget.AppCompatSpinner; import android.util.AttributeSet; import android.view.View; import android.widget.AdapterView; 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 bdb2fc5..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 android.support.v7.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 19229bb..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 @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.ui.presenter; import android.content.Context; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; @@ -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,26 +102,24 @@ 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(); }); } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/CategoryAutoCompleter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/CategoryAutoCompleter.java index b2cfb0c..b83b71f 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/CategoryAutoCompleter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/CategoryAutoCompleter.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.util; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController; import com.blogspot.e_kanivets.moneytracker.controller.data.CategoryController; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/ExchangeRatesSummarizer.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/ExchangeRatesSummarizer.java index f26be96..6b365b5 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/ExchangeRatesSummarizer.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/ExchangeRatesSummarizer.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.util; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.entity.ExchangeRatePair; import com.blogspot.e_kanivets.moneytracker.entity.data.ExchangeRate; 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 e05d6d1..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 @@ -1,54 +1,36 @@ package com.blogspot.e_kanivets.moneytracker.util.validator; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.design.widget.TextInputLayout; -import android.support.v7.widget.AppCompatSpinner; -import android.view.View; -import android.widget.EditText; +import androidx.annotation.NonNull; + +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/ClearErrorTextWatcher.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/ClearErrorTextWatcher.java index eb0c3f7..cb32af9 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/ClearErrorTextWatcher.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/ClearErrorTextWatcher.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.util.validator; -import android.support.annotation.NonNull; -import android.support.design.widget.TextInputLayout; +import androidx.annotation.NonNull; +import com.google.android.material.textfield.TextInputLayout; import android.text.Editable; import android.text.TextWatcher; 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 fc2596a..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 android.support.annotation.NonNull; -import android.support.design.widget.TextInputLayout; -import android.view.View; -import android.widget.EditText; -import butterknife.BindView; -import butterknife.ButterKnife; + +import androidx.annotation.NonNull; + 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 d9db7dc..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 @@ -1,48 +1,27 @@ package com.blogspot.e_kanivets.moneytracker.util.validator; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.design.widget.TextInputLayout; -import android.support.v7.widget.AppCompatSpinner; -import android.view.View; -import android.widget.EditText; +import androidx.annotation.NonNull; 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 8d9fd94..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 @@ -1,50 +1,27 @@ package com.blogspot.e_kanivets.moneytracker.util.validator; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.design.widget.TextInputLayout; -import android.support.v7.widget.AppCompatSpinner; -import android.view.View; -import android.widget.EditText; +import androidx.annotation.NonNull; 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 ea01edf..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 @@ -1,48 +1,27 @@ package com.blogspot.e_kanivets.moneytracker.util.validator; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.design.widget.TextInputLayout; -import android.support.v7.widget.AppCompatSpinner; -import android.view.View; -import android.widget.EditText; +import androidx.annotation.NonNull; 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/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..f947fa4 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 0984b68..82a10e9 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -1,5 +1,5 @@ - - - - + - @@ -39,6 +39,6 @@ android:textColor="@color/text_black" android:textSize="18sp" /> - + - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_accounts.xml b/app/src/main/res/layout/activity_accounts.xml index f8e85d6..4475d8b 100644 --- a/app/src/main/res/layout/activity_accounts.xml +++ b/app/src/main/res/layout/activity_accounts.xml @@ -1,26 +1,58 @@ - + + + + + + + + - + - + - +