diff --git a/app/build.gradle b/app/build.gradle
index 42ddb35..0bdbd53 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -49,6 +49,7 @@ dependencies {
compile 'com.android.support:appcompat-v7:23.0.0'
compile 'junit:junit:4.12'
compile 'org.mockito:mockito-core:2.0.2-beta'
+ compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.google.dagger:dagger:2.0.1'
apt 'com.google.dagger:dagger-compiler:2.0.1'
diff --git a/app/src/androidTest/java/com/blogspot/e_kanivets/moneytracker/db/RecordControllerImplTest.java b/app/src/androidTest/java/com/blogspot/e_kanivets/moneytracker/db/RecordControllerImplTest.java
index 85e1ef4..4efbc33 100644
--- a/app/src/androidTest/java/com/blogspot/e_kanivets/moneytracker/db/RecordControllerImplTest.java
+++ b/app/src/androidTest/java/com/blogspot/e_kanivets/moneytracker/db/RecordControllerImplTest.java
@@ -1,7 +1,5 @@
package com.blogspot.e_kanivets.moneytracker.db;
-import static org.junit.Assert.*;
-
/**
* Created by alla on 9/3/15.
*/
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 31ae193..1d1f3e8 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,13 +8,14 @@
+
-
\ No newline at end of file
+
+
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/MTApp.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/MtApp.java
similarity index 62%
rename from app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/MTApp.java
rename to app/src/main/java/com/blogspot/e_kanivets/moneytracker/MtApp.java
index 89d862e..0907939 100644
--- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/MTApp.java
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/MtApp.java
@@ -1,4 +1,4 @@
-package com.blogspot.e_kanivets.moneytracker.util;
+package com.blogspot.e_kanivets.moneytracker;
import android.app.Application;
@@ -8,11 +8,11 @@
*
* @author Evgenii Kanivets
*/
-public class MTApp extends Application {
+public class MtApp extends Application {
- private static MTApp mtApp;
+ private static MtApp mtApp;
- public static MTApp get() {
+ public static MtApp get() {
return mtApp;
}
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddAccountActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddAccountActivity.java
index fecbdca..df4400f 100644
--- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddAccountActivity.java
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddAccountActivity.java
@@ -1,29 +1,48 @@
package com.blogspot.e_kanivets.moneytracker.activity;
-import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.AppCompatSpinner;
import android.view.Menu;
import android.view.MenuItem;
+import android.widget.ArrayAdapter;
import android.widget.EditText;
import com.blogspot.e_kanivets.moneytracker.R;
+import com.blogspot.e_kanivets.moneytracker.activity.base.BaseActivity;
import com.blogspot.e_kanivets.moneytracker.controller.AccountController;
import com.blogspot.e_kanivets.moneytracker.helper.DbHelper;
-public class AddAccountActivity extends AppCompatActivity {
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Currency;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+
+import butterknife.Bind;
+
+public class AddAccountActivity extends BaseActivity {
@SuppressWarnings("unused")
private static final String TAG = "AddAccountActivity";
- private EditText etTitle;
- private EditText etInitSum;
+ @Bind(R.id.et_title)
+ EditText etTitle;
+ @Bind(R.id.et_init_sum)
+ EditText etInitSum;
+ @Bind(R.id.spinner)
+ AppCompatSpinner spinner;
@Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_add_account);
+ protected int getContentViewId() {
+ return R.layout.activity_add_account;
+ }
- initViews();
- initActionBar();
+ @Override
+ protected void initViews() {
+ super.initViews();
+
+ spinner.setAdapter(new ArrayAdapter<>(AddAccountActivity.this,
+ android.R.layout.simple_list_item_1, new ArrayList<>(getAllCurrencies())));
}
@Override
@@ -36,10 +55,7 @@ public boolean onCreateOptionsMenu(Menu menu) {
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_done:
- String title = etTitle.getText().toString();
- int initSum = Integer.parseInt(etInitSum.getText().toString());
-
- new AccountController(new DbHelper(AddAccountActivity.this)).addAccount(title, initSum);
+ addAccount();
setResult(RESULT_OK);
finish();
@@ -54,12 +70,34 @@ public boolean onOptionsItemSelected(MenuItem item) {
}
}
- private void initViews() {
- etTitle = (EditText) findViewById(R.id.et_title);
- etInitSum = (EditText) findViewById(R.id.et_init_sum);
+ private void addAccount() {
+ String title = etTitle.getText().toString().trim();
+ int initSum = Integer.parseInt(etInitSum.getText().toString().trim());
+ String currency = (String) spinner.getSelectedItem();
+
+ new AccountController(new DbHelper(AddAccountActivity.this))
+ .addAccount(title, initSum, currency);
}
- private void initActionBar() {
- if (getSupportActionBar() != null) getSupportActionBar().setCustomView(null);
+ public static List getAllCurrencies() {
+ Set toret = new HashSet<>();
+ Locale[] locs = Locale.getAvailableLocales();
+
+ for (Locale loc : locs) {
+ try {
+ toret.add(Currency.getInstance(loc));
+ } catch (Exception exc) {
+ // Locale not found
+ }
+ }
+
+ List currencyList = new ArrayList<>();
+ for (Currency currency : toret) {
+ currencyList.add(currency.getCurrencyCode());
+ }
+
+ Collections.sort(currencyList);
+
+ return currencyList;
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddExpenseActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddExpenseActivity.java
index ebc0140..02b0c13 100644
--- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddExpenseActivity.java
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddExpenseActivity.java
@@ -1,144 +1,22 @@
package com.blogspot.e_kanivets.moneytracker.activity;
-import android.os.Bundle;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.AppCompatActivity;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.widget.ArrayAdapter;
-import android.widget.EditText;
-import android.widget.Spinner;
-import android.widget.Toast;
-
-import com.blogspot.e_kanivets.moneytracker.R;
-import com.blogspot.e_kanivets.moneytracker.controller.AccountController;
-import com.blogspot.e_kanivets.moneytracker.controller.RecordController;
-import com.blogspot.e_kanivets.moneytracker.helper.DbHelper;
+import com.blogspot.e_kanivets.moneytracker.activity.base.AddRecordBaseActivity;
import com.blogspot.e_kanivets.moneytracker.model.Account;
import com.blogspot.e_kanivets.moneytracker.model.Record;
-import java.util.ArrayList;
import java.util.Date;
-import java.util.List;
-public class AddExpenseActivity extends AppCompatActivity {
+public class AddExpenseActivity extends AddRecordBaseActivity {
@SuppressWarnings("unused")
private static final String TAG = "AddExpenseActivity";
- public static final String KEY_RECORD = "key_record";
- public static final String KEY_MODE = "key_mode";
-
- private Record record;
- private Mode mode;
-
- private EditText etTitle;
- private EditText etCategory;
- private EditText etPrice;
- private Spinner spinnerAccount;
-
- private RecordController recordController;
- private AccountController accountController;
-
@Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_add_record);
-
- recordController = new RecordController(new DbHelper(AddExpenseActivity.this));
- accountController = new AccountController(new DbHelper(AddExpenseActivity.this));
-
- if (getIntent() != null) {
- record = (Record) getIntent().getSerializableExtra(KEY_RECORD);
- mode = (Mode) getIntent().getSerializableExtra(KEY_MODE);
- }
+ protected boolean doRecord(String title, String category, int price, Account account) {
+ if (mode == Mode.MODE_ADD) recordController.addRecord(new Record(new Date().getTime(),
+ Record.TYPE_EXPENSE, title, category, price, account.getId()));
+ else if (mode == Mode.MODE_EDIT)
+ recordController.updateRecordById(record.getId(), title, category, price, account.getId());
- initViews();
- initActionBar();
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.menu_add_record, menu);
return true;
}
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.action_done:
- String title = etTitle.getText().toString();
- String category = etCategory.getText().toString();
-
- //Check if price is valid
- //noinspection UnusedAssignment
- int price = 0;
- try {
- price = Integer.parseInt(etPrice.getText().toString());
- if (price >= 0 && price <= 1000000000) {
- Account account = accountController.getAccounts().get(spinnerAccount.getSelectedItemPosition());
-
- if (mode == Mode.MODE_ADD) recordController.addRecord(new Date().getTime(),
- 1, title, category, price, account.getId(), -price);
- if (mode == Mode.MODE_EDIT)
- recordController.updateRecordById(record.getId(),
- title, category, price, account.getId(), -(price - record.getPrice()));
- } else throw new NumberFormatException();
- } catch (NumberFormatException e) {
- Toast.makeText(AddExpenseActivity.this, getResources().getString(R.string.wrong_number_text),
- Toast.LENGTH_SHORT).show();
- }
-
- setResult(RESULT_OK);
- finish();
- return true;
-
- case R.id.action_close:
- finish();
- return true;
-
- default:
- return super.onOptionsItemSelected(item);
- }
- }
-
- private void initViews() {
- etTitle = (EditText) findViewById(R.id.et_title);
- etCategory = (EditText) findViewById(R.id.et_category);
- etPrice = (EditText) findViewById(R.id.et_price);
-
- List accountList = accountController.getAccounts();
-
- List accounts = new ArrayList<>();
- for (Account account : accountList) {
- accounts.add(account.getTitle());
- }
-
- spinnerAccount = (Spinner) findViewById(R.id.spinner_account);
- spinnerAccount.setAdapter(new ArrayAdapter<>(AddExpenseActivity.this,
- android.R.layout.simple_list_item_1, accounts));
-
- //Add texts to dialog if it's edit dialog
- if (mode == Mode.MODE_EDIT) {
- etTitle.setText(record.getTitle());
- etCategory.setText(record.getCategory());
- etPrice.setText(Integer.toString(record.getPrice()));
-
- for (int i = 0; i < accountList.size(); i++) {
- Account account = accountList.get(i);
- if (account.getId() == record.getAccountId()) {
- spinnerAccount.setSelection(i);
- }
- }
- }
- }
-
- private void initActionBar() {
- ActionBar actionBar = getSupportActionBar();
- if (actionBar != null) {
- actionBar.setCustomView(null);
- }
- }
-
- public enum Mode {MODE_ADD, MODE_EDIT}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddIncomeActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddIncomeActivity.java
index efefa05..4f131fa 100644
--- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddIncomeActivity.java
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddIncomeActivity.java
@@ -1,144 +1,22 @@
package com.blogspot.e_kanivets.moneytracker.activity;
-import android.os.Bundle;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.AppCompatActivity;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.widget.ArrayAdapter;
-import android.widget.EditText;
-import android.widget.Spinner;
-import android.widget.Toast;
-
-import com.blogspot.e_kanivets.moneytracker.R;
-import com.blogspot.e_kanivets.moneytracker.controller.AccountController;
-import com.blogspot.e_kanivets.moneytracker.controller.RecordController;
-import com.blogspot.e_kanivets.moneytracker.helper.DbHelper;
+import com.blogspot.e_kanivets.moneytracker.activity.base.AddRecordBaseActivity;
import com.blogspot.e_kanivets.moneytracker.model.Account;
import com.blogspot.e_kanivets.moneytracker.model.Record;
-import java.util.ArrayList;
import java.util.Date;
-import java.util.List;
-public class AddIncomeActivity extends AppCompatActivity {
+public class AddIncomeActivity extends AddRecordBaseActivity {
@SuppressWarnings("unused")
private static final String TAG = "AddIncomeActivity";
- private static final String KEY_RECORD = "key_record";
- private static final String KEY_MODE = "key_mode";
-
- private Record record;
- private Mode mode;
-
- private EditText etTitle;
- private EditText etCategory;
- private EditText etPrice;
- private Spinner spinnerAccount;
-
- private RecordController recordController;
- private AccountController accountController;
-
@Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_add_record);
-
- recordController = new RecordController(new DbHelper(AddIncomeActivity.this));
- accountController = new AccountController(new DbHelper(AddIncomeActivity.this));
+ protected boolean doRecord(String title, String category, int price, Account account) {
+ if (mode == Mode.MODE_ADD) recordController.addRecord(new Record(new Date().getTime(),
+ Record.TYPE_INCOME, title, category, price, account.getId()));
+ else if (mode == Mode.MODE_EDIT) recordController.updateRecordById(record.getId(),
+ title, category, price, account.getId());
- if (getIntent() != null) {
- record = (Record) getIntent().getSerializableExtra(KEY_RECORD);
- mode = (Mode) getIntent().getSerializableExtra(KEY_MODE);
- }
-
- initViews();
- initActionBar();
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.menu_add_record, menu);
return true;
}
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.action_done:
- String title = etTitle.getText().toString();
- String category = etCategory.getText().toString();
-
- //Check if price is valid
- //noinspection UnusedAssignment
- int price = 0;
- try {
- price = Integer.parseInt(etPrice.getText().toString());
- if (price >= 0 && price <= 1000000000) {
- Account account = accountController.getAccounts().get(spinnerAccount.getSelectedItemPosition());
-
- if (mode == Mode.MODE_ADD) recordController.addRecord(new Date().getTime(),
- 0, title, category, price, account.getId(), price);
- if (mode == Mode.MODE_EDIT) recordController.updateRecordById(record.getId(),
- title, category, price, account.getId(), price - record.getPrice());
- } else throw new NumberFormatException();
- } catch (NumberFormatException e) {
- Toast.makeText(AddIncomeActivity.this, getResources().getString(R.string.wrong_number_text),
- Toast.LENGTH_SHORT).show();
- }
-
- setResult(RESULT_OK);
- finish();
-
- return true;
-
- case R.id.action_close:
- finish();
- return true;
-
- default:
- return super.onOptionsItemSelected(item);
- }
- }
-
- private void initViews() {
- etTitle = (EditText) findViewById(R.id.et_title);
- etCategory = (EditText) findViewById(R.id.et_category);
- etPrice = (EditText) findViewById(R.id.et_price);
-
- List accountList = accountController.getAccounts();
-
- List accounts = new ArrayList<>();
- for (Account account : accountList) {
- accounts.add(account.getTitle());
- }
-
- spinnerAccount = (Spinner) findViewById(R.id.spinner_account);
- spinnerAccount.setAdapter(new ArrayAdapter<>(AddIncomeActivity.this,
- android.R.layout.simple_list_item_1, accounts));
-
- //Add texts to dialog if it's edit dialog
- if (mode == Mode.MODE_EDIT) {
- etTitle.setText(record.getTitle());
- etCategory.setText(record.getCategory());
- etPrice.setText(Integer.toString(record.getPrice()));
-
- for (int i = 0; i < accountList.size(); i++) {
- Account account = accountList.get(i);
- if (account.getId() == record.getAccountId()) {
- spinnerAccount.setSelection(i);
- }
- }
- }
- }
-
- private void initActionBar() {
- ActionBar actionBar = getSupportActionBar();
- if (actionBar != null) {
- actionBar.setCustomView(null);
- }
- }
-
- public enum Mode {MODE_ADD, MODE_EDIT}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/NavDrawerActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/NavDrawerActivity.java
index 6c71c81..7c8d167 100644
--- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/NavDrawerActivity.java
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/NavDrawerActivity.java
@@ -1,24 +1,29 @@
package com.blogspot.e_kanivets.moneytracker.activity;
-import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
-import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import com.blogspot.e_kanivets.moneytracker.R;
+import com.blogspot.e_kanivets.moneytracker.activity.base.BaseActivity;
import com.blogspot.e_kanivets.moneytracker.fragment.AccountsFragment;
import com.blogspot.e_kanivets.moneytracker.fragment.ExportFragment;
import com.blogspot.e_kanivets.moneytracker.fragment.NavigationDrawerFragment;
import com.blogspot.e_kanivets.moneytracker.fragment.RecordsFragment;
-import com.blogspot.e_kanivets.moneytracker.util.AppUtils;
+import com.blogspot.e_kanivets.moneytracker.util.PrefUtils;
-public class NavDrawerActivity extends AppCompatActivity
+import butterknife.Bind;
+
+public class NavDrawerActivity extends BaseActivity
implements NavigationDrawerFragment.NavigationDrawerCallbacks {
@SuppressWarnings("unused")
private static final String TAG = "NavDrawerActivity";
+
+ @Bind(R.id.drawer_layout)
+ DrawerLayout drawerLayout;
+
/**
* Fragment managing the behaviors, interactions and presentation of the navigation drawer.
*/
@@ -30,21 +35,26 @@ public class NavDrawerActivity extends AppCompatActivity
private CharSequence mTitle;
@Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_nav_drawer);
+ protected int getContentViewId() {
+ return R.layout.activity_nav_drawer;
+ }
+
+ @Override
+ protected boolean initData() {
+ PrefUtils.addLaunchCount();
+ return true;
+ }
- /* Increment launch count */
- AppUtils.addLaunchCount(NavDrawerActivity.this);
+ @Override
+ protected void initViews() {
+ super.initViews();
mNavigationDrawerFragment = (NavigationDrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
// Set up the drawer.
- mNavigationDrawerFragment.setUp(
- R.id.navigation_drawer,
- (DrawerLayout) findViewById(R.id.drawer_layout));
+ mNavigationDrawerFragment.setUp(R.id.navigation_drawer, drawerLayout);
}
@Override
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.java
index b7ea0f3..6a3dc74 100644
--- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.java
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.java
@@ -1,16 +1,14 @@
package com.blogspot.e_kanivets.moneytracker.activity;
-import android.app.Activity;
-import android.os.Bundle;
import android.util.Pair;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
-import android.view.Window;
import android.widget.ExpandableListView;
import android.widget.ListView;
import com.blogspot.e_kanivets.moneytracker.R;
+import com.blogspot.e_kanivets.moneytracker.activity.base.BaseActivity;
import com.blogspot.e_kanivets.moneytracker.adapter.ExpandableListReportAdapter;
import com.blogspot.e_kanivets.moneytracker.adapter.ReportItemAdapter;
import com.blogspot.e_kanivets.moneytracker.controller.RecordController;
@@ -25,46 +23,46 @@
import java.util.List;
import java.util.Map;
-public class ReportActivity extends Activity {
+import butterknife.Bind;
+
+public class ReportActivity extends BaseActivity {
@SuppressWarnings("unused")
private static final String TAG = "ReportActivity";
public static final String KEY_PERIOD = "key_period";
- private Activity activity;
private Report report;
- private ListView listView;
- private ExpandableListView expandableListView;
+ @Bind(R.id.list_view)
+ ListView listView;
+ @Bind(R.id.exp_list_view)
+ ExpandableListView expandableListView;
private RecordController recordController;
private Period period;
@Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.activity_report);
+ protected int getContentViewId() {
+ return R.layout.activity_report;
+ }
+
+ @Override
+ protected boolean initData() {
+ super.initData();
recordController = new RecordController(new DbHelper(ReportActivity.this));
period = getIntent().getParcelableExtra(KEY_PERIOD);
- if (period == null) {
- finish();
- return;
- }
-
- activity = this;
report = new Report(recordController.getRecords(period));
- initViews();
+ return period != null;
}
- private void initViews() {
- listView = (ListView) findViewById(R.id.listView);
- expandableListView = (ExpandableListView) findViewById(R.id.expandableListView);
+ @Override
+ protected void initViews() {
+ super.initViews();
- listView.setAdapter(new ReportItemAdapter(activity,
+ listView.setAdapter(new ReportItemAdapter(ReportActivity.this,
new Report(recordController.getRecords(period)).getReportList()));
/* Scroll list to bottom only once at start */
@@ -97,10 +95,10 @@ private void initExpandableListView() {
Map m;
/* Fill the group list */
- groupData = new ArrayList