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>(); + groupData = new ArrayList<>(); for (Pair item : report.getReportList()) { /* Fill up attribute names for each group */ - m = new HashMap(); + m = new HashMap<>(); m.put(Constants.TITLE_PARAM_NAME, item.first); m.put(Constants.PRICE_PARAM_NAME, Integer.toString(item.second)); @@ -113,10 +111,10 @@ private void initExpandableListView() { int groupTo[] = new int[]{R.id.tv_category, R.id.tv_total}; /* Create list for childDataItems */ - childData = new ArrayList>>(); + childData = new ArrayList<>(); for (Map group : groupData) { - childDataItem = new ArrayList>(); + childDataItem = new ArrayList<>(); /* Fill up attribute names for each child item */ for (Record record : report.getSummaryRecordList()) { if (record.getCategory().equals(group.get(Constants.TITLE_PARAM_NAME))) { @@ -125,7 +123,7 @@ private void initExpandableListView() { price *= -1; } - m = new HashMap(); + m = new HashMap<>(); m.put(Constants.TITLE_PARAM_NAME, record.getTitle()); m.put(Constants.PRICE_PARAM_NAME, Integer.toString(price)); @@ -144,7 +142,7 @@ private void initExpandableListView() { expandableListView.addFooterView(getSummaryReportView(report.getSummaryReportList())); expandableListView.setAdapter(new ExpandableListReportAdapter( - activity, + ReportActivity.this, groupData, R.layout.view_report_item_exp, groupFrom, @@ -159,7 +157,7 @@ private void initExpandableListView() { private View getSummaryReportView(List> summaryReportList) { ViewGroup viewGroup = (ViewGroup) getLayoutInflater().inflate(R.layout.view_summary_report, null); - ReportItemAdapter adapter = new ReportItemAdapter(activity, summaryReportList); + ReportItemAdapter adapter = new ReportItemAdapter(ReportActivity.this, summaryReportList); for (int i = 0; i < adapter.getCount(); i++) { viewGroup.addView(adapter.getView(i, null, null)); diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java new file mode 100644 index 0000000..801dd78 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java @@ -0,0 +1,119 @@ +package com.blogspot.e_kanivets.moneytracker.activity; + +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.controller.TransferController; +import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Account; +import com.blogspot.e_kanivets.moneytracker.model.Transfer; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.Bind; + +public class TransferActivity extends BaseActivity { + @SuppressWarnings("unused") + private static final String TAG = "TransferActivity"; + + private TransferController transferController; + + private List accountList; + + @Bind(R.id.spinner_from) + AppCompatSpinner spinnerFrom; + @Bind(R.id.spinner_to) + AppCompatSpinner spinnerTo; + @Bind(R.id.et_from_amount) + EditText etFromAmount; + @Bind(R.id.et_to_amount) + EditText etToAmount; + + @Override + protected int getContentViewId() { + return R.layout.activity_transfer; + } + + @Override + protected boolean initData() { + DbHelper dbHelper = new DbHelper(TransferActivity.this); + + AccountController accountController = new AccountController(dbHelper); + transferController = new TransferController(dbHelper, accountController); + + accountList = accountController.getAccounts(); + + return super.initData(); + } + + @Override + protected void initViews() { + super.initViews(); + + List accounts = new ArrayList<>(); + for (Account account : accountList) { + accounts.add(account.getTitle()); + } + + spinnerFrom.setAdapter(new ArrayAdapter<>(TransferActivity.this, + android.R.layout.simple_list_item_1, accounts)); + + spinnerTo.setAdapter(new ArrayAdapter<>(TransferActivity.this, + android.R.layout.simple_list_item_1, accounts)); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_transfer, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_done: + doTransfer(); + + setResult(RESULT_OK); + finish(); + return true; + + case R.id.action_close: + finish(); + return true; + + default: + return super.onOptionsItemSelected(item); + } + } + + private void doTransfer() { + Account fromAccount = accountList.get(spinnerFrom.getSelectedItemPosition()); + Account toAccount = accountList.get(spinnerTo.getSelectedItemPosition()); + + int fromAmount = -1; + try { + fromAmount = Integer.parseInt(etFromAmount.getText().toString()); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + + int toAmount = -1; + try { + toAmount = Integer.parseInt(etToAmount.getText().toString()); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + + Transfer transfer = new Transfer(System.currentTimeMillis(), fromAccount.getId(), + toAccount.getId(), fromAmount, toAmount); + transferController.create(transfer); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java new file mode 100644 index 0000000..e011487 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java @@ -0,0 +1,146 @@ +package com.blogspot.e_kanivets.moneytracker.activity.base; + +import android.annotation.SuppressLint; +import android.view.Menu; +import android.view.MenuItem; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.Spinner; + +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.model.Account; +import com.blogspot.e_kanivets.moneytracker.model.Record; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.Bind; + +/** + * Base implementation of {@link android.support.v7.app.AppCompatActivity} to describe some common + * methods which connected with income's/expense's handling. + * Created on 1/26/16. + * + * @author Evgenii Kanivets + */ +public abstract class AddRecordBaseActivity extends BaseActivity { + @SuppressWarnings("unused") + private static final String TAG = "AddRecordBaseActivity"; + + public static final String KEY_RECORD = "key_record"; + public static final String KEY_MODE = "key_mode"; + + protected Record record; + protected Mode mode; + + @Bind(R.id.et_title) + EditText etTitle; + @Bind(R.id.et_category) + EditText etCategory; + @Bind(R.id.et_price) + EditText etPrice; + @Bind(R.id.spinner_account) + Spinner spinnerAccount; + + protected RecordController recordController; + protected AccountController accountController; + + @Override + protected int getContentViewId() { + return R.layout.activity_add_record; + } + + @Override + protected boolean initData() { + super.initData(); + + recordController = new RecordController(new DbHelper(AddRecordBaseActivity.this)); + accountController = new AccountController(new DbHelper(AddRecordBaseActivity.this)); + + record = (Record) getIntent().getSerializableExtra(KEY_RECORD); + mode = (Mode) getIntent().getSerializableExtra(KEY_MODE); + + return mode != null && (!mode.equals(Mode.MODE_EDIT) || record != null); + } + + @SuppressLint("SetTextI18n") + @Override + protected void initViews() { + super.initViews(); + + List accountList = accountController.getAccounts(); + + List accounts = new ArrayList<>(); + for (Account account : accountList) { + accounts.add(account.getTitle()); + } + + spinnerAccount.setAdapter(new ArrayAdapter<>(AddRecordBaseActivity.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); + } + } + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_add_record, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_done: + if (prepareRecord()) { + setResult(RESULT_OK); + finish(); + } else showToast(R.string.wrong_number_text); + return true; + + case R.id.action_close: + finish(); + return true; + + default: + return super.onOptionsItemSelected(item); + } + } + + protected abstract boolean doRecord(String title, String category, int price, Account account); + + private boolean prepareRecord() { + String title = etTitle.getText().toString().trim(); + String category = etCategory.getText().toString().trim(); + + //Check if price is valid + //noinspection UnusedAssignment + int price = -1; + try { + price = Integer.parseInt(etPrice.getText().toString()); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + + if (price >= 0 && price <= 1000000000 && spinnerAccount.getSelectedItemPosition() >= 0) { + Account account = accountController.getAccounts().get(spinnerAccount.getSelectedItemPosition()); + return doRecord(title, category, price, account); + } else return false; + } + + 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/base/BaseActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseActivity.java new file mode 100644 index 0000000..ebda756 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseActivity.java @@ -0,0 +1,50 @@ +package com.blogspot.e_kanivets.moneytracker.activity.base; + +import android.os.Bundle; +import android.support.annotation.LayoutRes; +import android.support.annotation.Nullable; +import android.support.annotation.StringRes; +import android.support.v7.app.AppCompatActivity; +import android.widget.Toast; + +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"; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(getContentViewId()); + + if (initData()) initViews(); + else finish(); + } + + @LayoutRes + protected abstract int getContentViewId(); + + protected boolean initData() { + return true; + } + + protected void initViews() { + ButterKnife.bind(BaseActivity.this); + } + + protected void showToast(String message) { + Toast.makeText(BaseActivity.this, message, Toast.LENGTH_SHORT).show(); + } + + protected void showToast(@StringRes int messageId) { + Toast.makeText(BaseActivity.this, messageId, Toast.LENGTH_SHORT).show(); + } +} \ 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 330a0ca..947b175 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 @@ -1,5 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.adapter; +import android.annotation.SuppressLint; import android.content.Context; import android.view.LayoutInflater; import android.view.View; @@ -12,19 +13,22 @@ import java.util.List; +import butterknife.Bind; +import butterknife.ButterKnife; + /** - * Custom adapter class for Account entity - * Created by evgenii on 6/3/15. + * Custom adapter class for Account entity. + * Created on 6/3/15. + * + * @author Evgenii Kanivets */ public class AccountAdapter extends BaseAdapter { - private Context context; private List accounts; public AccountAdapter(Context context, List accounts) { this.context = context; this.accounts = accounts; - } @Override @@ -42,17 +46,37 @@ public long getItemId(int position) { return position; } + @SuppressLint("SetTextI18n") @Override public View getView(final int position, View convertView, ViewGroup parent) { - LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - convertView = layoutInflater.inflate(R.layout.view_account, null); + ViewHolder viewHolder; + + if (convertView == null) { + LayoutInflater layoutInflater = LayoutInflater.from(context); + + convertView = layoutInflater.inflate(R.layout.view_account, parent, false); + viewHolder = new ViewHolder(convertView); - TextView tvTitle = (TextView) convertView.findViewById(R.id.tv_title); - TextView tvCurSum = (TextView) convertView.findViewById(R.id.tv_cur_sum); + convertView.setTag(viewHolder); + } else viewHolder = (ViewHolder) convertView.getTag(); - tvTitle.setText(accounts.get(position).getTitle()); - tvCurSum.setText(Integer.toString(accounts.get(position).getCurSum())); + Account account = accounts.get(position); + + viewHolder.tvTitle.setText(account.getTitle()); + viewHolder.tvCurSum.setText(Integer.toString(account.getCurSum()) + + " " + account.getCurrency()); return convertView; } + + public static class ViewHolder { + @Bind(R.id.tv_title) + TextView tvTitle; + @Bind(R.id.tv_cur_sum) + TextView tvCurSum; + + 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/ExpandableListReportAdapter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/ExpandableListReportAdapter.java index 015c0e9..5f74037 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/ExpandableListReportAdapter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/ExpandableListReportAdapter.java @@ -1,5 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.adapter; +import android.annotation.SuppressLint; import android.content.Context; import android.view.View; import android.view.ViewGroup; @@ -12,64 +13,81 @@ import java.util.List; import java.util.Map; +import butterknife.Bind; +import butterknife.ButterKnife; + /** - * Created by evgenii on 12/29/14. + * Created on 12/29/14. + * + * @author Evgenii Kanivets */ public class ExpandableListReportAdapter extends SimpleExpandableListAdapter { + private List> groupData; + private List>> childData; - private static final String TAG = ExpandableListReportAdapter.class.getSimpleName(); - - private Context context; - private List> groupData; - private List>> childData; + private int whiteRed; + private int whiteGreen; + private int white; + private int red; + private int green; - public ExpandableListReportAdapter(Context context, List> groupData, + @SuppressWarnings("deprecation") + public ExpandableListReportAdapter(Context context, List> groupData, int groupLayout, String[] groupFrom, int[] groupTo, - List>> childData, + List>> childData, int childLayout, String[] childFrom, int[] childTo) { super(context, groupData, groupLayout, groupFrom, groupTo, childData, childLayout, childFrom, childTo); - this.context = context; this.groupData = groupData; this.childData = childData; + + whiteRed = context.getResources().getColor(R.color.white_red); + whiteGreen = context.getResources().getColor(R.color.white_green); + white = context.getResources().getColor(R.color.white); + red = context.getResources().getColor(R.color.red); + green = context.getResources().getColor(R.color.green); } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { View view = super.getGroupView(groupPosition, isExpanded, convertView, parent); - - customizeView(view, (Map) groupData.get(groupPosition), true); - + customizeView(view, groupData.get(groupPosition), true); return view; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { View view = super.getChildView(groupPosition, childPosition, isLastChild, convertView, parent); - customizeView(view, (Map) childData.get(groupPosition).get(childPosition), false); + customizeView(view, childData.get(groupPosition).get(childPosition), false); return view; } + @SuppressLint("SetTextI18n") private void customizeView(View view, Map values, boolean groupView) { + ViewHolder viewHolder = (ViewHolder) view.getTag(); + if (viewHolder == null) viewHolder = new ViewHolder(view); + /* Customize view to fit to model and UI */ Integer price = Integer.parseInt(values.get(Constants.PRICE_PARAM_NAME)); - if (groupView) { - view.setBackgroundColor(price < 0 ? context.getResources().getColor(R.color.white_red) : - context.getResources().getColor(R.color.white_green)); - } else { - view.setBackgroundColor(context.getResources().getColor(R.color.white)); - } - - TextView tvCategory = (TextView) view.findViewById(R.id.tv_category); - TextView tvTotal = (TextView) view.findViewById(R.id.tv_total); + if (groupView) view.setBackgroundColor(price < 0 ? whiteRed : whiteGreen); + else view.setBackgroundColor(white); //Set color of total - tvTotal.setTextColor(price >= 0 ? - context.getResources().getColor(R.color.green) : - context.getResources().getColor(R.color.red)); + viewHolder.tvTotal.setTextColor(price >= 0 ? green : red); + + viewHolder.tvCategory.setText(values.get(Constants.TITLE_PARAM_NAME)); + viewHolder.tvTotal.setText((price >= 0 ? "+ " : "- ") + Math.abs(price)); + } + + public static class ViewHolder { + @Bind(R.id.tv_category) + TextView tvCategory; + @Bind(R.id.tv_total) + TextView tvTotal; - tvCategory.setText(values.get(Constants.TITLE_PARAM_NAME)); - tvTotal.setText((price >= 0 ? "+ " : "- ") + Math.abs(price)); + 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/RecordAdapter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordAdapter.java index 3298661..f1caf8f 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordAdapter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordAdapter.java @@ -1,5 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.adapter; +import android.annotation.SuppressLint; import android.content.Context; import android.view.LayoutInflater; import android.view.View; @@ -14,18 +15,33 @@ import java.util.Date; import java.util.List; +import butterknife.Bind; +import butterknife.ButterKnife; + /** - * Created by eugene on 01/09/14. + * Custom adapter class for {@link Record} entity. + * Created on 01/09/14. + * + * @author Evgenii Kanivets */ public class RecordAdapter extends BaseAdapter{ - private Context context; private List records; + private int whiteRed; + private int whiteGreen; + private int red; + private int green; + + @SuppressWarnings("deprecation") public RecordAdapter(Context context, List records) { this.context = context; this.records = records; + whiteRed = context.getResources().getColor(R.color.white_red); + whiteGreen = context.getResources().getColor(R.color.white_green); + red = context.getResources().getColor(R.color.red); + green = context.getResources().getColor(R.color.green); } @Override @@ -43,35 +59,47 @@ public long getItemId(int position) { return position; } + @SuppressLint("SetTextI18n") @Override public View getView(final int position, View convertView, ViewGroup parent) { - LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - convertView = layoutInflater.inflate(R.layout.view_record, null); + ViewHolder viewHolder; - TextView tvTime = (TextView) convertView.findViewById(R.id.tv_date_and_time); - TextView tvPrice = (TextView) convertView.findViewById(R.id.tv_price); - TextView tvTitle = (TextView) convertView.findViewById(R.id.tv_title); - TextView tvCategory = (TextView) convertView.findViewById(R.id.tv_category); + if (convertView == null) { + LayoutInflater layoutInflater = LayoutInflater.from(context); - //Set background color of view according to type - convertView.setBackgroundColor(records.get(position).isIncome() ? - context.getResources().getColor(R.color.white_green) : - context.getResources().getColor(R.color.white_red)); + convertView = layoutInflater.inflate(R.layout.view_record, parent, false); + viewHolder = new ViewHolder(convertView); - //Set color of price - tvPrice.setTextColor(records.get(position).isIncome() ? - context.getResources().getColor(R.color.green) : - context.getResources().getColor(R.color.red)); + convertView.setTag(viewHolder); + } else viewHolder = (ViewHolder) convertView.getTag(); - //Format date of record to display it on screen + convertView.setBackgroundColor(records.get(position).isIncome() ? whiteGreen : whiteRed); + viewHolder.tvPrice.setTextColor(records.get(position).isIncome() ? green : red); + + @SuppressLint("SimpleDateFormat") SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - tvTime.setText(dateFormat.format(new Date(records.get(position).getTime()))); + viewHolder.tvDateAndTime.setText(dateFormat.format(new Date(records.get(position).getTime()))); - tvPrice.setText((records.get(position).isIncome() ? "+ " : "- ") + viewHolder.tvPrice.setText((records.get(position).isIncome() ? "+ " : "- ") + Integer.toString(records.get(position).getPrice())); - tvTitle.setText(records.get(position).getTitle()); - tvCategory.setText(records.get(position).getCategory()); + viewHolder.tvTitle.setText(records.get(position).getTitle()); + viewHolder.tvCategory.setText(records.get(position).getCategory()); return convertView; } + + public static class ViewHolder { + @Bind(R.id.tv_date_and_time) + TextView tvDateAndTime; + @Bind(R.id.tv_price) + TextView tvPrice; + @Bind(R.id.tv_title) + TextView tvTitle; + @Bind(R.id.tv_category) + TextView tvCategory; + + 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/ReportItemAdapter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/ReportItemAdapter.java index 924c4d6..b42a609 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/ReportItemAdapter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/ReportItemAdapter.java @@ -1,5 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.adapter; +import android.annotation.SuppressLint; import android.content.Context; import android.util.Pair; import android.view.LayoutInflater; @@ -9,20 +10,37 @@ import android.widget.TextView; import com.blogspot.e_kanivets.moneytracker.R; +import com.blogspot.e_kanivets.moneytracker.model.Record; import java.util.List; +import butterknife.Bind; +import butterknife.ButterKnife; + /** - * Created by eugene on 11/09/14. + * Custom adapter class for {@link Record} entity. + * Created on 11/09/14. + * + * @author Evgenii Kanivets */ public class ReportItemAdapter extends BaseAdapter { - private Context context; private List> records; + private int whiteRed; + private int whiteGreen; + private int red; + private int green; + + @SuppressWarnings("deprecation") public ReportItemAdapter(Context context, List> records) { this.context = context; this.records = records; + + whiteRed = context.getResources().getColor(R.color.white_red); + whiteGreen = context.getResources().getColor(R.color.white_green); + red = context.getResources().getColor(R.color.red); + green = context.getResources().getColor(R.color.green); } @Override @@ -40,32 +58,44 @@ public long getItemId(int i) { return i; } + @SuppressLint("SetTextI18n") @Override - public View getView(int i, View view, ViewGroup viewGroup) { - LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - view = layoutInflater.inflate(R.layout.view_summary_report_item, null); + public View getView(int i, View convertView, ViewGroup parent) { + ViewHolder viewHolder; - //Customize view to fit to model and UI - if (i == getCount() - 1) { - view.findViewById(R.id.line).setVisibility(View.VISIBLE); - } - if (i == getCount() - 3) { - view.findViewById(R.id.line).setVisibility(View.VISIBLE); - } - view.setBackgroundColor(records.get(i).second < 0 ? context.getResources().getColor(R.color.white_red) : - context.getResources().getColor(R.color.white_green)); + if (convertView == null) { + LayoutInflater layoutInflater = LayoutInflater.from(context); + + convertView = layoutInflater.inflate(R.layout.view_summary_report_item, parent, false); + viewHolder = new ViewHolder(convertView); - TextView tvCategory = (TextView) view.findViewById(R.id.tv_category); - TextView tvTotal = (TextView) view.findViewById(R.id.tv_total); + convertView.setTag(viewHolder); + } else viewHolder = (ViewHolder) convertView.getTag(); - //Set color of total - tvTotal.setTextColor(records.get(i).second >= 0 ? - context.getResources().getColor(R.color.green) : - context.getResources().getColor(R.color.red)); + if (i == getCount() - 1) viewHolder.line.setVisibility(View.VISIBLE); + else if (i == getCount() - 3) viewHolder.line.setVisibility(View.VISIBLE); - tvCategory.setText(records.get(i).first); - tvTotal.setText((records.get(i).second >= 0 ? "+ " : "- ") + Math.abs(records.get(i).second)); + convertView.setBackgroundColor(records.get(i).second < 0 ? whiteRed : whiteGreen); - return view; + viewHolder.tvTotal.setTextColor(records.get(i).second >= 0 ? green : red); + + viewHolder.tvCategory.setText(records.get(i).first); + viewHolder.tvTotal.setText((records.get(i).second >= 0 ? "+ " : "- ") + + Math.abs(records.get(i).second)); + + return convertView; + } + + public static class ViewHolder { + @Bind(R.id.line) + View line; + @Bind(R.id.tv_category) + TextView tvCategory; + @Bind(R.id.tv_total) + TextView tvTotal; + + 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/controller/AccountController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/AccountController.java index abed244..606c13b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/AccountController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/AccountController.java @@ -3,9 +3,13 @@ import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; +import android.support.annotation.Nullable; +import android.util.Log; import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Account; +import com.blogspot.e_kanivets.moneytracker.model.Record; +import com.blogspot.e_kanivets.moneytracker.model.Transfer; import java.util.ArrayList; import java.util.List; @@ -17,6 +21,8 @@ * @author Evgenii Kanivets */ public class AccountController { + private static final String TAG = "AccountController"; + private DbHelper dbHelper; public AccountController(DbHelper dbHelper) { @@ -36,12 +42,14 @@ public List getAccounts() { int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); int titleColIndex = cursor.getColumnIndex(DbHelper.TITLE_COLUMN); int curSumColIndex = cursor.getColumnIndex(DbHelper.CUR_SUM_COLUMN); + int currencyColIndex = cursor.getColumnIndex(DbHelper.CURRENCY_COLUMN); do { // Read a account from DB Account account = new Account(cursor.getInt(idColIndex), cursor.getString(titleColIndex), - cursor.getInt(curSumColIndex)); + cursor.getInt(curSumColIndex), + cursor.getString(currencyColIndex)); //Add account to list accountList.add(account); @@ -54,51 +62,143 @@ public List getAccounts() { return accountList; } - public void updateAccountById(int id, int diff) { - SQLiteDatabase db = dbHelper.getWritableDatabase(); - - // Read account from db - Cursor cursor = db.query(DbHelper.TABLE_ACCOUNTS, null, "id=?", new String[]{Integer.valueOf(id).toString()}, null, null, null); + @Nullable + public Account read(long id) { Account account = null; + + SQLiteDatabase db = dbHelper.getReadableDatabase(); + + // Read accounts table from db + Cursor cursor = db.query(DbHelper.TABLE_ACCOUNTS, null, "id=?", + new String[]{Long.toString(id)}, null, null, null); + if (cursor.moveToFirst()) { // Get indexes of columns int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); int titleColIndex = cursor.getColumnIndex(DbHelper.TITLE_COLUMN); int curSumColIndex = cursor.getColumnIndex(DbHelper.CUR_SUM_COLUMN); + int currencyColIndex = cursor.getColumnIndex(DbHelper.CURRENCY_COLUMN); + + do { + // Read a account from DB + account = new Account(cursor.getInt(idColIndex), + cursor.getString(titleColIndex), + cursor.getInt(curSumColIndex), + cursor.getString(currencyColIndex)); - account = new Account(cursor.getInt(idColIndex), - cursor.getString(titleColIndex), - cursor.getInt(curSumColIndex)); + } while (cursor.moveToNext()); } cursor.close(); + db.close(); - if (account != null) { - ContentValues contentValues = new ContentValues(); - contentValues.put(DbHelper.CUR_SUM_COLUMN, account.getCurSum() + diff); + return account; + } - db.update(DbHelper.TABLE_ACCOUNTS, contentValues, "id=?", new String[]{Integer.valueOf(id).toString()}); - } + public void update(Account account) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + contentValues.put(DbHelper.CUR_SUM_COLUMN, account.getCurSum()); + + db.update(DbHelper.TABLE_ACCOUNTS, contentValues, "id=?", + new String[]{Integer.valueOf(account.getId()).toString()}); + + db.close(); } public void deleteAccount(Account account) { // Delete the account from DB SQLiteDatabase db = dbHelper.getWritableDatabase(); - db.delete(DbHelper.TABLE_ACCOUNTS, "id=?", - new String[]{Integer.toString(account.getId())}); + db.delete(DbHelper.TABLE_ACCOUNTS, "id=?", new String[]{Integer.toString(account.getId())}); db.close(); } - public void addAccount(String title, int curSum) { + public void addAccount(String title, int curSum, String currency) { //Add account to DB SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(DbHelper.TITLE_COLUMN, title); contentValues.put(DbHelper.CUR_SUM_COLUMN, curSum); + contentValues.put(DbHelper.CURRENCY_COLUMN, currency); - int id = (int) db.insert(DbHelper.TABLE_ACCOUNTS, null, contentValues); + db.insert(DbHelper.TABLE_ACCOUNTS, null, contentValues); db.close(); } + + public boolean recordAdded(@Nullable Record record) { + if (record == null) return false; + + Account account = read(record.getAccountId()); + if (account == null) return false; + + switch (record.getType()) { + case Record.TYPE_EXPENSE: + account.take(record.getPrice()); + break; + + case Record.TYPE_INCOME: + account.put(record.getPrice()); + break; + + default: + break; + } + + Log.d(TAG, "recordAdded: " + account); + + update(account); + + return true; + } + + public boolean recordDeleted(@Nullable Record record) { + if (record == null) return false; + + Account account = read(record.getAccountId()); + if (account == null) return false; + + switch (record.getType()) { + case Record.TYPE_EXPENSE: + account.put(record.getPrice()); + break; + + case Record.TYPE_INCOME: + account.take(record.getPrice()); + break; + + default: + break; + } + + update(account); + + return true; + } + + @SuppressWarnings("SimplifiableIfStatement") + public boolean recordUpdated(@Nullable Record oldRecord, @Nullable Record newRecord) { + if (oldRecord == null || newRecord == null) return false; + + return recordDeleted(oldRecord) && recordAdded(newRecord); + } + + public boolean transferDone(@Nullable Transfer transfer) { + if(transfer == null) return false; + + Account fromAccount = read(transfer.getFromAccountId()); + Account toAccount = read(transfer.getToAccountId()); + + if (fromAccount == null || toAccount == null) return false; + + fromAccount.take(transfer.getFromAmount()); + toAccount.put(transfer.getToAmount()); + + update(fromAccount); + update(toAccount); + + return true; + } } \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java index 509ac18..8d3cd42 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java @@ -28,6 +28,43 @@ public RecordController(DbHelper dbHelper) { categoryController = new CategoryController(dbHelper); } + public Record read(long id) { + Record record = null; + + SQLiteDatabase db = dbHelper.getReadableDatabase(); + + //Read records table from db + Cursor cursor = db.query(DbHelper.TABLE_RECORDS, null, "id=?", + new String[]{Long.toString(id)}, null, null, null); + + if (cursor.moveToFirst()) { + //Get indexes of columns + int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); + int timeColIndex = cursor.getColumnIndex(DbHelper.TIME_COLUMN); + int typeColIndex = cursor.getColumnIndex(DbHelper.TYPE_COLUMN); + int titleColIndex = cursor.getColumnIndex(DbHelper.TITLE_COLUMN); + int categoryColIndex = cursor.getColumnIndex(DbHelper.CATEGORY_ID_COLUMN); + int priceColIndex = cursor.getColumnIndex(DbHelper.PRICE_COLUMN); + int accountIdColIndex = cursor.getColumnIndex(DbHelper.ACCOUNT_ID_COLUMN); + + do { + //Read a record from DB + record = new Record(cursor.getInt(idColIndex), + cursor.getLong(timeColIndex), + cursor.getInt(typeColIndex), + cursor.getString(titleColIndex), + cursor.getInt(categoryColIndex), + cursor.getInt(priceColIndex), + cursor.getInt(accountIdColIndex)); + } while (cursor.moveToNext()); + } + + cursor.close(); + db.close(); + + return record; + } + public List getRecords(Period period) { List recordList = new ArrayList<>(); @@ -71,34 +108,36 @@ public List getRecords(Period period) { return recordList; } - public void addRecord(long time, int type, String title, String category, int price, int accountId, int diff) { + public void addRecord(Record record) { //Add category if it does not exist yet - if (categoryController.getCategoryIdByName(category) == -1) - categoryController.addCategory(category); - int categoryId = categoryController.getCategoryIdByName(category); + if (categoryController.getCategoryIdByName(record.getCategory()) == -1) + categoryController.addCategory(record.getCategory()); //Add record to DB SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues contentValues = new ContentValues(); - contentValues.put(DbHelper.TIME_COLUMN, time); - contentValues.put(DbHelper.TYPE_COLUMN, type); - contentValues.put(DbHelper.TITLE_COLUMN, title); - contentValues.put(DbHelper.CATEGORY_ID_COLUMN, categoryId); - contentValues.put(DbHelper.PRICE_COLUMN, price); - contentValues.put(DbHelper.ACCOUNT_ID_COLUMN, accountId); - - int id = (int) db.insert(DbHelper.TABLE_RECORDS, null, contentValues); + contentValues.put(DbHelper.TIME_COLUMN, record.getTime()); + contentValues.put(DbHelper.TYPE_COLUMN, record.getType()); + contentValues.put(DbHelper.TITLE_COLUMN, record.getTitle()); + contentValues.put(DbHelper.CATEGORY_ID_COLUMN, record.getCategoryId()); + contentValues.put(DbHelper.PRICE_COLUMN, record.getPrice()); + contentValues.put(DbHelper.ACCOUNT_ID_COLUMN, record.getAccountId()); - accountController.updateAccountById(accountId, diff); + db.insert(DbHelper.TABLE_RECORDS, null, contentValues); db.close(); + + accountController.recordAdded(record); } - public void updateRecordById(int id, String title, String category, int price, int accountId, int diff) { + public void updateRecordById(int id, String title, String category, int price, int accountId) { //Add category if it does not exist yet if (categoryController.getCategoryIdByName(category) == -1) categoryController.addCategory(category); + + Record oldRecord = read(id); + int categoryId = categoryController.getCategoryIdByName(category); SQLiteDatabase db = dbHelper.getWritableDatabase(); @@ -111,7 +150,11 @@ public void updateRecordById(int id, String title, String category, int price, i db.update(DbHelper.TABLE_RECORDS, contentValues, "id=?", new String[]{Integer.valueOf(id).toString()}); - accountController.updateAccountById(accountId, diff); + db.close(); + + Record newRecord = read(id); + + accountController.recordUpdated(oldRecord, newRecord); } public void deleteRecord(Record record) { @@ -120,8 +163,7 @@ public void deleteRecord(Record record) { new String[]{Integer.toString(record.getId())}); db.close(); - accountController.updateAccountById(record.getAccountId(), record.isIncome() ? - -record.getPrice() : record.getPrice()); + accountController.recordDeleted(record); } public List getRecordsForExport(long fromDate, long toDate) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/TransferController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/TransferController.java new file mode 100644 index 0000000..f1a9ca1 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/TransferController.java @@ -0,0 +1,48 @@ +package com.blogspot.e_kanivets.moneytracker.controller; + +import android.content.ContentValues; +import android.database.sqlite.SQLiteDatabase; +import android.support.annotation.Nullable; +import android.util.Log; + +import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Transfer; + +/** + * Controller class to encapsulate transfer handling logic. + * Created by evgenii_kanivets on 2/10/16. + */ +public class TransferController { + @SuppressWarnings("unused") + private static final String TAG = "TransferController"; + + private DbHelper dbHelper; + private AccountController accountController; + + public TransferController(DbHelper dbHelper, AccountController accountController) { + this.dbHelper = dbHelper; + this.accountController = accountController; + } + + public boolean create(@Nullable Transfer transfer) { + if (transfer == null) return false; + + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + contentValues.put(DbHelper.TIME_COLUMN, transfer.getTime()); + contentValues.put(DbHelper.FROM_ACCOUNT_ID_COLUMN, transfer.getFromAccountId()); + contentValues.put(DbHelper.TO_ACCOUND_ID_COLUMN, transfer.getToAccountId()); + contentValues.put(DbHelper.FROM_AMOUNT_COLUMN, transfer.getFromAmount()); + contentValues.put(DbHelper.TO_AMOUNT_COLUMN, transfer.getToAmount()); + + long id = db.insert(DbHelper.TABLE_TRANSFERS, null, contentValues); + Log.d(TAG, "created transfer with id = " + id); + + db.close(); + + accountController.transferDone(transfer); + + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/AccountsFragment.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/AccountsFragment.java index 51def38..1fe1f04 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/AccountsFragment.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/AccountsFragment.java @@ -9,6 +9,8 @@ import android.support.v7.app.AppCompatActivity; import android.view.ContextMenu; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; @@ -19,30 +21,26 @@ import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.AddAccountActivity; import com.blogspot.e_kanivets.moneytracker.activity.NavDrawerActivity; +import com.blogspot.e_kanivets.moneytracker.activity.TransferActivity; import com.blogspot.e_kanivets.moneytracker.adapter.AccountAdapter; import com.blogspot.e_kanivets.moneytracker.controller.AccountController; import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; -/** - * A simple {@link Fragment} subclass. - * Use the {@link AccountsFragment#newInstance} factory method to - * create an instance of this fragment. - */ -public class AccountsFragment extends Fragment implements View.OnClickListener { +import butterknife.Bind; +import butterknife.ButterKnife; +import butterknife.OnClick; + +public class AccountsFragment extends Fragment { public static final String TAG = "AccountsFragment"; private static final int REQUEST_ADD_ACCOUNT = 1; + private static final int REQUEST_TRANSFER = 2; - private ListView listView; + @Bind(R.id.list_view) + ListView listView; private AccountController accountController; - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @return A new instance of fragment AccountsFragment. - */ public static AccountsFragment newInstance() { AccountsFragment fragment = new AccountsFragment(); Bundle args = new Bundle(); @@ -57,6 +55,7 @@ public AccountsFragment() { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setHasOptionsMenu(true); accountController = new AccountController(new DbHelper(getActivity())); } @@ -71,31 +70,43 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, } @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - - initActionBar(); - - ((NavDrawerActivity) activity).onSectionAttached(TAG); + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.menu_accounts, menu); } @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.btn_add_account: - Intent intent = new Intent(getActivity(), AddAccountActivity.class); - startActivityForResult(intent, REQUEST_ADD_ACCOUNT); + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_transfer: + startActivityForResult(new Intent(getActivity(), TransferActivity.class), + REQUEST_TRANSFER); break; default: break; } + + return super.onOptionsItemSelected(item); + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + + initActionBar(); + + ((NavDrawerActivity) activity).onSectionAttached(TAG); + } + + @OnClick(R.id.btn_add_account) + public void addAccount() { + Intent intent = new Intent(getActivity(), AddAccountActivity.class); + startActivityForResult(intent, REQUEST_ADD_ACCOUNT); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); - getActivity().getMenuInflater().inflate(R.menu.menu_account, menu); } @@ -123,6 +134,10 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { update(); break; + case REQUEST_TRANSFER: + update(); + break; + default: break; } @@ -136,9 +151,7 @@ private void update() { private void initViews(View rootView) { if (rootView != null) { - listView = (ListView) rootView.findViewById(R.id.list_view); - - rootView.findViewById(R.id.btn_add_account).setOnClickListener(this); + ButterKnife.bind(this, rootView); listView.setAdapter(new AccountAdapter(getActivity(), accountController.getAccounts())); ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged(); @@ -150,8 +163,6 @@ private void initViews(View rootView) { private void initActionBar() { ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); - if (actionBar != null) { - actionBar.setCustomView(null); - } + if (actionBar != null) actionBar.setCustomView(null); } } \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/ExportFragment.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/ExportFragment.java index c9916c1..9fdde56 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/ExportFragment.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/ExportFragment.java @@ -21,20 +21,12 @@ import java.io.PrintWriter; import java.util.List; -/** - * A simple {@link Fragment} subclass. - * Use the {@link ExportFragment#newInstance} factory method to - * create an instance of this fragment. - */ -public class ExportFragment extends Fragment implements View.OnClickListener { +import butterknife.ButterKnife; +import butterknife.OnClick; + +public class ExportFragment extends Fragment { public static final String TAG = "ExportFragment"; - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @return A new instance of fragment ExportFragment. - */ public static ExportFragment newInstance() { ExportFragment fragment = new ExportFragment(); Bundle args = new Bundle(); @@ -46,18 +38,9 @@ public ExportFragment() { // Required empty public constructor } - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - if (getArguments() != null) { - } - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - // Inflate the layout for this fragment View rootView = inflater.inflate(R.layout.fragment_export, container, false); initViews(rootView); initActionBar(); @@ -71,22 +54,8 @@ public void onAttach(Activity activity) { ((NavDrawerActivity) activity).onSectionAttached(TAG); } - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.btn_export: - exportRecords(); - break; - - default: - break; - } - } - private void initViews(View rootView) { - if (rootView != null) { - rootView.findViewById(R.id.btn_export).setOnClickListener(this); - } + if (rootView != null) ButterKnife.bind(this, rootView); } private void initActionBar() { @@ -96,7 +65,8 @@ private void initActionBar() { } } - private void exportRecords() { + @OnClick(R.id.btn_export) + public void exportRecords() { RecordController recordController = new RecordController(new DbHelper(getActivity())); List records = recordController.getRecordsForExport(0, Long.MAX_VALUE); diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/NavigationDrawerFragment.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/NavigationDrawerFragment.java index 1ad0c9f..ab8ee5f 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/NavigationDrawerFragment.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/NavigationDrawerFragment.java @@ -246,11 +246,7 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { @Override public boolean onOptionsItemSelected(MenuItem item) { - if (mDrawerToggle.onOptionsItemSelected(item)) { - return true; - } - - return super.onOptionsItemSelected(item); + return mDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item); } /** diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/RecordsFragment.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/RecordsFragment.java index 90720d5..9afafff 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/RecordsFragment.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/RecordsFragment.java @@ -34,25 +34,31 @@ import com.blogspot.e_kanivets.moneytracker.model.Record; import com.blogspot.e_kanivets.moneytracker.ui.AppRateDialog; import com.blogspot.e_kanivets.moneytracker.ui.ChangeDateDialog; -import com.blogspot.e_kanivets.moneytracker.util.AppUtils; +import com.blogspot.e_kanivets.moneytracker.util.PrefUtils; import java.util.Calendar; import java.util.Date; +import butterknife.Bind; +import butterknife.ButterKnife; +import butterknife.OnClick; + /** * A simple {@link Fragment} subclass. * Use the {@link RecordsFragment#newInstance} factory method to * create an instance of this fragment. */ -public class RecordsFragment extends Fragment implements View.OnClickListener, AdapterView.OnItemSelectedListener { +public class RecordsFragment extends Fragment { public static final String TAG = "RecordsFragment"; private static final int REQUEST_ACTION_RECORD = 1; - private ListView listView; - - private TextView tvFromDate; - private TextView tvToDate; + @Bind(R.id.list_view) + ListView listView; + @Bind(R.id.tv_from_date) + TextView tvFromDate; + @Bind(R.id.tv_to_date) + TextView tvToDate; private RecordController recordController; private PeriodController periodController; @@ -122,75 +128,51 @@ public boolean onContextItemSelected(MenuItem item) { } } - @Override - public void onClick(View view) { - switch (view.getId()) { - case R.id.btn_add_expense: - startAddExpenseActivity(null, AddExpenseActivity.Mode.MODE_ADD); - break; - - case R.id.btn_add_income: - startAddIncomeActivity(null, AddIncomeActivity.Mode.MODE_ADD); - break; - - case R.id.btn_report: - Intent intent = new Intent(getActivity(), ReportActivity.class); - intent.putExtra(ReportActivity.KEY_PERIOD, periodController.getPeriod()); - startActivity(intent); - break; - - case R.id.tv_from_date: - showChangeFromDateDialog(); - break; - - case R.id.tv_to_date: - showChangeToDateDialog(); - break; - - default: - break; - } + @OnClick(R.id.btn_add_expense) + public void addExpense() { + startAddExpenseActivity(null, AddExpenseActivity.Mode.MODE_ADD); } - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - Calendar calendar = Calendar.getInstance(); - calendar.clear(Calendar.MINUTE); - calendar.clear(Calendar.SECOND); - calendar.clear(Calendar.MILLISECOND); - - switch (position) { - // Day period - case 0: - periodController.setPeriod(PeriodHelper.getInstance().getDayPeriod()); - break; - // Week period - case 1: - periodController.setPeriod(PeriodHelper.getInstance().getWeekPeriod()); - break; - // Month period - case 2: - periodController.setPeriod(PeriodHelper.getInstance().getMonthPeriod()); - break; - // Year period - case 3: - periodController.setPeriod(PeriodHelper.getInstance().getYearPeriod()); - break; - default: - break; - } + @OnClick(R.id.btn_add_income) + public void addIncome() { + startAddIncomeActivity(null, AddIncomeActivity.Mode.MODE_ADD); + } - AppUtils.writeUsedPeriod(getActivity(), position); + @OnClick(R.id.btn_report) + public void showReport() { + Intent intent = new Intent(getActivity(), ReportActivity.class); + intent.putExtra(ReportActivity.KEY_PERIOD, periodController.getPeriod()); + startActivity(intent); + } - update(); + @OnClick(R.id.tv_from_date) + public void showChangeFromDateDialog() { + ChangeDateDialog dialog = new ChangeDateDialog(getActivity(), + periodController.getPeriod().getFirst(), new ChangeDateDialog.OnDateChangedListener() { + @Override + public void OnDataChanged(Date date) { + periodController.getPeriod().setFirst(date); + update(); - tvFromDate.setText(periodController.getFirstDay()); - tvToDate.setText(periodController.getLastDay()); + tvFromDate.setText(periodController.getFirstDay()); + } + }); + dialog.show(); } - @Override - public void onNothingSelected(AdapterView parent) { + @OnClick(R.id.tv_to_date) + public void showChangeToDateDialog() { + ChangeDateDialog dialog = new ChangeDateDialog(getActivity(), + periodController.getPeriod().getLast(), new ChangeDateDialog.OnDateChangedListener() { + @Override + public void OnDataChanged(Date date) { + periodController.getPeriod().setLast(date); + update(); + tvToDate.setText(periodController.getLastDay()); + } + }); + dialog.show(); } @Override @@ -217,26 +199,12 @@ private void update() { private void initViews(View rootView) { if (rootView != null) { - View btnAddIncome = rootView.findViewById(R.id.btn_add_income); - View btnAddExpense = rootView.findViewById(R.id.btn_add_expense); - View btnReport = rootView.findViewById(R.id.btn_report); - - tvFromDate = (TextView) rootView.findViewById(R.id.tv_from_date); - tvToDate = (TextView) rootView.findViewById(R.id.tv_to_date); - - listView = (ListView) rootView.findViewById(R.id.listView); + ButterKnife.bind(this, rootView); //Set dates of current week tvFromDate.setText(periodController.getFirstDay()); tvToDate.setText(periodController.getLastDay()); - //Set listeners - btnAddIncome.setOnClickListener(RecordsFragment.this); - btnAddExpense.setOnClickListener(RecordsFragment.this); - tvFromDate.setOnClickListener(RecordsFragment.this); - tvToDate.setOnClickListener(RecordsFragment.this); - btnReport.setOnClickListener(RecordsFragment.this); - listView.setAdapter(new RecordAdapter(getActivity(), recordController.getRecords(periodController.getPeriod()))); ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged(); @@ -250,9 +218,7 @@ public void onGlobalLayout() { if (isFirst) { isFirst = false; listView.setSelection(listView.getCount() - 1); - if (AppUtils.checkRateDialog(getActivity())) { - showAppRateDialog(); - } + if (PrefUtils.checkRateDialog()) showAppRateDialog(); } } }); @@ -274,40 +240,51 @@ private void initActionBar() { Spinner spinner = (Spinner) customNav.findViewById(R.id.spinner_period); spinner.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, getResources().getStringArray(R.array.array_periods))); - spinner.setSelection(AppUtils.readUsedPeriod(getActivity())); - spinner.setOnItemSelectedListener(this); + spinner.setSelection(PrefUtils.readUsedPeriod()); + spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + Calendar calendar = Calendar.getInstance(); + calendar.clear(Calendar.MINUTE); + calendar.clear(Calendar.SECOND); + calendar.clear(Calendar.MILLISECOND); + + switch (position) { + // Day period + case 0: + periodController.setPeriod(PeriodHelper.getInstance().getDayPeriod()); + break; + // Week period + case 1: + periodController.setPeriod(PeriodHelper.getInstance().getWeekPeriod()); + break; + // Month period + case 2: + periodController.setPeriod(PeriodHelper.getInstance().getMonthPeriod()); + break; + // Year period + case 3: + periodController.setPeriod(PeriodHelper.getInstance().getYearPeriod()); + break; + default: + break; + } - if (actionBar != null) { - actionBar.setCustomView(customNav, lp); - } - } + PrefUtils.writeUsedPeriod(position); - private void showChangeFromDateDialog() { - ChangeDateDialog dialog = new ChangeDateDialog(getActivity(), - periodController.getPeriod().getFirst(), new ChangeDateDialog.OnDateChangedListener() { - @Override - public void OnDataChanged(Date date) { - periodController.getPeriod().setFirst(date); update(); tvFromDate.setText(periodController.getFirstDay()); + tvToDate.setText(periodController.getLastDay()); } - }); - dialog.show(); - } - private void showChangeToDateDialog() { - ChangeDateDialog dialog = new ChangeDateDialog(getActivity(), - periodController.getPeriod().getLast(), new ChangeDateDialog.OnDateChangedListener() { @Override - public void OnDataChanged(Date date) { - periodController.getPeriod().setLast(date); - update(); + public void onNothingSelected(AdapterView parent) { - tvToDate.setText(periodController.getLastDay()); } }); - dialog.show(); + + if (actionBar != null) actionBar.setCustomView(customNav, lp); } private void showAppRateDialog() { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/helper/DBHelper.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/helper/DBHelper.java index d0dfb46..6e49859 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/helper/DBHelper.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/helper/DBHelper.java @@ -29,10 +29,19 @@ public class DbHelper extends SQLiteOpenHelper { /* DB_VERSION = 2 */ public static final String TABLE_ACCOUNTS = "accounts"; + public static final String CURRENCY_COLUMN = "currency"; public static final String ACCOUNT_ID_COLUMN = "account_id"; public static final String CUR_SUM_COLUMN = "cur_sum"; - public static final String DEFAULT_ACCOUNT = "default_account"; + public static final String DEFAULT_ACCOUNT = "Default"; + public static final String DEFAULT_ACCOUNT_CURRENCY = "NON"; + + public static final String TABLE_TRANSFERS = "transfers"; + public static final String FROM_ACCOUNT_ID_COLUMN = "from_account_id"; + public static final String TO_ACCOUND_ID_COLUMN = "to_account_id"; + public static final String FROM_AMOUNT_COLUMN = "from_amount"; + public static final String TO_AMOUNT_COLUMN = "to_amount"; + public static final String CREATED_AT_COLUMN = "created_at"; public DbHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); @@ -49,23 +58,18 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion == 1 && newVersion == 2) { db.beginTransaction(); - /* Create accounts table */ - db.execSQL("CREATE TABLE " + TABLE_ACCOUNTS + "(" - + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," - + TITLE_COLUMN + " TEXT," - + CUR_SUM_COLUMN + " INTEGER);"); + createAccountsTable(db); /* Add account_id column into the records table */ db.execSQL("ALTER TABLE " + TABLE_RECORDS + " ADD COLUMN " + ACCOUNT_ID_COLUMN + " INTEGER;"); + createTransfersTable(db); + /* Insert default account for all records from DB_VERSION = 1 */ - ContentValues contentValues = new ContentValues(); - contentValues.put(TITLE_COLUMN, DEFAULT_ACCOUNT); - contentValues.put(CUR_SUM_COLUMN, 0); - int id = (int) db.insert(TABLE_ACCOUNTS, null, contentValues); + long id = insertDefaultAccount(db); /* Set the default account for all records from DB_VERSION = 1 */ - contentValues = new ContentValues(); + ContentValues contentValues = new ContentValues(); contentValues.put(ACCOUNT_ID_COLUMN, id); db.update(DbHelper.TABLE_RECORDS, contentValues, null, null); @@ -104,16 +108,40 @@ private void createDbVersion2(SQLiteDatabase db) { + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," + NAME_COLUMN + " TEXT" + ");"); + createAccountsTable(db); + + createTransfersTable(db); + + insertDefaultAccount(db); + } + + private void createAccountsTable(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_ACCOUNTS + "(" + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," + + CREATED_AT_COLUMN + " INTEGER," + TITLE_COLUMN + " TEXT," - + CUR_SUM_COLUMN + " INTEGER);"); + + CUR_SUM_COLUMN + " INTEGER," + + CURRENCY_COLUMN + " TEXT );"); + } + + private void createTransfersTable(SQLiteDatabase db) { + db.execSQL("CREATE TABLE " + TABLE_TRANSFERS + "(" + + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," + + TIME_COLUMN + " INTEGER," + + FROM_ACCOUNT_ID_COLUMN + " INTEGER," + + TO_ACCOUND_ID_COLUMN + " INTEGER," + + FROM_AMOUNT_COLUMN + " INTEGER," + + TO_AMOUNT_COLUMN + " INTEGER);"); + } + private long insertDefaultAccount(SQLiteDatabase db) { /* Insert default account for all records from DB_VERSION = 1 */ ContentValues contentValues = new ContentValues(); contentValues.put(TITLE_COLUMN, DEFAULT_ACCOUNT); contentValues.put(CUR_SUM_COLUMN, 0); + contentValues.put(CURRENCY_COLUMN, DEFAULT_ACCOUNT_CURRENCY); + contentValues.put(CREATED_AT_COLUMN, System.currentTimeMillis()); - db.insert(TABLE_ACCOUNTS, null, contentValues); + return db.insert(TABLE_ACCOUNTS, null, contentValues); } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java index 235d5a8..6f7fbfa 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java @@ -8,11 +8,13 @@ public class Account { private int id; private String title; private int curSum; + private String currency; - public Account(int id, String title, int curSum) { + public Account(int id, String title, int curSum, String currency) { this.id = id; this.title = title; this.curSum = curSum; + this.currency = currency; } public int getId() { @@ -35,6 +37,32 @@ public void setCurSum(int curSum) { this.curSum = curSum; } + public String getCurrency() { + return currency; + } + + public void put(int amount) { + curSum += amount; + } + + public void take(int amount) { + curSum -= amount; + } + + @SuppressWarnings("StringBufferReplaceableByString") + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("Account {"); + sb.append("id = ").append(id).append(", "); + sb.append("title = ").append(title).append(", "); + sb.append("curSum = ").append(curSum).append(", "); + sb.append("currency = ").append(currency); + sb.append("}"); + + return sb.toString(); + } + @SuppressWarnings("SimplifiableIfStatement") @Override public boolean equals(Object o) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Category.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Category.java index f58357c..3828031 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Category.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Category.java @@ -1,7 +1,5 @@ package com.blogspot.e_kanivets.moneytracker.model; -import java.util.Calendar; - /** * Created by eugene on 01/09/14. */ diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Record.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Record.java index 80a2c39..ad5e7fb 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Record.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Record.java @@ -2,7 +2,7 @@ import com.blogspot.e_kanivets.moneytracker.controller.CategoryController; import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; -import com.blogspot.e_kanivets.moneytracker.util.MTApp; +import com.blogspot.e_kanivets.moneytracker.MtApp; import java.io.Serializable; @@ -11,6 +11,8 @@ * Created by eugene on 01/09/14. */ public class Record implements Serializable { + public static final int TYPE_INCOME = 0; + public static final int TYPE_EXPENSE = 1; private int id; private long time; @@ -30,7 +32,20 @@ public Record(int id, long time, int type, String title, int categoryId, int pri this.price = price; this.accountId = accountId; - category = new CategoryController(new DbHelper(MTApp.get())).getCategoryById(categoryId); + category = new CategoryController(new DbHelper(MtApp.get())).getCategoryById(categoryId); + } + + public Record(long time, int type, String title, String category, int price, int accountId) { + this.time = time; + this.type = type; + this.title = title; + this.category = category; + this.price = price; + this.accountId = accountId; + } + + public int getType() { + return type; } public int getId() { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Report.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Report.java index 76845d7..a6dd009 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Report.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Report.java @@ -3,16 +3,16 @@ import android.util.Pair; import com.blogspot.e_kanivets.moneytracker.R; -import com.blogspot.e_kanivets.moneytracker.util.MTApp; +import com.blogspot.e_kanivets.moneytracker.MtApp; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.List; /** - * Created by eugene on 11/09/14. + * Created on 11/09/14. + * + * @author Evgenii Kanivets */ public class Report { @@ -86,35 +86,32 @@ private void makeReport() { private void fillReportList(HashMap map) { //Sort reportList - List> reportIncomes = new ArrayList>(); - List> reportExpenses = new ArrayList>(); + List> reportIncomes = new ArrayList<>(); + List> reportExpenses = new ArrayList<>(); for (String name : map.keySet()) { - if (map.get(name) > 0) { - reportIncomes.add(new Pair(name, map.get(name))); - } else { - reportExpenses.add(new Pair(name, map.get(name))); - } + if (map.get(name) > 0) reportIncomes.add(new Pair<>(name, map.get(name))); + else reportExpenses.add(new Pair<>(name, map.get(name))); } sortList(reportIncomes); sortList(reportExpenses); //Added incomes and expenses to ArrayList - reportList = new ArrayList>(); + reportList = new ArrayList<>(); reportList.addAll(reportIncomes); reportList.addAll(reportExpenses); } private void fillSummaryReportList(int totalIncome, int totalExpense) { //Add summary row to list - summaryReportList = new ArrayList>(); - summaryReportList.add(new Pair( - MTApp.get().getResources().getString(R.string.total_incomes) + " :", totalIncome)); - summaryReportList.add(new Pair( - MTApp.get().getResources().getString(R.string.total_expenses) + " :", totalExpense)); - summaryReportList.add(new Pair( - MTApp.get().getResources().getString(R.string.total) + " :", totalExpense + totalIncome)); + summaryReportList = new ArrayList<>(); + summaryReportList.add(new Pair<>( + MtApp.get().getResources().getString(R.string.total_incomes) + " :", totalIncome)); + summaryReportList.add(new Pair<>( + MtApp.get().getResources().getString(R.string.total_expenses) + " :", totalExpense)); + summaryReportList.add(new Pair<>( + MtApp.get().getResources().getString(R.string.total) + " :", totalExpense + totalIncome)); } private void fillRecordList(HashMap recordMap) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Transfer.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Transfer.java new file mode 100644 index 0000000..c7f5b3a --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Transfer.java @@ -0,0 +1,64 @@ +package com.blogspot.e_kanivets.moneytracker.model; + +/** + * Entity class to represent transfer operation between accounts. + * Created on 2/10/16. + * + * @author Evgenii Kanivets + * + * + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," ++ TIME_COLUMN + " INTEGER," ++ FROM_ACCOUNT_ID_COLUMN + " INTEGER," ++ TO_ACCOUND_ID_COLUMN + " INTEGER," ++ FROM_AMOUNT_COLUMN + " INTEGER," ++ TO_AMOUNT_COLUMN + " INTEGER);"); + */ +public class Transfer { + private long id; + private long time; + private long fromAccountId; + private long toAccountId; + private int fromAmount; + private int toAmount; + + public Transfer(long id, long time, long fromAccountId, long toAccountId, int fromAmount, int toAmount) { + this.id = id; + this.time = time; + this.fromAccountId = fromAccountId; + this.toAccountId = toAccountId; + this.fromAmount = fromAmount; + this.toAmount = toAmount; + } + + public Transfer(long time, long fromAccountId, long toAccountId, int fromAmount, int toAmount) { + this.time = time; + this.fromAccountId = fromAccountId; + this.toAccountId = toAccountId; + this.fromAmount = fromAmount; + this.toAmount = toAmount; + } + + public long getId() { + return id; + } + + public long getTime() { + return time; + } + + public long getFromAccountId() { + return fromAccountId; + } + + public long getToAccountId() { + return toAccountId; + } + + public int getFromAmount() { + return fromAmount; + } + + public int getToAmount() { + return toAmount; + } +} \ No newline at end of file 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 0c7ec74..bb6f3ec 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 @@ -5,15 +5,15 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.view.View; -import android.widget.Button; import com.blogspot.e_kanivets.moneytracker.R; -import com.blogspot.e_kanivets.moneytracker.util.AppUtils; +import com.blogspot.e_kanivets.moneytracker.util.PrefUtils; import com.blogspot.e_kanivets.moneytracker.util.Constants; -public class AppRateDialog extends AlertDialog { +import butterknife.ButterKnife; +import butterknife.OnClick; +public class AppRateDialog extends AlertDialog { private Context context; public AppRateDialog(Context context) { @@ -24,38 +24,27 @@ public AppRateDialog(Context context) { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_rate); + ButterKnife.bind(AppRateDialog.this); + } - View view = getLayoutInflater().inflate(R.layout.dialog_rate, null); - setContentView(view); - - Button yesButton = (Button) view.findViewById(R.id.yes_button); - Button maybeButton = (Button) view.findViewById(R.id.maybeButton); - Button thanksButton = (Button) view.findViewById(R.id.thanksButton); - - yesButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - context.startActivity(new Intent(Intent.ACTION_VIEW, - Uri.parse(Constants.GP_MARKET + Constants.APP_NAME))); - AppUtils.appRated(context); - dismiss(); - } - }); + @OnClick(R.id.yes_button) + public void yes() { + context.startActivity(new Intent(Intent.ACTION_VIEW, + Uri.parse(Constants.GP_MARKET + context.getPackageName()))); + PrefUtils.appRated(); + dismiss(); + } - maybeButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - dismiss(); - } - }); + @OnClick(R.id.maybeButton) + public void maybe() { + dismiss(); + } - thanksButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - AppUtils.appRated(context); - dismiss(); - } - }); + @OnClick(R.id.thanksButton) + public void thanks() { + PrefUtils.appRated(); + dismiss(); } @Override @@ -66,4 +55,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 0409973..d963355 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,8 +3,6 @@ import android.app.AlertDialog; import android.content.Context; import android.os.Bundle; -import android.view.View; -import android.widget.Button; import android.widget.DatePicker; import com.blogspot.e_kanivets.moneytracker.R; @@ -12,17 +10,22 @@ import java.util.Calendar; import java.util.Date; +import butterknife.Bind; +import butterknife.ButterKnife; +import butterknife.OnClick; + /** - * Created by eugene on 10/09/14. + * Created on 10/09/14. + * + * @author Evgenii Kanivets */ public class ChangeDateDialog extends AlertDialog{ private Date date; private OnDateChangedListener listener; - private DatePicker datePicker; - private Button btnOk; - private Button btnCancel; + @Bind(R.id.datePicker) + DatePicker datePicker; public ChangeDateDialog(Context context, Date date, OnDateChangedListener listener) { super(context); @@ -34,38 +37,31 @@ public ChangeDateDialog(Context context, Date date, OnDateChangedListener listen protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dialog_change_date); + ButterKnife.bind(ChangeDateDialog.this); Calendar cal = Calendar.getInstance(); cal.setTime(date); - datePicker = (DatePicker) findViewById(R.id.datePicker); - btnOk = (Button) findViewById(R.id.b_ok); - btnCancel = (Button) findViewById(R.id.b_cancel); - datePicker.init(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), null); + } - btnOk.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Calendar cal = Calendar.getInstance(); - cal.set(Calendar.YEAR, datePicker.getYear()); - cal.set(Calendar.MONTH, datePicker.getMonth()); - cal.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth()); + @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()); - listener.OnDataChanged(cal.getTime()); - dismiss(); - } - }); + listener.OnDataChanged(cal.getTime()); + dismiss(); + } - btnCancel.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - dismiss(); - } - }); + @OnClick(R.id.b_cancel) + public void cancel() { + dismiss(); } public interface OnDateChangedListener { - public void OnDataChanged(Date date); + void OnDataChanged(Date date); } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/AppUtils.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/AppUtils.java deleted file mode 100644 index e579e7b..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/AppUtils.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.util; - -import android.content.Context; -import android.content.SharedPreferences; -import android.graphics.Rect; -import android.util.DisplayMetrics; -import android.util.Log; -import android.view.View; - -/** - * Util class for application - * Created by eugene on 02/09/14. - */ -public class AppUtils { - - public static int scaleValue(Context context, int value) { - DisplayMetrics metrics = context.getResources().getDisplayMetrics(); - return (int)(value * (metrics.densityDpi / 320.0)); - } - - /* Dealing with SharedPreferences section */ - - public static void addLaunchCount(Context context) { - SharedPreferences preferences = context.getSharedPreferences(Constants.APP_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.putInt(Constants.LAUNCH_COUNT, preferences.getInt(Constants.LAUNCH_COUNT, 0) + 1); - editor.apply(); - } - - public static boolean checkRateDialog(Context context) { - SharedPreferences preferences = context.getSharedPreferences(Constants.APP_NAME, Context.MODE_PRIVATE); - - boolean appRated = preferences.getBoolean(Constants.APP_RATED, false); - if(appRated) return false; - - int launchCount = preferences.getInt(Constants.LAUNCH_COUNT, 0); - if(launchCount % Constants.RATE_PERIOD == 0) { - return true; - } - else { - return false; - } - } - - public static void appRated(Context context) { - SharedPreferences preferences = context.getSharedPreferences(Constants.APP_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.putBoolean(Constants.APP_RATED, true); - editor.apply(); - } - - public static void addContribution(Context context) { - SharedPreferences preferences = context.getSharedPreferences(Constants.APP_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.putInt(Constants.CONTRIBUTION, preferences.getInt(Constants.CONTRIBUTION, 0) + 1); - editor.apply(); - } - - public static int getContribution(Context context) { - SharedPreferences preferences = context.getSharedPreferences(Constants.APP_NAME, Context.MODE_PRIVATE); - return preferences.getInt(Constants.CONTRIBUTION, 0); - } - - public static int readUsedPeriod(Context context) { - SharedPreferences preferences = context.getSharedPreferences(Constants.APP_NAME, Context.MODE_PRIVATE); - return preferences.getInt(Constants.KEY_USED_PERIOD, Constants.DEFAULT_USED_PERIOD); - } - - public static void writeUsedPeriod(Context context, int usedPeriod) { - SharedPreferences preferences = context.getSharedPreferences(Constants.APP_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.putInt(Constants.KEY_USED_PERIOD, usedPeriod); - editor.apply(); - } - - public static boolean isKeyboardShown(View rootView) { - /* 128dp = 32dp * 4, minimum button height 32dp and generic 4 rows soft keyboard */ - final int SOFT_KEYBOARD_HEIGHT_DP_THRESHOLD = 128; - - Rect r = new Rect(); - rootView.getWindowVisibleDisplayFrame(r); - DisplayMetrics dm = rootView.getResources().getDisplayMetrics(); - /* heightDiff = rootView height - status bar height (r.top) - visible frame height (r.bottom - r.top) */ - int heightDiff = rootView.getBottom() - r.bottom; - /* Threshold size: dp to pixels, multiply with display density */ - - return heightDiff > SOFT_KEYBOARD_HEIGHT_DP_THRESHOLD * dm.density; - } -} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/Constants.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/Constants.java index 39222eb..8fa18bb 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/Constants.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/Constants.java @@ -2,21 +2,22 @@ /** * Constants class. It's better to change it to interface. - * Created by eugene on 29/08/14. + * Created on 29/08/14. + * + * @author Evgenii Kanivets */ -public class Constants { - public static final String APP_NAME = "com.blogspot.e_kanivets.moneytracker"; - public static final String GP_MARKET = "market://details?id="; - public static final String APP_RATED = "app_rated"; - public static final String LAUNCH_COUNT = "launch_count"; - public static final int RATE_PERIOD = 5; - public static final String CONTRIBUTION = "contribution"; - public static final String KEY_USED_PERIOD = "key_used_period"; +public interface Constants { + String GP_MARKET = "market://details?id="; + String APP_RATED = "app_rated"; + String LAUNCH_COUNT = "launch_count"; + int RATE_PERIOD = 5; + String CONTRIBUTION = "contribution"; + String KEY_USED_PERIOD = "key_used_period"; - public static final int DEFAULT_USED_PERIOD = 1; + int DEFAULT_USED_PERIOD = 1; - public static final String TITLE_PARAM_NAME = "title"; - public static final String PRICE_PARAM_NAME = "price"; + String TITLE_PARAM_NAME = "title"; + String PRICE_PARAM_NAME = "price"; - public static final String DEFAULT_EXPORT_FILE_NAME = "money_tracker.csv"; -} + String DEFAULT_EXPORT_FILE_NAME = "money_tracker.csv"; +} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/PrefUtils.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/PrefUtils.java new file mode 100644 index 0000000..4cfd9d2 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/PrefUtils.java @@ -0,0 +1,54 @@ +package com.blogspot.e_kanivets.moneytracker.util; + +import android.content.Context; +import android.content.SharedPreferences; + +import com.blogspot.e_kanivets.moneytracker.MtApp; + +/** + * Util class for application. + * Created on 02/09/14. + * + * @author Evgenii Kanivets + */ +public class PrefUtils { + public static void addLaunchCount() { + SharedPreferences preferences = getDefaultPrefs(); + SharedPreferences.Editor editor = preferences.edit(); + editor.putInt(Constants.LAUNCH_COUNT, preferences.getInt(Constants.LAUNCH_COUNT, 0) + 1); + editor.apply(); + } + + public static boolean checkRateDialog() { + SharedPreferences preferences = getDefaultPrefs(); + + boolean appRated = preferences.getBoolean(Constants.APP_RATED, false); + if (appRated) return false; + + int launchCount = preferences.getInt(Constants.LAUNCH_COUNT, 0); + return launchCount % Constants.RATE_PERIOD == 0; + } + + public static void appRated() { + SharedPreferences preferences = getDefaultPrefs(); + SharedPreferences.Editor editor = preferences.edit(); + editor.putBoolean(Constants.APP_RATED, true); + editor.apply(); + } + + public static int readUsedPeriod() { + SharedPreferences preferences = getDefaultPrefs(); + return preferences.getInt(Constants.KEY_USED_PERIOD, Constants.DEFAULT_USED_PERIOD); + } + + public static void writeUsedPeriod(int usedPeriod) { + SharedPreferences preferences = getDefaultPrefs(); + SharedPreferences.Editor editor = preferences.edit(); + editor.putInt(Constants.KEY_USED_PERIOD, usedPeriod); + editor.apply(); + } + + private static SharedPreferences getDefaultPrefs() { + return MtApp.get().getSharedPreferences(MtApp.get().getPackageName(), Context.MODE_PRIVATE); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/ic_drawer.png b/app/src/main/res/drawable-hdpi/ic_drawer.png deleted file mode 100644 index c59f601..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_drawer.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_drawer.png b/app/src/main/res/drawable-mdpi/ic_drawer.png deleted file mode 100644 index 1ed2c56..0000000 Binary files a/app/src/main/res/drawable-mdpi/ic_drawer.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_drawer.png b/app/src/main/res/drawable-xhdpi/ic_drawer.png deleted file mode 100644 index a5fa74d..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_drawer.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_remove.png b/app/src/main/res/drawable-xxhdpi/ic_action_remove.png deleted file mode 100644 index 331c545..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_remove.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_drawer.png b/app/src/main/res/drawable-xxhdpi/ic_drawer.png deleted file mode 100644 index 9c4685d..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_drawer.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_expand_more_black_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_expand_more_black_48dp.png deleted file mode 100644 index 17016f3..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_expand_more_black_48dp.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_expand_more_grey600_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_expand_more_grey600_48dp.png deleted file mode 100644 index 48942ae..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_expand_more_grey600_48dp.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/splash_logo.png b/app/src/main/res/drawable-xxhdpi/splash_logo.png deleted file mode 100644 index 7732bde..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/splash_logo.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_transfer.png b/app/src/main/res/drawable-xxxhdpi/ic_transfer.png new file mode 100644 index 0000000..1787209 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_transfer.png differ diff --git a/app/src/main/res/drawable/selector_select_period.xml b/app/src/main/res/drawable/selector_select_period.xml deleted file mode 100644 index 4dcc7a0..0000000 --- a/app/src/main/res/drawable/selector_select_period.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ 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 5c68869..1014f13 100644 --- a/app/src/main/res/layout/activity_add_account.xml +++ b/app/src/main/res/layout/activity_add_account.xml @@ -6,57 +6,55 @@ android:orientation="vertical" tools:context="com.blogspot.e_kanivets.moneytracker.activity.AddAccountActivity"> + + + + + + + + android:layout_margin="2dp" + android:orientation="horizontal"> - - - - - - - - + + - - - - - - + android:inputType="number" /> + + + \ 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 206d3bd..e02cff9 100644 --- a/app/src/main/res/layout/activity_add_record.xml +++ b/app/src/main/res/layout/activity_add_record.xml @@ -99,13 +99,13 @@ + android:text="@string/account" + android:layout_weight="3" /> - - - - - -