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/DbHelper.java similarity index 96% rename from app/src/main/java/com/blogspot/e_kanivets/moneytracker/helper/DBHelper.java rename to app/src/main/java/com/blogspot/e_kanivets/moneytracker/DbHelper.java index 6e49859..d3002f9 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/helper/DBHelper.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/DbHelper.java @@ -1,4 +1,4 @@ -package com.blogspot.e_kanivets.moneytracker.helper; +package com.blogspot.e_kanivets.moneytracker; import android.content.ContentValues; import android.content.Context; @@ -38,7 +38,7 @@ public class DbHelper extends SQLiteOpenHelper { 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 TO_ACCOUNT_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"; @@ -129,7 +129,7 @@ private void createTransfersTable(SQLiteDatabase db) { + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," + TIME_COLUMN + " INTEGER," + FROM_ACCOUNT_ID_COLUMN + " INTEGER," - + TO_ACCOUND_ID_COLUMN + " INTEGER," + + TO_ACCOUNT_ID_COLUMN + " INTEGER," + FROM_AMOUNT_COLUMN + " INTEGER," + TO_AMOUNT_COLUMN + " INTEGER);"); } 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 df4400f..dc5d592 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 @@ -8,8 +8,9 @@ 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; +import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Account; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; import java.util.ArrayList; import java.util.Collections; @@ -75,8 +76,9 @@ private void addAccount() { int initSum = Integer.parseInt(etInitSum.getText().toString().trim()); String currency = (String) spinner.getSelectedItem(); - new AccountController(new DbHelper(AddAccountActivity.this)) - .addAccount(title, initSum, currency); + Account account = new Account(title, initSum, currency); + + new AccountRepo(new DbHelper(AddAccountActivity.this)).create(account); } public static List getAllCurrencies() { 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 02b0c13..4c06230 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 @@ -12,10 +12,15 @@ public class AddExpenseActivity extends AddRecordBaseActivity { @Override protected boolean doRecord(String title, String category, int price, Account account) { - if (mode == Mode.MODE_ADD) recordController.addRecord(new Record(new Date().getTime(), + if (mode == Mode.MODE_ADD) recordRepo.create(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()); + else if (mode == Mode.MODE_EDIT) { + record.setTitle(title); + record.setCategory(category); + record.setPrice(price); + record.setAccountId(account.getId()); + recordRepo.update(record); + } return true; } 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 4f131fa..208bd66 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 @@ -12,10 +12,15 @@ public class AddIncomeActivity extends AddRecordBaseActivity { @Override protected boolean doRecord(String title, String category, int price, Account account) { - if (mode == Mode.MODE_ADD) recordController.addRecord(new Record(new Date().getTime(), + if (mode == Mode.MODE_ADD) recordRepo.create(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()); + else if (mode == Mode.MODE_EDIT) { + record.setTitle(title); + record.setCategory(category); + record.setPrice(price); + record.setAccountId(account.getId()); + recordRepo.update(record); + } return true; } 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 6a3dc74..d7d0129 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 @@ -11,11 +11,18 @@ 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.AccountController; +import com.blogspot.e_kanivets.moneytracker.controller.CategoryController; import com.blogspot.e_kanivets.moneytracker.controller.RecordController; -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Category; import com.blogspot.e_kanivets.moneytracker.model.Period; import com.blogspot.e_kanivets.moneytracker.model.Record; import com.blogspot.e_kanivets.moneytracker.model.Report; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; +import com.blogspot.e_kanivets.moneytracker.repo.CategoryRepo; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; +import com.blogspot.e_kanivets.moneytracker.repo.RecordRepo; import com.blogspot.e_kanivets.moneytracker.util.Constants; import java.util.ArrayList; @@ -50,10 +57,16 @@ protected int getContentViewId() { protected boolean initData() { super.initData(); - recordController = new RecordController(new DbHelper(ReportActivity.this)); + DbHelper dbHelper = new DbHelper(ReportActivity.this); + IRepo categoryRepo = new CategoryRepo(dbHelper); + CategoryController categoryController = new CategoryController(categoryRepo); + AccountController accountController = new AccountController(new AccountRepo(dbHelper)); + IRepo recordRepo = new RecordRepo(dbHelper, accountController, categoryController); + + recordController = new RecordController(recordRepo, categoryRepo); period = getIntent().getParcelableExtra(KEY_PERIOD); - report = new Report(recordController.getRecords(period)); + report = new Report(recordController.getRecordsForPeriod(period)); return period != null; } @@ -63,7 +76,7 @@ protected void initViews() { super.initViews(); listView.setAdapter(new ReportItemAdapter(ReportActivity.this, - new Report(recordController.getRecords(period)).getReportList())); + new Report(recordController.getRecordsForPeriod(period)).getReportList())); /* Scroll list to bottom only once at start */ listView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 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 index 801dd78..e8056ea 100644 --- 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 @@ -9,10 +9,12 @@ 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.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Account; import com.blogspot.e_kanivets.moneytracker.model.Transfer; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; +import com.blogspot.e_kanivets.moneytracker.repo.TransferRepo; import java.util.ArrayList; import java.util.List; @@ -23,7 +25,7 @@ public class TransferActivity extends BaseActivity { @SuppressWarnings("unused") private static final String TAG = "TransferActivity"; - private TransferController transferController; + private IRepo transferRepo; private List accountList; @@ -45,10 +47,11 @@ protected int getContentViewId() { protected boolean initData() { DbHelper dbHelper = new DbHelper(TransferActivity.this); - AccountController accountController = new AccountController(dbHelper); - transferController = new TransferController(dbHelper, accountController); + IRepo accountRepo = new AccountRepo(dbHelper); + AccountController accountController = new AccountController(accountRepo); + transferRepo = new TransferRepo(dbHelper, accountController); - accountList = accountController.getAccounts(); + accountList = accountRepo.readAll(); return super.initData(); } @@ -114,6 +117,6 @@ private void doTransfer() { Transfer transfer = new Transfer(System.currentTimeMillis(), fromAccount.getId(), toAccount.getId(), fromAmount, toAmount); - transferController.create(transfer); + transferRepo.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 index e011487..00c6750 100644 --- 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 @@ -9,10 +9,14 @@ 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.controller.CategoryController; +import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Account; import com.blogspot.e_kanivets.moneytracker.model.Record; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; +import com.blogspot.e_kanivets.moneytracker.repo.CategoryRepo; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; +import com.blogspot.e_kanivets.moneytracker.repo.RecordRepo; import java.util.ArrayList; import java.util.List; @@ -36,6 +40,11 @@ public abstract class AddRecordBaseActivity extends BaseActivity { protected Record record; protected Mode mode; + protected List accountList; + + protected IRepo accountRepo; + protected IRepo recordRepo; + @Bind(R.id.et_title) EditText etTitle; @Bind(R.id.et_category) @@ -45,9 +54,6 @@ public abstract class AddRecordBaseActivity extends BaseActivity { @Bind(R.id.spinner_account) Spinner spinnerAccount; - protected RecordController recordController; - protected AccountController accountController; - @Override protected int getContentViewId() { return R.layout.activity_add_record; @@ -57,11 +63,15 @@ protected int getContentViewId() { protected boolean initData() { super.initData(); - recordController = new RecordController(new DbHelper(AddRecordBaseActivity.this)); - accountController = new AccountController(new DbHelper(AddRecordBaseActivity.this)); + DbHelper dbHelper = new DbHelper(AddRecordBaseActivity.this); + + accountRepo = new AccountRepo(dbHelper); + recordRepo = new RecordRepo(dbHelper, new AccountController(accountRepo), + new CategoryController(new CategoryRepo(dbHelper))); record = (Record) getIntent().getSerializableExtra(KEY_RECORD); mode = (Mode) getIntent().getSerializableExtra(KEY_MODE); + accountList = accountRepo.readAll(); return mode != null && (!mode.equals(Mode.MODE_EDIT) || record != null); } @@ -71,8 +81,6 @@ record = (Record) getIntent().getSerializableExtra(KEY_RECORD); protected void initViews() { super.initViews(); - List accountList = accountController.getAccounts(); - List accounts = new ArrayList<>(); for (Account account : accountList) { accounts.add(account.getTitle()); @@ -137,7 +145,7 @@ private boolean prepareRecord() { } if (price >= 0 && price <= 1000000000 && spinnerAccount.getSelectedItemPosition() >= 0) { - Account account = accountController.getAccounts().get(spinnerAccount.getSelectedItemPosition()); + Account account = accountList.get(spinnerAccount.getSelectedItemPosition()); return doRecord(title, category, price, account); } else return false; } 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 606c13b..a7d2e3b 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 @@ -1,18 +1,11 @@ package com.blogspot.e_kanivets.moneytracker.controller; -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; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; /** * Controller class to encapsulate account handling logic. @@ -21,117 +14,19 @@ * @author Evgenii Kanivets */ public class AccountController { + @SuppressWarnings("unused") private static final String TAG = "AccountController"; - private DbHelper dbHelper; - - public AccountController(DbHelper dbHelper) { - this.dbHelper = dbHelper; - } - - public List getAccounts() { - List accountList = new ArrayList<>(); - - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - // Read accounts table from db - Cursor cursor = db.query(DbHelper.TABLE_ACCOUNTS, null, null, null, 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 account = new Account(cursor.getInt(idColIndex), - cursor.getString(titleColIndex), - cursor.getInt(curSumColIndex), - cursor.getString(currencyColIndex)); - - //Add account to list - accountList.add(account); - } while (cursor.moveToNext()); - } - - cursor.close(); - db.close(); - - return accountList; - } - - @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); + private IRepo accountRepo; - do { - // Read a account from DB - account = new Account(cursor.getInt(idColIndex), - cursor.getString(titleColIndex), - cursor.getInt(curSumColIndex), - cursor.getString(currencyColIndex)); - - } while (cursor.moveToNext()); - } - - cursor.close(); - db.close(); - - return account; - } - - 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.close(); - } - - 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); - - db.insert(DbHelper.TABLE_ACCOUNTS, null, contentValues); - - db.close(); + public AccountController(IRepo accountRepo) { + this.accountRepo = accountRepo; } public boolean recordAdded(@Nullable Record record) { if (record == null) return false; - Account account = read(record.getAccountId()); + Account account = accountRepo.read(record.getAccountId()); if (account == null) return false; switch (record.getType()) { @@ -147,9 +42,7 @@ public boolean recordAdded(@Nullable Record record) { break; } - Log.d(TAG, "recordAdded: " + account); - - update(account); + accountRepo.update(account); return true; } @@ -157,7 +50,7 @@ public boolean recordAdded(@Nullable Record record) { public boolean recordDeleted(@Nullable Record record) { if (record == null) return false; - Account account = read(record.getAccountId()); + Account account = accountRepo.read(record.getAccountId()); if (account == null) return false; switch (record.getType()) { @@ -173,7 +66,7 @@ public boolean recordDeleted(@Nullable Record record) { break; } - update(account); + accountRepo.update(account); return true; } @@ -188,16 +81,16 @@ public boolean recordUpdated(@Nullable Record oldRecord, @Nullable Record newRec public boolean transferDone(@Nullable Transfer transfer) { if(transfer == null) return false; - Account fromAccount = read(transfer.getFromAccountId()); - Account toAccount = read(transfer.getToAccountId()); + Account fromAccount = accountRepo.read(transfer.getFromAccountId()); + Account toAccount = accountRepo.read(transfer.getToAccountId()); if (fromAccount == null || toAccount == null) return false; fromAccount.take(transfer.getFromAmount()); toAccount.put(transfer.getToAmount()); - update(fromAccount); - update(toAccount); + accountRepo.update(fromAccount); + accountRepo.update(toAccount); return true; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CategoryController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CategoryController.java index fb5f27d..9c76565 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CategoryController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CategoryController.java @@ -1,14 +1,9 @@ package com.blogspot.e_kanivets.moneytracker.controller; -import android.content.ContentValues; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.util.Log; - -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Category; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; -import java.util.ArrayList; import java.util.List; /** @@ -18,80 +13,21 @@ * @author Evgenii Kanivets */ public class CategoryController { + @SuppressWarnings("unused") private static final String TAG = "CategoryController"; - private DbHelper dbHelper; - - public CategoryController(DbHelper dbHelper) { - this.dbHelper = dbHelper; - } - - public List getCategories() { - List categoryList = new ArrayList<>(); - - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - //Read categories table from db - Cursor cursor = db.query(DbHelper.TABLE_CATEGORIES, null, null, null, null, null, null); - - if (cursor.moveToFirst()) { - int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); - int nameColIndex = cursor.getColumnIndex(DbHelper.NAME_COLUMN); - - do { - //Read a record from DB - Category category = new Category(cursor.getInt(idColIndex), - cursor.getString(nameColIndex)); - - //Add record to list - categoryList.add(category); - } while (cursor.moveToNext()); - } - - cursor.close(); - db.close(); - - return categoryList; - } - - public int addCategory(String name) { - //Add category to DB - SQLiteDatabase db = dbHelper.getWritableDatabase(); - - ContentValues contentValues = new ContentValues(); - contentValues.put(DbHelper.NAME_COLUMN, name); - - int id = (int) db.insert(DbHelper.TABLE_CATEGORIES, null, contentValues); - Log.d(TAG, "created category with id = " + id); - - db.close(); - - return id; - } - - public void deleteCategoryById(int id) { - for (Category category : getCategories()) { - if (category.getId() == id) { - SQLiteDatabase db = dbHelper.getWritableDatabase(); - db.delete(DbHelper.TABLE_CATEGORIES, "id=?", new String[]{Integer.toString(id)}); - break; - } - } - } - - public String getCategoryById(int id) { - for (Category category : getCategories()) { - if (category.getId() == id) return category.getName(); - } + private IRepo categoryRepo; - return null; + public CategoryController(IRepo categoryRepo) { + this.categoryRepo = categoryRepo; } - public int getCategoryIdByName(String name) { - for (Category category : getCategories()) { - if (category.getName().equals(name)) return category.getId(); - } + public Category readOrCreate(String categoryName) { + String condition = DbHelper.NAME_COLUMN + "=?"; + String[] args = {categoryName}; + List categoryList = categoryRepo.readWithCondition(condition, args); - return -1; + if (categoryList.size() >= 1) return categoryList.get(0); + else return categoryRepo.create(new Category(categoryName)); } } \ 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 6691539..71cb485 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 @@ -1,12 +1,10 @@ package com.blogspot.e_kanivets.moneytracker.controller; -import android.content.ContentValues; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; - -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Category; import com.blogspot.e_kanivets.moneytracker.model.Period; import com.blogspot.e_kanivets.moneytracker.model.Record; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; import java.util.ArrayList; import java.util.List; @@ -18,155 +16,20 @@ * @author Evgenii Kanivets */ public class RecordController { - private DbHelper dbHelper; - private AccountController accountController; - private final CategoryController categoryController; + private final IRepo categoryRepo; + private final IRepo recordRepo; - public RecordController(DbHelper dbHelper) { - this.dbHelper = dbHelper; - this.accountController = new AccountController(dbHelper); - categoryController = new CategoryController(dbHelper); + public RecordController(IRepo recordRepo, IRepo categoryRepo) { + this.recordRepo = recordRepo; + this.categoryRepo = categoryRepo; } - 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<>(); - - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - // Form args to select only needed records according to period + public List getRecordsForPeriod(Period period) { + String condition = DbHelper.TIME_COLUMN + " BETWEEN ? AND ?"; String[] args = new String[]{Long.toString(period.getFirst().getTime()), Long.toString(period.getLast().getTime())}; - //Read records table from db - Cursor cursor = db.query(DbHelper.TABLE_RECORDS, null, "time BETWEEN ? AND ?", args, 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 record = new Record(cursor.getInt(idColIndex), - cursor.getLong(timeColIndex), - cursor.getInt(typeColIndex), - cursor.getString(titleColIndex), - cursor.getInt(categoryColIndex), - cursor.getInt(priceColIndex), - cursor.getInt(accountIdColIndex)); - - //Add record to list - recordList.add(record); - } while (cursor.moveToNext()); - } - - cursor.close(); - db.close(); - - return recordList; - } - - public void addRecord(Record record) { - //Add category if it does not exist yet - if (categoryController.getCategoryIdByName(record.getCategory()) == -1) { - categoryController.addCategory(record.getCategory()); - record.setCategoryId(categoryController.getCategoryIdByName(record.getCategory())); - } - - //Add record to DB - SQLiteDatabase db = dbHelper.getWritableDatabase(); - - ContentValues contentValues = new 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()); - - 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) { - //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(); - - ContentValues contentValues = new ContentValues(); - 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); - - db.update(DbHelper.TABLE_RECORDS, contentValues, "id=?", new String[]{Integer.valueOf(id).toString()}); - - db.close(); - - Record newRecord = read(id); - - accountController.recordUpdated(oldRecord, newRecord); - } - - public void deleteRecord(Record record) { - SQLiteDatabase db = dbHelper.getWritableDatabase(); - db.delete(DbHelper.TABLE_RECORDS, "id=?", - new String[]{Integer.toString(record.getId())}); - db.close(); - - accountController.recordDeleted(record); + return recordRepo.readWithCondition(condition, args); } public List getRecordsForExport(long fromDate, long toDate) { @@ -184,47 +47,23 @@ public List getRecordsForExport(long fromDate, long toDate) { result.add(sb.toString()); - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - //Form args to select only needed records according to period - String[] args = new String[]{Long.toString(fromDate), - Long.toString(toDate)}; - - //Read records table from db - Cursor cursor = db.query(DbHelper.TABLE_RECORDS, null, "time BETWEEN ? AND ?", args, null, null, null); + String condition = DbHelper.TIME_COLUMN + " BETWEEN ? AND ?"; + String[] args = new String[]{Long.toString(fromDate), Long.toString(toDate)}; - 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); + List recordList = recordRepo.readWithCondition(condition, args); - do { - //Read a record from DB - int id = cursor.getInt(idColIndex); - long time = cursor.getLong(timeColIndex); - int type = cursor.getInt(typeColIndex); - String title = cursor.getString(titleColIndex); - int categoryId = cursor.getInt(categoryColIndex); - int price = cursor.getInt(priceColIndex); + for (Record record : recordList) { + sb = new StringBuilder(); + sb.append(record.getId()).append(DELIMITER); + sb.append(record.getTime()).append(DELIMITER); + sb.append(record.getTitle()).append(DELIMITER); + Category category = categoryRepo.read(record.getCategoryId()); + sb.append(category == null ? "NONE" : category.getName()).append(DELIMITER); + sb.append(record.getType() == 0 ? record.getPrice() : -record.getPrice()); - sb = new StringBuilder(); - sb.append(id).append(DELIMITER); - sb.append(time).append(DELIMITER); - sb.append(title).append(DELIMITER); - sb.append(categoryController.getCategoryById(categoryId)).append(DELIMITER); - sb.append(type == 0 ? price : -price); - - result.add(sb.toString()); - } while (cursor.moveToNext()); + result.add(sb.toString()); } - cursor.close(); - db.close(); - return result; } } \ No newline at end of file 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 deleted file mode 100644 index f1a9ca1..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/TransferController.java +++ /dev/null @@ -1,48 +0,0 @@ -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/db/DbController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/DbController.java deleted file mode 100644 index 58d994c..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/DbController.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.db; - -import android.content.ContentValues; -import android.database.Cursor; - -/** - * Interface of the interaction with a Database. Insert, update, delete, query operation's - * implementations. - * Created on 9/1/15. - * - * @author Evgenii Kanivets - */ -public interface DbController { - /** - * Inserts a specified record into {@code tableName} with {@code id}. - * - * @param tableName table name of table to insert a record - * @param id id of the record - * @param contentValues map representation of the record - * @return true if inserted - */ - boolean insert(String tableName, String id, ContentValues contentValues); - - /** - * @param tableName table name of table to insert a record - * @param id id of the record - * @param contentValues map representation of the record - * @return true if updated - */ - boolean update(String tableName, String id, ContentValues contentValues); - - /** - * @param tableName table name of table to insert a record - * @param id id of the record - * @return true if deleted - */ - boolean delete(String tableName, String id); - - /** - * @param tableName table name of table to insert a record - * @param selection selection statement - * @return Cursor with a matched records - */ - Cursor query(String tableName, String selection); -} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/RecordController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/RecordController.java deleted file mode 100644 index 68ec831..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/RecordController.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.db; - -import com.blogspot.e_kanivets.moneytracker.model.Record; - -import java.util.Date; -import java.util.List; - -/** - * Interface for controlling of records. Every record has to have a unique id. - * Created on 9/1/15. - * - * @author Evgenii Kanivets - */ -public interface RecordController { - /** - * Adds a given record to the storage. Checks if such record has already exists, - * if yes the record will not be added. - * - * @param record record to add - * @return true if added, false if not - */ - boolean addRecord(Record record); - - /** - * Deletes a record from storage if such record exists. - * - * @param record record to remove - * @return true if record was deleted, false if not - */ - boolean deleteRecord(Record record); - - /** - * Updates a record in storage if exists, if no - nothing will happen. - * - * @param record record to update - * @return true if record was changed, false if not - */ - boolean updateRecord(Record record); - - /** - * Fetches records from {@code fromTime} to {@code toTime} from storage. - * - * @param fromTime {@link Date} representation of period start - * @param toTime {@link Date} representation of period end - * @return list of mathced records - */ - List getRecords(Date fromTime, Date toTime); -} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/RecordControllerImpl.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/RecordControllerImpl.java deleted file mode 100644 index b0d7f86..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/RecordControllerImpl.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.db; - -/** - * Created by alla on 9/2/15. - */ -public class RecordControllerImpl { -} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/StorageComponent.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/StorageComponent.java deleted file mode 100644 index 25777cc..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/StorageComponent.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.db; - -/** - * Created by alla on 9/3/15. - */ -public class StorageComponent { -} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/StorageModule.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/StorageModule.java deleted file mode 100644 index 322018a..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/StorageModule.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.db; - -/** - * Created by alla on 9/3/15. - */ -public class StorageModule { -} 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 1fe1f04..e40f173 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 @@ -23,8 +23,10 @@ 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; +import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Account; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; import butterknife.Bind; import butterknife.ButterKnife; @@ -39,7 +41,7 @@ public class AccountsFragment extends Fragment { @Bind(R.id.list_view) ListView listView; - private AccountController accountController; + private IRepo accountRepo; public static AccountsFragment newInstance() { AccountsFragment fragment = new AccountsFragment(); @@ -57,7 +59,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); - accountController = new AccountController(new DbHelper(getActivity())); + accountRepo = new AccountRepo(new DbHelper(getActivity())); } @Override @@ -116,7 +118,7 @@ public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.delete: - accountController.deleteAccount(accountController.getAccounts().get(info.position)); + accountRepo.delete(accountRepo.readAll().get(info.position)); update(); return true; default: @@ -145,7 +147,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { } private void update() { - listView.setAdapter(new AccountAdapter(getActivity(), accountController.getAccounts())); + listView.setAdapter(new AccountAdapter(getActivity(), accountRepo.readAll())); ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged(); } @@ -153,7 +155,7 @@ private void initViews(View rootView) { if (rootView != null) { ButterKnife.bind(this, rootView); - listView.setAdapter(new AccountAdapter(getActivity(), accountController.getAccounts())); + listView.setAdapter(new AccountAdapter(getActivity(), accountRepo.readAll())); ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged(); registerForContextMenu(listView); 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 9fdde56..f555fca 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 @@ -12,8 +12,16 @@ import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.NavDrawerActivity; +import com.blogspot.e_kanivets.moneytracker.controller.AccountController; +import com.blogspot.e_kanivets.moneytracker.controller.CategoryController; import com.blogspot.e_kanivets.moneytracker.controller.RecordController; -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Category; +import com.blogspot.e_kanivets.moneytracker.model.Record; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; +import com.blogspot.e_kanivets.moneytracker.repo.CategoryRepo; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; +import com.blogspot.e_kanivets.moneytracker.repo.RecordRepo; import com.blogspot.e_kanivets.moneytracker.util.Constants; import java.io.File; @@ -67,7 +75,14 @@ private void initActionBar() { @OnClick(R.id.btn_export) public void exportRecords() { - RecordController recordController = new RecordController(new DbHelper(getActivity())); + DbHelper dbHelper = new DbHelper(getActivity()); + IRepo categoryRepo = new CategoryRepo(dbHelper); + CategoryController categoryController = new CategoryController(categoryRepo); + AccountController accountController = new AccountController(new AccountRepo(dbHelper)); + IRepo recordRepo = new RecordRepo(dbHelper, accountController, categoryController); + + RecordController recordController = new RecordController(recordRepo, categoryRepo); + List records = recordController.getRecordsForExport(0, Long.MAX_VALUE); File outFile = new File(Environment.getExternalStorageDirectory(), Constants.DEFAULT_EXPORT_FILE_NAME); 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 9afafff..154298c 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 @@ -27,17 +27,25 @@ import com.blogspot.e_kanivets.moneytracker.activity.NavDrawerActivity; import com.blogspot.e_kanivets.moneytracker.activity.ReportActivity; import com.blogspot.e_kanivets.moneytracker.adapter.RecordAdapter; +import com.blogspot.e_kanivets.moneytracker.controller.AccountController; +import com.blogspot.e_kanivets.moneytracker.controller.CategoryController; import com.blogspot.e_kanivets.moneytracker.controller.PeriodController; import com.blogspot.e_kanivets.moneytracker.controller.RecordController; -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; -import com.blogspot.e_kanivets.moneytracker.helper.PeriodHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Category; +import com.blogspot.e_kanivets.moneytracker.model.Period; import com.blogspot.e_kanivets.moneytracker.model.Record; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; +import com.blogspot.e_kanivets.moneytracker.repo.CategoryRepo; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; +import com.blogspot.e_kanivets.moneytracker.repo.RecordRepo; import com.blogspot.e_kanivets.moneytracker.ui.AppRateDialog; import com.blogspot.e_kanivets.moneytracker.ui.ChangeDateDialog; import com.blogspot.e_kanivets.moneytracker.util.PrefUtils; import java.util.Calendar; import java.util.Date; +import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; @@ -53,6 +61,12 @@ public class RecordsFragment extends Fragment { private static final int REQUEST_ACTION_RECORD = 1; + List recordList; + + private IRepo recordRepo; + private RecordController recordController; + private PeriodController periodController; + @Bind(R.id.list_view) ListView listView; @Bind(R.id.tv_from_date) @@ -60,9 +74,6 @@ public class RecordsFragment extends Fragment { @Bind(R.id.tv_to_date) TextView tvToDate; - private RecordController recordController; - private PeriodController periodController; - public static RecordsFragment newInstance() { RecordsFragment fragment = new RecordsFragment(); Bundle args = new Bundle(); @@ -79,7 +90,14 @@ public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); periodController = new PeriodController(); - recordController = new RecordController(new DbHelper(getActivity())); + + DbHelper dbHelper = new DbHelper(getActivity()); + IRepo categoryRepo = new CategoryRepo(dbHelper); + CategoryController categoryController = new CategoryController(categoryRepo); + AccountController accountController = new AccountController(new AccountRepo(dbHelper)); + recordRepo = new RecordRepo(dbHelper, accountController, categoryController); + + recordController = new RecordController(recordRepo, categoryRepo); } @Override @@ -112,15 +130,13 @@ public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.edit: - Record record = recordController. - getRecords(periodController.getPeriod()).get(info.position); + Record record = recordList.get(info.position); if (record.isIncome()) startAddIncomeActivity(record, AddIncomeActivity.Mode.MODE_EDIT); else startAddExpenseActivity(record, AddExpenseActivity.Mode.MODE_EDIT); return true; case R.id.delete: - recordController.deleteRecord(recordController. - getRecords(periodController.getPeriod()).get(info.position)); + recordRepo.delete(recordList.get(info.position)); update(); return true; default: @@ -192,8 +208,8 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { } private void update() { - listView.setAdapter(new RecordAdapter(getActivity(), - recordController.getRecords(periodController.getPeriod()))); + recordList = recordController.getRecordsForPeriod(periodController.getPeriod()); + listView.setAdapter(new RecordAdapter(getActivity(), recordList)); ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged(); } @@ -205,8 +221,9 @@ private void initViews(View rootView) { tvFromDate.setText(periodController.getFirstDay()); tvToDate.setText(periodController.getLastDay()); - listView.setAdapter(new RecordAdapter(getActivity(), - recordController.getRecords(periodController.getPeriod()))); + recordList = recordController.getRecordsForPeriod(periodController.getPeriod()); + + listView.setAdapter(new RecordAdapter(getActivity(), recordList)); ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged(); /* Scroll list to bottom only once at start */ @@ -250,22 +267,22 @@ public void onItemSelected(AdapterView parent, View view, int position, long calendar.clear(Calendar.MILLISECOND); switch (position) { - // Day period case 0: - periodController.setPeriod(PeriodHelper.getInstance().getDayPeriod()); + periodController.setPeriod(Period.dayPeriod()); break; - // Week period + case 1: - periodController.setPeriod(PeriodHelper.getInstance().getWeekPeriod()); + periodController.setPeriod(Period.weekPeriod()); break; - // Month period + case 2: - periodController.setPeriod(PeriodHelper.getInstance().getMonthPeriod()); + periodController.setPeriod(Period.monthPeriod()); break; - // Year period + case 3: - periodController.setPeriod(PeriodHelper.getInstance().getYearPeriod()); + periodController.setPeriod(Period.yearPeriod()); break; + default: break; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/helper/PeriodHelper.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/helper/PeriodHelper.java deleted file mode 100644 index 2f778f7..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/helper/PeriodHelper.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.helper; - -import com.blogspot.e_kanivets.moneytracker.model.Period; - -import java.util.Calendar; -import java.util.Date; - -/** - * Helper class for periods. - * Created on 15.11.2014. - * - * @author Evgenii Kanivets - */ -public class PeriodHelper { - - private static PeriodHelper periodHelper; - - public static PeriodHelper getInstance() { - if(periodHelper == null) { - periodHelper = new PeriodHelper(); - } - - return periodHelper; - } - - private PeriodHelper() {} - - public Period getDayPeriod() { - //set start of day - Calendar cal = Calendar.getInstance(); - cal.set(Calendar.HOUR_OF_DAY, 0); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - - Date first = cal.getTime(); - - //set end of day - cal.set(Calendar.HOUR_OF_DAY, 23); - cal.set(Calendar.MINUTE, 59); - cal.set(Calendar.SECOND, 59); - cal.set(Calendar.MILLISECOND, 999); - - Date last = cal.getTime(); - - return new Period(first, last); - } - - public Period getWeekPeriod() { - // set start of week - Calendar cal = Calendar.getInstance(); - cal.set(Calendar.HOUR_OF_DAY, 0); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - - // set first day of week - cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek()); - - Date first = cal.getTime(); - - // set last day of week - cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() + 6); - cal.set(Calendar.HOUR_OF_DAY, 23); - cal.set(Calendar.MINUTE, 59); - cal.set(Calendar.SECOND, 59); - cal.set(Calendar.MILLISECOND, 999); - - Date last = cal.getTime(); - - return new Period(first, last); - } - - public Period getMonthPeriod() { - //set start of month - Calendar cal = Calendar.getInstance(); - cal.set(Calendar.HOUR_OF_DAY, 0); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - - cal.set(Calendar.DAY_OF_MONTH, 1); - - Date first = cal.getTime(); - - //set end of month - cal.set(Calendar.HOUR_OF_DAY, 23); - cal.set(Calendar.MINUTE, 59); - cal.set(Calendar.SECOND, 59); - cal.set(Calendar.MILLISECOND, 999); - - cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); - - Date last = cal.getTime(); - - return new Period(first, last); - } - - public Period getYearPeriod() { - //set start of year - Calendar cal = Calendar.getInstance(); - cal.set(Calendar.HOUR_OF_DAY, 0); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - - cal.set(Calendar.MONTH, Calendar.JANUARY); - cal.set(Calendar.DAY_OF_MONTH, 1); - - Date first = cal.getTime(); - - //set end of year - cal.set(Calendar.HOUR_OF_DAY, 23); - cal.set(Calendar.MINUTE, 59); - cal.set(Calendar.SECOND, 59); - cal.set(Calendar.MILLISECOND, 999); - - cal.set(Calendar.MONTH, Calendar.DECEMBER); - cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); - - Date last = cal.getTime(); - - return new Period(first, last); - } -} \ 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 6f7fbfa..68a28a2 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 @@ -1,23 +1,33 @@ package com.blogspot.e_kanivets.moneytracker.model; /** - * Entity class for account - * Created by evgenii on 6/3/15. + * Entity class for account. + * Created on 6/3/15. + * + * @author Evgenii Kanivets */ -public class Account { - private int id; +public class Account implements IEntity { + private long id; private String title; private int curSum; private String currency; - public Account(int id, String title, int curSum, String currency) { + public Account(long id, String title, int curSum, String currency) { this.id = id; this.title = title; this.curSum = curSum; this.currency = currency; } - public int getId() { + public Account(String title, int curSum, String currency) { + this.id = -1; + this.title = title; + this.curSum = curSum; + this.currency = currency; + } + + @Override + public long getId() { return id; } @@ -72,4 +82,4 @@ public boolean equals(Object o) { return false; } } -} +} \ No newline at end of file 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 3828031..bf77459 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,23 +1,43 @@ package com.blogspot.e_kanivets.moneytracker.model; /** - * Created by eugene on 01/09/14. + * Entity class for account. + * Created on 01/09/14. + * + * @author Evgenii Kanivets */ -public class Category { +public class Category implements IEntity { - private int id; + private long id; private String name; - public Category(int id, String name) { + public Category(long id, String name) { this.id = id; this.name = name; } - public int getId() { + public Category(String name) { + this.id = -1; + this.name = name; + } + + @Override + public long getId() { return id; } public String getName() { return name; } -} + + @SuppressWarnings("StringBufferReplaceableByString") + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("Category {"); + sb.append("id = ").append(id); + sb.append("}"); + + return sb.toString(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/IEntity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/IEntity.java new file mode 100644 index 0000000..3512724 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/IEntity.java @@ -0,0 +1,11 @@ +package com.blogspot.e_kanivets.moneytracker.model; + +/** + * Interface to represent contract of abstract entity. + * Created on 2/15/16. + * + * @author Evgenii Kanivets + */ +public interface IEntity { + long getId(); +} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Period.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Period.java index ff7f2d2..ef4aa4e 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Period.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Period.java @@ -78,4 +78,102 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeLong(first.getTime()); dest.writeLong(last.getTime()); } -} + + public static Period dayPeriod() { + //set start of day + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + + Date first = cal.getTime(); + + //set end of day + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MILLISECOND, 999); + + Date last = cal.getTime(); + + return new Period(first, last); + } + + public static Period weekPeriod() { + // set start of week + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + + // set first day of week + cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek()); + + Date first = cal.getTime(); + + // set last day of week + cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() + 6); + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MILLISECOND, 999); + + Date last = cal.getTime(); + + return new Period(first, last); + } + + public static Period monthPeriod() { + //set start of month + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + + cal.set(Calendar.DAY_OF_MONTH, 1); + + Date first = cal.getTime(); + + //set end of month + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MILLISECOND, 999); + + cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); + + Date last = cal.getTime(); + + return new Period(first, last); + } + + public static Period yearPeriod() { + //set start of year + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + + cal.set(Calendar.MONTH, Calendar.JANUARY); + cal.set(Calendar.DAY_OF_MONTH, 1); + + Date first = cal.getTime(); + + //set end of year + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MILLISECOND, 999); + + cal.set(Calendar.MONTH, Calendar.DECEMBER); + cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); + + Date last = cal.getTime(); + + return new Period(first, last); + } +} \ No newline at end of file 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 2b2f584..282997d 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 @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.model; -import com.blogspot.e_kanivets.moneytracker.controller.CategoryController; -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.MtApp; +import com.blogspot.e_kanivets.moneytracker.repo.CategoryRepo; import java.io.Serializable; @@ -10,20 +10,20 @@ * Entity class. * Created by eugene on 01/09/14. */ -public class Record implements Serializable { +public class Record implements IEntity, Serializable { public static final int TYPE_INCOME = 0; public static final int TYPE_EXPENSE = 1; - private int id; + private long id; private long time; private int type; private String title; - private int categoryId; + private long categoryId; private String category; private int price; - private int accountId; + private long accountId; - public Record(int id, long time, int type, String title, int categoryId, int price, int accountId) { + public Record(long id, long time, int type, String title, long categoryId, int price, long accountId) { this.id = id; this.time = time; this.type = type; @@ -32,10 +32,12 @@ 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); + // TODO: Refactor this shit. + Category categoryActual = new CategoryRepo(new DbHelper(MtApp.get())).read(categoryId); + if (categoryActual != null) category = categoryActual.getName(); } - public Record(long time, int type, String title, String category, int price, int accountId) { + public Record(long time, int type, String title, String category, int price, long accountId) { this.time = time; this.type = type; this.title = title; @@ -49,7 +51,8 @@ public int getType() { return type; } - public int getId() { + @Override + public long getId() { return id; } @@ -61,7 +64,7 @@ public String getCategory() { return category; } - public int getCategoryId() { + public long getCategoryId() { return categoryId; } @@ -81,7 +84,7 @@ public void setTitle(String title) { this.title = title; } - public void setCategoryId(int categoryId) { + public void setCategoryId(long categoryId) { this.categoryId = categoryId; } @@ -93,11 +96,11 @@ public void setPrice(int price) { this.price = price; } - public int getAccountId() { + public long getAccountId() { return accountId; } - public void setAccountId(int accountId) { + public void setAccountId(long accountId) { this.accountId = accountId; } } \ No newline at end of file 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 index c7f5b3a..dbcc9f6 100644 --- 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 @@ -5,15 +5,8 @@ * 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 { +public class Transfer implements IEntity { private long id; private long time; private long fromAccountId; @@ -38,6 +31,7 @@ public Transfer(long time, long fromAccountId, long toAccountId, int fromAmount, this.toAmount = toAmount; } + @Override public long getId() { return id; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java new file mode 100644 index 0000000..58546fe --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java @@ -0,0 +1,110 @@ +package com.blogspot.e_kanivets.moneytracker.repo; + +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.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Account; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link IRepo} implementation for {@link Account} entity. + * Created on 2/15/16. + * + * @author Evgenii Kanivets + */ +public class AccountRepo extends BaseRepo { + @SuppressWarnings("unused") + private static final String TAG = "AccountRepo"; + + private DbHelper dbHelper; + + public AccountRepo(DbHelper dbHelper) { + super(dbHelper); + this.dbHelper = dbHelper; + } + + @Override + protected String getTable() { + return DbHelper.TABLE_ACCOUNTS; + } + + @Nullable + @Override + public Account create(Account account) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + contentValues.put(DbHelper.TITLE_COLUMN, account.getTitle()); + contentValues.put(DbHelper.CUR_SUM_COLUMN, account.getCurSum()); + contentValues.put(DbHelper.CURRENCY_COLUMN, account.getCurrency()); + + long id = db.insert(getTable(), null, contentValues); + + db.close(); + + if (id == -1) { + Log.d(TAG, "Couldn't create account : " + account); + return null; + } else { + Account createdAccount = read(id); + Log.d(TAG, "Created account : " + createdAccount); + return createdAccount; + } + } + + @Nullable + @Override + public Account update(Account account) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + contentValues.put(DbHelper.CUR_SUM_COLUMN, account.getCurSum()); + contentValues.put(DbHelper.TITLE_COLUMN, account.getTitle()); + contentValues.put(DbHelper.CURRENCY_COLUMN, account.getCurrency()); + + String[] args = new String[]{Long.valueOf(account.getId()).toString()}; + long rowsAffected = db.update(getTable(), contentValues, "id=?", args); + + db.close(); + + if (rowsAffected == 0) { + Log.d(TAG, "Couldn't update account : " + account); + return null; + } else { + Account updatedAccount = read(account.getId()); + Log.d(TAG, "Updated account : " + updatedAccount); + return updatedAccount; + } + } + + @Override + protected List getListFromCursor(Cursor cursor) { + List accountList = new ArrayList<>(); + + 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 account = new Account(cursor.getInt(idColIndex), + cursor.getString(titleColIndex), + cursor.getInt(curSumColIndex), + cursor.getString(currencyColIndex)); + + accountList.add(account); + } while (cursor.moveToNext()); + } + + return accountList; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/BaseRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/BaseRepo.java new file mode 100644 index 0000000..7bc2791 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/BaseRepo.java @@ -0,0 +1,76 @@ +package com.blogspot.e_kanivets.moneytracker.repo; + +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.Log; + +import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.IEntity; + +import java.util.List; + +/** + * Base implementation of {@link IRepo}. + * Created on 2/15/16. + * + * @author Evgenii Kanivets + */ +public abstract class BaseRepo implements IRepo { + private static final String TAG = "BaseRepo"; + + protected DbHelper dbHelper; + + public BaseRepo(DbHelper dbHelper) { + this.dbHelper = dbHelper; + } + + abstract String getTable(); + + abstract List getListFromCursor(Cursor cursor); + + @Nullable + @Override + public T read(long id) { + List list = readWithCondition("id=?", new String[]{Long.toString(id)}); + + if (list.size() == 1) return list.get(0); + else return null; + } + + @NonNull + @Override + public List readAll() { + return readWithCondition(null, null); + } + + @Override + public boolean delete(T instance) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + String[] args = new String[]{Long.toString(instance.getId())}; + long rowsAffected = db.delete(getTable(), "id=?", args); + + db.close(); + + Log.d(TAG, instance + (rowsAffected == 0 ? " didn't " : " ") + "deleted"); + + return rowsAffected != 0; + } + + @NonNull + @Override + public List readWithCondition(String condition, String[] args) { + SQLiteDatabase db = dbHelper.getReadableDatabase(); + + // Read accounts table from db + Cursor cursor = db.query(getTable(), null, condition, args, null, null, null); + List accountList = getListFromCursor(cursor); + + cursor.close(); + db.close(); + + return accountList; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/CategoryRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/CategoryRepo.java new file mode 100644 index 0000000..00a6edb --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/CategoryRepo.java @@ -0,0 +1,102 @@ +package com.blogspot.e_kanivets.moneytracker.repo; + +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.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Category; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link IRepo} implementation for {@link Category} entity. + * Created on 2/15/16. + * + * @author Evgenii Kanivets + */ +public class CategoryRepo extends BaseRepo { + @SuppressWarnings("unused") + private static final String TAG = "CategoryRepo"; + + private DbHelper dbHelper; + + public CategoryRepo(DbHelper dbHelper) { + super(dbHelper); + this.dbHelper = dbHelper; + } + + @Override + protected String getTable() { + return DbHelper.TABLE_CATEGORIES; + } + + @Nullable + @Override + public Category create(Category category) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + contentValues.put(DbHelper.NAME_COLUMN, category.getName()); + + long id = db.insert(getTable(), null, contentValues); + + db.close(); + + if (id == -1) { + Log.d(TAG, "Couldn't create category : " + category); + return null; + } else { + Category createdCategory = read(id); + Log.d(TAG, "Created account : " + createdCategory); + return createdCategory; + } + } + + @Nullable + @Override + public Category update(Category category) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + contentValues.put(DbHelper.NAME_COLUMN, category.getName()); + + String[] args = new String[]{Long.valueOf(category.getId()).toString()}; + long rowsAffected = db.update(getTable(), contentValues, "id=?", args); + + db.close(); + + if (rowsAffected == 0) { + Log.d(TAG, "Couldn't update category : " + category); + return null; + } else { + Category updatedCategory = read(category.getId()); + Log.d(TAG, "Updated category : " + updatedCategory); + return updatedCategory; + } + } + + @Override + protected List getListFromCursor(Cursor cursor) { + List categoryList = new ArrayList<>(); + + if (cursor.moveToFirst()) { + int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); + int nameColIndex = cursor.getColumnIndex(DbHelper.NAME_COLUMN); + + do { + //Read a record from DB + Category category = new Category(cursor.getInt(idColIndex), + cursor.getString(nameColIndex)); + + //Add record to list + categoryList.add(category); + } while (cursor.moveToNext()); + } + + return categoryList; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/IRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/IRepo.java new file mode 100644 index 0000000..dd66475 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/IRepo.java @@ -0,0 +1,69 @@ +package com.blogspot.e_kanivets.moneytracker.repo; + +import android.database.sqlite.SQLiteOpenHelper; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import java.util.List; + +/** + * Interface that represents a contract of access to abstract storage with CRUD operations. + * Created on 2/15/16. + * + * @author Evgenii Kanivets + */ +public interface IRepo { + /** + * Creates a record with given fields values in storage. + * + * @param instance is entity instance to be created. + * @return created record or null if can't create. + */ + @Nullable + T create(T instance); + + /** + * Reads a record from storage. + * + * @param id is identification number of record to be read. + * @return read record or null if one not exist. + */ + @Nullable + T read(long id); + + /** + * Updates a record in storage. + * + * @param instance is entity instance to be updated. + * @return updated record or null if can't update. + */ + @Nullable + T update(T instance); + + /** + * Deletes a record from storage. + * + * @param instance is entity instance to be deleted. + * @return true if deleted or false if not. + */ + boolean delete(T instance); + + /** + * Reads all records from storage. + * + * @return list of all records. List can't be null, but may be zero sized. + */ + @NonNull + List readAll(); + + /** + * Reads all records from storage that matches given condition. The same as in standard Android + * {@link SQLiteOpenHelper}. + * + * @param condition is a string of selection. For example - "time BETWEEN ? AND ?". + * @param args is a string array with data to be inserted in condition string instead of '?'. + * @return list of matched records. List can't be null, but may be zero sized. + */ + @NonNull + List readWithCondition(String condition, String[] args); +} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/RecordRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/RecordRepo.java new file mode 100644 index 0000000..59fbff0 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/RecordRepo.java @@ -0,0 +1,142 @@ +package com.blogspot.e_kanivets.moneytracker.repo; + +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.DbHelper; +import com.blogspot.e_kanivets.moneytracker.controller.AccountController; +import com.blogspot.e_kanivets.moneytracker.controller.CategoryController; +import com.blogspot.e_kanivets.moneytracker.model.Record; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link IRepo} implementation for {@link Record} entity. + * Created on 2/15/16. + * + * @author Evgenii Kanivets + */ +public class RecordRepo extends BaseRepo { + @SuppressWarnings("unused") + private static final String TAG = "RecordRepo"; + + private final DbHelper dbHelper; + private final AccountController accountController; + private final CategoryController categoryController; + + public RecordRepo(DbHelper dbHelper, AccountController accountController, CategoryController categoryController) { + super(dbHelper); + this.dbHelper = dbHelper; + this.accountController = accountController; + this.categoryController = categoryController; + } + + @Override + protected String getTable() { + return DbHelper.TABLE_RECORDS; + } + + @Nullable + @Override + public Record create(Record record) { + record.setCategoryId(categoryController.readOrCreate(record.getCategory()).getId()); + + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues contentValues = new 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()); + + long id = db.insert(getTable(), null, contentValues); + + db.close(); + + if (id == -1) { + Log.d(TAG, "Couldn't create record : " + record); + return null; + } else { + Record createdRecord = read(id); + accountController.recordAdded(createdRecord); + Log.d(TAG, "Created record : " + createdRecord); + + return createdRecord; + } + } + + @Nullable + @Override + public Record update(Record record) { + Record oldRecord = read(record.getId()); + + long categoryId = categoryController.readOrCreate(record.getCategory()).getId(); + + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + contentValues.put(DbHelper.TITLE_COLUMN, record.getTitle()); + contentValues.put(DbHelper.CATEGORY_ID_COLUMN, categoryId); + contentValues.put(DbHelper.PRICE_COLUMN, record.getPrice()); + contentValues.put(DbHelper.ACCOUNT_ID_COLUMN, record.getAccountId()); + + String[] args = {Long.valueOf(record.getId()).toString()}; + long rowsAffected = db.update(getTable(), contentValues, "id=?", args); + + db.close(); + + if (rowsAffected == 0) { + Log.d(TAG, "Couldn't update record : " + record); + return null; + } else { + Record updatedRecord = read(record.getId()); + accountController.recordUpdated(oldRecord, updatedRecord); + + Log.d(TAG, "Updated record : " + updatedRecord); + return updatedRecord; + } + } + + @Override + public boolean delete(Record record) { + boolean result = super.delete(record); + accountController.recordDeleted(record); + + return result; + } + + @Override + protected List getListFromCursor(Cursor cursor) { + List recordList = new ArrayList<>(); + + if (cursor.moveToFirst()) { + 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 { + Record record = new Record(cursor.getInt(idColIndex), + cursor.getLong(timeColIndex), + cursor.getInt(typeColIndex), + cursor.getString(titleColIndex), + cursor.getInt(categoryColIndex), + cursor.getInt(priceColIndex), + cursor.getInt(accountIdColIndex)); + + recordList.add(record); + } while (cursor.moveToNext()); + } + + return recordList; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/TransferRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/TransferRepo.java new file mode 100644 index 0000000..64f09f9 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/TransferRepo.java @@ -0,0 +1,105 @@ +package com.blogspot.e_kanivets.moneytracker.repo; + +import android.content.ContentValues; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.Log; + +import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.controller.AccountController; +import com.blogspot.e_kanivets.moneytracker.model.Transfer; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link IRepo} implementation for {@link Transfer} entity. + * Created on 2/15/16. + * + * @author Evgenii Kanivets + */ +public class TransferRepo extends BaseRepo { + @SuppressWarnings("unused") + private static final String TAG = "TransferRepo"; + + private DbHelper dbHelper; + private AccountController accountController; + + public TransferRepo(DbHelper dbHelper, AccountController accountController) { + super(dbHelper); + this.dbHelper = dbHelper; + this.accountController = accountController; + } + + @Override + protected String getTable() { + return DbHelper.TABLE_TRANSFERS; + } + + @Nullable + @Override + public Transfer create(Transfer transfer) { + if (transfer == null) return null; + + 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_ACCOUNT_ID_COLUMN, transfer.getToAccountId()); + contentValues.put(DbHelper.FROM_AMOUNT_COLUMN, transfer.getFromAmount()); + contentValues.put(DbHelper.TO_AMOUNT_COLUMN, transfer.getToAmount()); + + long id = db.insert(getTable(), null, contentValues); + + db.close(); + + if (id == -1) { + Log.d(TAG, "Couldn't create transfer : " + transfer); + return null; + } else { + Transfer createdTransfer = read(id); + accountController.transferDone(transfer); + Log.d(TAG, "Created transfer : " + createdTransfer); + + return createdTransfer; + } + } + + @Nullable + @Override + public Transfer update(Transfer instance) { + throw new IllegalStateException("Not implemented yet"); + } + + @Override + protected List getListFromCursor(Cursor cursor) { + List accountList = new ArrayList<>(); + + if (cursor.moveToFirst()) { + // Get indexes of columns + int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); + int idColTime = cursor.getColumnIndex(DbHelper.TIME_COLUMN); + int idColFromAccountId = cursor.getColumnIndex(DbHelper.FROM_ACCOUNT_ID_COLUMN); + int idColToAccountId = cursor.getColumnIndex(DbHelper.TO_ACCOUNT_ID_COLUMN); + int idColFromAmount = cursor.getColumnIndex(DbHelper.FROM_AMOUNT_COLUMN); + int idColToAmount = cursor.getColumnIndex(DbHelper.TO_AMOUNT_COLUMN); + + do { + // Read a account from DB + Transfer account = new Transfer(cursor.getInt(idColIndex), + cursor.getLong(idColTime), + cursor.getLong(idColFromAccountId), + cursor.getLong(idColToAccountId), + cursor.getInt(idColFromAmount), + cursor.getInt(idColToAmount)); + + accountList.add(account); + } while (cursor.moveToNext()); + } + + return accountList; + } +} \ 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 1014f13..57f2014 100644 --- a/app/src/main/res/layout/activity_add_account.xml +++ b/app/src/main/res/layout/activity_add_account.xml @@ -49,7 +49,7 @@ android:layout_height="wrap_content" android:layout_marginRight="10dp" android:layout_weight="1" - android:inputType="number" /> + android:inputType="numberSigned" />