diff --git a/Open Money Tracker.png b/Open Money Tracker.png
new file mode 100644
index 0000000..f2a6ca4
Binary files /dev/null and b/Open Money Tracker.png differ
diff --git a/README.md b/README.md
index 558be93..055c9fc 100644
--- a/README.md
+++ b/README.md
@@ -1,31 +1,34 @@
-# Money Tracker
+# Open Money Tracker
-
+
-[Open Money Tracker on F-Droid](https://apt.izzysoft.de/fdroid/index/apk/com.blogspot.e_kanivets.moneytracker)
-
-## Short overview
-Money Tracker is an Android native application with open source code.
-Development of this project is guided by simplicity and effeciency for end user.
-This is portfolio project, so the smartest tools are used (such as ButterKnife, Dagger2 etc.).
+**Open Money Tracker** is an open-source Android application, which allows to manage personal finances. Development of this project is guided by simplicity and effeciency for end user.
Following features are available in current version:
* Manage expenses/incomes.
-* Create reports for period.
+* Create reports for given period.
* Manage accounts with different currencies.
* Transfer money between accounts.
* Manage exchange rates between currencies.
* Quick summaries.
* Charts.
-* Export to CSV.
+* Dropbox backups.
+
+[
](https://f-droid.org/packages/com.blogspot.e_kanivets.moneytracker/)
+[
](https://play.google.com/store/apps/details?id=com.blogspot.e_kanivets.moneytracker)
## Dependencies
-* [Butter Knife] (http://jakewharton.github.io/butterknife/) - View annotation bindings.
-* [Dagger 2] (http://google.github.io/dagger/) - Dependency injection tool.
-* [MPAndroidChart] (https://github.com/PhilJay/MPAndroidChart) - Ready-to-use charts.
-* [Timber] (https://github.com/JakeWharton/timber) - Convenient and small logging tool.
-
-## Development process
-To start developing your own MT or just compile the project you only need
-to checkout newest version from this repo from your Android Studio.
-Gradle is fully configured and even keystore is present in source code.
+* [Butter Knife](http://jakewharton.github.io/butterknife/) - View annotation bindings.
+* [Dagger 2](http://google.github.io/dagger/) - Dependency injection tool.
+* [MPAndroidChart](https://github.com/PhilJay/MPAndroidChart) - Ready-to-use charts.
+* [Timber](https://github.com/JakeWharton/timber) - Convenient and small logging tool.
+
+## Development and maintenance
+
+Project has been developed and maintained by [xorum.io](http://bit.ly/xorum_source_gh_cw). We are the team of seasoned software engineers with an extensive experience in mobile development.
+
+Have you liked **Open Money Tracker**? Do you have an **idea of project** and need help with its development? Just write us on hello@xorum.io.
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 @@
-
+
+
+
+
+
+
+
+
-
+
-
+
-
+
+
-
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/activity_add_account.xml b/app/src/main/res/layout/activity_add_account.xml
index df33c7c..9070062 100644
--- a/app/src/main/res/layout/activity_add_account.xml
+++ b/app/src/main/res/layout/activity_add_account.xml
@@ -1,25 +1,77 @@
-
+
+
+
+
+
+
+
+
+ android:orientation="vertical"
+ android:padding="@dimen/activity_horizontal_margin"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior"
+ tools:showIn="@layout/activity_add_account">
+
+
+
+
+
+
+
+
-
+ android:hint="@string/initial_sum"
+ android:inputType="numberDecimal|numberSigned"
+ android:maxLines="1"
+ android:singleLine="true" />
-
+
-
+
-
+
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/activity_add_exchange_rate.xml b/app/src/main/res/layout/activity_add_exchange_rate.xml
index 5011497..3a1729c 100644
--- a/app/src/main/res/layout/activity_add_exchange_rate.xml
+++ b/app/src/main/res/layout/activity_add_exchange_rate.xml
@@ -1,24 +1,24 @@
-
-
-
-
+
-
-
@@ -64,7 +64,7 @@
android:maxLines="1"
android:nextFocusDown="@+id/et_sell"
android:singleLine="true" />
-
+
-
-
@@ -101,8 +101,8 @@
android:inputType="numberDecimal"
android:maxLines="1"
android:singleLine="true" />
-
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/activity_add_record.xml b/app/src/main/res/layout/activity_add_record.xml
index 4833356..e380f06 100644
--- a/app/src/main/res/layout/activity_add_record.xml
+++ b/app/src/main/res/layout/activity_add_record.xml
@@ -1,33 +1,171 @@
-
+
+
+
+
+
+
+
+
+
+
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="@dimen/activity_horizontal_margin"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+ android:orientation="vertical">
-
+
-
+
-
+
+
+
+
+
+
+ android:hint="@string/price"
+ android:inputType="numberDecimal"
+ android:maxLines="1"
+ android:singleLine="true" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
\ No newline at end of file
+
+
diff --git a/app/src/main/res/layout/activity_backup.xml b/app/src/main/res/layout/activity_backup.xml
index a43c2fa..79b563d 100644
--- a/app/src/main/res/layout/activity_backup.xml
+++ b/app/src/main/res/layout/activity_backup.xml
@@ -1,5 +1,5 @@
-
-
-
-
+
-
+
diff --git a/app/src/main/res/layout/activity_charts.xml b/app/src/main/res/layout/activity_charts.xml
index ca2b2a2..158a5d1 100644
--- a/app/src/main/res/layout/activity_charts.xml
+++ b/app/src/main/res/layout/activity_charts.xml
@@ -1,24 +1,24 @@
-
-
-
-
-
+
-
-
+
diff --git a/app/src/main/res/layout/activity_edit_account.xml b/app/src/main/res/layout/activity_edit_account.xml
index 4a73f71..b1d2f64 100644
--- a/app/src/main/res/layout/activity_edit_account.xml
+++ b/app/src/main/res/layout/activity_edit_account.xml
@@ -1,6 +1,6 @@
-
-
-
-
-
+
-
-
-
+
diff --git a/app/src/main/res/layout/activity_exchange_rates.xml b/app/src/main/res/layout/activity_exchange_rates.xml
index 01c1be3..b0094bb 100644
--- a/app/src/main/res/layout/activity_exchange_rates.xml
+++ b/app/src/main/res/layout/activity_exchange_rates.xml
@@ -1,26 +1,58 @@
-
+
+
+ android:layout_height="wrap_content"
+ android:theme="@style/AppTheme.AppBarOverlay">
-
+
+
+
-
+
-
+
+
+
+
+
+
-
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/activity_import_export.xml b/app/src/main/res/layout/activity_import_export.xml
index f7ab14c..58888e6 100644
--- a/app/src/main/res/layout/activity_import_export.xml
+++ b/app/src/main/res/layout/activity_import_export.xml
@@ -1,5 +1,5 @@
-
-
-
-
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 2b678d1..999b24d 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,51 +1,93 @@
-
+
+
+ android:fitsSystemWindows="true"
+ tools:context=".activity.create_order.CategoryActivity">
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:orientation="horizontal">
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_report.xml b/app/src/main/res/layout/activity_report.xml
index faefa37..920b7dd 100644
--- a/app/src/main/res/layout/activity_report.xml
+++ b/app/src/main/res/layout/activity_report.xml
@@ -1,24 +1,24 @@
-
-
-
-
-
+
-
+
-
+ app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
index b697daa..648cf9e 100644
--- a/app/src/main/res/layout/activity_settings.xml
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -1,5 +1,5 @@
-
-
-
-
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/activity_transfer.xml b/app/src/main/res/layout/activity_transfer.xml
index 1956c55..4d2cac4 100644
--- a/app/src/main/res/layout/activity_transfer.xml
+++ b/app/src/main/res/layout/activity_transfer.xml
@@ -1,26 +1,111 @@
-
+
+
+
+
+
+
+
+
+ android:baselineAligned="false"
+ android:orientation="horizontal"
+ android:padding="@dimen/activity_horizontal_margin"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior"
+ tools:showIn="@layout/activity_transfer">
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+ android:layout_gravity="start"
+ android:text="@string/to"
+ android:theme="@style/Text_Hint" />
+
+
-
+
-
+
+
+
-
+
-
+
diff --git a/app/src/main/res/layout/content_accounts.xml b/app/src/main/res/layout/content_accounts.xml
deleted file mode 100644
index 93d2946..0000000
--- a/app/src/main/res/layout/content_accounts.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/content_add_account.xml b/app/src/main/res/layout/content_add_account.xml
deleted file mode 100644
index 52c5e30..0000000
--- a/app/src/main/res/layout/content_add_account.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/content_add_record.xml b/app/src/main/res/layout/content_add_record.xml
deleted file mode 100644
index df4e7db..0000000
--- a/app/src/main/res/layout/content_add_record.xml
+++ /dev/null
@@ -1,128 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/content_exchange_rates.xml b/app/src/main/res/layout/content_exchange_rates.xml
deleted file mode 100644
index ca4ee27..0000000
--- a/app/src/main/res/layout/content_exchange_rates.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml
deleted file mode 100644
index 337223d..0000000
--- a/app/src/main/res/layout/content_main.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/content_transfer.xml b/app/src/main/res/layout/content_transfer.xml
deleted file mode 100644
index 003bd8a..0000000
--- a/app/src/main/res/layout/content_transfer.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/fragment_account_operations.xml b/app/src/main/res/layout/fragment_account_operations.xml
index f56a485..0c62b24 100644
--- a/app/src/main/res/layout/fragment_account_operations.xml
+++ b/app/src/main/res/layout/fragment_account_operations.xml
@@ -4,10 +4,10 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
-
+ app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
diff --git a/app/src/main/res/layout/fragment_edit_account.xml b/app/src/main/res/layout/fragment_edit_account.xml
index b45d7ce..a8e6511 100644
--- a/app/src/main/res/layout/fragment_edit_account.xml
+++ b/app/src/main/res/layout/fragment_edit_account.xml
@@ -9,7 +9,7 @@
app:layout_behavior="@string/appbar_scrolling_view_behavior"
>
-
-
+
-
-
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/view_spinner_item.xml b/app/src/main/res/layout/view_spinner_item.xml
index a96615c..8f6c383 100644
--- a/app/src/main/res/layout/view_spinner_item.xml
+++ b/app/src/main/res/layout/view_spinner_item.xml
@@ -3,8 +3,11 @@
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:ellipsize="end"
android:gravity="center_vertical"
+ android:maxLines="1"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
- android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:paddingStart="@dimen/quarter_margin"
- android:textAppearance="?android:attr/textAppearanceListItemSmall" />
\ No newline at end of file
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+ android:textAppearance="?android:attr/textAppearanceListItemSmall"
+ />
diff --git a/app/src/main/res/layout/view_summary_accounts.xml b/app/src/main/res/layout/view_summary_accounts.xml
index 6216df9..feb7eeb 100644
--- a/app/src/main/res/layout/view_summary_accounts.xml
+++ b/app/src/main/res/layout/view_summary_accounts.xml
@@ -26,7 +26,7 @@
android:layout_weight="1"
android:text="@string/currency" />
-
@@ -68,4 +68,4 @@
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/view_summary_records.xml b/app/src/main/res/layout/view_summary_records.xml
index 6bca902..0444dfc 100644
--- a/app/src/main/res/layout/view_summary_records.xml
+++ b/app/src/main/res/layout/view_summary_records.xml
@@ -9,7 +9,7 @@
android:paddingEnd="@dimen/half_margin"
android:paddingBottom="@dimen/quarter_margin">
-
-
-
\ No newline at end of file
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..7353dbd
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..7353dbd
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 41e1501..0000000
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index b586dde..0000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 5a0f3a6..0000000
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index cd786c7..0000000
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/Thumbs.db b/app/src/main/res/mipmap-xxxhdpi/Thumbs.db
deleted file mode 100644
index 31ceb23..0000000
Binary files a/app/src/main/res/mipmap-xxxhdpi/Thumbs.db and /dev/null differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 8f0ca40..0000000
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
new file mode 100644
index 0000000..7579537
--- /dev/null
+++ b/app/src/main/res/values-fr/strings.xml
@@ -0,0 +1,135 @@
+
+
+
+ Money Tracker
+ Intitulé
+ Catégorie
+ Montant
+ Ajouter revenu
+ Ajouter dépense
+ Ajout
+ Rapport
+ RÉGLAGE DE LA PÉRIODE
+ TOTAL
+ Total revenus
+ Total dépenses
+ Supprimer
+ Jour
+ Semaine
+ Mois
+ Année
+ Éternité
+ Aimez-vous MoneyTracker ?
+ Évaluez-le sur Google Play !
+ Peut-être plus tard
+ Non, merci
+ Oui !
+
+ Opérations
+ Comptes
+ Ajout d\'un revenu
+ Ajout d\'une dépense
+ Ajout d\'un compte
+
+ Exporter
+ Ajouter compte
+ Solde initial
+ Compte
+ Virement
+ Depuis
+ Vers
+ Taux de conversion
+ Ajouter un taux
+ Compte supprimé
+
+ Synthèse
+ Personnalisé
+ Synthèse
+ Devise
+ Erreur ! Conversion à définir.
+ Montant
+ Paramètres
+ Paramètres
+ Compte par défaut
+ Devise d\'affichage
+ Devise se substituant à NON
+
+ Résultats
+ Revenus
+ Dépenses
+
+ Précision d\'affichage
+
+ Importer/Exporter
+ Importer
+ %1$s opérations ont été importées
+ Aide
+ Pour importer des opérations dans l\'application :\n
+ 1. Créer un fichier CSV au format \n
+ date;titre;catégorie;montant;devise.\n
+ 2. Copier son contenu dans le champ de saisie.\n
+ 3. Appuyer sur importer. Au bout de quelques secondes, le nombre d\'opérations importées est affiché.\n
+ \n
+ Note : date - horodatage en millisecondes ;Le account_id par défaut est 1 et pour chaque nouveau compte, il augmente de 1;Assurez-vous que tous les comptes existent déjà; devise - code devise à 3 lettres.\n
+ Exemple : 1466948795712;métro;transport;-20.0;EUR
+
+ Banque achète
+ Convertir vers
+ Banque vend
+ Convertir depuis
+
+ Date
+ Heure
+
+ Sauvegarde/Restauration
+ Échec de la sauvegarde.
+ Échec de la restauration.
+ Le fichier de sauvegarde %1$s a bien été restauré.
+ Restauration effectuée
+ Attention
+ Êtes-vous sûr de vouloir écraser les données courantes avec celles du fichier %1$s ? Assurez-vous d\'avoir une sauvegarde des données courantes.
+ Sauvegarder maintenant
+
+ Éditer le revenu
+ Éditer la dépense
+
+ Importation en cours…
+ Sauvegarde en cours…
+ Restauration en cours…
+ Recherche des sauvegardes…
+ Suppression de la sauvegarde…
+
+ Version %1$s (Android %2$s)
+ À propos
+ Open Money Tracker (OMT) is an accounting application. You can manage your incomes and expenses in easy way. Accounts and currency exchange rates are also available.\n\nTo help us make OMT better, please report bugs to the 4PDA forum; new feature ideas are very welcome too. Find answers or start a discussion on forum.\n\nOMT is open source software, so everyone is encouraged to become a contributor. Non-developers can also help. For instance, you can help translate OMT, provide screenshots or blog about OMT.\n\nOMT is released under the GNU-GPL v3 license and source code is available on GitHub.\n\nDeveloper profile on LinkedIn.
+
+ Champ obligatoire.
+ Impossible d\'être si riche ou pauvre.
+ Impossible d\'être si riche.
+ Aucune
+ Montant trop important.
+ Montant trop important.
+ Impossible de convertir vers la même devise.
+ Opérations dans le futur impossibles.
+ Au moins un compte est requis.
+
+ Éditer le compte
+ Couleur
+ Objectif
+ Restaurer
+ Archiver
+ Le compte par défaut ne peut pas être archivé.
+ Suppression du compte
+ Êtes-vous sûr de vouloir supprimer ce compte ? Il ne pourra plus être restauré.
+
+ Graphique
+ Information
+ Opérations
+
+ Suppression de la sauvegarde
+ Êtes-vous sûr de vouloir supprimer le fichier %1$s ? Il ne pourra plus être restauré.
+
+ La date de fin ne peut être antérieure à celle de début
+ Notes
+ Transfert de compte
+
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..d518fd0
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -0,0 +1,151 @@
+
+
+
+ Money Tracker
+ Título
+ Categoria
+ Preço
+ Adicionar receita
+ Adicionar despesa
+ Adicionar
+ Relatório
+ MUDAR A DATA
+ TOTAL
+ Receita total
+ Despesa total
+ Deletar
+ Dia
+ Semana
+ Mês
+ Ano
+ Tudo
+ Você gosta do MoneyTracker?
+ Avalie ele na Google Play!
+ Talvez depois
+ Não, obrigado
+ Sim!
+
+ Registos
+ Contas
+ Adicionar receita
+ Adicionar despesa
+ Adicionar conta
+
+ Open navigation drawer
+ Close navigation drawer
+
+ Exportar
+ Adicionar conta
+ Saldo inicial
+ Conta
+ Transferir
+ De
+ Para
+ Taxas de câmbio
+ Adicionar taxa de câmbio
+ " -> "
+ Conta removida
+
+ Breve resumo
+ Personalizado
+ Resumo
+ Moeda
+ Erro! Especifique as taxas de câmbio.
+ Quantidade
+ Configurações
+ Configurações
+ Conta padrão
+ pref_default_account
+ pref_default_currency
+ %1$s - %2$s
+ pref_non_substitution_currency
+ Moeda padrão
+ Moeda não substituível
+
+ Resultados
+ Receitas
+ Despesas
+
+ pref_display_precision
+ Precisão da exibição
+ 9.99$ = 10$
+ 9.99$ = 9$
+ 9.99$ = 9.99$
+
+ Importar/Exportar
+ Importar
+ %1$s registros foram importados
+ Ajuda
+ Para importar registros no aplicativo:\n
+ 1. Crie um arquivo no formato CSV - \n
+ hora;título;categoria;preço;moeda.\n
+ 2. Copie o seu conteúdo para o campo de texto.\n
+ 3. Pressione o botão de importar. Em alguns segundos você verá quantos registros foram importados.\n
+ \n
+ Nota: hora - o valor deve ser em milissegundos;Account_id padrão é 1 e para cada nova conta aumenta em 1; Verifique se todas as contas já existem; moeda - código de 3 símbolos da moeda.\n
+ Exemplo: 1466948795712;metrô;transporte;-20.0;BRL
+
+ /
+ Banco vende
+ Converter para
+ Banco compra
+ Converte de
+
+ Data
+ Horário
+
+ Backup/Restaurar
+ Falha ao criar o backup.
+ Falha ao restaurar o backup.
+ O arquivo de backup selecionado %1$s foi restaurado com sucesso.
+ Backup restaurado
+ Atenção
+ Você tem certeza que deseja apagar todos os dados atuais e restaurar o arquivo de backup %1$s? Certifique-se de fazer backup dos dados atuais.
+ Fazer backup agora
+
+ Editar receita
+ Editar despesa
+
+ Importando registros…
+ Fazendo backup…
+ Restaurando backup…
+ Buscando backups…
+ Removendo backup…
+
+ pref_about
+ Versão %1$s (Android %2$s)
+ Sobre
+ Open Money Tracker (OMT) é uma aplicação contábil. Você pode gerenciar suas receitas e despesas de uma forma fácil. Contas e taxas de câmbio também são suportadas.\n\nPara nos ajudar a tornar o OMT melhor, por favor, reporte bugs no fórum 4PDA; novas ideias de funções também são muito bem vindas. Pesquise respostas ou inicie uma discussão nofórum.\n\nO OMT é um software de código aberto, então todo mundo é encorajado a se tornar um contribuidor. Não desenvolvedores também podem ajudar. Por exemplo, você pode ajudar a traduzir o OMT, fornecer capturas de tela ou publicar sobre o OMT.\n\nEste software é disponibilizado sobre a licença GNU-GPL v3 e o seu código fonte está disponível no GitHub.\n\nPerfil do desenvolvedor no LinkedIn.
+
+ Este campo não pode ficar vazio
+ Você não pode ser tão rico ou tão pobre.
+ Você não pode ser tão rico.
+ Nenhum
+ Isto é muito para ser transferido.
+ Isto é muito para a troca.
+ Não é possível converter as moedas.
+ Não é possível criar um registro no futuro.
+ Pelo menos uma conta é necessária.
+
+ Editar conta
+ Cor
+ Objetivo
+ Restaurar
+ Arquivar
+ Você não pode arquivar a conta padrão.
+ Deletar conta
+ Tem certeza que deseja deletar esta conta? Isso não pode ser desfeito.
+
+ Gráfico
+ Informação
+ Operações
+
+
+ Deletar backup
+ Tem certeza que deseja deletar esse arquivo de backup %1$s? Isso não pode ser desfeito.
+
+ %1$s (%2$d)
+ A data final não pode ser anterior a data inicial
+ Anotações
+ Transferência de Conta
+
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 0796ac7..b07f066 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -74,7 +74,7 @@
2. Скопируйте его контент в текстовое поле.\n
3. Нажмите кнопку импорта. Через несколько секунд Вы увидите сколько записей было импортировано.\n
\n
- Важно: время - метка времени в миллисекундах; валюта - 3-х символьный код валюты.\n
+ Важно: время - метка времени в миллисекундах;По умолчанию account_id равен 1, и для каждой новой учетной записи он увеличивается на 1; Убедитесь, что все учетные записи уже существуют; валюта - 3-х символьный код валюты.\n
Пример: 1466948795712;метро;транспорт;-20.0;UAH
Банк продает
@@ -105,7 +105,7 @@
Версия %1$s (Android %2$s)
О приложении
- Open Money Tracker (OMT) это приложения для ведения личных финансов. Вы легко можете управлять доходами и расходами. Также доступны счета и курсы обмена.\n\nДля того чтобы помочь сделать OMT лучше, пишите о багах на форуме 4PDA; идеи новых функций также приветствуются. Ищите ответы или начинайте обсуждение на форуме.\n\nOMT это проект с открытым исходным кодом, так что каждый может помочь с его разработкой. Не-разработчики также могут помочь. Например, вы можете помочь с переводом, предоставить скриншоты или написать статью в блоге о OMT.\n\nOMT выпущен под GNU-GPL v3 лицензией и исходный код доступен на GitHub.\n\nПрофиль разработчика на LinkedIn.
+ Open Money Tracker (OMT) это приложения для ведения личных финансов. Вы легко можете управлять доходами и расходами. Также доступны счета и курсы обмена.\n\nДля того чтобы помочь сделать OMT лучше, пишите о багах на форуме 4PDA; идеи новых функций также приветствуются. Ищите ответы или начинайте обсуждение на форуме.\n\nOMT это проект с открытым исходным кодом, так что каждый может помочь с его разработкой. Не-разработчики также могут помочь. Например, вы можете помочь с переводом, предоставить скриншоты или написать статью в блоге о OMT.\n\nOMT выпущен под GNU-GPL v3 лицензией и исходный код доступен на GitHub.\n\nПрофиль разработчика на LinkedIn.
Поле не может быть пустым.
Вы не можете быть настолько богаты или бедны.
@@ -131,5 +131,7 @@
Операции
Дата конца не может быть раньше даты начала
+ примечания
+ Перевод счета
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index c2312ba..4298079 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -74,7 +74,7 @@
2. Скопіюйте його контент до текстового поля.\n
3. Натисніть кнопку імпорту. Через дікілька секунд Ви побачите скільки записів було імпортовано.\n
\n
- Важливо: час - мітка часу у мілісекундах; валюта - 3-х символьний код валюти.\n
+ Важливо: час - мітка часу у мілісекундах;За замовчуванням account_id дорівнює 1 і для кожного нового облікового запису він збільшується на 1; Переконайтеся, що всі облікові записи вже існують; валюта - 3-х символьний код валюти.\n
Приклад: 1466948795712;метро;транспорт;-20.0;UAH
Банк продає
@@ -105,7 +105,7 @@
Версія %1$s (Android %2$s)
Про додаток
- Open Money Tracker (OMT) це додаток для обліку персональних фінансів. Ви можете з легкістю керувати доходами та витратами. Також доступні рахунки та курси обміну.\n\nДля того щоб допомогти нам зробити OMT краще, пишіть про баги на форумі 4PDA; ідеї нових функцій також підтримуються. Знайдіть відповіді або розпочніть бесіду на форумі.\n\nOMT це додаток з відкритим сирцевим кодом, тож будь-хто може стати учасником. Не-розробники також можуть допомогти. Наприклад, Ви можете допомогти з перекладом OMT, надати знімки екранів або написати у блозі про OMT.\n\nOMT випущено під GNU-GPL v3 ліцензією і сирцевий код доступний на GitHub.\n\nПрофiль розробника на LinkedIn.
+ Open Money Tracker (OMT) це додаток для обліку персональних фінансів. Ви можете з легкістю керувати доходами та витратами. Також доступні рахунки та курси обміну.\n\nДля того щоб допомогти нам зробити OMT краще, пишіть про баги на форумі 4PDA; ідеї нових функцій також підтримуються. Знайдіть відповіді або розпочніть бесіду на форумі.\n\nOMT це додаток з відкритим сирцевим кодом, тож будь-хто може стати учасником. Не-розробники також можуть допомогти. Наприклад, Ви можете допомогти з перекладом OMT, надати знімки екранів або написати у блозі про OMT.\n\nOMT випущено під GNU-GPL v3 ліцензією і сирцевий код доступний на GitHub.\n\nПрофiль розробника на LinkedIn.
Поле не може бути порожнім.
Ви не можете бути настільки багаті чи бідні.
@@ -131,4 +131,6 @@
Операції
Дата початку не може бути раніше за дату кінця
+ Нотатки
+ Переказ рахунку
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
index 7874beb..edf82e3 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -120,5 +120,7 @@
操作
开始日期不能早于结束日期
+ 笔记
+ 账户转账
diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml
new file mode 100644
index 0000000..8c3a0e7
--- /dev/null
+++ b/app/src/main/res/values/ic_launcher_background.xml
@@ -0,0 +1,4 @@
+
+
+ #8BC34A
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 9f31824..a9e510a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -4,6 +4,7 @@
Money Tracker
Title
Category
+ Notes
Price
Add income
Add expense
@@ -78,12 +79,12 @@
Help
To import records into application:\n
1. Create CSV file in format - \n
- time;title;category;price;currency.\n
+ time;account_id;title;category;price;currency.\n
2. Copy its content to text field.\n
3. Press import button. In few seconds you will see how much records has been imported.\n
\n
- Note: time - timestamp value in milliseconds; currency - 3 symbols code of currency.\n
- Example: 1466948795712;metro;transport;-20.0;UAH
+ Note: time - timestamp value in milliseconds; Default account_id is 1 and for every new account it increases by 1; Make sure all the accounts already exists; currency - 3 symbols code of currency.\n
+ Example: 1466948795712;1;metro;transport;-20.0;UAH
/
Bank sells
@@ -115,7 +116,7 @@
pref_about
Version %1$s (Android %2$s)
About
- Open Money Tracker (OMT) is an accounting application. You can manage your incomes and expenses in easy way. Accounts and currency exchange rates are also available.\n\nTo help us make OMT better, please report bugs to the 4PDA forum; new feature ideas are very welcome too. Find answers or start a discussion on forum.\n\nOMT is open source software, so everyone is encouraged to become a contributor. Non-developers can also help. For instance, you can help translate OMT, provide screenshots or blog about OMT.\n\nOMT is released under the GNU-GPL v3 license and source code is available on GitHub.\n\nDeveloper profile on LinkedIn.
+ Open Money Tracker (OMT) is an accounting application. You can manage your incomes and expenses in easy way. Accounts and currency exchange rates are also available.\n\nTo help us make OMT better, please report bugs to the 4PDA forum; new feature ideas are very welcome too. Find answers or start a discussion on forum.\n\nOMT is open source software, so everyone is encouraged to become a contributor. Non-developers can also help. For instance, you can help translate OMT, provide screenshots or blog about OMT.\n\nOMT is released under the GNU-GPL v3 license and source code is available on GitHub.\n\nDeveloper profile on LinkedIn.
Field can\'t be empty.
You can\'t be so rich or so poor.
@@ -146,4 +147,5 @@
%1$s (%2$d)
End date can\'t be earlier than start date
+ Account Transfer
diff --git a/app/src/proprietary/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java b/app/src/proprietary/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java
index 46b35ad..d2cfb87 100644
--- a/app/src/proprietary/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java
+++ b/app/src/proprietary/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java
@@ -1,12 +1,8 @@
package com.blogspot.e_kanivets.moneytracker.util;
import android.content.Context;
-import android.support.annotation.Nullable;
-
-import com.crashlytics.android.Crashlytics;
-import com.crashlytics.android.answers.Answers;
-import com.crashlytics.android.answers.ContentViewEvent;
-import io.fabric.sdk.android.Fabric;
+import androidx.annotation.Nullable;
+import com.google.firebase.analytics.FirebaseAnalytics;
/**
* Util class that wraps all Crashlytics interactions to disable Answers in
@@ -31,9 +27,10 @@ private CrashlyticsProxy() {
}
private boolean enabled;
+ private static FirebaseAnalytics analytics;
public static void startCrashlytics(Context context) {
- Fabric.with(context, new Crashlytics());
+ analytics = FirebaseAnalytics.getInstance(context);
}
public void setEnabled(boolean enabled) {
@@ -46,9 +43,7 @@ public boolean isEnabled() {
public boolean logEvent(@Nullable String eventName) {
if (enabled) {
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName(eventName)
- .putContentType("Event"));
+ analytics.logEvent(eventName, null);
return true;
} else {
return false;
@@ -57,9 +52,7 @@ public boolean logEvent(@Nullable String eventName) {
public boolean logButton(@Nullable String buttonName) {
if (enabled) {
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName(buttonName)
- .putContentType("Button"));
+ analytics.logEvent(buttonName, null);
return true;
} else {
return false;
diff --git a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/PeriodControllerTest.java b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/PeriodControllerTest.java
index 9c050b7..d0b73e1 100644
--- a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/PeriodControllerTest.java
+++ b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/PeriodControllerTest.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.entity.Period;
diff --git a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/AccountControllerTest.java b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/AccountControllerTest.java
index 7e8d9af..f37a310 100644
--- a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/AccountControllerTest.java
+++ b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/AccountControllerTest.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.entity.data.Account;
diff --git a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryControllerTest.java b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryControllerTest.java
index c961f01..46150ee 100644
--- a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryControllerTest.java
+++ b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryControllerTest.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.entity.data.Category;
@@ -130,4 +130,4 @@ public List readWithCondition(@Nullable String condition, @Nullable St
return new ArrayList<>();
}
};
-}
\ No newline at end of file
+}
diff --git a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordControllerTest.java b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordControllerTest.java
index 0e14b27..18d3873 100644
--- a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordControllerTest.java
+++ b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordControllerTest.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.entity.Period;
@@ -201,4 +201,4 @@ public List readWithCondition(@Nullable String condition, @Nullable Stri
return readAll();
}
}
-}
\ No newline at end of file
+}
diff --git a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/TransferControllerTest.java b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/TransferControllerTest.java
index bdaa485..3c095c6 100644
--- a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/TransferControllerTest.java
+++ b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/TransferControllerTest.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.entity.data.Transfer;
import com.blogspot.e_kanivets.moneytracker.repo.base.IRepo;
@@ -74,4 +74,4 @@ public List readWithCondition(@Nullable String condition, @Nullable St
return null;
}
};
-}
\ No newline at end of file
+}
diff --git a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/report/ExchangeRateProviderTest.java b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/report/ExchangeRateProviderTest.java
index b44bcf0..bae75b7 100644
--- a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/report/ExchangeRateProviderTest.java
+++ b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/report/ExchangeRateProviderTest.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.ExchangeRate;
@@ -117,4 +117,4 @@ public List readWithCondition(String condition, String[] args) {
return new ArrayList<>();
}
}
-}
\ No newline at end of file
+}
diff --git a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/report/ReportTest.java b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/report/ReportTest.java
index 42deb1a..ef11251 100644
--- a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/report/ReportTest.java
+++ b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/report/ReportTest.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.entity.data.Account;
import com.blogspot.e_kanivets.moneytracker.entity.data.Category;
@@ -262,4 +262,4 @@ public ExchangeRate getRate(@Nullable Account account) {
return null;
}
}
-}
\ No newline at end of file
+}
diff --git a/build.gradle b/build.gradle
index 7b1f894..5f77a98 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,24 +1,24 @@
buildscript {
- ext.kotlin_version = '1.3.10'
+ ext.kotlin_version = '2.0.0'
repositories {
- google()
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:3.5.0'
- classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
- classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.2'
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
- }
+ google()
+ mavenCentral()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:8.7.3'
+ classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ classpath 'com.google.gms:google-services:4.3.10'
+ classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
+ }
}
allprojects {
- repositories {
- google()
- jcenter()
- mavenCentral()
- maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
- maven { url "https://jitpack.io" }
- maven { url "https://maven.google.com" }
- }
+ repositories {
+ google()
+ mavenCentral()
+ maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
+ maven { url "https://jitpack.io" }
+ maven { url "https://maven.google.com" }
+ }
}
diff --git a/gradle.properties b/gradle.properties
index 5d08ba7..a63fd15 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -15,4 +15,7 @@
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
\ No newline at end of file
+# org.gradle.parallel=true
+android.enableJetifier=true
+android.useAndroidX=true
+android.nonFinalResIds=false
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 8c0fb64..2c35211 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 8068ee5..09523c0 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,7 @@
-#Wed Aug 28 11:46:51 EEST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
+networkTimeout=10000
+validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
diff --git a/gradlew b/gradlew
index 9d82f78..f5feea6 100755
--- a/gradlew
+++ b/gradlew
@@ -1,74 +1,130 @@
-#!/usr/bin/env bash
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
##############################################################################
-##
-## Gradle start up script for UN*X
-##
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
##############################################################################
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
+' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
+MAX_FD=maximum
-warn ( ) {
+warn () {
echo "$*"
-}
+} >&2
-die ( ) {
+die () {
echo
echo "$*"
echo
exit 1
-}
+} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
esac
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
+ JAVACMD=$JAVA_HOME/jre/sh/java
else
- JAVACMD="$JAVA_HOME/bin/java"
+ JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -77,84 +133,120 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+ JAVACMD=java
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
+ fi
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
fi
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
fi
- i=$((i+1))
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
fi
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index aec9973..9b42019 100755
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -1,4 +1,22 @@
-@if "%DEBUG%" == "" @echo off
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
+
+@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@@ -8,26 +26,30 @@
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
+if %ERRORLEVEL% equ 0 goto execute
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
goto fail
@@ -35,54 +57,36 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-if exist "%JAVA_EXE%" goto init
+if exist "%JAVA_EXE%" goto execute
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
goto fail
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
+if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal